From 84f0ccee8175a12c4f9fa86866b085925e43d6af Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 22 Feb 2022 20:00:22 +0100 Subject: [PATCH 1/4] Fix 1.8/older versions Signed-off-by: Lixfel --- .../de/steamwar/fightsystem/fight/Fight.java | 3 +-- .../steamwar/fightsystem/record/REntity.java | 20 +++++++++---------- .../fightsystem/utils/ProtocolAPI.java | 12 ++--------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java index 80e3cfa..431cbc6 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java @@ -27,7 +27,6 @@ import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.record.GlobalRecorder; -import de.steamwar.fightsystem.utils.ProtocolAPI; import de.steamwar.fightsystem.utils.ProtocolWrapper; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -150,7 +149,7 @@ public class Fight { } public static Object playerInfoPacket(Object action, GameProfile profile, Object mode) { - Object packet = ProtocolAPI.construct(playerInfoPacket); + Object packet = Reflection.newInstance(playerInfoPacket); playerInfoAction.set(packet, action); playerInfoData.set(packet, Collections.singletonList(ProtocolWrapper.impl.playerInfoDataConstructor(packet, profile, mode))); return packet; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/REntity.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/REntity.java index 3da799d..ceed2f1 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/REntity.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/REntity.java @@ -177,7 +177,7 @@ public class REntity { private static final Reflection.FieldAccessor animationEntity = Reflection.getField(animationPacket, int.class, 0); private static final Reflection.FieldAccessor animationAnimation = Reflection.getField(animationPacket, int.class, 1); public void animation(byte animation) { - Object packet = ProtocolAPI.construct(animationPacket); + Object packet = Reflection.newInstance(animationPacket); animationEntity.set(packet, entityId); animationAnimation.set(packet, (int) animation); ProtocolAPI.broadcastPacket(packet); @@ -189,7 +189,7 @@ public class REntity { private static final Reflection.FieldAccessor velocityY = Reflection.getField(velocityPacket, int.class, 2); private static final Reflection.FieldAccessor velocityZ = Reflection.getField(velocityPacket, int.class, 3); public void setVelocity(double dX, double dY, double dZ) { - Object packet = ProtocolAPI.construct(velocityPacket); + Object packet = Reflection.newInstance(velocityPacket); velocityEntity.set(packet, entityId); velocityX.set(packet, calcVelocity(dX)); velocityY.set(packet, calcVelocity(dY)); @@ -201,7 +201,7 @@ public class REntity { private static final Reflection.FieldAccessor statusEntity = Reflection.getField(statusPacket, int.class, 0); private static final Reflection.FieldAccessor statusStatus = Reflection.getField(statusPacket, byte.class, 0); public void damage() { - Object packet = ProtocolAPI.construct(statusPacket); + Object packet = Reflection.newInstance(statusPacket); statusEntity.set(packet, entityId); statusStatus.set(packet, (byte) 2); ProtocolAPI.broadcastPacket(packet); @@ -259,7 +259,7 @@ public class REntity { team.removeEntry(name); } - Object packet = ProtocolAPI.construct(destroyPacket); + Object packet = Reflection.newInstance(destroyPacket); destroyEntities.set(packet, Core.getVersion() > 15 ? new IntArrayList(new int[]{entityId}) : new int[]{entityId}); ProtocolAPI.broadcastPacket(packet); } @@ -272,7 +272,7 @@ public class REntity { private static final Reflection.FieldAccessor metadataEntity = Reflection.getField(metadataPacket, int.class, 0); private static final Reflection.FieldAccessor metadataMetadata = Reflection.getField(metadataPacket, List.class, 0); private Object getDataWatcherPacket(Object dataWatcherObject, Object value) { - Object packet = ProtocolAPI.construct(metadataPacket); + Object packet = Reflection.newInstance(metadataPacket); metadataEntity.set(packet, entityId); metadataMetadata.set(packet, Collections.singletonList(BountifulWrapper.impl.getDataWatcherItem(dataWatcherObject, value))); return packet; @@ -283,7 +283,7 @@ public class REntity { private static final Reflection.FieldAccessor teleportYaw = Reflection.getField(teleportPacket, byte.class, 0); private static final Reflection.FieldAccessor teleportPitch = Reflection.getField(teleportPacket, byte.class, 1); private Object getTeleportPacket(){ - Object packet = ProtocolAPI.construct(teleportPacket); + Object packet = Reflection.newInstance(teleportPacket); teleportEntity.set(packet, entityId); BountifulWrapper.impl.setTeleportPacketPosition(packet, locX, locY, locZ); teleportYaw.set(packet, yaw); @@ -295,7 +295,7 @@ public class REntity { private static final Reflection.FieldAccessor headRotationEntity = Reflection.getField(headRotationPacket, int.class, 0); private static final Reflection.FieldAccessor headRotationYaw = Reflection.getField(headRotationPacket, byte.class, 0); private Object getHeadRotationPacket(){ - Object packet = ProtocolAPI.construct(headRotationPacket); + Object packet = Reflection.newInstance(headRotationPacket); headRotationEntity.set(packet, entityId); headRotationYaw.set(packet, headYaw); return packet; @@ -304,7 +304,7 @@ public class REntity { public static final Class spawnPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutSpawnEntity"); private static final Reflection.FieldAccessor spawnEntity = Reflection.getField(spawnPacket, int.class, 0); private Object getSpawnEntityPacket(){ - Object packet = ProtocolAPI.construct(spawnPacket); + Object packet = Reflection.newInstance(spawnPacket); spawnEntity.set(packet, entityId); BountifulWrapper.impl.setSpawnPacketUUID(packet, uuid); ProtocolWrapper.impl.setSpawnPacketType(packet, entityType); @@ -318,7 +318,7 @@ public class REntity { private static final Class craftItemStack = Reflection.getClass("{obc}.inventory.CraftItemStack"); private static final Reflection.MethodInvoker asNMSCopy = Reflection.getTypedMethod(REntity.craftItemStack, "asNMSCopy", REntity.itemStack, ItemStack.class); private Object getEquipmentPacket(String slot, ItemStack stack){ - Object packet = ProtocolAPI.construct(equipmentPacket); + Object packet = Reflection.newInstance(equipmentPacket); equipmentEntity.set(packet, entityId); ProtocolWrapper.impl.setEquipmentPacketStack(packet, slot, asNMSCopy.invoke(null, stack)); return packet; @@ -332,7 +332,7 @@ public class REntity { private static final Reflection.FieldAccessor namedSpawnEntity = Reflection.getField(namedSpawnPacket, int.class, 0); private static final Reflection.FieldAccessor namedSpawnUUID = Reflection.getField(namedSpawnPacket, UUID.class, 0); private Object getNamedSpawnPacket(){ - Object packet = ProtocolAPI.construct(namedSpawnPacket); + Object packet = Reflection.newInstance(namedSpawnPacket); namedSpawnEntity.set(packet, entityId); namedSpawnUUID.set(packet, uuid); FlatteningWrapper.impl.setNamedSpawnPacketDataWatcher(packet); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/ProtocolAPI.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/ProtocolAPI.java index 31a6788..a66f932 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/ProtocolAPI.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/ProtocolAPI.java @@ -19,8 +19,8 @@ package de.steamwar.fightsystem.utils; +import com.comphenix.tinyprotocol.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; -import jdk.internal.misc.Unsafe; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -88,19 +88,11 @@ public class ProtocolAPI { }; } - public static T construct(Class clazz) { - try { - return (T) Unsafe.getUnsafe().allocateInstance(clazz); - } catch (InstantiationException e) { - throw new IllegalStateException(e); - } - } - public static UnaryOperator shallowCloneGenerator(Class clazz) { BiConsumer filler = shallowFill(clazz); return source -> { - Object clone = construct(clazz); + Object clone = Reflection.newInstance(clazz); filler.accept(source, clone); return clone; }; From 534b16b153c5b93ce72ad1a1955dc277300643cf Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 24 Feb 2022 22:44:03 +0100 Subject: [PATCH 2/4] Additional debug infos Signed-off-by: Lixfel --- .../src/de/steamwar/fightsystem/record/PacketProcessor.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java index a4aad6b..a85c015 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java @@ -76,6 +76,7 @@ public class PacketProcessor { private int arenaMinZ = Config.ArenaRegion.getMinZ(); private boolean tickFinished = false; + private int lastPacket = -1; public PacketProcessor(PacketSource source){ this.source = source; @@ -507,15 +508,16 @@ public class PacketProcessor { if(parser != null){ parser.process(); }else{ - Bukkit.getLogger().log(Level.SEVERE, "Unknown packet " + packetType + " recieved, closing."); + Bukkit.getLogger().log(Level.SEVERE, "Unknown packet " + packetType + " recieved, closing. LastPacket: " + lastPacket); source.close(); } + lastPacket = packetType; } } catch (EOFException e) { Bukkit.getLogger().log(Level.INFO, "The FightServer is offline"); source.close(); } catch(Exception e) { - Bukkit.getLogger().log(Level.WARNING, "Could not recieve packet", e); + Bukkit.getLogger().log(Level.WARNING, "Could not recieve packet, LastPacket: " + lastPacket, e); source.close(); } From 53901654a9d4d6d298279c7a8067c695256e1f7f Mon Sep 17 00:00:00 2001 From: Lixfel Date: Fri, 25 Feb 2022 11:50:32 +0100 Subject: [PATCH 3/4] Fix double death error by rearranging death event sequence Signed-off-by: Lixfel --- .../fightsystem/utils/BountifulWrapper9.java | 2 +- .../fightsystem/listener/IngameDeath.java | 52 +++++++++---------- .../fightsystem/listener/Permanent.java | 8 ++- .../fightsystem/listener/Recording.java | 31 +++++------ .../fightsystem/listener/Shutdown.java | 3 +- 5 files changed, 48 insertions(+), 48 deletions(-) diff --git a/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java b/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java index 8e86735..20c7aa4 100644 --- a/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java +++ b/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java @@ -100,7 +100,7 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper { @Override public Listener newHandSwapRecorder() { return new Listener() { - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onItemSwap(PlayerSwapHandItemsEvent e){ if(Recording.isNotSent(e.getPlayer())) return; diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java index 822380e..75d80cf 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/IngameDeath.java @@ -20,15 +20,12 @@ 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.FightPlayer; -import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.StateDependentListener; import de.steamwar.fightsystem.utils.FightUI; import de.steamwar.fightsystem.utils.SWSound; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -36,41 +33,42 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerQuitEvent; +import java.util.function.Consumer; + public class IngameDeath implements Listener { public IngameDeath() { new StateDependentListener(ArenaMode.AntiReplay, 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; - - FightUI.addSubtitle("UI_PLAYER_DEATH", team.getPrefix(), player.getName()); - Fight.playSound(SWSound.ENTITY_WITHER_DEATH.getSound(), 100.0F, 1.0F); - Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> team.getFightPlayer(player).setOut()); + @EventHandler + public void broadcastDeath(PlayerDeathEvent event) { + onPlayerEnd(event.getEntity(), fightPlayer -> { + FightUI.addSubtitle("UI_PLAYER_DEATH", fightPlayer.getTeam().getPrefix(), fightPlayer.getPlayer().getName()); + Fight.playSound(SWSound.ENTITY_WITHER_DEATH.getSound(), 100.0F, 1.0F); + }); } - @EventHandler(priority = EventPriority.HIGH) + @EventHandler + public void broadcastQuit(PlayerQuitEvent event) { + onPlayerEnd(event.getPlayer(), fightPlayer -> FightUI.addSubtitle("UI_PLAYER_LEAVE", fightPlayer.getTeam().getPrefix(), fightPlayer.getPlayer().getName())); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void handlePlayerDeath(PlayerDeathEvent event) { + onPlayerEnd(event.getEntity(), FightPlayer::setOut); + } + + @EventHandler(priority = EventPriority.MONITOR) public void handlePlayerQuit(PlayerQuitEvent event) { - event.setQuitMessage(null); + onPlayerEnd(event.getPlayer(), FightPlayer::setOut); + } - Player player = event.getPlayer(); - FightTeam team = Fight.getPlayerTeam(player); - if(team == null) + private void onPlayerEnd(Player player, Consumer withLivingPlayer) { + FightPlayer fightPlayer = Fight.getFightPlayer(player); + if(fightPlayer == null || !fightPlayer.isLiving()) return; - FightPlayer fightPlayer = team.getFightPlayer(player); - if(!fightPlayer.isLiving()) - return; - - FightUI.addSubtitle("UI_PLAYER_LEAVE", team.getPrefix(), player.getName()); - Bukkit.getScheduler().runTask(FightSystem.getPlugin(), () -> team.getFightPlayer(player).setOut()); + withLivingPlayer.accept(fightPlayer); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java index 1b242a0..c411722 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java @@ -34,6 +34,7 @@ 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.PlayerDeathEvent; import org.bukkit.event.entity.SpawnerSpawnEvent; import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.inventory.FurnaceSmeltEvent; @@ -81,7 +82,12 @@ public class Permanent implements Listener { REntity.playerJoins(player); } - @EventHandler + @EventHandler(priority = EventPriority.MONITOR) + public void handlePlayerDeath(PlayerDeathEvent event) { + event.setDeathMessage(null); + } + + @EventHandler(priority = EventPriority.MONITOR) public void handlePlayerLeave(PlayerQuitEvent event) { event.setQuitMessage(null); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java index 0b158b6..6d961a4 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Recording.java @@ -133,7 +133,7 @@ public class Recording implements Listener { return packet; } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent e){ if(isNotSent(e.getPlayer())) return; @@ -141,15 +141,12 @@ public class Recording implements Listener { GlobalRecorder.getInstance().entityMoves(e.getPlayer()); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onPlayerDeath(PlayerDeathEvent e){ - if(isNotSent(e.getEntity())) - return; - + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e) { GlobalRecorder.getInstance().entityDespawns(e.getEntity()); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler public void onPlayerQuit(PlayerQuitEvent e){ if(isNotSent(e.getPlayer())) return; @@ -157,13 +154,13 @@ public class Recording implements Listener { GlobalRecorder.getInstance().entityDespawns(e.getPlayer()); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onBlockPhysics(BlockPhysicsEvent e){ if(FlatteningWrapper.impl.doRecord(e)) GlobalRecorder.getInstance().blockChange(e.getBlock()); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onSneak(PlayerToggleSneakEvent e){ if(isNotSent(e.getPlayer())) return; @@ -171,7 +168,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().playerSneak(e.getPlayer(), e.isSneaking()); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onAnimation(PlayerAnimationEvent e){ if(isNotSent(e.getPlayer())) return; @@ -180,7 +177,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().entityAnimation(e.getPlayer(), AIR); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityDamage(EntityDamageEvent e) { if(e.getEntityType() != EntityType.PLAYER) return; @@ -195,7 +192,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().setOnFire(p, false); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityCombust(EntityCombustEvent e) { if(e.getEntityType() != EntityType.PLAYER) return; @@ -207,7 +204,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().setOnFire(p, false); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onTNTSpawn(EntitySpawnEvent e){ if(e.getEntityType() != EntityType.PRIMED_TNT) return; @@ -215,7 +212,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().tntSpawn(e.getEntity()); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onExplosion(EntityExplodeEvent e){ if(e.getEntityType() != EntityType.PRIMED_TNT) return; @@ -226,7 +223,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().sound(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), SWSound.ENTITY_GENERIC_EXPLODE, "BLOCKS", 4.0F, (1.0F + (random.nextFloat() - random.nextFloat()) * 0.2F) * 0.7F); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onItem(PlayerItemHeldEvent e){ if(isNotSent(e.getPlayer())) return; @@ -234,7 +231,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().item(e.getPlayer(), disarmNull(e.getPlayer().getInventory().getItem(e.getNewSlot())), "MAINHAND"); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onProjectileSpawn(ProjectileLaunchEvent e){ if(e.getEntityType() == EntityType.FIREBALL) GlobalRecorder.getInstance().fireballSpawn(e.getEntity()); @@ -242,7 +239,7 @@ public class Recording implements Listener { GlobalRecorder.getInstance().arrowSpawn(e.getEntity()); } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onInventoryClick(InventoryClickEvent e){ Player player = (Player) e.getWhoClicked(); if(isNotSent(player)) diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Shutdown.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Shutdown.java index e088314..714cfdf 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Shutdown.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Shutdown.java @@ -25,7 +25,6 @@ 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.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; @@ -35,7 +34,7 @@ public class Shutdown implements Listener { new StateDependentListener(ArenaMode.AntiEvent, FightState.All, this); } - @EventHandler(priority = EventPriority.HIGH) + @EventHandler public void handlePlayerQuit(PlayerQuitEvent event) { if(Config.replayserver()) return; From ed6b24bd7919c043c645809f3809d0783d83fc66 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 3 Mar 2022 10:01:05 +0100 Subject: [PATCH 4/4] Allow administration replays without restrictions Signed-off-by: Lixfel --- .../fightsystem/utils/FlatteningWrapper8.java | 2 +- .../de/steamwar/fightsystem/ArenaMode.java | 2 +- .../de/steamwar/fightsystem/FightSystem.java | 4 +--- .../fightsystem/fight/FightWorld.java | 1 - .../fightsystem/listener/TestJoin.java | 8 +++++++ .../fightsystem/record/FileSource.java | 24 ++++++++++--------- .../fightsystem/record/PacketProcessor.java | 3 +++ 7 files changed, 27 insertions(+), 17 deletions(-) diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/FlatteningWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/FlatteningWrapper8.java index 95fd263..5b6ed8d 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/FlatteningWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/FlatteningWrapper8.java @@ -72,7 +72,7 @@ public class FlatteningWrapper8 implements FlatteningWrapper.IFlatteningWrapper @Override public void forceLoadChunk(World world, int cX, int cZ) { - // not possible in 1.8 + world.setKeepSpawnInMemory(true); } @Override diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java b/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java index a25ca27..94d3d2b 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/ArenaMode.java @@ -40,7 +40,7 @@ public enum ArenaMode { 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 Replay = Collections.unmodifiableSet(EnumSet.of(REPLAY)); + public static final Set Replay = Collections.unmodifiableSet(EnumSet.of(REPLAY, TEST)); public static final Set AntiReplay = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(REPLAY))); public static final Set AntiTest = Collections.unmodifiableSet(EnumSet.complementOf(EnumSet.of(TEST, CHECK))); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 9431174..f99b59a 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -141,6 +141,7 @@ public class FightSystem extends JavaPlugin { new FileRecorder(); REntity.initWatchers(); + FileSource.startReplay(); if(Config.mode == ArenaMode.EVENT) { setPreSchemState(); @@ -148,9 +149,6 @@ public class FightSystem extends JavaPlugin { Fight.getBlueTeam().setSchem(SchematicNode.getSchematicNode(Config.CheckSchemID)); }else if(Config.mode == ArenaMode.PREPARE) { Fight.getUnrotated().setSchem(SchematicNode.getSchematicNode(Config.PrepareSchemID)); - }else if(Config.mode == ArenaMode.REPLAY) { - FightWorld.forceLoad(); - FileSource.startReplay(); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightWorld.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightWorld.java index 82187fa..43cad3f 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightWorld.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightWorld.java @@ -61,7 +61,6 @@ public class FightWorld extends StateDependent { world.loadChunk(cX, cZ); FlatteningWrapper.impl.forceLoadChunk(world, cX, cZ); }); - world.setKeepSpawnInMemory(true); } public static void resetWorld(){ diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/TestJoin.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/TestJoin.java index 8099c24..faa7109 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/TestJoin.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/TestJoin.java @@ -20,11 +20,13 @@ 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 de.steamwar.sql.SteamwarUser; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -41,6 +43,12 @@ public class TestJoin implements Listener { Player player = event.getPlayer(); FightTeam fightTeam = Fight.getPlayerTeam(player); + if(Config.ReplayID != 0 && !SteamwarUser.get(player.getUniqueId()).getUserGroup().isAdminGroup()) { + FightSystem.getMessage().send("CHECK_JOIN_DENIED", player); + player.kickPlayer(""); + return; + } + if (fightTeam == null && (Fight.getRedTeam().isLeaderless() || Fight.getBlueTeam().isLeaderless())) { FightSystem.getMessage().send("TEST_BECOME_LEADER", player); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/FileSource.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/FileSource.java index fc3c981..6d75d2b 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/FileSource.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/FileSource.java @@ -38,21 +38,23 @@ public class FileSource extends PacketSource { return; } - de.steamwar.sql.Fight.getReplay(Config.ReplayID, input -> { + if(Config.ReplayID > 0) { + de.steamwar.sql.Fight.getReplay(Config.ReplayID, input -> { + try { + Files.copy( + input, + FileRecorder.getFile().toPath(), + StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + throw new SecurityException("Could not start replay", e); + } + }); + try { - Files.copy( - input, - FileRecorder.getFile().toPath(), - StandardCopyOption.REPLACE_EXISTING); + new FileSource(FileRecorder.getFile()); } catch (IOException e) { throw new SecurityException("Could not start replay", e); } - }); - - try { - new FileSource(FileRecorder.getFile()); - } catch (IOException e) { - throw new SecurityException("Could not start replay", e); } } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java index a85c015..33d4e63 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java @@ -26,6 +26,7 @@ import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.countdown.Countdown; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightTeam; +import de.steamwar.fightsystem.fight.FightWorld; import de.steamwar.fightsystem.fight.FreezeWorld; import de.steamwar.fightsystem.listener.FightScoreboard; import de.steamwar.fightsystem.states.FightState; @@ -124,6 +125,8 @@ public class PacketProcessor { packetDecoder[0xef] = source::readUTF; packetDecoder[0xff] = this::tick; + FightWorld.forceLoad(); + if(source.async()) { Bukkit.getScheduler().runTaskAsynchronously(FightSystem.getPlugin(), this::process); task = Bukkit.getScheduler().runTaskTimer(FightSystem.getPlugin(), this::runSync, 1, 1);