package controller; import controller.tiles.interactive.InteractiveTileController; import util.GAMESTATE; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class RessourceManager { private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); private final GameController gameController; public RessourceManager(GameController gameController) { this.gameController = gameController; } public void start() { scheduler.scheduleAtFixedRate(() -> { if (!gameController.isRunning()) { scheduler.shutdown(); return; } if(gameController.getView().gameState == GAMESTATE.INVENTORY || gameController.getView().gameState == GAMESTATE.PLAY) calculateResources(); }, 0, 1, TimeUnit.SECONDS); } public void stop() { scheduler.shutdownNow(); } private void calculateResources() { // If interactiveTileControllers can change concurrently, consider making a snapshot: List snapshot; synchronized(gameController.interactiveTileControllers) { snapshot = new ArrayList<>(gameController.interactiveTileControllers); } for (InteractiveTileController c : snapshot) { int spI = c.getModel().getSecondsPerItem(); // Avoid division by zero or spI <= 0: if (spI > 0) { // You need to track elapsed seconds per controller or use a shared seconds counter: // For simplicity, you could store a counter in each model: c.getModel().incrementSecondCounter(); if (c.getModel().getSecondCounter() % spI == 0) { c.getModel().addItem(); System.out.println("New amount: " + c.getModel().getItemAmount()); } } } } }