Browse Source

Reworking geometrie/area calculation

RedstoneFuture 2 năm trước cách đây
mục cha
commit
d214c02868

+ 5 - 9
missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/Lobby.java

@@ -49,7 +49,7 @@ public class Lobby {
     private String name = "lobby0";
     @SerializedName("display_name") private String displayName = "&eDefault game";
     @SerializedName("auto_load") private boolean autoLoad = true;
-    @SerializedName("world") private String world = getDefaultWorld().getName();
+    @SerializedName("world") private String worldName = getDefaultWorld().getName();
     @SerializedName("lobby_time") private int lobbyTime = 60;
     @SerializedName("join_ongoing_game") private boolean joinOngoingGame = false;
     @SerializedName("min_size") private int minSize = 2;
@@ -60,19 +60,19 @@ public class Lobby {
     @SerializedName("team2_color") private String team2Color = "&a";
     @Setter @SerializedName("spawn_point") private Location spawnPoint = getDefaultWorld().getSpawnLocation();
     @Setter @SerializedName("after_game_spawn") private Location afterGameSpawn = getDefaultWorld().getSpawnLocation();
-    @SerializedName("area") private AreaConfiguration areaConfig = new AreaConfiguration(-30, 0, -72, 30, 256, 72);
+    @Setter @SerializedName("area") private AreaConfiguration areaConfig = new AreaConfiguration(-30, 0, -72, 30, 256, 72);
     @SerializedName("map_choose_procedure") private MapChooseProcedure mapChooseProcedure = MapChooseProcedure.FIRST;
     @SerializedName("possible_arenas") private List<String> possibleArenas = new ArrayList<>() {{
         add("arena0");
     }};
-    private transient GameArea gameArea = new GameArea(Bukkit.getWorld(world), areaConfig);
 
+    @Setter private transient GameArea area;
     @Setter private transient File file;
 
     public World getBukkitWorld() {
-        World world = Bukkit.getWorld(getWorld());
+        World world = Bukkit.getWorld(getWorldName());
         if (world == null) {
-            Logger.ERROR.log("Could not find any world with the name: " + this.world);
+            Logger.ERROR.log("Could not find any world with the name: " + this.worldName);
             Logger.ERROR.log("Please correct this in the configuration of lobby \"" + name + "\"");
         }
         return world;
@@ -107,8 +107,4 @@ public class Lobby {
             throw new RuntimeException(e);
         }
     }
-
-    public GameArea getArea() {
-        return gameArea;
-    }
 }

+ 0 - 83
missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/arena/AreaArenaConfiguration.java

@@ -1,83 +0,0 @@
-/*
- * This file is part of MissileWars (https://github.com/Butzlabben/missilewars).
- * Copyright (c) 2018-2021 Daniel Nägele.
- *
- * MissileWars is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MissileWars is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with MissileWars.  If not, see <https://www.gnu.org/licenses/>.
- */
-
-package de.butzlabben.missilewars.configuration.arena;
-
-import com.google.gson.annotations.SerializedName;
-import de.butzlabben.missilewars.game.GameWorld;
-import de.butzlabben.missilewars.util.geometry.ImprovedArea;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.ToString;
-import org.bukkit.Location;
-import org.bukkit.World;
-
-@Getter
-@ToString
-@RequiredArgsConstructor
-public class AreaArenaConfiguration {
-    
-    @SerializedName("min_x") private int minX = -50;
-    @SerializedName("min_y") private int minY = 0;
-    @SerializedName("min_z") private int minZ = -50;
-    @SerializedName("max_x") private int maxX = 50;
-    @SerializedName("max_y") private int maxY = 256;
-    @SerializedName("max_z") private int maxZ = 50;
-
-/*    public AreaArenaConfiguration(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) {
-        this.minX = minX;
-        this.minY = minY;
-        this.minZ = minZ;
-        this.maxX = maxX;
-        this.maxY = maxY;
-        this.maxZ = maxZ;
-    }
-
-    public static AreaArenaConfiguration deserialize(Map<String, Object> serialized) {
-        int minX = (int) serialized.get("min_x");
-        int minY = (int) serialized.get("min_y");
-        int minZ = (int) serialized.get("min_z");
-
-        int maxX = (int) serialized.get("max_x");
-        int maxY = (int) serialized.get("max_y");
-        int maxZ = (int) serialized.get("max_z");
-        return new AreaArenaConfiguration(minX, minY, minZ, maxX, maxY, maxZ);
-    }
-    
-    @Override
-    public Map<String, Object> serialize() {
-        Map<String, Object> serialized = new HashMap<>();
-        serialized.put("min_x", minX);
-        serialized.put("min_y", minY);
-        serialized.put("min_z", minZ);
-        serialized.put("max_x", maxX);
-        serialized.put("max_y", maxY);
-        serialized.put("max_z", maxZ);
-        return serialized;
-    }*/
-    
-    public ImprovedArea getArea(GameWorld gameWorld) {
-        World world = gameWorld.getWorld();
-        
-        Location pos1 = new Location(world, minX, minY, minZ);
-        Location pos2 = new Location(world, maxX, maxY, maxZ);
-        
-        return new ImprovedArea(pos1, pos2);
-    }
-    
-}

+ 56 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/arena/AreaConfiguration.java

@@ -0,0 +1,56 @@
+/*
+ * This file is part of MissileWars (https://github.com/Butzlabben/missilewars).
+ * Copyright (c) 2018-2021 Daniel Nägele.
+ *
+ * MissileWars is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MissileWars is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MissileWars.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package de.butzlabben.missilewars.configuration.arena;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.ToString;
+import org.bukkit.configuration.serialization.ConfigurationSerializable;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Getter
+@ToString
+@AllArgsConstructor
+public class AreaConfiguration implements ConfigurationSerializable {
+
+    @SerializedName("min_x") private int minX;
+    @SerializedName("min_y") private int minY;
+    @SerializedName("min_z") private int minZ;
+    @SerializedName("max_x") private int maxX;
+    @SerializedName("max_y") private int maxY;
+    @SerializedName("max_z") private int maxZ;
+
+    /**
+     * This method is used to save the config entries in the config file.
+     */
+    @Override
+    public Map<String, Object> serialize() {
+        Map<String, Object> serialized = new HashMap<>();
+        serialized.put("min_x", minX);
+        serialized.put("min_y", minY);
+        serialized.put("min_z", minZ);
+        serialized.put("max_x", maxX);
+        serialized.put("max_y", maxY);
+        serialized.put("max_z", maxZ);
+        return serialized;
+    }
+}

+ 3 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/arena/Arena.java

@@ -19,6 +19,7 @@
 package de.butzlabben.missilewars.configuration.arena;
 
 import com.google.gson.annotations.SerializedName;
+import de.butzlabben.missilewars.util.geometry.GameArea;
 import de.butzlabben.missilewars.util.serialization.Serializer;
 import lombok.Getter;
 import lombok.Setter;
@@ -53,7 +54,7 @@ public class Arena implements Cloneable {
     @SerializedName("money") private MoneyConfiguration money = new MoneyConfiguration();
     @SerializedName("equipment_interval") private EquipmentIntervalConfiguration interval = new EquipmentIntervalConfiguration();
     @SerializedName("missile") private MissileConfiguration missileConfiguration = new MissileConfiguration();
-    @SerializedName("area") private AreaConfiguration areaConfig = new AreaConfiguration(-30, 0, -72, 30, 256, 72);
+    @Setter @SerializedName("area") private AreaConfiguration areaConfig = new AreaConfiguration(-30, 0, -72, 30, 256, 72);
 
     @SerializedName("spectator_spawn")
     @Setter
@@ -67,6 +68,7 @@ public class Arena implements Cloneable {
     @Setter
     private Location team2Spawn = new Location(null, 0.5, 100, -45.5, 0, 0);
 
+    @Setter private transient GameArea area;
     @Setter private transient File file;
 
     public Arena() {

+ 2 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/GameManager.java

@@ -22,6 +22,7 @@ import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.configuration.Config;
 import de.butzlabben.missilewars.configuration.Lobby;
+import de.butzlabben.missilewars.util.geometry.GameArea;
 import de.butzlabben.missilewars.util.serialization.Serializer;
 import lombok.Getter;
 import org.bukkit.Bukkit;
@@ -150,6 +151,7 @@ public class GameManager {
         try {
             Lobby lobby = Serializer.deserialize(targetLobby.getFile(), Lobby.class);
             lobby.setFile(targetLobby.getFile());
+            lobby.setArea(new GameArea(lobby.getBukkitWorld(), lobby.getAreaConfig()));
             lobby.updateConfig();
 
             Logger.BOOTDONE.log("Reloaded lobby \"" + targetLobbyName + "\" (" + targetLobby.getFile().getName() + ")");

+ 20 - 45
missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/geometry/GameArea.java

@@ -19,19 +19,19 @@
 package de.butzlabben.missilewars.util.geometry;
 
 import de.butzlabben.missilewars.configuration.arena.AreaConfiguration;
+import lombok.Getter;
+import lombok.Setter;
 import org.bukkit.Location;
 import org.bukkit.World;
 
+@Getter
 public class GameArea {
 
-    final World world;
+    private World world;
+    @Setter private Location position1, position2;
 
-    final Location position1, position2;
-
-    long minX, minY, minZ;
-
-    long maxX, maxY, maxZ;
-    Direction direction;
+    private int minX, minY, minZ;
+    private int maxX, maxY, maxZ;
 
     public GameArea(Location pos1, Location pos2) {
         
@@ -84,57 +84,32 @@ public class GameArea {
         if (position1.getBlockX() < position2.getBlockX()) {
             minX = position1.getBlockX();
             maxX = position2.getBlockX();
+        } else {
+            maxX = position1.getBlockX();
+            minX = position2.getBlockX();
         }
 
         if (position1.getBlockY() < position2.getBlockY()) {
             minY = position1.getBlockY();
             maxY = position2.getBlockY();
+        } else {
+            maxY = position1.getBlockY();
+            minY = position2.getBlockY();
         }
 
         if (position1.getBlockZ() < position2.getBlockZ()) {
             minZ = position1.getBlockZ();
             maxZ = position2.getBlockZ();
+        } else {
+            maxZ = position1.getBlockZ();
+            minZ = position2.getBlockZ();
         }
     }
 
-    public World getWorld() {
-        return world;
-    }
-
-    public Location getPosition1() {
-        return position1;
-    }
-
-    public Location getPosition2() {
-        return position2;
-    }
-
-    public Direction getDirection() {
-        return direction;
-    }
-
-    public long getMinX() {
-        return minX;
-    }
-
-    public long getMinY() {
-        return minY;
-    }
-
-    public long getMinZ() {
-        return minZ;
-    }
-
-    public long getMaxX() {
-        return maxX;
-    }
-
-    public long getMaxY() {
-        return maxY;
-    }
-
-    public long getMaxZ() {
-        return maxZ;
+    public AreaConfiguration getAreaConfiguration() {
+        AreaConfiguration newAreaConfig = new AreaConfiguration(position1.getBlockX(), position1.getBlockY(), position1.getBlockZ(), 
+                position2.getBlockX(), position2.getBlockY(), position2.getBlockZ());
+        return newAreaConfig;
     }
 
     private enum Direction {

+ 7 - 7
missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/geometry/Geometry.java

@@ -48,16 +48,16 @@ public class Geometry {
      */
     public static boolean isInsideIn(Location targetLocation, GameArea area) {
 
-        if (!Geometry.bothLocInSameWorld(targetLocation, area.position1)) return false;
+        if (!Geometry.bothLocInSameWorld(targetLocation, area.getPosition1())) return false;
 
-        if (targetLocation.getBlockX() > area.maxX) return false;
-        if (targetLocation.getBlockX() < area.minX) return false;
+        if (targetLocation.getBlockX() > area.getMaxX()) return false;
+        if (targetLocation.getBlockX() < area.getMinX()) return false;
 
-        if (targetLocation.getBlockY() > area.maxY) return false;
-        if (targetLocation.getBlockY() < area.minY) return false;
+        if (targetLocation.getBlockY() > area.getMaxY()) return false;
+        if (targetLocation.getBlockY() < area.getMinY()) return false;
 
-        if (targetLocation.getBlockZ() > area.maxZ) return false;
-        if (targetLocation.getBlockZ() < area.minZ) return false;
+        if (targetLocation.getBlockZ() > area.getMaxZ()) return false;
+        if (targetLocation.getBlockZ() < area.getMinZ()) return false;
 
         return true;
     }