diff --git a/war/src/main/java/com/tommytony/war/War.java b/war/src/main/java/com/tommytony/war/War.java index 7da01c0..02901e3 100644 --- a/war/src/main/java/com/tommytony/war/War.java +++ b/war/src/main/java/com/tommytony/war/War.java @@ -45,11 +45,11 @@ import com.tommytony.war.mapper.WarYmlMapper; import com.tommytony.war.mapper.WarzoneYmlMapper; import com.tommytony.war.spout.SpoutDisplayer; import com.tommytony.war.structure.WarHub; +import com.tommytony.war.structure.HubLobbyMaterials; import com.tommytony.war.structure.ZoneLobby; import com.tommytony.war.utility.ChatFixUtil; import com.tommytony.war.utility.PlayerState; import com.tommytony.war.utility.WarLogFormatter; -import com.tommytony.war.utility.WarhubMaterials; /** * Main class of War @@ -95,7 +95,7 @@ public class War extends JavaPlugin { private Logger warLogger; - private WarhubMaterials warhubMaterials; + private HubLobbyMaterials warhubMaterials = new HubLobbyMaterials(20, (byte)0, 5, (byte)0, 49, (byte)0, 89, (byte)0); // default floor glass, outline planks, gate obsidian, light glowstone public War() { super(); @@ -974,11 +974,11 @@ public class War extends JavaPlugin { return this.spoutMessenger ; } - public void setWarhubMaterials(WarhubMaterials warhubMaterials) { + public void setWarhubMaterials(HubLobbyMaterials warhubMaterials) { this.warhubMaterials = warhubMaterials; } - public WarhubMaterials getWarhubMaterials() { + public HubLobbyMaterials getWarhubMaterials() { return this.warhubMaterials; } } diff --git a/war/src/main/java/com/tommytony/war/Warzone.java b/war/src/main/java/com/tommytony/war/Warzone.java index 578f600..616ecdc 100644 --- a/war/src/main/java/com/tommytony/war/Warzone.java +++ b/war/src/main/java/com/tommytony/war/Warzone.java @@ -36,6 +36,7 @@ import com.tommytony.war.spout.SpoutDisplayer; import com.tommytony.war.structure.Bomb; import com.tommytony.war.structure.Cake; import com.tommytony.war.structure.Monument; +import com.tommytony.war.structure.HubLobbyMaterials; import com.tommytony.war.structure.ZoneLobby; import com.tommytony.war.structure.ZoneWallGuard; import com.tommytony.war.utility.LoadoutSelection; @@ -77,6 +78,8 @@ public class Warzone { private final TeamConfigBag teamDefaultConfig; private InventoryBag defaultInventories = new InventoryBag(); + private HubLobbyMaterials lobbyMaterials = null; + private boolean isEndOfGame = false; private boolean isReinitializing = false; private final Object gameEndLock = new Object(); @@ -87,6 +90,16 @@ public class Warzone { this.warzoneConfig = new WarzoneConfigBag(this); this.teamDefaultConfig = new TeamConfigBag(); // don't use ctor with Warzone, as this changes config resolution this.volume = new ZoneVolume(name, this.getWorld(), this); + this.lobbyMaterials = new HubLobbyMaterials( + War.war.getWarhubMaterials().getFloorId(), + War.war.getWarhubMaterials().getFloorData(), + War.war.getWarhubMaterials().getOutlineId(), + War.war.getWarhubMaterials().getOutlineData(), + War.war.getWarhubMaterials().getGateId(), + War.war.getWarhubMaterials().getGateData(), + War.war.getWarhubMaterials().getLightId(), + War.war.getWarhubMaterials().getLightData() + ); } public static Warzone getZoneByName(String name) { @@ -1386,4 +1399,12 @@ public class Warzone { this.name = newName; this.volume.setName(newName); } + + public HubLobbyMaterials getLobbyMaterials() { + return this.lobbyMaterials; + } + + public void setLobbyMaterials(HubLobbyMaterials lobbyMaterials) { + this.lobbyMaterials = lobbyMaterials; + } } diff --git a/war/src/main/java/com/tommytony/war/job/RestoreYmlWarhubJob.java b/war/src/main/java/com/tommytony/war/job/RestoreYmlWarhubJob.java index 15ea1d0..0ab1a8e 100644 --- a/war/src/main/java/com/tommytony/war/job/RestoreYmlWarhubJob.java +++ b/war/src/main/java/com/tommytony/war/job/RestoreYmlWarhubJob.java @@ -10,7 +10,7 @@ import com.tommytony.war.War; import com.tommytony.war.Warzone; import com.tommytony.war.mapper.VolumeMapper; import com.tommytony.war.structure.WarHub; -import com.tommytony.war.utility.WarhubMaterials; +import com.tommytony.war.structure.HubLobbyMaterials; import com.tommytony.war.volume.Volume; public class RestoreYmlWarhubJob implements Runnable { @@ -38,6 +38,14 @@ public class RestoreYmlWarhubJob implements Runnable { floorData = floorMaterialSection.getInt("data"); } + int outlineId = 5; // default planks + int outlineData = 0; + ConfigurationSection outlineMaterialSection = warhubConfig.getConfigurationSection("materials.outline"); + if (outlineMaterialSection != null) { + outlineId = outlineMaterialSection.getInt("id"); + outlineData = outlineMaterialSection.getInt("data"); + } + int gateId = 49; // default obsidian int gateData = 0; ConfigurationSection gateMaterialSection = warhubConfig.getConfigurationSection("materials.gate"); @@ -54,7 +62,7 @@ public class RestoreYmlWarhubJob implements Runnable { lightData = lightMaterialSection.getInt("data"); } - War.war.setWarhubMaterials(new WarhubMaterials(floorId, (byte)floorData, gateId, (byte)gateData, lightId, (byte)lightData)); + War.war.setWarhubMaterials(new HubLobbyMaterials(floorId, (byte)floorData, outlineId, (byte)outlineData, gateId, (byte)gateData, lightId, (byte)lightData)); World world = War.war.getServer().getWorld(worldName); if (world != null) { diff --git a/war/src/main/java/com/tommytony/war/mapper/WarYmlMapper.java b/war/src/main/java/com/tommytony/war/mapper/WarYmlMapper.java index 227b7db..6d8f9ba 100644 --- a/war/src/main/java/com/tommytony/war/mapper/WarYmlMapper.java +++ b/war/src/main/java/com/tommytony/war/mapper/WarYmlMapper.java @@ -171,6 +171,9 @@ public class WarYmlMapper { ConfigurationSection floorSection = hubConfigSection.createSection("materials.floor"); floorSection.set("id", War.war.getWarhubMaterials().getFloorId()); floorSection.set("data", War.war.getWarhubMaterials().getFloorData()); + ConfigurationSection outlineSection = hubConfigSection.createSection("materials.outline"); + outlineSection.set("id", War.war.getWarhubMaterials().getOutlineId()); + outlineSection.set("data", War.war.getWarhubMaterials().getOutlineData()); ConfigurationSection gateSection = hubConfigSection.createSection("materials.gate"); gateSection.set("id", War.war.getWarhubMaterials().getGateId()); gateSection.set("data", War.war.getWarhubMaterials().getGateData()); diff --git a/war/src/main/java/com/tommytony/war/mapper/WarzoneYmlMapper.java b/war/src/main/java/com/tommytony/war/mapper/WarzoneYmlMapper.java index 84508eb..adeb52b 100644 --- a/war/src/main/java/com/tommytony/war/mapper/WarzoneYmlMapper.java +++ b/war/src/main/java/com/tommytony/war/mapper/WarzoneYmlMapper.java @@ -22,6 +22,7 @@ import com.tommytony.war.config.TeamConfig; import com.tommytony.war.config.TeamKind; import com.tommytony.war.structure.Bomb; import com.tommytony.war.structure.Cake; +import com.tommytony.war.structure.HubLobbyMaterials; import com.tommytony.war.structure.Monument; import com.tommytony.war.structure.ZoneLobby; import com.tommytony.war.volume.Volume; @@ -296,6 +297,41 @@ public class WarzoneYmlMapper { lobbyFace = BlockFace.WEST; } + // lobby materials + int floorId = War.war.getWarhubMaterials().getFloorId(); // default warhub + int floorData = War.war.getWarhubMaterials().getFloorData(); + ConfigurationSection floorMaterialSection = warzoneRootSection.getConfigurationSection(lobbyPrefix + "materials.floor"); + if (floorMaterialSection != null) { + floorId = floorMaterialSection.getInt("id"); + floorData = floorMaterialSection.getInt("data"); + } + + int outlineId = War.war.getWarhubMaterials().getOutlineId(); + int outlineData = War.war.getWarhubMaterials().getOutlineData(); + ConfigurationSection outlineMaterialSection = warzoneRootSection.getConfigurationSection(lobbyPrefix + "materials.outline"); + if (outlineMaterialSection != null) { + outlineId = outlineMaterialSection.getInt("id"); + outlineData = outlineMaterialSection.getInt("data"); + } + + int gateId = War.war.getWarhubMaterials().getGateId(); + int gateData = War.war.getWarhubMaterials().getGateData();; + ConfigurationSection gateMaterialSection = warzoneRootSection.getConfigurationSection(lobbyPrefix + "materials.gate"); + if (gateMaterialSection != null) { + gateId = gateMaterialSection.getInt("id"); + gateData = gateMaterialSection.getInt("data"); + } + + int lightId = War.war.getWarhubMaterials().getLightId(); + int lightData = War.war.getWarhubMaterials().getLightData(); + ConfigurationSection lightMaterialSection = warzoneRootSection.getConfigurationSection(lobbyPrefix + "materials.light"); + if (lightMaterialSection != null) { + lightId = lightMaterialSection.getInt("id"); + lightData = lightMaterialSection.getInt("data"); + } + + warzone.setLobbyMaterials(new HubLobbyMaterials(floorId, (byte)floorData, outlineId, (byte)outlineData, gateId, (byte)gateData, lightId, (byte)lightData)); + // lobby world String lobbyWorldName = warzoneRootSection.getString(lobbyPrefix + "world"); World lobbyWorld = War.war.getServer().getWorld(lobbyWorldName); @@ -355,6 +391,19 @@ public class WarzoneYmlMapper { ConfigurationSection lobbySection = warzoneInfoSection.createSection("lobby"); lobbySection.set("orientation", lobbyOrientation); lobbySection.set("world", warzone.getLobby().getVolume().getWorld().getName()); + + ConfigurationSection floorSection = lobbySection.createSection("materials.floor"); + floorSection.set("id", warzone.getLobbyMaterials().getFloorId()); + floorSection.set("data", warzone.getLobbyMaterials().getFloorData()); + ConfigurationSection outlineSection = lobbySection.createSection("materials.outline"); + outlineSection.set("id", warzone.getLobbyMaterials().getOutlineId()); + outlineSection.set("data", warzone.getLobbyMaterials().getOutlineData()); + ConfigurationSection gateSection = lobbySection.createSection("materials.gate"); + gateSection.set("id", warzone.getLobbyMaterials().getGateId()); + gateSection.set("data", warzone.getLobbyMaterials().getGateData()); + ConfigurationSection lightSection = lobbySection.createSection("materials.light"); + lightSection.set("id", warzone.getLobbyMaterials().getLightId()); + lightSection.set("data", warzone.getLobbyMaterials().getLightData()); } // rallyPoint diff --git a/war/src/main/java/com/tommytony/war/utility/WarhubMaterials.java b/war/src/main/java/com/tommytony/war/structure/HubLobbyMaterials.java similarity index 59% rename from war/src/main/java/com/tommytony/war/utility/WarhubMaterials.java rename to war/src/main/java/com/tommytony/war/structure/HubLobbyMaterials.java index 0839968..2bb4323 100644 --- a/war/src/main/java/com/tommytony/war/utility/WarhubMaterials.java +++ b/war/src/main/java/com/tommytony/war/structure/HubLobbyMaterials.java @@ -1,18 +1,23 @@ -package com.tommytony.war.utility; +package com.tommytony.war.structure; -public class WarhubMaterials { +public class HubLobbyMaterials { private final int floorId; private final byte floorData; + private final int outlineId; + private final byte outlineData; + private final int gateId; private final byte gateData; private final int lightId; private final byte lightData; - public WarhubMaterials(int floorId, byte floorData, int gateId, byte gateData, int lightId, byte lightData) { + public HubLobbyMaterials(int floorId, byte floorData, int outlineId, byte outlineData, int gateId, byte gateData, int lightId, byte lightData) { this.floorId = floorId; this.floorData = floorData; + this.outlineId = outlineId; + this.outlineData = outlineData; this.gateId = gateId; this.gateData = gateData; this.lightId = lightId; @@ -42,5 +47,13 @@ public class WarhubMaterials { public byte getLightData() { return lightData; } + + public int getOutlineId() { + return outlineId; + } + + public byte getOutlineData() { + return outlineData; + } } diff --git a/war/src/main/java/com/tommytony/war/structure/WarHub.java b/war/src/main/java/com/tommytony/war/structure/WarHub.java index 7dd5fc5..bfd24fe 100644 --- a/war/src/main/java/com/tommytony/war/structure/WarHub.java +++ b/war/src/main/java/com/tommytony/war/structure/WarHub.java @@ -157,6 +157,8 @@ public class WarHub { // materials Material floor = Material.getMaterial(War.war.getWarhubMaterials().getFloorId()); byte floorData = War.war.getWarhubMaterials().getFloorData(); + Material outline = Material.getMaterial(War.war.getWarhubMaterials().getOutlineId()); + byte outlineData = War.war.getWarhubMaterials().getOutlineData(); Material gate = Material.getMaterial(War.war.getWarhubMaterials().getGateId()); byte gateData = War.war.getWarhubMaterials().getGateData(); Material light = Material.getMaterial(War.war.getWarhubMaterials().getLightId()); @@ -169,6 +171,11 @@ public class WarHub { this.volume.setFaceMaterial(BlockFace.DOWN, floor, floorData); } + if (!outline.equals(Material.AIR)) { + // If air, leave original blocks. + this.volume.setFloorOutlineMaterial(outline, outlineData); + } + // draw gates Block currentGateBlock = BlockInfo.getBlock(this.location.getWorld(), this.volume.getCornerOne()).getRelative(BlockFace.UP).getRelative(front, hubDepth).getRelative(right, 2); diff --git a/war/src/main/java/com/tommytony/war/structure/ZoneLobby.java b/war/src/main/java/com/tommytony/war/structure/ZoneLobby.java index fb870dd..e3e490b 100644 --- a/war/src/main/java/com/tommytony/war/structure/ZoneLobby.java +++ b/war/src/main/java/com/tommytony/war/structure/ZoneLobby.java @@ -276,13 +276,37 @@ public class ZoneLobby { this.setGatePositions(BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock)); // flatten the area (set all but floor to air, then replace any floor air blocks with glass) this.volume.clearBlocksThatDontFloat(); - this.volume.setToMaterial(Material.AIR); - this.volume.setFaceMaterial(BlockFace.DOWN, Material.GLASS, (byte)0); // beautiful + + Volume withoutFloor = new Volume(this.volume.getName() + "-nofloor", this.volume.getWorld()); + withoutFloor.setCornerOne(new BlockInfo(this.volume.getCornerOne().getX(), + this.volume.getCornerOne().getY(), + this.volume.getCornerOne().getZ(), + this.volume.getCornerOne().getTypeId(), + this.volume.getCornerOne().getData())); + withoutFloor.setCornerOne(this.volume.getCornerTwo()); + withoutFloor.setToMaterial(Material.AIR); + + Material floor = Material.getMaterial(warzone.getLobbyMaterials().getFloorId()); + byte floorData = warzone.getLobbyMaterials().getFloorData(); + Material outline = Material.getMaterial(warzone.getLobbyMaterials().getOutlineId()); + byte outlineData = warzone.getLobbyMaterials().getOutlineData(); + Material gate = Material.getMaterial(warzone.getLobbyMaterials().getGateId()); + byte gateData = warzone.getLobbyMaterials().getGateData(); + + if (!floor.equals(Material.AIR)) { + // If air, leave original blocks. + this.volume.setFaceMaterial(BlockFace.DOWN, floor, floorData); + } + + if (!outline.equals(Material.AIR)) { + // If air, leave original blocks. + this.volume.setFloorOutlineMaterial(outline, outlineData); + } // add war hub link gate if (War.war.getWarHub() != null) { Block linkGateBlock = BlockInfo.getBlock(this.volume.getWorld(), this.warHubLinkGate); - this.placeGate(linkGateBlock, Material.OBSIDIAN); + this.placeGate(linkGateBlock, gate, gateData); // add warhub sign String[] lines = new String[4]; lines[0] = ""; @@ -341,12 +365,22 @@ public class ZoneLobby { SignHelper.setToSign(War.war, zoneSignBlock, data, lines); // lets get some light in here + Material light = Material.getMaterial(this.warzone.getLobbyMaterials().getLightId()); + byte lightData = this.warzone.getLobbyMaterials().getLightData(); if (this.wall == BlockFace.NORTH || this.wall == BlockFace.SOUTH) { - BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock).getRelative(BlockFace.DOWN).getRelative(BlockFace.WEST, this.lobbyHalfSide - 1).getRelative(this.wall, 9).setType(Material.GLOWSTONE); - BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock).getRelative(BlockFace.DOWN).getRelative(BlockFace.EAST, this.lobbyHalfSide - 1).getRelative(this.wall, 9).setType(Material.GLOWSTONE); + Block one = BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock).getRelative(BlockFace.DOWN).getRelative(BlockFace.WEST, this.lobbyHalfSide - 1).getRelative(this.wall, 9); + one.setType(light); + one.setData(lightData); + Block two = BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock).getRelative(BlockFace.DOWN).getRelative(BlockFace.EAST, this.lobbyHalfSide - 1).getRelative(this.wall, 9); + two.setType(light); + two.setData(lightData); } else { - BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock).getRelative(BlockFace.DOWN).getRelative(BlockFace.NORTH, this.lobbyHalfSide - 1).getRelative(this.wall, 9).setType(Material.GLOWSTONE); - BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock).getRelative(BlockFace.DOWN).getRelative(BlockFace.SOUTH, this.lobbyHalfSide - 1).getRelative(this.wall, 9).setType(Material.GLOWSTONE); + Block one = BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock).getRelative(BlockFace.DOWN).getRelative(BlockFace.NORTH, this.lobbyHalfSide - 1).getRelative(this.wall, 9); + one.setType(light); + one.setData(lightData); + Block two = BlockInfo.getBlock(this.volume.getWorld(), this.lobbyMiddleWallBlock).getRelative(BlockFace.DOWN).getRelative(BlockFace.SOUTH, this.lobbyHalfSide - 1).getRelative(this.wall, 9); + two.setType(light); + two.setData(lightData); } } else { War.war.log("Failed to initalize zone lobby for zone " + this.warzone.getName(), java.util.logging.Level.WARNING); @@ -416,7 +450,8 @@ public class ZoneLobby { leftSide = BlockFace.NORTH; rightSide = BlockFace.SOUTH; } - block.getRelative(BlockFace.DOWN).setType(Material.GLOWSTONE); + block.getRelative(BlockFace.DOWN).setType(Material.getMaterial(this.warzone.getLobbyMaterials().getLightId())); + block.getRelative(BlockFace.DOWN).setData(this.warzone.getLobbyMaterials().getLightData()); this.setBlock(block.getRelative(leftSide), teamKind); this.setBlock(block.getRelative(rightSide).getRelative(BlockFace.UP), teamKind); this.setBlock(block.getRelative(leftSide).getRelative(BlockFace.UP).getRelative(BlockFace.UP), teamKind); @@ -427,7 +462,7 @@ public class ZoneLobby { } } - private void placeGate(Block block, Material material) { + private void placeGate(Block block, Material material, byte data) { if (block != null) { BlockFace leftSide = null; // look at the zone BlockFace rightSide = null; @@ -444,14 +479,15 @@ public class ZoneLobby { leftSide = BlockFace.NORTH; rightSide = BlockFace.SOUTH; } - block.getRelative(BlockFace.DOWN).setType(Material.GLOWSTONE); - this.setBlock(block.getRelative(leftSide), material); - this.setBlock(block.getRelative(rightSide).getRelative(BlockFace.UP), material); - this.setBlock(block.getRelative(leftSide).getRelative(BlockFace.UP).getRelative(BlockFace.UP), material); - this.setBlock(block.getRelative(rightSide), material); - this.setBlock(block.getRelative(leftSide).getRelative(BlockFace.UP), material); - this.setBlock(block.getRelative(rightSide).getRelative(BlockFace.UP).getRelative(BlockFace.UP), material); - this.setBlock(block.getRelative(BlockFace.UP).getRelative(BlockFace.UP), material); + block.getRelative(BlockFace.DOWN).setType(Material.getMaterial(this.warzone.getLobbyMaterials().getLightId())); + block.getRelative(BlockFace.DOWN).setData(this.warzone.getLobbyMaterials().getLightData()); + this.setBlock(block.getRelative(leftSide), material, data); + this.setBlock(block.getRelative(rightSide).getRelative(BlockFace.UP), material, data); + this.setBlock(block.getRelative(leftSide).getRelative(BlockFace.UP).getRelative(BlockFace.UP), material, data); + this.setBlock(block.getRelative(rightSide), material, data); + this.setBlock(block.getRelative(leftSide).getRelative(BlockFace.UP), material, data); + this.setBlock(block.getRelative(rightSide).getRelative(BlockFace.UP).getRelative(BlockFace.UP), material, data); + this.setBlock(block.getRelative(BlockFace.UP).getRelative(BlockFace.UP), material, data); } } @@ -460,8 +496,9 @@ public class ZoneLobby { block.setData(kind.getData()); } - private void setBlock(Block block, Material material) { + private void setBlock(Block block, Material material, byte data) { block.setType(material); + block.setData(data); } private void placeAutoAssignGate() { @@ -484,7 +521,9 @@ public class ZoneLobby { List teams = this.warzone.getTeams(); Block autoAssignGateBlock = BlockInfo.getBlock(this.volume.getWorld(), this.autoAssignGate); - this.setBlock(autoAssignGateBlock.getRelative(BlockFace.DOWN), (Material.GLOWSTONE)); + this.setBlock(autoAssignGateBlock.getRelative(BlockFace.DOWN), + Material.getMaterial(this.warzone.getLobbyMaterials().getLightId()), + this.warzone.getLobbyMaterials().getLightData()); int size = teams.size(); if (size > 0) { TeamKind[] doorBlockKinds = new TeamKind[7]; diff --git a/war/src/main/java/com/tommytony/war/volume/Volume.java b/war/src/main/java/com/tommytony/war/volume/Volume.java index 5024f4c..e51015d 100644 --- a/war/src/main/java/com/tommytony/war/volume/Volume.java +++ b/war/src/main/java/com/tommytony/war/volume/Volume.java @@ -473,6 +473,28 @@ public class Volume { War.war.log("Failed to set block to " + material + "in volume " + this.name + "." + e.getClass().toString() + " " + e.getMessage(), Level.WARNING); } } + + public void setFloorOutlineMaterial(Material outline, byte outlineData) { + try { + if (this.hasTwoCorners() && this.isSaved()) { + int x = this.getMinX(); + for (int i = 0; i < this.getSizeX(); i++) { + int z = this.getMinZ(); + for (int k = 0; k < this.getSizeZ(); k++) { + if (x == this.getMinX() || x == this.getMaxX() || z == this.getMinZ() || z == this.getMaxZ()) { + Block currentBlock = this.getWorld().getBlockAt(x, this.getMinY(), z); + currentBlock.setType(outline); + currentBlock.setData(outlineData); + } + z++; + } + x++; + } + } + } catch (Exception e) { + War.war.log("Failed to set floor ouline block to " + outline + "in volume " + this.name + "." + e.getClass().toString() + " " + e.getMessage(), Level.WARNING); + } + } private void switchMaterials(Material[] oldTypes, Material newType) { try {