diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java index 7c7b6e81..aaffe4c4 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightSchematic.java @@ -36,6 +36,7 @@ import de.steamwar.sql.SchematicData; import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SchematicType; import lombok.Getter; +import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; @@ -52,7 +53,10 @@ public class FightSchematic extends StateDependent { private final FightTeam team; private final Region region; - private final boolean rotate; + + @Getter + @Setter + private boolean rotate; @Getter private Clipboard clipboard = null; @@ -120,10 +124,13 @@ public class FightSchematic extends StateDependent { } if(ArenaMode.AntiReplay.contains(Config.mode)) { + if (Config.ActiveWinconditions.contains(Winconditions.RANDOM_ROTATE)) { + rotate = new Random().nextBoolean(); + } if(team.isBlue()) - GlobalRecorder.getInstance().blueSchem(schematic); + GlobalRecorder.getInstance().blueSchem(schematic, rotate); else - GlobalRecorder.getInstance().redSchem(schematic); + GlobalRecorder.getInstance().redSchem(schematic, rotate); } Bukkit.getScheduler().runTask(FightSystem.getPlugin(), this::paste); @@ -141,12 +148,6 @@ public class FightSchematic extends StateDependent { FreezeWorld freezer = new FreezeWorld(); team.teleportToSpawn(); - - boolean rotate = this.rotate; - if (Fight.getRandomSeed().isInitialized() && Config.ActiveWinconditions.contains(Winconditions.RANDOM_ROTATE)) { - rotate = Fight.getRandomSeed().getRandom(schematic).nextBoolean(); - } - Vector dims = WorldeditWrapper.impl.getDimensions(clipboard); WorldeditWrapper.impl.pasteClipboard( clipboard, diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index 0cb68f71..319f2dbb 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -458,6 +458,14 @@ public class FightTeam { return schematic.getId(); } + public boolean getSchematicRotate() { + return schematic.isRotate(); + } + + public void setSchematicRotate(boolean rotate) { + schematic.setRotate(rotate); + } + public Clipboard getClipboard() { return schematic.getClipboard(); } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java index 84906a7b..2cc84688 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/PacketProcessor.java @@ -143,6 +143,8 @@ public class PacketProcessor implements Listener { packetDecoder[0xb2] = this::teams; packetDecoder[0xb3] = () -> pasteEmbeddedSchem(Fight.getBlueTeam()); packetDecoder[0xb4] = () -> pasteEmbeddedSchem(Fight.getRedTeam()); + packetDecoder[0xb5] = () -> rotateSchem(Fight.getBlueTeam()); + packetDecoder[0xb6] = () -> rotateSchem(Fight.getRedTeam()); packetDecoder[0xc0] = this::scoreboardTitle; packetDecoder[0xc1] = this::scoreboardData; packetDecoder[0xc2] = this::bossBar; @@ -529,6 +531,14 @@ public class PacketProcessor implements Listener { execSync(() -> team.pasteSchem(schemId, clipboard)); } + private void rotateSchem(FightTeam team) throws IOException { + boolean rotate = source.readBoolean(); + + execSync(() -> { + team.setSchematicRotate(rotate); + }); + } + private void teams() throws IOException { int blueId = source.readInt(); int redId = source.readInt(); diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java index c6b899ef..cf800565 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/record/Recorder.java @@ -61,9 +61,9 @@ public interface Recorder { default void enableTeam(FightTeam team){ if(FightState.Schem.contains(FightState.getFightState())){ if(team.isBlue()) - blueSchem(team.getSchematic()); + blueSchem(team.getSchematic(), team.getSchematicRotate()); else - redSchem(team.getSchematic()); + redSchem(team.getSchematic(), team.getSchematicRotate()); } if(FightState.AntiSpectate.contains(FightState.getFightState())){ @@ -123,6 +123,8 @@ public interface Recorder { * TeamIDPacket (0xb2) + int blueTeamId, redTeamId * BlueEmbeddedSchemPacket (0xb3) + int blueSchemId + gzipt NBT blob * RedEmbeddedSchemPacket (0xb4) + int redSchemId + gzipt NBT blob + * BlueSchemRotatePacket (0xb5) + boolean rotate + * RedSchemRotatePacket (0xb6) + boolean rotate * * DEPRECATED ScoreboardTitlePacket (0xc0) + String scoreboardTitle * DEPRECATED ScoreboardDataPacket (0xc1) + String key + int value @@ -133,7 +135,6 @@ public interface Recorder { * WinPacket (0xc6) + byte team + Message subtitle * BossBarPacket (0xc7) + double leftBlueProgress, leftRedProgress + Message leftBlueText, leftRedText * - * RandomSeed (0xfd) + long seed * CommentPacket (0xfe) + String comment * TickPacket (0xff) * @@ -260,14 +261,20 @@ public interface Recorder { write(0xb2, blueTeamId, redTeamId); } - default void blueSchem(int schemId) { + default void blueSchem(int schemId, boolean rotate) { + rotate(0xb5, rotate); schem(0xb3, 0xb0, schemId); } - default void redSchem(int schemId) { + default void redSchem(int schemId, boolean rotate) { + rotate(0xb6, rotate); schem(0xb4, 0xb1, schemId); } + default void rotate(int packetId, boolean rotate) { + write(packetId, rotate); + } + default void schem(int embedId, int noEmbedId, int schemId){ if(schemId == 0) { write(noEmbedId, schemId); @@ -311,10 +318,6 @@ public interface Recorder { write(0xc6, bTeam, new Message(subtitle, params)); } - default void seed(long seed) { - write(0xfd, seed); - } - default void tick(){ write(0xff); } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/RandomSeed.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/RandomSeed.java deleted file mode 100644 index 397afcc8..00000000 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/RandomSeed.java +++ /dev/null @@ -1,52 +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.fightsystem.ArenaMode; -import de.steamwar.fightsystem.record.GlobalRecorder; -import de.steamwar.fightsystem.states.FightState; -import de.steamwar.fightsystem.states.OneShotStateDependent; -import lombok.Getter; - -import java.util.Random; - -public class RandomSeed { - - @Getter - private boolean initialized = false; - private long seed; - - public RandomSeed() { - new OneShotStateDependent(ArenaMode.AntiReplay, FightState.PreSchemSetup, () -> { - initialized = true; - this.seed = System.nanoTime(); - GlobalRecorder.getInstance().seed(seed); - }); - } - - public void setSeed(long seed) { - initialized = true; - this.seed = seed; - } - - public Random getRandom(int derivation) { - return new Random(seed ^ new Random(derivation).nextLong()); - } -}