mirror of
				https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
				synced 2025-10-31 01:41:51 +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; | 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.Material; | ||||||
| import com.jme3.material.RenderState.BlendMode; | import com.jme3.material.RenderState.BlendMode; | ||||||
| import com.jme3.math.ColorRGBA; | import com.jme3.math.ColorRGBA; | ||||||
| @@ -14,7 +10,6 @@ import com.jme3.scene.Spatial; | |||||||
| import com.jme3.scene.shape.Box; | import com.jme3.scene.shape.Box; | ||||||
|  |  | ||||||
| import pp.monopoly.client.MonopolyApp; | import pp.monopoly.client.MonopolyApp; | ||||||
| import pp.monopoly.game.server.Player; |  | ||||||
| import pp.monopoly.model.Figure; | import pp.monopoly.model.Figure; | ||||||
| import pp.monopoly.model.Hotel; | import pp.monopoly.model.Hotel; | ||||||
| import pp.monopoly.model.House; | import pp.monopoly.model.House; | ||||||
| @@ -48,7 +43,7 @@ public class BobTheBuilder extends GameBoardSynchronizer { | |||||||
|  |  | ||||||
|         // Setze die Rotation basierend auf der Feld-ID |         // Setze die Rotation basierend auf der Feld-ID | ||||||
|         node.setLocalRotation(figure.getRot().toQuaternion()); |         node.setLocalRotation(figure.getRot().toQuaternion()); | ||||||
|         // node.addControl(new FigureControl(figure)); |         node.addControl(new FigureControl(figure)); | ||||||
|         return node; |         return node; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -146,14 +141,6 @@ public class BobTheBuilder extends GameBoardSynchronizer { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void receivedEvent(UpdatePlayerView event) { |     public void receivedEvent(UpdatePlayerView event) { | ||||||
|         board.removePlayers(); |         //TODO player move animation | ||||||
|          |  | ||||||
|         //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); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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; | 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. |  * Represents the active client state in the Monopoly game. | ||||||
|  * Extends {@link ClientState}. |  * Extends {@link ClientState}. | ||||||
| @@ -24,17 +19,4 @@ public class ActiveState extends ClientState { | |||||||
|     boolean isTurn() { |     boolean isTurn() { | ||||||
|         return true; |         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.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
|  | import com.jme3.math.Vector3f; | ||||||
|  |  | ||||||
| import pp.monopoly.game.server.Player; | import pp.monopoly.game.server.Player; | ||||||
| import pp.monopoly.game.server.PlayerHandler; | import pp.monopoly.game.server.PlayerHandler; | ||||||
| import pp.monopoly.message.client.ClientMessage; | 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.TradeRequest; | ||||||
| import pp.monopoly.message.server.ViewAssetsResponse; | import pp.monopoly.message.server.ViewAssetsResponse; | ||||||
| import pp.monopoly.model.Board; | import pp.monopoly.model.Board; | ||||||
|  | import pp.monopoly.model.Figure; | ||||||
| import pp.monopoly.model.Hotel; | import pp.monopoly.model.Hotel; | ||||||
| import pp.monopoly.model.House; | import pp.monopoly.model.House; | ||||||
|  | import pp.monopoly.model.Rotation; | ||||||
| import pp.monopoly.model.TradeHandler; | import pp.monopoly.model.TradeHandler; | ||||||
| import pp.monopoly.model.fields.BoardManager; | import pp.monopoly.model.fields.BoardManager; | ||||||
| import pp.monopoly.model.fields.BuildingProperty; | import pp.monopoly.model.fields.BuildingProperty; | ||||||
| @@ -231,7 +235,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker { | |||||||
|         playerHandler = msg.getPlayerHandler(); |         playerHandler = msg.getPlayerHandler(); | ||||||
|         setState(new WaitForTurnState(this)); |         setState(new WaitForTurnState(this)); | ||||||
|         for (Player player : playerHandler.getPlayers()) { |         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 ButtonStatusEvent(false)); | ||||||
|         notifyListeners(new UpdatePlayerView()); |         notifyListeners(new UpdatePlayerView()); | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ import pp.monopoly.message.server.NextPlayerTurn; | |||||||
| import pp.monopoly.message.server.NotificationMessage; | import pp.monopoly.message.server.NotificationMessage; | ||||||
| import pp.monopoly.message.server.PlayerStatusUpdate; | import pp.monopoly.message.server.PlayerStatusUpdate; | ||||||
| import pp.monopoly.model.FieldVisitor; | import pp.monopoly.model.FieldVisitor; | ||||||
| import pp.monopoly.model.Figure; |  | ||||||
| import pp.monopoly.model.card.Card; | import pp.monopoly.model.card.Card; | ||||||
| import pp.monopoly.model.fields.BuildingProperty; | import pp.monopoly.model.fields.BuildingProperty; | ||||||
| import pp.monopoly.model.fields.EventField; | import pp.monopoly.model.fields.EventField; | ||||||
| @@ -44,7 +43,7 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|     private final int id; |     private final int id; | ||||||
|     private String name; |     private String name; | ||||||
|     private int accountBalance = 15000; |     private int accountBalance = 15000; | ||||||
|     private Figure figure; |     private String figure; | ||||||
|     private Set<Integer> properties = new HashSet<>(); |     private Set<Integer> properties = new HashSet<>(); | ||||||
|     private int getOutOfJailCard; |     private int getOutOfJailCard; | ||||||
|     private int fieldID; |     private int fieldID; | ||||||
| @@ -82,11 +81,19 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|         this.handler = handler; |         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; |         this.figure = figure; | ||||||
|     } |     } | ||||||
|      |  | ||||||
|     public Figure getFigure(){ |     /** | ||||||
|  |      * Returns the figure of the player | ||||||
|  |      * @return the figure of the player | ||||||
|  |      */ | ||||||
|  |     public String getFigure() { | ||||||
|         return figure; |         return figure; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -180,7 +187,6 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|             earnMoney(2000); // Passing GO gives money |             earnMoney(2000); // Passing GO gives money | ||||||
|         } |         } | ||||||
|         fieldID = (fieldID + steps) % 40; |         fieldID = (fieldID + steps) % 40; | ||||||
|         figure.moveTo(fieldID); |  | ||||||
|         handler.getLogic().send(this, new PlayerStatusUpdate(handler)); |         handler.getLogic().send(this, new PlayerStatusUpdate(handler)); | ||||||
|         handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this); |         handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this); | ||||||
|         return fieldID; |         return fieldID; | ||||||
| @@ -194,7 +200,6 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|     public int setPosition(int position){ |     public int setPosition(int position){ | ||||||
|         if(position < 40 && position >= 0) { |         if(position < 40 && position >= 0) { | ||||||
|             fieldID = position; |             fieldID = position; | ||||||
|             figure.moveTo(fieldID); |  | ||||||
|             handler.getLogic().send(this, new PlayerStatusUpdate(handler)); |             handler.getLogic().send(this, new PlayerStatusUpdate(handler)); | ||||||
|             handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this); |             handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this); | ||||||
|         } |         } | ||||||
| @@ -212,7 +217,6 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|                 earnMoney(2000); |                 earnMoney(2000); | ||||||
|             } |             } | ||||||
|             fieldID = position; |             fieldID = position; | ||||||
|             figure.moveTo(fieldID); |  | ||||||
|             handler.getLogic().send(this, new PlayerStatusUpdate(handler)); |             handler.getLogic().send(this, new PlayerStatusUpdate(handler)); | ||||||
|             handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this); |             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; | ||||||
| import java.lang.System.Logger.Level; | import java.lang.System.Logger.Level; | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.List; |  | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
| import com.jme3.math.Vector3f; |  | ||||||
|  |  | ||||||
| import pp.monopoly.MonopolyConfig; | import pp.monopoly.MonopolyConfig; | ||||||
| import pp.monopoly.message.client.AlterProperty; | 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.TradeReply; | ||||||
| import pp.monopoly.message.server.TradeRequest; | import pp.monopoly.message.server.TradeRequest; | ||||||
| import pp.monopoly.message.server.ViewAssetsResponse; | 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.TradeHandler; | ||||||
| import pp.monopoly.model.card.DeckHelper; | import pp.monopoly.model.card.DeckHelper; | ||||||
| import pp.monopoly.model.fields.BoardManager; | import pp.monopoly.model.fields.BoardManager; | ||||||
| @@ -223,8 +219,7 @@ public class ServerGameLogic implements ClientInterpreter { | |||||||
|             String name = msg.getName(); |             String name = msg.getName(); | ||||||
|             String truc = name.length() > 10 ? name.substring(0, 15) : name; |             String truc = name.length() > 10 ? name.substring(0, 15) : name; | ||||||
|             player.setName(truc); |             player.setName(truc); | ||||||
|             Figure figure = new Figure(new Vector3f(0, 1, 0), Rotation.NORTH, msg.getFigure()); |             player.setFigure(msg.getFigure()); | ||||||
|             player.setFigure(figure); |  | ||||||
|             // board.addFigure(figure); |             // board.addFigure(figure); | ||||||
|             playerHandler.setPlayerReady(player, true);     |             playerHandler.setPlayerReady(player, true);     | ||||||
|             LOGGER.log(Level.DEBUG, "Player {0} is ready", player.getName()); |             LOGGER.log(Level.DEBUG, "Player {0} is ready", player.getName()); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user