diff --git a/FightSystem_10/src/de/steamwar/fightsystem/fight/FightWorld_10.java b/FightSystem_10/src/de/steamwar/fightsystem/fight/FightWorld_10.java
new file mode 100644
index 0000000..3b81471
--- /dev/null
+++ b/FightSystem_10/src/de/steamwar/fightsystem/fight/FightWorld_10.java
@@ -0,0 +1,47 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import de.steamwar.core.events.ChunkListener;
+import net.minecraft.server.v1_10_R1.Chunk;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_10_R1.CraftWorld;
+import org.bukkit.entity.Player;
+
+class FightWorld_10 {
+ private FightWorld_10(){}
+
+ static void resetChunk(World world, World backup, int x, int z){
+ net.minecraft.server.v1_10_R1.World w = ((CraftWorld) world).getHandle();
+ Chunk chunk = w.getChunkAt(x, z);
+ Chunk backupChunk = ((CraftWorld) backup).getHandle().getChunkAt(x, z);
+
+ System.arraycopy(backupChunk.getSections(), 0, chunk.getSections(), 0, chunk.getSections().length);
+ System.arraycopy(backupChunk.heightMap, 0, chunk.heightMap, 0, chunk.heightMap.length);
+ w.tileEntityListTick.removeAll(chunk.tileEntities.values());
+ w.tileEntityList.removeAll(chunk.tileEntities.values());
+ chunk.tileEntities.clear();
+ chunk.tileEntities.putAll(backupChunk.tileEntities);
+ for(Player p : Bukkit.getOnlinePlayers()){
+ ChunkListener.sendChunk(p, x, z);
+ }
+ }
+}
diff --git a/FightSystem_10/src/de/steamwar/fightsystem/listener/PersonalKitCreator_10.java b/FightSystem_10/src/de/steamwar/fightsystem/listener/PersonalKitCreator_10.java
index 0bf5938..d02d944 100644
--- a/FightSystem_10/src/de/steamwar/fightsystem/listener/PersonalKitCreator_10.java
+++ b/FightSystem_10/src/de/steamwar/fightsystem/listener/PersonalKitCreator_10.java
@@ -25,9 +25,9 @@ import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.Set;
-class PersonalKitCreator_10 {
+public class PersonalKitCreator_10 {
- static boolean hasItems(ItemStack stack){
+ public static boolean hasItems(ItemStack stack){
Set keys = new HashSet<>(CraftItemStack.asNMSCopy(stack).getTag().c());
keys.remove("Enchantments");
keys.remove("Damage");
diff --git a/FightSystem_12/src/de/steamwar/fightsystem/fight/FightTeam_12.java b/FightSystem_12/src/de/steamwar/fightsystem/fight/FightTeam_12.java
index c6138b0..5d382d9 100644
--- a/FightSystem_12/src/de/steamwar/fightsystem/fight/FightTeam_12.java
+++ b/FightSystem_12/src/de/steamwar/fightsystem/fight/FightTeam_12.java
@@ -24,7 +24,7 @@ import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.regions.CuboidRegion;
-import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.utils.Region;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Material;
@@ -54,10 +54,9 @@ class FightTeam_12 {
@SuppressWarnings("deprecation")
- static void replaceTeamColor(EditSession e, DyeColor c, int cornerX, int cornerY, int cornerZ){
- FightTeam_8.replaceTeamColor(e, c, cornerX, cornerY, cornerZ);
- Vector corner = new Vector(cornerX, cornerY, cornerZ);
- CuboidRegion region = new CuboidRegion(corner, corner.add(Config.SchemsizeX, Config.SchemsizeY, Config.SchemsizeZ));
+ static void replaceTeamColor(EditSession e, DyeColor c, Region r){
+ FightTeam_8.replaceTeamColor(e, c, r);
+ CuboidRegion region = new CuboidRegion(new Vector(r.getMinX(), r.getMinY(), r.getMinZ()), new Vector(r.getMaxX(), r.getMaxY(), r.getMaxZ()));
try {
e.replaceBlocks(region, CONCRETE_SET, new BaseBlock(CONCRETE.getId(), c.getWoolData()));
e.replaceBlocks(region, CONCRETE_POWDER_SET, new BaseBlock(CONCRETE_POWDER.getId(), c.getWoolData()));
diff --git a/FightSystem_12/src/de/steamwar/fightsystem/fight/FightWorld_12.java b/FightSystem_12/src/de/steamwar/fightsystem/fight/FightWorld_12.java
new file mode 100644
index 0000000..f4a7d6c
--- /dev/null
+++ b/FightSystem_12/src/de/steamwar/fightsystem/fight/FightWorld_12.java
@@ -0,0 +1,47 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import de.steamwar.core.events.ChunkListener;
+import net.minecraft.server.v1_12_R1.Chunk;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_12_R1.CraftWorld;
+import org.bukkit.entity.Player;
+
+class FightWorld_12 {
+ private FightWorld_12(){}
+
+ static void resetChunk(World world, World backup, int x, int z){
+ net.minecraft.server.v1_12_R1.World w = ((CraftWorld) world).getHandle();
+ Chunk chunk = w.getChunkAt(x, z);
+ Chunk backupChunk = ((CraftWorld) backup).getHandle().getChunkAt(x, z);
+
+ System.arraycopy(backupChunk.getSections(), 0, chunk.getSections(), 0, chunk.getSections().length);
+ System.arraycopy(backupChunk.heightMap, 0, chunk.heightMap, 0, chunk.heightMap.length);
+ w.tileEntityListTick.removeAll(chunk.tileEntities.values());
+ w.tileEntityList.removeAll(chunk.tileEntities.values());
+ chunk.tileEntities.clear();
+ chunk.tileEntities.putAll(backupChunk.tileEntities);
+ for(Player p : Bukkit.getOnlinePlayers()){
+ ChunkListener.sendChunk(p, x, z);
+ }
+ }
+}
diff --git a/FightSystem_12/src/de/steamwar/fightsystem/listener/PersonalKitCreator_12.java b/FightSystem_12/src/de/steamwar/fightsystem/listener/PersonalKitCreator_12.java
index ba74cd1..a76bdc8 100644
--- a/FightSystem_12/src/de/steamwar/fightsystem/listener/PersonalKitCreator_12.java
+++ b/FightSystem_12/src/de/steamwar/fightsystem/listener/PersonalKitCreator_12.java
@@ -25,9 +25,9 @@ import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.Set;
-class PersonalKitCreator_12 {
+public class PersonalKitCreator_12 {
- static boolean hasItems(ItemStack stack){
+ public static boolean hasItems(ItemStack stack){
Set keys = new HashSet<>(CraftItemStack.asNMSCopy(stack).getTag().c());
keys.remove("Enchantments");
keys.remove("Damage");
diff --git a/FightSystem_12/src/de/steamwar/fightsystem/utils/TechHider_12.java b/FightSystem_12/src/de/steamwar/fightsystem/utils/TechHider_12.java
index 29c9621..4286cd5 100644
--- a/FightSystem_12/src/de/steamwar/fightsystem/utils/TechHider_12.java
+++ b/FightSystem_12/src/de/steamwar/fightsystem/utils/TechHider_12.java
@@ -20,7 +20,6 @@
package de.steamwar.fightsystem.utils;
import com.comphenix.protocol.PacketType;
-import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
@@ -35,6 +34,7 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.util.List;
+import java.util.Set;
import java.util.logging.Level;
import static de.steamwar.fightsystem.utils.ITechHider.bypass;
@@ -42,14 +42,8 @@ import static de.steamwar.fightsystem.utils.ITechHider.bypass;
class TechHider_12 {
private TechHider_12(){}
- private static final short obfuscateShift4 = (short)(Config.ObfuscateWith << 4);
-
- static void start(){
- chunkHider();
- }
-
- private static void chunkHider(){
- ProtocolLibrary.getProtocolManager().getAsynchronousManager().registerAsyncHandler(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.MAP_CHUNK) {
+ static PacketAdapter chunkHider(Set hiddenBlockIds, int obfuscateWith){
+ return new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.MAP_CHUNK) {
@Override
public void onPacketSending(PacketEvent e) {
PacketContainer packet = e.getPacket();
@@ -96,8 +90,8 @@ class TechHider_12 {
int entry = ITechHider.readVarInt(data, i);
i += ITechHider.readVarIntLength(data, i);
- if(Config.HiddenBlocks.contains(entry >> 4)){
- entry = obfuscateShift4;
+ if(hiddenBlockIds.contains(entry)){
+ entry = obfuscateWith;
changed = true;
}
buffer.writeBytes(ITechHider.writeVarInt(entry));
@@ -123,6 +117,6 @@ class TechHider_12 {
byteArray.write(0, data);
}
}
- }).start(ITechHider.threadMultiplier * 4);
+ };
}
}
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 a7d185b..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;
@@ -33,19 +38,23 @@ import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockTypes;
import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.utils.Region;
import de.steamwar.sql.NoClipboardException;
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());
@@ -61,10 +70,8 @@ class FightTeam_14 {
team.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.FOR_OWN_TEAM);
}
- static void replaceTeamColor(EditSession e, DyeColor c, int cornerX, int cornerY, int cornerZ){
- BlockVector3 corner3 = BlockVector3.at(cornerX, cornerY, cornerZ);
- BlockVector3 schemsize3 = BlockVector3.at(Config.SchemsizeX, Config.SchemsizeY, Config.SchemsizeZ);
- CuboidRegion region = new CuboidRegion(corner3, corner3.add(schemsize3));
+ static void replaceTeamColor(EditSession e, DyeColor c, Region r){
+ CuboidRegion region = new CuboidRegion(BlockVector3.at(r.getMinX(), r.getMinY(), r.getMinZ()), BlockVector3.at(r.getMaxX(), r.getMaxY(), r.getMaxZ()));
try {
e.replaceBlocks(region, WOOL_SET, Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_wool")).getDefaultState().toBaseBlock());
e.replaceBlocks(region, CARPET_SET, Objects.requireNonNull(BlockTypes.get(c.name().toLowerCase() + "_carpet")).getDefaultState().toBaseBlock());
@@ -79,9 +86,8 @@ class FightTeam_14 {
e.flushSession();
}
- static EditSession pasteSchematic(Schematic schematic, int pX, int pY, int pZ, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException {
- BlockVector3 paste = BlockVector3.at(pX, pY, pZ);
- Clipboard clipboard = schematic.load();
+ 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();
@@ -95,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()){
@@ -112,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/fight/FightWorld_14.java b/FightSystem_14/src/de/steamwar/fightsystem/fight/FightWorld_14.java
new file mode 100644
index 0000000..0cff188
--- /dev/null
+++ b/FightSystem_14/src/de/steamwar/fightsystem/fight/FightWorld_14.java
@@ -0,0 +1,48 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import de.steamwar.core.events.ChunkListener;
+import net.minecraft.server.v1_14_R1.Chunk;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
+import org.bukkit.entity.Player;
+
+class FightWorld_14 {
+ private FightWorld_14(){}
+
+ static void resetChunk(World world, World backup, int x, int z){
+ net.minecraft.server.v1_14_R1.World w = ((CraftWorld) world).getHandle();
+ Chunk chunk = w.getChunkAt(x, z);
+ Chunk backupChunk = ((CraftWorld) backup).getHandle().getChunkAt(x, z);
+
+ System.arraycopy(backupChunk.getSections(), 0, chunk.getSections(), 0, chunk.getSections().length);
+ w.tileEntityListTick.removeAll(chunk.tileEntities.values());
+ w.tileEntityList.removeAll(chunk.tileEntities.values());
+ chunk.tileEntities.clear();
+ chunk.tileEntities.putAll(backupChunk.tileEntities);
+ chunk.heightMap.clear();
+ chunk.heightMap.putAll(backupChunk.heightMap);
+ for(Player p : Bukkit.getOnlinePlayers()){
+ ChunkListener.sendChunk(p, x, z);
+ }
+ }
+}
diff --git a/FightSystem_14/src/de/steamwar/fightsystem/listener/PersonalKitCreator_14.java b/FightSystem_14/src/de/steamwar/fightsystem/listener/PersonalKitCreator_14.java
index bbf665d..74b3b44 100644
--- a/FightSystem_14/src/de/steamwar/fightsystem/listener/PersonalKitCreator_14.java
+++ b/FightSystem_14/src/de/steamwar/fightsystem/listener/PersonalKitCreator_14.java
@@ -26,14 +26,14 @@ import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
-class PersonalKitCreator_14 {
+public class PersonalKitCreator_14 {
private PersonalKitCreator_14(){}
- static boolean hasAttributeModifier(ItemStack stack){
+ public static boolean hasAttributeModifier(ItemStack stack){
return stack.hasItemMeta() && Objects.requireNonNull(stack.getItemMeta()).hasAttributeModifiers();
}
- static boolean hasItems(ItemStack stack){
+ public static boolean hasItems(ItemStack stack){
Set keys = new HashSet<>(CraftItemStack.asNMSCopy(stack).getTag().getKeys());
keys.remove("Enchantments");
keys.remove("Damage");
diff --git a/FightSystem_14/src/de/steamwar/fightsystem/utils/WaterRemover_14.java b/FightSystem_14/src/de/steamwar/fightsystem/listener/WaterRemover_14.java
similarity index 97%
rename from FightSystem_14/src/de/steamwar/fightsystem/utils/WaterRemover_14.java
rename to FightSystem_14/src/de/steamwar/fightsystem/listener/WaterRemover_14.java
index 51ab896..3b03787 100644
--- a/FightSystem_14/src/de/steamwar/fightsystem/utils/WaterRemover_14.java
+++ b/FightSystem_14/src/de/steamwar/fightsystem/listener/WaterRemover_14.java
@@ -17,7 +17,7 @@
along with this program. If not, see .
*/
-package de.steamwar.fightsystem.utils;
+package de.steamwar.fightsystem.listener;
import org.bukkit.Material;
import org.bukkit.block.Block;
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 aa6af7e..39546ec 100644
--- a/FightSystem_14/src/de/steamwar/fightsystem/utils/TechHider_14.java
+++ b/FightSystem_14/src/de/steamwar/fightsystem/utils/TechHider_14.java
@@ -20,7 +20,6 @@
package de.steamwar.fightsystem.utils;
import com.comphenix.protocol.PacketType;
-import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
@@ -31,21 +30,49 @@ 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.*;
import org.bukkit.entity.Player;
+import java.nio.ByteBuffer;
+import java.nio.LongBuffer;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import static de.steamwar.fightsystem.utils.ITechHider.bypass;
public class TechHider_14 {
private TechHider_14(){}
- static void start(){
- chunkHider();
+ static Set getHiddenBlockIds() {
+ Set hiddenBlockIds = new HashSet<>();
+ for(String tag : Config.HiddenBlocks){
+ for(IBlockData data : IRegistry.BLOCK.get(new MinecraftKey(tag)).getStates().a()){
+ 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;
}
- static void chunkHider(){
- ProtocolLibrary.getProtocolManager().getAsynchronousManager().registerAsyncHandler(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.MAP_CHUNK) {
+ static int getObfuscateWith() {
+ return Block.getCombinedId(IRegistry.BLOCK.get(new MinecraftKey(Config.ObfuscateWith)).getBlockData());
+ }
+
+ static PacketAdapter chunkHider(Set hiddenBlockIds, int obfuscateWith){
+ /*
+ * Bevor editing this function read and understand: https://wiki.vg/Chunk_Format
+ * */
+ return new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.MAP_CHUNK) {
@Override
public void onPacketSending(PacketEvent e) {
PacketContainer packet = e.getPacket();
@@ -57,16 +84,9 @@ public class TechHider_14 {
if(bypass(p, chunkX, chunkZ))
return;
- PacketContainer cached = ITechHider.packetCache.get(packet);
- if(cached != null){
- e.setPacket(cached);
- return;
- }
-
- cached = packet.deepClone();
- ITechHider.packetCache.put(packet, cached);
- e.setPacket(cached);
- StructureModifier>> list = cached.getListNbtModifier();
+ packet = packet.shallowClone();
+ e.setPacket(packet);
+ StructureModifier>> list = packet.getListNbtModifier();
List> nmsTags = list.read(0);
boolean changed = false;
for(int i = nmsTags.size() - 1; i >= 0; i--){
@@ -83,30 +103,25 @@ public class TechHider_14 {
}
changed = false;
- StructureModifier byteArray = cached.getByteArrays();
+ StructureModifier byteArray = packet.getByteArrays();
int primaryBitMask = ints.read(2);
- int numChunkSections = 0;
- while(primaryBitMask != 0){
- numChunkSections += primaryBitMask & 1;
- primaryBitMask >>= 1;
- }
- byte [] data = byteArray.read(0);
+ byte[] data = byteArray.read(0);
ByteBuf buffer = UnpooledByteBufAllocator.DEFAULT.directBuffer(data.length + 100);
int i = 0;
- while(numChunkSections > 0){
+ int chunkY = 0;
+ while(primaryBitMask != 0){
+ while((primaryBitMask & 1) == 0){
+ primaryBitMask >>= 1;
+ chunkY++;
+ }
+
buffer.writeBytes(data, i, 2); // Block count
i += 2;
byte bitsPerBlock = data[i++];
buffer.writeByte(bitsPerBlock);
- if(bitsPerBlock < 4)
- bitsPerBlock = 4;
- else if(bitsPerBlock > 8){
- bitsPerBlock = 14;
- buffer.writeByte(data[++i]);
- }
- if(bitsPerBlock != 14){
+ if(bitsPerBlock < 9){
int paletteLength = ITechHider.readVarInt(data, i);
int paletteLengthLength = ITechHider.readVarIntLength(data, i);
buffer.writeBytes(data, i, paletteLengthLength);
@@ -115,30 +130,48 @@ public class TechHider_14 {
int blockId = ITechHider.readVarInt(data, i);
int actPaletteLength = ITechHider.readVarIntLength(data, i);
- if(Config.HiddenBlocks.contains(blockId)){
- byte[] a = ITechHider.writeVarInt(Config.ObfuscateWith);
- buffer.writeBytes(a);
+ if(hiddenBlockIds.contains(blockId)){
+ buffer.writeBytes(ITechHider.writeVarInt(obfuscateWith));
changed = true;
}else{
buffer.writeBytes(data, i, actPaletteLength);
}
i += actPaletteLength;
}
+
+ //We modify only the chunk palette for performance reasons
int dataArrayLength = ITechHider.readVarInt(data, i);
int dataArrayLengthLength = ITechHider.readVarIntLength(data, i);
buffer.writeBytes(data, i, dataArrayLength * 8 + dataArrayLengthLength);
i += dataArrayLengthLength;
i += dataArrayLength * 8;
}else{
+ //Full Chunk/no palette, so the chunk has to be crawled through
int dataArrayLength = ITechHider.readVarInt(data, i);
int dataArrayLengthLength = ITechHider.readVarIntLength(data, i);
- buffer.writeBytes(data, i, dataArrayLength*8 + dataArrayLengthLength);
+ buffer.writeBytes(data, i, dataArrayLengthLength);
i += dataArrayLengthLength;
+
+ ByteBuffer source = ByteBuffer.wrap(data, i, dataArrayLength * 8);
+ VariableValueArray values = new VariableValueArray(bitsPerBlock, dataArrayLength, source.asLongBuffer());
+
+ for(int pos = 0; pos < 4096; pos++){
+ if(hiddenBlockIds.contains(values.get(pos))){
+ changed = true;
+ values.set(pos, obfuscateWith);
+ }
+ }
+
+ for(long l : values.backing)
+ buffer.writeLong(l);
+
i += dataArrayLength * 8;
}
- numChunkSections--;
+
+ primaryBitMask >>= 1;
+ chunkY++;
}
- buffer.writeBytes(data, i, data.length - i);
+ buffer.writeBytes(data, i, data.length - i); // MC appends a 0 byte at the end if there is a full chunk, idk why
if(changed){
data = new byte[buffer.readableBytes()];
@@ -146,6 +179,48 @@ public class TechHider_14 {
byteArray.write(0, data);
}
}
- }).start(ITechHider.threadMultiplier * 4);
+ };
+ }
+
+ private static final class VariableValueArray {
+ private final long[] backing;
+ private final int bitsPerValue;
+ private final long valueMask;
+
+ public VariableValueArray(int bitsPerEntry, int dataArrayLength, LongBuffer buffer) {
+ this.bitsPerValue = bitsPerEntry;
+ this.backing = new long[dataArrayLength];
+ buffer.get(backing);
+ this.valueMask = (1L << this.bitsPerValue) - 1;
+ }
+
+ public int get(int index) {
+ index *= bitsPerValue;
+ int i0 = index >> 6;
+ int i1 = index & 0x3f;
+
+ long value = backing[i0] >>> i1;
+
+ // The value is divided over two long values
+ if (i1 + bitsPerValue > 64) {
+ value |= backing[++i0] << 64 - i1;
+ }
+
+ return (int) (value & valueMask);
+ }
+
+ public void set(int index, int value) {
+ index *= bitsPerValue;
+ int i0 = index >> 6;
+ int i1 = index & 0x3f;
+
+ backing[i0] = this.backing[i0] & ~(this.valueMask << i1) | (value & valueMask) << i1;
+ int i2 = i1 + bitsPerValue;
+ // The value is divided over two long values
+ if (i2 > 64) {
+ i0++;
+ backing[i0] = backing[i0] & -(1L << i2 - 64) | value >> 64 - i1;
+ }
+ }
}
}
diff --git a/FightSystem_15/src/de/steamwar/fightsystem/fight/FightWorld_15.java b/FightSystem_15/src/de/steamwar/fightsystem/fight/FightWorld_15.java
new file mode 100644
index 0000000..cac3956
--- /dev/null
+++ b/FightSystem_15/src/de/steamwar/fightsystem/fight/FightWorld_15.java
@@ -0,0 +1,48 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import de.steamwar.core.events.ChunkListener;
+import net.minecraft.server.v1_15_R1.Chunk;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
+import org.bukkit.entity.Player;
+
+class FightWorld_15 {
+ private FightWorld_15(){}
+
+ static void resetChunk(World world, World backup, int x, int z){
+ net.minecraft.server.v1_15_R1.World w = ((CraftWorld) world).getHandle();
+ Chunk chunk = w.getChunkAt(x, z);
+ Chunk backupChunk = ((CraftWorld) backup).getHandle().getChunkAt(x, z);
+
+ System.arraycopy(backupChunk.getSections(), 0, chunk.getSections(), 0, chunk.getSections().length);
+ w.tileEntityListTick.removeAll(chunk.tileEntities.values());
+ w.tileEntityList.removeAll(chunk.tileEntities.values());
+ chunk.tileEntities.clear();
+ chunk.tileEntities.putAll(backupChunk.tileEntities);
+ chunk.heightMap.clear();
+ chunk.heightMap.putAll(backupChunk.heightMap);
+ for(Player p : Bukkit.getOnlinePlayers()){
+ ChunkListener.sendChunk(p, x, z);
+ }
+ }
+}
diff --git a/FightSystem_15/src/de/steamwar/fightsystem/listener/PersonalKitCreator_15.java b/FightSystem_15/src/de/steamwar/fightsystem/listener/PersonalKitCreator_15.java
index 9eb6d42..eec0197 100644
--- a/FightSystem_15/src/de/steamwar/fightsystem/listener/PersonalKitCreator_15.java
+++ b/FightSystem_15/src/de/steamwar/fightsystem/listener/PersonalKitCreator_15.java
@@ -25,9 +25,9 @@ import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.Set;
-class PersonalKitCreator_15 {
+public class PersonalKitCreator_15 {
- static boolean hasItems(ItemStack stack){
+ public static boolean hasItems(ItemStack stack){
Set keys = new HashSet<>(CraftItemStack.asNMSCopy(stack).getTag().getKeys());
keys.remove("Enchantments");
keys.remove("Damage");
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 576a8f9..e5d5e03 100644
--- a/FightSystem_15/src/de/steamwar/fightsystem/utils/TechHider_15.java
+++ b/FightSystem_15/src/de/steamwar/fightsystem/utils/TechHider_15.java
@@ -1,6 +1,6 @@
-/*
+/*
This file is a part of the SteamWar software.
-
+
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
@@ -19,187 +19,36 @@
package de.steamwar.fightsystem.utils;
-import com.comphenix.protocol.PacketType;
-import com.comphenix.protocol.ProtocolLibrary;
-import com.comphenix.protocol.events.PacketAdapter;
-import com.comphenix.protocol.events.PacketContainer;
-import com.comphenix.protocol.events.PacketEvent;
-import com.comphenix.protocol.reflect.StructureModifier;
-import com.comphenix.protocol.wrappers.nbt.NbtBase;
-import com.comphenix.protocol.wrappers.nbt.NbtCompound;
import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.IFightSystem;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.UnpooledByteBufAllocator;
-import org.bukkit.entity.Player;
+import net.minecraft.server.v1_15_R1.*;
-import java.nio.ByteBuffer;
-import java.nio.LongBuffer;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
-import static de.steamwar.fightsystem.utils.ITechHider.bypass;
-
-public class TechHider_15 {
+class TechHider_15 {
private TechHider_15(){}
- static void start(){
- chunkHider();
+ static Set getHiddenBlockIds() {
+ Set hiddenBlockIds = new HashSet<>();
+ for(String tag : Config.HiddenBlocks){
+ for(IBlockData data : IRegistry.BLOCK.get(new MinecraftKey(tag)).getStates().a()){
+ 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;
}
- static void chunkHider(){
- /*
- * Bevor editing this function read and understand: https://wiki.vg/Chunk_Format
- * */
- ProtocolLibrary.getProtocolManager().getAsynchronousManager().registerAsyncHandler(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.MAP_CHUNK) {
- @Override
- public void onPacketSending(PacketEvent e) {
- PacketContainer packet = e.getPacket();
- StructureModifier ints = packet.getIntegers();
-
- int chunkX = ints.read(0);
- int chunkZ = ints.read(1);
- Player p = e.getPlayer();
- if(bypass(p, chunkX, chunkZ))
- return;
-
- packet = packet.shallowClone();
- e.setPacket(packet);
- StructureModifier>> list = packet.getListNbtModifier();
- List> nmsTags = list.read(0);
- boolean changed = false;
- for(int i = nmsTags.size() - 1; i >= 0; i--){
- NbtBase> nbtBase = nmsTags.get(i);
- assert nbtBase instanceof NbtCompound;
- NbtCompound nbt = (NbtCompound) nbtBase;
- if(Config.HiddenBlockEntities.contains(nbt.getString("id"))){
- nmsTags.remove(i);
- changed = true;
- }
- }
- if(changed){
- list.write(0, nmsTags);
- }
-
- changed = false;
- StructureModifier byteArray = packet.getByteArrays();
- int primaryBitMask = ints.read(2);
- byte[] data = byteArray.read(0);
- ByteBuf buffer = UnpooledByteBufAllocator.DEFAULT.directBuffer(data.length + 100);
- int i = 0;
-
- int chunkY = 0;
- while(primaryBitMask != 0){
- while((primaryBitMask & 1) == 0){
- primaryBitMask >>= 1;
- chunkY++;
- }
-
- buffer.writeBytes(data, i, 2); // Block count
- i += 2;
- byte bitsPerBlock = data[i++];
- buffer.writeByte(bitsPerBlock);
-
- if(bitsPerBlock < 9){
- int paletteLength = ITechHider.readVarInt(data, i);
- int paletteLengthLength = ITechHider.readVarIntLength(data, i);
- buffer.writeBytes(data, i, paletteLengthLength);
- i += paletteLengthLength;
- for(int actPaletteId = 0; actPaletteId < paletteLength; actPaletteId++){
- int blockId = ITechHider.readVarInt(data, i);
- int actPaletteLength = ITechHider.readVarIntLength(data, i);
-
- if(Config.HiddenBlocks.contains(blockId)){
- byte[] a = ITechHider.writeVarInt(Config.ObfuscateWith);
- buffer.writeBytes(a);
- changed = true;
- }else{
- buffer.writeBytes(data, i, actPaletteLength);
- }
- i += actPaletteLength;
- }
-
- //We modify only the chunk palette for performance reasons
- int dataArrayLength = ITechHider.readVarInt(data, i);
- int dataArrayLengthLength = ITechHider.readVarIntLength(data, i);
- buffer.writeBytes(data, i, dataArrayLength * 8 + dataArrayLengthLength);
- i += dataArrayLengthLength;
- i += dataArrayLength * 8;
- }else{
- //Full Chunk/no palette, so the chunk has to be crawled through
- int dataArrayLength = ITechHider.readVarInt(data, i);
- int dataArrayLengthLength = ITechHider.readVarIntLength(data, i);
- buffer.writeBytes(data, i, dataArrayLengthLength);
- i += dataArrayLengthLength;
-
- ByteBuffer source = ByteBuffer.wrap(data, i, dataArrayLength * 8);
- VariableValueArray values = new VariableValueArray(bitsPerBlock, dataArrayLength, source.asLongBuffer());
-
- for(int pos = 0; pos < 4096; pos++){
- if(Config.HiddenBlocks.contains(values.get(pos))){
- changed = true;
- values.set(pos, Config.ObfuscateWith);
- }
- }
-
- for(long l : values.backing)
- buffer.writeLong(l);
-
- i += dataArrayLength * 8;
- }
-
- primaryBitMask >>= 1;
- chunkY++;
- }
- buffer.writeBytes(data, i, data.length - i); // MC appends a 0 byte at the end if there is a full chunk, idk why
-
- if(changed){
- data = new byte[buffer.readableBytes()];
- buffer.readBytes(data);
- byteArray.write(0, data);
- }
- }
- }).start(ITechHider.threadMultiplier * 4);
- }
-
- private static final class VariableValueArray {
- private final long[] backing;
- private final int bitsPerValue;
- private final long valueMask;
-
- public VariableValueArray(int bitsPerEntry, int dataArrayLength, LongBuffer buffer) {
- this.bitsPerValue = bitsPerEntry;
- this.backing = new long[dataArrayLength];
- buffer.get(backing);
- this.valueMask = (1L << this.bitsPerValue) - 1;
- }
-
- public int get(int index) {
- index *= bitsPerValue;
- int i0 = index >> 6;
- int i1 = index & 0x3f;
-
- long value = backing[i0] >>> i1;
-
- // The value is divided over two long values
- if (i1 + bitsPerValue > 64) {
- value |= backing[++i0] << 64 - i1;
- }
-
- return (int) (value & valueMask);
- }
-
- public void set(int index, int value) {
- index *= bitsPerValue;
- int i0 = index >> 6;
- int i1 = index & 0x3f;
-
- backing[i0] = this.backing[i0] & ~(this.valueMask << i1) | (value & valueMask) << i1;
- int i2 = i1 + bitsPerValue;
- // The value is divided over two long values
- if (i2 > 64) {
- i0++;
- backing[i0] = backing[i0] & -(1L << i2 - 64) | value >> 64 - i1;
- }
- }
+ static int getObfuscateWith() {
+ return Block.getCombinedId(IRegistry.BLOCK.get(new MinecraftKey(Config.ObfuscateWith)).getBlockData());
}
}
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 5759ed1..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,32 +19,36 @@
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;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.world.World;
import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.utils.Region;
import de.steamwar.sql.NoClipboardException;
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.Set;
-class FightTeam_8 {
+public class FightTeam_8 {
private FightTeam_8(){}
@SuppressWarnings("deprecation")
@@ -72,9 +76,8 @@ class FightTeam_8 {
}
@SuppressWarnings("deprecation")
- static void replaceTeamColor(EditSession e, DyeColor c, int cornerX, int cornerY, int cornerZ){
- Vector corner = new Vector(cornerX, cornerY, cornerZ);
- CuboidRegion region = new CuboidRegion(corner, corner.add(Config.SchemsizeX, Config.SchemsizeY, Config.SchemsizeZ));
+ static void replaceTeamColor(EditSession e, DyeColor c, Region r){
+ CuboidRegion region = new CuboidRegion(new Vector(r.getMinX(), r.getMinY(), r.getMinZ()), new Vector(r.getMaxX(), r.getMaxY(), r.getMaxZ()));
try {
e.replaceBlocks(region, WOOL_SET, new BaseBlock(WOOL.getId(), c.getWoolData()));
e.replaceBlocks(region, CLAY_SET, new BaseBlock(CLAY.getId(), c.getWoolData()));
@@ -87,12 +90,10 @@ class FightTeam_8 {
e.flushQueue();
}
- static EditSession pasteSchematic(Schematic schematic, int pasteX, int pasteY, int pasteZ, boolean rotate) throws Schematic.WrongVersionException, IOException, NoClipboardException {
- Clipboard clipboard = schematic.load();
-
+ 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){
@@ -102,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()){
@@ -119,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_8/src/de/steamwar/fightsystem/fight/FightWorld_8.java b/FightSystem_8/src/de/steamwar/fightsystem/fight/FightWorld_8.java
new file mode 100644
index 0000000..e341167
--- /dev/null
+++ b/FightSystem_8/src/de/steamwar/fightsystem/fight/FightWorld_8.java
@@ -0,0 +1,47 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import de.steamwar.core.events.ChunkListener;
+import net.minecraft.server.v1_8_R3.Chunk;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_8_R3.CraftWorld;
+import org.bukkit.entity.Player;
+
+class FightWorld_8 {
+ private FightWorld_8(){}
+
+ static void resetChunk(World world, World backup, int x, int z){
+ net.minecraft.server.v1_8_R3.World w = ((CraftWorld) world).getHandle();
+ Chunk chunk = w.getChunkAt(x, z);
+ Chunk backupChunk = ((CraftWorld) backup).getHandle().getChunkAt(x, z);
+
+ System.arraycopy(backupChunk.getSections(), 0, chunk.getSections(), 0, chunk.getSections().length);
+ System.arraycopy(backupChunk.heightMap, 0, chunk.heightMap, 0, chunk.heightMap.length);
+ w.h.removeAll(chunk.tileEntities.values());
+ w.tileEntityList.removeAll(chunk.tileEntities.values());
+ chunk.tileEntities.clear();
+ chunk.tileEntities.putAll(backupChunk.tileEntities);
+ for(Player p : Bukkit.getOnlinePlayers()){
+ ChunkListener.sendChunk(p, x, z);
+ }
+ }
+}
diff --git a/FightSystem_8/src/de/steamwar/fightsystem/listener/PersonalKitCreator_8.java b/FightSystem_8/src/de/steamwar/fightsystem/listener/PersonalKitCreator_8.java
index 8f42599..aa34f31 100644
--- a/FightSystem_8/src/de/steamwar/fightsystem/listener/PersonalKitCreator_8.java
+++ b/FightSystem_8/src/de/steamwar/fightsystem/listener/PersonalKitCreator_8.java
@@ -25,9 +25,9 @@ import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.Set;
-class PersonalKitCreator_8 {
+public class PersonalKitCreator_8 {
- static boolean hasItems(ItemStack stack){
+ public static boolean hasItems(ItemStack stack){
Set keys = new HashSet<>(CraftItemStack.asNMSCopy(stack).getTag().c());
keys.remove("Enchantments");
keys.remove("Damage");
diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/WaterRemover_8.java b/FightSystem_8/src/de/steamwar/fightsystem/listener/WaterRemover_8.java
similarity index 96%
rename from FightSystem_8/src/de/steamwar/fightsystem/utils/WaterRemover_8.java
rename to FightSystem_8/src/de/steamwar/fightsystem/listener/WaterRemover_8.java
index a510557..4f7bab9 100644
--- a/FightSystem_8/src/de/steamwar/fightsystem/utils/WaterRemover_8.java
+++ b/FightSystem_8/src/de/steamwar/fightsystem/listener/WaterRemover_8.java
@@ -17,7 +17,7 @@
along with this program. If not, see .
*/
-package de.steamwar.fightsystem.utils;
+package de.steamwar.fightsystem.listener;
import org.bukkit.Material;
import org.bukkit.block.Block;
diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/TechHider_8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/TechHider_8.java
new file mode 100644
index 0000000..ccf7943
--- /dev/null
+++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/TechHider_8.java
@@ -0,0 +1,42 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.utils;
+
+import de.steamwar.fightsystem.Config;
+import org.bukkit.Material;
+
+import java.util.HashSet;
+import java.util.Set;
+
+class TechHider_8 {
+ private TechHider_8(){}
+
+ static Set getHiddenBlockIds() {
+ Set hiddenBlockIds = new HashSet<>();
+ for(String tag : Config.HiddenBlocks){
+ hiddenBlockIds.add(Material.matchMaterial(tag).getId() << 4);
+ }
+ return hiddenBlockIds;
+ }
+
+ static int getObfuscateWith() {
+ return Material.matchMaterial(Config.ObfuscateWith).getId() << 4;
+ }
+}
diff --git a/FightSystem_9/src/de/steamwar/fightsystem/fight/FightWorld_9.java b/FightSystem_9/src/de/steamwar/fightsystem/fight/FightWorld_9.java
new file mode 100644
index 0000000..06bdcc5
--- /dev/null
+++ b/FightSystem_9/src/de/steamwar/fightsystem/fight/FightWorld_9.java
@@ -0,0 +1,47 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import de.steamwar.core.events.ChunkListener;
+import net.minecraft.server.v1_9_R2.Chunk;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_9_R2.CraftWorld;
+import org.bukkit.entity.Player;
+
+class FightWorld_9 {
+ private FightWorld_9(){}
+
+ static void resetChunk(World world, World backup, int x, int z){
+ net.minecraft.server.v1_9_R2.World w = ((CraftWorld) world).getHandle();
+ Chunk chunk = w.getChunkAt(x, z);
+ Chunk backupChunk = ((CraftWorld) backup).getHandle().getChunkAt(x, z);
+
+ System.arraycopy(backupChunk.getSections(), 0, chunk.getSections(), 0, chunk.getSections().length);
+ System.arraycopy(backupChunk.heightMap, 0, chunk.heightMap, 0, chunk.heightMap.length);
+ w.tileEntityListTick.removeAll(chunk.tileEntities.values());
+ w.tileEntityList.removeAll(chunk.tileEntities.values());
+ chunk.tileEntities.clear();
+ chunk.tileEntities.putAll(backupChunk.tileEntities);
+ for(Player p : Bukkit.getOnlinePlayers()){
+ ChunkListener.sendChunk(p, x, z);
+ }
+ }
+}
diff --git a/FightSystem_9/src/de/steamwar/fightsystem/listener/PersonalKitCreator_9.java b/FightSystem_9/src/de/steamwar/fightsystem/listener/PersonalKitCreator_9.java
index 77b1002..956e46a 100644
--- a/FightSystem_9/src/de/steamwar/fightsystem/listener/PersonalKitCreator_9.java
+++ b/FightSystem_9/src/de/steamwar/fightsystem/listener/PersonalKitCreator_9.java
@@ -25,9 +25,9 @@ import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.Set;
-class PersonalKitCreator_9 {
+public class PersonalKitCreator_9 {
- static boolean hasItems(ItemStack stack){
+ public static boolean hasItems(ItemStack stack){
Set keys = new HashSet<>(CraftItemStack.asNMSCopy(stack).getTag().c());
keys.remove("Enchantments");
keys.remove("Damage");
diff --git a/FightSystem_API/src/de/steamwar/fightsystem/ArenaMode.java b/FightSystem_API/src/de/steamwar/fightsystem/ArenaMode.java
new file mode 100644
index 0000000..84e1a2c
--- /dev/null
+++ b/FightSystem_API/src/de/steamwar/fightsystem/ArenaMode.java
@@ -0,0 +1,49 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem;
+
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Set;
+
+public enum ArenaMode {
+ NORMAL,
+ RANKED,
+ EVENT,
+ TEST,
+ CHECK,
+ PREPARE;
+
+ public static final Set All = Collections.unmodifiableSet(EnumSet.allOf(ArenaMode.class));
+
+ public static final Set Normal = Collections.unmodifiableSet(EnumSet.of(NORMAL));
+ public static final Set Check = Collections.unmodifiableSet(EnumSet.of(CHECK));
+ public static final Set Event = Collections.unmodifiableSet(EnumSet.of(EVENT));
+ public static final Set Test = Collections.unmodifiableSet(EnumSet.of(TEST, CHECK));
+ public static final Set Ranked = Collections.unmodifiableSet(EnumSet.of(RANKED));
+ public static final Set Prepare = Collections.unmodifiableSet(EnumSet.of(PREPARE));
+
+ public static final Set AntiTest = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK)));
+ public static final Set AntiEvent = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(EVENT)));
+ public static final Set AntiPrepare = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(PREPARE)));
+ public static final Set VariableTeams = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(RANKED, EVENT)));
+ public static final Set RankedEvent = Collections.unmodifiableSet(EnumSet.of(RANKED, EVENT));
+ public static final Set Restartable = Collections.unmodifiableSet(EnumSet.of(NORMAL, RANKED));
+}
diff --git a/FightSystem_API/src/de/steamwar/fightsystem/Config.java b/FightSystem_API/src/de/steamwar/fightsystem/Config.java
index 7447e2c..06b2d83 100644
--- a/FightSystem_API/src/de/steamwar/fightsystem/Config.java
+++ b/FightSystem_API/src/de/steamwar/fightsystem/Config.java
@@ -19,13 +19,14 @@
package de.steamwar.fightsystem;
+import de.steamwar.fightsystem.utils.Region;
+import de.steamwar.fightsystem.winconditions.Winconditions;
import de.steamwar.sql.Event;
import de.steamwar.sql.EventFight;
import de.steamwar.sql.Team;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
-import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.util.Vector;
@@ -33,6 +34,7 @@ import org.bukkit.util.Vector;
import java.io.File;
import java.util.*;
import java.util.logging.Level;
+import java.util.stream.Collectors;
public class Config {
@@ -49,36 +51,22 @@ public class Config {
public static final List EnterStages;
//arena parameter
- public static final int SchemsizeX;
- public static final int SchemsizeY;
- public static final int SchemsizeZ;
- public static final int TeamBlueCornerX;
- public static final int TeamBlueCornerY;
- public static final int TeamBlueCornerZ;
- private static final int TeamBluePasteX;
- private static final int TeamBluePasteZ;
+ public static final Region BluePasteRegion;
+ public static final Region RedPasteRegion;
+ public static final Region BlueExtendRegion;
+ public static final Region RedExtendRegion;
+ public static final Region ArenaRegion;
+
public static final Location TeamBlueSpawn;
- public static final int TeamRedCornerX;
- public static final int TeamRedCornerY;
- public static final int TeamRedCornerZ;
- private static final int TeamRedPasteX;
- private static final int TeamRedPasteZ;
public static final Location TeamRedSpawn;
- private static final int TeamBluetoReddistanceX;
- private static final int TeamBluetoReddistanceY;
- public static final int TeamBluetoReddistanceZ;
public static final Location SpecSpawn;
- public static final int underArenaBorder;
- public static final int BorderFromSchematic;
- public static final int upperArenaBorder;
- public static final boolean AlignWater;
+
+ private static final int BlueToRedX;
+ private static final int BlueToRedY;
+ public static final int BlueToRedZ;
+
+ public static final int PreperationArea;
public static final int WaterDepth;
- private static final int Schem2BorderX;
- private static final int Schem2BorderZ;
- public static final int ArenaMinX;
- public static final int ArenaMinZ;
- public static final int ArenaMaxX;
- public static final int ArenaMaxZ;
public static final boolean GroundWalkable;
//schematic parameter
@@ -86,10 +74,10 @@ public class Config {
public static final boolean OnlyPublicSchematics;
public static final boolean IgnorePublicOnly;
public static final de.steamwar.sql.SchematicType SchematicType;
- public static final boolean TeamRedRotate;
- public static final boolean TeamBlueRotate;
- public static final boolean ReplaceObsidian;
- public static final boolean ReplaceBedrock;
+ 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;
//team parameter
@@ -104,16 +92,7 @@ public class Config {
public static final boolean Ranked;
//Active win conditions
- public static final boolean Timeout;
- public static final boolean HeartRatioTimeout;
- public static final boolean AllDead;
- public static final boolean CaptainDead;
- public static final boolean PercentSystem;
- public static final boolean RelativePercent;
- public static final boolean Points;
- public static final boolean TechKO;
- public static final boolean WaterTechKO;
- public static final boolean PumpkinTechKO;
+ public static final Set ActiveWinconditions;
//win condition parameters
public static final int TimeoutTime;
@@ -129,11 +108,9 @@ public class Config {
//tech hider parameter
public static final boolean TechhiderActive;
- public static final Set HiddenBlocks;
- public static final Set HiddenBlockTags;
+ public static final Set HiddenBlocks;
public static final Set HiddenBlockEntities;
- public static final int ObfuscateWith;
- public static final String ObfuscateWithTag;
+ public static final String ObfuscateWith;
//event parameter
private static final int EventKampfID;
@@ -145,6 +122,9 @@ public class Config {
//check parameter
public static final int CheckSchemID;
+ public static final int PrepareSchemID;
+
+ public static final ArenaMode mode;
//live recorder parameter
public static final String spectateIP = "127.0.0.1";
@@ -154,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);
@@ -171,47 +151,38 @@ public class Config {
PreFightDuration = config.getInt("Times.PreFightDuration");
SpectatorDuration = config.getInt("Times.SpectatorDuration");
- int schemsizeX = worldconfig.getInt("Arena.Schemsize.x");
- int schemsizeY = worldconfig.getInt("Arena.Schemsize.y");
- int schemsizeZ = worldconfig.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");
- Schem2BorderX = worldconfig.getInt("Arena.Schem2Border.x");
- Schem2BorderZ = worldconfig.getInt("Arena.Schem2Border.z");
- underArenaBorder = worldconfig.getInt("Arena.underArenaBorder");
- BorderFromSchematic = worldconfig.getInt("Arena.BorderFromSchematic");
- AlignWater = worldconfig.getBoolean("Arena.AlignWater");
- WaterDepth = worldconfig.getInt("Arena.WaterDepth");
+ 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 schem2BorderX = config.getInt("Arena.Schem2Border.x");
+ int schem2BorderZ = config.getInt("Arena.Schem2Border.z");
+ 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");
- ReplaceObsidian = config.getBoolean("Schematic.ReplaceObsidian");
- ReplaceBedrock = config.getBoolean("Schematic.ReplaceBedrock");
+ PasteAligned = config.getBoolean("Schematic.PasteAligned");
+ ReplaceObsidianBedrock = config.getBoolean("Schematic.ReplaceObsidianBedrock");
ReplaceWithBlockupdates = config.getBoolean("Schematic.ReplaceWithBlockupdates");
GameName = config.getString("Output.GameName");
TeamChatDetection = config.getString("Output.TeamChatDetection");
- Timeout = config.getBoolean("WinConditions.Timeout");
- HeartRatioTimeout = config.getBoolean("WinConditions.HeartRatioTimeout");
- AllDead = config.getBoolean("WinConditions.AllDead");
- CaptainDead = config.getBoolean("WinConditions.CaptainDead");
- PercentSystem = config.getBoolean("WinConditions.PercentSystem");
- RelativePercent = config.getBoolean("WinConditions.RelativePercent");
- Points = config.getBoolean("WinConditions.Points");
- TechKO = config.getBoolean("WinConditions.TechKO");
- WaterTechKO = config.getBoolean("WinConditions.WaterTechKO");
- PumpkinTechKO = config.getBoolean("WinConditions.PumpkinTechKO");
+ ActiveWinconditions = Collections.unmodifiableSet(config.getStringList("WinConditions").stream().map(Winconditions::valueOf).collect(Collectors.toSet()));
TimeoutTime = config.getInt("WinConditionParams.TimeoutTime");
PercentWin = config.getDouble("WinConditionParams.PercentWin");
@@ -223,113 +194,90 @@ public class Config {
MemberDefault = config.getString("Kits.MemberDefault");
LeaderDefault = config.getString("Kits.LeaderDefault");
PersonalKits = config.getBoolean("Kits.PersonalKits");
- ForbiddenItems = config.getStringList("Kits.ForbiddenItems");
+ ForbiddenItems = Collections.unmodifiableList(config.getStringList("Kits.ForbiddenItems"));
- ConfigurationSection techhiderConfig = config.getConfigurationSection("Techhider.HiddenBlocks");
- Set blocks = new HashSet<>();
- Set blockTags = new HashSet<>();
- for(String key : techhiderConfig.getKeys(false)){
- blockTags.add(key);
- if(techhiderConfig.isInt(key))
- blocks.add(techhiderConfig.getInt(key));
- else{
- List minmax = techhiderConfig.getIntegerList(key); // Entry 0: Minimum, Entry 1: Maximum
- for(int i = minmax.get(0); i <= minmax.get(1); i++)
- blocks.add(i);
- }
-
- }
- HiddenBlocks = Collections.unmodifiableSet(blocks);
- HiddenBlockTags = Collections.unmodifiableSet(blockTags);
+ HiddenBlocks = Collections.unmodifiableSet(new HashSet<>(config.getStringList("Techhider.HiddenBlocks")));
HiddenBlockEntities = Collections.unmodifiableSet(new HashSet<>(config.getStringList("Techhider.HiddenBlockEntities")));
- ObfuscateWith = config.getInt("Techhider.ObfuscateWith");
- ObfuscateWithTag = config.getString("Techhider.ObfuscateWithTag");
+ ObfuscateWith = config.getString("Techhider.ObfuscateWith");
TechhiderActive = config.getBoolean("Techhider.Active");
if(schemsizeX < 0){
- SchemsizeX = -schemsizeX;
- TeamBlueCornerX = teamBlueCornerX - SchemsizeX;
- }else{
- SchemsizeX = schemsizeX;
- TeamBlueCornerX = teamBlueCornerX;
+ schemsizeX = -schemsizeX;
+ blueCornerX = blueCornerX - schemsizeX;
}
if(schemsizeY < 0){
- SchemsizeY = -schemsizeY;
- TeamBlueCornerY = teamBlueCornerY - SchemsizeY;
- }else{
- SchemsizeY = schemsizeY;
- TeamBlueCornerY = teamBlueCornerY;
+ schemsizeY = -schemsizeY;
+ blueCornerY = blueCornerY - schemsizeY;
}
if(schemsizeZ < 0){
- SchemsizeZ = -schemsizeZ;
- TeamBlueCornerZ = teamBlueCornerZ - SchemsizeZ;
- }else{
- SchemsizeZ = schemsizeZ;
- TeamBlueCornerZ = teamBlueCornerZ;
+ schemsizeZ = -schemsizeZ;
+ blueCornerZ = blueCornerZ - schemsizeZ;
}
- upperArenaBorder = TeamBlueCornerY + SchemsizeY + BorderFromSchematic;
- TeamRedCornerX = TeamBluetoReddistanceX + TeamBlueCornerX;
- TeamRedCornerY = TeamBluetoReddistanceY + TeamBlueCornerY;
- TeamRedCornerZ = TeamBluetoReddistanceZ + TeamBlueCornerZ;
+ int teamRedCornerX = BlueToRedX + blueCornerX;
+ int teamRedCornerY = BlueToRedY + blueCornerY;
+ int teamRedCornerZ = BlueToRedZ + blueCornerZ;
- TeamBluePasteX = TeamBlueCornerX + SchemsizeX / 2;
- TeamBluePasteZ = TeamBlueCornerZ + SchemsizeZ / 2;
- TeamRedPasteX = TeamBluePasteX + TeamBluetoReddistanceX;
- 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,
- TeamBluePasteZ + 0.5 + teamBlueSpawnOffsetZ);
+ teamBluePasteX + 0.5 + teamBlueSpawnOffsetX,
+ blueCornerY + 0.5 + teamBlueSpawnOffsetY,
+ teamBluePasteZ + 0.5 + teamBlueSpawnOffsetZ);
TeamRedSpawn = new Location(world,
- TeamRedPasteX + 0.5 - teamBlueSpawnOffsetX,
- TeamRedCornerY + 0.5 + teamBlueSpawnOffsetY,
- TeamRedPasteZ + 0.5 - teamBlueSpawnOffsetZ);
+ teamRedPasteX + 0.5 - teamBlueSpawnOffsetX,
+ teamRedCornerY + 0.5 + teamBlueSpawnOffsetY,
+ teamRedPasteZ + 0.5 - teamBlueSpawnOffsetZ);
+
+ SpecSpawn = new Location(world,
+ 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)));
double yaw = Math.toDegrees(v1.clone().setY(0).angle(new Vector(0, 0, 1)));
- double pitchInverted = pitch * -1;
- double yawInverted = yaw + 180;
- TeamBlueSpawn.setYaw((float) yawInverted);
+ TeamBlueSpawn.setYaw((float) yaw + 180);
TeamBlueSpawn.setPitch((float) pitch);
TeamRedSpawn.setYaw((float) yaw);
- TeamRedSpawn.setPitch((float) pitchInverted);
+ TeamRedSpawn.setPitch((float) pitch * -1);
- SpecSpawn = new Location(world,
- TeamBluePasteX + TeamBluetoReddistanceX/2.0,
- TeamBlueCornerY + TeamBluetoReddistanceY/2.0 + SchemsizeY/2.0,
- TeamBluePasteZ + TeamBluetoReddistanceZ/2.0);
boolean teamRedRotate;
boolean teamBlueRotate;
- if(TeamBluetoReddistanceX > 0){
- ArenaMinX = TeamBlueCornerX - Schem2BorderX;
- ArenaMaxX = TeamRedCornerX + SchemsizeX + Schem2BorderX;
+ int arenaMinX;
+ int arenaMaxX;
+ int arenaMinZ;
+ int arenaMaxZ;
+ if(BlueToRedX > 0){
+ arenaMinX = blueCornerX - schem2BorderX;
+ arenaMaxX = teamRedCornerX + schemsizeX + schem2BorderX;
teamRedRotate = true;
teamBlueRotate = false;
}else{
- ArenaMinX = TeamRedCornerX - Schem2BorderX;
- ArenaMaxX = TeamBlueCornerX + SchemsizeX + Schem2BorderX;
+ arenaMinX = teamRedCornerX - schem2BorderX;
+ arenaMaxX = blueCornerX + schemsizeX + schem2BorderX;
teamRedRotate = false;
teamBlueRotate = true;
}
- if(TeamBluetoReddistanceZ > 0){
- ArenaMinZ = TeamBlueCornerZ - Schem2BorderZ;
- ArenaMaxZ = TeamRedCornerZ + SchemsizeZ + 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){
+ arenaMinZ = teamRedCornerZ - schem2BorderZ;
+ arenaMaxZ = blueCornerZ + schemsizeZ + schem2BorderZ;
+ if(BlueToRedZ != 0){
teamRedRotate = false;
teamBlueRotate = true;
}
@@ -338,15 +286,24 @@ public class Config {
teamRedRotate = false;
teamBlueRotate = false;
}
- TeamRedRotate = teamRedRotate;
- TeamBlueRotate = teamBlueRotate;
+ RedRotate = teamRedRotate;
+ BlueRotate = teamBlueRotate;
+
+ int arenaYSize = blueCornerY - underBorder + schemsizeY + PreperationArea;
+
+ RedPasteRegion = new Region(teamRedCornerX, teamRedCornerY, teamRedCornerZ, schemsizeX, schemsizeY, schemsizeZ);
+ BluePasteRegion = new Region(blueCornerX, blueCornerY, blueCornerZ, schemsizeX, schemsizeY, schemsizeZ);
+
+ RedExtendRegion = new Region(teamRedCornerX, underBorder, teamRedCornerZ, schemsizeX, arenaYSize, schemsizeZ, PreperationArea, PreperationArea);
+ BlueExtendRegion = new Region(blueCornerX, underBorder, blueCornerZ, schemsizeX, arenaYSize, schemsizeZ, PreperationArea, PreperationArea);
+ ArenaRegion = new Region(arenaMinX, underBorder, arenaMinZ, arenaMaxX - arenaMinX, arenaYSize, arenaMaxZ - arenaMinZ);
EventKampfID = Integer.parseInt(System.getProperty("fightID", "0"));
- if(event()){
+ 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;
@@ -355,7 +312,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;
@@ -405,19 +362,28 @@ public class Config {
RedLeader = null;
CheckSchemID = Integer.parseInt(System.getProperty("checkSchemID", "0"));
+ PrepareSchemID = Integer.parseInt(System.getProperty("prepareSchemID", "0"));
Ranked = Boolean.parseBoolean(System.getProperty("ranked", "false"));
+
+ if(Ranked){
+ mode = ArenaMode.RANKED;
+ }else if(CheckSchemID != 0){
+ mode = ArenaMode.CHECK;
+ }else if(PrepareSchemID != 0){
+ mode = ArenaMode.PREPARE;
+ }else if(EventKampfID >= 1){
+ mode = ArenaMode.EVENT;
+ }else if(EventKampfID == -1){
+ mode = ArenaMode.TEST;
+ }else{
+ mode = ArenaMode.NORMAL;
+ }
}
- public static boolean event(){
- return EventKampfID >= 1;
- }
public static boolean test(){
- return EventKampfID == -1;
- }
- public static boolean check(){
- return CheckSchemID != 0;
+ return ArenaMode.Test.contains(mode);
}
public static boolean recording(){
- return event();
+ 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/ITechHider.java b/FightSystem_API/src/de/steamwar/fightsystem/utils/ITechHider.java
index 4d1f185..ade4044 100644
--- a/FightSystem_API/src/de/steamwar/fightsystem/utils/ITechHider.java
+++ b/FightSystem_API/src/de/steamwar/fightsystem/utils/ITechHider.java
@@ -19,92 +19,34 @@
package de.steamwar.fightsystem.utils;
-import com.comphenix.protocol.events.PacketContainer;
import com.google.common.primitives.Bytes;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.IFightSystem;
import de.steamwar.fightsystem.fight.IFight;
import de.steamwar.fightsystem.fight.IFightTeam;
-import org.bukkit.Bukkit;
-import org.bukkit.Material;
import org.bukkit.entity.Player;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
public class ITechHider {
private ITechHider (){}
- static final Map packetCache = new HashMap<>();
- static final Material obfuscateMaterial;
- static final int threadMultiplier;
- static final int arenaMinX;
- static final int arenaMaxX;
- static final int arenaMinZ;
- static final int arenaMaxZ;
-
- private static final int blueMinX;
- private static final int blueMaxX;
- private static final int blueMinZ;
- private static final int blueMaxZ;
- private static final int redMinX;
- private static final int redMaxX;
- private static final int redMinZ;
- private static final int redMaxZ;
-
- static{
- int areaExtension = Config.EnterStages.isEmpty() ? Config.BorderFromSchematic : 0;
- blueMinX = ITechHider.posToChunk(Config.TeamBlueCornerX - areaExtension);
- blueMaxX = ITechHider.posToChunk(Config.TeamBlueCornerX + Config.SchemsizeX + areaExtension) + 1;
- blueMinZ = ITechHider.posToChunk(Config.TeamBlueCornerZ - areaExtension);
- blueMaxZ = ITechHider.posToChunk(Config.TeamBlueCornerZ + Config.SchemsizeZ + areaExtension) + 1;
- redMinX = ITechHider.posToChunk(Config.TeamRedCornerX - areaExtension);
- redMaxX = ITechHider.posToChunk(Config.TeamRedCornerX + Config.SchemsizeX + areaExtension) + 1;
- redMinZ = ITechHider.posToChunk(Config.TeamRedCornerZ - areaExtension);
- redMaxZ = ITechHider.posToChunk(Config.TeamRedCornerZ + Config.SchemsizeZ + areaExtension) + 1;
- arenaMinX = ITechHider.posToChunk(Config.ArenaMinX);
- arenaMaxX = ITechHider.posToChunk(Config.ArenaMaxX) + 1;
- arenaMinZ = ITechHider.posToChunk(Config.ArenaMinZ);
- arenaMaxZ = ITechHider.posToChunk(Config.ArenaMaxZ) + 1;
-
- obfuscateMaterial = Material.getMaterial(Config.ObfuscateWithTag);
- Bukkit.getScheduler().runTaskTimer(IFightSystem.getPlugin(), packetCache::clear, 1, 1);
-
- if(Config.event())
- threadMultiplier = 4;
- else
- threadMultiplier = 1;
- }
-
static boolean bypass(Player p, int chunkX, int chunkZ){
if(p == IFightSystem.getEventLeiter())
return true;
IFightTeam ft = IFight.getPlayerTeam(p);
if(ft == null){
- //Außerhalb der Arena
- return arenaMinX > chunkX ||
- chunkX > arenaMaxX ||
- arenaMinZ > chunkZ ||
- chunkZ > arenaMaxZ;
+ return Config.ArenaRegion.chunkOutside(chunkX, chunkZ);
}else if(ft.isBlue()){
- return ft.canPlayerEntern(p) ||
- redMinX > chunkX ||
- chunkX > redMaxX ||
- redMinZ > chunkZ ||
- chunkZ > redMaxZ;
+ return ft.canPlayerEntern(p) || Config.RedExtendRegion.chunkOutside(chunkX, chunkZ);
}else{
- return ft.canPlayerEntern(p) ||
- blueMinX > chunkX ||
- chunkX > blueMaxX ||
- blueMinZ > chunkZ ||
- chunkZ > blueMaxZ;
+ return ft.canPlayerEntern(p) || Config.BlueExtendRegion.chunkOutside(chunkX, chunkZ);
}
}
- static int posToChunk(int c){
+ public static int posToChunk(int c){
int chunk = c / 16;
if(c<0)
chunk--;
diff --git a/FightSystem_API/src/de/steamwar/fightsystem/utils/Region.java b/FightSystem_API/src/de/steamwar/fightsystem/utils/Region.java
new file mode 100644
index 0000000..470b8d0
--- /dev/null
+++ b/FightSystem_API/src/de/steamwar/fightsystem/utils/Region.java
@@ -0,0 +1,153 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.utils;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.block.Block;
+
+import java.util.function.ObjIntConsumer;
+import java.util.logging.Level;
+
+public class Region {
+
+ private final int minX;
+ private final int minY;
+ private final int minZ;
+ private final int maxX;
+ private final int maxY;
+ private final int maxZ;
+
+ public Region(int minX, int minY, int minZ, int sizeX, int sizeY, int sizeZ, int extendX, int extendZ) {
+ this(minX - extendX, minY, minZ - extendZ,
+ sizeX + extendX * 2, sizeY, sizeZ + extendZ * 2);
+ }
+
+ public Region(int minX, int minY, int minZ, int sizeX, int sizeY, int sizeZ) {
+ Bukkit.getLogger().log(Level.INFO, minX + " " + minY + " " + minZ + " " + sizeX + " " + sizeY + " " + sizeZ);
+ this.minX = minX;
+ this.minY = minY;
+ this.minZ = minZ;
+ this.maxX = minX + sizeX;
+ this.maxY = minY + sizeY;
+ this.maxZ = minZ + sizeZ;
+ }
+
+ public int getMinX() {
+ return minX;
+ }
+
+ public int getMinY() {
+ return minY;
+ }
+
+ public int getMinZ() {
+ return minZ;
+ }
+
+ public int getMaxX() {
+ return maxX;
+ }
+
+ public int getMaxY() {
+ return maxY;
+ }
+
+ public int getMaxZ() {
+ return maxZ;
+ }
+
+ public double posToChunk(int pos){
+ return pos / 16.0;
+ }
+
+ private int getMinChunkX(){
+ return (int) Math.floor(posToChunk(minX));
+ }
+
+ private int getMaxChunkX(){
+ return (int) Math.ceil(posToChunk(maxX));
+ }
+
+ private int getMinChunkZ(){
+ return (int) Math.floor(posToChunk(minZ));
+ }
+
+ private int getMaxChunkZ(){
+ return (int) Math.ceil(posToChunk(maxZ));
+ }
+
+ public boolean chunkOutside(int cX, int cZ) {
+ return getMinChunkX() > cX || cX > getMaxChunkX() ||
+ getMinChunkZ() > cZ || cZ > getMaxChunkZ();
+ }
+
+ public void forEachChunk(ObjIntConsumer executor) {
+ for(int x = getMinChunkX(); x <= getMaxChunkX(); x++)
+ for(int z = getMinChunkZ(); z <= getMaxChunkZ(); z++)
+ executor.accept(x, z);
+ }
+
+ public void forEach(TriConsumer executor) {
+ for(int x = minX; x < maxX; x++) {
+ for(int y = minY; y < maxY; y++) {
+ for (int z = minZ; z <= maxZ; z++) {
+ executor.accept(x, y, z);
+ }
+ }
+ }
+ }
+
+ public int volume(){
+ return (maxX - minX) * (maxY - minY) * (maxZ - minZ);
+ }
+
+ public int centerX() {
+ return (maxX - minX) / 2 + minX;
+ }
+
+ public int centerZ() {
+ return (maxZ - minZ) / 2 + minZ;
+ }
+
+ public boolean in2dRegion(Location location){
+ return minX <= location.getX() && location.getX() < maxX && minZ <= location.getZ() && location.getZ() <= maxZ;
+ }
+
+ public boolean inRegion(Location location){
+ return in2dRegion(location) && minY < location.getY() && location.getY() < maxY;
+ }
+
+ public boolean playerInRegion(Location location){
+ return in2dRegion(location) && minY <= location.getY() && location.getY() + 1.8 < maxY;
+ }
+
+ public boolean in2dRegion(Block block){
+ return minX <= block.getX() && block.getX() < maxX && minZ <= block.getZ() && block.getZ() <= maxZ;
+ }
+
+ 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_API/src/de/steamwar/fightsystem/winconditions/Winconditions.java b/FightSystem_API/src/de/steamwar/fightsystem/winconditions/Winconditions.java
new file mode 100644
index 0000000..0394ee7
--- /dev/null
+++ b/FightSystem_API/src/de/steamwar/fightsystem/winconditions/Winconditions.java
@@ -0,0 +1,34 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.winconditions;
+
+public enum Winconditions {
+ TIMEOUT,
+ HEART_RATIO_TIMEOUT,
+ PERCENT_TIMEOUT,
+ ALL_DEAD,
+ CAPTAIN_DEAD,
+ PERCENT_SYSTEM,
+ RELATIVE_PERCENT,
+ POINTS,
+ TIME_TECH_KO,
+ WATER_TECH_KO,
+ PUMPKIN_TECH_KO
+}
diff --git a/FightSystem_Main/src/config.yml b/FightSystem_Main/src/config.yml
index 7b64223..ed8dafb 100644
--- a/FightSystem_Main/src/config.yml
+++ b/FightSystem_Main/src/config.yml
@@ -1,90 +1,150 @@
Times:
- NoPlayersOnlineDuration: 300
+ # Time in seconds the server stops after starting if nobody joins
+ NoPlayersOnlineDuration: 30
+ # Time in seconds the team leaders have to choose their schematic
PreSchemPasteDuration: 120
+ # Time in seconds for preparing
SetupDuration: 300
+ # Time in seconds the final countdown is long
PreFightDuration: 30
+ # Time in seconds to spectate the arena after the fight
SpectatorDuration: 30
+
+Arena:
+ # The amount of blocks the schematics should be pasted under the surface
+ WaterDepth: 0
+ # The size of the schematics
+ Schemsize:
+ x: 0
+ y: 0
+ z: 0
+ # The outer border of the arena, measured in blocks around the schematic areas
+ Schem2Border:
+ x: 0
+ z: 0
+ # The size of the team areas are expanded around the schematics
+ BorderFromSchematic: 0
+ # If ground walkable, teams can walk below the lower arena border during setup
+ GroundWalkable: true
+
Schematic:
- OnlyPublicSchematics: false
+ # If the rank system for the schematics should be enabled
+ RanksEnabled: false
+ # The schematic type that can be chosen in this arena
SchematicType: normal
+ # If the schematics should be rotated during pasting
Rotate: true
- ReplaceObsidian: false
- ReplaceBedrock: false
+ # If only public schematics are allowed
+ OnlyPublicSchematics: false
+ # If the public only force should be completly disabled
+ IgnorePublicOnly: false
+ # If obsidian and bedrock should be replaced during PRE_RUNNING
+ ReplaceObsidianBedrock: false
+ # If the replacement should happen with blockupdates
+ ReplaceWithBlockupdates: false
+
Output:
+ # Name of the "Red" team
TeamRedName: Rot
+ # Color prefix of the "Red" team
TeamRedPrefix: '§c'
+ # Name of the "Blue" team
TeamBlueName: Blau
+ # Color of the "Blue" team
TeamBluePrefix: '§3'
- GameName: War*
+ # The name of the gamemode presented to the players
+ GameName: NoGear
+ # The prefix used for team chats
TeamChatDetection: +
+
+# The list of active winconditions
WinConditions:
- Timeout: true
- AllDead: true
- CaptainDead: false
- PercentSystem: false
- RelativePercent: false
- Points: false
- Entern: false
- TechKO: false
- WaterTechKO: false
- HeartRatioTimeout: false
- PumpkinTechKO: false
+ - TIMEOUT
+ # - HEART_RATIO_TIMEOUT
+ # - PERCENT_TIMEOUT
+
+ - ALL_DEAD
+ # - CAPTAIN_DEAD
+
+ # - PERCENT_SYSTEM
+ # - RELATIVE_PERCENT
+ # - POINTS
+
+ - WATER_TECH_KO
+ # - TIME_TECH_KO
+ # - PUMPKIN_TECH_KO
+
WinConditionParams:
+ # The time of any of the timeout winconditions in seconds
TimeoutTime: 1200
- EnterPhaseBegin: 600
+ # The percentage when any of the percent winconditions limits or triggers a win
PercentWin: 5.0
+ # Blocks ignored by the percent winconditions
IgnoredBlocks:
- AIR
- WATER
- TNT
- OBSIDIAN
+
Kits:
+ # The kit file for this configuration
+ File: kits.yml
+ # The default kit for team members
MemberDefault: default
+ # The default kit for team leaders
LeaderDefault: default
+ # If the personal kit system is active
PersonalKits: false
+ # Items that are not allowed in the personal kit
ForbiddenItems: []
+
+# A list of integers containing the waiting time of this enter stage in the fight
+EnterStages: []
+
Techhider:
- ObfuscateWith: 121
- ObfuscateWithTag: ENDER_STONE
+ # if the techhider is active
+ Active: true
+ # Which block the techhider replaces to.
+ ObfuscateWith: end_stone
+ # A list of all hidden blocks. "water" results in the hiding of all waterlogged blocks as well.
HiddenBlocks:
- BEDROCK: 7
- WATER: 8
- STATIONARY_WATER: 9
- NOTE_BLOCK: 25
- DETECTOR_RAIL: 28
- PISTON_BASE: 33
- PISTON_EXTENSION: 34
- PISTON_STICKY_BASE: 29
- POWERED_RAIL: 27
- TNT: 46
- OBSIDIAN: 49
- CHEST: 54
- REDSTONE_WIRE: 55
- STONE_PLATE: 70
- IRON_DOOR_BLOCK: 71
- WOOD_PLATE: 72
- REDSTONE_TORCH_OFF: 75
- REDSTONE_TORCH_ON: 76
- STONE_BUTTON: 77
- DIODE_BLOCK_OFF: 93
- DIODE_BLOCK_ON: 94
- BREWING_STAND: 117
- TRIPWIRE_HOOK: 131
- TRIPWIRE: 132
- WOOD_BUTTON: 143
- TRAPPED_CHEST: 146
- GOLD_PLATE: 147
- IRON_PLATE: 148
- REDSTONE_COMPARATOR_OFF: 149
- REDSTONE_COMPARATOR_ON: 150
- REDSTONE_BLOCK: 152
- HOPPER: 154
- ACTIVATOR_RAIL: 157
- DROPPER: 158
- SLIME_BLOCK: 165
- IRON_TRAPDOOR: 167
- OBSERVER: 218
- LEVER: 69
+ - water
+ - note_block
+ - powered_rail
+ - detector_rail
+ - piston
+ - piston_head
+ - sticky_piston
+ - tnt
+ - chest
+ - trapped_chest
+ - redstone_wire
+ - stone_pressure_plate
+ - iron_door
+ - oak_pressure_plate
+ - spruce_pressure_plate
+ - birch_pressure_plate
+ - jungle_pressure_plate
+ - acacia_pressure_plate
+ - dark_oak_pressure_plate
+ - redstone_torch
+ - redstone_wall_torch
+ - repeater
+ - brewing_stand
+ - tripwire_hook
+ - tripwire
+ - heavy_weighted_pressure_plate
+ - light_weighted_pressure_plate
+ - comparator
+ - redstone_block
+ - hopper
+ - activator_rail
+ - dropper
+ - slime_block
+ - observer
+ - honey_block
+ - lever
+ # The block entities that are hidden (contents of blocks)
HiddenBlockEntites:
- minecraft:sign
- minecraft:dispenser
@@ -98,22 +158,22 @@ Techhider:
- minecraft:jukebox
- minecraft:comparator
-# Muss in config.yml des Weltordners gesetzt werden
-Arena:
- Schemsize:
- x: 0
- y: 0
- z: 0
- TeamBlueCorner:
- x: 0
- y: 0
- z: 0
- TeamBluetoReddistance:
- x: 0
- y: 0
- z: 0
- Schem2Border:
- x: 0
- z: 0
- underArenaBorder: 0
- BorderFromSchematic: 0
\ No newline at end of file
+# The following configuration must be in the Worldforlder/config.yml
+#
+# # The lower arena border under which players get damage
+# UnderBorder:
+# # The lowest corner in all axis of the blue team schematic area
+# BlueCorner:
+# x: 0
+# y: 0
+# z: 0
+# # The offset between the lowest corner of the blue area and the lowest corner of the red area
+# BlueToRed:
+# x: 0
+# y: 0
+# z: 0
+# # The offset the teams spawn relative to the center of their area
+# SpawnOffset:
+# x: 0
+# y: 0
+# z: 0
\ No newline at end of file
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java
index 0cf770b..2611d88 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/FightSystem.java
@@ -24,26 +24,24 @@ import de.steamwar.core.Core;
import de.steamwar.fightsystem.commands.*;
import de.steamwar.fightsystem.countdown.*;
import de.steamwar.fightsystem.fight.Fight;
-import de.steamwar.fightsystem.fight.FightPlayer;
import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.kit.KitManager;
+import de.steamwar.fightsystem.fight.FightWorld;
+import de.steamwar.fightsystem.listener.Shutdown;
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.StateDependent;
-import de.steamwar.fightsystem.utils.*;
+import de.steamwar.fightsystem.states.OneShotStateDependent;
+import de.steamwar.fightsystem.utils.EnterHandler;
+import de.steamwar.fightsystem.utils.FightStatistics;
+import de.steamwar.fightsystem.utils.TechHider;
import de.steamwar.fightsystem.winconditions.*;
import de.steamwar.sql.EventFight;
import de.steamwar.sql.Schematic;
import org.bukkit.Bukkit;
-import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
import java.util.logging.Level;
public class FightSystem extends JavaPlugin {
@@ -51,60 +49,47 @@ public class FightSystem extends JavaPlugin {
public static final String PREFIX = "§eArena§8» ";
private static FightSystem plugin;
- private static FightState fightState = FightState.PRE_LEADER_SETUP;
- private static Map stateDependentFeatures = new HashMap<>();
- private static int fightTime = 0;
- private static Countdown mainCountdown;
-
@Override
public void onLoad() {
- setPlugin(this);
+ plugin = this;
IFightSystem.init(this);
}
@Override
public void onEnable() {
Fight.init();
- KitManager.loadAllKits();
- TechHider.init();
- FightScoreboard.init();
RecordSystem.init();
- try {
- CommandRemover.removeAll("gamemode");
- CommandInjector.injectCommand(new GamemodeCommand());
- } catch (Exception e) {
- getLogger().log(Level.SEVERE, "Failed to replace commands", e);
- Bukkit.shutdown();
- return;
- }
-
- new EntityDamageListener();
- new EntityExplodeListener();
- new FoodLevelChangeListener();
+ new EntityDamage();
+ new WaterRemover();
+ new Permanent();
new PistonListener();
- new PlayerChatListener();
- new HotbarGUIListener();
- new PlayerMoveListener();
- new PlayerStateListener();
- new ProjectileLaunchListener();
- new InFightDamageListener();
- new InFightInventoryListener();
- new FreezeWorldStateListener();
- new EventJoinListener();
- new EventRecordListener();
- new CheckListener();
- new TestListener();
- new NormalJoinListener();
- new RankedJoinListener();
- new GameplayListener();
+ new Chat();
+ new HotbarGUI();
+ new ArenaBorder();
+ new TeamArea();
+ new IngameDeath();
+ new InFightDamage();
+ new InFightInventory();
+ new DenyWorldInteraction();
+ new EventJoin();
+ new Recording();
+ new Check();
+ new Shutdown();
+ new SetupQuit();
+ new PrepareSchem();
+ new TestJoin();
+ new NormalJoin();
+ new RankedJoin();
new PersonalKitCreator();
- new ScoreboardListener();
+ new FightScoreboard();
new ArrowStopper();
if(Core.getVersion() > 8)
- new VersionDependentListener();
+ new ArrowPickup();
new EnterHandler();
+ new TechHider();
+ new FightWorld();
new WinconditionAllDead();
new WinconditionCaptainDead();
@@ -115,41 +100,49 @@ public class FightSystem extends JavaPlugin {
new WinconditionPoints();
new WinconditionTimeout();
new WinconditionHeartRatioTimeout();
- new WinconditionTechKO();
+ new WinconditionTimeTechKO();
+ new EventTeamOffWincondition();
+ new RankedPlayerLeftWincondition();
+ new WinconditionPercentTimeout();
- Objects.requireNonNull(getCommand("leave")).setExecutor(new LeaveCommand());
- Objects.requireNonNull(getCommand("kit")).setExecutor(new KitCommand());
- Objects.requireNonNull(getCommand("remove")).setExecutor(new RemoveCommand());
- Objects.requireNonNull(getCommand("accept")).setExecutor(new AcceptCommand());
- Objects.requireNonNull(getCommand("decline")).setExecutor(new DeclineCommand());
- Objects.requireNonNull(getCommand("invite")).setExecutor(new InviteCommand());
- Objects.requireNonNull(getCommand("ready")).setExecutor(new ReadyCommand());
- Objects.requireNonNull(getCommand("ak")).setExecutor(new AkCommand());
- Objects.requireNonNull(getCommand("leader")).setExecutor(new LeaderCommand());
- Objects.requireNonNull(getCommand("lockschem")).setExecutor(new LockschemCommand());
+ new NoPlayersOnlineCountdown();
+ new PreSchemCountdown();
+ new PostSchemCountdown();
+ new PreRunningCountdown();
+ new SpectateOverCountdown();
+ new EventSpectateCountdown();
- mainCountdown = new NoPlayersOnlineCountdown();
- fightTime = Config.TimeoutTime;
+ new LeaveCommand();
+ new KitCommand();
+ new RemoveCommand();
+ new AcceptCommand();
+ new DeclineCommand();
+ new InviteCommand();
+ new ReadyCommand();
+ new AkCommand();
+ new LeaderCommand();
+ new LockschemCommand();
+ new StateCommand();
+ new SkipCommand();
- if(Config.event() || Config.Ranked) {
- Objects.requireNonNull(getCommand("invite")).setExecutor(new EventDummyCommand());
- Objects.requireNonNull(getCommand("ready")).setExecutor(new EventDummyCommand());
- Objects.requireNonNull(getCommand("ak")).setExecutor(new EventDummyCommand());
- Objects.requireNonNull(getCommand("leader")).setExecutor(new EventDummyCommand());
+ 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);
- setPreSchemState();
- }else if(Config.test()){
- if(Config.check()){
- Bukkit.getScheduler().runTaskLater(this, () -> Fight.getBlueTeam().setSchematic(Schematic.getSchemFromDB(Config.CheckSchemID)), 0);
- }else{
- Bukkit.getScheduler().runTaskLater(this, Fight.getBlueTeam()::pasteDummy, 0);
- }
- Bukkit.getScheduler().runTaskLater(this, Fight.getRedTeam()::pasteDummy, 0);
-
- setPreSchemState();
- setPostSchemState();
+ try {
+ CommandRemover.removeAll("gamemode");
+ CommandInjector.injectCommand(new GamemodeCommand());
+ } catch (Exception e) {
+ getLogger().log(Level.SEVERE, "Failed to replace commands", e);
}
+ if(Config.mode == ArenaMode.EVENT) {
+ setPreSchemState();
+ }else if(Config.mode == ArenaMode.CHECK){
+ Fight.getBlueTeam().setSchem(Schematic.getSchemFromDB(Config.CheckSchemID));
+ }else if(Config.mode == ArenaMode.PREPARE) {
+ Fight.getBlueTeam().setSchem(Schematic.getSchemFromDB(Config.PrepareSchemID));
+ }
}
@Override
@@ -157,71 +150,31 @@ public class FightSystem extends JavaPlugin {
Recorder.closeAll();
}
- public static void setPreSchemState() {
- if(fightState != FightState.PRE_LEADER_SETUP)
- throw new SecurityException(fightState.name());
- setFightState(FightState.PRE_SCHEM_SETUP);
+ public static void setPreLeaderState() {
+ FightState.setFightState(FightState.PRE_LEADER_SETUP);
- Fight.calcAvailibleSchemTypes();
- mainCountdown = new PreSchemPasteCountdown();
+ Fight.getBlueTeam().reset();
+ Fight.getRedTeam().reset();
+ }
+
+ public static void setPreSchemState() {
+ FightState.setFightState(FightState.PRE_SCHEM_SETUP);
}
public static void setPostSchemState() {
- if(fightState != FightState.PRE_SCHEM_SETUP)
- throw new SecurityException(fightState.name());
- setFightState(FightState.POST_SCHEM_SETUP);
-
- TechHider.start();
- if(!Config.test()){
- Fight.getBlueTeam().pasteSchematic();
- Fight.getRedTeam().pasteSchematic();
- }
-
- if(Config.test())
- mainCountdown = null;
- else
- mainCountdown = new SetupOverCountdown();
+ FightState.setFightState(FightState.POST_SCHEM_SETUP);
}
public static void setPreRunningState() {
- if(fightState != FightState.POST_SCHEM_SETUP)
- throw new SecurityException(fightState.name());
- setFightState(FightState.PRE_RUNNING);
-
- Fight.getBlueTeam().loadKits();
- Fight.getRedTeam().loadKits();
- setAllPlayersGM(GameMode.SURVIVAL);
- Bukkit.broadcastMessage(PREFIX + "§aDer Kampf beginnt!");
-
- mainCountdown = new PreRunningCountdown();
-
- Fight.replaceSync();
-
- if(Config.event())
- new EventTeamOffWincondition();
+ FightState.setFightState(FightState.PRE_RUNNING);
}
public static void setRunningState() {
- if(fightState != FightState.PRE_RUNNING)
- throw new SecurityException(fightState.name());
- setFightState(FightState.RUNNING);
- setAllPlayersGM(GameMode.SURVIVAL);
-
- FightStatistics.start();
- Bukkit.broadcastMessage(PREFIX + "§aArena freigegeben!");
+ FightState.setFightState(FightState.RUNNING);
}
public static void setSpectateState(FightTeam winFightTeam, String windescription) {
- if(fightState == FightState.SPECTATE)
- return;
- setFightState(FightState.SPECTATE);
-
- setAllPlayersGM(GameMode.SPECTATOR);
- Fight.getBlueTeam().teleportToSpawn();
- Fight.getRedTeam().teleportToSpawn();
- Bukkit.getOnlinePlayers().forEach(player -> player.getInventory().clear());
-
- Bukkit.broadcastMessage(" ");
+ FightState.setFightState(FightState.SPECTATE);
if(winFightTeam != null) {
Bukkit.broadcastMessage(PREFIX + "§aDas Team " + winFightTeam.getColoredName() + " §ahat gewonnen!");
@@ -229,7 +182,7 @@ public class FightSystem extends JavaPlugin {
Bukkit.broadcastMessage(PREFIX + "§aKein Team hat gewonnen!");
}
- if(Config.event()) {
+ if(Config.mode == ArenaMode.EVENT) {
if (winFightTeam == null)
getEventFight().setErgebnis(0);
else if (winFightTeam.isBlue())
@@ -239,15 +192,10 @@ public class FightSystem extends JavaPlugin {
}
if(!Config.test()){
- new SpectateOverCountdown();
FightStatistics.saveStats(winFightTeam, windescription);
}
}
- public static void setFightTime(int fightTime) {
- FightSystem.fightTime = fightTime;
- }
-
public static void setEventLeiter(Player el){
IFightSystem.setEventLeiter(el);
}
@@ -260,70 +208,24 @@ public class FightSystem extends JavaPlugin {
return IFightSystem.getEventFight();
}
- private static void setPlugin(FightSystem pl){
- plugin = pl;
- }
-
public static FightSystem getPlugin() {
return plugin;
}
- public static FightState getFightState() {
- return fightState;
- }
-
- public static int getFightTime() {
- return fightTime;
- }
-
public static void shutdown(String reason){
- IFightSystem.shutdown(reason);
+ if(reason != null)
+ Bukkit.broadcastMessage(reason);
+ //Staggered kick to prevent lobby overloading
+ kickNext();
}
- public static void registerStateDependent(StateDependent stateDependent){
- if(stateDependent.enabled().isEmpty())
+ private static void kickNext(){
+ if(Bukkit.getOnlinePlayers().isEmpty()){
+ Bukkit.shutdown();
return;
- boolean enabled = stateDependent.enabled().contains(fightState);
- stateDependentFeatures.put(stateDependent, enabled);
- if(enabled)
- stateDependent.enable();
- }
-
- private static void setAllPlayersGM(GameMode gm) {
- for(FightPlayer fightPlayer: Fight.getBlueTeam().getPlayers()){
- Fight.setPlayerGamemode(fightPlayer.getPlayer(), gm);
}
- for(FightPlayer fightPlayer: Fight.getRedTeam().getPlayers()){
- Fight.setPlayerGamemode(fightPlayer.getPlayer(), gm);
- }
- }
- private static void setFightState(FightState state){
- fightState = state;
- if(mainCountdown != null){
- mainCountdown.disable();
- mainCountdown = null;
- }
- postStateChange();
- }
-
- private static void postStateChange(){
- for(Map.Entry feature : stateDependentFeatures.entrySet()){
- //Enable feature if should be enabled and currently disabled
- if(feature.getKey().enabled().contains(fightState)){
- if(!feature.getValue()){
- feature.getKey().enable();
- feature.setValue(true);
- }
- feature.getKey().stateChange(fightState);
- }
-
-
- //Disable feature if should be disabled and currently enabled
- if(!feature.getKey().enabled().contains(fightState) && feature.getValue()){
- feature.getKey().disable();
- feature.setValue(false);
- }
- }
+ Bukkit.getOnlinePlayers().iterator().next().kickPlayer(null);
+ Bukkit.getScheduler().runTaskLater(plugin, FightSystem::kickNext, 10);
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/AcceptCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/AcceptCommand.java
index 33bfdc4..0e23db4 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/AcceptCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/AcceptCommand.java
@@ -19,12 +19,20 @@
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 AcceptCommand implements CommandExecutor {
+
+ public AcceptCommand() {
+ new StateDependentCommand(ArenaMode.VariableTeams, FightState.Setup, "accept", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) {
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/AkCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/AkCommand.java
index fd83d45..d58d55c 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/AkCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/AkCommand.java
@@ -19,211 +19,36 @@
package de.steamwar.fightsystem.commands;
-import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.fight.Kit;
import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.kit.KitManager;
-import de.steamwar.fightsystem.Config;
-import de.steamwar.sql.Schematic;
-import de.steamwar.sql.SchematicType;
+import de.steamwar.fightsystem.states.StateDependentCommand;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserGroup;
-import net.md_5.bungee.api.ChatColor;
-import net.md_5.bungee.api.chat.ClickEvent;
-import net.md_5.bungee.api.chat.ComponentBuilder;
-import net.md_5.bungee.api.chat.HoverEvent;
-import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import java.util.ArrayList;
-import java.util.List;
-
public class AkCommand implements CommandExecutor {
- private static final String SCHEMLIST_COMMAND = "/ak schemlist ";
- private static final int FILES_PER_PAGE = 15;
+ public AkCommand() {
+ new StateDependentCommand(ArenaMode.Test, FightState.All, "ak", this);
+ }
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
-
if(!(sender instanceof Player)) {
return false;
}
Player player = (Player) sender;
- switch(args.length){
- case 1:
- if(args[0].equalsIgnoreCase("schem") || args[0].equalsIgnoreCase("schemlist")){
-
- //TEXT COMPONENTS
- TextComponent publicList = new TextComponent("PUBLIC");
- publicList.setColor(ChatColor.YELLOW);
- publicList.setBold(true);
- publicList.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§ePublic Liste...").create()));
- publicList.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/ak schemlist public"));
-
- TextComponent privateList = new TextComponent("PRIVATE");
- privateList.setColor(ChatColor.YELLOW);
- privateList.setBold(true);
- privateList.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§ePrivate Liste...").create()));
- privateList.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/ak schemlist 0"));
- //TEXT COMPONENTS
-
- player.spigot().sendMessage(publicList);
- player.spigot().sendMessage(privateList);
- }else
- Commands.sendHelp(player);
- break;
- case 2:
- if(args[0].equalsIgnoreCase("addkit")){
- if(SteamwarUser.get(player.getUniqueId()).getUserGroup() != UserGroup.Developer){
- Commands.sendHelp(player);
- return false;
- }
- KitManager.saveInventory(args[1], player);
- } else if(args[0].equalsIgnoreCase("schemlist") && FightSystem.getFightState() == FightState.PRE_SCHEM_SETUP) {
- try {
- FightTeam fightTeam = Fight.getPlayerTeam(player);
- if(fightTeam != null && fightTeam.getFightPlayer(player).isLeader()) {
- if(args[1].equalsIgnoreCase("public")) {
- sendPlayerSchematicList(true, 0, player, Config.SchematicType);
- return false;
- } else {
- int page;
- page = Integer.parseInt(args[1]);
- sendPlayerSchematicList(false, page, player, Config.SchematicType);
- }
- }
- } catch (NumberFormatException ex) {
- player.sendMessage(FightSystem.PREFIX + "§cDu musst eine Seitenzahl angeben!");
- return false;
- }
- } else
- Commands.sendHelp(player);
- break;
- case 3:
- if(args[0].equalsIgnoreCase("schem")) {
- FightTeam fightTeam = Fight.getPlayerTeam(player);
- if(fightTeam == null) {
- player.sendMessage(FightSystem.PREFIX + "§cDu bist in keinem Team!");
- return false;
- }else if(fightTeam.hasSchematic()) {
- player.sendMessage(FightSystem.PREFIX + "§cDie Schematic ist bereits gewählt!");
- return false;
- }
-
- Schematic schem;
- if(args[2].equalsIgnoreCase("public")) {
- schem = Schematic.getSchemFromDB(args[1], SteamwarUser.get(0).getUUID());
- } else if(args[2].equalsIgnoreCase("private")) {
- schem = Schematic.getSchemFromDB(args[1], player.getUniqueId());
- } else
- return false;
-
-
- if(schem == null) {
- schem = Schematic.getSchemFromDB(args[1], 0);
- if(schem == null){
- player.sendMessage(FightSystem.PREFIX + "§cDiese Schematic gibt es nicht!");
- return false;
- }
- }
- if(schem.getSchemType() != Config.SchematicType) {
- player.sendMessage(FightSystem.PREFIX + "§cDiese Schematic ist kein " + Config.GameName);
- return false;
- }
-
- fightTeam.setSchematic(schem);
- }else
- Commands.sendHelp(player);
- break;
- default:
- Commands.sendHelp(player);
+ if(SteamwarUser.get(player.getUniqueId()).getUserGroup() != UserGroup.Developer){
+ Commands.sendHelp(player);
+ return false;
}
+ Kit.createKit(args[0], player);
return false;
}
-
- private void sendPlayerSchematicList(boolean publicSchematics, int currentPage, Player player, SchematicType schematicType) {
- List preSchematicList;
- List schematicList = new ArrayList<>();
- if(publicSchematics) {
- preSchematicList = Schematic.getSchemsAccessibleByUser(0);
- } else {
- preSchematicList = Schematic.getSchemsAccessibleByUser(player.getUniqueId());
- }
-
- for(Schematic s : preSchematicList) {
- if(s.getSchemType() == schematicType)
- schematicList.add(s);
- }
-
- if(schematicList.isEmpty()) {
- player.sendMessage(FightSystem.PREFIX + "§cDu hast noch keine Schematic(s)!");
- return;
- }
-
- int pages;
-
- double doublePages = (double) schematicList.size() / (double) FILES_PER_PAGE;
- int intPages = schematicList.size() / FILES_PER_PAGE;
-
- if(schematicList.size() <= FILES_PER_PAGE) {
- pages = 1;
- } else if(doublePages > intPages) {
- pages = (intPages + 1);
- } else
- pages = intPages;
-
- if(currentPage >= pages) return;
-
- player.sendMessage("§5======§8[§dSeite " + (currentPage + 1) + " §7/ §d" + pages + " §7| §d" + schematicList.size() + " Schematic(s)§8]§5======");
-
- for(int i = currentPage * FILES_PER_PAGE; i < (currentPage * FILES_PER_PAGE) + FILES_PER_PAGE; i++) {
- if(schematicList.size() <= i) break;
-
- Schematic schem = schematicList.get(i);
-
- TextComponent schematics = new TextComponent("§b" + schem.getSchemName());
- schematics.setBold(true);
-
- schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Schematic benutzen...").create()));
- schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/ak schem " + schem.getSchemName() + (publicSchematics ? " public" : " private")));
-
- player.spigot().sendMessage(schematics);
- }
-
- if(pages <= 1) return;
-
- if(currentPage == 0) {
- TextComponent nextPage = new TextComponent("Nächste Seite >>");
- nextPage.setColor(ChatColor.RED);
- nextPage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§6Nächste Seite...").create()));
- nextPage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, SCHEMLIST_COMMAND + "1"));
- player.spigot().sendMessage(nextPage);
- } else if((currentPage + 1) == pages) {
- TextComponent beforePage = new TextComponent("<< Vorherige Seite");
- beforePage.setColor(ChatColor.RED);
- beforePage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§6Vorherige Seite...").create()));
- beforePage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, SCHEMLIST_COMMAND + (currentPage - 1)));
- player.spigot().sendMessage(beforePage);
- } else {
- TextComponent beforePage = new TextComponent("<< Seite ");
- beforePage.setColor(ChatColor.RED);
- beforePage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§6Vorherige Seite...").create()));
- beforePage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, SCHEMLIST_COMMAND + (currentPage - 1)));
-
- TextComponent nextPage = new TextComponent(">>");
- nextPage.setColor(ChatColor.RED);
- nextPage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§6Nächste Seite...").create()));
- nextPage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, SCHEMLIST_COMMAND + (currentPage + 1)));
-
- beforePage.addExtra(nextPage);
- player.spigot().sendMessage(beforePage);
- }
- }
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java
index 6bdef6a..26bed7c 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/Commands.java
@@ -19,12 +19,15 @@
package de.steamwar.fightsystem.commands;
+import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightPlayer;
import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.kit.Kit;
-import de.steamwar.fightsystem.kit.KitManager;
+import de.steamwar.fightsystem.fight.Kit;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.sql.PersonalKit;
+import de.steamwar.sql.SteamwarUser;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -36,7 +39,7 @@ public class Commands {
}
static boolean checkSetup(Player p){
- if(!FightSystem.getFightState().setup()){
+ if(!FightState.setup()){
p.sendMessage(FightSystem.PREFIX + "§cDer Kampf hat bereits begonnen!");
return true;
}
@@ -85,9 +88,6 @@ public class Commands {
}
static void toggleReady(Player p){
- if(checkSetup(p))
- return;
-
FightTeam fightTeam = checkGetTeam(p);
if(fightTeam == null || checkGetLeader(p) == null)
return;
@@ -95,6 +95,14 @@ public class Commands {
fightTeam.setReady(!fightTeam.isReady());
}
+ static void toggleSkip(Player p){
+ FightTeam fightTeam = checkGetTeam(p);
+ if(fightTeam == null || checkGetLeader(p) == null)
+ return;
+
+ fightTeam.skip();
+ }
+
static void acceptInvitation(Player p){
if(checkSetup(p))
return;
@@ -103,9 +111,8 @@ public class Commands {
if(team == null)
return;
- FightPlayer leader = team.getLeader();
p.sendMessage(FightSystem.PREFIX + "§aDu bist Team " + team.getColoredName() + " §abeigetreten!");
- leader.sendMessage(FightSystem.PREFIX + "§aDer Spieler §e" + p.getName() + " §aist deinem Team beigetreten!");
+ team.broadcast(FightSystem.PREFIX + "§aDer Spieler §e" + p.getName() + " §aist dem Team beigetreten!");
team.addMember(p);
}
@@ -117,9 +124,8 @@ public class Commands {
if(team == null)
return;
- FightPlayer leader = team.getLeader();
p.sendMessage(FightSystem.PREFIX + "§aDu hast die Einladung von " + team.getColoredName() + " §aabgelehnt!");
- leader.sendMessage(FightSystem.PREFIX + "§cDer Spieler §e" + p.getName() + " §chat deine Einladung abgelehnt!");
+ team.broadcast(FightSystem.PREFIX + "§cDer Spieler §e" + p.getName() + " §chat die Einladung abgelehnt!");
team.getInvited().remove(p);
}
@@ -201,14 +207,23 @@ public class Commands {
if(fightPlayer == null)
return;
- Kit k = KitManager.getKitByName(kitName);
+ Kit k = null;
+ if(Config.PersonalKits){
+ PersonalKit kit = PersonalKit.get(SteamwarUser.get(p.getUniqueId()).getId(), Config.SchematicType.toDB(), kitName);
+ if(kit != null){
+ kit.setInUse();
+ k = new Kit(kit);
+ }
+ }else{
+ k = Kit.getKitByName(kitName);
+ }
+
if(k == null){
p.sendMessage(FightSystem.PREFIX + "§cDieses Kit gibt es nicht!");
return;
}
- if((fightPlayer.isLeader() && !k.isLeaderAllowed()) ||
- (!fightPlayer.isLeader() && !k.isMemberAllowed())){
+ if(!k.canUseKit(fightPlayer.isLeader())){
p.sendMessage(FightSystem.PREFIX + "§cDu darfst dieses Kit nicht verwenden!");
return;
}
@@ -227,7 +242,6 @@ public class Commands {
p.sendMessage("§8/§eleader §8- §7Werde der Leader eines Teams");
}else{
if(fightPlayer.isLeader()){
- p.sendMessage("§8/§eak schem §8<§eSchematic§8> - §7Setze deine Schematic");
p.sendMessage("§8/§eready §8- §7Setzt das eigene Team auf bereit");
p.sendMessage("§8/§einvite §8<§eSpieler§8> - §7Lade einen Spieler in dein Team ein");
p.sendMessage("§8/§eremove §8<§eSpieler§8> - §7Wirft einen Spieler aus dem Team");
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/DeclineCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/DeclineCommand.java
index 83558ea..3fa9906 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/DeclineCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/DeclineCommand.java
@@ -19,12 +19,20 @@
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 DeclineCommand implements CommandExecutor {
+
+ public DeclineCommand() {
+ new StateDependentCommand(ArenaMode.VariableTeams, FightState.Setup, "decline", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) {
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/GUI.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/GUI.java
index 485b0b9..0b960b0 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/GUI.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/GUI.java
@@ -24,13 +24,14 @@ import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightPlayer;
import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.kit.Kit;
-import de.steamwar.fightsystem.kit.KitManager;
+import de.steamwar.fightsystem.fight.Kit;
import de.steamwar.fightsystem.listener.PersonalKitCreator;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.inventory.SWAnvilInv;
import de.steamwar.inventory.SWInventory;
import de.steamwar.inventory.SWItem;
import de.steamwar.inventory.SWListInv;
+import de.steamwar.sql.PersonalKit;
import de.steamwar.sql.Schematic;
import de.steamwar.sql.SteamwarUser;
import org.bukkit.Bukkit;
@@ -66,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);
@@ -91,30 +106,59 @@ public class GUI {
inv.open();
}
- public static void kitSelection(Player p){
+ public static void kitSelection(Player p, String query){
FightPlayer fightPlayer = Fight.getFightPlayer(p);
if(fightPlayer == null)
return;
+ List> entries = new ArrayList<>();
+
if(Config.PersonalKits){
- PersonalKitCreator.openKitSelector(p, "");
- return;
+ List kits = PersonalKit.get(SteamwarUser.get(p.getUniqueId()).getId(), Config.SchematicType.toDB());
+ kits.forEach(kit -> entries.add(new SWListInv.SWListEntry<>(new SWItem(Material.LEATHER_CHESTPLATE, "§e" + kit.getName(), new ArrayList<>(), kit.isInUse(), clickType -> {}), new Kit(kit))));
+ }else{
+ List kitList = Kit.getAvailableKits(fightPlayer.isLeader());
+ for(Kit k : kitList){
+ entries.add(new SWListInv.SWListEntry<>(new SWItem(Material.LEATHER_CHESTPLATE, k.getName(), null, k.leaderExclusive(), null), k));
+ }
}
- List> iconList = new ArrayList<>();
+ entries.removeIf(entry -> !entry.getObject().getName().toLowerCase().contains(query.toLowerCase()));
- List kitList = KitManager.getKits(fightPlayer.isLeader());
- for(Kit k : kitList){
- iconList.add(new SWListInv.SWListEntry<>(new SWItem(Material.LEATHER_CHESTPLATE, k.getName(), null, !k.isMemberAllowed(), null), k));
- }
-
- SWListInv inv = new SWListInv<>(p, "Kitauswahl", iconList, (ClickType click, Kit k) -> k.preview(p));
+ SWListInv inv = new SWListInv<>(p, "Kitauswahl", false, entries, (clickType, kit) -> kit.preview(p));
inv.setCallback(-999, (ClickType click) -> p.closeInventory());
+ if(entries.isEmpty()) {
+ inv.setItem(22, new SWItem(Material.BARRIER, "§cKeine Kits gefunden"));
+ }
+ if(Config.PersonalKits){
+ inv.setItem(48, Material.NETHER_STAR, "§eNeues Kit", clickType -> {
+ SWAnvilInv anvilInv = new SWAnvilInv(p, "Kitname eingeben");
+ anvilInv.setItem(Material.LEATHER_CHESTPLATE);
+ anvilInv.setCallback(s -> {
+ SteamwarUser user = SteamwarUser.get(p.getUniqueId());
+ if(PersonalKit.nameInUse(user.getId(), Config.SchematicType.toDB(), s)) {
+ p.sendMessage(FightSystem.PREFIX + "§cDieser Kitname wird bereits genutzt!");
+ p.closeInventory();
+ return;
+ }
+ Kit prototype = Kit.getAvailableKits(Fight.getFightPlayer(p).isLeader()).get(0);
+ PersonalKit kit = PersonalKit.create(user.getId(), Config.SchematicType.toDB(), s, prototype.getInventory(), prototype.getArmor());
+ PersonalKitCreator.openKitCreator(p, kit);
+ });
+ anvilInv.open();
+ });
+ }
+ inv.setItem(50, Material.NAME_TAG, "§eSuchen", clickType -> {
+ SWAnvilInv anvilInv = new SWAnvilInv(p, "§eNach Kit suchen");
+ anvilInv.setItem(Material.PAPER);
+ anvilInv.setCallback(s -> kitSelection(p, s));
+ anvilInv.open();
+ });
inv.open();
}
public static void preSchemDialog(Player p){
- if(!Config.test() && FightSystem.getFightState() != FightState.PRE_SCHEM_SETUP){
+ if(!Config.test() && FightState.getFightState() != FightState.PRE_SCHEM_SETUP){
p.sendMessage(FightSystem.PREFIX + "§cDu kannst ohne Gegner keine Schematic wählen");
return;
}
@@ -153,8 +197,8 @@ public class GUI {
FightTeam fightTeam = Fight.getPlayerTeam(p);
if(fightTeam == null)
return;
- if(Config.test() || FightSystem.getFightState() != FightState.POST_SCHEM_SETUP)
- fightTeam.setSchematic(s);
+ if(Config.test() || FightState.getFightState() != FightState.POST_SCHEM_SETUP)
+ fightTeam.pasteSchem(s);
p.closeInventory();
});
inv.setCallback(-999, (ClickType click) -> p.closeInventory());
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/InviteCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/InviteCommand.java
index 5557a81..e6bee2c 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/InviteCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/InviteCommand.java
@@ -19,12 +19,20 @@
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 InviteCommand implements CommandExecutor {
+
+ public InviteCommand() {
+ new StateDependentCommand(ArenaMode.VariableTeams, FightState.Setup, "invite", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) {
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/KitCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/KitCommand.java
index ee0898a..585262b 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/KitCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/KitCommand.java
@@ -19,12 +19,20 @@
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 KitCommand implements CommandExecutor {
+
+ public KitCommand() {
+ new StateDependentCommand(ArenaMode.All, FightState.Setup, "kit", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) {
@@ -33,7 +41,7 @@ public class KitCommand implements CommandExecutor {
Player player = (Player) sender;
if(args.length != 1)
- GUI.kitSelection(player);
+ GUI.kitSelection(player, "");
else{
Commands.kit(player, args[0]);
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/LeaderCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/LeaderCommand.java
index 90348e3..19d7874 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/LeaderCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/LeaderCommand.java
@@ -19,29 +19,34 @@
package de.steamwar.fightsystem.commands;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
+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 LeaderCommand implements CommandExecutor {
+
+ public LeaderCommand() {
+ new StateDependentCommand(ArenaMode.VariableTeams, FightState.Setup, "leader", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player))
return false;
Player player = (Player) sender;
- if(Commands.checkSetup(player))
- return false;
-
if(args.length == 0){
if(Fight.getFightPlayer(player) == null){
- if(!Fight.getBlueTeam().hasTeamLeader())
- Fight.getBlueTeam().setLeader(Fight.getBlueTeam().addMember(player));
- else if(!Fight.getRedTeam().hasTeamLeader())
- Fight.getRedTeam().setLeader(Fight.getRedTeam().addMember(player));
+ if(Fight.getBlueTeam().isLeaderless())
+ Fight.getBlueTeam().addMember(player);
+ else if(Fight.getRedTeam().isLeaderless())
+ Fight.getRedTeam().addMember(player);
else
player.sendMessage(FightSystem.PREFIX + "§cEs sind bereits 2 Teamleader vorhanden");
}else
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/LeaveCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/LeaveCommand.java
index 12bc850..7e3327e 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/LeaveCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/LeaveCommand.java
@@ -19,12 +19,20 @@
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 LeaveCommand implements CommandExecutor {
+
+ public LeaveCommand() {
+ new StateDependentCommand(ArenaMode.All, FightState.Setup, "leave", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) {
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/LockschemCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/LockschemCommand.java
index 9f3f6be..6070d12 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/LockschemCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/LockschemCommand.java
@@ -19,9 +19,12 @@
package de.steamwar.fightsystem.commands;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentCommand;
import de.steamwar.sql.Schematic;
import de.steamwar.sql.SchematicType;
import de.steamwar.sql.SteamwarUser;
@@ -32,6 +35,11 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class LockschemCommand implements CommandExecutor {
+
+ public LockschemCommand() {
+ new StateDependentCommand(ArenaMode.All, FightState.All, "lockschem", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player))
@@ -62,6 +70,7 @@ public class LockschemCommand implements CommandExecutor {
}
Schematic.getSchemFromDB(fightTeam.getSchematic()).setSchemType(SchematicType.Normal);
player.sendMessage(FightSystem.PREFIX + "Schematic von " + fightTeam.getColoredName() + " §cgesperrt!");
+ fightTeam.broadcast(FightSystem.PREFIX + "§cDie Schematic wurde von " + player.getName() + " gesperrt!");
return false;
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/ReadyCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/ReadyCommand.java
index 873fe34..4761ca5 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/ReadyCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/ReadyCommand.java
@@ -19,12 +19,20 @@
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 ReadyCommand implements CommandExecutor {
+
+ public ReadyCommand() {
+ new StateDependentCommand(ArenaMode.AntiPrepare, FightState.PostSchemSetup, "ready", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) {
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/commands/RemoveCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/RemoveCommand.java
index 427b582..29ba6d2 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/RemoveCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/RemoveCommand.java
@@ -19,12 +19,20 @@
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 RemoveCommand implements CommandExecutor {
+
+ public RemoveCommand() {
+ new StateDependentCommand(ArenaMode.VariableTeams, FightState.Setup, "remove", this);
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(!(sender instanceof Player)) {
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..4b7c5c2
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/SkipCommand.java
@@ -0,0 +1,46 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+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/EventDummyCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/commands/StateCommand.java
similarity index 69%
rename from FightSystem_Main/src/de/steamwar/fightsystem/commands/EventDummyCommand.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/commands/StateCommand.java
index d9d5b7e..8299a8c 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/commands/EventDummyCommand.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/commands/StateCommand.java
@@ -1,6 +1,6 @@
-/*
+/*
This file is a part of the SteamWar software.
-
+
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
@@ -19,15 +19,27 @@
package de.steamwar.fightsystem.commands;
-import de.steamwar.fightsystem.FightSystem;
+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);
+ }
-public class EventDummyCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- sender.sendMessage(FightSystem.PREFIX + "§cWährend des Events ist der Befehl nicht verfügbar.");
+ 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 6618edd..1b9cd6e 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/Countdown.java
@@ -20,7 +20,6 @@
package de.steamwar.fightsystem.countdown;
import de.steamwar.core.Core;
-import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.listener.BasicListener;
@@ -32,22 +31,28 @@ 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 int time;
- private final BukkitTask task;
+ private static final List currentCountdowns = new ArrayList<>();
+
+ private final int totalTime;
private final Sound sound;
private final boolean level;
- abstract String countdownCounting();
- abstract void countdownFinished();
+ protected int time;
+ private BukkitTask task = null;
- Countdown(int time, SWSound sound, boolean level) {
+ public abstract String countdownCounting();
+ public abstract void countdownFinished();
+
+ public Countdown(int time, SWSound sound, boolean level) {
+ this.totalTime = time;
this.time = time;
this.sound = getSound(sound);
this.level = level;
-
- task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::count, 0, 20);
}
public static Sound getSound(SWSound sound){
@@ -68,19 +73,52 @@ 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() {
- task.cancel();
+ 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){
- if(Config.recording())
- RecordSystem.actionBar(message);
+ RecordSystem.actionBar(message);
BaseComponent[] msg = TextComponent.fromLegacyText(message);
for(Player p : Bukkit.getOnlinePlayers())
BasicListener.toActionbar(p, msg);
}
+ public int getTimeLeft(){
+ return time;
+ }
+
void count(){
+ time--;
+
switch (time) {
case 900: case 600: case 300: case 180: case 120:
broadcast("§rNoch §a" + time / 60 + " §rMinuten " + countdownCounting());
@@ -106,14 +144,8 @@ public abstract class Countdown {
break;
default:
}
+
if(this.level)
- Fight.setLevel(time);
-
- time--;
- onTime(time);
- }
-
- void onTime(int time){
- //Implemented in some countdowns
+ Bukkit.getServer().getOnlinePlayers().forEach(player -> player.setLevel(time));
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EnternCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EnternCountdown.java
index ca54a2b..236c85f 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EnternCountdown.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EnternCountdown.java
@@ -35,8 +35,9 @@ public class EnternCountdown extends Countdown {
private List chunkPos;
public EnternCountdown(FightPlayer fp) {
- super(fp.getKit().getEnterStage(), SWSound.BLOCK_NOTE_PLING, false);
+ super(Config.EnterStages.get(fp.getKit().getEnterStage()), SWSound.BLOCK_NOTE_PLING, false);
fightPlayer = fp;
+ enable();
}
@Override
@@ -52,13 +53,9 @@ public class EnternCountdown extends Countdown {
@Override
void count(){
- if(!fightPlayer.isLiving()){
- disable();
- return;
- }
+ time--;
Player player = fightPlayer.getPlayer();
- int time = FightSystem.getFightTime() - Config.EnterStages.get(fightPlayer.getKit().getEnterStage());
switch (time) {
case 900: case 600: case 300: case 180: case 120:
BasicListener.toActionbar(player, TextComponent.fromLegacyText("§rNoch §a" + time / 60 + " §rMinuten " + countdownCounting()));
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/ListenerWincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EventSpectateCountdown.java
similarity index 57%
rename from FightSystem_Main/src/de/steamwar/fightsystem/winconditions/ListenerWincondition.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/countdown/EventSpectateCountdown.java
index 311285b..abaa890 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/ListenerWincondition.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/EventSpectateCountdown.java
@@ -17,36 +17,28 @@
along with this program. If not, see .
*/
-package de.steamwar.fightsystem.winconditions;
+package de.steamwar.fightsystem.countdown;
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.states.FightState;
-import org.bukkit.Bukkit;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
-import java.util.Set;
+public class EventSpectateCountdown extends Countdown {
-abstract class ListenerWincondition extends Wincondition implements Listener {
-
- ListenerWincondition(boolean condition, Set enabled){
- //If the condition is not met, never enable
- super(condition, enabled);
+ public EventSpectateCountdown() {
+ super(Config.SpectatorDuration, SWSound.BLOCK_NOTE_PLING, false);
+ new StateDependentCountdown(ArenaMode.Event, FightState.Spectate, this);
}
- /**
- * Enables the state dependent object
- */
@Override
- public void enable(){
- Bukkit.getPluginManager().registerEvents(this, FightSystem.getPlugin());
+ public String countdownCounting() {
+ return "bis der Server gestoppt wird!";
}
- /**
- * Disables the state dependent object
- */
@Override
- public void disable(){
- HandlerList.unregisterAll(this);
+ public void countdownFinished() {
+ FightSystem.shutdown(null);
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/NoPlayersOnlineCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/NoPlayersOnlineCountdown.java
index be59e4e..fc8ed95 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/NoPlayersOnlineCountdown.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/NoPlayersOnlineCountdown.java
@@ -19,13 +19,29 @@
package de.steamwar.fightsystem.countdown;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.Bukkit;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
-public class NoPlayersOnlineCountdown extends Countdown {
+public class NoPlayersOnlineCountdown extends Countdown implements Listener {
public NoPlayersOnlineCountdown() {
super(Config.NoPlayerOnlineDuration, null, false);
+
+ new StateDependentListener(ArenaMode.All, FightState.PreLeaderSetup, this);
+ new StateDependentCountdown(ArenaMode.All, FightState.PreLeaderSetup, this){
+ @Override
+ public void enable() {
+ if(Bukkit.getOnlinePlayers().isEmpty())
+ super.enable();
+ }
+ };
}
@Override
@@ -33,6 +49,11 @@ public class NoPlayersOnlineCountdown extends Countdown {
return "bis der Server gestoppt wird!";
}
+ @EventHandler
+ public void handlePlayerJoin(PlayerJoinEvent event) {
+ disable();
+ }
+
@Override
public void countdownFinished() {
Bukkit.getServer().shutdown();
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/SetupOverCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PostSchemCountdown.java
similarity index 75%
rename from FightSystem_Main/src/de/steamwar/fightsystem/countdown/SetupOverCountdown.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/countdown/PostSchemCountdown.java
index 75a1fff..a388fbd 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/SetupOverCountdown.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PostSchemCountdown.java
@@ -19,17 +19,21 @@
package de.steamwar.fightsystem.countdown;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
-public class SetupOverCountdown extends Countdown {
+public class PostSchemCountdown extends Countdown {
- public SetupOverCountdown() {
+ public PostSchemCountdown() {
super(Config.SetupDuration, null, false);
+ new StateDependentCountdown(ArenaMode.AntiTest, FightState.PostSchemSetup, this);
}
@Override
- String countdownCounting() {
+ public String countdownCounting() {
return "bis die Kits verteilt werden!";
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreRunningCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreRunningCountdown.java
index 5f44d9e..4506ace 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreRunningCountdown.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreRunningCountdown.java
@@ -19,13 +19,17 @@
package de.steamwar.fightsystem.countdown;
-import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
public class PreRunningCountdown extends Countdown {
public PreRunningCountdown() {
super(Config.PreFightDuration, SWSound.BLOCK_NOTE_PLING, true);
+ new StateDependentCountdown(ArenaMode.All, FightState.PreRunning, this);
}
@Override
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreSchemPasteCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreSchemCountdown.java
similarity index 71%
rename from FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreSchemPasteCountdown.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreSchemCountdown.java
index 19c2e73..e0084a4 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreSchemPasteCountdown.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/PreSchemCountdown.java
@@ -19,31 +19,26 @@
package de.steamwar.fightsystem.countdown;
+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.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
-public class PreSchemPasteCountdown extends Countdown {
+public class PreSchemCountdown extends Countdown {
- public PreSchemPasteCountdown() {
+ public PreSchemCountdown() {
super(Config.PreSchemPasteDuration, SWSound.BLOCK_NOTE_PLING, false);
+ new StateDependentCountdown(ArenaMode.All, FightState.PreSchemSetup, this);
}
@Override
- String countdownCounting() {
+ public String countdownCounting() {
return "bis eine Public-Schematic gewählt wird!";
}
@Override
- void countdownFinished() {
- checkTeam(Fight.getBlueTeam());
- checkTeam(Fight.getRedTeam());
+ public void countdownFinished() {
FightSystem.setPostSchemState();
}
-
- private void checkTeam(FightTeam team){
- if(!team.hasSchematic())
- team.pasteDummy();
- }
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/SpectateOverCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/SpectateOverCountdown.java
index c8e35d9..8280f03 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/SpectateOverCountdown.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/SpectateOverCountdown.java
@@ -19,22 +19,26 @@
package de.steamwar.fightsystem.countdown;
-import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
public class SpectateOverCountdown extends Countdown {
public SpectateOverCountdown() {
super(Config.SpectatorDuration, SWSound.BLOCK_NOTE_PLING, false);
+ new StateDependentCountdown(ArenaMode.Restartable, FightState.Spectate, this);
}
@Override
public String countdownCounting() {
- return "bis der Server gestoppt wird!";
+ return "bis die Arena zurückgesetzt wird!";
}
@Override
public void countdownFinished() {
- FightSystem.shutdown(null);
+ FightSystem.setPreLeaderState();
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TechKOCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TechKOCountdown.java
deleted file mode 100644
index 5d60997..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TechKOCountdown.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.countdown;
-
-import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.fight.Fight;
-import de.steamwar.fightsystem.fight.FightTeam;
-import org.bukkit.Bukkit;
-
-public class TechKOCountdown extends Countdown {
-
- private final FightTeam team;
-
- public TechKOCountdown(FightTeam team, int countdownTime) {
- super(countdownTime, SWSound.BLOCK_NOTE_PLING, false);
- this.team = team;
- }
-
- @Override
- final String countdownCounting() {
- return "bis " + team.getColoredName() + " §feinen Schuss abgegeben haben muss!";
- }
-
- @Override
- void countdownFinished() {
- Bukkit.broadcastMessage(FightSystem.PREFIX + team.getColoredName() + "§7 ist §eTech K§8.§eO§8.!");
- FightSystem.setSpectateState(Fight.getOpposite(team), "TechKO");
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TimeOverCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TimeOverCountdown.java
index eaff639..96a6cab 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TimeOverCountdown.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/countdown/TimeOverCountdown.java
@@ -42,9 +42,4 @@ public class TimeOverCountdown extends Countdown {
Bukkit.broadcastMessage(FightSystem.PREFIX +"§aZeit abgelaufen!");
timeOver.run();
}
-
- @Override
- void onTime(int time) {
- FightSystem.setFightTime(time);
- }
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/Fight.java
index a720c85..dd56cf4 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/Fight.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/Fight.java
@@ -26,6 +26,7 @@ import com.comphenix.protocol.wrappers.EnumWrappers;
import com.comphenix.protocol.wrappers.PlayerInfoData;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.record.RecordSystem;
import de.steamwar.fightsystem.FightSystem;
@@ -41,9 +42,8 @@ import java.util.logging.Level;
public class Fight {
private Fight(){}
- public static final FightTeam redTeam = new FightTeam(Config.TeamRedName, Config.TeamRedColor, Config.TeamRedSpawn, Config.TeamRedCornerX, Config.TeamRedCornerY, Config.TeamRedCornerZ, Config.TeamRedRotate, false, Config.RedLeader);
- public static final FightTeam blueTeam = new FightTeam(Config.TeamBlueName, Config.TeamBlueColor, Config.TeamBlueSpawn, Config.TeamBlueCornerX, Config.TeamBlueCornerY, Config.TeamBlueCornerZ, Config.TeamBlueRotate, true, Config.BlueLeader);
- private static int schemRank;
+ private static final FightTeam redTeam = new FightTeam(Config.TeamRedName, Config.TeamRedColor, Config.TeamRedSpawn, Config.RedPasteRegion, Config.RedExtendRegion, Config.RedRotate, false, Config.RedLeader);
+ private static final FightTeam blueTeam = new FightTeam(Config.TeamBlueName, Config.TeamBlueColor, Config.TeamBlueSpawn, Config.BluePasteRegion, Config.BlueExtendRegion, Config.BlueRotate, true, Config.BlueLeader);
public static void init(){
IFight.init(redTeam, blueTeam);
@@ -58,14 +58,12 @@ public class Fight {
}
public static FightTeam getOpposite(FightTeam fightTeam) {
- if(fightTeam == null){
- throw new IllegalArgumentException();
- }
-
if(fightTeam == redTeam)
return blueTeam;
- else
+ else if(fightTeam == blueTeam)
return redTeam;
+
+ throw new IllegalArgumentException();
}
public static FightTeam getInvitedTeam(Player player){
@@ -93,16 +91,11 @@ public class Fight {
}
public static void playSound(Sound sound, float volume, float pitch) {
- if(Config.recording())
- RecordSystem.soundAtPlayer(sound.name(), volume, pitch);
+ RecordSystem.soundAtPlayer(sound.name(), volume, pitch);
//volume: max. 100, pitch: max. 2
Bukkit.getServer().getOnlinePlayers().forEach(player -> player.playSound(player.getLocation(), sound, volume, pitch));
}
- public static void setLevel(int level) {
- Bukkit.getServer().getOnlinePlayers().forEach(player -> player.setLevel(level));
- }
-
public static FightTeam getTeamByName(String name) {
if(redTeam.getName().equalsIgnoreCase(name))
return redTeam;
@@ -111,14 +104,6 @@ public class Fight {
return null;
}
- public static void replaceSync() {
- Fight.getRedTeam().replaceSync(Config.ReplaceObsidian, Material.OBSIDIAN, Material.TNT);
- Fight.getBlueTeam().replaceSync(Config.ReplaceObsidian, Material.OBSIDIAN, Material.TNT);
-
- Fight.getRedTeam().replaceSync(Config.ReplaceBedrock, Material.BEDROCK, Material.SLIME_BLOCK);
- Fight.getBlueTeam().replaceSync(Config.ReplaceBedrock, Material.BEDROCK, Material.SLIME_BLOCK);
- }
-
public static void setPlayerGamemode(Player player, GameMode gameMode) {
player.setGameMode(gameMode);
@@ -159,33 +144,26 @@ public class Fight {
public static int getMaxRank(){
/* MaxRank of 0 is Pubonly*/
- return schemRank;
- }
-
- public static void calcAvailibleSchemTypes() {
if(Config.OnlyPublicSchematics){
- schemRank = 0;
- return;
+ return 0;
}
- if(Config.IgnorePublicOnly || Config.event() || Config.Ranked){
- schemRank = 1000;
- return;
+ if(Config.IgnorePublicOnly || ArenaMode.RankedEvent.contains(Config.mode)){
+ return 1000;
}
- if(redTeam.getLeader() == null || redTeam.getLeader().getPlayer() == null ||
- blueTeam.getLeader() == null || blueTeam.getLeader().getPlayer() == null){
- schemRank = 1000;
- return;
+
+ if(redTeam.getLeader() == null || blueTeam.getLeader() == null){
+ return 1000;
}
if(Config.RanksEnabled)
- schemRank = Math.min(schemRank(redTeam.getLeader()), schemRank(blueTeam.getLeader()));
+ return Math.min(schemRank(redTeam.getLeader()), schemRank(blueTeam.getLeader()));
else if(Schematic.getSchemsOfType(redTeam.getLeader().getPlayer().getUniqueId(), Config.SchematicType).isEmpty() ||
Schematic.getSchemsOfType(blueTeam.getLeader().getPlayer().getUniqueId(), Config.SchematicType).isEmpty())
- schemRank = 0;
+ return 0;
else
- schemRank = 1;
+ return 1;
}
private static int schemRank(FightPlayer fightPlayer){
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightPlayer.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightPlayer.java
index 7814cdb..f0c59bf 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightPlayer.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightPlayer.java
@@ -19,10 +19,10 @@
package de.steamwar.fightsystem.fight;
-import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.kit.KitManager;
import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.kit.Kit;
+import de.steamwar.fightsystem.countdown.EnternCountdown;
+import de.steamwar.sql.PersonalKit;
+import de.steamwar.sql.SteamwarUser;
import org.bukkit.entity.Player;
public class FightPlayer {
@@ -32,22 +32,39 @@ public class FightPlayer {
private boolean isOut;
private Kit kit;
private int kills;
+ private EnternCountdown enternCountdown = null;
public void sendMessage(String message) {
- if (this.player != null && this.player.isOnline())
- this.player.sendMessage(message);
+ this.player.sendMessage(message);
}
FightPlayer(Player player, FightTeam team) {
this.player = player;
this.team = team;
this.isOut = false;
- kit = KitManager.getKitByName(Config.MemberDefault);
+ kit = Kit.getKitByName(Config.MemberDefault);
+ if(Config.PersonalKits){
+ PersonalKit personalKit = PersonalKit.getKitInUse(SteamwarUser.get(player.getUniqueId()).getId(), Config.SchematicType.toDB());
+ if(personalKit != null){
+ kit = new Kit(personalKit);
+ }
+ }
kills = 0;
}
public void setOut() {
isOut = true;
+ stopEnternCountdown();
+ }
+
+ public void setEnternCountdown(EnternCountdown countdown){
+ enternCountdown = countdown;
+ }
+
+ public void stopEnternCountdown(){
+ if(enternCountdown != null){
+ enternCountdown.disable();
+ }
}
public Player getPlayer() {
@@ -84,8 +101,8 @@ public class FightPlayer {
}
public boolean canEntern(){
- if(Config.EnterStages.size() <= kit.getEnterStage() || kit.getEnterStage() < 0)
+ if(enternCountdown == null)
return false;
- return Config.EnterStages.get(kit.getEnterStage()) >= FightSystem.getFightTime();
+ return enternCountdown.getTimeLeft() == 0;
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightSchematic.java
new file mode 100644
index 0000000..7a76a2c
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightSchematic.java
@@ -0,0 +1,218 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import com.sk89q.worldedit.EditSession;
+import com.sk89q.worldedit.extent.clipboard.Clipboard;
+import de.steamwar.core.VersionedRunnable;
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.IFightSystem;
+import de.steamwar.fightsystem.record.RecordSystem;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependent;
+import de.steamwar.fightsystem.utils.ColorConverter;
+import de.steamwar.fightsystem.utils.Region;
+import de.steamwar.sql.NoClipboardException;
+import de.steamwar.sql.Schematic;
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.*;
+import org.bukkit.event.inventory.InventoryMoveItemEvent;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Random;
+import java.util.logging.Level;
+
+public class FightSchematic extends StateDependent {
+
+ private final FightTeam team;
+ private final Region region;
+ private final boolean rotate;
+
+ private Clipboard clipboard = null;
+ private int schematic = 0;
+
+ public FightSchematic(FightTeam team, boolean rotate) {
+ super(ArenaMode.All, FightState.PostSchemSetup);
+ this.team = team;
+ this.region = team.getSchemRegion();
+ this.rotate = rotate;
+ register();
+ }
+
+ public boolean hasSchematic(){
+ return clipboard != null;
+ }
+
+ public int getId(){
+ return schematic;
+ }
+
+ public void setSchematic(Schematic schem) {
+ schematic = schem.getSchemID();
+ try {
+ clipboard = schem.load();
+ } catch (IOException e) {
+ team.broadcast(FightSystem.PREFIX + "§cKonnte die Schematic nicht laden!");
+ Bukkit.getLogger().log(Level.SEVERE, "Couldn't load Schematic " + schem.getSchemName(), e);
+ }
+ }
+
+ public void reset(){
+ schematic = 0;
+ clipboard = null;
+ }
+
+ @Override
+ public void enable() {
+ if(FightState.getFightState() == FightState.SPECTATE)
+ return;
+
+ if(clipboard == null){
+ List publics = Schematic.getSchemsOfType(0, Config.SchematicType);
+ if(publics.isEmpty())
+ return;
+
+ setSchematic(publics.get(new Random().nextInt(publics.size())));
+ }
+
+ if(!ArenaMode.Test.contains(Config.mode)){
+ FightPlayer leader = team.getLeader();
+ if(leader != null)
+ leader.getPlayer().getInventory().clear(0);
+ }
+
+ if(team.isBlue())
+ RecordSystem.blueSchem(schematic);
+ else
+ RecordSystem.redSchem(schematic);
+
+ Bukkit.getScheduler().runTask(FightSystem.getPlugin(), this::paste);
+ }
+
+ private void paste(){
+ FreezeWorld freezer = new FreezeWorld();
+ DyeColor c = ColorConverter.chat2dye(team.getColor());
+
+ try {
+ VersionedRunnable.call(new VersionedRunnable(() -> {
+ try {
+ 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, 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, rotate);
+ FightTeam_14.replaceTeamColor(e, c, region);
+ } catch (Schematic.WrongVersionException | IOException | NoClipboardException ex) {
+ throw new SecurityException("Error pasting arena in schematic", ex);
+ }
+ }, 14));
+ } catch (SecurityException securityException) {
+ team.broadcast(FightSystem.PREFIX + "§cFehler beim Pasten der Schematic");
+ throw securityException;
+ }
+
+ Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> HandlerList.unregisterAll(freezer), 3);
+ Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), team::teleportToSpawn, 40);
+ }
+
+ @Override
+ public void disable() {
+ if(!Config.ReplaceObsidianBedrock)
+ return;
+
+ FreezeWorld freezer = null;
+ if(!Config.ReplaceWithBlockupdates)
+ freezer = new FreezeWorld();
+
+ replaceSync(Material.OBSIDIAN, Material.TNT);
+ replaceSync(Material.BEDROCK, Material.SLIME_BLOCK);
+
+ if(!Config.ReplaceWithBlockupdates)
+ HandlerList.unregisterAll(freezer);
+ }
+
+ private void replaceSync(Material target, Material replacement){
+ World world = Bukkit.getWorlds().get(0);
+
+ region.forEach((x, y, z) -> {
+ Block block = world.getBlockAt(x, y, z);
+ if(block.getType() == target)
+ block.setType(replacement);
+ });
+ }
+
+ private static class FreezeWorld implements Listener {
+ private FreezeWorld(){
+ Bukkit.getPluginManager().registerEvents(this, IFightSystem.getPlugin());
+ }
+
+ @EventHandler
+ public void onBlockPhysicsEvent(BlockPhysicsEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onPistonExtend(BlockPistonExtendEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onPistonRetract(BlockPistonRetractEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onBlockGrow(BlockGrowEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onRedstoneEvent(BlockRedstoneEvent e){
+ e.setNewCurrent(e.getOldCurrent());
+ }
+
+ @EventHandler
+ public void onBlockDispense(BlockDispenseEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onInventoryMoveEvent(InventoryMoveItemEvent e){
+ e.setCancelled(true);
+ }
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java
index 94b9131..e7fcacc 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightTeam.java
@@ -19,82 +19,70 @@
package de.steamwar.fightsystem.fight;
-import com.sk89q.worldedit.EditSession;
import de.steamwar.comms.packets.TablistNamePacket;
import de.steamwar.core.VersionedRunnable;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.IFightSystem;
-import de.steamwar.fightsystem.kit.KitManager;
+import de.steamwar.fightsystem.countdown.Countdown;
+import de.steamwar.fightsystem.listener.BasicListener;
import de.steamwar.fightsystem.listener.PersonalKitCreator;
import de.steamwar.fightsystem.record.RecordSystem;
import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.utils.ColorConverter;
-import de.steamwar.fightsystem.utils.FightScoreboard;
+import de.steamwar.fightsystem.listener.FightScoreboard;
+import de.steamwar.fightsystem.states.StateDependent;
import de.steamwar.fightsystem.utils.ItemBuilder;
+import de.steamwar.fightsystem.utils.Region;
import de.steamwar.fightsystem.utils.TechHider;
-import de.steamwar.fightsystem.winconditions.RankedPlayerLeftWincondition;
import de.steamwar.inventory.SWItem;
-import de.steamwar.sql.NoClipboardException;
-import de.steamwar.sql.PersonalKit;
import de.steamwar.sql.Schematic;
import de.steamwar.sql.SteamwarUser;
import org.bukkit.*;
-import org.bukkit.block.Block;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
-import org.bukkit.event.block.*;
-import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.PlayerInventory;
import org.bukkit.scoreboard.NameTagVisibility;
import org.bukkit.scoreboard.Team;
-import java.io.IOException;
import java.util.*;
public class FightTeam implements IFightTeam{
+ private UUID designatedLeader;
private FightPlayer leader;
- private final UUID designatedLeader;
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;
- private int schematic = 0;
+ private final FightSchematic schematic;
private final Team team;
private final boolean blue;
- private final Location spawn;
- private final int pasteX;
- private final int pasteY;
- private final int pasteZ;
- private final int cornerX;
- private final int cornerY;
- private final int cornerZ;
- private final boolean rotate;
+ private boolean ready;
+ private boolean skip;
- public FightTeam(String name, String prefix, Location spawn, int cornerX, int cornerY, int cornerZ, boolean rotate, boolean blue, UUID designatedLeader) {
+ private final Location spawn;
+ private final Region schemRegion;
+ private final Region extendRegion;
+
+ public FightTeam(String name, String prefix, Location spawn, Region schemRegion, Region extendRegion, boolean rotate, boolean blue, UUID designatedLeader) {
this.spawn = spawn;
- this.pasteX = cornerX + Config.SchemsizeX/2;
- this.pasteY = cornerY;
- this.pasteZ = cornerZ + Config.SchemsizeZ/2;
+ this.schemRegion = schemRegion;
+ this.extendRegion = extendRegion;
this.name = name;
this.prefix = prefix;
this.ready = false;
- this.rotate = rotate;
- this.cornerX = cornerX;
- this.cornerY = cornerY;
- this.cornerZ = cornerZ;
+ this.skip = false;
this.blue = blue;
this.designatedLeader = designatedLeader;
- color = ChatColor.getByChar(ChatColor.getLastColors(prefix).replace("§", ""));
+ this.color = ChatColor.getByChar(ChatColor.getLastColors(prefix).replace("§", ""));
+ this.schematic = new FightSchematic(this, rotate);
+ new KitLoader();
+ new SpectateHandler();
+
if(FightScoreboard.getScoreboard().getTeam(name) == null)
team = FightScoreboard.getScoreboard().registerNewTeam(name);
else
@@ -106,20 +94,16 @@ public class FightTeam implements IFightTeam{
team.setAllowFriendlyFire(false);
}
- public final int getCornerX() {
- return cornerX;
+ public Region getSchemRegion() {
+ return schemRegion;
}
- public final int getCornerY() {
- return cornerY;
- }
-
- public final int getCornerZ() {
- return cornerZ;
+ public Region getExtendRegion() {
+ return extendRegion;
}
public boolean canbeLeader(Player p){
- return !hasTeamLeader() && (designatedLeader == null || designatedLeader.equals(p.getUniqueId()));
+ return isLeaderless() && (designatedLeader == null || designatedLeader.equals(p.getUniqueId()));
}
public void teleportToSpawn(){
@@ -155,11 +139,44 @@ public class FightTeam implements IFightTeam{
return false;
}
+ public void reset(){
+ skip = false;
+ ready = false;
+ schematic.reset();
+ invited.clear();
+
+ Set playerSet = new HashSet<>(players.keySet());
+ for(Player player : playerSet){
+ if(!Bukkit.getOnlinePlayers().contains(player))
+ removePlayer(player);
+ }
+ FightPlayer leaderBackup = leader;
+ playerSet.removeIf(player -> !Bukkit.getOnlinePlayers().contains(player));
+ players.clear();
+ leader = null;
+
+ if(leaderBackup != null){
+ playerSet.remove(leaderBackup.getPlayer());
+ addMember(leaderBackup.getPlayer());
+ }
+
+ playerSet.forEach(this::addMember);
+
+ if(isLeaderless()){
+ for(Player player : Bukkit.getOnlinePlayers()){
+ if(Fight.getPlayerTeam(player) == null && canbeLeader(player)){
+ addMember(player);
+ break;
+ }
+ }
+ }
+ }
+
public void broadcast(String message) {
players.forEach((player, fp) -> player.sendMessage(message));
}
- public FightPlayer addMember(Player player) {
+ public void addMember(Player player) {
final List chunksToReload = TechHider.prepareChunkReload(player);
FightPlayer fightPlayer = new FightPlayer(player, this);
players.put(player, fightPlayer);
@@ -167,40 +184,47 @@ public class FightTeam implements IFightTeam{
team.addEntry(player.getName());
Fight.setPlayerGamemode(player, GameMode.SURVIVAL);
+ player.setHealth(20);
+ player.setFoodLevel(20);
+ player.getInventory().clear();
+ BasicListener.setAttackSpeed(player);
player.teleport(spawn);
- if(KitManager.getKits(false).size() > 1 || Config.PersonalKits)
+ if(Kit.getAvailableKits(false).size() > 1 || Config.PersonalKits)
player.getInventory().setItem(1, new ItemBuilder(Material.LEATHER_CHESTPLATE).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§eKit wählen").build());
player.getInventory().setItem(7, new ItemBuilder(Material.BEACON).removeAllAttributs().setDisplayName("§eRespawn").build());
if(!Config.test())
Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> new TablistNamePacket(SteamwarUser.get(player.getUniqueId()).getId(), prefix + player.getName()).send(player), 5);
- if(Config.recording())
- RecordSystem.playerJoins(player);
+ RecordSystem.playerJoins(player);
TechHider.reloadChunks(player, chunksToReload);
- return fightPlayer;
+
+ if(isLeaderless())
+ setLeader(fightPlayer);
}
public void removePlayer(Player player) {
FightPlayer fightPlayer = getFightPlayer(player);
- final List chunksToReload = TechHider.prepareChunkReload(player);
+ List chunksToReload = TechHider.prepareChunkReload(player);
players.remove(player);
team.removeEntry(player.getName());
- fightPlayer.getPlayer().getInventory().clear();
- if(fightPlayer.equals(leader) && FightSystem.getFightState().setup())
+ if(fightPlayer.equals(leader))
setLeader(null);
+ RecordSystem.entityDespawns(player);
Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
player.teleport(Config.SpecSpawn);
- if(!Config.test())
- new TablistNamePacket(SteamwarUser.get(player.getUniqueId()).getId(), "§7" + player.getName()).send(player);
- if(Config.recording())
- RecordSystem.entityDespawns(player);
- TechHider.reloadChunks(player, chunksToReload);
+ player.getInventory().clear();
+
+ if(player.isOnline()){
+ if(!ArenaMode.Test.contains(Config.mode))
+ new TablistNamePacket(SteamwarUser.get(player.getUniqueId()).getId(), "§7" + player.getName()).send(player);
+ TechHider.reloadChunks(player, chunksToReload);
+ }
}
- public boolean hasTeamLeader() {
- return leader != null;
+ public boolean isLeaderless() {
+ return leader == null;
}
@Override
@@ -212,43 +236,48 @@ public class FightTeam implements IFightTeam{
return leader;
}
- public void setLeader(FightPlayer leader) {
- if (leader == null){
+ private void setLeader(FightPlayer leader) {
+ if (leader == null) {
+ this.leader = null;
if(!players.isEmpty()) {
setLeader(players.values().iterator().next());
Bukkit.broadcastMessage(FightSystem.PREFIX + "§aDer Spieler §e" + this.leader.getPlayer().getName() + " §aist nun Leader von Team " + getColoredName() + "§a!");
- }else if(Config.Ranked){
- RankedPlayerLeftWincondition.leaderQuit(this);
- }else if(!Config.event()){
- FightSystem.shutdown(FightSystem.PREFIX + "§cTeam " + getColoredName() + " §chat keine Spieler mehr.\n Arena schließt...");
+ }else if(FightState.getFightState() != FightState.PRE_LEADER_SETUP && !ArenaMode.RankedEvent.contains(Config.mode)){
+ Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), FightSystem::setPreLeaderState, 1);
}
return;
}
- if (!PersonalKitCreator.notInKitCreator(leader.getPlayer()))
- leader.getPlayer().closeInventory();
+ PersonalKitCreator.closeIfInKitCreator(leader.getPlayer());
this.leader = leader;
+ designatedLeader = null;
if(ready)
setReady(false);
- leader.setKit(KitManager.getKitByName(Config.LeaderDefault));
+ if(!Config.PersonalKits)
+ leader.setKit(Kit.getKitByName(Config.LeaderDefault));
+
Inventory inventory = leader.getPlayer().getInventory();
- if (KitManager.getKits(true).size() > 1)
+ if (Kit.getAvailableKits(true).size() > 1)
inventory.setItem(1, new ItemBuilder(Material.LEATHER_CHESTPLATE).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§eKit wählen").build());
else if(Config.PersonalKits)
inventory.setItem(1, new ItemBuilder(Material.LEATHER_CHESTPLATE).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§eKit bearbeiten").build());
else
inventory.setItem(1, new ItemBuilder(Material.AIR).build());
- if(!Config.event() && !Config.Ranked){
+ if(!ArenaMode.RankedEvent.contains(Config.mode)){
inventory.setItem(2, new ItemBuilder(Material.PAPER).removeAllAttributs().setDisplayName("§eSpieler einladen").build());
inventory.setItem(3, new ItemBuilder(SWItem.getMaterial("FIREWORK_CHARGE")).removeAllAttributs().setDisplayName("§cSpieler rauswerfen").build());
}
inventory.setItem(4, new ItemBuilder(SWItem.getDye(10), (short) 10).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§cNicht bereit").build());
- if(Config.test() || FightSystem.getFightState() != FightState.POST_SCHEM_SETUP)
+ if(Config.test() || FightState.getFightState() != FightState.POST_SCHEM_SETUP)
inventory.setItem(0, new ItemBuilder(SWItem.getMaterial("CAULDRON_ITEM")).removeAllAttributs().addEnchantment(Enchantment.DURABILITY, 1).setDisplayName("§e" + Config.GameName + " wählen").build());
+
+ if(FightState.getFightState() == FightState.PRE_LEADER_SETUP && !Fight.getOpposite(this).isLeaderless()){
+ FightSystem.setPreSchemState();
+ }
}
public Collection getPlayers() {
@@ -259,89 +288,29 @@ public class FightTeam implements IFightTeam{
return ready;
}
- public void pasteSchematic(){
- if(Config.recording()){
- if(blue)
- RecordSystem.blueSchem(schematic);
- else
- RecordSystem.redSchem(schematic);
- }
-
- FreezeWorld freezer = new FreezeWorld();
- DyeColor c = ColorConverter.chat2dye(color);
- Schematic schem;
- try{
- schem = Schematic.getSchemFromDB(this.schematic);
- }catch(SecurityException e){
- pasteDummy();
- return;
- }
-
- try {
- VersionedRunnable.call(new VersionedRunnable(() -> {
- try {
- EditSession e = FightTeam_8.pasteSchematic(schem, pasteX, pasteY, pasteZ, rotate);
- FightTeam_8.replaceTeamColor(e, c, cornerX, cornerY, cornerZ);
- } catch (Schematic.WrongVersionException | IOException | NoClipboardException ex) {
- throw new SecurityException("Error pasting arena in schematic", ex);
- }
- }, 8), new VersionedRunnable(() -> {
- try {
- EditSession e = FightTeam_8.pasteSchematic(schem, pasteX, pasteY, pasteZ, rotate);
- FightTeam_12.replaceTeamColor(e, c, cornerX, cornerY, cornerZ);
- } catch (Schematic.WrongVersionException | IOException | NoClipboardException ex) {
- throw new SecurityException("Error pasting arena in schematic", ex);
- }
- }, 12), new VersionedRunnable(() -> {
- try {
- EditSession e = FightTeam_14.pasteSchematic(schem, pasteX, pasteY, pasteZ, rotate);
- FightTeam_14.replaceTeamColor(e, c, cornerX, cornerY, cornerZ);
- } catch (Schematic.WrongVersionException | IOException | NoClipboardException ex) {
- throw new SecurityException("Error pasting arena in schematic", ex);
- }
- }, 14));
- } catch (SecurityException securityException) {
- broadcast(FightSystem.PREFIX + "§cFehler beim Pasten der Schematic");
- throw securityException;
- }
- Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> HandlerList.unregisterAll(freezer), 3);
- Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), this::teleportToSpawn,40);
- }
-
- public void pasteDummy(){
- List publics = Schematic.getSchemsOfType(0, Config.SchematicType);
- if(publics.isEmpty())
- return;
-
- schematic = publics.get(new Random().nextInt(publics.size())).getSchemID();
- pasteSchematic();
-
- if(!Config.test() && leader != null)
- leader.getPlayer().getInventory().clear(0);
- }
-
- public void setSchematic(Schematic schematic){
- this.schematic = schematic.getSchemID();
- broadcast(FightSystem.PREFIX + "§7Das §e" + Config.GameName + " " + schematic.getSchemName() + " §7wird für den Kampf verwendet!");
-
- if(!Config.test())
- leader.getPlayer().getInventory().clear(0);
+ public void pasteSchem(Schematic schematic){
+ setSchem(schematic);
if(Config.test())
- pasteSchematic();
+ this.schematic.enable();
else if(Fight.getOpposite(this).hasSchematic()){
FightSystem.setPostSchemState();
}
}
+ public void setSchem(Schematic schematic){
+ this.schematic.setSchematic(schematic);
+ broadcast(FightSystem.PREFIX + "§7Das §e" + Config.GameName + " " + schematic.getSchemName() + " §7wird für den Kampf verwendet!");
+ }
+
public boolean hasSchematic(){
- return schematic != 0;
+ return schematic.hasSchematic();
}
public void setReady(boolean ready) {
Player l = leader.getPlayer();
- if(schematic == 0){
+ if(!schematic.hasSchematic()){
l.sendMessage(FightSystem.PREFIX + "§cZuerst muss eine Schematic gewählt sein!");
return;
}
@@ -358,6 +327,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;
}
@@ -375,7 +356,7 @@ public class FightTeam implements IFightTeam{
}
public int getSchematic() {
- return schematic;
+ return schematic.getId();
}
public Location getSpawn() {
@@ -397,51 +378,6 @@ public class FightTeam implements IFightTeam{
return currentHearts / maximumHearts;
}
- public void loadKits(){
- for(FightPlayer fightPlayer : players.values()) {
- if(fightPlayer.getPlayer() == null)
- continue;
- fightPlayer.getPlayer().getInventory().clear();
-
- PersonalKit personalKit = null;
- if(Config.PersonalKits)
- personalKit = PersonalKit.getKitInUse(SteamwarUser.get(fightPlayer.getPlayer().getUniqueId()).getId(), Config.SchematicType.toDB());
-
- if(personalKit != null){
- PlayerInventory inventory = fightPlayer.getPlayer().getInventory();
- inventory.setContents(personalKit.getInventory());
- inventory.setArmorContents(personalKit.getArmor());
- }else if(fightPlayer.getKit() != null)
- fightPlayer.getKit().loadToPlayer(fightPlayer.getPlayer());
- }
- }
-
- void replaceSync(boolean replace, Material target, Material replacement) {
- if(!replace)
- return;
-
- World world = Bukkit.getWorlds().get(0);
- Location minPoint = new Location(world, cornerX, cornerY, cornerZ);
- Location maxPoint = new Location(world, (cornerX + Config.SchemsizeX), (cornerY + Config.SchemsizeY), (cornerZ + Config.SchemsizeZ));
-
- FreezeWorld freezer = null;
- if(!Config.ReplaceWithBlockupdates)
- freezer = new FreezeWorld();
-
- for(int x = minPoint.getBlockX(); x <= maxPoint.getBlockX(); x++) {
- for(int z = minPoint.getBlockZ(); z <= maxPoint.getBlockZ(); z++) {
- for(int y = minPoint.getBlockY(); y <= maxPoint.getBlockY(); y++) {
- Block block = world.getBlockAt(x, y, z);
- if(block.getType() == target)
- block.setType(replacement);
- }
- }
- }
-
- if(!Config.ReplaceWithBlockupdates)
- HandlerList.unregisterAll(freezer);
- }
-
private void setTeamColor(Team team, ChatColor color){
VersionedRunnable.call(new VersionedRunnable(() -> FightTeam_8.setTeamColor(team, color), 8),
new VersionedRunnable(() -> FightTeam_9.setTeamColor(team, color), 9),
@@ -449,44 +385,48 @@ public class FightTeam implements IFightTeam{
new VersionedRunnable(() -> FightTeam_14.setTeamColor(team, color), 14));
}
- private static class FreezeWorld implements Listener {
- private FreezeWorld(){
- Bukkit.getPluginManager().registerEvents(this, IFightSystem.getPlugin());
+ public ChatColor getColor() {
+ return color;
+ }
+
+ private class KitLoader extends StateDependent {
+ private KitLoader() {
+ super(ArenaMode.All, FightState.Ingame);
+ register();
}
- @EventHandler
- public void onBlockPhysicsEvent(BlockPhysicsEvent e){
- e.setCancelled(true);
+ @Override
+ public void enable() {
+ for(FightPlayer fightPlayer : players.values()) {
+ Player player = fightPlayer.getPlayer();
+ PersonalKitCreator.closeIfInKitCreator(player);
+
+ player.getInventory().clear();
+ Fight.setPlayerGamemode(player, GameMode.SURVIVAL);
+ fightPlayer.getKit().loadToPlayer(player);
+ }
}
- @EventHandler
- public void onPistonExtend(BlockPistonExtendEvent e){
- e.setCancelled(true);
+ @Override
+ public void disable() {
+ players.values().forEach(fightPlayer -> fightPlayer.getPlayer().getInventory().clear());
+ }
+ }
+
+ private class SpectateHandler extends StateDependent {
+ private SpectateHandler() {
+ super(ArenaMode.All, FightState.Spectate);
+ register();
}
- @EventHandler
- public void onPistonRetract(BlockPistonRetractEvent e){
- e.setCancelled(true);
+ @Override
+ public void enable() {
+ players.values().forEach(fightPlayer -> Fight.setPlayerGamemode(fightPlayer.getPlayer(), GameMode.SPECTATOR));
}
- @EventHandler
- public void onBlockGrow(BlockGrowEvent e){
- e.setCancelled(true);
- }
-
- @EventHandler
- public void onRedstoneEvent(BlockRedstoneEvent e){
- e.setNewCurrent(e.getOldCurrent());
- }
-
- @EventHandler
- public void onBlockDispense(BlockDispenseEvent e){
- e.setCancelled(true);
- }
-
- @EventHandler
- public void onInventoryMoveEvent(InventoryMoveItemEvent e){
- e.setCancelled(true);
+ @Override
+ public void disable() {
+ players.values().forEach(fightPlayer -> Fight.setPlayerGamemode(fightPlayer.getPlayer(), GameMode.SURVIVAL));
}
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightWorld.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightWorld.java
new file mode 100644
index 0000000..8b99fdc
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/FightWorld.java
@@ -0,0 +1,62 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import de.steamwar.core.VersionedRunnable;
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependent;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+
+public class FightWorld extends StateDependent {
+
+ private final World world = Bukkit.getWorlds().get(0);
+
+ public FightWorld() {
+ super(ArenaMode.Restartable, FightState.Schem);
+ register();
+ }
+
+ @Override
+ public void enable() {
+ //unused
+ }
+
+ @Override
+ public void disable() {
+ World backup = new WorldCreator(world.getName() + "/backup").createWorld();
+ assert backup != null;
+ Config.ArenaRegion.forEachChunk((x, z) -> resetChunk(backup, x, z));
+ Bukkit.unloadWorld(backup, false);
+ }
+
+ private void resetChunk(World backup, int x, int z){
+ VersionedRunnable.call(
+ new VersionedRunnable(() -> FightWorld_8.resetChunk(world, backup, x, z), 8),
+ new VersionedRunnable(() -> FightWorld_9.resetChunk(world, backup, x, z), 9),
+ new VersionedRunnable(() -> FightWorld_10.resetChunk(world, backup, x, z), 10),
+ new VersionedRunnable(() -> FightWorld_12.resetChunk(world, backup, x, z), 12),
+ new VersionedRunnable(() -> FightWorld_14.resetChunk(world, backup, x, z), 14),
+ new VersionedRunnable(() -> FightWorld_15.resetChunk(world, backup, x, z), 15));
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/fight/Kit.java b/FightSystem_Main/src/de/steamwar/fightsystem/fight/Kit.java
new file mode 100644
index 0000000..6daffdf
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/fight/Kit.java
@@ -0,0 +1,349 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.fight;
+
+import de.steamwar.core.Core;
+import de.steamwar.core.VersionedCallable;
+import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.commands.Commands;
+import de.steamwar.fightsystem.commands.GUI;
+import de.steamwar.fightsystem.listener.*;
+import de.steamwar.inventory.SWInventory;
+import de.steamwar.inventory.SWItem;
+import de.steamwar.sql.PersonalKit;
+import de.steamwar.sql.SteamwarUser;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.BlockDataMeta;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.potion.PotionEffect;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+import java.util.logging.Level;
+
+public class Kit {
+ private static final File kits = new File(FightSystem.getPlugin().getDataFolder(), Config.KitFile);
+ private static final ArrayList loadedKits = new ArrayList<>();
+
+ static {
+ if(!kits.exists()) {
+ Bukkit.getLogger().log(Level.SEVERE, "Kitconfig fehlend!");
+ }
+
+ FileConfiguration kitData = YamlConfiguration.loadConfiguration(kits);
+ ConfigurationSection kitSection = kitData.getConfigurationSection("Kits");
+
+ for(String key : Objects.requireNonNull(kitSection).getKeys(false)) {
+ loadedKits.add(new Kit(Objects.requireNonNull(kitSection.getConfigurationSection(key))));
+ }
+ }
+
+ private final String name;
+ private final ItemStack[] inventory;
+ private final ItemStack[] armor;
+ private final Collection effects;
+ private final int enterStage;
+ private final boolean tnt;
+ private final boolean leaderAllowed;
+ private final boolean memberAllowed;
+
+ public Kit(String name, Player player) {
+ this.name = name;
+ this.inventory = player.getInventory().getContents();
+ this.armor = player.getInventory().getArmorContents();
+ this.effects = player.getActivePotionEffects();
+ this.leaderAllowed = true;
+ this.memberAllowed = true;
+ this.enterStage = 0;
+ this.tnt = true;
+ }
+
+ public Kit(ConfigurationSection kit){
+ name = kit.getName();
+ inventory = Objects.requireNonNull(kit.getList("Items")).toArray(new ItemStack[0]);
+ if(kit.isList("Armor"))
+ armor = Objects.requireNonNull(kit.getList("Armor")).toArray(new ItemStack[0]);
+ else
+ armor = null;
+ leaderAllowed = kit.getBoolean("LeaderAllowed");
+ memberAllowed = kit.getBoolean("MemberAllowed");
+ if(kit.isList("Effects"))
+ effects = (List) kit.getList("Effects");
+ else
+ effects = null;
+ enterStage = kit.getInt("EnterStage", 0);
+ tnt = kit.getBoolean("TNT", true);
+ }
+
+ public Kit(PersonalKit kit){
+ this.name = kit.getName();
+ this.inventory = kit.getInventory();
+ this.armor = kit.getArmor();
+ this.effects = Collections.emptyList();
+ this.leaderAllowed = true;
+ this.memberAllowed = true;
+ this.enterStage = 0;
+ this.tnt = true;
+ }
+
+ public static Kit getKitByName(String kitName) {
+ for(Kit kit : loadedKits) {
+ if(kit.getName().equalsIgnoreCase(kitName))
+ return kit;
+ }
+ return null;
+ }
+
+ public static List getAvailableKits(boolean leader){
+ List kits = new ArrayList<>();
+ for (Kit k : loadedKits) {
+ if (k.canUseKit(leader)){
+ kits.add(k);
+ }
+ }
+ return kits;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean canUseKit(boolean leader){
+ if (leader) {
+ return leaderAllowed;
+ } else {
+ return memberAllowed;
+ }
+ }
+
+ public boolean leaderExclusive() {
+ return !memberAllowed;
+ }
+
+ public ItemStack[] getInventory() {
+ return inventory;
+ }
+
+ public ItemStack[] getArmor() {
+ return armor;
+ }
+
+ /* Is this kit allowed to set/handle tnt? */
+ public boolean isTnt(){
+ return tnt;
+ }
+
+ /* In which stage is entern allowed? */
+ public int getEnterStage() {
+ return enterStage;
+ }
+
+ public void toPersonalKit(PersonalKit kit) {
+ kit.setContainer(inventory, armor);
+ }
+
+ public void removeBadItems(){
+ Kit normal = Kit.getKitByName(Config.MemberDefault);
+ assert normal != null;
+
+ for(int i = 0; i < inventory.length; i++){
+ if(isBadItem(inventory[i]))
+ inventory[i] = null;
+ }
+
+ }
+
+ public static boolean isBadItem(ItemStack stack){
+ if(stack == null)
+ return false;
+
+ //Check for forbidden item
+ if(Config.ForbiddenItems.contains(stack.getType().name()))
+ return true;
+
+ //Check for attribute modifiers
+ if(Core.getVersion() >= 14 && PersonalKitCreator_14.hasAttributeModifier(stack)){
+ return true;
+ }
+
+ if(stack.hasItemMeta()){
+ ItemMeta meta = stack.getItemMeta();
+ if(meta instanceof BlockDataMeta && ((BlockDataMeta)meta).hasBlockData())
+ return true; //Blocks always upwards slabs etc.
+
+ if(VersionedCallable.call(new VersionedCallable<>(() -> PersonalKitCreator_8.hasItems(stack), 8),
+ new VersionedCallable<>(() -> PersonalKitCreator_9.hasItems(stack), 9),
+ new VersionedCallable<>(() -> PersonalKitCreator_10.hasItems(stack), 10),
+ new VersionedCallable<>(() -> PersonalKitCreator_12.hasItems(stack), 12),
+ new VersionedCallable<>(() -> PersonalKitCreator_14.hasItems(stack), 14),
+ new VersionedCallable<>(() -> PersonalKitCreator_15.hasItems(stack), 15)))
+ return true; //Blocks prefilled inventories
+ }
+
+ Kit normal = Kit.getKitByName(Config.MemberDefault);
+ assert normal != null;
+ return !normal.isEnchantmentInKit(stack) && !stack.getEnchantments().isEmpty();
+ }
+
+ private boolean isEnchantmentInKit(ItemStack stack){
+ for(ItemStack is : inventory){
+ if(similar(stack, is))
+ return true;
+ }
+ if(armor != null){
+ for(ItemStack is : armor){
+ if(similar(stack, is))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean similar(ItemStack stack, ItemStack stack2){
+ if(stack == null || stack2 == null)
+ return false;
+ if(stack.getType() != stack2.getType())
+ return false;
+ if(stack.hasItemMeta() != stack2.hasItemMeta())
+ return false;
+ if(stack.getItemMeta() == null || stack2.getItemMeta() == null)
+ return true;
+
+ //Enchantment Map comparison used for default similarity check does not work
+ Map en = stack.getItemMeta().getEnchants();
+ Map en2 = new HashMap<>(stack.getItemMeta().getEnchants());
+
+ for(Map.Entry e : en.entrySet()){
+ if(!en2.remove(e.getKey(), e.getValue()))
+ return false;
+ }
+ return en2.isEmpty();
+ }
+
+ public void loadToPlayer(Player player) {
+ player.getInventory().setContents(inventory);
+ if(armor != null)
+ player.getInventory().setArmorContents(armor);
+ player.updateInventory();
+ if(effects != null)
+ player.addPotionEffects(effects);
+ }
+
+ /**
+ * Opens a kit preview with the options to go back to kit selection or to select the kit.
+ */
+ public void preview(Player player){
+ SWInventory inv = new SWInventory(player, 54, name);
+
+ //36 = Inventargröße
+ for(int i = 0; i < 36; i++){
+ if(inventory[i] == null)
+ continue;
+ SWItem item = new SWItem();
+ item.setItemStack(inventory[i]);
+ inv.setItem(i, item);
+ }
+
+ if(armor != null){
+ for(int i = 0; i < 4; i++){
+ if(armor[i] == null)
+ continue;
+ SWItem item = new SWItem();
+ item.setItemStack(armor[i]);
+ inv.setItem(36 + i, item);
+ }
+ }
+
+ if(effects != null){
+ Iterator it = effects.iterator();
+ int pos = 44;
+ while(it.hasNext()){
+ PotionEffect effect = it.next();
+ SWItem item = new SWItem(SWItem.getMaterial("POTION"), effect.getType().getName());
+ inv.setItem(pos, item);
+ pos--;
+ }
+ }
+
+ inv.setCallback(-999, click -> player.closeInventory());
+ if(Config.PersonalKits){
+ inv.setItem(49, SWItem.getMaterial("WOOD_AXE"), "§7Kit bearbeiten", clickType -> PersonalKitCreator.openKitCreator(player, PersonalKit.get(SteamwarUser.get(player.getUniqueId()).getId(), Config.SchematicType.toDB(), name)));
+ inv.setItem(53, Material.BARRIER, "§cKit löschen", clickType -> {
+ player.closeInventory();
+ SWInventory conf = new SWInventory(player, 9, "Kit wirklich löchen?");
+ conf.setItem(8, SWItem.getDye(1), "§cAbbrechen", click -> player.closeInventory());
+ conf.setItem(0, SWItem.getDye(10), "§aLöschen", click -> {
+ player.closeInventory();
+ SteamwarUser user = SteamwarUser.get(player.getUniqueId());
+ PersonalKit kit = PersonalKit.get(user.getId(), Config.SchematicType.toDB(), name);
+ if(kit.isInUse()) {
+ List kits = PersonalKit.get(user.getId(), Config.SchematicType.toDB());
+ if(!kits.isEmpty()){
+ PersonalKit kit1 = kits.get(0);
+ kit1.setInUse();
+ FightPlayer fightPlayer = Fight.getFightPlayer(player);
+ assert fightPlayer != null;
+ fightPlayer.setKit(new Kit(kit1));
+ }
+ }
+ kit.delete();
+ });
+ conf.open();
+ });
+ }
+ inv.setItem(45, SWItem.getDye(10), (byte)10, "§aKit wählen", click -> {
+ Commands.kit(player, name);
+ player.closeInventory();
+ });
+ inv.setItem(53, SWItem.getDye(1), (byte)1, "§cZurück", click -> GUI.kitSelection(player, ""));
+ inv.open();
+ }
+
+ public static void createKit(String kitName, Player player){
+ loadedKits.add(new Kit(kitName, player));
+ YamlConfiguration yamlConfiguration = new YamlConfiguration();
+ for(Kit k : loadedKits){
+ ConfigurationSection section = yamlConfiguration.createSection("Kits." + k.getName());
+ section.set("Items", k.inventory);
+ if(k.armor != null)
+ section.set("Armor", k.armor);
+ section.set("LeaderAllowed", k.leaderAllowed);
+ section.set("MemberAllowed", k.memberAllowed);
+ section.set("Effects", k.effects);
+ section.set("EnterStage", k.enterStage);
+ section.set("TNT", k.tnt);
+ }
+
+ try {
+ yamlConfiguration.save(kits);
+ }catch(IOException e){
+ throw new SecurityException("Failed to save kits.data", e);
+ }
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/kit/Kit.java b/FightSystem_Main/src/de/steamwar/fightsystem/kit/Kit.java
deleted file mode 100644
index 61049a9..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/kit/Kit.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.kit;
-
-import de.steamwar.fightsystem.commands.Commands;
-import de.steamwar.fightsystem.commands.GUI;
-import de.steamwar.inventory.SWInventory;
-import de.steamwar.inventory.SWItem;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.potion.PotionEffect;
-
-import java.util.*;
-
-public class Kit {
-
- private final String name;
- private final boolean leaderAllowed;
- private final boolean memberAllowed;
- private final ItemStack[] inventory;
- private final ItemStack[] armor;
- private final Collection effects;
- private final int enterStage;
- private final boolean tnt;
-
- Kit(String name, Player player) {
- this.name = name;
- this.leaderAllowed = true;
- this.memberAllowed = true;
- this.inventory = player.getInventory().getContents();
- this.armor = player.getInventory().getArmorContents();
- this.effects = player.getActivePotionEffects();
- this.enterStage = 0;
- this.tnt = true;
- }
-
- Kit(ConfigurationSection kit){
- name = kit.getName();
- inventory = Objects.requireNonNull(kit.getList("Items")).toArray(new ItemStack[0]);
- if(kit.isList("Armor"))
- armor = Objects.requireNonNull(kit.getList("Armor")).toArray(new ItemStack[0]);
- else
- armor = null;
- leaderAllowed = kit.getBoolean("LeaderAllowed");
- memberAllowed = kit.getBoolean("MemberAllowed");
- if(kit.isList("Effects"))
- effects = (Collection) kit.getList("Effects");
- else
- effects = null;
- enterStage = kit.getInt("EnterStage", 0);
- tnt = kit.getBoolean("TNT", true);
- }
-
- public String getName() {
- return name;
- }
-
- public boolean isLeaderAllowed() {
- return leaderAllowed;
- }
-
- public boolean isMemberAllowed() {
- return memberAllowed;
- }
-
- public ItemStack[] getInventory() {
- return inventory;
- }
-
- public ItemStack[] getArmor() {
- return armor;
- }
-
- /* Is this kit allowed to set/handle tnt? */
- public boolean isTnt(){
- return tnt;
- }
-
- /* In which stage is entern allowed? */
- public int getEnterStage() {
- return enterStage;
- }
-
- public boolean isEnchantmentInKit(ItemStack stack){
- for(ItemStack is : inventory){
- if(similar(stack, is))
- return true;
- }
- if(armor != null){
- for(ItemStack is : armor){
- if(similar(stack, is))
- return true;
- }
- }
- return false;
- }
-
- private boolean similar(ItemStack stack, ItemStack stack2){
- if(stack == null || stack2 == null)
- return false;
- if(stack.getType() != stack2.getType())
- return false;
- if(stack.hasItemMeta() != stack2.hasItemMeta())
- return false;
- if(stack.getItemMeta() == null || stack2.getItemMeta() == null)
- return true;
-
- //Enchantment Map comparison used for default similarity check does not work
- Map en = stack.getItemMeta().getEnchants();
- Map en2 = new HashMap<>(stack.getItemMeta().getEnchants());
-
- for(Map.Entry e : en.entrySet()){
- if(!en2.remove(e.getKey(), e.getValue()))
- return false;
- }
- return en2.isEmpty();
- }
-
- public void loadToPlayer(Player player) {
- player.getInventory().setContents(inventory);
- if(armor != null)
- player.getInventory().setArmorContents(armor);
- player.updateInventory();
- if(effects != null)
- player.addPotionEffects(effects);
- }
-
- void saveKit(ConfigurationSection section){
- section.set("Items", inventory);
- if(armor != null)
- section.set("Armor", armor);
- section.set("LeaderAllowed", leaderAllowed);
- section.set("MemberAllowed", memberAllowed);
- section.set("Effects", effects);
- section.set("EnterStage", enterStage);
- section.set("TNT", tnt);
- }
-
- /**
- * Opens a kit preview with the options to go back to kit selection or to select the kit.
- * @param player
- */
- public void preview(Player player){
- SWInventory inv = new SWInventory(player, 54, name);
-
- preview(inv, inventory, armor, effects);
-
- inv.setCallback(-999, (click) -> player.closeInventory());
- inv.setItem(45, SWItem.getDye(10), (byte)10, "§aKit wählen", (click) -> {
- Commands.kit(player, name);
- player.closeInventory();
- });
- inv.setItem(53, SWItem.getDye(1), (byte)1, "§cZurück", (click) -> GUI.kitSelection(player));
- inv.open();
- }
-
- public static void preview(SWInventory inv, ItemStack[] inventory, ItemStack[] armor, Collection effects) {
- //36 = Inventargröße
- for(int i = 0; i < 36; i++){
- if(inventory[i] == null)
- continue;
- SWItem item = new SWItem();
- item.setItemStack(inventory[i]);
- inv.setItem(i, item);
- }
-
- if(armor != null){
- for(int i = 0; i < 4; i++){
- if(armor[i] == null)
- continue;
- SWItem item = new SWItem();
- item.setItemStack(armor[i]);
- inv.setItem(36 + i, item);
- }
- }
-
- if(effects != null){
- Iterator it = effects.iterator();
- int pos = 44;
- while(it.hasNext()){
- PotionEffect effect = it.next();
- SWItem item = new SWItem(SWItem.getMaterial("POTION"), effect.getType().getName());
- inv.setItem(pos, item);
- pos--;
- }
- }
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/kit/KitManager.java b/FightSystem_Main/src/de/steamwar/fightsystem/kit/KitManager.java
deleted file mode 100644
index bf58691..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/kit/KitManager.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.kit;
-
-import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.Player;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-
-public class KitManager {
- private KitManager(){}
-
- private static final File kits = new File(FightSystem.getPlugin().getDataFolder(), Config.KitFile);
- private static final FileConfiguration kitData = YamlConfiguration.loadConfiguration(kits);
-
- private static final ArrayList loadedKits = new ArrayList<>();
-
- public static void saveInventory(String kitName, Player player){
- loadedKits.add(new Kit(kitName, player));
- saveAllKits();
- }
-
- public static Kit getKitByName(String kitName) {
- for(Kit kit : loadedKits) {
- if(kit.getName().equalsIgnoreCase(kitName))
- return kit;
- }
- return null;
- }
-
- public static List getKits(boolean leader){
- List kits = new ArrayList<>();
- if(leader){
- for (Kit k : loadedKits)
- if (k.isLeaderAllowed())
- kits.add(k);
- }else{
- for (Kit k : loadedKits)
- if (k.isMemberAllowed())
- kits.add(k);
- }
- return kits;
- }
-
- public static void loadAllKits() {
- if(!kits.exists()) {
- saveAllKits();
- Bukkit.getLogger().log(Level.SEVERE, "kit config fehlend!");
- FightSystem.shutdown(null);
- return;
- }
-
- if(kitData.getConfigurationSection("Kits") != null) {
- for(String key : kitData.getConfigurationSection("Kits").getKeys(false)) {
- loadedKits.add(new Kit(kitData.getConfigurationSection("Kits." + key)));
- }
- }
- }
-
- private static void saveAllKits(){
- YamlConfiguration yamlConfiguration = new YamlConfiguration();
- for(Kit k : loadedKits)
- k.saveKit(yamlConfiguration.createSection("Kits." + k.getName()));
-
- try {
- yamlConfiguration.save(kits);
- }catch(IOException e){
- throw new SecurityException("Failed to save kits.data", e);
- }
- }
-
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArenaBorder.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArenaBorder.java
new file mode 100644
index 0000000..d0ceee8
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArenaBorder.java
@@ -0,0 +1,72 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.listener;
+
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import net.md_5.bungee.api.chat.TextComponent;
+import org.bukkit.GameMode;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerMoveEvent;
+
+public class ArenaBorder implements Listener {
+
+ public ArenaBorder() {
+ new StateDependentListener(ArenaMode.All, FightState.All, this);
+ }
+
+ @EventHandler
+ public void arenaBorder(PlayerMoveEvent event){
+ Player player = event.getPlayer();
+ Location to = event.getTo();
+ assert to != null;
+
+ if(!Config.ArenaRegion.in2dRegion(to)){
+ reset(event);
+ return;
+ }
+
+ FightTeam team = Fight.getPlayerTeam(player);
+ if(team == null || player.getGameMode() == GameMode.SPECTATOR)
+ return;
+
+ if(to.getY() <= Config.ArenaRegion.getMinY()) {
+ if(FightState.infight())
+ player.damage(2);
+ else if(!Config.GroundWalkable)
+ player.teleport(team.getSpawn());
+ }else if(to.getY() + 1.8 > Config.ArenaRegion.getMaxY()){
+ reset(event);
+ }
+ }
+
+ private void reset(PlayerMoveEvent event){
+ Player player = event.getPlayer();
+ player.teleport(event.getFrom());
+ BasicListener.toActionbar(player, TextComponent.fromLegacyText("§cDu darfst die Arena nicht verlassen"));
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityExplodeListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArrowPickup.java
similarity index 63%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityExplodeListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/ArrowPickup.java
index 2ff7c63..b8d4693 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityExplodeListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArrowPickup.java
@@ -19,22 +19,16 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.core.Core;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.utils.WaterRemover;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.entity.EntityExplodeEvent;
+import de.steamwar.fightsystem.states.StateDependentListener;
-import java.util.EnumSet;
+public class ArrowPickup {
-public class EntityExplodeListener extends BasicListener {
-
- public EntityExplodeListener() {
- super(EnumSet.of(FightState.RUNNING));
- }
-
- @EventHandler
- public void handleEntityExplode(EntityExplodeEvent event) {
- event.setYield(0); //No drops (additionally to world config)
- WaterRemover.add(event.blockList());
+ public ArrowPickup() {
+ if(Core.getVersion() > 8){
+ new StateDependentListener(ArenaMode.All, FightState.All, new PickupArrowListener_9());
+ }
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArrowStopper.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArrowStopper.java
index 7dcfc68..696d0e7 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArrowStopper.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ArrowStopper.java
@@ -20,27 +20,27 @@
package de.steamwar.fightsystem.listener;
import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import de.steamwar.fightsystem.states.StateDependentTask;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
+import org.bukkit.event.Listener;
import org.bukkit.projectiles.ProjectileSource;
-import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
-import java.util.EnumSet;
+public class ArrowStopper implements Listener {
-public class ArrowStopper extends BasicListener {
-
- private BukkitTask task;
private static final Vector NULL_VECTOR = new Vector(0, 0, 0);
private static final BlockFace[] BLOCK_FACES = {BlockFace.UP, BlockFace.DOWN, BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH};
+
public ArrowStopper() {
- super(Config.TechhiderActive ? EnumSet.of(FightState.RUNNING) : EnumSet.noneOf(FightState.class));
+ new StateDependentListener(Config.TechhiderActive, FightState.Running, this);
+ new StateDependentTask(Config.TechhiderActive, FightState.Running, this::run, 1, 1);
}
private void run() {
@@ -62,18 +62,6 @@ public class ArrowStopper extends BasicListener {
}
}
- @Override
- public void enable() {
- super.enable();
- task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::run, 1, 1);
- }
-
- @Override
- public void disable() {
- super.disable();
- task.cancel();
- }
-
private boolean checkBlocks(Block start, Block end) {
Block cursor = start;
@@ -97,7 +85,7 @@ public class ArrowStopper extends BasicListener {
}
private boolean checkBlock(Block block) {
- return Config.HiddenBlockTags.contains(block.getType().name());
+ return Config.HiddenBlocks.contains(block.getType().name());
}
private boolean invalidEntity(Arrow entity) {
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/BasicListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/BasicListener.java
index 467a6e6..c572101 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/BasicListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/BasicListener.java
@@ -20,28 +20,14 @@
package de.steamwar.fightsystem.listener;
import de.steamwar.core.VersionedRunnable;
-import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
-import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.states.StateDependent;
import net.md_5.bungee.api.chat.BaseComponent;
-import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
-import java.util.Set;
+public class BasicListener {
+ private BasicListener(){}
-public abstract class BasicListener implements Listener, StateDependent {
-
- private final Set enabled;
-
- BasicListener(Set enabled){
- this.enabled = enabled;
- FightSystem.registerStateDependent(this);
- }
-
- boolean notFighting(Player p){
+ public static boolean notFighting(Player p){
return Fight.getFightPlayer(p) == null;
}
@@ -55,22 +41,7 @@ public abstract class BasicListener implements Listener, StateDependent {
new VersionedRunnable(() -> BasicListener_9.toChat(player, components), 9));
}
- void setAttackSpeed(Player player){
+ public static void setAttackSpeed(Player player){
VersionedRunnable.call(new VersionedRunnable(() -> BasicListener_9.setAttackSpeed(player), 9));
}
-
- @Override
- public void enable(){
- Bukkit.getPluginManager().registerEvents(this, FightSystem.getPlugin());
- }
-
- @Override
- public void disable(){
- HandlerList.unregisterAll(this);
- }
-
- @Override
- public Set enabled() {
- return enabled;
- }
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerChatListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Chat.java
similarity index 87%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerChatListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/Chat.java
index 394f109..8e89799 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerChatListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Chat.java
@@ -19,25 +19,26 @@
package de.steamwar.fightsystem.listener;
+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.record.RecordSystem;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
-import java.util.EnumSet;
+public class Chat implements Listener {
-public class PlayerChatListener extends BasicListener {
-
- public PlayerChatListener(){
- super(EnumSet.allOf(FightState.class));
+ public Chat(){
+ new StateDependentListener(ArenaMode.All, FightState.All, this);
}
@EventHandler
@@ -63,10 +64,9 @@ public class PlayerChatListener extends BasicListener {
}
private void broadcastChat(String message) {
- if (Config.recording())
- RecordSystem.chat(message);
+ RecordSystem.chat(message);
BaseComponent[] msg = TextComponent.fromLegacyText(message);
for(Player p : Bukkit.getOnlinePlayers())
- toChat(p, msg);
+ BasicListener.toChat(p, msg);
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/CheckListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Check.java
similarity index 88%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/CheckListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/Check.java
index 78f5e2b..0681294 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/CheckListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Check.java
@@ -19,24 +19,26 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import de.steamwar.sql.Schematic;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserGroup;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerJoinEvent;
-import java.util.EnumSet;
import java.util.logging.Level;
-public class CheckListener extends BasicListener {
+public class Check implements Listener {
- public CheckListener() {
- super(Config.check() ? EnumSet.allOf(FightState.class) : EnumSet.noneOf(FightState.class));
+ public Check() {
+ new StateDependentListener(ArenaMode.Check, FightState.All, this);
}
@EventHandler
@@ -66,7 +68,7 @@ public class CheckListener extends BasicListener {
Bukkit.getLogger().log(Level.SEVERE, player.getName() + " tried to use a copy command!");
}
- private static boolean allowedToCheck(SteamwarUser user) {
+ private boolean allowedToCheck(SteamwarUser user) {
return user.getUserGroup() == UserGroup.Supporter ||
user.getUserGroup() == UserGroup.Developer ||
user.getUserGroup() == UserGroup.Moderator ||
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/DenyWorldInteraction.java
similarity index 68%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/DenyWorldInteraction.java
index 4206418..ca0d01c 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FreezeWorldStateListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/DenyWorldInteraction.java
@@ -19,40 +19,40 @@
package de.steamwar.fightsystem.listener;
-import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
+import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
-import org.bukkit.event.inventory.InventoryPickupItemEvent;
-import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerKickEvent;
-import java.util.EnumSet;
+public class DenyWorldInteraction implements Listener {
-public class FreezeWorldStateListener extends BasicListener {
-
- public FreezeWorldStateListener() {
- super(Config.test() ? EnumSet.of(FightState.PRE_RUNNING) : EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP, FightState.PRE_RUNNING, FightState.SPECTATE));
+ public DenyWorldInteraction() {
+ new StateDependentListener(ArenaMode.Test, FightState.PreRunning, this);
+ new StateDependentListener(ArenaMode.AntiTest, FightState.AntiRunning, this);
}
@EventHandler
public void handleBlockBreak(BlockBreakEvent event) {
Player player = event.getPlayer();
event.setCancelled(true);
- toActionbar(player, TextComponent.fromLegacyText("§cDu darfst derzeit keine Blöcke abbauen!"));
+ BasicListener.toActionbar(player, TextComponent.fromLegacyText("§cDu darfst derzeit keine Blöcke abbauen!"));
}
@EventHandler
public void handleBlockPlace(BlockPlaceEvent event) {
Player player = event.getPlayer();
event.setCancelled(true);
- toActionbar(player, TextComponent.fromLegacyText("§cDu darfst derzeit keine Blöcke setzen!"));
+ BasicListener.toActionbar(player, TextComponent.fromLegacyText("§cDu darfst derzeit keine Blöcke setzen!"));
}
@EventHandler
@@ -60,18 +60,18 @@ public class FreezeWorldStateListener extends BasicListener {
event.setCancelled(true);
}
- @EventHandler
- public void onInventoryClick(InventoryClickEvent event) {
- if(PersonalKitCreator.notInKitCreator(event.getWhoClicked()))
- event.setCancelled(true);
- }
-
@EventHandler
public void handlePlayerKickEvent(PlayerKickEvent e){
if(e.getReason().contains("Flying is not enabled"))
e.setCancelled(true);
}
+ @EventHandler
+ public void onInventoryClick(InventoryClickEvent event) {
+ if(PersonalKitCreator.notInKitCreator(event.getWhoClicked()))
+ event.setCancelled(true);
+ }
+
@EventHandler
public void onInventoryDrag(InventoryDragEvent event) {
if(PersonalKitCreator.notInKitCreator(event.getWhoClicked()))
@@ -79,12 +79,11 @@ public class FreezeWorldStateListener extends BasicListener {
}
@EventHandler
- public void onDropPickup(InventoryPickupItemEvent e){
- e.setCancelled(true);
- }
-
- @EventHandler
- public void onDropping(PlayerDropItemEvent e){
- e.setCancelled(true);
+ public void handleProjectileLaunch(ProjectileLaunchEvent event) {
+ event.setCancelled(true);
+ if(event.getEntity().getShooter() instanceof Player){
+ Player player = (Player) event.getEntity().getShooter();
+ BasicListener.toActionbar(player, TextComponent.fromLegacyText("§cDu darfst den Bogen erst nach Kampfbeginn nutzen!"));
+ }
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityDamageListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityDamage.java
similarity index 81%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityDamageListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityDamage.java
index b6c4fcf..fb9ae04 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityDamageListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/EntityDamage.java
@@ -19,17 +19,18 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
-import java.util.EnumSet;
+public class EntityDamage implements Listener {
-public class EntityDamageListener extends BasicListener {
-
- public EntityDamageListener() {
- super(EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP, FightState.PRE_RUNNING, FightState.SPECTATE));
+ public EntityDamage() {
+ new StateDependentListener(ArenaMode.All, FightState.AntiRunning, this);
}
@EventHandler
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoinListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoin.java
similarity index 69%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoinListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoin.java
index 6e60e5c..55195dc 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoinListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventJoin.java
@@ -19,25 +19,25 @@
package de.steamwar.fightsystem.listener;
+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.FightPlayer;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import de.steamwar.sql.SteamwarUser;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
-import java.util.EnumSet;
+public class EventJoin implements Listener {
-public class EventJoinListener extends BasicListener {
-
- public EventJoinListener() {
- super(Config.event() ? EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP) : EnumSet.noneOf(FightState.class));
+ public EventJoin() {
+ new StateDependentListener(ArenaMode.Event, FightState.All, this);
}
@EventHandler
@@ -60,29 +60,29 @@ public class EventJoinListener extends BasicListener {
Player player = event.getPlayer();
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){
- FightPlayer fp = team.addMember(player);
- if(!team.hasTeamLeader())
- team.setLeader(fp);
- 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()){
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FightScoreboard.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/FightScoreboard.java
new file mode 100644
index 0000000..40c4c2e
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/FightScoreboard.java
@@ -0,0 +1,142 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.listener;
+
+import de.steamwar.core.TPSWatcher;
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.countdown.Countdown;
+import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.record.RecordSystem;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import de.steamwar.fightsystem.states.StateDependentTask;
+import de.steamwar.fightsystem.winconditions.PrintableWincondition;
+import de.steamwar.fightsystem.winconditions.Wincondition;
+import de.steamwar.scoreboard.SWScoreboard;
+import de.steamwar.scoreboard.ScoreboardCallback;
+import org.bukkit.Bukkit;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.scoreboard.Scoreboard;
+
+import java.util.*;
+
+public class FightScoreboard implements Listener {
+
+ private static final Set fullScoreboard = EnumSet.of(FightState.RUNNING, FightState.SPECTATE);
+
+ private int index = 0;
+ private String title = "";
+ private final HashMap scores = new HashMap<>();
+
+ public static Scoreboard getScoreboard() {
+ return Objects.requireNonNull(Bukkit.getScoreboardManager()).getMainScoreboard();
+ }
+
+ public FightScoreboard(){
+ new StateDependentListener(ArenaMode.All, FightState.All, this);
+ new StateDependentTask(ArenaMode.All, FightState.All, this::nextIndexDisplay, 0, 200);
+ }
+
+ @EventHandler
+ public void onPlayerJoin(PlayerJoinEvent event) {
+ SWScoreboard.createScoreboard(event.getPlayer(), new ScoreboardCallback() {
+ @Override
+ public HashMap getData() {
+ return scores;
+ }
+
+ @Override
+ public String getTitle() {
+ return title;
+ }
+ });
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ SWScoreboard.removeScoreboard(event.getPlayer());
+ }
+
+ private void teamScoreboard(FightTeam fightTeam){
+ setTitle(fightTeam.getColoredName());
+ fightTeam.getPlayers().forEach(fp -> {
+ if(fp.isLiving())
+ addScore(fightTeam.getPrefix() + fp.getPlayer().getName(), (int) Math.ceil(fp.getPlayer().getHealth()));
+ });
+ }
+
+ private void generalScoreboard(){
+ setTitle("§eKampf");
+ List scoreList = new ArrayList<>();
+
+ Countdown timeOverCountdown = Wincondition.getTimeOverCountdown();
+ if(timeOverCountdown != null){
+ int fightTime = timeOverCountdown.getTimeLeft();
+ if (fightTime >= 60)
+ scoreList.add("§7Zeit: §a" + fightTime / 60 + "m " + fightTime % 60 + "s");
+ else
+ scoreList.add("§7Zeit: §a" + fightTime + "s");
+ }
+
+ scoreList.add("§7TPS: §e" + TPSWatcher.getTPS());
+
+ if(fullScoreboard.contains(FightState.getFightState())){
+ for(PrintableWincondition wincondition : Wincondition.getPrintableWinconditions()){
+ scoreList.add(wincondition.getDisplay(Fight.getRedTeam()));
+ scoreList.add(wincondition.getDisplay(Fight.getBlueTeam()));
+ }
+ }
+
+ int value = scoreList.size();
+ for(String score : scoreList){
+ addScore(score, value--);
+ }
+ }
+
+ private void nextIndexDisplay() {
+ index++;
+ if(index > 2)
+ index = 0;
+ FightTeam team = null;
+ if(index == 1)
+ team = Fight.getRedTeam();
+ if(index == 2)
+ team = Fight.getBlueTeam();
+ scores.clear();
+ if(team != null)
+ teamScoreboard(team);
+ else
+ generalScoreboard();
+ }
+
+ private void setTitle(String t) {
+ title = t;
+ RecordSystem.scoreboardTitle(t);
+ }
+
+ private void addScore(String string, int i) {
+ scores.put(string, i);
+ RecordSystem.scoreboardData(string, i);
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/HotbarGUIListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/HotbarGUI.java
similarity index 88%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/HotbarGUIListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/HotbarGUI.java
index 962bf57..2827c50 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/HotbarGUIListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/HotbarGUI.java
@@ -19,22 +19,23 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.commands.GUI;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.meta.ItemMeta;
-import java.util.EnumSet;
+public class HotbarGUI implements Listener {
-public class HotbarGUIListener extends BasicListener {
-
- public HotbarGUIListener() {
- super(EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP));
+ public HotbarGUI() {
+ new StateDependentListener(ArenaMode.All, FightState.Setup, this);
}
@EventHandler
@@ -78,7 +79,7 @@ public class HotbarGUIListener extends BasicListener {
break;
case "§eKit bearbeiten":
case "§eKit wählen":
- GUI.kitSelection(player);
+ GUI.kitSelection(player, "");
break;
case "§eRespawn":
player.teleport(fightTeam.getSpawn());
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightDamageListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightDamage.java
similarity index 83%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightDamageListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightDamage.java
index b073645..d525e6c 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightDamageListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightDamage.java
@@ -19,22 +19,24 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
-import java.util.EnumSet;
import java.util.Objects;
-public class InFightDamageListener extends BasicListener {
+public class InFightDamage implements Listener {
- public InFightDamageListener() {
- super(EnumSet.of(FightState.RUNNING));
+ public InFightDamage() {
+ new StateDependentListener(ArenaMode.All, FightState.Running, this);
}
@EventHandler
@@ -42,7 +44,7 @@ public class InFightDamageListener extends BasicListener {
if(!(event.getEntity() instanceof Player))
return;
- if(notFighting((Player)event.getEntity()))
+ if(BasicListener.notFighting((Player)event.getEntity()))
event.setCancelled(true);
}
@@ -69,7 +71,7 @@ public class InFightDamageListener extends BasicListener {
return;
}
- if(notFighting(damager)){
+ if(BasicListener.notFighting(damager)){
event.setCancelled(true);
//Damager is not fighting
return;
@@ -81,7 +83,7 @@ public class InFightDamageListener extends BasicListener {
event.getDamager().setFireTicks(0);
player.setFireTicks(0);
}
- toActionbar(damager, TextComponent.fromLegacyText("§cDu darfst deinen Teamkollegen keinen Schaden zufügen!"));
+ BasicListener.toActionbar(damager, TextComponent.fromLegacyText("§cDu darfst deinen Teamkollegen keinen Schaden zufügen!"));
}
if(player.getHealth() - event.getFinalDamage() <= 0){
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightInventoryListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightInventory.java
similarity index 89%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightInventoryListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightInventory.java
index d20afba..c72a812 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightInventoryListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/InFightInventory.java
@@ -19,28 +19,27 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightPlayer;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
-import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.inventory.InventoryType;
-import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
-import java.util.EnumSet;
+public class InFightInventory implements Listener {
-public class InFightInventoryListener extends BasicListener {
-
- public InFightInventoryListener() {
- super(EnumSet.of(FightState.RUNNING));
+ public InFightInventory() {
+ new StateDependentListener(ArenaMode.All, FightState.Running, this);
}
@EventHandler
@@ -77,16 +76,6 @@ public class InFightInventoryListener extends BasicListener {
}
}
- @EventHandler
- public void onDropPickup(InventoryPickupItemEvent e){
- e.setCancelled(true);
- }
-
- @EventHandler
- public void onDropping(PlayerDropItemEvent e){
- e.setCancelled(true);
- }
-
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
Inventory inventory = event.getPlayer().getInventory();
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/IngameDeath.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/IngameDeath.java
new file mode 100644
index 0000000..6bf1074
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/IngameDeath.java
@@ -0,0 +1,77 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.listener;
+
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.countdown.Countdown;
+import de.steamwar.fightsystem.countdown.SWSound;
+import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightPlayer;
+import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.record.RecordSystem;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.PlayerDeathEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+public class IngameDeath implements Listener {
+
+ public IngameDeath() {
+ new StateDependentListener(ArenaMode.All, FightState.Ingame, this);
+ }
+
+ @EventHandler(priority = EventPriority.HIGH)
+ public void handlePlayerDeath(PlayerDeathEvent event) {
+ event.setDeathMessage(null);
+
+ Player player = event.getEntity();
+ FightTeam team = Fight.getPlayerTeam(player);
+
+ if(team == null)
+ return;
+
+ Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Spieler " + team.getPrefix() + player.getName() + " §cist gestorben!");
+ Fight.playSound(Countdown.getSound(SWSound.ENTITY_WITHER_DEATH), 100.0F, 1.0F);
+ team.getFightPlayer(player).setOut();
+ }
+
+ @EventHandler(priority = EventPriority.HIGH)
+ public void handlePlayerQuit(PlayerQuitEvent event) {
+ event.setQuitMessage(null);
+
+ Player player = event.getPlayer();
+ FightTeam team = Fight.getPlayerTeam(player);
+ if(team == null)
+ return;
+
+ FightPlayer fightPlayer = team.getFightPlayer(player);
+ if(fightPlayer.isLiving()) {
+ Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Spieler " + team.getPrefix() + player.getName() + " §chat den Kampf verlassen!");
+ team.getFightPlayer(player).setOut();
+ RecordSystem.entityDespawns(player);
+ }
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/RankedJoinListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoin.java
similarity index 79%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/RankedJoinListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoin.java
index dc767dc..c8c08c4 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/RankedJoinListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoin.java
@@ -19,20 +19,21 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
-import java.util.EnumSet;
+public class NormalJoin implements Listener {
-public class RankedJoinListener extends BasicListener {
-
- public RankedJoinListener() {
- super(!Config.event() && Config.Ranked ? EnumSet.of(FightState.PRE_SCHEM_SETUP) : EnumSet.noneOf(FightState.class));
+ public NormalJoin() {
+ new StateDependentListener(ArenaMode.Normal, FightState.PreLeaderSetup, this);
}
@EventHandler
@@ -42,9 +43,9 @@ public class RankedJoinListener extends BasicListener {
if (fightTeam == null) {
if(!player.getUniqueId().equals(Config.RedLeader) && Fight.getBlueTeam().canbeLeader(player)) {
- Fight.getBlueTeam().setLeader(Fight.getBlueTeam().addMember(player));
+ Fight.getBlueTeam().addMember(player);
}else if(Fight.getRedTeam().canbeLeader(player)) {
- Fight.getRedTeam().setLeader(Fight.getRedTeam().addMember(player));
+ Fight.getRedTeam().addMember(player);
}
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/Permanent.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Permanent.java
new file mode 100644
index 0000000..51dbd8f
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Permanent.java
@@ -0,0 +1,130 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.listener;
+
+import de.steamwar.comms.packets.TablistNamePacket;
+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.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import de.steamwar.sql.SteamwarUser;
+import net.md_5.bungee.api.chat.TextComponent;
+import org.bukkit.Bukkit;
+import org.bukkit.GameMode;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.FoodLevelChangeEvent;
+import org.bukkit.event.entity.SpawnerSpawnEvent;
+import org.bukkit.event.inventory.CraftItemEvent;
+import org.bukkit.event.inventory.FurnaceSmeltEvent;
+import org.bukkit.event.inventory.InventoryPickupItemEvent;
+import org.bukkit.event.player.*;
+import org.bukkit.event.weather.WeatherChangeEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+
+public class Permanent implements Listener {
+
+ public Permanent() {
+ new StateDependentListener(ArenaMode.All, FightState.All, this);
+ }
+
+ @EventHandler
+ public void handlePlayerRespawn(PlayerRespawnEvent event){
+ Player player = event.getPlayer();
+ Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
+
+ FightTeam team = Fight.getPlayerTeam(player);
+ event.setRespawnLocation(team == null ? Config.SpecSpawn : team.getSpawn());
+ }
+
+ @EventHandler
+ public void onTpGM3(PlayerTeleportEvent e) {
+ if (e.getCause() == PlayerTeleportEvent.TeleportCause.SPECTATE) {
+ e.setCancelled(true);
+ BasicListener.toActionbar(e.getPlayer(), TextComponent.fromLegacyText("§cDu darfst diese Teleportfunktion nicht benutzen!"));
+ e.getPlayer().kickPlayer("§cDu darfst diese Teleportfunktion nicht benutzen!");
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGH)
+ public void handlePlayerJoin(PlayerJoinEvent event) {
+ event.setJoinMessage(null);
+
+ Player player = event.getPlayer();
+ FightTeam fightTeam = Fight.getPlayerTeam(player);
+
+ if (fightTeam == null) {
+ Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
+ player.teleport(Config.SpecSpawn);
+ if(!ArenaMode.Test.contains(Config.mode))
+ Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> new TablistNamePacket(SteamwarUser.get(player.getUniqueId()).getId(), "§7" + player.getName()).send(player), 5);
+ }
+ }
+
+ @EventHandler
+ public void handleFoodLevelChange(FoodLevelChangeEvent event) {
+ event.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onWeatherChange(WeatherChangeEvent event){
+ event.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onSpawnerSpawn(SpawnerSpawnEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onSleep(PlayerBedEnterEvent e) {
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onCrafting(CraftItemEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onFurnace(FurnaceSmeltEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onDropPickup(InventoryPickupItemEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onDropping(PlayerDropItemEvent e){
+ e.setCancelled(true);
+ }
+
+ @EventHandler
+ public void onWorldLoad(WorldLoadEvent e) {
+ e.getWorld().setAutoSave(false);
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java
index ecf9627..3007ee1 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PersonalKitCreator.java
@@ -19,143 +19,58 @@
package de.steamwar.fightsystem.listener;
-import de.steamwar.core.Core;
-import de.steamwar.core.VersionedCallable;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightPlayer;
-import de.steamwar.fightsystem.kit.Kit;
-import de.steamwar.fightsystem.kit.KitManager;
+import de.steamwar.fightsystem.fight.Kit;
import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.inventory.SWAnvilInv;
-import de.steamwar.inventory.SWInventory;
-import de.steamwar.inventory.SWItem;
-import de.steamwar.inventory.SWListInv;
+import de.steamwar.fightsystem.states.StateDependentListener;
import de.steamwar.sql.PersonalKit;
-import de.steamwar.sql.SteamwarUser;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
-import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.PlayerInventory;
-import org.bukkit.inventory.meta.BlockDataMeta;
-import org.bukkit.inventory.meta.ItemMeta;
-import java.util.*;
-import java.util.logging.Level;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
-public class PersonalKitCreator extends BasicListener {
+public class PersonalKitCreator implements Listener {
private static final Map openKitCreators = new HashMap<>();
- private static final EnumSet enabled = Config.PersonalKits ? EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP) : EnumSet.noneOf(FightState.class);
public PersonalKitCreator(){
- super(enabled);
- }
-
- public static void openKitSelector(Player player, String qry) {
- List kits = PersonalKit.get(SteamwarUser.get(player.getUniqueId()).getId(), Config.SchematicType.toDB());
- kits.removeIf(kit -> !kit.getName().toLowerCase().contains(qry.toLowerCase()));
- List> entries = new ArrayList<>(kits.size());
- kits.forEach(kit -> entries.add(new SWListInv.SWListEntry<>(new SWItem(Material.LEATHER_CHESTPLATE, "§e" + kit.getName(), new ArrayList<>(), kit.isInUse(), clickType -> {}), kit)));
- SWListInv inv = new SWListInv<>(player, "§eKit wählen", false, entries, (clickType, kit) -> preview(player, kit));
- if(entries.isEmpty())
- inv.setItem(22, new SWItem(Material.BARRIER, "§cKeine Kits gefunden"));
- inv.setItem(48, Material.NETHER_STAR, "§eNeues Kit", clickType -> {
- SWAnvilInv anvilInv = new SWAnvilInv(player, "Kitname eingeben");
- anvilInv.setItem(Material.LEATHER_CHESTPLATE);
- anvilInv.setCallback(s -> {
- SteamwarUser user = SteamwarUser.get(player.getUniqueId());
- if(PersonalKit.nameInUse(user.getId(), Config.SchematicType.toDB(), s)) {
- player.sendMessage(FightSystem.PREFIX + "§cDieser Kitname wird bereits genutzt!");
- player.closeInventory();
- return;
- }
- Kit prototype = KitManager.getKits(Fight.getFightPlayer(player).isLeader()).get(0);
- PersonalKit kit = PersonalKit.create(user.getId(), Config.SchematicType.toDB(), s, prototype.getInventory(), prototype.getArmor());
- openKitCreator(player, kit);
- });
- anvilInv.open();
- });
- inv.setItem(50, Material.NAME_TAG, "§eSuchen", clickType -> {
- SWAnvilInv anvilInv = new SWAnvilInv(player, "§eNach Kit suchen");
- anvilInv.setItem(Material.PAPER);
- anvilInv.setCallback(s -> openKitSelector(player, s));
- anvilInv.open();
- });
- inv.open();
- }
-
- public static void preview(Player player, PersonalKit kit){
- SWInventory inv = new SWInventory(player, 54, kit.getName());
-
- Kit.preview(inv, kit.getInventory(), kit.getArmor(), null);
-
- inv.setItem(45, Material.LEATHER_CHESTPLATE, "§aKit benutzen", clickType -> useKit(player, kit));
- inv.setItem(49, SWItem.getMaterial("WOOD_AXE"), "§7Kit bearbeiten", clickType -> openKitCreator(player, kit));
- inv.setItem(53, Material.BARRIER, "§cKit löschen", clickType -> {
- player.closeInventory();
- SWInventory conf = new SWInventory(player, 9, "Kit wirklich löchen?");
- conf.setItem(8, SWItem.getDye(1), "§cAbbrechen", click -> player.closeInventory());
- conf.setItem(0, SWItem.getDye(10), "§aLöschen", click -> {
- player.closeInventory();
- if(kit.isInUse()) {
- useKit(player, PersonalKit.get(SteamwarUser.get(player.getUniqueId()).getId(), Config.SchematicType.toDB()).get(0));
- }
- kit.delete();
- });
- conf.open();
- });
- inv.open();
- }
-
- private static void useKit(Player player, PersonalKit kit) {
- kit.setInUse();
- player.closeInventory();
+ new StateDependentListener(Config.PersonalKits, FightState.Setup, this);
}
public static void openKitCreator(Player player, PersonalKit kit){
- if(!enabled.contains(FightSystem.getFightState()))
- return;
-
player.closeInventory();
new InventoryBackup(player, kit);
-
- FightPlayer fightPlayer = Fight.getFightPlayer(player);
- assert fightPlayer != null;
-
- if(kit == null){
- fightPlayer.getKit().loadToPlayer(player);
- }else{
- player.getInventory().setContents(kit.getInventory());
- player.getInventory().setArmorContents(kit.getArmor());
- }
-
- player.updateInventory();
+ new Kit(kit).loadToPlayer(player);
player.setGameMode(GameMode.CREATIVE);
- toActionbar(player, TextComponent.fromLegacyText("§eInventar zum Anpassen des Kits öffnen§8!"));
+ BasicListener.toActionbar(player, TextComponent.fromLegacyText("§eInventar zum Anpassen des Kits öffnen§8!"));
}
public static boolean notInKitCreator(HumanEntity player){
return !openKitCreators.containsKey(player);
}
- @Override
- public void disable(){
- while(!openKitCreators.isEmpty()){
- openKitCreators.values().iterator().next().close();
- }
- super.disable();
+ public static void closeIfInKitCreator(HumanEntity player){
+ InventoryBackup backup = openKitCreators.get(player);
+ if(backup == null)
+ return;
+
+ backup.close();
}
@EventHandler
@@ -165,10 +80,23 @@ public class PersonalKitCreator extends BasicListener {
Player player = (Player) e.getWhoClicked();
//Deny bad items
- if(isBadItem(e.getCursor(), player))
+ if(Kit.isBadItem(e.getCursor()))
e.setCancelled(true);
- checkForClear(e, player);
+ /* Should the inventory reset? */
+ if(e.getAction() != InventoryAction.PLACE_ALL)
+ return;
+
+ ItemStack[] items = e.getWhoClicked().getInventory().getContents();
+ for(int i = 0; i < items.length; i++){
+ ItemStack stack = items[i];
+ if(stack != null && i != e.getSlot())
+ return;
+ }
+
+ FightPlayer fightPlayer = Fight.getFightPlayer(player);
+ assert fightPlayer != null;
+ Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> fightPlayer.getKit().loadToPlayer(player), 1);
}
@EventHandler
@@ -198,97 +126,28 @@ public class PersonalKitCreator extends BasicListener {
backup.close();
}
- private void checkForClear(InventoryClickEvent e, Player player){
- if(e.getAction() != InventoryAction.PLACE_ALL)
- return;
-
- ItemStack[] items = e.getWhoClicked().getInventory().getContents();
- for(int i = 0; i < items.length; i++){
- ItemStack stack = items[i];
- if(stack != null && i != e.getSlot())
- return;
- }
-
- FightPlayer fightPlayer = Fight.getFightPlayer(player);
- assert fightPlayer != null;
- Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> fightPlayer.getKit().loadToPlayer(player), 1);
- }
-
- private static boolean isBadItem(ItemStack stack, Player player){
- if(stack == null)
- return false;
-
- //Check for forbidden item
- if(Config.ForbiddenItems.contains(stack.getType().name()))
- return true;
-
- //Check for attribute modifiers
- if(Core.getVersion() >= 14 && PersonalKitCreator_14.hasAttributeModifier(stack)){
- Bukkit.getLogger().log(Level.SEVERE, "Spieler " + player.getName() + " hat versucht ein Item mit einem Attribute-Modifier zu bekommen.");
- return true;
- }
-
- if(stack.hasItemMeta()){
- ItemMeta meta = stack.getItemMeta();
- if(meta instanceof BlockDataMeta && ((BlockDataMeta)meta).hasBlockData())
- return true; //Blocks always upwards slabs etc.
-
- if(hasItems(stack))
- return true; //Blocks prefilled inventories
- }
-
- Kit normal = KitManager.getKitByName(Config.MemberDefault);
- assert normal != null;
- return !normal.isEnchantmentInKit(stack) && !stack.getEnchantments().isEmpty();
- }
-
- private static boolean hasItems(ItemStack stack){
- return VersionedCallable.call(new VersionedCallable<>(() -> PersonalKitCreator_8.hasItems(stack), 8),
- new VersionedCallable<>(() -> PersonalKitCreator_9.hasItems(stack), 9),
- new VersionedCallable<>(() -> PersonalKitCreator_10.hasItems(stack), 10),
- new VersionedCallable<>(() -> PersonalKitCreator_12.hasItems(stack), 12),
- new VersionedCallable<>(() -> PersonalKitCreator_14.hasItems(stack), 14),
- new VersionedCallable<>(() -> PersonalKitCreator_15.hasItems(stack), 15));
- }
-
private static class InventoryBackup{
private final Player player;
- private final ItemStack[] contents;
- private final ItemStack[] armor;
private final PersonalKit kit;
+ private final Kit backup;
private InventoryBackup(Player player, PersonalKit kit){
openKitCreators.put(player, this);
this.player = player;
- this.contents = player.getInventory().getContents();
- this.armor = player.getInventory().getArmorContents();
+ this.backup = new Kit("backup", player);
this.kit = kit;
}
- private void loadBackup(){
- PlayerInventory inventory = player.getInventory();
- inventory.setContents(contents);
- inventory.setArmorContents(armor);
- player.updateInventory();
- }
-
private void close(){
openKitCreators.remove(player);
- kit.setContainer(removeBadItems(player.getInventory().getContents()), removeBadItems(player.getInventory().getArmorContents()));
- loadBackup();
+ Kit kit1 = new Kit(kit.getName(), player);
+ kit1.removeBadItems();
+ kit1.toPersonalKit(kit);
+ backup.loadToPlayer(player);
player.setGameMode(GameMode.SURVIVAL);
- useKit(player, kit);
- }
-
- private ItemStack[] removeBadItems(ItemStack[] inventory){
- Kit normal = KitManager.getKitByName(Config.MemberDefault);
- assert normal != null;
-
- for(int i = 0; i < inventory.length; i++){
- if(isBadItem(inventory[i], player))
- inventory[i] = null;
- }
- return inventory;
+ kit.setInUse();
+ player.closeInventory();
+ Objects.requireNonNull(Fight.getFightPlayer(player)).setKit(new Kit(kit));
}
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PistonListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PistonListener.java
index 3ff094f..bfb7a16 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PistonListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PistonListener.java
@@ -21,33 +21,27 @@ package de.steamwar.fightsystem.listener;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.utils.Region;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
-import java.util.EnumSet;
-
-public class PistonListener extends BasicListener {
+public class PistonListener implements Listener {
public PistonListener() {
//Wenn Entern aktiv ist, sollen Raketen etc. entern können
- super(Config.EnterStages.isEmpty()
- ? EnumSet.allOf(FightState.class)
- : EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP));
+ new StateDependentListener(Config.EnterStages.isEmpty(), FightState.All, this);
+ new StateDependentListener(!Config.EnterStages.isEmpty(), FightState.Setup, this);
}
@EventHandler
public void handlePistonExtend(BlockPistonExtendEvent e){
- BlockFace b = e.getDirection();
+ BlockFace b = e.getDirection().getOppositeFace();
for(Block block : e.getBlocks()){
- if(
- block.getY() > Config.upperArenaBorder ||
- (!Region.isIn2DRange(block.getLocation(), Config.TeamBlueCornerX + b.getModX(), Config.TeamBlueCornerZ + b.getModZ(), Config.SchemsizeX, Config.SchemsizeZ, Config.BorderFromSchematic) &&
- !Region.isIn2DRange(block.getLocation(), Config.TeamRedCornerX + b.getModX(), Config.TeamRedCornerZ + b.getModZ(), Config.SchemsizeX, Config.SchemsizeZ, Config.BorderFromSchematic))
- ){
+ if(Config.BlueExtendRegion.inRegion(block.getRelative(b)) && Config.RedExtendRegion.inRegion(block.getRelative(b))){
e.setCancelled(true);
return;
}
@@ -56,13 +50,9 @@ public class PistonListener extends BasicListener {
@EventHandler
public void handlePistonRetract(BlockPistonRetractEvent e){
- BlockFace b = e.getDirection();
+ BlockFace b = e.getDirection().getOppositeFace();
for(Block block : e.getBlocks()){
- if(
- block.getY() > Config.upperArenaBorder ||
- (!Region.isIn2DRange(block.getLocation(), Config.TeamBlueCornerX + b.getModX(), Config.TeamBlueCornerZ + b.getModZ(), Config.SchemsizeX, Config.SchemsizeZ, Config.BorderFromSchematic) &&
- !Region.isIn2DRange(block.getLocation(), Config.TeamRedCornerX + b.getModX(), Config.TeamRedCornerZ + b.getModZ(), Config.SchemsizeX, Config.SchemsizeZ, Config.BorderFromSchematic))
- ){
+ if(Config.BlueExtendRegion.inRegion(block.getRelative(b)) && Config.RedExtendRegion.inRegion(block.getRelative(b))) {
e.setCancelled(true);
return;
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerMoveListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerMoveListener.java
deleted file mode 100644
index fe95bce..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerMoveListener.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.listener;
-
-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.states.FightState;
-import de.steamwar.fightsystem.utils.Region;
-import net.md_5.bungee.api.chat.TextComponent;
-import org.bukkit.Bukkit;
-import org.bukkit.GameMode;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerMoveEvent;
-
-import java.util.EnumSet;
-import java.util.logging.Level;
-
-public class PlayerMoveListener extends BasicListener {
-
- private static final String DENY_ARENA = "§cDu darfst die Arena nicht verlassen";
- private static final String DENY_TEAM = "§cDu darfst nicht zu den Teams";
- private static final String DENY_ENTERN = "§cDu darfst nicht entern";
-
- public PlayerMoveListener() {
- super(EnumSet.allOf(FightState.class));
- }
-
- @EventHandler
- public void teamAreas(PlayerMoveEvent event) {
- Player player = event.getPlayer();
- if(player == FightSystem.getEventLeiter() || Config.test())
- return;
-
- Location to = event.getTo();
- FightTeam fightTeam = Fight.getPlayerTeam(player);
-
- assert to != null;
- boolean inArenaY = to.getY() + 1.8 <= Config.upperArenaBorder;
-
- boolean inBlueArea = inArenaY && Region.isIn2DRange(to, Config.TeamBlueCornerX, Config.TeamBlueCornerZ, Config.SchemsizeX, Config.SchemsizeZ, Config.BorderFromSchematic);
- boolean inRedArea = inArenaY && Region.isIn2DRange(to, Config.TeamRedCornerX, Config.TeamRedCornerZ, Config.SchemsizeX, Config.SchemsizeZ, Config.BorderFromSchematic);
-
- if(inBlueArea){
- if(fightTeam == null)
- reset(event, DENY_TEAM);
- else if(fightTeam == Fight.getRedTeam() && (player.getGameMode() == GameMode.SPECTATOR || !fightTeam.canPlayerEntern(player)))
- reset(event, DENY_ENTERN);
- else
- return; // Is allowed in area
- checkInInnerArea(event.getPlayer(), to, Config.TeamBlueCornerX, Config.TeamBlueCornerZ);
- }else if(inRedArea){
- if(fightTeam == null)
- reset(event, DENY_TEAM);
- else if(fightTeam == Fight.getBlueTeam() && (player.getGameMode() == GameMode.SPECTATOR || !fightTeam.canPlayerEntern(player)))
- reset(event, DENY_ENTERN);
- else
- return; // Is allowed in area
- checkInInnerArea(event.getPlayer(), to, Config.TeamRedCornerX, Config.TeamRedCornerZ);
- }else if(fightTeam != null && player.getGameMode() != GameMode.SPECTATOR && !fightTeam.canPlayerEntern(player))
- reset(event, DENY_ENTERN);
- }
-
- private void checkInInnerArea(Player player, Location to, int teamCornerX, int teamCornerZ){
- boolean inArenaY = to.getY() + 1.8 <= Config.TeamBlueCornerY + Config.SchemsizeY;
- boolean inArea = inArenaY && Region.isIn2DRange(to, teamCornerX, teamCornerZ, Config.SchemsizeX, Config.SchemsizeZ, 0);
- if(inArea && Config.BorderFromSchematic >= 5){ // Preventing false positives due to small extension
- player.kickPlayer(null);
- Bukkit.getLogger().log(Level.SEVERE, player.getName() + " ist in einen Teambereich eingedrungen.");
- }
- }
-
- @EventHandler
- public void arenaBorder(PlayerMoveEvent event){
- Player player = event.getPlayer();
- Location to = event.getTo();
-
- //Check in Arena
- assert to != null;
- if(!Region.isIn2DRegion(to, Config.ArenaMinX, Config.ArenaMinZ, Config.ArenaMaxX, Config.ArenaMaxZ)){
- reset(event, DENY_ARENA);
- return;
- }
-
- FightTeam team = Fight.getPlayerTeam(player);
- boolean inArenaY = to.getY() + 1.8 <= Config.upperArenaBorder;
-
- if(to.getY() <= Config.underArenaBorder) {
- if(player.getGameMode() == GameMode.SPECTATOR || team == null)
- reset(event, DENY_ARENA);
- else if(FightSystem.getFightState().infight())
- player.damage(2);
- else if(!Config.GroundWalkable)
- player.teleport(team.getSpawn());
- }else if(team != null && !inArenaY){
- reset(event, DENY_ARENA);
- }
- }
-
- private void reset(PlayerMoveEvent event, String message){
- Player player = event.getPlayer();
- player.teleport(event.getFrom());
- toActionbar(player, TextComponent.fromLegacyText(message));
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerStateListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerStateListener.java
deleted file mode 100644
index 3830c12..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PlayerStateListener.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.listener;
-
-import de.steamwar.comms.packets.TablistNamePacket;
-import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.countdown.Countdown;
-import de.steamwar.fightsystem.countdown.SWSound;
-import de.steamwar.fightsystem.fight.Fight;
-import de.steamwar.fightsystem.fight.FightPlayer;
-import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.record.RecordSystem;
-import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.sql.SteamwarUser;
-import net.md_5.bungee.api.chat.TextComponent;
-import org.bukkit.Bukkit;
-import org.bukkit.GameMode;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.entity.PlayerDeathEvent;
-import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.event.player.PlayerQuitEvent;
-import org.bukkit.event.player.PlayerRespawnEvent;
-import org.bukkit.event.player.PlayerTeleportEvent;
-
-import java.util.EnumSet;
-
-public class PlayerStateListener extends BasicListener{
-
- public PlayerStateListener() {
- super(EnumSet.allOf(FightState.class));
- }
-
- @EventHandler(priority = EventPriority.HIGH)
- public void handlePlayerJoin(PlayerJoinEvent event) {
- event.setJoinMessage(null);
-
- Player player = event.getPlayer();
- player.setHealth(20);
- player.setFoodLevel(20);
- setAttackSpeed(player);
-
- FightTeam fightTeam = Fight.getPlayerTeam(player);
-
- if (fightTeam == null) {
- Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
- player.teleport(Config.SpecSpawn);
- if(!Config.test())
- Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> new TablistNamePacket(SteamwarUser.get(player.getUniqueId()).getId(), "§7" + player.getName()).send(player), 5);
- } else {
- player.teleport(fightTeam.getSpawn());
- if(FightSystem.getFightState().setup())
- Fight.setPlayerGamemode(player, GameMode.SURVIVAL);
- else
- Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
- }
- }
-
- @EventHandler(priority = EventPriority.HIGH)
- public void handlePlayerDeath(PlayerDeathEvent event) {
- Player player = event.getEntity().getPlayer();
- FightTeam fightTeam = Fight.getPlayerTeam(player);
-
- if(fightTeam == null)
- return;
-
- assert player != null;
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Spieler " + fightTeam.getPrefix() + player.getName() + " §cist gestorben!");
- event.setDeathMessage(null);
- fightTeam.getFightPlayer(player).setOut();
- Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
- player.teleport(fightTeam.getSpawn());
- Fight.playSound(Countdown.getSound(SWSound.ENTITY_WITHER_DEATH), 100.0F, 1.0F);
- if(Config.recording())
- RecordSystem.entityDespawns(player);
- }
-
- @EventHandler(priority = EventPriority.HIGH)
- public void handlePlayerQuit(PlayerQuitEvent event) {
- event.setQuitMessage(null);
-
- Player player = event.getPlayer();
- FightTeam fightTeam = Fight.getPlayerTeam(player);
- if(fightTeam == null)
- return;
-
- FightState fightState = FightSystem.getFightState();
- if(fightState.setup()){
- fightTeam.removePlayer(player);
-
- if(Config.recording())
- RecordSystem.entityDespawns(player);
- }else if(fightState.ingame()){
- FightPlayer fightPlayer = fightTeam.getFightPlayer(player);
- if(fightPlayer.isLiving()) {
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Spieler " + fightTeam.getPrefix() + player.getName() + " §chat den Kampf verlassen!");
- fightTeam.getFightPlayer(player).setOut();
-
- if(Config.recording())
- RecordSystem.entityDespawns(player);
- }
- }
-
- //Shutdown server if nobody online and its not an event server
- if(!Config.event() && (Bukkit.getOnlinePlayers().isEmpty() || (Bukkit.getOnlinePlayers().size() == 1 && Bukkit.getOnlinePlayers().contains(player))))
- FightSystem.shutdown(null);
- }
-
- @EventHandler
- public void handlePlayerRespawn(PlayerRespawnEvent event) {
- Player player = event.getPlayer();
- FightTeam team = Fight.getPlayerTeam(player);
- if(team == null)
- event.setRespawnLocation(Config.SpecSpawn);
- else
- event.setRespawnLocation(team.getSpawn());
- }
-
- @EventHandler
- public void onTpGM3(PlayerTeleportEvent e) {
- if (e.getCause() == PlayerTeleportEvent.TeleportCause.SPECTATE) {
- e.setCancelled(true);
- toActionbar(e.getPlayer(), TextComponent.fromLegacyText("§cDu darfst diese Teleportfunktion nicht benutzen!"));
- e.getPlayer().kickPlayer("§cDu darfst diese Teleportfunktion nicht benutzen!");
- }
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/PrepareSchem.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PrepareSchem.java
new file mode 100644
index 0000000..b0c3301
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/PrepareSchem.java
@@ -0,0 +1,102 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+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;
+import org.bukkit.event.player.PlayerJoinEvent;
+
+public class PrepareSchem implements Listener {
+
+ public PrepareSchem() {
+ new StateDependentListener(ArenaMode.Prepare, FightState.Setup, this){
+ @Override
+ public void disable() {
+ super.disable();
+ 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;
+ }
+
+ schem.setSchemType(Config.SchematicType.checkType());
+ FightSystem.shutdown(FightSystem.PREFIX + "§aDie Schematic wird nun zeitnah von einem Teammitglied überprüft");
+ }
+ };
+ }
+
+ @EventHandler
+ public void handlePlayerJoin(PlayerJoinEvent event) {
+ Player player = event.getPlayer();
+ FightTeam team = Fight.getPlayerTeam(player);
+
+ if (team == null) {
+ Fight.getBlueTeam().addMember(player);
+ }
+
+ if(FightState.getFightState() == FightState.PRE_LEADER_SETUP) {
+ FightSystem.setPreSchemState();
+ FightSystem.setPostSchemState();
+ }
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/ProjectileLaunchListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ProjectileLaunchListener.java
deleted file mode 100644
index f5881eb..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/ProjectileLaunchListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.listener;
-
-import de.steamwar.fightsystem.states.FightState;
-import net.md_5.bungee.api.chat.TextComponent;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.entity.ProjectileLaunchEvent;
-
-import java.util.EnumSet;
-
-public class ProjectileLaunchListener extends BasicListener {
-
- public ProjectileLaunchListener() {
- super(EnumSet.of(FightState.PRE_LEADER_SETUP, FightState.PRE_SCHEM_SETUP, FightState.POST_SCHEM_SETUP, FightState.PRE_RUNNING, FightState.SPECTATE));
- }
-
- @EventHandler
- public void handleProjectileLaunch(ProjectileLaunchEvent event) {
- event.setCancelled(true);
- if(event.getEntity().getShooter() instanceof Player){
- Player player = (Player) event.getEntity().getShooter();
- toActionbar(player, TextComponent.fromLegacyText("§cDu darfst den Bogen erst nach Fightbeginn nutzen!"));
- }
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoinListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/RankedJoin.java
similarity index 67%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoinListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/RankedJoin.java
index 7006e78..49ec963 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/NormalJoinListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/RankedJoin.java
@@ -19,21 +19,21 @@
package de.steamwar.fightsystem.listener;
+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.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
-import java.util.EnumSet;
+public class RankedJoin implements Listener {
-public class NormalJoinListener extends BasicListener {
-
- public NormalJoinListener() {
- super(Config.event() || Config.test() || Config.Ranked ? EnumSet.noneOf(FightState.class) : EnumSet.of(FightState.PRE_LEADER_SETUP));
+ public RankedJoin() {
+ new StateDependentListener(ArenaMode.Ranked, FightState.PreLeaderSetup, this);
}
@EventHandler
@@ -43,15 +43,10 @@ public class NormalJoinListener extends BasicListener {
if (fightTeam == null) {
if(!player.getUniqueId().equals(Config.RedLeader) && Fight.getBlueTeam().canbeLeader(player)) {
- Fight.getBlueTeam().setLeader(Fight.getBlueTeam().addMember(player));
+ Fight.getBlueTeam().addMember(player);
}else if(Fight.getRedTeam().canbeLeader(player)) {
- Fight.getRedTeam().setLeader(Fight.getRedTeam().addMember(player));
+ Fight.getRedTeam().addMember(player);
}
}
-
- if(Fight.getRedTeam().hasTeamLeader() && Fight.getBlueTeam().hasTeamLeader()
- && (Fight.getRedTeam().getLeader().getPlayer() == player || Fight.getBlueTeam().getLeader().getPlayer() == player)) {
- FightSystem.setPreSchemState();
- }
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventRecordListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Recording.java
similarity index 88%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/EventRecordListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/Recording.java
index 7b690a1..1e5c287 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/EventRecordListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Recording.java
@@ -26,12 +26,15 @@ import de.steamwar.fightsystem.fight.FightPlayer;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.record.RecordSystem;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependent;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.*;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntitySpawnEvent;
@@ -43,16 +46,31 @@ import org.bukkit.event.player.*;
import org.bukkit.event.server.BroadcastMessageEvent;
import org.bukkit.inventory.ItemStack;
-import java.util.EnumSet;
import java.util.Random;
-public class EventRecordListener extends BasicListener {
+public class Recording implements Listener {
private static final int AIR = 0;
private static final Random random = new Random();
- public EventRecordListener() {
- super(Config.recording() ? EnumSet.allOf(FightState.class) : EnumSet.noneOf(FightState.class));
+ public Recording() {
+ new StateDependentListener(Config.recording(), FightState.All, this);
+ new StateDependent(Config.recording(), FightState.Ingame){
+ @Override
+ public void enable() {
+ Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> {
+ setKitItems(Fight.getBlueTeam());
+ setKitItems(Fight.getRedTeam());
+ }, 1);
+ }
+
+ @Override
+ public void disable() {
+ despawnTeam(Fight.getRedTeam());
+ despawnTeam(Fight.getBlueTeam());
+ despawnTNT();
+ }
+ }.register();
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
@@ -170,22 +188,8 @@ public class EventRecordListener extends BasicListener {
}
}
- @Override
- public void stateChange(FightState state) {
- if(state == FightState.PRE_RUNNING) {
- Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> {
- setKitItems(Fight.getBlueTeam());
- setKitItems(Fight.getRedTeam());
- }, 1);
- }else if(state == FightState.SPECTATE){
- despawnTeam(Fight.getRedTeam());
- despawnTeam(Fight.getBlueTeam());
- despawnTNT();
- }
- }
-
private void setKitItems(FightTeam team){
- if(FightSystem.getFightState() != FightState.PRE_RUNNING)
+ if(FightState.getFightState() != FightState.PRE_RUNNING)
return;
for(FightPlayer fp : team.getPlayers()){
@@ -222,6 +226,6 @@ public class EventRecordListener extends BasicListener {
private boolean isNotSent(Player p){
FightPlayer fp = Fight.getFightPlayer(p);
- return fp == null || !fp.isLiving() || FightSystem.getFightState() == FightState.SPECTATE;
+ return fp == null || !fp.isLiving() || FightState.getFightState() == FightState.SPECTATE;
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/ResourcePack.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ResourcePack.java
new file mode 100644
index 0000000..c4ae576
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ResourcePack.java
@@ -0,0 +1,35 @@
+package de.steamwar.fightsystem.listener;
+
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerResourcePackStatusEvent;
+
+public class ResourcePack implements Listener {
+
+ public ResourcePack(){
+ new StateDependentListener(ArenaMode.Event, FightState.All, this);
+ }
+
+ @EventHandler
+ public void handlePlayerJoin(PlayerJoinEvent event) {
+ Player player = event.getPlayer();
+ player.setResourcePack("https://steamwar.de/antixray.zip");
+ }
+
+ @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.sendMessage(FightSystem.PREFIX + "§cDa du abgelehnt hast, musst du nun in der Serverliste erstmal wieder Ressourcenpakete von SteamWar aktivieren.");
+ player.kickPlayer(null);
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/ScoreboardListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/ScoreboardListener.java
deleted file mode 100644
index 49722fd..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/ScoreboardListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package de.steamwar.fightsystem.listener;
-
-import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.utils.FightScoreboard;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.event.player.PlayerQuitEvent;
-
-import java.util.EnumSet;
-
-public class ScoreboardListener extends BasicListener {
-
- public ScoreboardListener() {
- super(EnumSet.allOf(FightState.class));
- }
-
- @EventHandler
- public void onPlayerJoin(PlayerJoinEvent event) {
- FightScoreboard.showScoreboard(event.getPlayer());
- }
-
- @EventHandler
- public void onPlayerQuit(PlayerQuitEvent event) {
- FightScoreboard.removeScoreboard(event.getPlayer());
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FoodLevelChangeListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/SetupQuit.java
similarity index 56%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/FoodLevelChangeListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/SetupQuit.java
index 3c82cc5..e4360dd 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/FoodLevelChangeListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/SetupQuit.java
@@ -1,6 +1,6 @@
-/*
+/*
This file is a part of the SteamWar software.
-
+
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
@@ -19,32 +19,31 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
-import org.bukkit.event.entity.FoodLevelChangeEvent;
-import org.bukkit.event.entity.SpawnerSpawnEvent;
-import org.bukkit.event.weather.WeatherChangeEvent;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerQuitEvent;
-import java.util.EnumSet;
+public class SetupQuit implements Listener {
-public class FoodLevelChangeListener extends BasicListener {
-
- public FoodLevelChangeListener() {
- super(EnumSet.allOf(FightState.class));
+ public SetupQuit(){
+ new StateDependentListener(ArenaMode.All, FightState.Setup, this);
}
@EventHandler
- public void handleFoodLevelChange(FoodLevelChangeEvent event) {
- event.setCancelled(true);
- }
+ public void handlePlayerQuit(PlayerQuitEvent event) {
+ event.setQuitMessage(null);
- @EventHandler
- public void onWeatherChange(WeatherChangeEvent event){
- event.setCancelled(true);
- }
+ Player player = event.getPlayer();
+ FightTeam team = Fight.getPlayerTeam(player);
+ if(team == null)
+ return;
- @EventHandler
- public void onSpawnerSpawn(SpawnerSpawnEvent e){
- e.setCancelled(true);
+ team.removePlayer(player);
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/GameplayListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Shutdown.java
similarity index 54%
rename from FightSystem_Main/src/de/steamwar/fightsystem/listener/GameplayListener.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/Shutdown.java
index 0b6ef8d..be3e243 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/GameplayListener.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/Shutdown.java
@@ -1,6 +1,6 @@
-/*
+/*
This file is a part of the SteamWar software.
-
+
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
@@ -19,32 +19,25 @@
package de.steamwar.fightsystem.listener;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
-import org.bukkit.event.inventory.CraftItemEvent;
-import org.bukkit.event.inventory.FurnaceSmeltEvent;
-import org.bukkit.event.player.PlayerBedEnterEvent;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerQuitEvent;
-import java.util.EnumSet;
+public class Shutdown implements Listener {
-public class GameplayListener extends BasicListener{
-
- public GameplayListener() {
- super(EnumSet.allOf(FightState.class));
+ public Shutdown(){
+ new StateDependentListener(ArenaMode.AntiEvent, FightState.All, this);
}
- @EventHandler
- public void onSleep(PlayerBedEnterEvent e) {
- e.setCancelled(true);
- }
-
- @EventHandler
- public void onCrafting(CraftItemEvent e){
- e.setCancelled(true);
- }
-
- @EventHandler
- public void onFurnace(FurnaceSmeltEvent e){
- e.setCancelled(true);
+ @EventHandler(priority = EventPriority.HIGH)
+ public void handlePlayerQuit(PlayerQuitEvent event) {
+ //Shutdown server if nobody online and its not an event server
+ if(Bukkit.getOnlinePlayers().isEmpty() || (Bukkit.getOnlinePlayers().size() == 1 && Bukkit.getOnlinePlayers().contains(event.getPlayer())))
+ Bukkit.shutdown();
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/TeamArea.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TeamArea.java
new file mode 100644
index 0000000..3f8bb97
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TeamArea.java
@@ -0,0 +1,92 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.listener;
+
+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.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import net.md_5.bungee.api.chat.TextComponent;
+import org.bukkit.Bukkit;
+import org.bukkit.GameMode;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerMoveEvent;
+
+import java.util.logging.Level;
+
+public class TeamArea implements Listener {
+
+ private static final String DENY_TEAM = "§cDu darfst nicht zu den Teams";
+ private static final String DENY_ENTERN = "§cDu darfst nicht entern";
+
+ public TeamArea() {
+ new StateDependentListener(ArenaMode.AntiTest, FightState.All, this);
+ }
+
+ @EventHandler
+ public void teamAreas(PlayerMoveEvent event) {
+ Player player = event.getPlayer();
+ if(player == FightSystem.getEventLeiter())
+ return;
+
+ Location to = event.getTo();
+ assert to != null;
+
+ FightTeam team = Fight.getPlayerTeam(player);
+
+ if(Config.BlueExtendRegion.playerInRegion(to)){
+ if(team == null)
+ reset(event, DENY_TEAM);
+ else if(team == Fight.getRedTeam() && (player.getGameMode() == GameMode.SPECTATOR || !team.canPlayerEntern(player)))
+ reset(event, DENY_ENTERN);
+ else
+ return; // Is allowed in area
+ checkInInnerArea(event.getPlayer(), to, Fight.getBlueTeam());
+ }else if(Config.RedExtendRegion.playerInRegion(to)){
+ if(team == null)
+ reset(event, DENY_TEAM);
+ else if(team == Fight.getBlueTeam() && (player.getGameMode() == GameMode.SPECTATOR || !team.canPlayerEntern(player)))
+ reset(event, DENY_ENTERN);
+ else
+ return; // Is allowed in area
+ checkInInnerArea(event.getPlayer(), to, Fight.getRedTeam());
+ }else if(team != null && player.getGameMode() != GameMode.SPECTATOR && !team.canPlayerEntern(player))
+ reset(event, DENY_ENTERN);
+ }
+
+ private void checkInInnerArea(Player player, Location to, FightTeam team){
+ 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.");
+ }
+ }
+
+ private void reset(PlayerMoveEvent event, String message){
+ Player player = event.getPlayer();
+ player.teleport(event.getFrom());
+ BasicListener.toActionbar(player, TextComponent.fromLegacyText(message));
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestJoin.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestJoin.java
new file mode 100644
index 0000000..a8fd0eb
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestJoin.java
@@ -0,0 +1,55 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.listener;
+
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+
+public class TestJoin implements Listener {
+
+ public TestJoin() {
+ new StateDependentListener(ArenaMode.Test, FightState.All, this);
+ }
+
+ @EventHandler
+ public void handlePlayerJoin(PlayerJoinEvent event) {
+ Player player = event.getPlayer();
+ FightTeam fightTeam = Fight.getPlayerTeam(player);
+
+ if (fightTeam == null && (Fight.getRedTeam().isLeaderless() || Fight.getBlueTeam().isLeaderless())) {
+ player.sendMessage(FightSystem.PREFIX + "§7Werde zum Teamleader mit §8/§eleader");
+ }
+
+ player.setOp(true);
+
+ if(FightState.getFightState() == FightState.PRE_LEADER_SETUP){
+ FightSystem.setPreSchemState();
+ FightSystem.setPostSchemState();
+ }
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestListener.java
deleted file mode 100644
index f73f887..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/TestListener.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.listener;
-
-import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.countdown.NoPlayersOnlineCountdown;
-import de.steamwar.fightsystem.fight.Fight;
-import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.states.FightState;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerJoinEvent;
-
-import java.util.EnumSet;
-
-public class TestListener extends BasicListener {
-
- private NoPlayersOnlineCountdown countdown;
-
- public TestListener() {
- super(Config.test() ? EnumSet.allOf(FightState.class) : EnumSet.noneOf(FightState.class));
- if(Config.test())
- countdown = new NoPlayersOnlineCountdown();
- }
-
- @EventHandler
- public void handlePlayerJoin(PlayerJoinEvent event) {
- Player player = event.getPlayer();
- FightTeam fightTeam = Fight.getPlayerTeam(player);
-
- if (fightTeam == null && (!Fight.getRedTeam().hasTeamLeader() || !Fight.getBlueTeam().hasTeamLeader())) {
- player.sendMessage(FightSystem.PREFIX + "§7Werde zum Teamleader mit §8/§eleader");
- }
-
- if(countdown != null){
- countdown.disable();
- countdown = null;
- }
-
- player.setOp(true);
- /*PermissionAttachment attachment = player.addAttachment(FightSystem.getPlugin());
- attachment.setPermission("fawe.permpack.basic", true);
- attachment.setPermission("minecraft.command.gamemode", true);
- attachment.setPermission("minecraft.command.tp", true);
- attachment.setPermission("worldedit.navigation.jumpto.tool", true);
- attachment.setPermission("worldedit.navigation.thru.tool", true);
- attachment.setPermission("worldedit.navigation.jumpto.tool", true);
- attachment.setPermission("worldedit.navigation.thru.tool", true);
- attachment.setPermission("worldedit.biome.info", true);
- attachment.setPermission("worldedit.biome.set", true);
- attachment.setPermission("worldedit.biome.list", true);
- attachment.setPermission("worldedit.chunkinfo", true);
- attachment.setPermission("worldedit.listchunks", true);
- attachment.setPermission("worldedit.clipboard.cut", true);
- attachment.setPermission("worldedit.clipboard.paste", true);
- attachment.setPermission("worldedit.schematic.formats", true);
- attachment.setPermission("worldedit.schematic.load", true);
- attachment.setPermission("worldedit.schematic.list", true);
- attachment.setPermission("worldedit.schematic.save", true);
- attachment.setPermission("worldedit.clipboard.clear", true);
- attachment.setPermission("worldedit.clipboard.copy", true);
- attachment.setPermission("worldedit.clipboard.lazycopy", true);
- attachment.setPermission("worldedit.clipboard.place", true);
- attachment.setPermission("worldedit.clipboard.download", true);
- attachment.setPermission("worldedit.clipboard.flip", true);
- attachment.setPermission("worldedit.clipboard.rotate", true);
- attachment.setPermission("worldedit.help", true);
- attachment.setPermission("worldedit.global-mask", true);
- attachment.setPermission("worldedit.global-transform", true);
- attachment.setPermission("worldedit.generation.cylinder", true);
- attachment.setPermission("worldedit.generation.sphere", true);
- attachment.setPermission("worldedit.generation.forest", true);
- attachment.setPermission("worldedit.generation.pumpkins", true);
- attachment.setPermission("worldedit.generation.pyramid", true);
- attachment.setPermission("worldedit.generation.shape", true);
- attachment.setPermission("worldedit.biome.set", true);
- attachment.setPermission("worldedit.history.undo", true);
- attachment.setPermission("worldedit.history.redo", true);
- attachment.setPermission("worldedit.history.rollback", true);
- attachment.setPermission("worldedit.navigation.unstuck", true);
- attachment.setPermission("worldedit.navigation.ascend", true);
- attachment.setPermission("worldedit.navigation.descend", true);
- attachment.setPermission("worldedit.navigation.ceiling", true);
- attachment.setPermission("worldedit.navigation.thru.command", true);
- attachment.setPermission("worldedit.navigation.jumpto.command", true);
- attachment.setPermission("worldedit.navigation.up", true);
- attachment.setPermission("worldedit.region.hollow", true);
- attachment.setPermission("worldedit.region.line", true);
- attachment.setPermission("worldedit.region.curve", true);
- attachment.setPermission("worldedit.region.overlay", true);
- attachment.setPermission("worldedit.region.center", true);
- attachment.setPermission("worldedit.region.naturalize", true);
- attachment.setPermission("worldedit.region.walls", true);
- attachment.setPermission("worldedit.region.faces", true);
- attachment.setPermission("worldedit.region.smooth", true);
- attachment.setPermission("worldedit.region.move", true);
- attachment.setPermission("worldedit.region.forest", true);
- attachment.setPermission("worldedit.region.replace", true);
- attachment.setPermission("worldedit.region.stack", true);
- attachment.setPermission("worldedit.region.set", true);
- attachment.setPermission("worldedit.selection.pos", true);
- attachment.setPermission("worldedit.selection.chunk", true);
- attachment.setPermission("worldedit.selection.hpos", true);
- attachment.setPermission("worldedit.wand", true);
- attachment.setPermission("worldedit.wand.toggle", true);
- attachment.setPermission("worldedit.selection.contract", true);
- attachment.setPermission("worldedit.selection.outset", true);
- attachment.setPermission("worldedit.selection.inset", true);
- attachment.setPermission("worldedit.analysis.distr", true);
- attachment.setPermission("worldedit.analysis.count", true);
- attachment.setPermission("worldedit.selection.size", true);
- attachment.setPermission("worldedit.selection.expand", true);
- attachment.setPermission("worldedit.selection.shift", true);
- attachment.setPermission("worldedit.snapshots.list", true);
- attachment.setPermission("worldedit.superpickaxe", true);
- attachment.setPermission("worldedit.superpickaxe.area", true);
- attachment.setPermission("worldedit.superpickaxe.recursive", true);
- attachment.setPermission("worldedit.brush.blendball", true);
- attachment.setPermission("worldedit.brush.erode", true);
- attachment.setPermission("worldedit.brush.pull", true);
- attachment.setPermission("worldedit.brush.circle", true);
- attachment.setPermission("worldedit.brush.recursive", true);
- attachment.setPermission("worldedit.brush.line", true);
- attachment.setPermission("worldedit.brush.spline", true);
- attachment.setPermission("worldedit.brush.surfacespline", true);
- attachment.setPermission("worldedit.brush.shatter", true);
- attachment.setPermission("worldedit.brush.stencil", true);
- attachment.setPermission("worldedit.brush.height", true);
- attachment.setPermission("worldedit.brush.layer", true);
- attachment.setPermission("worldedit.brush.populateschematic", true);
- attachment.setPermission("worldedit.brush.scatter", true);
- attachment.setPermission("worldedit.brush.splatter", true);
- attachment.setPermission("worldedit.brush.scattercommand", true);
- attachment.setPermission("worldedit.brush.copy", true);
- attachment.setPermission("worldedit.brush.command", true);
- attachment.setPermission("worldedit.brush.apply", true);
- attachment.setPermission("worldedit.brush.sphere", true);
- attachment.setPermission("worldedit.brush.cylinder", true);
- attachment.setPermission("worldedit.brush.clipboard", true);
- attachment.setPermission("worldedit.brush.smooth", true);
- attachment.setPermission("worldedit.brush.ex", true);
- attachment.setPermission("worldedit.brush.gravity", true);
- attachment.setPermission("worldedit.brush.options.range", true);
- attachment.setPermission("worldedit.brush.options.material", true);
- attachment.setPermission("worldedit.brush.options.size", true);
- attachment.setPermission("worldedit.brush.options.mask", true);
- attachment.setPermission("worldedit.brush.options.smask", true);
- attachment.setPermission("worldedit.brush.options.transform", true);
- attachment.setPermission("worldedit.brush.options.scroll", true);
- attachment.setPermission("worldedit.brush.options.visualize", true);
- attachment.setPermission("worldedit.tool.deltree", true);
- attachment.setPermission("worldedit.tool.farwand", true);
- attachment.setPermission("worldedit.tool.lrbuild", true);
- attachment.setPermission("worldedit.tool.info", true);
- attachment.setPermission("worldedit.tool.tree", true);
- attachment.setPermission("worldedit.tool.replacer", true);
- attachment.setPermission("worldedit.tool.data-cycler", true);
- attachment.setPermission("worldedit.tool.flood-fill", true);
- attachment.setPermission("worldedit.tool.inspect", true);
- attachment.setPermission("worldedit.fill.recursive", true);
- attachment.setPermission("worldedit.drain", true);
- attachment.setPermission("worldedit.fixlava", true);
- attachment.setPermission("worldedit.fixwater", true);
- attachment.setPermission("worldedit.removeabove", true);
- attachment.setPermission("worldedit.removebelow", true);
- attachment.setPermission("worldedit.removenear", true);
- attachment.setPermission("worldedit.replacenear", true);
- attachment.setPermission("worldedit.snow", true);
- attachment.setPermission("worldedit.thaw", true);
- attachment.setPermission("worldedit.green", true);
- attachment.setPermission("worldedit.extinguish", true);
- attachment.setPermission("worldedit.calc", true);
- attachment.setPermission("worldedit.fill", true);*/
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/listener/VersionDependentListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/VersionDependentListener.java
deleted file mode 100644
index 9197091..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/listener/VersionDependentListener.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.listener;
-
-import de.steamwar.core.Core;
-import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.states.FightState;
-import org.bukkit.Bukkit;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
-
-import java.util.*;
-
-public class VersionDependentListener extends BasicListener {
-
- private static final List listeners = new ArrayList<>();
-
- static {
- if(Core.getVersion() > 8)
- listeners.add(new PickupArrowListener_9());
- }
-
- public VersionDependentListener() {
- super(EnumSet.allOf(FightState.class));
- }
-
- @Override
- public void enable() {
- for(Listener listener : listeners)
- Bukkit.getPluginManager().registerEvents(listener, FightSystem.getPlugin());
- }
-
- @Override
- public void disable() {
- for(Listener listener : listeners)
- HandlerList.unregisterAll(listener);
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/utils/WaterRemover.java b/FightSystem_Main/src/de/steamwar/fightsystem/listener/WaterRemover.java
similarity index 64%
rename from FightSystem_Main/src/de/steamwar/fightsystem/utils/WaterRemover.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/listener/WaterRemover.java
index 973ca54..40ae32e 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/utils/WaterRemover.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/listener/WaterRemover.java
@@ -17,22 +17,32 @@
along with this program. If not, see .
*/
-package de.steamwar.fightsystem.utils;
+package de.steamwar.fightsystem.listener;
import de.steamwar.core.VersionedCallable;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityExplodeEvent;
-import java.util.List;
+public class WaterRemover implements Listener {
-public class WaterRemover {
- private WaterRemover(){}
+ private static final int MIN_Y = Config.BluePasteRegion.getMinY() + Config.WaterDepth;
- private static final int MIN_Y = Config.AlignWater ? Config.TeamBlueCornerY + Config.WaterDepth : Config.TeamBlueCornerY;
+ public WaterRemover() {
+ new StateDependentListener(ArenaMode.All, FightState.Running, this);
+ }
- public static void add(List l) {
- for(Block b : l){
+ @EventHandler
+ public void handleEntityExplode(EntityExplodeEvent event) {
+ event.setYield(0); //No drops (additionally to world config)
+
+ for(Block b : event.blockList()){
//b cannot be water or air due to current explosion
checkBlock(b.getRelative(BlockFace.UP));
@@ -43,8 +53,11 @@ public class WaterRemover {
}
}
- private static void checkBlock(Block b) {
- if(!removeWater(b))
+ private void checkBlock(Block b) {
+ //checks for water and removes it, if present
+ if(!VersionedCallable.call(
+ new VersionedCallable<>(() -> WaterRemover_8.removeWater(b), 8),
+ new VersionedCallable<>(() -> WaterRemover_14.removeWater(b), 14)))
return;
if(b.getY() < MIN_Y)
@@ -58,13 +71,8 @@ public class WaterRemover {
}
public static boolean isWater(Block block){
- return VersionedCallable.call(new VersionedCallable<>(() -> WaterRemover_8.isWater(block), 8),
+ return VersionedCallable.call(
+ new VersionedCallable<>(() -> WaterRemover_8.isWater(block), 8),
new VersionedCallable<>(() -> WaterRemover_14.isWater(block), 14));
}
-
- public static boolean removeWater(Block block){
- //checks for water and removes it, if present
- return VersionedCallable.call(new VersionedCallable<>(() -> WaterRemover_8.removeWater(block), 8),
- new VersionedCallable<>(() -> WaterRemover_14.removeWater(block), 14));
- }
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/record/RecordSystem.java b/FightSystem_Main/src/de/steamwar/fightsystem/record/RecordSystem.java
index 4b403e6..87a5ba2 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/record/RecordSystem.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/record/RecordSystem.java
@@ -20,6 +20,7 @@
package de.steamwar.fightsystem.record;
import de.steamwar.core.VersionedCallable;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.states.FightState;
@@ -48,7 +49,7 @@ public class RecordSystem {
if (Config.SpectateSystem)
new SpectateConnection();
new FileRecorder();
- if(Config.event())
+ if(Config.mode == ArenaMode.EVENT)
teamIds(Config.EventTeamBlueID, Config.EventTeamRedID);
}
@@ -167,8 +168,8 @@ public class RecordSystem {
public static synchronized void blockChange(Block block){
int blockState = blockToId(block);
- int shortX = block.getX() - Config.ArenaMinX;
- int shortZ = block.getZ() - Config.ArenaMinZ;
+ int shortX = block.getX() - Config.ArenaRegion.getMinX();
+ int shortZ = block.getZ() - Config.ArenaRegion.getMinZ();
if((short)blockState == blockState && shortX > 0 && shortX < 256 && shortZ > 0 && shortZ < 256){
//Short block packet
Recorder.rByte(0x33);
@@ -274,7 +275,7 @@ public class RecordSystem {
private static void checkWorldState(){
tick();
- if(FightSystem.getFightState() == FightState.SPECTATE)
+ if(FightState.getFightState() == FightState.SPECTATE)
return;
for(TNTPrimed tnt : WORLD.getEntitiesByClass(TNTPrimed.class)){
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/FightState.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/FightState.java
index 3a07821..b99fa84 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/states/FightState.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/FightState.java
@@ -19,39 +19,73 @@
package de.steamwar.fightsystem.states;
+import java.util.*;
+
public enum FightState {
- PRE_LEADER_SETUP(true, true, false, false),
- PRE_SCHEM_SETUP(true, true, false, false),
- POST_SCHEM_SETUP(true, true, false, false),
- PRE_RUNNING(false, false, true, false),
- RUNNING(false, false, true, true),
- SPECTATE(false, true, false, false);
+ PRE_LEADER_SETUP,
+ PRE_SCHEM_SETUP,
+ POST_SCHEM_SETUP,
+ PRE_RUNNING,
+ RUNNING,
+ SPECTATE;
- private final boolean setup; //PRE_LEADER_SETUP, PRE_SCHEM_SETUP, POST_SCHEM_SETUP
- private final boolean outgame; //PRE_LEADER_SETUP, PRE_SCHEM_SETUP, POST_SCHEM_SETUP, SPECTATE
- private final boolean ingame; //PRE_RUNNING, RUNNING
- private final boolean infight; //RUNNING
+ public static final Set All = Collections.unmodifiableSet(EnumSet.allOf(FightState.class));
- FightState(boolean setup, boolean outgame, boolean ingame, boolean infight){
- this.setup = setup;
- this.outgame = outgame;
- this.ingame = ingame;
- this.infight = infight;
+ public static final Set PreLeaderSetup = Collections.unmodifiableSet(EnumSet.of(PRE_LEADER_SETUP));
+ public static final Set PreSchemSetup = Collections.unmodifiableSet(EnumSet.of(PRE_SCHEM_SETUP));
+ public static final Set PostSchemSetup = Collections.unmodifiableSet(EnumSet.of(POST_SCHEM_SETUP));
+ public static final Set PreRunning = Collections.unmodifiableSet(EnumSet.of(PRE_RUNNING));
+ public static final Set Running = Collections.unmodifiableSet(EnumSet.of(RUNNING));
+ public static final Set Spectate = Collections.unmodifiableSet(EnumSet.of(SPECTATE));
+
+ public static final Set Setup = Collections.unmodifiableSet(EnumSet.of(PRE_LEADER_SETUP, PRE_SCHEM_SETUP, POST_SCHEM_SETUP));
+ public static final Set Ingame = Collections.unmodifiableSet(EnumSet.of(PRE_RUNNING, RUNNING));
+ public static final Set Schem = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(PRE_LEADER_SETUP, PRE_SCHEM_SETUP)));
+ public static final Set AntiRunning = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(RUNNING)));
+
+ private static final Map stateDependentFeatures = new HashMap<>();
+ private static FightState fightState = PRE_LEADER_SETUP;
+
+ public static FightState getFightState() {
+ return fightState;
}
- public boolean setup(){
- return setup;
+ public static void registerStateDependent(IStateDependent stateDependent){
+ if(stateDependent.enabled().isEmpty())
+ return;
+ boolean enabled = stateDependent.enabled().contains(fightState);
+ stateDependentFeatures.put(stateDependent, enabled);
+ if(enabled)
+ stateDependent.enable();
}
- public boolean outgame(){
- return outgame;
+ public static void setFightState(FightState state){
+ fightState = state;
+
+ for(Map.Entry feature : stateDependentFeatures.entrySet()){
+ //Enable feature if should be enabled and currently disabled
+ if(feature.getKey().enabled().contains(fightState) && !feature.getValue()){
+ feature.getKey().enable();
+ feature.setValue(true);
+ }
+
+ //Disable feature if should be disabled and currently enabled
+ if(!feature.getKey().enabled().contains(fightState) && feature.getValue()){
+ feature.getKey().disable();
+ feature.setValue(false);
+ }
+ }
}
- public boolean ingame(){
- return ingame;
+ public static boolean setup(){
+ return Setup.contains(fightState);
}
- public boolean infight(){
- return infight;
+ public static boolean ingame(){
+ return Ingame.contains(fightState);
+ }
+
+ public static boolean infight(){
+ return fightState == RUNNING;
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/IStateDependent.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/IStateDependent.java
new file mode 100644
index 0000000..1d9f170
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/IStateDependent.java
@@ -0,0 +1,40 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.states;
+
+import java.util.Set;
+
+public interface IStateDependent {
+
+ /**
+ * @return returns a set containing
+ */
+ Set enabled();
+
+ /**
+ * Enables the state dependent object
+ */
+ void enable();
+
+ /**
+ * Disables the state dependent object
+ */
+ void disable();
+}
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..564415b
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/OneShotStateDependent.java
@@ -0,0 +1,45 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+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;
+ register();
+ }
+
+ @Override
+ public void enable() {
+ runnable.run();
+ }
+
+ @Override
+ public void disable() {
+ //Do nothing, oneshot
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependent.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependent.java
index 44051d5..e20c4fb 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependent.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependent.java
@@ -1,6 +1,6 @@
-/*
+/*
This file is a part of the SteamWar software.
-
+
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
@@ -19,27 +19,37 @@
package de.steamwar.fightsystem.states;
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.winconditions.Winconditions;
+
import java.util.Set;
-public interface StateDependent {
+public abstract class StateDependent implements IStateDependent {
- /**
- * @return returns a set containing
- */
- Set enabled();
+ private final Set enabled;
+ private final boolean register;
- /**
- * Enables the state dependent object
- */
- void enable();
+ protected StateDependent(Winconditions wincondition, Set states){
+ this(Config.ActiveWinconditions.contains(wincondition), states);
+ }
- /**
- * Disables the state dependent object
- */
- void disable();
+ protected StateDependent(Set mode, Set states){
+ this(mode.contains(Config.mode), states);
+ }
- /**
- * On state change when enabled
- */
- default void stateChange(FightState state){}
+ protected StateDependent(boolean enabled, Set states){
+ this.enabled = states;
+ this.register = enabled;
+ }
+
+ public void register(){
+ if(register)
+ FightState.registerStateDependent(this);
+ }
+
+ @Override
+ public Set enabled() {
+ return enabled;
+ }
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentCommand.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentCommand.java
new file mode 100644
index 0000000..b2e63fb
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentCommand.java
@@ -0,0 +1,57 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.states;
+
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.FightSystem;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.PluginCommand;
+
+import java.util.Set;
+
+public class StateDependentCommand extends StateDependent {
+
+ private static final CommandExecutor unavailable = (sender, cmd, s, strings) -> {
+ sender.sendMessage(FightSystem.PREFIX + "§cDieser Befehl ist zu diesem Kampfzeitpunkt nicht verfügbar.");
+ return false;
+ };
+
+ private final PluginCommand command;
+ private final CommandExecutor executor;
+
+ public StateDependentCommand(Set mode, Set states, String name, CommandExecutor executor) {
+ super(mode, states);
+ this.executor = executor;
+ this.command = FightSystem.getPlugin().getCommand(name);
+ assert command != null;
+ disable();
+ register();
+ }
+
+ @Override
+ public void enable() {
+ command.setExecutor(executor);
+ }
+
+ @Override
+ public void disable() {
+ command.setExecutor(unavailable);
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentCountdown.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentCountdown.java
new file mode 100644
index 0000000..dd205cc
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentCountdown.java
@@ -0,0 +1,58 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.states;
+
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.countdown.Countdown;
+import de.steamwar.fightsystem.winconditions.Winconditions;
+
+import java.util.Set;
+
+public class StateDependentCountdown extends StateDependent {
+
+ private final Countdown countdown;
+
+ public StateDependentCountdown(Set mode, Set states, Countdown countdown) {
+ super(mode, states);
+ this.countdown = countdown;
+ register();
+ }
+
+ public StateDependentCountdown(Winconditions wincondition, Set states, Countdown countdown) {
+ super(Config.ActiveWinconditions.contains(wincondition), states);
+ this.countdown = countdown;
+ register();
+ }
+
+ public Countdown getCountdown(){
+ return countdown;
+ }
+
+ @Override
+ public void enable() {
+ countdown.enable();
+ }
+
+ @Override
+ public void disable() {
+ countdown.disable();
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentListener.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentListener.java
new file mode 100644
index 0000000..f5cfffc
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentListener.java
@@ -0,0 +1,63 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.states;
+
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.winconditions.Winconditions;
+import org.bukkit.Bukkit;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.Listener;
+
+import java.util.Set;
+
+public class StateDependentListener extends StateDependent{
+
+ private final Listener listener;
+
+ public StateDependentListener(Winconditions wincondition, Set states, Listener listener){
+ super(Config.ActiveWinconditions.contains(wincondition), states);
+ this.listener = listener;
+ register();
+ }
+
+ public StateDependentListener(boolean enabled, Set states, Listener listener){
+ super(enabled, states);
+ this.listener = listener;
+ register();
+ }
+
+ public StateDependentListener(Set mode, Set states, Listener listener) {
+ super(mode, states);
+ this.listener = listener;
+ register();
+ }
+
+ @Override
+ public void enable() {
+ Bukkit.getPluginManager().registerEvents(listener, FightSystem.getPlugin());
+ }
+
+ @Override
+ public void disable() {
+ HandlerList.unregisterAll(listener);
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentTask.java b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentTask.java
new file mode 100644
index 0000000..950fbcb
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/states/StateDependentTask.java
@@ -0,0 +1,69 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.states;
+
+import de.steamwar.fightsystem.ArenaMode;
+import de.steamwar.fightsystem.Config;
+import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.winconditions.Winconditions;
+import org.bukkit.Bukkit;
+import org.bukkit.scheduler.BukkitTask;
+
+import java.util.Set;
+
+public class StateDependentTask extends StateDependent {
+
+ private final Runnable runnable;
+ private final long delay;
+ private final long period;
+
+ private BukkitTask task = null;
+
+ public StateDependentTask(Winconditions wincondition, Set states, Runnable runnable, long delay, long period){
+ this(Config.ActiveWinconditions.contains(wincondition), states, runnable, delay, period);
+ }
+
+ public StateDependentTask(boolean enabled, Set states, Runnable runnable, long delay, long period){
+ super(enabled, states);
+ this.runnable = runnable;
+ this.delay = delay;
+ this.period = period;
+ register();
+ }
+
+ public StateDependentTask(Set mode, Set states, Runnable runnable, long delay, long period) {
+ super(mode, states);
+ this.runnable = runnable;
+ this.delay = delay;
+ this.period = period;
+ register();
+ }
+
+ @Override
+ public void enable() {
+ task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), runnable, delay, period);
+ }
+
+ @Override
+ public void disable() {
+ task.cancel();
+ }
+
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/utils/EnterHandler.java b/FightSystem_Main/src/de/steamwar/fightsystem/utils/EnterHandler.java
index a2408f9..d4250e2 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/utils/EnterHandler.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/utils/EnterHandler.java
@@ -20,24 +20,21 @@
package de.steamwar.fightsystem.utils;
import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.countdown.EnternCountdown;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightPlayer;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.states.StateDependent;
+import de.steamwar.fightsystem.states.IStateDependent;
import java.util.EnumSet;
-import java.util.HashSet;
import java.util.Set;
-public class EnterHandler implements StateDependent {
- private static final Set enabled = EnumSet.of(FightState.RUNNING);
- private static final Set countdowns = new HashSet<>();
+public class EnterHandler implements IStateDependent {
+ private static final Set enabled = EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING);
public EnterHandler(){
- FightSystem.registerStateDependent(this);
+ FightState.registerStateDependent(this);
}
@Override
@@ -45,13 +42,6 @@ public class EnterHandler implements StateDependent {
return enabled;
}
- private void registerTeam(FightTeam team){
- for(FightPlayer fp : team.getPlayers()){
- if(Config.EnterStages.size() > fp.getKit().getEnterStage() && fp.getKit().getEnterStage() >= 0)
- countdowns.add(new EnternCountdown(fp));
- }
- }
-
@Override
public void enable() {
registerTeam(Fight.getBlueTeam());
@@ -60,9 +50,20 @@ public class EnterHandler implements StateDependent {
@Override
public void disable() {
- for(EnternCountdown countdown : countdowns){
- countdown.disable();
+ unregisterTeam(Fight.getBlueTeam());
+ unregisterTeam(Fight.getRedTeam());
+ }
+
+ private void registerTeam(FightTeam team){
+ for(FightPlayer fp : team.getPlayers()){
+ if(Config.EnterStages.size() > fp.getKit().getEnterStage() && fp.getKit().getEnterStage() >= 0)
+ fp.setEnternCountdown(new EnternCountdown(fp));
+ }
+ }
+
+ private void unregisterTeam(FightTeam team){
+ for(FightPlayer fp : team.getPlayers()){
+ fp.stopEnternCountdown();
}
- countdowns.clear();
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightScoreboard.java b/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightScoreboard.java
deleted file mode 100644
index dde9310..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightScoreboard.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.utils;
-
-import de.steamwar.core.TPSWatcher;
-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.record.RecordSystem;
-import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.winconditions.*;
-import de.steamwar.scoreboard.SWScoreboard;
-import de.steamwar.scoreboard.ScoreboardCallback;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-import org.bukkit.scoreboard.Scoreboard;
-
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Set;
-
-public class FightScoreboard {
-
- private static final Set fullScoreboard = EnumSet.of(FightState.RUNNING, FightState.SPECTATE);
- private static int index = 0;
- private static String title = "";
- private static final HashMap scores = new HashMap<>();
-
- public static void init(){
- Bukkit.getScheduler().scheduleSyncRepeatingTask(FightSystem.getPlugin(), FightScoreboard::nextIndexDisplay, 0, 200);
- }
-
- public static Scoreboard getScoreboard() {
- return Bukkit.getScoreboardManager().getMainScoreboard();
- }
-
- public static void showScoreboard(Player p) {
- SWScoreboard.createScoreboard(p, new ScoreboardCallback() {
- @Override
- public HashMap getData() {
- return scores;
- }
-
- @Override
- public String getTitle() {
- return title;
- }
- });
- }
-
- public static void removeScoreboard(Player p) {
- SWScoreboard.removeScoreboard(p);
- }
-
- private static void teamScoreboard(FightTeam fightTeam){
- title = fightTeam.getColoredName();
- if(Config.recording())
- RecordSystem.scoreboardTitle(title);
- fightTeam.getPlayers().forEach(fp -> {
- if(fp.isLiving())
- addScore(fightTeam.getPrefix() + fp.getPlayer().getName(), (int) Math.ceil(fp.getPlayer().getHealth()));
- });
- }
-
- private static void generalScoreboard(){
- title = "§6Kampf";
- if(Config.recording())
- RecordSystem.scoreboardTitle(title);
- if (Config.Timeout || Config.Points || Config.HeartRatioTimeout) {
- int fightTime = FightSystem.getFightTime();
- if (fightTime >= 60)
- addScore("§7Zeit: §a" + fightTime / 60 + "m " + fightTime % 60 + "s", 4);
- else
- addScore("§7Zeit: §a" + fightTime + "s", 4);
- }
-
- addScore("§7TPS: §e" + TPSWatcher.getTPS(), 3);
-
- if(fullScoreboard.contains(FightSystem.getFightState())){
- if (Config.PercentSystem){
- addScore(Fight.getRedTeam().getPrefix() + "Schaden: " + (Math.round(100.0 * WinconditionPercentSystem.getRedPercent()) / 100.0) + "%", 1);
- addScore(Fight.getBlueTeam().getPrefix() + "Schaden: " + (Math.round(100.0 * WinconditionPercentSystem.getBluePercent()) / 100.0) + "%", 0);
- }else if(Config.WaterTechKO){
- addScore(Fight.getRedTeam().getPrefix() + "Wasser: " + WinconditionWaterTechKO.getTeamRedWater(), 1);
- addScore(Fight.getBlueTeam().getPrefix() + "Wasser: " + WinconditionWaterTechKO.getTeamBlueWater(), 0);
- }else if(Config.RelativePercent){
- addScore(Fight.getRedTeam().getPrefix() + "Schaden: " + WinconditionRelativePercent.getRed().getPrintablePercent() + "%", 1);
- addScore(Fight.getBlueTeam().getPrefix() + "Schaden: " + WinconditionRelativePercent.getBlue().getPrintablePercent() + "%", 0);
- }else if(Config.Points){
- addScore(Fight.getRedTeam().getPrefix() + "Punkte: " + WinconditionPoints.getRed().getPoints(), 1);
- addScore(Fight.getBlueTeam().getPrefix() + "Punkte: " + WinconditionPoints.getBlue().getPoints(), 0);
- }else if(Config.PumpkinTechKO){
- addScore(Fight.getRedTeam().getPrefix() + "Kanonen: " + WinconditionPumpkinTechKO.getTeamRedPumpkins(), 1);
- addScore(Fight.getBlueTeam().getPrefix() + "Kanonen: " + WinconditionPumpkinTechKO.getTeamBluePumpkins(), 0);
- }
- }
- }
-
- private static void nextIndexDisplay() {
- index++;
- if(index > 2)
- index = 0;
- FightTeam team = null;
- if(index == 1)
- team = Fight.redTeam;
- if(index == 2)
- team = Fight.blueTeam;
- scores.clear();
- if(team != null)
- teamScoreboard(team);
- else
- generalScoreboard();
- }
-
- private static void addScore(String string, int i) {
- if(Config.recording())
- RecordSystem.scoreboardData(string, i);
- scores.put(string, i);
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightStatistics.java b/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightStatistics.java
index 23fcdf4..ade520e 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightStatistics.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/utils/FightStatistics.java
@@ -21,9 +21,11 @@ package de.steamwar.fightsystem.utils;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.countdown.Countdown;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightPlayer;
import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.winconditions.Wincondition;
import de.steamwar.sql.Elo;
import de.steamwar.sql.Schematic;
import de.steamwar.sql.SteamwarUser;
@@ -39,7 +41,7 @@ public class FightStatistics {
private FightStatistics(){}
private static Timestamp starttime = Timestamp.from(Instant.now());
- private static int K = 20;
+ private static final int K = 20;
public static void start(){
starttime = Timestamp.from(Instant.now());
@@ -47,10 +49,14 @@ public class FightStatistics {
public static void saveStats(FightTeam winner, String windescription){
String gameMode = Config.SchematicType.toDB();
- if(!Fight.getBlueTeam().hasTeamLeader() || !Fight.getRedTeam().hasTeamLeader())
- return;
- SteamwarUser blueLeader = SteamwarUser.get(Fight.getBlueTeam().getLeader().getPlayer().getUniqueId());
- SteamwarUser redLeader = SteamwarUser.get(Fight.getRedTeam().getLeader().getPlayer().getUniqueId());
+
+ int blueLeader = 0;
+ int redLeader = 0;
+ if(Fight.getBlueTeam().getLeader() != null)
+ blueLeader = SteamwarUser.get(Fight.getBlueTeam().getLeader().getPlayer().getUniqueId()).getId();
+ if(Fight.getRedTeam().getLeader() != null)
+ redLeader = SteamwarUser.get(Fight.getRedTeam().getLeader().getPlayer().getUniqueId()).getId();
+
int win = 0;
double blueResult;
if(winner == Fight.getBlueTeam()) {
@@ -63,7 +69,8 @@ public class FightStatistics {
blueResult = 0.5;
}
- Integer blueSchem, redSchem;
+ Integer blueSchem;
+ Integer redSchem;
try{
blueSchem = Schematic.getSchemFromDB(Fight.getBlueTeam().getSchematic()).getSchemID();
}catch(SecurityException e){
@@ -75,9 +82,15 @@ public class FightStatistics {
redSchem = null;
}
+ int remainingTime = 0;
+ Countdown timeOverCountdown = Wincondition.getTimeOverCountdown();
+ if(timeOverCountdown != null){
+ remainingTime = timeOverCountdown.getTimeLeft();
+ }
+
try {
- int fightId = create(gameMode, Bukkit.getWorlds().get(0).getName(), starttime, Config.TimeoutTime - FightSystem.getFightTime(),
- blueLeader.getId(), redLeader.getId(), blueSchem, redSchem, win, windescription);
+ int fightId = create(gameMode, Bukkit.getWorlds().get(0).getName(), starttime, remainingTime,
+ blueLeader, redLeader, blueSchem, redSchem, win, windescription);
for (FightPlayer fp : Fight.getBlueTeam().getPlayers())
savePlayerStats(fp, fightId);
@@ -87,17 +100,17 @@ public class FightStatistics {
Bukkit.getLogger().log(Level.SEVERE, "Failed to save statistics", e);
}
- if(Config.Ranked && !Config.event()){
- int blueElo = Elo.getElo(blueLeader.getId(), gameMode);
- int redElo = Elo.getElo(redLeader.getId(), gameMode);
+ if(Config.Ranked){
+ int blueElo = Elo.getElo(blueLeader, gameMode);
+ int redElo = Elo.getElo(redLeader, gameMode);
double redWinExpectation = 1 / (1 + Math.pow(10, (blueElo - redElo) / 400f));
double blueWinExpectation = 1 / (1 + Math.pow(10, (redElo - blueElo) / 400f));
int newBlueElo = (int) Math.round(blueElo + K * (blueResult - blueWinExpectation));
int newRedElo = (int) Math.round(redElo + K * (1 - blueResult - redWinExpectation));
- Elo.setElo(blueLeader.getId(), gameMode, newBlueElo);
- Elo.setElo(redLeader.getId(), gameMode, newRedElo);
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§7ELO von " + Fight.getBlueTeam().getPrefix() + blueLeader.getUserName() + "§8: §7" + blueElo + "§8»§e" + newBlueElo);
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§7ELO von " + Fight.getRedTeam().getPrefix() + redLeader.getUserName() + "§8: §7" + redElo + "§8»§e" + newRedElo);
+ Elo.setElo(blueLeader, gameMode, newBlueElo);
+ Elo.setElo(redLeader, gameMode, newRedElo);
+ Bukkit.broadcastMessage(FightSystem.PREFIX + "§7ELO von " + Fight.getBlueTeam().getPrefix() + Fight.getBlueTeam().getLeader().getPlayer().getName() + "§8: §7" + blueElo + "§8»§e" + newBlueElo);
+ Bukkit.broadcastMessage(FightSystem.PREFIX + "§7ELO von " + Fight.getRedTeam().getPrefix() + Fight.getRedTeam().getLeader().getPlayer().getName() + "§8: §7" + redElo + "§8»§e" + newRedElo);
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/utils/Region.java b/FightSystem_Main/src/de/steamwar/fightsystem/utils/Region.java
deleted file mode 100644
index 721658c..0000000
--- a/FightSystem_Main/src/de/steamwar/fightsystem/utils/Region.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- This file is a part of the SteamWar software.
-
- Copyright (C) 2020 SteamWar.de-Serverteam
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-package de.steamwar.fightsystem.utils;
-
-import org.bukkit.Location;
-
-public class Region {
-
- private Region(){}
-
- public static boolean isInRange(Location location, int minX, int minY, int minZ, int xRange, int yRange, int zRange, int margin) {
- return isInRegion(location, minX, minY, minZ, minX + xRange, minY + yRange, minZ + zRange, margin);
- }
-
- public static boolean isInRegion(Location location, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int margin) {
- return isIn2DRegion(location, minX, minZ, maxX, maxZ, margin) && inRange(location.getBlockY(), minY, maxY, margin);
- }
-
- public static boolean isIn2DRange(Location location, int minX, int minZ, int xRange, int zRange, int margin){
- return isIn2DRegion(location, minX, minZ, minX + xRange, minZ + zRange, margin);
- }
-
- private static boolean isIn2DRegion(Location location, int minX, int minZ, int maxX, int maxZ, int margin){
- return inRange(location.getBlockX(), minX, maxX, margin) && inRange(location.getBlockZ(), minZ, maxZ, margin);
- }
-
- public static boolean isIn2DRegion(Location location, int minX, int minZ, int maxX, int maxZ){
- return inRange(location.getBlockX(), minX, maxX) && inRange(location.getBlockZ(), minZ, maxZ);
- }
-
- private static boolean inRange(double value, int min, int max, int margin){
- return inRange(value, min-margin, max+margin);
- }
-
- private static boolean inRange(double value, int min, int max){
- return min <= value && value <= max;
- }
-}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/utils/TechHider.java b/FightSystem_Main/src/de/steamwar/fightsystem/utils/TechHider.java
index b06df30..68f897a 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/utils/TechHider.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/utils/TechHider.java
@@ -21,6 +21,7 @@ package de.steamwar.fightsystem.utils;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
+import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
@@ -30,32 +31,59 @@ import com.comphenix.protocol.wrappers.ChunkCoordIntPair;
import com.comphenix.protocol.wrappers.MultiBlockChangeInfo;
import com.comphenix.protocol.wrappers.WrappedBlockData;
import de.steamwar.core.Core;
-import de.steamwar.core.VersionedRunnable;
+import de.steamwar.core.VersionedCallable;
import de.steamwar.core.events.ChunkListener;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.Config;
import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.IFightSystem;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependent;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
+import org.bukkit.Material;
import org.bukkit.entity.Player;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
import static de.steamwar.fightsystem.utils.ITechHider.bypass;
-public class TechHider {
- private TechHider(){}
+public class TechHider extends StateDependent {
- private static boolean running = false;
+ private static final boolean enabled = !Config.OnlyPublicSchematics && !Config.test() && Config.TechhiderActive;
- public static void init(){
- if(disabled())
- return;
+ private final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
+ private final Map packetCache = new HashMap<>();
+ private final Material obfuscateMaterial;
+ private final PacketAdapter chunkHider;
+ private final int threadMultiplier;
+
+ public TechHider(){
+ super(enabled, FightState.Schem);
+
+ Set hiddenBlockIds = VersionedCallable.call(
+ new VersionedCallable<>(TechHider_8::getHiddenBlockIds, 8),
+ new VersionedCallable<>(TechHider_14::getHiddenBlockIds, 14),
+ new VersionedCallable<>(TechHider_15::getHiddenBlockIds, 15));
+ int obfuscateWith = VersionedCallable.call(
+ new VersionedCallable<>(TechHider_8::getObfuscateWith, 8),
+ new VersionedCallable<>(TechHider_14::getObfuscateWith, 14),
+ new VersionedCallable<>(TechHider_15::getObfuscateWith, 15));
+
+ obfuscateMaterial = Material.getMaterial(Config.ObfuscateWith.toUpperCase());
+ chunkHider = VersionedCallable.call(new VersionedCallable<>(() -> null, 8),
+ new VersionedCallable<>(() -> TechHider_12.chunkHider(hiddenBlockIds, obfuscateWith), 12),
+ new VersionedCallable<>(() -> TechHider_14.chunkHider(hiddenBlockIds, obfuscateWith), 14));
+
+ if(Config.mode == ArenaMode.EVENT)
+ threadMultiplier = 4;
+ else
+ threadMultiplier = 1;
+
+ Bukkit.getScheduler().runTaskTimer(IFightSystem.getPlugin(), packetCache::clear, 1, 1);
if(Core.getVersion() > 8){
- ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.USE_ITEM) {
+ protocolManager.addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.USE_ITEM) {
@Override
public void onPacketReceiving(PacketEvent e) {
Player p = e.getPlayer();
@@ -65,7 +93,7 @@ public class TechHider {
}
});
}
- ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.USE_ENTITY) {
+ protocolManager.addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.USE_ENTITY) {
@Override
public void onPacketReceiving(PacketEvent e) {
Player p = e.getPlayer();
@@ -74,180 +102,180 @@ public class TechHider {
e.setCancelled(true);
}
});
+ register();
}
- public static void start(){
- if(running)
- return;
- running = true;
-
- if(disabled())
- return;
-
- blockActionHider();
- blockHider();
- multiBlockHider();
- updateBlockEntity();
- if(Core.getVersion() > 12){
- blockBreakHider();
+ @Override
+ public void enable() {
+ protocolManager.addPacketListener(blockHider);
+ protocolManager.addPacketListener(multiBlockHider);
+ protocolManager.addPacketListener(blockActionHider);
+ if(Core.getVersion() > 8) {
+ protocolManager.addPacketListener(updateBlockEntity);
+ }
+ if(Core.getVersion() > 12) {
+ protocolManager.addPacketListener(blockBreakHider);
+ }
+ if(chunkHider != null) {
+ protocolManager.getAsynchronousManager().registerAsyncHandler(chunkHider).start(threadMultiplier * 4);
}
- VersionedRunnable.call(new VersionedRunnable(TechHider_12::start, 12),
- new VersionedRunnable(TechHider_14::start, 14),
- new VersionedRunnable(TechHider_15::start, 15));
}
- private static void multiBlockHider(){
- ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.MULTI_BLOCK_CHANGE) {
- @Override
- public void onPacketSending(PacketEvent e) {
- PacketContainer packet = e.getPacket();
+ @Override
+ public void disable() {
+ protocolManager.removePacketListener(blockHider);
+ protocolManager.removePacketListener(multiBlockHider);
+ protocolManager.removePacketListener(blockActionHider);
+ if(Core.getVersion() > 8) {
+ protocolManager.removePacketListener(updateBlockEntity);
+ }
+ if(Core.getVersion() > 12) {
+ protocolManager.removePacketListener(blockBreakHider);
+ }
+ if(chunkHider != null) {
+ protocolManager.getAsynchronousManager().unregisterAsyncHandler(chunkHider);
+ }
+ }
- Player p = e.getPlayer();
- ChunkCoordIntPair pos = packet.getChunkCoordIntPairs().read(0);
- if(bypass(p, pos.getChunkX(), pos.getChunkZ()))
- return;
+ private final PacketAdapter multiBlockHider = new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.MULTI_BLOCK_CHANGE) {
+ @Override
+ public void onPacketSending(PacketEvent e) {
+ PacketContainer packet = e.getPacket();
- PacketContainer cached = ITechHider.packetCache.get(packet);
- if(cached != null){
- e.setPacket(cached);
- return;
- }
+ Player p = e.getPlayer();
+ ChunkCoordIntPair pos = packet.getChunkCoordIntPairs().read(0);
+ if(bypass(p, pos.getChunkX(), pos.getChunkZ()))
+ return;
- cached = packet.shallowClone();
- ITechHider.packetCache.put(packet, cached);
+ PacketContainer cached = packetCache.get(packet);
+ if(cached != null){
e.setPacket(cached);
- StructureModifier blockStructure = cached.getMultiBlockChangeInfoArrays();
- MultiBlockChangeInfo[] changes = blockStructure.read(0).clone();
- boolean changed = false;
- for(MultiBlockChangeInfo mbci : changes){
- WrappedBlockData block = mbci.getData();
- if(Config.HiddenBlockTags.contains(block.getType().name())){
- changed = true;
- block.setType(ITechHider.obfuscateMaterial);
- mbci.setData(block);
- }
- }
+ return;
+ }
- if(changed){
- blockStructure.write(0, changes);
+ cached = packet.shallowClone();
+ packetCache.put(packet, cached);
+ e.setPacket(cached);
+ StructureModifier blockStructure = cached.getMultiBlockChangeInfoArrays();
+ MultiBlockChangeInfo[] changes = blockStructure.read(0).clone();
+ boolean changed = false;
+ for(MultiBlockChangeInfo mbci : changes){
+ WrappedBlockData block = mbci.getData();
+ if(Config.HiddenBlocks.contains(block.getType().name().toLowerCase())){
+ changed = true;
+ block.setType(obfuscateMaterial);
+ mbci.setData(block);
}
}
- });
- }
- private static void blockBreakHider(){
- ProtocolLibrary.getProtocolManager().addPacketListener(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);
+ if(changed){
+ blockStructure.write(0, changes);
+ }
+ }
+ };
- Player p = e.getPlayer();
- if(bypass(p, ITechHider.posToChunk(pos.getX()), ITechHider.posToChunk(pos.getZ())))
- return;
+ private final PacketAdapter blockHider = new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.BLOCK_CHANGE) {
+ @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 = ITechHider.packetCache.get(packet);
- if(cached != null){
- e.setPacket(cached);
- return;
- }
-
- cached = packet.deepClone();
- ITechHider.packetCache.put(packet, cached);
+ PacketContainer cached = packetCache.get(packet);
+ if(cached != null){
e.setPacket(cached);
- StructureModifier blockStructure = cached.getBlockData();
- WrappedBlockData block = blockStructure.read(0);
- if(Config.HiddenBlockTags.contains(block.getType().name())){
- block.setType(ITechHider.obfuscateMaterial);
- blockStructure.write(0, block);
- }
+ return;
}
- });
- }
- private static void blockHider(){
- ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.BLOCK_CHANGE) {
- @Override
- public void onPacketSending(PacketEvent e) {
- PacketContainer packet = e.getPacket();
- BlockPosition pos = packet.getBlockPositionModifier().read(0);
+ 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().toLowerCase())){
+ block.setType(obfuscateMaterial);
+ blockStructure.write(0, block);
+ }
+ }
+ };
- Player p = e.getPlayer();
- if(bypass(p, ITechHider.posToChunk(pos.getX()), ITechHider.posToChunk(pos.getZ())))
- return;
+ private final PacketAdapter blockActionHider = new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.BLOCK_ACTION) {
+ @Override
+ public void onPacketSending(PacketEvent e) {
+ PacketContainer packet = e.getPacket();
+ BlockPosition pos = packet.getBlockPositionModifier().read(0);
- PacketContainer cached = ITechHider.packetCache.get(packet);
- if(cached != null){
- e.setPacket(cached);
- return;
- }
+ Player p = e.getPlayer();
+ if(bypass(p, ITechHider.posToChunk(pos.getX()), ITechHider.posToChunk(pos.getZ())))
+ return;
- cached = packet.deepClone();
- ITechHider.packetCache.put(packet, cached);
+ e.setCancelled(true);
+ }
+ };
+
+ 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);
- StructureModifier blockStructure = cached.getBlockData();
- WrappedBlockData block = blockStructure.read(0);
- if(Config.HiddenBlockTags.contains(block.getType().name())){
- block.setType(ITechHider.obfuscateMaterial);
- blockStructure.write(0, block);
- }
+ return;
}
- });
- }
- private static void blockActionHider(){
- ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.BLOCK_ACTION) {
- @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;
-
- e.setCancelled(true);
+ 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().toLowerCase())){
+ block.setType(obfuscateMaterial);
+ blockStructure.write(0, block);
}
- });
- }
+ }
+ };
- private static void updateBlockEntity(){
- if(Core.getVersion() < 9)
- return;
+ private final PacketAdapter updateBlockEntity = new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Server.TILE_ENTITY_DATA) {
+ @Override
+ public void onPacketSending(PacketEvent event) {
+ PacketContainer packet = event.getPacket();
+ BlockPosition pos = packet.getBlockPositionModifier().read(0);
- ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Server.TILE_ENTITY_DATA) {
- @Override
- public void onPacketSending(PacketEvent event) {
- PacketContainer packet = event.getPacket();
- BlockPosition pos = packet.getBlockPositionModifier().read(0);
+ Player p = event.getPlayer();
+ if(bypass(p, ITechHider.posToChunk(pos.getX()), ITechHider.posToChunk(pos.getZ())))
+ return;
- Player p = event.getPlayer();
- if(bypass(p, ITechHider.posToChunk(pos.getX()), ITechHider.posToChunk(pos.getZ())))
- return;
+ // 9 == Set sign text
+ if(packet.getIntegers().read(0) != 9)
+ return;
- // 9 == Set sign text
- if(packet.getIntegers().read(0) != 9)
- return;
-
- event.setCancelled(true);
- }
- });
- }
+ event.setCancelled(true);
+ }
+ };
public static List prepareChunkReload(Player p){
- if(disabled())
+ if(enabled)
return Collections.emptyList();
List chunksToReload = new ArrayList<>();
- for(int x = ITechHider.arenaMinX; x <= ITechHider.arenaMaxX; x++)
- for(int z = ITechHider.arenaMinZ; z <= ITechHider.arenaMaxZ; z++)
- if(!bypass(p, x, z))
- chunksToReload.add(new ChunkPos(x, z));
+ Config.ArenaRegion.forEachChunk((x, z) -> {
+ if(!bypass(p, x, z))
+ chunksToReload.add(new ChunkPos(x, z));
+ });
return chunksToReload;
}
public static void reloadChunks(Player p, List chunksToReload){
- if(disabled())
+ if(enabled)
return;
Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> {
for(ChunkPos chunk : chunksToReload){
@@ -257,10 +285,6 @@ public class TechHider {
}, 40);
}
- private static boolean disabled(){
- return Config.OnlyPublicSchematics || Config.test() || !Config.TechhiderActive;
- }
-
public static class ChunkPos{
final int x;
final int z;
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java
index 38b7203..1e3941b 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/EventTeamOffWincondition.java
@@ -19,36 +19,37 @@
package de.steamwar.fightsystem.winconditions;
-import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
-import org.bukkit.Bukkit;
+import de.steamwar.fightsystem.states.StateDependent;
-import java.util.EnumSet;
-
-public class EventTeamOffWincondition extends Wincondition {
+public class EventTeamOffWincondition extends Wincondition{
public EventTeamOffWincondition(){
- super(Config.event(), EnumSet.of(FightState.PRE_RUNNING));
- }
+ super("TeamOffline", "§cDas Team ", " §cist offline!", "§cBeide Teams sind offline!");
+ new StateDependent(ArenaMode.Event, FightState.PreRunning) {
+ @Override
+ public void enable() {
+ if(Fight.getBlueTeam().allPlayersOut() && Fight.getRedTeam().allPlayersOut()){
+ win(null);
+ }else{
+ teamOff(Fight.getBlueTeam());
+ teamOff(Fight.getRedTeam());
+ }
+ }
- @Override
- public void enable() {
- teamOff(Fight.getBlueTeam());
- teamOff(Fight.getRedTeam());
- }
-
- @Override
- public void disable() {
- //Team off is a on time trigger
+ @Override
+ public void disable() {
+ //Team off is a one time trigger
+ }
+ }.register();
}
private void teamOff(FightTeam team){
if(team.allPlayersOut()){
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§6Das Team " + team.getColoredName() + " §6ist Offline!");
- FightSystem.setSpectateState(Fight.getOpposite(team), "TeamOffline");
+ win(Fight.getOpposite(team));
}
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PlayerWincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PercentWincondition.java
similarity index 59%
rename from FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PlayerWincondition.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PercentWincondition.java
index 472a7c5..eacac0b 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PlayerWincondition.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PercentWincondition.java
@@ -1,6 +1,6 @@
-/*
+/*
This file is a part of the SteamWar software.
-
+
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
@@ -19,25 +19,8 @@
package de.steamwar.fightsystem.winconditions;
-import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.states.FightState;
-import org.bukkit.entity.Player;
-import java.util.EnumSet;
-
-abstract class PlayerWincondition extends ListenerWincondition {
-
- PlayerWincondition(boolean condition) {
- super(condition, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING));
- }
-
- boolean isTarget(Player player){
- FightTeam fightTeam = Fight.getPlayerTeam(player);
- if(fightTeam == null)
- return false;
-
- fightTeam.getFightPlayer(player).setOut();
- return true;
- }
+public interface PercentWincondition {
+ double getPercent(FightTeam team);
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PrintableWincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PrintableWincondition.java
new file mode 100644
index 0000000..31053a8
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/PrintableWincondition.java
@@ -0,0 +1,26 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.winconditions;
+
+import de.steamwar.fightsystem.fight.FightTeam;
+
+public interface PrintableWincondition {
+ String getDisplay(FightTeam team);
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/RankedPlayerLeftWincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/RankedPlayerLeftWincondition.java
index 77a8a38..17b71d1 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/RankedPlayerLeftWincondition.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/RankedPlayerLeftWincondition.java
@@ -19,14 +19,32 @@
package de.steamwar.fightsystem.winconditions;
-import de.steamwar.fightsystem.FightSystem;
+import de.steamwar.fightsystem.ArenaMode;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerQuitEvent;
-public class RankedPlayerLeftWincondition {
- private RankedPlayerLeftWincondition(){}
+public class RankedPlayerLeftWincondition extends Wincondition implements Listener {
- public static void leaderQuit(FightTeam leaderlessTeam){
- FightSystem.setSpectateState(Fight.getOpposite(leaderlessTeam), "LeaderQuit");
+ public RankedPlayerLeftWincondition(){
+ super("LeaderQuit", "§cDer Leader von ", " §chat den Kampf verlassen!");
+ new StateDependentListener(ArenaMode.Ranked, FightState.Setup, this);
+ }
+
+ @EventHandler
+ public void handlePlayerQuit(PlayerQuitEvent event) {
+ Player player = event.getPlayer();
+ FightTeam team = isTarget(player);
+ if(team == null)
+ return;
+
+ if(team.isPlayerLeader(player)) {
+ win(Fight.getOpposite(team));
+ }
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/Wincondition.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/Wincondition.java
index a26ef73..984fe29 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/Wincondition.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/Wincondition.java
@@ -20,23 +20,72 @@
package de.steamwar.fightsystem.winconditions;
import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.states.StateDependent;
+import de.steamwar.fightsystem.countdown.Countdown;
+import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
-abstract class Wincondition implements StateDependent {
+public abstract class Wincondition {
- private final Set enabled;
+ protected static PercentWincondition percentWincondition = null;
+ protected static StateDependentCountdown timeOverCountdown = null;
+ protected static final List printableWinconditions = new ArrayList<>();
- Wincondition(boolean condition, Set enabled){
- this.enabled = enabled;
- if(condition)
- FightSystem.registerStateDependent(this);
+ private final String windescription;
+ private final String preteammessage;
+ private final String postteammessage;
+ private final String tiemessage;
+
+ protected Wincondition(String windescription, String tiemessage) {
+ this(windescription, null, null, tiemessage);
}
- @Override
- public Set enabled(){
- return enabled;
+ protected Wincondition(String windescription, String preteammessage, String postteammessage) {
+ this(windescription, preteammessage, postteammessage, null);
+ }
+
+ protected Wincondition(String windescription, String preteammessage, String postteammessage, String tiemessage) {
+ this.windescription = windescription;
+ this.preteammessage = preteammessage;
+ this.tiemessage = tiemessage;
+ this.postteammessage = postteammessage;
+ }
+
+ public static Countdown getTimeOverCountdown(){
+ if(timeOverCountdown == null)
+ return null;
+ return timeOverCountdown.getCountdown();
+ }
+
+ protected void win(FightTeam team, String postteammessage){
+ Bukkit.broadcastMessage(FightSystem.PREFIX + tiemessage + team.getColoredName() + postteammessage);
+ FightSystem.setSpectateState(team, windescription);
+ }
+
+ protected void win(FightTeam team){
+ if(team != null){
+ Bukkit.broadcastMessage(FightSystem.PREFIX + preteammessage + team.getColoredName() + postteammessage);
+ }else{
+ Bukkit.broadcastMessage(FightSystem.PREFIX + tiemessage);
+ }
+ FightSystem.setSpectateState(team, windescription);
+ }
+
+ protected FightTeam isTarget(Player player){
+ FightTeam fightTeam = Fight.getPlayerTeam(player);
+ if(fightTeam == null)
+ return null;
+
+ fightTeam.getFightPlayer(player).setOut();
+ return fightTeam;
+ }
+
+ public static List getPrintableWinconditions(){
+ return printableWinconditions;
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java
index 3f03582..4a07ab0 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionAllDead.java
@@ -19,20 +19,21 @@
package de.steamwar.fightsystem.winconditions;
-import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.Config;
-import org.bukkit.Bukkit;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerQuitEvent;
-public class WinconditionAllDead extends PlayerWincondition {
+public class WinconditionAllDead extends Wincondition implements Listener {
public WinconditionAllDead(){
- super(Config.AllDead);
+ super("AllDead", "§cDer letzte Spieler aus ");
+ new StateDependentListener(Winconditions.ALL_DEAD, FightState.Ingame, this);
}
@EventHandler
@@ -46,14 +47,12 @@ public class WinconditionAllDead extends PlayerWincondition {
}
private void handleDeath(Player player, String message){
- if(!isTarget(player))
+ FightTeam team = isTarget(player);
+ if(team == null)
return;
- FightTeam fightTeam = Fight.getPlayerTeam(player);
- assert fightTeam != null; // Checked with isTarget
- if(fightTeam.allPlayersOut()) {
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer letzte Spieler aus " + fightTeam.getColoredName() + message);
- FightSystem.setSpectateState(Fight.getOpposite(fightTeam), "AllDead");
+ if(team.allPlayersOut()) {
+ win(Fight.getOpposite(team), message);
}
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java
index 94b3726..1e91204 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionCaptainDead.java
@@ -19,20 +19,21 @@
package de.steamwar.fightsystem.winconditions;
-import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
-import de.steamwar.fightsystem.Config;
-import org.bukkit.Bukkit;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerQuitEvent;
-public class WinconditionCaptainDead extends PlayerWincondition {
+public class WinconditionCaptainDead extends Wincondition implements Listener {
public WinconditionCaptainDead(){
- super(Config.CaptainDead);
+ super("LeaderDead", "§cDer Leader von ");
+ new StateDependentListener(Winconditions.CAPTAIN_DEAD, FightState.Ingame, this);
}
@EventHandler
@@ -46,14 +47,12 @@ public class WinconditionCaptainDead extends PlayerWincondition {
}
private void handleDeath(Player player, String message){
- if(!isTarget(player))
+ FightTeam team = isTarget(player);
+ if(team == null)
return;
- FightTeam fightTeam = Fight.getPlayerTeam(player);
- assert fightTeam != null; // Checked with isTarget
- if(fightTeam.isPlayerLeader(player)) {
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Leader von " + fightTeam.getColoredName() + message);
- FightSystem.setSpectateState(Fight.getOpposite(fightTeam), "LeaderDead");
+ if(team.isPlayerLeader(player)) {
+ win(Fight.getOpposite(team), message);
}
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java
index 74f1843..efdeb78 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionHeartRatioTimeout.java
@@ -19,39 +19,29 @@
package de.steamwar.fightsystem.winconditions;
-import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.countdown.TimeOverCountdown;
import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
-
-import java.util.EnumSet;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
public class WinconditionHeartRatioTimeout extends Wincondition {
- private TimeOverCountdown countdown;
-
public WinconditionHeartRatioTimeout() {
- super(Config.HeartRatioTimeout, EnumSet.of(FightState.RUNNING));
+ super("HeartTimeout", "§cDie Zeit ist abgelaufen, und Team ", " §chatte mehr verbleibende Leben!", "§cDie Zeit ist abgelaufen, und beide Teams hatten die gleiche Anzahl an verbleibenden Leben!");
+ timeOverCountdown = new StateDependentCountdown(Winconditions.HEART_RATIO_TIMEOUT, FightState.Running, new TimeOverCountdown(this::timeOver));
}
- @Override
- public void enable() {
- countdown = new TimeOverCountdown(() -> {
- double blueHeartRatio = Fight.getBlueTeam().getHeartRatio();
- double redHeartRatio = Fight.getRedTeam().getHeartRatio();
+ protected void timeOver() {
+ double blueHeartRatio = Fight.getBlueTeam().getHeartRatio();
+ double redHeartRatio = Fight.getRedTeam().getHeartRatio();
- if(blueHeartRatio > redHeartRatio)
- FightSystem.setSpectateState(Fight.getBlueTeam(), "HeartTimeout");
- else if(blueHeartRatio < redHeartRatio)
- FightSystem.setSpectateState(Fight.getRedTeam(), "HeartTimeout");
- else
- FightSystem.setSpectateState(null, "HeartTimeout");
- });
- }
+ FightTeam team = null;
+ if(blueHeartRatio > redHeartRatio)
+ team = Fight.getBlueTeam();
+ else if(blueHeartRatio < redHeartRatio)
+ team = Fight.getRedTeam();
- @Override
- public void disable(){
- countdown.disable();
+ win(team);
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java
index 1fe5ad3..5e6a838 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentSystem.java
@@ -20,60 +20,70 @@
package de.steamwar.fightsystem.winconditions;
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.states.FightState;
-import de.steamwar.fightsystem.utils.Region;
-import org.bukkit.entity.Entity;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent;
-import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
-public class WinconditionPercentSystem extends ListenerWincondition {
+public class WinconditionPercentSystem extends Wincondition implements Listener, PrintableWincondition, PercentWincondition {
- private static double bluePercent = 0D;
- private static double redPercent = 0D;
-
- private static int blueDestroyedBlocks;
- private static int redDestroyedBlocks;
-
- private static final int schematicSize = Math.abs(Config.SchemsizeX * Config.SchemsizeY * Config.SchemsizeZ);
+ private final Map teamMap = new HashMap<>();
public WinconditionPercentSystem() {
- super(Config.PercentSystem, EnumSet.of(FightState.RUNNING));
+ super("Percent", "§cTeam ", " §chat den Gegnern");
+ teamMap.put(Fight.getBlueTeam(), new TeamPercent(Fight.getBlueTeam()));
+ teamMap.put(Fight.getRedTeam(), new TeamPercent(Fight.getRedTeam()));
+
+ new StateDependentListener(Winconditions.PERCENT_SYSTEM, FightState.Running, this);
+ if(Config.ActiveWinconditions.contains(Winconditions.PERCENT_SYSTEM)){
+ printableWinconditions.add(this);
+ percentWincondition = this;
+ }
}
@EventHandler
public void handleEntityExplode(EntityExplodeEvent event) {
- Entity entity = event.getEntity();
+ teamMap.values().forEach(teamPercent -> teamPercent.check(event));
+ }
- //Team Blue
- if(Region.isInRange(entity.getLocation(), Config.TeamBlueCornerX, Config.TeamBlueCornerY, Config.TeamBlueCornerZ, Config.SchemsizeX, Config.SchemsizeY, Config.SchemsizeZ, Config.BorderFromSchematic)){
- blueDestroyedBlocks = blueDestroyedBlocks + event.blockList().size();
- double doubleBlueDestroyedBlocks = blueDestroyedBlocks;
- double destroyPercent = doubleBlueDestroyedBlocks * 100 / schematicSize;
- bluePercent = destroyPercent;
- if(destroyPercent >= Config.PercentWin) {
- FightSystem.setSpectateState(Fight.redTeam, "Percent");
+ @Override
+ public String getDisplay(FightTeam team) {
+ return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
+ }
+
+ @Override
+ public double getPercent(FightTeam team) {
+ return teamMap.get(team).percent;
+ }
+
+ private class TeamPercent {
+
+ private final FightTeam team;
+ private final int volume;
+ private double percent;
+ private int destroyedBlocks;
+
+ private TeamPercent(FightTeam team) {
+ this.team = team;
+ this.volume = team.getSchemRegion().volume();
+ }
+
+ private void check(EntityExplodeEvent event) {
+ if(!team.getExtendRegion().inRegion(event.getEntity().getLocation())){
+ return;
}
- //Team Red
- }else if(Region.isInRange(entity.getLocation(), Config.TeamRedCornerX, Config.TeamRedCornerY, Config.TeamRedCornerZ, Config.SchemsizeX, Config.SchemsizeY, Config.SchemsizeZ, Config.BorderFromSchematic)) {
- redDestroyedBlocks = redDestroyedBlocks + event.blockList().size();
- double doubleRedDestroyedBlocks = redDestroyedBlocks;
- double destroyPercent = doubleRedDestroyedBlocks * 100 / schematicSize;
- redPercent = destroyPercent;
- if(destroyPercent >= Config.PercentWin) {
- FightSystem.setSpectateState(Fight.blueTeam, "Percent");
+
+ destroyedBlocks += event.blockList().size();
+ percent = (double)destroyedBlocks * 100 / volume;
+ if(percent >= Config.PercentWin) {
+ win(Fight.getOpposite(team));
}
}
}
-
- public static double getBluePercent() {
- return bluePercent;
- }
-
- public static double getRedPercent() {
- return redPercent;
- }
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentTimeout.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentTimeout.java
new file mode 100644
index 0000000..d98f79d
--- /dev/null
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPercentTimeout.java
@@ -0,0 +1,46 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+package de.steamwar.fightsystem.winconditions;
+
+import de.steamwar.fightsystem.countdown.TimeOverCountdown;
+import de.steamwar.fightsystem.fight.Fight;
+import de.steamwar.fightsystem.fight.FightTeam;
+import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
+
+public class WinconditionPercentTimeout extends Wincondition {
+
+ public WinconditionPercentTimeout() {
+ super("PercentTimeout", "§cDie Zeit ist abgelaufen, und Team ", " §chatte weniger Schaden erlitten!", "§cDie Zeit ist abgelaufen, und beide Teams hatten gleichen Schaden!");
+ timeOverCountdown = new StateDependentCountdown(Winconditions.PERCENT_TIMEOUT, FightState.Running, new TimeOverCountdown(this::timeOver));
+ }
+
+ protected void timeOver() {
+ double bluePercent = Wincondition.percentWincondition.getPercent(Fight.getBlueTeam());
+ double redPercent = Wincondition.percentWincondition.getPercent(Fight.getRedTeam());
+
+ FightTeam team = null;
+ if(bluePercent > redPercent)
+ team = Fight.getRedTeam();
+ else if(bluePercent < redPercent)
+ team = Fight.getBlueTeam();
+ win(team);
+ }
+}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java
index 6292b2e..46caf0e 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPoints.java
@@ -25,51 +25,60 @@ import de.steamwar.fightsystem.countdown.TimeOverCountdown;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependent;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
+import de.steamwar.fightsystem.states.StateDependentListener;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerQuitEvent;
-public class WinconditionPoints extends PlayerWincondition {
+import java.util.HashMap;
+import java.util.Map;
- private static TeamPoints blue;
- private static TeamPoints red;
- private TimeOverCountdown countdown;
+public class WinconditionPoints extends Wincondition implements PrintableWincondition, Listener {
+
+ private final Map teamMap = new HashMap<>();
public WinconditionPoints(){
- super(Config.Points);
- }
+ super("Points", "§cDas Team ", " §chat mehr Punkte!", "§cBeide Teams haben gleich viele Punkte!");
- public static TeamPoints getRed(){
- return red;
- }
+ teamMap.put(Fight.getBlueTeam(), new TeamPoints(Fight.getBlueTeam()));
+ teamMap.put(Fight.getRedTeam(), new TeamPoints(Fight.getRedTeam()));
- public static TeamPoints getBlue(){
- return blue;
- }
+ new StateDependentListener(Winconditions.POINTS, FightState.Ingame, this);
+ timeOverCountdown = new StateDependentCountdown(Winconditions.POINTS, FightState.Running, new TimeOverCountdown(this::timeOver));
+ new StateDependent(Winconditions.POINTS, FightState.Ingame){
+ @Override
+ public void enable() {
+ teamMap.values().forEach(TeamPoints::enable);
+ }
- @Override
- public void enable() {
- super.enable();
- blue = new TeamPoints(Fight.getRedTeam(), WinconditionRelativePercent.getBlue(), WinconditionRelativePercent.getRed());
- red = new TeamPoints(Fight.getBlueTeam(), WinconditionRelativePercent.getRed(), WinconditionRelativePercent.getBlue());
- }
-
- @Override
- public void disable() {
- super.disable();
- if(countdown != null)
- countdown.disable();
- }
-
- @Override
- public void stateChange(FightState state){
- if(state == FightState.RUNNING){
- countdown = new TimeOverCountdown(this::fightEnds);
+ @Override
+ public void disable() {
+ teamMap.values().forEach(TeamPoints::disable);
+ }
+ }.register();
+ if(Config.ActiveWinconditions.contains(Winconditions.POINTS)){
+ printableWinconditions.add(this);
}
}
+ protected void timeOver() {
+ int redPoints = teamMap.get(Fight.getRedTeam()).getPoints();
+ int bluePoints = teamMap.get(Fight.getBlueTeam()).getPoints();
+
+ FightTeam team = null;
+ if(redPoints > bluePoints)
+ team = Fight.getRedTeam();
+ else if(redPoints < bluePoints)
+ team = Fight.getBlueTeam();
+
+ win(team);
+ }
+
@EventHandler
public void handlePlayerDeath(PlayerDeathEvent event) {
handleDeath(event.getEntity().getPlayer(), " §cist gestorben!");
@@ -81,73 +90,69 @@ public class WinconditionPoints extends PlayerWincondition {
}
private void handleDeath(Player player, String message){
- if(!isTarget(player))
+ FightTeam team = isTarget(player);
+ if(team == null)
return;
- FightTeam fightTeam = Fight.getPlayerTeam(player);
- TeamPoints enemy = getEnemyByTeam(fightTeam);
- assert fightTeam != null; // Checked by isTarget
- if(fightTeam.isPlayerLeader(player)) {
+ TeamPoints enemy = teamMap.get(Fight.getOpposite(team));
+ if(team.isPlayerLeader(player)) {
enemy.points += 500;
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Leader von " + fightTeam.getPrefix() + fightTeam.getColoredName() + message);
- fightEnds();
- }else if(fightTeam.getPlayers().size() <= 5)
+ Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Leader von " + team.getColoredName() + message);
+ timeOver();
+ }else if(team.getPlayers().size() <= 5)
enemy.points += 300;
else
enemy.points += 200;
}
- private void fightEnds(){
- if(red.getPoints() > blue.getPoints())
- FightSystem.setSpectateState(blue.enemy, "Points");
- else if(red.getPoints() < blue.getPoints())
- FightSystem.setSpectateState(red.enemy, "Points");
- else
- FightSystem.setSpectateState(null, "Points");
+ @Override
+ public String getDisplay(FightTeam team) {
+ return team.getPrefix() + "Punkte: " + teamMap.get(team).getPoints();
}
- private TeamPoints getEnemyByTeam(FightTeam team){
- if(team == blue.enemy)
- return blue;
- else
- return red;
- }
+ private class TeamPoints {
+ private static final int MAX_POINTS = 2000;
+
+ private final FightTeam team;
+ private final WinconditionRelativePercent.TeamPercent percent;
- public static class TeamPoints {
- private final FightTeam enemy;
- private final WinconditionRelativePercent.TeamPercent enemyPercent;
private double factor;
- private static final int maxPoints = 2000;
-
private int points;
- TeamPoints(FightTeam enemy, WinconditionRelativePercent.TeamPercent ownPercent, WinconditionRelativePercent.TeamPercent enemyPercent){
- this.enemy = enemy;
- this.enemyPercent = enemyPercent;
- points = 0;
+ TeamPoints(FightTeam team){
+ this.team = team;
+ this.percent = new WinconditionRelativePercent.TeamPercent(team);
+ this.points = 0;
+ }
- //Prevent NPE
- Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () ->{
- if(enemyPercent.getBlockCount() < ownPercent.getBlockCount())
- this.factor = 10000; //Original mit 20 (20% = 0.2 ergeben 2000 Punkte
- else{
- double f = 10000.0 * ownPercent.getBlockCount() / enemyPercent.getBlockCount();
+ public void enable() {
+ percent.enable();
+ int ownBlocks = percent.getBlockCount();
+ int enemyBlocks = teamMap.get(Fight.getOpposite(team)).percent.getBlockCount();
- if(f > 10000)
- f = 10000;
- else if(f < 4000)
- f = 4000;
+ if(enemyBlocks < ownBlocks) {
+ this.factor = 10000; //Original mit 20 (20% = 0.2 ergeben 2000 Punkte
+ } else {
+ double f = 10000.0 * ownBlocks / enemyBlocks;
- this.factor = f;
- }
- });
+ if(f > 10000)
+ f = 10000;
+ else if(f < 4000)
+ f = 4000;
+
+ this.factor = f;
+ }
+ }
+
+ public void disable(){
+ percent.disable();
}
public int getPoints(){
- int damagePoints = (int)(enemyPercent.getPercent() * factor);
- if(damagePoints > maxPoints)
- damagePoints = maxPoints;
+ int damagePoints = (int)(teamMap.get(Fight.getOpposite(team)).percent.getPercent() * factor);
+ if(damagePoints > MAX_POINTS)
+ damagePoints = MAX_POINTS;
return points + damagePoints;
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java
index 6194b94..187502d 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionPumpkinTechKO.java
@@ -20,87 +20,64 @@
package de.steamwar.fightsystem.winconditions;
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.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentTask;
import de.steamwar.inventory.SWItem;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.World;
-import org.bukkit.scheduler.BukkitTask;
-import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
-public class WinconditionPumpkinTechKO extends Wincondition {
+public class WinconditionPumpkinTechKO extends Wincondition implements PrintableWincondition {
- private static int teamRedPumpkins = -1;
- private static int teamBluePumpkins = -1;
- private static final World WORLD = Bukkit.getWorlds().get(0);
+ private static final World world = Bukkit.getWorlds().get(0);
private static final Material PUMPKIN_LANTERN = SWItem.getMaterial("JACK_O_LANTERN");
- private BukkitTask task;
- private static boolean running = false;
+
+ private final Map teamMap = new HashMap<>();
public WinconditionPumpkinTechKO(){
- super(Config.PumpkinTechKO, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING));
- }
+ super("PumpkinTechKO", "§cDas Team ", " §cist Tech K.O.!");
+ teamMap.put(Fight.getRedTeam(), new TeamPumpkin(Fight.getRedTeam()));
+ teamMap.put(Fight.getBlueTeam(), new TeamPumpkin(Fight.getBlueTeam()));
- public static int getTeamBluePumpkins() {
- return teamBluePumpkins;
- }
- public static int getTeamRedPumpkins() {
- return teamRedPumpkins;
- }
-
- @Override
- public void enable() {
- task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), WinconditionPumpkinTechKO::recursiveCheck, 0, 200);
- }
-
- @Override
- public void disable() {
- task.cancel();
- }
-
- private static void recursiveCheck(){
- if(running)
- return;
- running = true;
- teamRedPumpkins = getPumpkins(Config.TeamRedCornerX,
- Config.TeamRedCornerY,
- Config.TeamRedCornerZ,
- Config.TeamRedCornerX + Config.SchemsizeX,
- Config.TeamRedCornerY + Config.SchemsizeY,
- Config.TeamRedCornerZ + Config.SchemsizeZ);
- teamBluePumpkins = getPumpkins(Config.TeamBlueCornerX,
- Config.TeamBlueCornerY,
- Config.TeamBlueCornerZ,
- Config.TeamBlueCornerX + Config.SchemsizeX,
- Config.TeamBlueCornerY + Config.SchemsizeY,
- Config.TeamBlueCornerZ + Config.SchemsizeZ);
-
- checkKO(Fight.getRedTeam(), teamRedPumpkins);
- checkKO(Fight.getBlueTeam(), teamBluePumpkins);
- running = false;
- }
-
- private static int getPumpkins(int minX, int minY, int minZ, int maxX, int maxY, int maxZ){
- int pumpkins = 0;
- for(int x = minX; x <= maxX; x++) {
- for(int y = minY; y <= maxY; y++) {
- for (int z = minZ; z <= maxZ; z++) {
- if (WORLD.getBlockAt(x, y, z).getType() == PUMPKIN_LANTERN)
- pumpkins++;
- }
- }
+ new StateDependentTask(Winconditions.PUMPKIN_TECH_KO, FightState.Ingame, this::check, 0, 200);
+ if(Config.ActiveWinconditions.contains(Winconditions.PUMPKIN_TECH_KO)){
+ printableWinconditions.add(this);
}
- return pumpkins;
}
- private static void checkKO(FightTeam team, int pumpkins){
- if(pumpkins == 0){
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§eDas Team " + team.getColoredName() + " §eist Tech K.O.!");
- Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> FightSystem.setSpectateState(Fight.getOpposite(team), "PumpkinTechKO"));
+ private void check(){
+ teamMap.values().forEach(TeamPumpkin::check);
+ }
+
+ @Override
+ public String getDisplay(FightTeam team) {
+ return team.getPrefix() + "Kanonen: " + teamMap.get(team).pumpkins;
+ }
+
+ private class TeamPumpkin {
+ private final FightTeam team;
+
+ private int pumpkins;
+
+ private TeamPumpkin (FightTeam team) {
+ this.team = team;
+ }
+
+ private void check(){
+ pumpkins = 0;
+ team.getSchemRegion().forEach((x, y, z) -> {
+ if (world.getBlockAt(x, y, z).getType() == PUMPKIN_LANTERN)
+ pumpkins++;
+ });
+
+ if(pumpkins == 0) {
+ win(Fight.getOpposite(team));
+ }
}
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java
index 0f30223..ba8c35b 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionRelativePercent.java
@@ -24,21 +24,18 @@ import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependent;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.scheduler.BukkitTask;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
-public class WinconditionRelativePercent extends Wincondition{
+public class WinconditionRelativePercent extends Wincondition implements PrintableWincondition, PercentWincondition {
+ private static final World world = Bukkit.getWorlds().get(0);
private static final Set ignoredBlocks;
- private static TeamPercent blue = null;
- private static TeamPercent red = null;
static{
Set ignored = new HashSet<>();
@@ -47,95 +44,93 @@ public class WinconditionRelativePercent extends Wincondition{
ignoredBlocks = Collections.unmodifiableSet(ignored);
}
+ private final Map teamMap = new HashMap<>();
+
public WinconditionRelativePercent(){
- super(Config.RelativePercent || Config.Points, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING));
- }
+ super("RelativePercent", null);
+ teamMap.put(Fight.getBlueTeam(), new TeamPercent(Fight.getBlueTeam()));
+ teamMap.put(Fight.getRedTeam(), new TeamPercent(Fight.getRedTeam()));
+ new StateDependent(Winconditions.RELATIVE_PERCENT, FightState.Running){
+ @Override
+ public void enable() {
+ teamMap.values().forEach(TeamPercent::enable);
+ }
- public static TeamPercent getBlue(){
- if(blue == null)
- blue = new TeamPercent(Fight.getBlueTeam());
- return blue;
- }
-
- public static TeamPercent getRed(){
- if(red == null)
- red = new TeamPercent(Fight.getRedTeam());
- return red;
+ @Override
+ public void disable() {
+ teamMap.values().forEach(TeamPercent::disable);
+ }
+ }.register();
+ if(Config.ActiveWinconditions.contains(Winconditions.RELATIVE_PERCENT)){
+ printableWinconditions.add(this);
+ percentWincondition = this;
+ }
}
@Override
- public void enable() {
- getBlue();
- getRed();
+ public double getPercent(FightTeam team) {
+ return teamMap.get(team).getPercent();
}
@Override
- public void disable() {
- blue.task.cancel();
- red.task.cancel();
+ public String getDisplay(FightTeam team) {
+ return team.getPrefix() + "Schaden: " + (Math.round(100.0 * getPercent(team)) / 100.0) + "%";
}
public static class TeamPercent {
- private static final World world = Bukkit.getWorlds().get(0);
private final FightTeam team;
- private final int blockCount;
- private final BukkitTask task;
- private boolean running = false;
+ private int blockCount;
+ private BukkitTask task;
private int currentBlocks;
- private TeamPercent(FightTeam team){
+ public TeamPercent(FightTeam team){
this.team = team;
- this.blockCount = currentBlocks();
- this.currentBlocks = blockCount;
-
- task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), () -> {
- if(running)
- return;
- running = true;
- currentBlocks = currentBlocks();
- checkPercentDefeat();
- running = false;
- }, 400, 400);
+ this.currentBlocks = 1;
}
- public double getPrintablePercent(){
- return Math.round(10000.0 * getPercent()) / 100.0;
+ public void enable(){
+ blockCount = currentBlocks();
+ task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::check, 400, 400);
}
- final int getBlockCount(){
+ public void disable(){
+ task.cancel();
+ }
+
+ private void check(){
+ currentBlocks();
+
+ if(!Config.ActiveWinconditions.contains(Winconditions.RELATIVE_PERCENT))
+ return;
+
+ if(getPercent() >= Config.PercentWin){
+ Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Schiff von " + team.getColoredName() + " §cwurde zu stark beschädigt!");
+ FightSystem.setSpectateState(Fight.getOpposite(team), "RelativePercent");
+ }
+ }
+
+ public double getPercent(){
+ if(currentBlocks > blockCount)
+ return 0;
+ return (blockCount - currentBlocks) * 100 / (double) blockCount;
+ }
+
+ public int getBlockCount(){
return blockCount;
}
- double getPercent(){
- int blocksDestroyed = blockCount - currentBlocks;
- return blocksDestroyed > 0 ? blocksDestroyed / (double) blockCount : 0;
- }
-
private int currentBlocks(){
// Entern active
- if(!Config.EnterStages.isEmpty() && Config.EnterStages.get(0) >= FightSystem.getFightTime())
+ if(!Config.EnterStages.isEmpty() && Config.EnterStages.get(0) >= Config.TimeoutTime - Wincondition.getTimeOverCountdown().getTimeLeft())
return currentBlocks;
- int blocks = 0;
- for(int x = team.getCornerX(); x < team.getCornerX() + Config.SchemsizeX; x++){
- for(int y = team.getCornerY(); y < team.getCornerY() + Config.SchemsizeY; y++){
- for(int z = team.getCornerZ(); z < team.getCornerZ() + Config.SchemsizeZ; z++){
- if(!ignoredBlocks.contains(world.getBlockAt(x,y,z).getType()))
- blocks++;
- }
- }
- }
- return blocks;
- }
-
- private void checkPercentDefeat(){
- if(!Config.RelativePercent)
- return;
- if(getPercent() * 100 >= Config.PercentWin){
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§cDer Schiff von " + team.getColoredName() + " §cwurde zu stark beschädigt!");
- Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> FightSystem.setSpectateState(Fight.getOpposite(team), "RelativePercent"));
- }
+ currentBlocks = 0;
+ team.getSchemRegion().forEach((x, y, z) -> {
+ if(!ignoredBlocks.contains(world.getBlockAt(x,y,z).getType()))
+ currentBlocks++;
+ });
+ return currentBlocks;
}
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java
similarity index 67%
rename from FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java
rename to FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java
index 1652e2d..c03bf25 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTechKO.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeTechKO.java
@@ -20,19 +20,17 @@
package de.steamwar.fightsystem.winconditions;
import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
-import de.steamwar.fightsystem.countdown.TechKOCountdown;
+import de.steamwar.fightsystem.countdown.Countdown;
+import de.steamwar.fightsystem.countdown.SWSound;
import de.steamwar.fightsystem.fight.Fight;
import de.steamwar.fightsystem.fight.FightTeam;
import de.steamwar.fightsystem.states.FightState;
+import de.steamwar.fightsystem.states.StateDependentTask;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.TNTPrimed;
-import org.bukkit.scheduler.BukkitTask;
-import java.util.EnumSet;
-
-public class WinconditionTechKO extends ListenerWincondition {
+public class WinconditionTimeTechKO extends Wincondition {
private static final int TECH_KO_TIME_IN_S = 90;
private static final int TECH_KO_HALF_TIME = TECH_KO_TIME_IN_S*10;
@@ -46,41 +44,35 @@ public class WinconditionTechKO extends ListenerWincondition {
private int biggerZtime = TECH_KO_HALF_TIME;
private TechKOCountdown smallerZcountdown = null;
private TechKOCountdown biggerZcountdown = null;
- private BukkitTask task;
/**
* Works only for z-Axis fight direction for performance reasons
*/
- public WinconditionTechKO(){
- super(Config.TechKO, EnumSet.of(FightState.RUNNING));
+ 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{
smallerZteam = Fight.getRedTeam();
biggerZteam = Fight.getBlueTeam();
}
- }
- @Override
- public void enable() {
- super.enable();
- task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::run, 1, 1);
- }
-
- @Override
- public void disable() {
- super.disable();
- if(smallerZcountdown != null){
- smallerZcountdown.disable();
- smallerZcountdown = null;
- }
- if(biggerZcountdown != null){
- biggerZcountdown.disable();
- biggerZcountdown = null;
- }
- task.cancel();
+ new StateDependentTask(Winconditions.TIME_TECH_KO, FightState.Running, this::run, 1, 1){
+ @Override
+ public void disable() {
+ super.disable();
+ if(smallerZcountdown != null){
+ smallerZcountdown.disable();
+ smallerZcountdown = null;
+ }
+ if(biggerZcountdown != null){
+ biggerZcountdown.disable();
+ biggerZcountdown = null;
+ }
+ }
+ };
}
private void run(){
@@ -111,4 +103,24 @@ public class WinconditionTechKO extends ListenerWincondition {
smallerZtime--;
biggerZtime--;
}
+
+ private class TechKOCountdown extends Countdown {
+ private final FightTeam team;
+
+ public TechKOCountdown(FightTeam team, int countdownTime) {
+ super(countdownTime, SWSound.BLOCK_NOTE_PLING, false);
+ this.team = team;
+ super.enable();
+ }
+
+ @Override
+ public final String countdownCounting() {
+ return "bis " + team.getColoredName() + " §feinen Schuss abgegeben haben muss!";
+ }
+
+ @Override
+ public void countdownFinished() {
+ win(Fight.getOpposite(team));
+ }
+ }
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java
index 9143d22..93f9cdb 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionTimeout.java
@@ -19,28 +19,18 @@
package de.steamwar.fightsystem.winconditions;
-import de.steamwar.fightsystem.Config;
-import de.steamwar.fightsystem.FightSystem;
import de.steamwar.fightsystem.countdown.TimeOverCountdown;
import de.steamwar.fightsystem.states.FightState;
-
-import java.util.EnumSet;
+import de.steamwar.fightsystem.states.StateDependentCountdown;
public class WinconditionTimeout extends Wincondition {
- private TimeOverCountdown countdown;
-
public WinconditionTimeout() {
- super(Config.Timeout, EnumSet.of(FightState.RUNNING));
+ super("Timeout", "§cDie Zeit ist abgelaufen!");
+ timeOverCountdown = new StateDependentCountdown(Winconditions.TIMEOUT, FightState.Running, new TimeOverCountdown(this::timeOver));
}
- @Override
- public void enable() {
- countdown = new TimeOverCountdown(() -> FightSystem.setSpectateState(null, "Timeout"));
- }
-
- @Override
- public void disable() {
- countdown.disable();
+ protected void timeOver() {
+ win(null);
}
}
diff --git a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java
index d7c3e3c..a95ebb5 100644
--- a/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java
+++ b/FightSystem_Main/src/de/steamwar/fightsystem/winconditions/WinconditionWaterTechKO.java
@@ -20,90 +20,61 @@
package de.steamwar.fightsystem.winconditions;
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.listener.WaterRemover;
import de.steamwar.fightsystem.states.FightState;
-import de.steamwar.fightsystem.utils.WaterRemover;
+import de.steamwar.fightsystem.states.StateDependentTask;
import org.bukkit.Bukkit;
import org.bukkit.World;
-import org.bukkit.scheduler.BukkitTask;
-import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
-public class WinconditionWaterTechKO extends Wincondition {
+public class WinconditionWaterTechKO extends Wincondition implements PrintableWincondition {
- private static int teamRedWater;
- private static int teamBlueWater;
private static final World WORLD = Bukkit.getWorlds().get(0);
- private BukkitTask task;
- private boolean running = false;
+ private final Map teamMap = new HashMap<>();
public WinconditionWaterTechKO() {
- super(Config.WaterTechKO, EnumSet.of(FightState.PRE_RUNNING, FightState.RUNNING));
- }
+ super("WaterTechKO", "§cDas Team ", " §cwurde Tech K.O. gesetzt!");
+ teamMap.put(Fight.getBlueTeam(), new TeamWater(Fight.getBlueTeam()));
+ teamMap.put(Fight.getRedTeam(), new TeamWater(Fight.getRedTeam()));
- public static int getTeamBlueWater() {
- return teamBlueWater;
- }
-
- public static int getTeamRedWater() {
- return teamRedWater;
- }
-
- @Override
- public void enable() {
- checkTask();
- task = Bukkit.getScheduler().runTaskTimerAsynchronously(FightSystem.getPlugin(), this::checkTask, 200, 200);
- }
-
- @Override
- public void disable() {
- task.cancel();
- }
-
- private void checkEmpty(FightTeam team, int teamWater){
- if(teamWater == 0){
- Bukkit.broadcastMessage(FightSystem.PREFIX + "§eDas Team " + team.getColoredName() + " §eist Tech K.O.!");
- Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> FightSystem.setSpectateState(Fight.getOpposite(team), "WaterTechKO"));
+ new StateDependentTask(Winconditions.WATER_TECH_KO, FightState.Ingame, this::check, 200, 200);
+ if(Config.ActiveWinconditions.contains(Winconditions.WATER_TECH_KO)){
+ printableWinconditions.add(this);
}
}
- private void checkTask() {
- if(running)
- return;
- running = true;
- teamRedWater = calcWater(
- Config.TeamRedCornerX,
- Config.TeamRedCornerY,
- Config.TeamRedCornerZ,
- Config.TeamRedCornerX + Config.SchemsizeX,
- Config.TeamRedCornerY + Config.SchemsizeY,
- Config.TeamRedCornerZ + Config.SchemsizeZ);
- teamBlueWater = calcWater(
- Config.TeamBlueCornerX,
- Config.TeamBlueCornerY,
- Config.TeamBlueCornerZ,
- Config.TeamBlueCornerX + Config.SchemsizeX,
- Config.TeamBlueCornerY + Config.SchemsizeY,
- Config.TeamBlueCornerZ + Config.SchemsizeZ);
-
- checkEmpty(Fight.getRedTeam(), teamRedWater);
- checkEmpty(Fight.getBlueTeam(), teamBlueWater);
- running = false;
+ private void check() {
+ teamMap.values().forEach(TeamWater::check);
}
- private int calcWater(int minX, int minY, int minZ, int maxX, int maxY, int maxZ){
- int teamWater = 0;
- for(int x = minX; x <= maxX; x++) {
- for(int y = minY; y <= maxY; y++) {
- for (int z = minZ; z <= maxZ; z++) {
- if (WaterRemover.isWater(WORLD.getBlockAt(x, y, z)))
- teamWater++;
- }
+ @Override
+ public String getDisplay(FightTeam team) {
+ return team.getPrefix() + "Wasser: " + teamMap.get(team).water;
+ }
+
+ private class TeamWater {
+ private final FightTeam team;
+ private int water;
+
+ private TeamWater(FightTeam team) {
+ this.team = team;
+ }
+
+ private void check() {
+ water = 0;
+ team.getExtendRegion().forEach((x, y, z) -> {
+ if (WaterRemover.isWater(WORLD.getBlockAt(x, y, z)))
+ water++;
+ });
+
+ if(water == 0){
+ win(Fight.getOpposite(team));
}
}
- return teamWater;
}
}
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