mirror of
				https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
				synced 2025-11-02 22:21:04 +01:00 
			
		
		
		
	Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui
This commit is contained in:
		@@ -1,99 +0,0 @@
 | 
			
		||||
////////////////////////////////////////
 | 
			
		||||
// Programming project code
 | 
			
		||||
// UniBw M, 2022, 2023, 2024
 | 
			
		||||
// www.unibw.de/inf2
 | 
			
		||||
// (c) Mark Minas (mark.minas@unibw.de)
 | 
			
		||||
////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package pp.monopoly.client;
 | 
			
		||||
 | 
			
		||||
import java.lang.System.Logger;
 | 
			
		||||
 | 
			
		||||
import java.lang.System.Logger.Level;
 | 
			
		||||
 | 
			
		||||
import com.jme3.input.controls.ActionListener;
 | 
			
		||||
import com.jme3.scene.Node;
 | 
			
		||||
 | 
			
		||||
import pp.monopoly.client.gui.TestWorld;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents the state responsible for managing the battle interface within the Battleship game.
 | 
			
		||||
 * This state handles the display and interaction of the battle map, including the opponent's map.
 | 
			
		||||
 * It manages GUI components, input events, and the layout of the interface when this state is enabled.
 | 
			
		||||
 */
 | 
			
		||||
public class GameAppState extends MonopolyAppState {
 | 
			
		||||
    private static final Logger LOGGER = System.getLogger(MonopolyAppState.class.getName());
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A listener for handling click events in the battle interface.
 | 
			
		||||
     * When a click is detected, it triggers the corresponding actions on the opponent's map.
 | 
			
		||||
     */
 | 
			
		||||
    private final ActionListener clickListener = (name, isPressed, tpf) -> click(isPressed);
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The root node for all GUI components in the battle state.
 | 
			
		||||
     */
 | 
			
		||||
    private final Node battleNode = new Node("Game"); //NON-NLS
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A view representing the opponent's map in the GUI.
 | 
			
		||||
     */
 | 
			
		||||
    private TestWorld testWorld;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Enables the battle state by initializing, laying out, and adding GUI components.
 | 
			
		||||
     * Attaches the components to the GUI node and registers input listeners.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void enableState() {
 | 
			
		||||
        LOGGER.log(Level.DEBUG, "Enabling game state");
 | 
			
		||||
        battleNode.detachAllChildren();
 | 
			
		||||
        initializeGuiComponents();
 | 
			
		||||
        addGuiComponents();
 | 
			
		||||
        getApp().getGuiNode().attachChild(battleNode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Disables the battle state by removing GUI components and unregistering input listeners.
 | 
			
		||||
     * Also handles cleanup of resources, such as the opponent's map view.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void disableState() {
 | 
			
		||||
        getApp().getGuiNode().detachChild(battleNode);
 | 
			
		||||
        getApp().getInputManager().removeListener(clickListener);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initializes the GUI components used in the battle state.
 | 
			
		||||
     * Creates the opponent's map view and adds a grid overlay to it.
 | 
			
		||||
     */
 | 
			
		||||
    private void initializeGuiComponents() {
 | 
			
		||||
 | 
			
		||||
        // Initialisiere TestWorld mit Spielern
 | 
			
		||||
        testWorld = new TestWorld(getApp());
 | 
			
		||||
        testWorld.initializeScene();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds the initialized GUI components to the battle node.
 | 
			
		||||
     * Currently, it attaches the opponent's map view to the node.
 | 
			
		||||
     */
 | 
			
		||||
    private void addGuiComponents() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handles click events in the battle interface. If the event indicates a click (not a release),
 | 
			
		||||
     * it translates the cursor position to the model's coordinate system and triggers the game logic
 | 
			
		||||
     * for interacting with the opponent's map.
 | 
			
		||||
     *
 | 
			
		||||
     * @param isPressed whether the mouse button is currently pressed (true) or released (false)
 | 
			
		||||
     */
 | 
			
		||||
    private void click(boolean isPressed) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void update(float tpf) {
 | 
			
		||||
        super.update(tpf);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,9 +1,5 @@
 | 
			
		||||
package pp.monopoly.client.gui;
 | 
			
		||||
 | 
			
		||||
import static com.jme3.material.Materials.LIGHTING;
 | 
			
		||||
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import com.jme3.material.Material;
 | 
			
		||||
import com.jme3.material.RenderState.BlendMode;
 | 
			
		||||
import com.jme3.math.ColorRGBA;
 | 
			
		||||
@@ -14,7 +10,6 @@ import com.jme3.scene.Spatial;
 | 
			
		||||
import com.jme3.scene.shape.Box;
 | 
			
		||||
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.game.server.Player;
 | 
			
		||||
import pp.monopoly.model.Figure;
 | 
			
		||||
import pp.monopoly.model.Hotel;
 | 
			
		||||
import pp.monopoly.model.House;
 | 
			
		||||
@@ -48,7 +43,7 @@ public class BobTheBuilder extends GameBoardSynchronizer {
 | 
			
		||||
 | 
			
		||||
        // Setze die Rotation basierend auf der Feld-ID
 | 
			
		||||
        node.setLocalRotation(figure.getRot().toQuaternion());
 | 
			
		||||
        // node.addControl(new FigureControl(figure));
 | 
			
		||||
        node.addControl(new FigureControl(figure));
 | 
			
		||||
        return node;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -146,14 +141,6 @@ public class BobTheBuilder extends GameBoardSynchronizer {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void receivedEvent(UpdatePlayerView event) {
 | 
			
		||||
        board.removePlayers();
 | 
			
		||||
        
 | 
			
		||||
        //TODO transition animation
 | 
			
		||||
        for (Player player : app.getGameLogic().getPlayerHandler().getPlayers()) {
 | 
			
		||||
            board.add(player.getFigure());
 | 
			
		||||
        }
 | 
			
		||||
        for (Item item : board.getItems().stream().filter(p -> p instanceof Figure).collect(Collectors.toList())) {
 | 
			
		||||
            add(item);
 | 
			
		||||
        }
 | 
			
		||||
        //TODO player move animation
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,28 @@
 | 
			
		||||
package pp.monopoly.client.gui;
 | 
			
		||||
 | 
			
		||||
import com.jme3.renderer.RenderManager;
 | 
			
		||||
import com.jme3.renderer.ViewPort;
 | 
			
		||||
import com.jme3.scene.control.AbstractControl;
 | 
			
		||||
 | 
			
		||||
import pp.monopoly.model.Figure;
 | 
			
		||||
 | 
			
		||||
public class FigureControl extends AbstractControl {
 | 
			
		||||
 | 
			
		||||
    private final Figure figure;
 | 
			
		||||
 | 
			
		||||
    public FigureControl(Figure figure) {
 | 
			
		||||
        super();
 | 
			
		||||
        this.figure = figure;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void controlUpdate(float tpf) {
 | 
			
		||||
        //TODO: animation
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void controlRender(RenderManager rm, ViewPort vp) {
 | 
			
		||||
        // No rendering required
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,565 +0,0 @@
 | 
			
		||||
package pp.monopoly.client.gui;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Timer;
 | 
			
		||||
import java.util.TimerTask;
 | 
			
		||||
 | 
			
		||||
import com.jme3.light.AmbientLight;
 | 
			
		||||
import com.jme3.light.DirectionalLight;
 | 
			
		||||
import com.jme3.material.Material;
 | 
			
		||||
import com.jme3.math.ColorRGBA;
 | 
			
		||||
import com.jme3.math.FastMath;
 | 
			
		||||
import com.jme3.math.Vector3f;
 | 
			
		||||
import com.jme3.renderer.RenderManager;
 | 
			
		||||
import com.jme3.renderer.ViewPort;
 | 
			
		||||
import com.jme3.scene.control.AbstractControl;
 | 
			
		||||
import com.jme3.texture.Texture;
 | 
			
		||||
 | 
			
		||||
import pp.monopoly.client.MonopolyApp;
 | 
			
		||||
import pp.monopoly.client.gui.popups.AcceptTrade;
 | 
			
		||||
import pp.monopoly.client.gui.popups.BuildingPropertyCard;
 | 
			
		||||
import pp.monopoly.client.gui.popups.ConfirmTrade;
 | 
			
		||||
import pp.monopoly.client.gui.popups.EventCardPopup;
 | 
			
		||||
import pp.monopoly.client.gui.popups.FoodFieldCard;
 | 
			
		||||
import pp.monopoly.client.gui.popups.GateFieldCard;
 | 
			
		||||
import pp.monopoly.client.gui.popups.Gulag;
 | 
			
		||||
import pp.monopoly.client.gui.popups.GulagInfo;
 | 
			
		||||
import pp.monopoly.client.gui.popups.LooserPopUp;
 | 
			
		||||
import pp.monopoly.client.gui.popups.NoMoneyWarning;
 | 
			
		||||
import pp.monopoly.client.gui.popups.ReceivedRent;
 | 
			
		||||
import pp.monopoly.client.gui.popups.RejectTrade;
 | 
			
		||||
import pp.monopoly.client.gui.popups.Rent;
 | 
			
		||||
import pp.monopoly.client.gui.popups.TimeOut;
 | 
			
		||||
import pp.monopoly.client.gui.popups.WinnerPopUp;
 | 
			
		||||
import pp.monopoly.game.server.Player;
 | 
			
		||||
import pp.monopoly.game.server.PlayerHandler;
 | 
			
		||||
import pp.monopoly.message.server.NotificationMessage;
 | 
			
		||||
import pp.monopoly.message.server.TradeReply;
 | 
			
		||||
import pp.monopoly.model.fields.BuildingProperty;
 | 
			
		||||
import pp.monopoly.model.fields.FoodField;
 | 
			
		||||
import pp.monopoly.model.fields.GateField;
 | 
			
		||||
import pp.monopoly.notification.EventCardEvent;
 | 
			
		||||
import pp.monopoly.notification.GameEventListener;
 | 
			
		||||
import pp.monopoly.notification.PopUpEvent;
 | 
			
		||||
import pp.monopoly.notification.UpdatePlayerView;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * TestWorld zeigt eine einfache Szene mit Spielfeld und Spielfiguren.
 | 
			
		||||
 */
 | 
			
		||||
public class TestWorld implements GameEventListener {
 | 
			
		||||
 | 
			
		||||
    private final MonopolyApp app;
 | 
			
		||||
    private PlayerHandler playerHandler;
 | 
			
		||||
    private CameraController cameraController;
 | 
			
		||||
    private Toolbar toolbar;
 | 
			
		||||
    private List<String> existingHouses = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Konstruktor für die TestWorld.
 | 
			
		||||
     *
 | 
			
		||||
     * @param app     Die Hauptanwendung
 | 
			
		||||
     */
 | 
			
		||||
    public TestWorld(MonopolyApp app) {
 | 
			
		||||
        this.app = app;
 | 
			
		||||
        this.playerHandler = app.getGameLogic().getPlayerHandler();
 | 
			
		||||
        app.getGameLogic().addListener(this);
 | 
			
		||||
        cameraController = new CameraController(app.getCamera());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initialisiert die Szene mit Spielfeld und Figuren.
 | 
			
		||||
     */
 | 
			
		||||
    public void initializeScene() {
 | 
			
		||||
        // Entferne bestehende Inhalte
 | 
			
		||||
        app.getGuiNode().detachAllChildren();
 | 
			
		||||
        app.getRootNode().detachAllChildren();
 | 
			
		||||
 | 
			
		||||
        System.out.println("Szene initialisiert.");
 | 
			
		||||
 | 
			
		||||
        //Füge Inhalte ein
 | 
			
		||||
        setSkyColor();
 | 
			
		||||
        createBoard();
 | 
			
		||||
        addLighting();
 | 
			
		||||
        createPlayerFigures();
 | 
			
		||||
        toolbar = new Toolbar(app);
 | 
			
		||||
        toolbar.open();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Setzt die Hintergrundfarbe der Szene auf hellblau.
 | 
			
		||||
     */
 | 
			
		||||
    private void setSkyColor() {
 | 
			
		||||
        app.getViewPort().setBackgroundColor(new com.jme3.math.ColorRGBA(0.5f, 0.7f, 1.0f, 1.0f));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Erstellt das Spielfeld und fügt es zur Szene hinzu.
 | 
			
		||||
     */
 | 
			
		||||
    private void createBoard() {
 | 
			
		||||
        try {
 | 
			
		||||
            com.jme3.scene.shape.Box box = new com.jme3.scene.shape.Box(10, 0.1f, 10);
 | 
			
		||||
            com.jme3.scene.Geometry geom = new com.jme3.scene.Geometry("Board", box);
 | 
			
		||||
 | 
			
		||||
            Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
 | 
			
		||||
            Texture texture = app.getAssetManager().loadTexture("Pictures/board2.png");
 | 
			
		||||
            mat.setTexture("DiffuseMap", texture);
 | 
			
		||||
            geom.setMaterial(mat);
 | 
			
		||||
 | 
			
		||||
            geom.setLocalTranslation(0, -0.1f, 0);
 | 
			
		||||
 | 
			
		||||
            com.jme3.math.Quaternion rotation = new com.jme3.math.Quaternion();
 | 
			
		||||
            rotation.fromAngleAxis(FastMath.HALF_PI, com.jme3.math.Vector3f.UNIT_Y);
 | 
			
		||||
            geom.setLocalRotation(rotation);
 | 
			
		||||
 | 
			
		||||
            app.getRootNode().attachChild(geom);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            System.err.println("Fehler beim Erstellen des Spielfelds: " + e.getMessage());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void addLighting() {
 | 
			
		||||
        // Direktionales Licht
 | 
			
		||||
        DirectionalLight sun = new DirectionalLight();
 | 
			
		||||
        sun.setColor(ColorRGBA.White);
 | 
			
		||||
        sun.setDirection(new Vector3f(-0.5f, -0.7f, -1.0f).normalizeLocal());
 | 
			
		||||
        app.getRootNode().addLight(sun);
 | 
			
		||||
 | 
			
		||||
        // Umgebungslicht
 | 
			
		||||
        AmbientLight ambient = new AmbientLight();
 | 
			
		||||
        ambient.setColor(new ColorRGBA(0.6f, 0.6f, 0.6f, 1.0f));
 | 
			
		||||
        app.getRootNode().addLight(ambient);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private com.jme3.math.Quaternion calculateRotationForField(int fieldID) {
 | 
			
		||||
        com.jme3.math.Quaternion rotation = new com.jme3.math.Quaternion();
 | 
			
		||||
    
 | 
			
		||||
        // Berechne die Rotation basierend auf der Feld-ID
 | 
			
		||||
        if (fieldID >= 0 && fieldID <= 9) {
 | 
			
		||||
            // Untere Seite (0-9)
 | 
			
		||||
            rotation.fromAngleAxis(0, Vector3f.UNIT_Y); // Richtung: nach oben
 | 
			
		||||
        } else if (fieldID >= 10 && fieldID <= 19) {
 | 
			
		||||
            // Rechte Seite (10-19)
 | 
			
		||||
            rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y); // Richtung: nach links
 | 
			
		||||
        } else if (fieldID >= 20 && fieldID <= 29) {
 | 
			
		||||
            // Obere Seite (20-29)
 | 
			
		||||
            rotation.fromAngleAxis(FastMath.PI, Vector3f.UNIT_Y); // Richtung: nach unten
 | 
			
		||||
        } else if (fieldID >= 30 && fieldID <= 39) {
 | 
			
		||||
            // Linke Seite (30-39)
 | 
			
		||||
            rotation.fromAngleAxis(3 * FastMath.HALF_PI, Vector3f.UNIT_Y); // Richtung: nach rechts
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        // Korrigiere die Richtung für die Quadranten 10–19 und 30–39 (gegenüberliegende Richtung)
 | 
			
		||||
        if ((fieldID >= 10 && fieldID <= 19) || (fieldID >= 30 && fieldID <= 39)) {
 | 
			
		||||
            com.jme3.math.Quaternion oppositeDirection = new com.jme3.math.Quaternion();
 | 
			
		||||
            oppositeDirection.fromAngleAxis(FastMath.PI, Vector3f.UNIT_Y); // 180° drehen
 | 
			
		||||
            rotation = rotation.multLocal(oppositeDirection);
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        // Füge zusätzliche 90° nach links hinzu
 | 
			
		||||
        com.jme3.math.Quaternion leftTurn = new com.jme3.math.Quaternion();
 | 
			
		||||
        leftTurn.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y); // 90° nach links
 | 
			
		||||
        rotation = rotation.multLocal(leftTurn);
 | 
			
		||||
    
 | 
			
		||||
        return rotation;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Erstellt die Spielfiguren basierend auf der bereits bekannten Spielerliste.
 | 
			
		||||
     */
 | 
			
		||||
    private void createPlayerFigures() {
 | 
			
		||||
        for (Player player : playerHandler.getPlayers()) {
 | 
			
		||||
            try {
 | 
			
		||||
                // Lade das Modell
 | 
			
		||||
                com.jme3.scene.Spatial model = app.getAssetManager().loadModel(
 | 
			
		||||
                        "models/" + "Spielfiguren/" + player.getFigure().getType() + "/" + player.getFigure().getType() + ".j3o");
 | 
			
		||||
    
 | 
			
		||||
                // Skaliere und positioniere das Modell
 | 
			
		||||
                model.setLocalScale(0.5f);
 | 
			
		||||
                Vector3f startPosition = calculateFieldPosition(player.getFieldID(), player.getId());
 | 
			
		||||
                model.setLocalTranslation(startPosition);
 | 
			
		||||
    
 | 
			
		||||
                // Setze die Rotation basierend auf der Feld-ID
 | 
			
		||||
                model.setLocalRotation(calculateRotationForField(player.getFieldID()));
 | 
			
		||||
    
 | 
			
		||||
                model.setName("PlayerFigure_" + player.getId());
 | 
			
		||||
    
 | 
			
		||||
                // Füge das Modell zur Szene hinzu
 | 
			
		||||
                app.getRootNode().attachChild(model);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                System.err.println("Fehler beim Laden des Modells für Spieler " + player.getId() + ": " + e.getMessage());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Vector3f calculateFieldPosition(int fieldID, int playerIndex) {
 | 
			
		||||
        float offset = 0.1f;
 | 
			
		||||
        float baseX = 0.0f;
 | 
			
		||||
        float baseZ = 0.0f;
 | 
			
		||||
 | 
			
		||||
        switch (fieldID) {
 | 
			
		||||
            case 0: baseX = -9.1f; baseZ = -9.1f; break;
 | 
			
		||||
            case 1: baseX = -6.5f; baseZ = -9.1f; break;
 | 
			
		||||
            case 2: baseX = -4.9f; baseZ = -9.1f; break;
 | 
			
		||||
            case 3: baseX = -3.3f; baseZ = -9.1f; break;
 | 
			
		||||
            case 4: baseX = -1.6f; baseZ = -9.1f; break;
 | 
			
		||||
            case 5: baseX =  0.0f; baseZ = -9.1f; break;
 | 
			
		||||
            case 6: baseX =  1.6f; baseZ = -9.1f; break;
 | 
			
		||||
            case 7: baseX =  3.3f; baseZ = -9.1f; break;
 | 
			
		||||
            case 8: baseX =  4.9f; baseZ = -9.1f; break;
 | 
			
		||||
            case 9: baseX =  6.5f; baseZ = -9.1f; break;
 | 
			
		||||
            case 10: baseX = 9.1f; baseZ = -9.1f; break; 
 | 
			
		||||
            case 11: baseX = 9.1f; baseZ = -6.5f; break;
 | 
			
		||||
            case 12: baseX = 9.1f; baseZ = -4.9f; break;
 | 
			
		||||
            case 13: baseX = 9.1f; baseZ = -3.3f; break;
 | 
			
		||||
            case 14: baseX = 9.1f; baseZ = -1.6f; break;
 | 
			
		||||
            case 15: baseX = 9.1f; baseZ =  0.0f; break;
 | 
			
		||||
            case 16: baseX = 9.1f; baseZ =  1.6f; break;
 | 
			
		||||
            case 17: baseX = 9.1f; baseZ =  3.3f; break;
 | 
			
		||||
            case 18: baseX = 9.1f; baseZ =  4.9f; break;
 | 
			
		||||
            case 19: baseX = 9.1f; baseZ =  6.5f; break;
 | 
			
		||||
            case 20: baseX = 9.1f; baseZ =  9.1f; break;
 | 
			
		||||
            case 21: baseX = 6.5f; baseZ =  9.1f; break;
 | 
			
		||||
            case 22: baseX = 4.9f; baseZ =  9.1f; break;
 | 
			
		||||
            case 23: baseX = 3.3f; baseZ =  9.1f; break;
 | 
			
		||||
            case 24: baseX = 1.6f; baseZ =  9.1f; break;
 | 
			
		||||
            case 25: baseX = 0.0f; baseZ =  9.1f; break;
 | 
			
		||||
            case 26: baseX = -1.6f; baseZ = 9.1f; break;
 | 
			
		||||
            case 27: baseX = -3.3f; baseZ = 9.1f; break;
 | 
			
		||||
            case 28: baseX = -4.9f; baseZ = 9.1f; break;
 | 
			
		||||
            case 29: baseX = -6.5f; baseZ = 9.1f; break;
 | 
			
		||||
            case 30: baseX = -9.1f; baseZ = 9.1f; break;
 | 
			
		||||
            case 31: baseX = -9.1f; baseZ = 6.5f; break;
 | 
			
		||||
            case 32: baseX = -9.1f; baseZ = 4.9f; break;
 | 
			
		||||
            case 33: baseX = -9.1f; baseZ = 3.3f; break;
 | 
			
		||||
            case 34: baseX = -9.1f; baseZ = 1.6f; break;
 | 
			
		||||
            case 35: baseX = -9.1f; baseZ = 0.0f; break;
 | 
			
		||||
            case 36: baseX = -9.1f; baseZ = -1.6f; break;
 | 
			
		||||
            case 37: baseX = -9.1f; baseZ = -3.3f; break;
 | 
			
		||||
            case 38: baseX = -9.1f; baseZ = -4.9f; break;
 | 
			
		||||
            case 39: baseX = -9.1f; baseZ = -6.5f; break;
 | 
			
		||||
            default: throw new IllegalArgumentException("Ungültige Feld-ID: " + fieldID);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        float xOffset = (playerIndex % 2) * offset;
 | 
			
		||||
        float zOffset = (playerIndex / 2) * offset;
 | 
			
		||||
 | 
			
		||||
        return new Vector3f(baseX + xOffset, 0, baseZ + zOffset);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void movePlayerFigure(Player player) {
 | 
			
		||||
        int playerIndexOnField = calculatePlayerIndexOnField(player.getFieldID(), player.getId());
 | 
			
		||||
        String figureName = "PlayerFigure_" + player.getId();
 | 
			
		||||
        com.jme3.scene.Spatial figure = app.getRootNode().getChild(figureName);
 | 
			
		||||
    
 | 
			
		||||
        if (figure != null) {
 | 
			
		||||
            // Füge einen Delay hinzu (z.B. 3 Sekunden)
 | 
			
		||||
            Timer timer = new Timer();
 | 
			
		||||
            timer.schedule(new TimerTask() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run() {
 | 
			
		||||
                    app.enqueue(() -> {
 | 
			
		||||
                        // Setze die Position
 | 
			
		||||
                        Vector3f targetPosition = calculateFieldPosition(player.getFieldID(), player.getId());
 | 
			
		||||
                        figure.setLocalTranslation(targetPosition);
 | 
			
		||||
    
 | 
			
		||||
                        // Aktualisiere die Rotation basierend auf der Feld-ID
 | 
			
		||||
                        figure.setLocalRotation(calculateRotationForField(player.getFieldID()));
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            }, 3000); // 3000 Millisekunden Delay
 | 
			
		||||
        } else {
 | 
			
		||||
            System.err.println("Figur für Spieler " + player.getId() + " nicht gefunden.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int getFieldIDFromPosition(Vector3f position) {
 | 
			
		||||
        for (int fieldID = 0; fieldID < 40; fieldID++) {
 | 
			
		||||
            Vector3f fieldPosition = calculateFieldPosition(fieldID, 0);
 | 
			
		||||
            if (fieldPosition.distance(position) < 0.5f) { // Toleranz für Positionserkennung
 | 
			
		||||
                return fieldID;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        throw new IllegalArgumentException("Position entspricht keinem gültigen Feld: " + position);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Berechnet den Eckpunkt basierend auf Start- und Zielposition.
 | 
			
		||||
     *
 | 
			
		||||
     * @param startPosition Die Startposition der Figur.
 | 
			
		||||
     * @param targetPosition Die Zielposition der Figur.
 | 
			
		||||
     * @return Die Position der Ecke, die passiert werden muss.
 | 
			
		||||
     */
 | 
			
		||||
    private Vector3f calculateCornerPosition(Vector3f startPosition, Vector3f targetPosition) {
 | 
			
		||||
        // Ziel: Immer entlang der Spielfeldkante navigieren
 | 
			
		||||
        float deltaX = targetPosition.x - startPosition.x;
 | 
			
		||||
        float deltaZ = targetPosition.z - startPosition.z;
 | 
			
		||||
    
 | 
			
		||||
        // Überprüfen, ob Bewegung entlang X oder Z-Koordinate zuerst erfolgen soll
 | 
			
		||||
        if (deltaX != 0 && deltaZ != 0) {
 | 
			
		||||
            if (Math.abs(deltaX) > Math.abs(deltaZ)) {
 | 
			
		||||
                // Bewegung entlang X zuerst
 | 
			
		||||
                return new Vector3f(targetPosition.x, 0, startPosition.z);
 | 
			
		||||
            } else {
 | 
			
		||||
                // Bewegung entlang Z zuerst
 | 
			
		||||
                return new Vector3f(startPosition.x, 0, targetPosition.z);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            // Bewegung ist bereits entlang einer Achse (keine Ecke erforderlich)
 | 
			
		||||
            return targetPosition;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private List<Vector3f> calculatePath(int startFieldID, int targetFieldID, int playerIndex) {
 | 
			
		||||
        List<Vector3f> pathPoints = new ArrayList<>();
 | 
			
		||||
    
 | 
			
		||||
        // Bewegung im Uhrzeigersinn
 | 
			
		||||
        if (startFieldID < targetFieldID) {
 | 
			
		||||
            for (int i = startFieldID; i <= targetFieldID; i++) {
 | 
			
		||||
                // Füge Ecken hinzu, falls sie überschritten werden
 | 
			
		||||
                if (i == 10 || i == 20 || i == 30 || i == 0) {
 | 
			
		||||
                    pathPoints.add(calculateFieldPosition(i, playerIndex));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            // Bewegung über das Ende des Spielfelds hinaus (z.B. von 39 zu 5)
 | 
			
		||||
            for (int i = startFieldID; i < 40; i++) {
 | 
			
		||||
                if (i == 10 || i == 20 || i == 30 || i == 0) {
 | 
			
		||||
                    pathPoints.add(calculateFieldPosition(i, playerIndex));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            for (int i = 0; i <= targetFieldID; i++) {
 | 
			
		||||
                if (i == 10 || i == 20 || i == 30 || i == 0) {
 | 
			
		||||
                    pathPoints.add(calculateFieldPosition(i, playerIndex));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        // Füge das Ziel hinzu
 | 
			
		||||
        pathPoints.add(calculateFieldPosition(targetFieldID, playerIndex));
 | 
			
		||||
    
 | 
			
		||||
        return pathPoints;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private int calculatePlayerIndexOnField(int fieldID, int playerID) {
 | 
			
		||||
        List<Player> playersOnField = playerHandler.getPlayers().stream()
 | 
			
		||||
            .filter(p -> p.getFieldID() == fieldID)
 | 
			
		||||
            .toList();
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < playersOnField.size(); i++) {
 | 
			
		||||
            if (playersOnField.get(i).getId() == playerID) {
 | 
			
		||||
                return i;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void animateMovementAlongPath(com.jme3.scene.Spatial figure, List<Vector3f> pathPoints) {
 | 
			
		||||
        float animationDurationPerSegment = 2.5f; // Langsamere Animation (2.5 Sekunden pro Segment)
 | 
			
		||||
        int[] currentSegment = {0};
 | 
			
		||||
    
 | 
			
		||||
        app.enqueue(() -> {
 | 
			
		||||
            figure.addControl(new AbstractControl() {
 | 
			
		||||
                private float elapsedTime = 0.0f;
 | 
			
		||||
    
 | 
			
		||||
                @Override
 | 
			
		||||
                protected void controlUpdate(float tpf) {
 | 
			
		||||
                    if (currentSegment[0] >= pathPoints.size() - 1) {
 | 
			
		||||
                        this.setEnabled(false); // Animation abgeschlossen
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
    
 | 
			
		||||
                    elapsedTime += tpf;
 | 
			
		||||
                    float progress = Math.min(elapsedTime / animationDurationPerSegment, 1.0f);
 | 
			
		||||
    
 | 
			
		||||
                    Vector3f start = pathPoints.get(currentSegment[0]);
 | 
			
		||||
                    Vector3f end = pathPoints.get(currentSegment[0] + 1);
 | 
			
		||||
    
 | 
			
		||||
                    Vector3f interpolatedPosition = start.interpolateLocal(end, progress);
 | 
			
		||||
                    figure.setLocalTranslation(interpolatedPosition);
 | 
			
		||||
    
 | 
			
		||||
                    if (progress >= 1.0f) {
 | 
			
		||||
                        elapsedTime = 0.0f;
 | 
			
		||||
                        currentSegment[0]++;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
    
 | 
			
		||||
                @Override
 | 
			
		||||
                protected void controlRender(RenderManager rm, ViewPort vp) {
 | 
			
		||||
                    // Nicht benötigt
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void receivedEvent(PopUpEvent event) {
 | 
			
		||||
        if (event.msg().equals("Buy")) {
 | 
			
		||||
            Timer timer = new Timer();
 | 
			
		||||
            timer.schedule(new TimerTask() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void run() {
 | 
			
		||||
                    app.enqueue(() -> {
 | 
			
		||||
                        int field = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
 | 
			
		||||
                        Object fieldObject = app.getGameLogic().getBoardManager().getFieldAtIndex(field);
 | 
			
		||||
 | 
			
		||||
                        if (fieldObject instanceof BuildingProperty) {
 | 
			
		||||
                            new BuildingPropertyCard(app).open();
 | 
			
		||||
                        } else if (fieldObject instanceof GateField) {
 | 
			
		||||
                            new GateFieldCard(app).open();
 | 
			
		||||
                        } else if (fieldObject instanceof FoodField) {
 | 
			
		||||
                            new FoodFieldCard(app).open();
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            }, 2500);
 | 
			
		||||
        } else if (event.msg().equals("Winner")) {
 | 
			
		||||
            new WinnerPopUp(app).open();
 | 
			
		||||
        } else if (event.msg().equals("Looser")) {
 | 
			
		||||
            new LooserPopUp(app).open();
 | 
			
		||||
        } else if (event.msg().equals("timeout")) {
 | 
			
		||||
            new TimeOut(app).open();
 | 
			
		||||
        } else if (event.msg().equals("tradeRequest")) {
 | 
			
		||||
            new ConfirmTrade(app).open();
 | 
			
		||||
        } else if (event.msg().equals("goingToJail")) {
 | 
			
		||||
            new Gulag(app).open();
 | 
			
		||||
        } else if (event.msg().equals("NoMoneyWarning")) {
 | 
			
		||||
            new NoMoneyWarning(app).open();
 | 
			
		||||
        } else if(event.msg().equals("rent")) {
 | 
			
		||||
            new Rent(app, ( (NotificationMessage) event.message()).getRentOwner(), ( (NotificationMessage) event.message()).getRentAmount() ).open();
 | 
			
		||||
        } else if (event.msg().equals("jailtryagain")) {
 | 
			
		||||
            new GulagInfo(app, 1).open();
 | 
			
		||||
        } else if (event.msg().equals("jailpay")) {
 | 
			
		||||
            new GulagInfo(app, 3).open();
 | 
			
		||||
        } else if (event.msg().equals("tradepos")) {
 | 
			
		||||
            new AcceptTrade(app, (TradeReply) event.message()).open();
 | 
			
		||||
        } else if (event.msg().equals("tradeneg")) {
 | 
			
		||||
            new RejectTrade(app, (TradeReply) event.message()).open();
 | 
			
		||||
        } else if (event.msg().equals("ReceivedRent")) {
 | 
			
		||||
            new ReceivedRent(app, ( (NotificationMessage) event.message()).getRentOwner(), ( (NotificationMessage) event.message()).getRentAmount() ).open();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Vector3f calculateBuildingPosition(int fieldID) {
 | 
			
		||||
        float baseX = 0.0f;
 | 
			
		||||
        float baseZ = 0.0f;
 | 
			
		||||
    
 | 
			
		||||
        switch (fieldID) {
 | 
			
		||||
            case 0: baseX = -8.4f; baseZ = -7.7f; break;
 | 
			
		||||
            case 1: baseX = -6.3f; baseZ = -7.7f; break;
 | 
			
		||||
            case 2: baseX = -4.7f; baseZ = -7.7f; break;
 | 
			
		||||
            case 3: baseX = -3.1f; baseZ = -7.7f; break;
 | 
			
		||||
            case 4: baseX = -1.4f; baseZ = -7.7f; break;
 | 
			
		||||
            case 5: baseX =  0.2f; baseZ = -7.7f; break;
 | 
			
		||||
            case 6: baseX =  1.8f; baseZ = -7.7f; break;
 | 
			
		||||
            case 7: baseX =  3.5f; baseZ = -7.7f; break;
 | 
			
		||||
            case 8: baseX =  5.1f; baseZ = -7.7f; break;
 | 
			
		||||
            case 9: baseX =  6.7f; baseZ = -7.7f; break;
 | 
			
		||||
            case 10: baseX = 8.2f; baseZ = -7.7f; break;
 | 
			
		||||
            case 11: baseX = 8.2f; baseZ = -6.5f; break;    //passt
 | 
			
		||||
            case 12: baseX = 8.2f; baseZ = -4.9f; break;    //passt
 | 
			
		||||
            case 13: baseX = 8.2f; baseZ = -3.3f; break;    //passt
 | 
			
		||||
            case 14: baseX = 8.2f; baseZ = -1.6f; break;    //passt
 | 
			
		||||
            case 15: baseX = 8.2f; baseZ =  0.0f; break;    //passt
 | 
			
		||||
            case 16: baseX = 8.2f; baseZ =  1.6f; break;    //passt
 | 
			
		||||
            case 17: baseX = 8.2f; baseZ =  3.3f; break;    //passt
 | 
			
		||||
            case 18: baseX = 8.2f; baseZ =  4.9f; break;    //passt
 | 
			
		||||
            case 19: baseX = 8.2f; baseZ =  6.5f; break;    //passt
 | 
			
		||||
            case 20: baseX = 8.2f; baseZ =  7.7f; break;
 | 
			
		||||
            case 21: baseX = 6.5f; baseZ =  7.7f; break;
 | 
			
		||||
            case 22: baseX = 4.9f; baseZ =  7.7f; break;
 | 
			
		||||
            case 23: baseX = 3.3f; baseZ =  7.7f; break;
 | 
			
		||||
            case 24: baseX = 1.6f; baseZ =  7.7f; break;
 | 
			
		||||
            case 25: baseX = 0.0f; baseZ =  7.7f; break;
 | 
			
		||||
            case 26: baseX = -1.6f; baseZ = 7.7f; break;
 | 
			
		||||
            case 27: baseX = -3.3f; baseZ = 7.7f; break;
 | 
			
		||||
            case 28: baseX = -4.9f; baseZ = 7.7f; break;
 | 
			
		||||
            case 29: baseX = -6.5f; baseZ = 7.7f; break;
 | 
			
		||||
            case 30: baseX = -7.2f; baseZ = 7.7f; break;
 | 
			
		||||
            case 31: baseX = -7.2f; baseZ = 6.5f; break;
 | 
			
		||||
            case 32: baseX = -7.2f; baseZ = 4.9f; break;
 | 
			
		||||
            case 33: baseX = -7.2f; baseZ = 3.3f; break;
 | 
			
		||||
            case 34: baseX = -7.2f; baseZ = 1.6f; break;
 | 
			
		||||
            case 35: baseX = -7.2f; baseZ = 0.0f; break;
 | 
			
		||||
            case 36: baseX = -7.2f; baseZ = -1.6f; break;
 | 
			
		||||
            case 37: baseX = -7.2f; baseZ = -3.3f; break;
 | 
			
		||||
            case 38: baseX = -7.2f; baseZ = -4.9f; break;
 | 
			
		||||
            case 39: baseX = -7.2f; baseZ = -6.5f; break;
 | 
			
		||||
            default: throw new IllegalArgumentException("Ungültige Feld-ID: " + fieldID);
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        return new Vector3f(baseX, 0, baseZ);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void updateHousesOnBoard() {
 | 
			
		||||
        app.enqueue(() -> {
 | 
			
		||||
            List<BuildingProperty> propertiesWithBuildings = app.getGameLogic().getBoardManager().getPropertiesWithBuildings();
 | 
			
		||||
 | 
			
		||||
            for (BuildingProperty property : propertiesWithBuildings) {
 | 
			
		||||
                int houseCount = property.getHouses();
 | 
			
		||||
                int hotelCount = property.getHotel();
 | 
			
		||||
 | 
			
		||||
                String uniqueIdentifier = "Building_" + property.getId() + "_" + (hotelCount > 0 ? "Hotel" : houseCount);
 | 
			
		||||
 | 
			
		||||
                if (existingHouses.contains(uniqueIdentifier)) continue;
 | 
			
		||||
 | 
			
		||||
                try {
 | 
			
		||||
                    String modelPath = hotelCount > 0
 | 
			
		||||
                            ? "models/Hotel/Hotel.j3o"
 | 
			
		||||
                            : "models/Haus/" + houseCount + "Haus.j3o";
 | 
			
		||||
 | 
			
		||||
                    com.jme3.scene.Spatial buildingModel = app.getAssetManager().loadModel(modelPath);
 | 
			
		||||
 | 
			
		||||
                    Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
 | 
			
		||||
                    
 | 
			
		||||
                    buildingModel.setMaterial(mat);
 | 
			
		||||
 | 
			
		||||
                    buildingModel.setLocalScale(0.5f);
 | 
			
		||||
                    Vector3f position = calculateBuildingPosition(property.getId()).add(0, 0.5f, 0);
 | 
			
		||||
                    buildingModel.setLocalTranslation(position);
 | 
			
		||||
 | 
			
		||||
                    com.jme3.math.Quaternion rotation = new com.jme3.math.Quaternion();
 | 
			
		||||
                    if (property.getId() >= 1 && property.getId() <= 10) {
 | 
			
		||||
                        rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y);
 | 
			
		||||
                    } else if (property.getId() >= 21 && property.getId() <= 30) {
 | 
			
		||||
                        rotation.fromAngleAxis(3 * FastMath.HALF_PI, Vector3f.UNIT_Y);
 | 
			
		||||
                    } else if (property.getId() >= 31 && property.getId() <= 39) {
 | 
			
		||||
                        rotation.fromAngleAxis(FastMath.PI, Vector3f.UNIT_Y);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    buildingModel.setLocalRotation(rotation);
 | 
			
		||||
                    buildingModel.setName(uniqueIdentifier);
 | 
			
		||||
                    app.getRootNode().attachChild(buildingModel);
 | 
			
		||||
                    existingHouses.add(uniqueIdentifier);
 | 
			
		||||
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                    System.err.println("Fehler beim Hinzufügen eines Gebäudes: " + e.getMessage());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void receivedEvent(EventCardEvent event) {
 | 
			
		||||
        Timer timer = new Timer();
 | 
			
		||||
        timer.schedule(new TimerTask() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void run() {
 | 
			
		||||
                app.enqueue(() -> new EventCardPopup(app, event.description()).open());
 | 
			
		||||
            }
 | 
			
		||||
        }, 2500);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void receivedEvent(UpdatePlayerView event) {
 | 
			
		||||
        this.playerHandler = app.getGameLogic().getPlayerHandler();
 | 
			
		||||
        for (Player player : playerHandler.getPlayers()) {
 | 
			
		||||
            movePlayerFigure(player);
 | 
			
		||||
        }
 | 
			
		||||
        updateHousesOnBoard();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,9 +1,4 @@
 | 
			
		||||
package pp.monopoly.game.client;
 | 
			
		||||
 | 
			
		||||
import pp.monopoly.game.server.Player;
 | 
			
		||||
import pp.monopoly.message.server.NextPlayerTurn;
 | 
			
		||||
import pp.monopoly.message.server.ViewAssetsResponse;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Represents the active client state in the Monopoly game.
 | 
			
		||||
 * Extends {@link ClientState}.
 | 
			
		||||
@@ -24,17 +19,4 @@ public class ActiveState extends ClientState {
 | 
			
		||||
    boolean isTurn() {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    void recivedNextPlayerTurn(NextPlayerTurn msg) {
 | 
			
		||||
        logic.getBoard().clear();
 | 
			
		||||
        for (Player player : logic.getPlayerHandler().getPlayers()) {
 | 
			
		||||
            logic.getBoard().add(player.getFigure());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    void recivedViewAssetsResponse(ViewAssetsResponse msg) {
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -5,6 +5,8 @@ import java.lang.System.Logger.Level;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import com.jme3.math.Vector3f;
 | 
			
		||||
 | 
			
		||||
import pp.monopoly.game.server.Player;
 | 
			
		||||
import pp.monopoly.game.server.PlayerHandler;
 | 
			
		||||
import pp.monopoly.message.client.ClientMessage;
 | 
			
		||||
@@ -24,8 +26,10 @@ import pp.monopoly.message.server.TradeReply;
 | 
			
		||||
import pp.monopoly.message.server.TradeRequest;
 | 
			
		||||
import pp.monopoly.message.server.ViewAssetsResponse;
 | 
			
		||||
import pp.monopoly.model.Board;
 | 
			
		||||
import pp.monopoly.model.Figure;
 | 
			
		||||
import pp.monopoly.model.Hotel;
 | 
			
		||||
import pp.monopoly.model.House;
 | 
			
		||||
import pp.monopoly.model.Rotation;
 | 
			
		||||
import pp.monopoly.model.TradeHandler;
 | 
			
		||||
import pp.monopoly.model.fields.BoardManager;
 | 
			
		||||
import pp.monopoly.model.fields.BuildingProperty;
 | 
			
		||||
@@ -231,7 +235,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
 | 
			
		||||
        playerHandler = msg.getPlayerHandler();
 | 
			
		||||
        setState(new WaitForTurnState(this));
 | 
			
		||||
        for (Player player : playerHandler.getPlayers()) {
 | 
			
		||||
            board.add(player.getFigure());
 | 
			
		||||
            board.add(new Figure(Vector3f.ZERO, Rotation.NORTH, player.getFigure()));
 | 
			
		||||
        }
 | 
			
		||||
        notifyListeners(new ButtonStatusEvent(false));
 | 
			
		||||
        notifyListeners(new UpdatePlayerView());
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ import pp.monopoly.message.server.NextPlayerTurn;
 | 
			
		||||
import pp.monopoly.message.server.NotificationMessage;
 | 
			
		||||
import pp.monopoly.message.server.PlayerStatusUpdate;
 | 
			
		||||
import pp.monopoly.model.FieldVisitor;
 | 
			
		||||
import pp.monopoly.model.Figure;
 | 
			
		||||
import pp.monopoly.model.card.Card;
 | 
			
		||||
import pp.monopoly.model.fields.BuildingProperty;
 | 
			
		||||
import pp.monopoly.model.fields.EventField;
 | 
			
		||||
@@ -44,7 +43,7 @@ public class Player implements FieldVisitor<Void>{
 | 
			
		||||
    private final int id;
 | 
			
		||||
    private String name;
 | 
			
		||||
    private int accountBalance = 15000;
 | 
			
		||||
    private Figure figure;
 | 
			
		||||
    private String figure;
 | 
			
		||||
    private Set<Integer> properties = new HashSet<>();
 | 
			
		||||
    private int getOutOfJailCard;
 | 
			
		||||
    private int fieldID;
 | 
			
		||||
@@ -82,11 +81,19 @@ public class Player implements FieldVisitor<Void>{
 | 
			
		||||
        this.handler = handler;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setFigure(Figure figure) {
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the figure of the player
 | 
			
		||||
     * @param figure the figure to be set
 | 
			
		||||
     */
 | 
			
		||||
    public void setFigure(String figure) {
 | 
			
		||||
        this.figure = figure;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public Figure getFigure(){
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the figure of the player
 | 
			
		||||
     * @return the figure of the player
 | 
			
		||||
     */
 | 
			
		||||
    public String getFigure() {
 | 
			
		||||
        return figure;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -180,7 +187,6 @@ public class Player implements FieldVisitor<Void>{
 | 
			
		||||
            earnMoney(2000); // Passing GO gives money
 | 
			
		||||
        }
 | 
			
		||||
        fieldID = (fieldID + steps) % 40;
 | 
			
		||||
        figure.moveTo(fieldID);
 | 
			
		||||
        handler.getLogic().send(this, new PlayerStatusUpdate(handler));
 | 
			
		||||
        handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this);
 | 
			
		||||
        return fieldID;
 | 
			
		||||
@@ -194,7 +200,6 @@ public class Player implements FieldVisitor<Void>{
 | 
			
		||||
    public int setPosition(int position){
 | 
			
		||||
        if(position < 40 && position >= 0) {
 | 
			
		||||
            fieldID = position;
 | 
			
		||||
            figure.moveTo(fieldID);
 | 
			
		||||
            handler.getLogic().send(this, new PlayerStatusUpdate(handler));
 | 
			
		||||
            handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this);
 | 
			
		||||
        }
 | 
			
		||||
@@ -212,7 +217,6 @@ public class Player implements FieldVisitor<Void>{
 | 
			
		||||
                earnMoney(2000);
 | 
			
		||||
            }
 | 
			
		||||
            fieldID = position;
 | 
			
		||||
            figure.moveTo(fieldID);
 | 
			
		||||
            handler.getLogic().send(this, new PlayerStatusUpdate(handler));
 | 
			
		||||
            handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,9 @@ package pp.monopoly.game.server;
 | 
			
		||||
import java.lang.System.Logger;
 | 
			
		||||
import java.lang.System.Logger.Level;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import com.jme3.math.Vector3f;
 | 
			
		||||
 | 
			
		||||
import pp.monopoly.MonopolyConfig;
 | 
			
		||||
import pp.monopoly.message.client.AlterProperty;
 | 
			
		||||
@@ -29,8 +27,6 @@ import pp.monopoly.message.server.ServerMessage;
 | 
			
		||||
import pp.monopoly.message.server.TradeReply;
 | 
			
		||||
import pp.monopoly.message.server.TradeRequest;
 | 
			
		||||
import pp.monopoly.message.server.ViewAssetsResponse;
 | 
			
		||||
import pp.monopoly.model.Figure;
 | 
			
		||||
import pp.monopoly.model.Rotation;
 | 
			
		||||
import pp.monopoly.model.TradeHandler;
 | 
			
		||||
import pp.monopoly.model.card.DeckHelper;
 | 
			
		||||
import pp.monopoly.model.fields.BoardManager;
 | 
			
		||||
@@ -223,8 +219,7 @@ public class ServerGameLogic implements ClientInterpreter {
 | 
			
		||||
            String name = msg.getName();
 | 
			
		||||
            String truc = name.length() > 10 ? name.substring(0, 15) : name;
 | 
			
		||||
            player.setName(truc);
 | 
			
		||||
            Figure figure = new Figure(new Vector3f(0, 1, 0), Rotation.NORTH, msg.getFigure());
 | 
			
		||||
            player.setFigure(figure);
 | 
			
		||||
            player.setFigure(msg.getFigure());
 | 
			
		||||
            // board.addFigure(figure);
 | 
			
		||||
            playerHandler.setPlayerReady(player, true);    
 | 
			
		||||
            LOGGER.log(Level.DEBUG, "Player {0} is ready", player.getName());
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user