From ce5cbf9969711528f2ef4a68817c1dbaca8502d6 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 23 Mar 2021 16:42:45 +0100 Subject: [PATCH] Adding skip, techhider improvements... Signed-off-by: Lixfel --- .../fightsystem/fight/FightTeam_14.java | 47 ++++++++- .../fightsystem/utils/TechHider_14.java | 15 ++- .../fightsystem/utils/TechHider_15.java | 15 ++- .../fightsystem/fight/FightTeam_8.java | 50 ++++++++-- .../src/de/steamwar/fightsystem/Config.java | 98 +++++++++---------- .../de/steamwar/fightsystem/IFightSystem.java | 18 ---- .../de/steamwar/fightsystem/utils/Region.java | 5 +- .../de/steamwar/fightsystem/FightSystem.java | 27 +++-- .../fightsystem/commands/Commands.java | 8 ++ .../de/steamwar/fightsystem/commands/GUI.java | 14 +++ .../fightsystem/commands/SkipCommand.java | 27 +++++ .../fightsystem/commands/StateCommand.java | 26 +++++ .../fightsystem/countdown/Countdown.java | 25 +++++ .../fightsystem/fight/FightSchematic.java | 6 +- .../steamwar/fightsystem/fight/FightTeam.java | 21 +++- .../fightsystem/listener/EventJoin.java | 51 ++++++---- .../fightsystem/listener/PrepareSchem.java | 42 +++++++- .../fightsystem/listener/TeamArea.java | 2 +- .../fightsystem/listener/WaterRemover.java | 2 +- .../states/OneShotStateDependent.java | 25 +++++ .../steamwar/fightsystem/utils/TechHider.java | 35 +++++++ .../winconditions/WinconditionTimeTechKO.java | 2 +- FightSystem_Main/src/plugin.yml | 4 +- 23 files changed, 442 insertions(+), 123 deletions(-) create mode 100644 FightSystem_Main/src/de/steamwar/fightsystem/commands/SkipCommand.java create mode 100644 FightSystem_Main/src/de/steamwar/fightsystem/commands/StateCommand.java create mode 100644 FightSystem_Main/src/de/steamwar/fightsystem/states/OneShotStateDependent.java diff --git a/FightSystem_14/src/de/steamwar/fightsystem/fight/FightTeam_14.java b/FightSystem_14/src/de/steamwar/fightsystem/fight/FightTeam_14.java index 867a0f6..46d9c9d 100644 --- a/FightSystem_14/src/de/steamwar/fightsystem/fight/FightTeam_14.java +++ b/FightSystem_14/src/de/steamwar/fightsystem/fight/FightTeam_14.java @@ -22,8 +22,13 @@ package de.steamwar.fightsystem.fight; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; +import com.sk89q.worldedit.function.operation.ForwardExtentCopy; import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.transform.AffineTransform; @@ -39,14 +44,17 @@ import de.steamwar.sql.Schematic; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.scoreboard.Team; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Collections; import java.util.Objects; import java.util.Set; -class FightTeam_14 { +public class FightTeam_14 { private FightTeam_14(){} private static final Set WOOL_SET = Collections.singleton(Objects.requireNonNull(BlockTypes.PINK_WOOL).getDefaultState().toBaseBlock()); @@ -78,8 +86,8 @@ class FightTeam_14 { e.flushSession(); } - static EditSession pasteSchematic(Clipboard clipboard, int pX, int pY, int pZ, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException { - BlockVector3 paste = BlockVector3.at(pX, pY, pZ); + static EditSession pasteSchematic(Clipboard clipboard, Region region, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException { + BlockVector3 paste = BlockVector3.at(region.centerX(), region.getMinY(), region.centerZ()); World w = new BukkitWorld(Bukkit.getWorlds().get(0)); BlockVector3 dimensions = clipboard.getDimensions(); @@ -93,7 +101,7 @@ class FightTeam_14 { v = paste.subtract(dimensions.getX()/2, 0, dimensions.getZ()/2).subtract(offset); } - if(Config.AlignWater){ + if(Config.WaterDepth != 0){ BlockVector3 it = clipboard.getMinimumPoint(); int depth = 0; while(!clipboard.getBlock(it).getBlockType().getMaterial().isAir()){ @@ -110,4 +118,35 @@ class FightTeam_14 { e.flushSession(); return e; } + + public static boolean checkPistonMoving(Block block){ + return block.getType() == Material.MOVING_PISTON; + } + + public static void saveSchem(Schematic schem, Region region) { + World w = new BukkitWorld(Bukkit.getWorlds().get(0)); + BlockVector3 min = BlockVector3.at(region.getMinX(), region.getMinY(), region.getMinZ()); + CuboidRegion cuboidRegion = new CuboidRegion(w, min, BlockVector3.at(region.getMaxX(), region.getMaxY(), region.getMaxZ())); + BlockArrayClipboard clipboard = new BlockArrayClipboard(cuboidRegion); + EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); + + ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy(editSession, cuboidRegion, clipboard, min); + forwardExtentCopy.setCopyingEntities(false); + try{ + Operations.complete(forwardExtentCopy); + }catch(WorldEditException e){ + throw new IllegalStateException(e); + } + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try { + ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(outputStream); + writer.write(clipboard); + writer.close(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + schem.saveFromBytes(outputStream.toByteArray(), true); + } } diff --git a/FightSystem_14/src/de/steamwar/fightsystem/utils/TechHider_14.java b/FightSystem_14/src/de/steamwar/fightsystem/utils/TechHider_14.java index fa86a3f..39546ec 100644 --- a/FightSystem_14/src/de/steamwar/fightsystem/utils/TechHider_14.java +++ b/FightSystem_14/src/de/steamwar/fightsystem/utils/TechHider_14.java @@ -30,10 +30,7 @@ import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.IFightSystem; import io.netty.buffer.ByteBuf; import io.netty.buffer.UnpooledByteBufAllocator; -import net.minecraft.server.v1_14_R1.Block; -import net.minecraft.server.v1_14_R1.IBlockData; -import net.minecraft.server.v1_14_R1.IRegistry; -import net.minecraft.server.v1_14_R1.MinecraftKey; +import net.minecraft.server.v1_14_R1.*; import org.bukkit.entity.Player; import java.nio.ByteBuffer; @@ -54,6 +51,16 @@ public class TechHider_14 { hiddenBlockIds.add(Block.getCombinedId(data)); } } + + if(Config.HiddenBlocks.contains("water")){ + Fluid water = FluidTypes.WATER.a(false); + for(IBlockData data : Block.REGISTRY_ID){ + if(data.p() == water){ + hiddenBlockIds.add(Block.getCombinedId(data)); + } + } + } + return hiddenBlockIds; } diff --git a/FightSystem_15/src/de/steamwar/fightsystem/utils/TechHider_15.java b/FightSystem_15/src/de/steamwar/fightsystem/utils/TechHider_15.java index dabe7a4..e5d5e03 100644 --- a/FightSystem_15/src/de/steamwar/fightsystem/utils/TechHider_15.java +++ b/FightSystem_15/src/de/steamwar/fightsystem/utils/TechHider_15.java @@ -20,10 +20,7 @@ package de.steamwar.fightsystem.utils; import de.steamwar.fightsystem.Config; -import net.minecraft.server.v1_15_R1.Block; -import net.minecraft.server.v1_15_R1.IBlockData; -import net.minecraft.server.v1_15_R1.IRegistry; -import net.minecraft.server.v1_15_R1.MinecraftKey; +import net.minecraft.server.v1_15_R1.*; import java.util.HashSet; import java.util.Set; @@ -38,6 +35,16 @@ class TechHider_15 { hiddenBlockIds.add(Block.getCombinedId(data)); } } + + if(Config.HiddenBlocks.contains("water")){ + Fluid water = FluidTypes.WATER.a(false); + for(IBlockData data : Block.REGISTRY_ID){ + if(data.getFluid() == water){ + hiddenBlockIds.add(Block.getCombinedId(data)); + } + } + } + return hiddenBlockIds; } diff --git a/FightSystem_8/src/de/steamwar/fightsystem/fight/FightTeam_8.java b/FightSystem_8/src/de/steamwar/fightsystem/fight/FightTeam_8.java index 26aceec..83655e6 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/fight/FightTeam_8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/fight/FightTeam_8.java @@ -19,13 +19,14 @@ package de.steamwar.fightsystem.fight; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.MaxChangedBlocksException; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.*; import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; +import com.sk89q.worldedit.function.operation.ForwardExtentCopy; import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.math.transform.AffineTransform; import com.sk89q.worldedit.regions.CuboidRegion; @@ -39,13 +40,15 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.DyeColor; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.scoreboard.Team; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Collections; import java.util.Set; -class FightTeam_8 { +public class FightTeam_8 { private FightTeam_8(){} @SuppressWarnings("deprecation") @@ -87,10 +90,10 @@ class FightTeam_8 { e.flushQueue(); } - static EditSession pasteSchematic(Clipboard clipboard, int pasteX, int pasteY, int pasteZ, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException { + static EditSession pasteSchematic(Clipboard clipboard, Region paste, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException { World w = new BukkitWorld(Bukkit.getWorlds().get(0)); Vector dimensions = clipboard.getDimensions(); - Vector v = new Vector(pasteX, pasteY, pasteZ); + Vector v = new Vector(paste.centerX(), paste.getMinY(), paste.centerZ()); Vector offset = clipboard.getMinimumPoint().subtract(clipboard.getOrigin()); AffineTransform aT = new AffineTransform(); if(rotate){ @@ -100,7 +103,7 @@ class FightTeam_8 { v = v.subtract(dimensions.getX()/2 - dimensions.getX()%2, 0, dimensions.getZ()/2 - dimensions.getZ()%2).subtract(offset); } - if(Config.AlignWater){ + if(Config.WaterDepth != 0){ Vector it = clipboard.getMinimumPoint(); int depth = 0; while(!clipboard.getBlock(it).isAir()){ @@ -117,4 +120,35 @@ class FightTeam_8 { e.flushQueue(); return e; } + + public static boolean checkPistonMoving(Block block){ + return block.getType() == Material.PISTON_MOVING_PIECE; + } + + public static void saveSchem(Schematic schem, Region region) { + World w = new BukkitWorld(Bukkit.getWorlds().get(0)); + Vector min = new Vector(region.getMinX(), region.getMinY(), region.getMinZ()); + CuboidRegion cuboidRegion = new CuboidRegion(w, min, new Vector(region.getMaxX(), region.getMaxY(), region.getMaxZ())); + BlockArrayClipboard clipboard = new BlockArrayClipboard(cuboidRegion); + EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(w, -1); + + ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy(editSession, cuboidRegion, clipboard, min); + forwardExtentCopy.setCopyingEntities(false); + try{ + Operations.complete(forwardExtentCopy); + }catch(WorldEditException e){ + throw new IllegalStateException(e); + } + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try { + ClipboardWriter writer = ClipboardFormat.SCHEMATIC.getWriter(outputStream); + writer.write(clipboard, w.getWorldData()); + writer.close(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + schem.saveFromBytes(outputStream.toByteArray(), false); + } } diff --git a/FightSystem_API/src/de/steamwar/fightsystem/Config.java b/FightSystem_API/src/de/steamwar/fightsystem/Config.java index a34a405..29a84bf 100644 --- a/FightSystem_API/src/de/steamwar/fightsystem/Config.java +++ b/FightSystem_API/src/de/steamwar/fightsystem/Config.java @@ -61,12 +61,11 @@ public class Config { public static final Location TeamRedSpawn; public static final Location SpecSpawn; - private static final int TeamBluetoReddistanceX; - private static final int TeamBluetoReddistanceY; - public static final int TeamBluetoReddistanceZ; + private static final int BlueToRedX; + private static final int BlueToRedY; + public static final int BlueToRedZ; - public static final int BorderFromSchematic; - public static final boolean AlignWater; + public static final int PreperationArea; public static final int WaterDepth; public static final boolean GroundWalkable; @@ -77,6 +76,7 @@ public class Config { public static final de.steamwar.sql.SchematicType SchematicType; public static final boolean RedRotate; public static final boolean BlueRotate; + public static final boolean PasteAligned; public static final boolean ReplaceObsidianBedrock; public static final boolean ReplaceWithBlockupdates; @@ -134,14 +134,14 @@ public class Config { if(!new File(IFightSystem.getPlugin().getDataFolder(), System.getProperty("config", "config.yml")).exists()) { IFightSystem.getPlugin().saveDefaultConfig(); Bukkit.getLogger().log(Level.SEVERE, "Arenaconfig fehlt!"); - IFightSystem.shutdown(null); + Bukkit.shutdown(); } FileConfiguration config = IFightSystem.getPlugin().getConfig(); File worldConfigFile = new File(Bukkit.getWorlds().get(0).getWorldFolder(), config.getString("Arenaconfig", "config.yml")); if(!worldConfigFile.exists()) { Bukkit.getLogger().log(Level.SEVERE, "Weltconfig fehlt!"); - IFightSystem.shutdown(null); + Bukkit.shutdown(); } FileConfiguration worldconfig = YamlConfiguration.loadConfiguration(worldConfigFile); @@ -151,30 +151,30 @@ public class Config { PreFightDuration = config.getInt("Times.PreFightDuration"); SpectatorDuration = config.getInt("Times.SpectatorDuration"); + int underBorder = worldconfig.getInt("UnderBorder"); + int blueCornerX = worldconfig.getInt("BlueCorner.x"); + int blueCornerY = worldconfig.getInt("BlueCorner.y"); + int blueCornerZ = worldconfig.getInt("BlueCorner.z"); + BlueToRedX = worldconfig.getInt("BlueToRed.x"); + BlueToRedY = worldconfig.getInt("BlueToRed.y"); + BlueToRedZ = worldconfig.getInt("BlueToRed.z"); + double teamBlueSpawnOffsetX = worldconfig.getDouble("SpawnOffset.x"); + double teamBlueSpawnOffsetY = worldconfig.getDouble("SpawnOffset.y"); + double teamBlueSpawnOffsetZ = worldconfig.getDouble("SpawnOffset.z"); + WaterDepth = config.getInt("Arena.WaterDepth"); int schemsizeX = config.getInt("Arena.Schemsize.x"); int schemsizeY = config.getInt("Arena.Schemsize.y"); int schemsizeZ = config.getInt("Arena.Schemsize.z"); - int teamBlueCornerX = worldconfig.getInt("Arena.TeamBlueCorner.x"); - int teamBlueCornerY = worldconfig.getInt("Arena.TeamBlueCorner.y"); - int teamBlueCornerZ = worldconfig.getInt("Arena.TeamBlueCorner.z"); - TeamBluetoReddistanceX = worldconfig.getInt("Arena.TeamBluetoReddistance.x"); - TeamBluetoReddistanceY = worldconfig.getInt("Arena.TeamBluetoReddistance.y"); - TeamBluetoReddistanceZ = worldconfig.getInt("Arena.TeamBluetoReddistance.z"); int schem2BorderX = config.getInt("Arena.Schem2Border.x"); int schem2BorderZ = config.getInt("Arena.Schem2Border.z"); - int underArenaBorder = worldconfig.getInt("Arena.underArenaBorder"); - BorderFromSchematic = config.getInt("Arena.BorderFromSchematic"); - AlignWater = worldconfig.getBoolean("Arena.AlignWater"); - WaterDepth = worldconfig.getInt("Arena.WaterDepth"); + PreperationArea = config.getInt("Arena.BorderFromSchematic"); GroundWalkable = config.getBoolean("Arena.GroundWalkable"); - double teamBlueSpawnOffsetX = worldconfig.getDouble("Arena.SpawnOffset.x"); - double teamBlueSpawnOffsetY = worldconfig.getDouble("Arena.SpawnOffset.y"); - double teamBlueSpawnOffsetZ = worldconfig.getDouble("Arena.SpawnOffset.z"); RanksEnabled = config.getBoolean("Schematic.RanksEnabled"); SchematicType = de.steamwar.sql.SchematicType.fromDB(config.getString("Schematic.SchematicType")); IgnorePublicOnly = config.getBoolean("Schematic.IgnorePublicOnly"); boolean rotate = config.getBoolean("Schematic.Rotate"); + PasteAligned = config.getBoolean("Schematic.PasteAligned"); ReplaceObsidianBedrock = config.getBoolean("Schematic.ReplaceObsidianBedrock"); ReplaceWithBlockupdates = config.getBoolean("Schematic.ReplaceWithBlockupdates"); @@ -202,32 +202,32 @@ public class Config { if(schemsizeX < 0){ schemsizeX = -schemsizeX; - teamBlueCornerX = teamBlueCornerX - schemsizeX; + blueCornerX = blueCornerX - schemsizeX; } if(schemsizeY < 0){ schemsizeY = -schemsizeY; - teamBlueCornerY = teamBlueCornerY - schemsizeY; + blueCornerY = blueCornerY - schemsizeY; } if(schemsizeZ < 0){ schemsizeZ = -schemsizeZ; - teamBlueCornerZ = teamBlueCornerZ - schemsizeZ; + blueCornerZ = blueCornerZ - schemsizeZ; } - int teamRedCornerX = TeamBluetoReddistanceX + teamBlueCornerX; - int teamRedCornerY = TeamBluetoReddistanceY + teamBlueCornerY; - int teamRedCornerZ = TeamBluetoReddistanceZ + teamBlueCornerZ; + int teamRedCornerX = BlueToRedX + blueCornerX; + int teamRedCornerY = BlueToRedY + blueCornerY; + int teamRedCornerZ = BlueToRedZ + blueCornerZ; - int teamBluePasteX = teamBlueCornerX + schemsizeX / 2; - int teamBluePasteZ = teamBlueCornerZ + schemsizeZ / 2; - int teamRedPasteX = teamBluePasteX + TeamBluetoReddistanceX; - int teamRedPasteZ = teamBluePasteZ + TeamBluetoReddistanceZ; + int teamBluePasteX = blueCornerX + schemsizeX / 2; + int teamBluePasteZ = blueCornerZ + schemsizeZ / 2; + int teamRedPasteX = teamBluePasteX + BlueToRedX; + int teamRedPasteZ = teamBluePasteZ + BlueToRedZ; World world = Bukkit.getWorlds().get(0); TeamBlueSpawn = new Location(world, teamBluePasteX + 0.5 + teamBlueSpawnOffsetX, - teamBlueCornerY + 0.5 + teamBlueSpawnOffsetY, + blueCornerY + 0.5 + teamBlueSpawnOffsetY, teamBluePasteZ + 0.5 + teamBlueSpawnOffsetZ); TeamRedSpawn = new Location(world, @@ -236,9 +236,9 @@ public class Config { teamRedPasteZ + 0.5 - teamBlueSpawnOffsetZ); SpecSpawn = new Location(world, - teamBluePasteX + TeamBluetoReddistanceX/2.0, - teamBlueCornerY + TeamBluetoReddistanceY/2.0 + schemsizeY/2.0, - teamBluePasteZ + TeamBluetoReddistanceZ/2.0); + teamBluePasteX + BlueToRedX /2.0, + blueCornerY + BlueToRedY /2.0 + schemsizeY/2.0, + teamBluePasteZ + BlueToRedZ /2.0); Vector v1 = TeamBlueSpawn.toVector().subtract(TeamRedSpawn.toVector()); double pitch = Math.toDegrees(v1.angle(v1.clone().setY(0))); @@ -257,26 +257,26 @@ public class Config { int arenaMaxX; int arenaMinZ; int arenaMaxZ; - if(TeamBluetoReddistanceX > 0){ - arenaMinX = teamBlueCornerX - schem2BorderX; + if(BlueToRedX > 0){ + arenaMinX = blueCornerX - schem2BorderX; arenaMaxX = teamRedCornerX + schemsizeX + schem2BorderX; teamRedRotate = true; teamBlueRotate = false; }else{ arenaMinX = teamRedCornerX - schem2BorderX; - arenaMaxX = teamBlueCornerX + schemsizeX + schem2BorderX; + arenaMaxX = blueCornerX + schemsizeX + schem2BorderX; teamRedRotate = false; teamBlueRotate = true; } - if(TeamBluetoReddistanceZ > 0){ - arenaMinZ = teamBlueCornerZ - schem2BorderZ; + if(BlueToRedZ > 0){ + arenaMinZ = blueCornerZ - schem2BorderZ; arenaMaxZ = teamRedCornerZ + schemsizeZ + schem2BorderZ; teamRedRotate = true; teamBlueRotate = false; }else{ arenaMinZ = teamRedCornerZ - schem2BorderZ; - arenaMaxZ = teamBlueCornerZ + schemsizeZ + schem2BorderZ; - if(TeamBluetoReddistanceZ != 0){ + arenaMaxZ = blueCornerZ + schemsizeZ + schem2BorderZ; + if(BlueToRedZ != 0){ teamRedRotate = false; teamBlueRotate = true; } @@ -289,19 +289,19 @@ public class Config { BlueRotate = teamBlueRotate; RedPasteRegion = new Region(teamRedCornerX, teamRedCornerY, teamRedCornerZ, schemsizeX, schemsizeY, schemsizeZ); - BluePasteRegion = new Region(teamBlueCornerX, teamBlueCornerY, teamBlueCornerZ, schemsizeX, schemsizeY, schemsizeZ); + BluePasteRegion = new Region(blueCornerX, blueCornerY, blueCornerZ, schemsizeX, schemsizeY, schemsizeZ); - RedExtendRegion = new Region(teamRedCornerX, underArenaBorder, teamRedCornerZ, schemsizeX, schemsizeY, schemsizeZ, BorderFromSchematic, BorderFromSchematic); - BlueExtendRegion = new Region(teamBlueCornerX, underArenaBorder, teamBlueCornerZ, schemsizeX, schemsizeY, schemsizeZ, BorderFromSchematic, BorderFromSchematic); - int upperArenaBorder = teamBlueCornerY + schemsizeY + BorderFromSchematic; - ArenaRegion = new Region(arenaMinX, underArenaBorder, arenaMinZ, arenaMaxX - arenaMinX, upperArenaBorder - underArenaBorder, arenaMaxZ - arenaMinZ); + RedExtendRegion = new Region(teamRedCornerX, underBorder, teamRedCornerZ, schemsizeX, schemsizeY, schemsizeZ, PreperationArea, PreperationArea); + BlueExtendRegion = new Region(blueCornerX, underBorder, blueCornerZ, schemsizeX, schemsizeY, schemsizeZ, PreperationArea, PreperationArea); + int upperArenaBorder = blueCornerY + schemsizeY + PreperationArea; + ArenaRegion = new Region(arenaMinX, underBorder, arenaMinZ, arenaMaxX - arenaMinX, upperArenaBorder - underBorder, arenaMaxZ - arenaMinZ); EventKampfID = Integer.parseInt(System.getProperty("fightID", "0")); if(EventKampfID >= 1){ EventFight eventFight = EventFight.get(EventKampfID); if(eventFight == null){ Bukkit.getLogger().log(Level.SEVERE, "Failed to load EventFight"); - IFightSystem.shutdown(null); + Bukkit.shutdown(); } assert eventFight != null; @@ -310,7 +310,7 @@ public class Config { if(team1 == null || team2 == null){ Bukkit.getLogger().log(Level.SEVERE, "Failed to load Team"); - IFightSystem.shutdown(null); + Bukkit.shutdown(); } assert team1 != null; @@ -379,7 +379,7 @@ public class Config { } public static boolean test(){ - return EventKampfID == -1; + return ArenaMode.Test.contains(ArenaMode.TEST); } public static boolean recording(){ return mode == ArenaMode.EVENT; diff --git a/FightSystem_API/src/de/steamwar/fightsystem/IFightSystem.java b/FightSystem_API/src/de/steamwar/fightsystem/IFightSystem.java index be18926..5725381 100644 --- a/FightSystem_API/src/de/steamwar/fightsystem/IFightSystem.java +++ b/FightSystem_API/src/de/steamwar/fightsystem/IFightSystem.java @@ -20,7 +20,6 @@ package de.steamwar.fightsystem; import de.steamwar.sql.EventFight; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -50,21 +49,4 @@ public class IFightSystem { public static Player getEventLeiter(){ return eventLeiter; } - - public static void shutdown(String reason){ - if(reason != null) - Bukkit.broadcastMessage(reason); - //Staggered kick to prevent lobby overloading - kickNext(); - } - - private static void kickNext(){ - if(Bukkit.getOnlinePlayers().isEmpty()){ - Bukkit.shutdown(); - return; - } - - Bukkit.getOnlinePlayers().iterator().next().kickPlayer(null); - Bukkit.getScheduler().runTaskLater(plugin, IFightSystem::kickNext, 10); - } } diff --git a/FightSystem_API/src/de/steamwar/fightsystem/utils/Region.java b/FightSystem_API/src/de/steamwar/fightsystem/utils/Region.java index 14c66f6..9375b0c 100644 --- a/FightSystem_API/src/de/steamwar/fightsystem/utils/Region.java +++ b/FightSystem_API/src/de/steamwar/fightsystem/utils/Region.java @@ -1,6 +1,5 @@ package de.steamwar.fightsystem.utils; -import org.apache.logging.log4j.util.TriConsumer; import org.bukkit.Location; import org.bukkit.block.Block; @@ -121,4 +120,8 @@ public class Region { public boolean inRegion(Block block){ return in2dRegion(block) && minY <= block.getY() && block.getY() < maxY; } + + public interface TriConsumer{ + void accept(T x, V y, U z); + } } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java index d145f55..2611d88 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java @@ -31,6 +31,7 @@ import de.steamwar.fightsystem.listener.*; import de.steamwar.fightsystem.record.RecordSystem; import de.steamwar.fightsystem.record.Recorder; import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.OneShotStateDependent; import de.steamwar.fightsystem.utils.EnterHandler; import de.steamwar.fightsystem.utils.FightStatistics; import de.steamwar.fightsystem.utils.TechHider; @@ -121,6 +122,12 @@ public class FightSystem extends JavaPlugin { new AkCommand(); new LeaderCommand(); new LockschemCommand(); + new StateCommand(); + new SkipCommand(); + + new OneShotStateDependent(ArenaMode.All, FightState.PreRunning, () -> Bukkit.broadcastMessage(PREFIX + "§aDer Kampf beginnt!")); + new OneShotStateDependent(ArenaMode.All, FightState.Running, () -> Bukkit.broadcastMessage(PREFIX + "§aArena freigegeben!")); + new OneShotStateDependent(ArenaMode.AntiTest, FightState.Running, FightStatistics::start); try { CommandRemover.removeAll("gamemode"); @@ -160,15 +167,10 @@ public class FightSystem extends JavaPlugin { public static void setPreRunningState() { FightState.setFightState(FightState.PRE_RUNNING); - - Bukkit.broadcastMessage(PREFIX + "§aDer Kampf beginnt!"); } public static void setRunningState() { FightState.setFightState(FightState.RUNNING); - - FightStatistics.start(); - Bukkit.broadcastMessage(PREFIX + "§aArena freigegeben!"); } public static void setSpectateState(FightTeam winFightTeam, String windescription) { @@ -211,6 +213,19 @@ public class FightSystem extends JavaPlugin { } public static void shutdown(String reason){ - IFightSystem.shutdown(reason); + if(reason != null) + Bukkit.broadcastMessage(reason); + //Staggered kick to prevent lobby overloading + kickNext(); + } + + private static void kickNext(){ + if(Bukkit.getOnlinePlayers().isEmpty()){ + Bukkit.shutdown(); + return; + } + + Bukkit.getOnlinePlayers().iterator().next().kickPlayer(null); + Bukkit.getScheduler().runTaskLater(plugin, FightSystem::kickNext, 10); } } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java index beed415..94ad0fb 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java @@ -88,6 +88,14 @@ public class Commands { } static void toggleReady(Player p){ + FightTeam fightTeam = checkGetTeam(p); + if(fightTeam == null || checkGetLeader(p) == null) + return; + + fightTeam.skip(); + } + + static void toggleSkip(Player p){ if(checkSetup(p)) return; diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/GUI.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/GUI.java index 9efade8..0b960b0 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/GUI.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/GUI.java @@ -67,6 +67,20 @@ public class GUI { inv.open(); } + public static void state(Player p){ + SWInventory inv = new SWInventory(p, 9, "Kampfstatus"); + inv.setItem(0, Material.GLASS, "§7PRE_LEADER_SETUP", (ClickType click) -> FightSystem.setPreLeaderState()); + inv.setItem(1, Material.GLASS, "§7PRE_SCHEM_SETUP", (ClickType click) -> FightSystem.setPreSchemState()); + inv.setItem(2, Material.GLASS, "§7POST_SCHEM_SETUP", (ClickType click) -> FightSystem.setPostSchemState()); + inv.setItem(3, Material.GLASS, "§ePRE_RUNNING", (ClickType click) -> FightSystem.setPreRunningState()); + inv.setItem(4, Material.GLASS, "§eRUNNING", (ClickType click) -> FightSystem.setRunningState()); + inv.setItem(5, Material.GLASS, "§7SPECTATE Blue", (ClickType click) -> FightSystem.setSpectateState(Fight.getBlueTeam(), "operator")); + inv.setItem(6, Material.GLASS, "§7SPECTATE Red", (ClickType click) -> FightSystem.setSpectateState(Fight.getRedTeam(), "operator")); + inv.setItem(7, Material.GLASS, "§7SPECTATE Tie", (ClickType click) -> FightSystem.setSpectateState(null, "operator")); + inv.setCallback(-999, (ClickType click) -> p.closeInventory()); + inv.open(); + } + public static void chooseInvitation(Player p){ List> players = SWListInv.createPlayerList(p.getUniqueId()); players.removeIf(swItemUUIDPair -> Fight.getFightPlayer(Bukkit.getPlayer(swItemUUIDPair.getObject())) != null); diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/SkipCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/SkipCommand.java new file mode 100644 index 0000000..97a6de5 --- /dev/null +++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/SkipCommand.java @@ -0,0 +1,27 @@ +package de.steamwar.fightsystem.commands; + +import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependentCommand; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class SkipCommand implements CommandExecutor { + + public SkipCommand() { + new StateDependentCommand(ArenaMode.AntiPrepare, FightState.Running, "skip", this); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if(!(sender instanceof Player)) { + return false; + } + Player player = (Player) sender; + + Commands.toggleSkip(player); + return false; + } +} diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/StateCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/StateCommand.java new file mode 100644 index 0000000..8d29c46 --- /dev/null +++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/StateCommand.java @@ -0,0 +1,26 @@ +package de.steamwar.fightsystem.commands; + +import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependentCommand; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class StateCommand implements CommandExecutor { + + public StateCommand() { + new StateDependentCommand(ArenaMode.Test, FightState.All, "state", this); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if(!(sender instanceof Player)) { + return false; + } + + GUI.state((Player) sender); + return false; + } +} diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java index cc3fc73..1b9cd6e 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java @@ -31,8 +31,13 @@ import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitTask; +import java.util.ArrayList; +import java.util.List; + public abstract class Countdown { + private static final List currentCountdowns = new ArrayList<>(); + private final int totalTime; private final Sound sound; private final boolean level; @@ -71,15 +76,35 @@ public abstract class Countdown { public void enable() { time = totalTime; task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::count, 20, 20); + currentCountdowns.add(this); } public void disable() { if(task != null){ task.cancel(); + currentCountdowns.remove(this); task = null; } } + public static void skip(){ + if(currentCountdowns.isEmpty()) + return; + + int smallestTime = currentCountdowns.get(0).time; + for(Countdown countdown : currentCountdowns){ + if(countdown.time < smallestTime) + smallestTime = countdown.time; + } + + smallestTime--; + for(Countdown countdown : currentCountdowns){ + countdown.time -= smallestTime; + } + + Bukkit.broadcastMessage(FightSystem.PREFIX + "§aBeide Teams waren damit einverstanden, zum nächsten Event zu beschleunigen!"); + } + private void broadcast(String message){ RecordSystem.actionBar(message); BaseComponent[] msg = TextComponent.fromLegacyText(message); diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightSchematic.java index a4c2ec2..c0f857c 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightSchematic.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightSchematic.java @@ -115,21 +115,21 @@ public class FightSchematic extends StateDependent { try { VersionedRunnable.call(new VersionedRunnable(() -> { try { - EditSession e = FightTeam_8.pasteSchematic(clipboard, region.centerX(), region.getMinY(), region.centerZ(), rotate); + EditSession e = FightTeam_8.pasteSchematic(clipboard, region, rotate); FightTeam_8.replaceTeamColor(e, c, region); } catch (Schematic.WrongVersionException | IOException | NoClipboardException ex) { throw new SecurityException("Error pasting arena in schematic", ex); } }, 8), new VersionedRunnable(() -> { try { - EditSession e = FightTeam_8.pasteSchematic(clipboard, region.centerX(), region.getMinY(), region.centerZ(), rotate); + EditSession e = FightTeam_8.pasteSchematic(clipboard, region, rotate); FightTeam_12.replaceTeamColor(e, c, region); } catch (Schematic.WrongVersionException | IOException | NoClipboardException ex) { throw new SecurityException("Error pasting arena in schematic", ex); } }, 12), new VersionedRunnable(() -> { try { - EditSession e = FightTeam_14.pasteSchematic(clipboard, region.centerX(), region.getMinY(), region.centerZ(), rotate); + EditSession e = FightTeam_14.pasteSchematic(clipboard, region, rotate); FightTeam_14.replaceTeamColor(e, c, region); } catch (Schematic.WrongVersionException | IOException | NoClipboardException ex) { throw new SecurityException("Error pasting arena in schematic", ex); diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java index 859bf10..7e67e09 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -24,6 +24,7 @@ import de.steamwar.core.VersionedRunnable; import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; +import de.steamwar.fightsystem.countdown.Countdown; import de.steamwar.fightsystem.listener.BasicListener; import de.steamwar.fightsystem.listener.PersonalKitCreator; import de.steamwar.fightsystem.record.RecordSystem; @@ -48,11 +49,11 @@ import java.util.*; public class FightTeam implements IFightTeam{ - private FightPlayer leader; private UUID designatedLeader; + private FightPlayer leader; private final Map players = new HashMap<>(); - private boolean ready; private final Set invited = new HashSet<>(); + private final String name; private final String prefix; private final ChatColor color; @@ -60,6 +61,9 @@ public class FightTeam implements IFightTeam{ private final Team team; private final boolean blue; + private boolean ready; + private boolean skip; + private final Location spawn; private final Region schemRegion; private final Region extendRegion; @@ -71,6 +75,7 @@ public class FightTeam implements IFightTeam{ this.name = name; this.prefix = prefix; this.ready = false; + this.skip = false; this.blue = blue; this.designatedLeader = designatedLeader; this.color = ChatColor.getByChar(ChatColor.getLastColors(prefix).replace("§", "")); @@ -315,6 +320,18 @@ public class FightTeam implements IFightTeam{ } } + public void skip(){ + this.skip = !skip; + if(skip){ + broadcast(FightSystem.PREFIX + "§aEuer Team ist nun bereit, zum nächsten Event zu beschleunigen!"); + if(Fight.getOpposite(this).skip || Config.test()){ + Countdown.skip(); + } + }else{ + broadcast(FightSystem.PREFIX + "§cEuer Team ist nicht mehr bereit, zum nächsten Event zu beschleunigen!"); + } + } + public Set getInvited() { return invited; } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoin.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoin.java index 9bc3b71..0efb2a2 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoin.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoin.java @@ -37,7 +37,7 @@ import org.bukkit.event.player.PlayerQuitEvent; public class EventJoin implements Listener { public EventJoin() { - new StateDependentListener(ArenaMode.Event, FightState.Setup, this); + new StateDependentListener(ArenaMode.Event, FightState.All, this); } @EventHandler @@ -58,29 +58,32 @@ public class EventJoin implements Listener { @EventHandler public void handlePlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); + //player.setResourcePack("https://steamwar.de/antixray.zip"); SteamwarUser user = SteamwarUser.get(player.getUniqueId()); - FightTeam team = null; - if(user.getTeam() == Config.EventTeamBlueID) - team = Fight.getBlueTeam(); - else if(user.getTeam() == Config.EventTeamRedID) - team = Fight.getRedTeam(); - - if(Config.BothTeamsPublic){ - if(Fight.getRedTeam().getPlayers().size() < Fight.getBlueTeam().getPlayers().size()) - team = Fight.getRedTeam(); - else + if(FightState.Setup.contains(FightState.getFightState())){ + FightTeam team = null; + if(user.getTeam() == Config.EventTeamBlueID) team = Fight.getBlueTeam(); - }else if(team == null){ - if(Config.EventTeamRedID == 0) + else if(user.getTeam() == Config.EventTeamRedID) team = Fight.getRedTeam(); - else if(Config.EventTeamBlueID == 0) - team = Fight.getBlueTeam(); - } - if(team != null && team.getPlayers().size() < Config.MaximumTeamMembers){ - team.addMember(player); - return; + if(Config.BothTeamsPublic){ + if(Fight.getRedTeam().getPlayers().size() < Fight.getBlueTeam().getPlayers().size()) + team = Fight.getRedTeam(); + else + team = Fight.getBlueTeam(); + }else if(team == null){ + if(Config.EventTeamRedID == 0) + team = Fight.getRedTeam(); + else if(Config.EventTeamBlueID == 0) + team = Fight.getBlueTeam(); + } + + if(team != null && team.getPlayers().size() < Config.MaximumTeamMembers){ + team.addMember(player); + return; + } } if(user.getId() == FightSystem.getEventFight().getKampfleiter()){ @@ -98,4 +101,14 @@ public class EventJoin implements Listener { if(player == FightSystem.getEventLeiter()) FightSystem.setEventLeiter(null); } + + /*@EventHandler + public void onResourcepack(PlayerResourcePackStatusEvent e){ + if(e.getStatus() == PlayerResourcePackStatusEvent.Status.ACCEPTED || e.getStatus() == PlayerResourcePackStatusEvent.Status.SUCCESSFULLY_LOADED) + return; + + Player player = e.getPlayer(); + player.sendMessage(FightSystem.PREFIX + "§cAuf Eventserver kann nur mit dem SteamWar-Resourcepack beigetreten werden"); + player.kickPlayer(null); + }*/ } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PrepareSchem.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PrepareSchem.java index 3852681..fbdccca 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PrepareSchem.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PrepareSchem.java @@ -19,12 +19,21 @@ package de.steamwar.fightsystem.listener; +import de.steamwar.core.VersionedCallable; +import de.steamwar.core.VersionedRunnable; import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.fight.FightTeam_14; +import de.steamwar.fightsystem.fight.FightTeam_8; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; +import de.steamwar.fightsystem.utils.Region; +import de.steamwar.sql.Schematic; +import org.bukkit.Bukkit; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -37,7 +46,38 @@ public class PrepareSchem implements Listener { @Override public void disable() { super.disable(); - //TODO + Region region = Fight.getBlueTeam().getExtendRegion(); + World world = Bukkit.getWorlds().get(0); + + Schematic schem; + try{ + schem = Schematic.getSchemFromDB(Config.PrepareSchemID); + }catch(SecurityException e){ + FightSystem.shutdown(FightSystem.PREFIX + "§cAnscheinend wurde die auszufahrende Schematic gelöscht, Einsenden wird abgebrochen."); + return; + } + + try{ + region.forEach((x, y, z) -> { + if(VersionedCallable.call( + new VersionedCallable<>(() -> FightTeam_8.checkPistonMoving(world.getBlockAt(x, y, z)), 8), + new VersionedCallable<>(() -> FightTeam_14.checkPistonMoving(world.getBlockAt(x, y, z)), 14))){ + FightSystem.shutdown(FightSystem.PREFIX + "§cIm Teambereich wurden sich noch bewegende Pistons gefunden, Einsenden wird abgebrochen."); + throw new IllegalStateException(); + } + }); + }catch (IllegalStateException e){ + return; + } + + try{ + VersionedRunnable.call( + new VersionedRunnable(() -> FightTeam_8.saveSchem(schem, region), 8), + new VersionedRunnable(() -> FightTeam_14.saveSchem(schem, region), 14)); + }catch(IllegalStateException e){ + FightSystem.shutdown(FightSystem.PREFIX + "§cDie Schematic konnte nicht gespeichert werden, Einsenden wird abgebrochen."); + return; + } } }; } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/TeamArea.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TeamArea.java index 017adaf..b7873a0 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/TeamArea.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TeamArea.java @@ -59,7 +59,7 @@ public class TeamArea implements Listener { } private void checkInInnerArea(Player player, Location to, FightTeam team){ - if(team.getSchemRegion().playerInRegion(to) && Config.BorderFromSchematic >= 5){ // Preventing false positives due to small extension + if(team.getSchemRegion().playerInRegion(to) && Config.PreperationArea >= 5){ // Preventing false positives due to small extension player.kickPlayer(null); Bukkit.getLogger().log(Level.SEVERE, player.getName() + " ist in einen Teambereich eingedrungen."); } diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/WaterRemover.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/WaterRemover.java index cb24bc1..40ae32e 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/WaterRemover.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/WaterRemover.java @@ -32,7 +32,7 @@ import org.bukkit.event.entity.EntityExplodeEvent; public class WaterRemover implements Listener { - private static final int MIN_Y = Config.BluePasteRegion.getMinY() + (Config.AlignWater ? Config.WaterDepth : 0); + private static final int MIN_Y = Config.BluePasteRegion.getMinY() + Config.WaterDepth; public WaterRemover() { new StateDependentListener(ArenaMode.All, FightState.Running, this); diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/OneShotStateDependent.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/OneShotStateDependent.java new file mode 100644 index 0000000..46d719e --- /dev/null +++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/OneShotStateDependent.java @@ -0,0 +1,25 @@ +package de.steamwar.fightsystem.states; + +import de.steamwar.fightsystem.ArenaMode; + +import java.util.Set; + +public class OneShotStateDependent extends StateDependent{ + + private final Runnable runnable; + + public OneShotStateDependent(Set mode, Set states, Runnable runnable) { + super(mode, states); + this.runnable = runnable; + } + + @Override + public void enable() { + runnable.run(); + } + + @Override + public void disable() { + //Do nothing, oneshot + } +} diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/utils/TechHider.java b/FightSystem_Main/src/de/steamwar/fightsystem/utils/TechHider.java index 8168229..1cf0331 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/utils/TechHider.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/utils/TechHider.java @@ -126,6 +126,9 @@ public class TechHider implements IStateDependent { if(Core.getVersion() > 8) { protocolManager.addPacketListener(updateBlockEntity); } + if(Core.getVersion() > 12) { + protocolManager.addPacketListener(blockBreakHider); + } if(chunkHider != null) { protocolManager.getAsynchronousManager().registerAsyncHandler(chunkHider).start(threadMultiplier * 4); } @@ -139,6 +142,9 @@ public class TechHider implements IStateDependent { if(Core.getVersion() > 8) { protocolManager.removePacketListener(updateBlockEntity); } + if(Core.getVersion() > 12) { + protocolManager.removePacketListener(blockBreakHider); + } if(chunkHider != null) { protocolManager.getAsynchronousManager().unregisterAsyncHandler(chunkHider); } @@ -223,6 +229,35 @@ public class TechHider implements IStateDependent { } }; + private final PacketAdapter blockBreakHider = new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.BLOCK_BREAK) { + @Override + public void onPacketSending(PacketEvent e) { + PacketContainer packet = e.getPacket(); + BlockPosition pos = packet.getBlockPositionModifier().read(0); + + Player p = e.getPlayer(); + if(bypass(p, ITechHider.posToChunk(pos.getX()), ITechHider.posToChunk(pos.getZ()))) + return; + + + PacketContainer cached = packetCache.get(packet); + if(cached != null){ + e.setPacket(cached); + return; + } + + cached = packet.deepClone(); + packetCache.put(packet, cached); + e.setPacket(cached); + StructureModifier blockStructure = cached.getBlockData(); + WrappedBlockData block = blockStructure.read(0); + if(Config.HiddenBlocks.contains(block.getType().name())){ + block.setType(obfuscateMaterial); + blockStructure.write(0, block); + } + } + }; + private final PacketAdapter updateBlockEntity = new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Server.TILE_ENTITY_DATA) { @Override public void onPacketSending(PacketEvent event) { diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java index b0481fd..c03bf25 100644 --- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java +++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java @@ -51,7 +51,7 @@ public class WinconditionTimeTechKO extends Wincondition { public WinconditionTimeTechKO(){ super("TechKO", "", " §chat den Gegner Tech K.O. gesetzt!"); - if(Config.TeamBluetoReddistanceZ > 0) { + if(Config.BlueToRedZ > 0) { smallerZteam = Fight.getBlueTeam(); biggerZteam = Fight.getRedTeam(); }else{ diff --git a/FightSystem_Main/src/plugin.yml b/FightSystem_Main/src/plugin.yml index 265d3cf..0d4346a 100644 --- a/FightSystem_Main/src/plugin.yml +++ b/FightSystem_Main/src/plugin.yml @@ -17,4 +17,6 @@ commands: kit: remove: leader: - lockschem: \ No newline at end of file + lockschem: + state: + skip: \ No newline at end of file