diff --git a/BauSystem_Main/src/BauSystem.properties b/BauSystem_Main/src/BauSystem.properties index 90836666..00980ba4 100644 --- a/BauSystem_Main/src/BauSystem.properties +++ b/BauSystem_Main/src/BauSystem.properties @@ -502,8 +502,10 @@ UNSIGN_HELP=§8/§eunsign §8- §7Make a signed book writable again # Simulator SIMULATOR_HELP = §8/§esimulator §8-§7 Gives you the simulator wand -SIMULATOR_CHANGE_HELP = §8/§esimulator change §8-§7 Change your simulator wand selection SIMULATOR_CREATE_HELP = §8/§esimulator create §8[§7name§8] §8-§7 Create a new simulator +SIMULATOR_CHANGE_HELP = §8/§esimulator change §8-§7 Change your simulator wand selection +SIMULATOR_NO_PERMS = §cYou are not allowed to use the simulator here + SIMULATOR_NO_SIM_IN_HAND = §cNo simulator item selected SIMULATOR_GUI_SELECT_SIM = Simulator selection SIMULATOR_NAME_ALREADY_EXISTS = §cSimulator already exists @@ -512,25 +514,6 @@ SIMULATOR_EDIT_LOCATION = §7Edit position SIMULATOR_EDIT_PROPERTIES = §7Edit properties SIMULATOR_EDIT_OTHER = §7Edit other -SIMULATOR_GUI_ITEM_NAME = §eTNT Simulator -SIMULATOR_START_HELP = §8/§esimulator start §8-§7 Starts the simulation -SIMULATOR_GUI_HELP = §8/§esimulator gui §8-§7 Opens the simulator's gui -SIMULATOR_DELETE_HELP = §8/§esimulator delete §8-§7 Deletes all TNT -SIMULATOR_SAVE_HELP = §8/§esimulator save §8<§eName§8> §8-§7 Saves the simulator -SIMULATOR_LOAD_HELP = §8/§esimulator load §8<§eName§8> §8-§7 Loads a simulator -SIMULATOR_LIST_HELP = §8/§esimulator list §8-§7 Lists all saved simulators -SIMULATOR_REMOVE_HELP = §8/§esimulator remove §8<§eName§8> §8-§7 Deletes the simulator -SIMULATOR_NO_PERMS = §cYou are not allowed to use the simulator here - -SIMULATOR_DELETE_TNT = §7All TNTs have been deleted -SIMULATOR_SAVE = §7Simulator §e{0} §7was saved -SIMULATOR_LOAD = §7Simulator §e{0} §7was loaded -SIMULATOR_REMOVE = §7Simulator §e{0} §7was deleted -SIMULATOR_LIST_NOTHING = §7No saved simulators -SIMULATOR_LIST_HEADER = §7Saved simulators: -SIMULATOR_LIST_ELEMENT = §e{0} §8[§7Laden§8] -SIMULATOR_LIST_ELEMENT_HOVER = §eClick to load - SIMULATOR_WAND_NAME = §eSimulator SIMULATOR_WAND_LORE_1 = §eRigth click §8- §7adds a position SIMULATOR_WAND_LORE_2 = §eSneaking §8- §7Free movement diff --git a/BauSystem_Main/src/BauSystem_de.properties b/BauSystem_Main/src/BauSystem_de.properties index 41615b55..ddc061ea 100644 --- a/BauSystem_Main/src/BauSystem_de.properties +++ b/BauSystem_Main/src/BauSystem_de.properties @@ -502,25 +502,18 @@ SCRIPT_GUI_CONSTANT_REGION_TYPE_LORE = §eRegionstype§7 der jetztigen Region UNSIGN_HELP=§8/§eunsign §8- §7Mache ein Buch beschreibbar # Simulator -SIMULATOR_GUI_ITEM_NAME = §eTNT Simulator SIMULATOR_HELP = §8/§esimulator §8-§7 Legt dir den Simulatorstab ins Inventar -SIMULATOR_START_HELP = §8/§esimulator start §8-§7 Startet die Simulation -SIMULATOR_GUI_HELP = §8/§esimulator gui §8-§7 Öffnet die GUI -SIMULATOR_DELETE_HELP = §8/§esimulator delete §8-§7 Löscht alle TNT -SIMULATOR_SAVE_HELP = §8/§esimulator save §8<§eName§8> §8-§7 Speichert den Simulator -SIMULATOR_LOAD_HELP = §8/§esimulator load §8<§eName§8> §8-§7 Lädt den Simulator -SIMULATOR_LIST_HELP = §8/§esimulator list §8-§7 Listet alle gespeicherten Simulator -SIMULATOR_REMOVE_HELP = §8/§esimulator remove §8<§eName§8> §8-§7 Löscht den Simulator +SIMULATOR_CREATE_HELP = §8/§esimulator create §8[§7name§8] §8-§7 Erstelle einen neuen Simulator +SIMULATOR_CHANGE_HELP = §8/§esimulator change §8-§7 Wechsel zu einem anderen Simulator SIMULATOR_NO_PERMS = §cDu darfst hier nicht den Simulator nutzen -SIMULATOR_DELETE_TNT = §7Alle TNT wurden gelöscht -SIMULATOR_SAVE = §7Simulator §e{0} §7wurde gespeichert -SIMULATOR_LOAD = §7Simulator §e{0} §7wurde geladen -SIMULATOR_REMOVE = §7Simulator §e{0} §7wurde gelöscht -SIMULATOR_LIST_NOTHING = §7Keine gespeicherten Simulatoren -SIMULATOR_LIST_HEADER = §7Gespeicherte Simulatoren: -SIMULATOR_LIST_ELEMENT = §e{0} §8[§7Laden§8] -SIMULATOR_LIST_ELEMENT_HOVER = §eZum laden klicken +SIMULATOR_NO_SIM_IN_HAND = §cKein Simulator Item gewählt +SIMULATOR_GUI_SELECT_SIM = Simulator wählen +SIMULATOR_NAME_ALREADY_EXISTS = §cSimulator existiert bereits +SIMULATOR_CREATE = §aSimulator erstellt +SIMULATOR_EDIT_LOCATION = §7Editiere Positionen +SIMULATOR_EDIT_PROPERTIES = §7Editiere Eigenschaften +SIMULATOR_EDIT_OTHER = §7Editiere Andere SIMULATOR_WAND_NAME = §eKanonensimulator SIMULATOR_WAND_LORE_1 = §eRechtsklick §8- §7Füge eine Position hinzu @@ -580,13 +573,13 @@ SIMULATOR_TNT_SPAWN_POSITION_Z = §7z-Position §8- §e{0} SIMULATOR_TNT_SPAWN_ACTIVATED_WITH = §7Gezündet durch §8- §e{0} SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_COMPARATOR = Comparator SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_REPEATER = Repeater +SIMULATOR_TNT_SPAWN_ACTIVATED_UNKNOWN = Unbekannt SIMULATOR_TNT_SPAWN_MATERIAL = §eMaterial SIMULATOR_TNT_SPAWN_MATERIAL_LORE_1 = §7Jetziges Material§8: §e{0} SIMULATOR_TNT_SPAWN_MATERIAL_LORE_2 = §eLink-Click §7Zum ändern SIMULATOR_TNT_SPAWN_MATERIAL_LORE_3 = §eRechts-Click §7Zum zurücksetzten SIMULATOR_MATERIAL_GUI_NAME = Material ändern -SIMULATOR_MATERIAL_NAME = §e{0} -SIMULATOR_MATERIAL_CLICK = §eClicken zum wählen +SIMULATOR_MATERIAL_CLICK = §eKlicken zum wählen SIMULATOR_TNT_SPAWN_ADD_IGNITION_PHASE = §eZündphase hinzufügen SIMULATOR_TNT_SPAWN_ADD_IGNITION_PHASE_SHIFT = §eShift-Click§8: §7Zündphase hinzufügen und +1 Tick Offset SIMULATOR_TNT_SPAWN_ADD_TNT = §eTNT hinzufügen diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/AbstractSimulatorEntity.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/AbstractSimulatorEntity.java deleted file mode 100644 index 685bab26..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/AbstractSimulatorEntity.java +++ /dev/null @@ -1,38 +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.bausystem.features.simulator; - -import de.steamwar.bausystem.shared.AbstractEntity; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; - -public interface AbstractSimulatorEntity extends AbstractEntity { - - void display(Player player); - - void setPosition(Vector position); - - boolean hide(Player player, boolean always); - - int getId(); - - Entity getBukkitEntity(); -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/OrderUtils.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/OrderUtils.java similarity index 98% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/OrderUtils.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/OrderUtils.java index 07e2410d..b4ccfc76 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/OrderUtils.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/OrderUtils.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulatorn; +package de.steamwar.bausystem.features.simulator; import de.steamwar.bausystem.BauSystem; import lombok.experimental.UtilityClass; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorBauGuiItem.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorBauGuiItem.java deleted file mode 100644 index 29f0030c..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorBauGuiItem.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 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.bausystem.features.simulator; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.linkage.LinkageType; -import de.steamwar.bausystem.linkage.Linked; -import de.steamwar.bausystem.linkage.specific.BauGuiItem; -import de.steamwar.inventory.SWItem; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.ItemStack; - -// @Linked(LinkageType.BAU_GUI_ITEM) -public class SimulatorBauGuiItem extends BauGuiItem { - - public SimulatorBauGuiItem() { - super(20); - } - - @Override - public ItemStack getItem(Player player) { - return new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("SIMULATOR_GUI_ITEM_NAME", player)).getItemStack(); - } - - @Override - public boolean click(ClickType click, Player p) { - p.closeInventory(); - p.performCommand("sim"); - return false; - } - - @Override - public Permission permission() { - return Permission.WORLD; - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java index ce9d3bc5..530fd577 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCommand.java @@ -1,21 +1,20 @@ /* + * This file is a part of the SteamWar software. * - * This file is a part of the SteamWar software. + * Copyright (C) 2022 SteamWar.de-Serverteam * - * 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 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. * - * 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 . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.bausystem.features.simulator; @@ -23,21 +22,18 @@ package de.steamwar.bausystem.features.simulator; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.SWUtils; +import de.steamwar.bausystem.features.simulator.gui.SimulatorSelectionGUI; import de.steamwar.bausystem.linkage.LinkageType; import de.steamwar.bausystem.linkage.Linked; -import de.steamwar.bausystem.utils.ListChatView; -import de.steamwar.bausystem.worlddata.SimulatorData; -import de.steamwar.command.*; -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.CommandSender; +import de.steamwar.bausystem.utils.ItemUtils; +import de.steamwar.command.GuardCheckType; +import de.steamwar.command.GuardChecker; +import de.steamwar.command.GuardResult; +import de.steamwar.command.SWCommand; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; -import java.util.List; - -// @Linked(LinkageType.COMMAND) +@Linked(LinkageType.COMMAND) public class SimulatorCommand extends SWCommand { public SimulatorCommand() { @@ -46,66 +42,28 @@ public class SimulatorCommand extends SWCommand { @Register(description = "SIMULATOR_HELP") public void genericCommand(@Guard Player p) { - SWUtils.giveItemToPlayer(p, TNTSimulator.getWand(p)); + SimulatorCursor.hide(p, null); + SWUtils.giveItemToPlayer(p, SimulatorStorage.getWand(p)); } - @Register(value = {"start"}, description = "SIMULATOR_START_HELP") - public void startCommand(@Guard Player p) { - TNTSimulator.get(p).start(); - } - - @Register(value = {"gui"}, description = "SIMULATOR_GUI_HELP") - public void guiCommand(@Guard Player p) { - TNTSimulator.get(p).showGUI(); - } - - @Register(value = {"delete"}, description = "SIMULATOR_DELETE_HELP") - public void deleteCommand(@Guard Player p) { - TNTSimulator.get(p).delete(); - BauSystem.MESSAGE.send("SIMULATOR_DELETE_TNT", p); - } - - @Register(value = {"save"}, description = "SIMULATOR_SAVE_HELP") - public void saveCommand(@Guard Player p, String name) { - TNTSimulator.get(p).save(); - SimulatorData.saveSimulator(p, name); - BauSystem.MESSAGE.send("SIMULATOR_SAVE", p, name); - } - - @Register(value = {"load"}, description = "SIMULATOR_LOAD_HELP") - public void loadCommand(@Guard Player p, @Mapper("SavedSimulators") String name) { - TNTSimulator.get(p).delete(); - SimulatorData.loadSimulator(p, name); - BauSystem.MESSAGE.send("SIMULATOR_LOAD", p, name); - } - - @Register(value = {"remove"}, description = "SIMULATOR_REMOVE_HELP") - public void removeCommand(@Guard Player p, @Mapper("SavedSimulators") String name) { - SimulatorData.removeSimulator(p, name); - BauSystem.MESSAGE.send("SIMULATOR_REMOVE", p, name); - } - - @Register(value = {"list"}, description = "SIMULATOR_LIST_HELP") - public void listCommand(@Guard Player p, @OptionalValue("0") int page) { - List sims = SimulatorData.listSimulator(p); - if (sims.isEmpty()) { - BauSystem.MESSAGE.send("SIMULATOR_LIST_NOTHING", p); + @Register(value = "change", description = "SIMULATOR_CHANGE_HELP") + public void change(@Guard Player p) { + ItemStack itemStack = p.getInventory().getItemInMainHand(); + if (!ItemUtils.isItem(itemStack, "simulator")) { + BauSystem.MESSAGE.send("SIMULATOR_NO_SIM_IN_HAND", p); return; } - BauSystem.MESSAGE.send("SIMULATOR_LIST_HEADER", p); - ListChatView.chatView(p, sims, page, simulator -> { - TextComponent component = new TextComponent(); - component.setText(BauSystem.MESSAGE.parse("SIMULATOR_LIST_ELEMENT", p, simulator)); - component.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/simulator load " + simulator)); - component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(BauSystem.MESSAGE.parse("SIMULATOR_LIST_ELEMENT_HOVER", p)))); - return component; - }, (beforePageComponent, beforePage) -> { - beforePageComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(BauSystem.MESSAGE.parse("LIST_PREVIOUS_PAGE", p)).create())); - beforePageComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/simulator list " + beforePage)); - }, (afterPageComponent, afterPage) -> { - afterPageComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(BauSystem.MESSAGE.parse("LIST_NEXT_PAGE", p)).create())); - afterPageComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/simulator list " + afterPage)); - }); + SimulatorSelectionGUI.open(p, itemStack); + } + + @Register(value = "create", description = "SIMULATOR_CREATE_HELP") + public void create(@Guard Player p, String name) { + if (SimulatorStorage.getSimulatorNames().contains(name)) { + BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", p); + return; + } + SimulatorStorage.createNewSimulator(name); + BauSystem.MESSAGE.send("SIMULATOR_CREATE", p); } @ClassGuard(value = Player.class, local = true) @@ -121,22 +79,4 @@ public class SimulatorCommand extends SWCommand { return GuardResult.DENIED; }; } - - @Mapper(value = "SavedSimulators", local = true) - public TypeMapper simulatorListTypeMapper() { - return new TypeMapper() { - @Override - public String map(CommandSender commandSender, String[] previousArguments, String s) { - if (SimulatorData.listSimulator(((Player) commandSender)).contains(s)) { - return s; - } - return null; - } - - @Override - public List tabCompletes(CommandSender commandSender, String[] strings, String s) { - return SimulatorData.listSimulator(((Player) commandSender)); - } - }; - } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java similarity index 97% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorCursor.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java index f5bc1ce6..50ba17c0 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java @@ -17,12 +17,12 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulatorn; +package de.steamwar.bausystem.features.simulator; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity; import de.steamwar.bausystem.features.simulator.show.SimulatorEntityShowMode; -import de.steamwar.bausystem.features.simulatorn.tnt.SimulatorElement; +import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; import lombok.experimental.UtilityClass; import net.md_5.bungee.api.ChatMessageType; import org.bukkit.block.BlockFace; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java similarity index 98% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorStorage.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java index 403cb48f..8f885853 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java @@ -17,11 +17,11 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulatorn; +package de.steamwar.bausystem.features.simulator; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.features.simulatorn.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.tnt.TNTElement; import de.steamwar.bausystem.linkage.Disable; import de.steamwar.bausystem.linkage.Enable; import de.steamwar.bausystem.linkage.LinkageType; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java index 0b6a8efb..65185f18 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java @@ -1,741 +1,180 @@ /* + * This file is a part of the SteamWar software. * - * This file is a part of the SteamWar software. + * Copyright (C) 2022 SteamWar.de-Serverteam * - * 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 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. * - * 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 . - * / + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.bausystem.features.simulator; -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.configplayer.Config; +import de.steamwar.bausystem.features.simulator.gui.TNTElementGUI; +import de.steamwar.bausystem.features.simulator.gui.TNTSimulatorGui; import de.steamwar.bausystem.features.simulator.show.SimulatorEntityShowMode; -import de.steamwar.bausystem.features.tracer.record.RecordStateMachine; -import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; -import de.steamwar.bausystem.utils.ItemUtils; -import de.steamwar.bausystem.worlddata.SimulatorData; -import de.steamwar.inventory.SWAnvilInv; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import de.steamwar.inventory.SWListInv; -import net.md_5.bungee.api.ChatMessageType; -import org.bukkit.Bukkit; +import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; +import de.steamwar.bausystem.features.simulator.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.tnt.TNTGroup; +import lombok.Getter; import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import org.bukkit.entity.TNTPrimed; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Consumer; import org.bukkit.util.RayTraceResult; -import org.bukkit.util.Vector; import yapion.hierarchy.types.YAPIONArray; import yapion.hierarchy.types.YAPIONObject; +import yapion.hierarchy.types.YAPIONType; import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +@Getter public class TNTSimulator { - private static final Vector X_VECTOR = new Vector(0.0625, 0, 0); - private static final Vector Y_VECTOR = new Vector(0, 0.0625, 0); - private static final Vector Z_VECTOR = new Vector(0, 0, 0.0625); + private Map playerShowMode = new HashMap<>(); - private static final Vector FX_VECTOR = new Vector(1, 0, 0); - private static final Vector FY_VECTOR = new Vector(0, 1, 0); - private static final Vector FZ_VECTOR = new Vector(0, 0, 1); + private Material material = Material.TNT; - private static final World WORLD = Bukkit.getWorlds().get(0); - private static final List EMPTY = new ArrayList<>(); + private List tntElementList = new ArrayList<>(); + + public TNTSimulator() { - private static final List MATERIALS = new ArrayList<>(); - static { - Arrays.stream(Material.values()) - .filter(Material::isItem) - .filter(material -> !material.isLegacy()) - .forEach(MATERIALS::add); } - public static ItemStack getWand(Player p) { - ItemStack itemStack = new SWItem(Material.BLAZE_ROD, BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME", p), Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_1", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_2", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_3", p), BauSystem.MESSAGE.parse("SIMULATOR_WAND_LORE_4", p)), false, null).getItemStack(); - ItemUtils.setItem(itemStack, "simulator"); - return itemStack; - } - - static final Map TNT_SIMULATOR_MAP = new HashMap<>(); - - public static TNTSimulator get(Player player) { - return TNT_SIMULATOR_MAP.computeIfAbsent(player, p -> { - YAPIONArray yapionArray = SimulatorData.getSimulator(player).getYAPIONArrayOrSetDefault("", new YAPIONArray()); - TNTSimulator simulator = new TNTSimulator(player); - if (!yapionArray.isEmpty()) { - yapionArray.forEach(yapionAnyType -> { - simulator.spawns.add(simulator.new TNTSpawn((YAPIONObject) yapionAnyType)); - }); + public TNTSimulator(YAPIONObject yapionObject) { + material = Material.valueOf(yapionObject.getStringOrDefault("material", Material.TNT.name())); + YAPIONArray yapionArray = yapionObject.getArrayOrDefault("tntElements", new YAPIONArray()); + for (YAPIONObject element : yapionArray.streamObject().collect(Collectors.toList())) { + if (element.containsKey("elements", YAPIONType.ARRAY)) { + tntElementList.add(new TNTGroup(element)); + } else { + tntElementList.add(new TNTElement(element)); } - return simulator; - }); + } } - public void save() { - TNTSimulator simulator = TNT_SIMULATOR_MAP.get(player); + public YAPIONObject toYAPION() { + YAPIONObject yapionObject = new YAPIONObject(); + yapionObject.add("material", material.name()); YAPIONArray yapionArray = new YAPIONArray(); - simulator.spawns.forEach(tntSpawn -> { - yapionArray.add(tntSpawn.output()); + for (SimulatorElement element : tntElementList) { + yapionArray.add(element.toYAPION()); + } + yapionObject.add("tntElements", yapionArray); + return yapionObject; + } + + public void hide(Player player) { + SimulatorEntityShowMode showMode = playerShowMode.get(player); + if (showMode == null) { + return; + } + tntElementList.forEach(simulatorElement -> { + simulatorElement.hide(showMode); }); - SimulatorData.saveSimulator(player, yapionArray); - simulator.hide(); } - public void delete() { - TNTSimulator simulator = TNT_SIMULATOR_MAP.remove(player); - SimulatorData.removeSimulator(player, ""); - simulator.hide(); + public void remove(Player player) { + SimulatorEntityShowMode showMode = playerShowMode.remove(player); + if (showMode == null) { + return; + } + tntElementList.forEach(simulatorElement -> { + simulatorElement.hide(showMode); + }); } - public void remove() { - TNTSimulator simulator = TNT_SIMULATOR_MAP.remove(player); - simulator.hide(); + public void hide(Player player, List simulatorElements) { + SimulatorEntityShowMode showMode = playerShowMode.get(player); + if (showMode == null) { + return; + } + simulatorElements.forEach(simulatorElement -> { + simulatorElement.hide(showMode); + }); } - private final Set spawns = new HashSet<>(); - private final Player player; + public void hide(TNTElement tntElement) { + playerShowMode.forEach((player, simulatorEntityShowMode) -> { + tntElement.hide(simulatorEntityShowMode); + }); + } - private AbstractSimulatorEntity cursor = null; - private boolean printed = false; + public void show(Player player) { + SimulatorEntityShowMode showMode = playerShowMode.computeIfAbsent(player, SimulatorEntityShowMode::new); + tntElementList.forEach(simulatorElement -> { + simulatorElement.show(showMode); + }); + } - private TNTSimulator(Player player) { - this.player = player; + public void show(TNTElement tntElement) { + playerShowMode.forEach((player, simulatorEntityShowMode) -> { + tntElement.show(simulatorEntityShowMode); + }); } public List getEntities() { - return spawns.stream().map(spawn -> spawn.entity.getBukkitEntity()).collect(Collectors.toList()); + return tntElementList.stream().flatMap(element -> element.getEntities().stream()).collect(Collectors.toList()); } - public void show(RayTraceResult result) { - printed = true; - - if (cursor != null) - cursor.hide(player, false); - - spawns.forEach(TNTSpawn::show); - - if (result == null) - return; - - if (result.getHitEntity() != null) { - List tntSpawns = getEntity(result.getHitEntity()); - tntSpawns.forEach(TNTSpawn::hide); - - cursor = SimulatorEntityShowMode.createEntity(player, tntSpawns.isEmpty() ? getPos(result) : tntSpawns.get(0).position, true); - cursor.display(player); - BauSystem.MESSAGE.sendPrefixless("SIMULATOR_POSITION_EDIT", player, ChatMessageType.ACTION_BAR); - return; - } - - cursor = SimulatorEntityShowMode.createEntity(player, getPos(result), false); - cursor.display(player); - BauSystem.MESSAGE.sendPrefixless("SIMULATOR_POSITION_ADD", player, ChatMessageType.ACTION_BAR); - } - - public void edit(RayTraceResult result) { - if (result == null) { - showGUI(); - return; - } - - show(result); - - if (result.getHitEntity() != null) { - List tntSpawns = getEntity(result.getHitEntity()); - if (tntSpawns.isEmpty()) { - return; - } - if (tntSpawns.size() == 1) { - tntSpawns.get(0).editTNT(spawns); - } else { - showGUI(new HashSet<>(tntSpawns)); - } - return; - } - - spawns.add(new TNTSpawn(getPos(result), cursor)); - } - - public void hide() { - if (!printed) - return; - - printed = false; - if (cursor != null) - cursor.hide(player, true); - cursor = null; - spawns.forEach(TNTSpawn::hide); - } - - public void start() { - for (TNTSpawn tntSpawn : spawns) { - if (Region.getRegion(tntSpawn.position.toLocation(player.getWorld())).get(Flag.FREEZE) == FreezeMode.ACTIVE) { - BauSystem.MESSAGE.send("SIMULATOR_REGION_FREEZED", player); - return; - } - } - - boolean simulatorAutoTrace = Config.getInstance().get(player).getPlainValueOrDefault("simulatorAutoTrace", false); - if (simulatorAutoTrace) { - RecordStateMachine.commandSingle(); - player.performCommand("trace show"); - } - - Map> first = new HashMap<>(); - Map> second = new HashMap<>(); - int lastTick = 0; - - for (TNTSpawn tntSpawn : spawns) { - Map> list = tntSpawn.comparator ? second : first; - for (int i = 0; i < tntSpawn.count; i++) { - list.computeIfAbsent(tntSpawn.getTickOffset(), integer -> new ArrayList<>()).add(tntSpawn); - } - if (lastTick < tntSpawn.getTickOffset()) { - lastTick = tntSpawn.getTickOffset(); - } - } - int finalLastTick = lastTick; - - AtomicInteger currentTick = new AtomicInteger(0); - Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), bukkitTask -> { - int tick = currentTick.get(); - spawnRandomList(first.getOrDefault(tick, EMPTY)); - spawnRandomList(second.getOrDefault(tick, EMPTY)); - if (tick > finalLastTick) bukkitTask.cancel(); - currentTick.incrementAndGet(); - }, 1, 1); - } - - public void showGUI() { - showGUI(spawns); - } - - public void showGUI(Set tntSpawns) { - List> swListEntryList = tntSpawns.stream().map(spawn -> { - List lore = new ArrayList<>(); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_1", player, spawn.count)); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_2", player, spawn.getTickOffset())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_3", player)); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_4", player, spawn.position.getX())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_5", player, spawn.position.getY())); - lore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_LORE_6", player, spawn.position.getZ())); - SWItem swItem = new SWItem(spawn.material, BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_SPAWN_NAME", player), lore, false, null); - swItem.getItemStack().setAmount(spawn.count); - return new SWListInv.SWListEntry<>(swItem, spawn); - }).sorted(Comparator.comparing(SWListInv.SWListEntry::getObject)).collect(Collectors.toList()); - - SWListInv swListInv = new SWListInv<>(player, BauSystem.MESSAGE.parse("SIMULATOR_GUI_NAME", player), false, swListEntryList, (clickType, spawn) -> { - spawn.editTNT(tntSpawns); - }); - swListInv.setItem(51, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("SIMULATOR_GUI_DELETE", player), clickType -> { - delete(); - player.closeInventory(); - })); - swListInv.setItem(47, new SWItem(Material.FLINT_AND_STEEL, BauSystem.MESSAGE.parse("SIMULATOR_GUI_START", player), clickType -> { - start(); - player.closeInventory(); - })); - boolean simulatorAutoTrace = Config.getInstance().get(player).getPlainValueOrDefault("simulatorAutoTrace", false); - swListInv.setItem(48, new SWItem(simulatorAutoTrace ? Material.CHAIN_COMMAND_BLOCK : Material.COMMAND_BLOCK, BauSystem.MESSAGE.parse("SIMULATOR_GUI_AUTO_TRACE", player, simulatorAutoTrace), clickType -> { - Config.getInstance().get(player).put("simulatorAutoTrace", !simulatorAutoTrace); - showGUI(tntSpawns); - })); - swListInv.setItem(49, new SWItem(Material.MAGENTA_GLAZED_TERRACOTTA, BauSystem.MESSAGE.parse("SIMULATOR_GUI_MOVE_ALL", player), clickType -> { - move(tntSpawns); - })); - swListInv.open(); - } - - private void move(Set tntSpawns) { - SWInventory swInventory = new SWInventory(player, 54, BauSystem.MESSAGE.parse("SIMULATOR_MOVE_ALL_GUI_NAME", player)); - - String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player); - String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player); - List plusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_PIXEL_SHIFT", player)); - List minusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_PIXEL_SHIFT", player)); - - // Position Settings - // X Position - swInventory.setItem(12, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - updatePosition(tntSpawns, vector -> vector.add(clickType.isShiftClick() ? X_VECTOR : FX_VECTOR)); - move(tntSpawns); - })); - swInventory.setItem(21, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_POSITION_X", player), clickType -> { - })); - swInventory.setItem(30, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - updatePosition(tntSpawns, vector -> vector.subtract(clickType.isShiftClick() ? X_VECTOR : FX_VECTOR)); - move(tntSpawns); - })); - - // Y Position - swInventory.setItem(13, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - updatePosition(tntSpawns, vector -> vector.add(clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR)); - move(tntSpawns); - })); - swInventory.setItem(22, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_POSITION_Y", player), clickType -> { - })); - swInventory.setItem(31, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - updatePosition(tntSpawns, vector -> vector.subtract(clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR)); - move(tntSpawns); - })); - - // Z Position - swInventory.setItem(14, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - updatePosition(tntSpawns, vector -> vector.add(clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR)); - move(tntSpawns); - })); - swInventory.setItem(23, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_POSITION_Z", player), clickType -> { - })); - swInventory.setItem(32, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - updatePosition(tntSpawns, vector -> vector.subtract(clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR)); - move(tntSpawns); - })); - - swInventory.setItem(53, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> { - showGUI(tntSpawns); - })); - swInventory.open(); - } - - private void updatePosition(Set tntSpawns, Consumer positionChanger) { - Map vectors = new IdentityHashMap<>(); - for (TNTSpawn tntSpawn : tntSpawns) { - if (vectors.put(tntSpawn.position, true) == null) { - positionChanger.accept(tntSpawn.position); - } - } - } - - private List getEntity(Entity entity) { - List tntSpawns = new ArrayList<>(); - for (TNTSpawn spawn : spawns) { - if (spawn.entity.getId() == entity.getEntityId() || spawn.position.equals(entity.getLocation().toVector())) { - tntSpawns.add(spawn); - } + public List getEntity(Entity entity) { + List tntSpawns = new ArrayList<>(); + for (SimulatorElement spawn : tntElementList) { + spawn.getEntity(tntSpawns, entity); } return tntSpawns; } - private void spawnRandomList(List tntSpawns) { - if (tntSpawns.isEmpty()) return; - - List toShuffle = new ArrayList<>(); - List indices = new ArrayList<>(); - - for (int i = 0; i < tntSpawns.size(); i++) { - TNTSpawn tntSpawn = tntSpawns.get(i); - if (tntSpawn.xVelocity || tntSpawn.yVelocity || tntSpawn.zVelocity) { - toShuffle.add(tntSpawn); - indices.add(i); + public void remove(TNTElement tntElement) { + hide(tntElement); + tntElementList.remove(tntElement); + Set toRemove = new HashSet<>(); + for (SimulatorElement spawn : tntElementList) { + spawn.remove(tntElement); + if (spawn instanceof TNTGroup) { + if (((TNTGroup) spawn).getElements().isEmpty()) { + toRemove.add(spawn); + } } } - Collections.shuffle(indices); - - for (TNTSpawn tntSpawn : toShuffle) { - tntSpawns.set(indices.remove(0), tntSpawn); - } - - for (TNTSpawn tntSpawn : tntSpawns) { - tntSpawn.spawn(); - } + tntElementList.removeAll(toRemove); + tntElement.close(); } - private Vector getPos(RayTraceResult result) { - Vector pos = result.getHitPosition(); + public void edit(Player player, RayTraceResult result) { + if (result == null) { + TNTSimulatorGui.open(player, this, null, getTntElementList(), null); + return; + } - BlockFace face = result.getHitBlockFace(); - if (face != null) { - switch (face) { - case DOWN: - pos.setY(pos.getY() - 0.98); - break; - case EAST: - pos.setX(pos.getX() + 0.49); - break; - case WEST: - pos.setX(pos.getX() - 0.49); - break; - case NORTH: - pos.setZ(pos.getZ() - 0.49); - break; - case SOUTH: - pos.setZ(pos.getZ() + 0.49); - break; - default: - break; - } - - if (face.getModY() == 0 && player.isSneaking()) { - pos.setY(pos.getY() - 0.49); + SimulatorCursor.show(player, this, result); + + if (result.getHitEntity() != null) { + List elements = getEntity(result.getHitEntity()); + if (elements.isEmpty()) return; + + if (elements.size() == 1) { + TNTElementGUI.open(player, (TNTElement) elements.get(0), null); + } else { + TNTSimulatorGui.open(player, null, null, elements, null); } + return; } - if (!player.isSneaking()) { - pos.setX(pos.getBlockX() + 0.5); - if (face == null || face.getModY() == 0) - pos.setY(pos.getBlockY() + 0.0); - pos.setZ(pos.getBlockZ() + 0.5); - } - - return pos; - } - - private class TNTSpawn implements Comparable { - - private final AbstractSimulatorEntity entity; - private boolean printed = false; - - private final Vector position; - private int fuseTicks = 80; - private int count = 1; - private int tickOffset = 0; - private boolean xVelocity = false; - private boolean yVelocity = false; - private boolean zVelocity = false; - private boolean comparator = false; - private Material material = Material.TNT; - - private TNTSpawn(Vector position, AbstractSimulatorEntity entity) { - this.position = position; - this.entity = entity; - show(); - editTNT(spawns); - } - - private TNTSpawn(YAPIONObject yapionObject) { - this.position = new Vector(yapionObject.getPlainValueOrDefault("positionX", 0.0), yapionObject.getPlainValueOrDefault("positionY", 0.0), yapionObject.getPlainValueOrDefault("positionZ", 0.0)); - this.entity = SimulatorEntityShowMode.createEntity(player, position, false); - this.fuseTicks = yapionObject.getPlainValueOrDefault("fuseTicks", 80); - this.count = yapionObject.getPlainValue("count"); - this.tickOffset = yapionObject.getPlainValue("tickOffset"); - this.xVelocity = yapionObject.getPlainValue("xVelocity"); - this.yVelocity = yapionObject.getPlainValue("yVelocity"); - this.zVelocity = yapionObject.getPlainValue("zVelocity"); - this.comparator = yapionObject.getPlainValue("comparator"); - this.material = Material.getMaterial(yapionObject.getPlainValueOrDefault("material", "TNT")); - } - - private YAPIONObject output() { - YAPIONObject yapionObject = new YAPIONObject(); - yapionObject.add("positionX", position.getX()); - yapionObject.add("positionY", position.getY()); - yapionObject.add("positionZ", position.getZ()); - yapionObject.add("fuseTicks", fuseTicks); - yapionObject.add("count", count); - yapionObject.add("tickOffset", tickOffset); - yapionObject.add("xVelocity", xVelocity); - yapionObject.add("yVelocity", yVelocity); - yapionObject.add("zVelocity", zVelocity); - yapionObject.add("comparator", comparator); - yapionObject.add("material", material.name()); - return yapionObject; - } - - private void show() { - if (printed) - return; - printed = true; - entity.display(player); - } - - private void hide() { - if (!printed) - return; - printed = false; - entity.hide(player, false); - } - - private void spawn() { - WORLD.spawn(position.toLocation(WORLD), TNTPrimed.class, tntPrimed -> { - tntPrimed.setFuseTicks(fuseTicks); - if (!xVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setX(0)); - if (!yVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setY(0)); - if (!zVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setZ(0)); - }); - } - - private void setFuseTicks(int fuseTicks) { - if (fuseTicks < 0) fuseTicks = 0; - if (fuseTicks > 160) fuseTicks = 160; - this.fuseTicks = fuseTicks; - } - - private void setCount(int count) { - if (count < 1) count = 1; - if (count > 400) count = 400; - this.count = count; - } - - private int getTickOffset() { - return tickOffset; - } - - private void setTickOffset(int tickOffset) { - if (tickOffset < 0) tickOffset = 0; - if (tickOffset > 400) tickOffset = 400; - this.tickOffset = tickOffset; - } - - @Override - public int compareTo(TNTSpawn tntSpawn) { - return -Integer.compare(tickOffset, tntSpawn.tickOffset); - } - - private void editTNT(Set tntSpawns) { - hide(); - entity.setPosition(position); - show(); - SWInventory swInventory = new SWInventory(player, 54, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_GUI_NAME", player)); - - String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player); - String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player); - List plusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_PIXEL_SHIFT", player)); - List minusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_PIXEL_SHIFT", player)); - List plusOneFiveShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_FIVE_SHIFT", player)); - List minusOneFiveShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_FIVE_SHIFT", player)); - List lore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_LORE", player)); - - // Change Count of spawned TNT - swInventory.setItem(1, new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> { - setCount(count + (clickType.isShiftClick() ? 5 : 1)); - editTNT(tntSpawns); - })); - SWItem countItem = new SWItem(Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_COUNT", player, count), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_COUNT_ANVIL_GUI_NAME", player), count, c -> { - setCount(c); - editTNT(tntSpawns); - }, () -> editTNT(tntSpawns))); - countItem.getItemStack().setAmount(count); - swInventory.setItem(10, countItem); - swInventory.setItem(19, new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> { - setCount(count - (clickType.isShiftClick() ? 5 : 1)); - editTNT(tntSpawns); - })); - - // Change TickOffset - swInventory.setItem(2, new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> { - setTickOffset(tickOffset + (clickType.isShiftClick() ? 5 : 1)); - editTNT(tntSpawns); - })); - SWItem tickItem = new SWItem(SWItem.getMaterial("DIODE"), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK", player, tickOffset), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK_ANVIL_GUI_NAME", player), tickOffset, tick -> { - setTickOffset(tick); - editTNT(tntSpawns); - }, () -> editTNT(tntSpawns))); - tickItem.getItemStack().setAmount(Math.max(tickOffset, 1)); - swInventory.setItem(11, tickItem); - swInventory.setItem(20, new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> { - setTickOffset(tickOffset - (clickType.isShiftClick() ? 5 : 1)); - editTNT(tntSpawns); - })); - - // Change FuseTicks - swInventory.setItem(3, new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> { - setFuseTicks(fuseTicks + (clickType.isShiftClick() ? 5 : 1)); - editTNT(tntSpawns); - })); - SWItem fuseTickItem = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_FUSE", player, fuseTicks), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_FUSE_ANVIL_GUI_NAME", player), fuseTicks, tick -> { - setFuseTicks(tick); - editTNT(tntSpawns); - }, () -> editTNT(tntSpawns))); - fuseTickItem.getItemStack().setAmount(Math.max(fuseTicks, 1)); - swInventory.setItem(12, fuseTickItem); - swInventory.setItem(21, new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> { - setFuseTicks(fuseTicks - (clickType.isShiftClick() ? 5 : 1)); - editTNT(tntSpawns); - })); - - // Velocity Settings - swInventory.setItem(38, Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_NAME", player), clickType -> { - if (xVelocity || yVelocity || zVelocity) { - xVelocity = false; - yVelocity = false; - zVelocity = false; - } else { - xVelocity = true; - yVelocity = true; - zVelocity = true; - } - editTNT(tntSpawns); - }); - swInventory.setItem(46, new SWItem(getWool(xVelocity), getColor(xVelocity), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_X", player, BauSystem.MESSAGE.parse(active(xVelocity), player)), clickType -> { - xVelocity = !xVelocity; - editTNT(tntSpawns); - })); - swInventory.setItem(29, new SWItem(getWool(yVelocity), getColor(yVelocity), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_Y", player, BauSystem.MESSAGE.parse(active(yVelocity), player)), clickType -> { - yVelocity = !yVelocity; - editTNT(tntSpawns); - })); - swInventory.setItem(48, new SWItem(getWool(zVelocity), getColor(zVelocity), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_Z", player, BauSystem.MESSAGE.parse(active(zVelocity), player)), clickType -> { - zVelocity = !zVelocity; - editTNT(tntSpawns); - })); - - // Position Settings - // X Position - swInventory.setItem(5, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - position.add(clickType.isShiftClick() ? X_VECTOR : FX_VECTOR); - editTNT(tntSpawns); - })); - swInventory.setItem(14, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_X", player, position.getX()), lore, false, clickType -> { - changePosition(player, position.getX(), x -> { - position.setX(clamp(x)); - editTNT(tntSpawns); - }, () -> editTNT(tntSpawns)); - })); - swInventory.setItem(23, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - position.subtract(clickType.isShiftClick() ? X_VECTOR : FX_VECTOR); - editTNT(tntSpawns); - })); - - // Y Position - swInventory.setItem(6, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - position.add(clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR); - editTNT(tntSpawns); - })); - swInventory.setItem(15, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Y", player, position.getY()), lore, false, clickType -> { - changePosition(player, position.getY(), y -> { - position.setY(clamp(y)); - editTNT(tntSpawns); - }, () -> editTNT(tntSpawns)); - })); - swInventory.setItem(24, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - position.subtract(clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR); - editTNT(tntSpawns); - })); - - // Z Position - swInventory.setItem(7, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> { - position.add(clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR); - editTNT(tntSpawns); - })); - swInventory.setItem(16, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Z", player, position.getZ()), lore, false, clickType -> { - changePosition(player, position.getZ(), z -> { - position.setZ(clamp(z)); - editTNT(tntSpawns); - }, () -> editTNT(tntSpawns)); - })); - swInventory.setItem(25, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> { - position.subtract(clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR); - editTNT(tntSpawns); - })); - - // Repeater before Comparator - swInventory.setItem(42, new SWItem(comparator ? SWItem.getMaterial("REDSTONE_COMPARATOR_OFF") : SWItem.getMaterial("DIODE"), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVATED_WITH", player, BauSystem.MESSAGE.parse(comparator ? "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_COMPARATOR" : "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_REPEATER", player)), clickType -> { - comparator = !comparator; - editTNT(tntSpawns); - })); - swInventory.setItem(41, new SWItem(material, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_MATERIAL", player), Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_MATERIAL_LORE_1", player, material.name().toLowerCase()), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_MATERIAL_LORE_2", player), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_MATERIAL_LORE_3", player)), false, clickType -> { - if (clickType.isLeftClick()) { - List> swListEntries = new ArrayList<>(); - MATERIALS.forEach(current -> { - swListEntries.add(new SWListInv.SWListEntry<>(new SWItem(current, BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_NAME", player, current.name().toLowerCase()), Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_CLICK", player)), false, ignored -> { - }), current)); - }); - SWListInv swListInv = new SWListInv<>(player, BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_GUI_NAME", player), false, swListEntries, (invClickType, material) -> { - TNTSpawn.this.material = material; - editTNT(tntSpawns); - }); - swListInv.open(); - } else { - material = Material.TNT; - editTNT(tntSpawns); - } - })); - - swInventory.setItem(33, new SWItem(Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ADD_IGNITION_PHASE", player), Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ADD_IGNITION_PHASE_SHIFT", player)), false, clickType -> { - TNTSpawn tntSpawn = new TNTSpawn(position, entity); - if (clickType.isShiftClick()) { - tntSpawn.setTickOffset(tickOffset + 1); - } - tntSpawn.material = material; - spawns.add(tntSpawn); - })); - - swInventory.setItem(53, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> { - showGUI(tntSpawns); - })); - - swInventory.setItem(51, new SWItem(Material.DISPENSER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ADD_TNT", player), clickType -> { - Vector vector = position.clone(); - spawns.add(new TNTSpawn(vector, SimulatorEntityShowMode.createEntity(player, vector, false))); - })); - - // Delete tnt - swInventory.setItem(44, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_REMOVE_TNT", player), clickType -> { - hide(); - spawns.remove(this); - player.closeInventory(); - })); - - swInventory.addCloseCallback(clickType -> { - TNTSimulator.get(player).show(TNTSimulatorListener.trace(player, player.getLocation())); - }); - swInventory.open(); - } - - private void changeCount(Player player, String name, int defaultValue, Consumer result, Runnable failure) { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, name, defaultValue + ""); - swAnvilInv.setItem(Material.PAPER); - swAnvilInv.setCallback(s -> { - try { - result.accept(Integer.parseInt(s)); - } catch (NumberFormatException e) { - failure.run(); - } - }); - swAnvilInv.open(); - } - - private void changePosition(Player player, double defaultValue, Consumer result, Runnable failure) { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_ANVIL_GUI_NAME", player), defaultValue + ""); - swAnvilInv.setItem(Material.PAPER); - swAnvilInv.setCallback(s -> { - try { - result.accept(Double.parseDouble(s.replace(',', '.'))); - } catch (NumberFormatException e) { - failure.run(); - } - }); - swAnvilInv.open(); - } - - private double clamp(double d) { - return (int) (d * 100) * 0.01; - } - - private Material getWool(boolean b) { - return b ? Material.LIME_WOOL : Material.RED_WOOL; - } - - private byte getColor(boolean b) { - return (byte) (b ? 10 : 1); - } - - private String active(boolean b) { - return b ? "SIMULATOR_TNT_SPAWN_VELOCITY_ON" : "SIMULATOR_TNT_SPAWN_VELOCITY_OFF"; - } + TNTElement tntElement = new TNTElement(SimulatorCursor.getPos(player, result)); + tntElementList.add(tntElement); + TNTElementGUI.open(player, tntElement, null); + playerShowMode.forEach((p, simulatorEntityShowMode) -> { + show(p); + }); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java index 206f7419..84d6cb6d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java @@ -1,33 +1,32 @@ /* + * This file is a part of the SteamWar software. * - * This file is a part of the SteamWar software. + * Copyright (C) 2022 SteamWar.de-Serverteam * - * 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 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. * - * 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 . - * / + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.bausystem.features.simulator; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.linkage.Disable; +import de.steamwar.bausystem.features.simulator.gui.SimulatorSelectionGUI; import de.steamwar.bausystem.linkage.LinkageType; import de.steamwar.bausystem.linkage.Linked; import de.steamwar.bausystem.utils.ItemUtils; import org.bukkit.FluidCollisionMode; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -36,7 +35,6 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemHeldEvent; 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.util.BoundingBox; @@ -45,13 +43,11 @@ import org.bukkit.util.Vector; import java.util.function.Function; -import static de.steamwar.bausystem.features.simulator.TNTSimulator.get; - -// @Linked(LinkageType.LISTENER) -// @Linked(LinkageType.DISABLE_LINK) -public class TNTSimulatorListener implements Listener, Disable { +@Linked(LinkageType.LISTENER) +public class TNTSimulatorListener implements Listener { private boolean permissionCheck(Player player) { + if (true) return true; if (!Permission.hasPermission(player, Permission.WORLD)) { BauSystem.MESSAGE.send("SIMULATOR_NO_PERMS", player); return false; @@ -59,7 +55,11 @@ public class TNTSimulatorListener implements Listener, Disable { return true; } - static RayTraceResult trace(Player player, Location to) { + static RayTraceResult trace(Player player, Location to, TNTSimulator simulator) { + if (player.getGameMode() == GameMode.SPECTATOR) { + return null; + } + Location startPos = to.clone().add(0.0, player.getEyeHeight(), 0.0); Vector direction = to.getDirection(); RayTraceResult blocks = player.getWorld().rayTraceBlocks(startPos, direction, 10.0, FluidCollisionMode.NEVER, true); @@ -67,7 +67,7 @@ public class TNTSimulatorListener implements Listener, Disable { Entity nearestHitEntity = null; RayTraceResult nearestHitResult = null; double nearestDistanceSq = Double.MAX_VALUE; - for (Entity entity : get(player).getEntities()) { + for (Entity entity : simulator.getEntities()) { BoundingBox boundingBox = entity.getBoundingBox(); RayTraceResult hitResult = boundingBox.rayTrace(startPos.toVector(), direction, 10.0); if (hitResult != null) { @@ -95,23 +95,24 @@ public class TNTSimulatorListener implements Listener, Disable { @EventHandler public void onPlayerMove(PlayerMoveEvent e) { - simulatorShowHide(e.getPlayer(), PlayerInventory::getItemInMainHand, e.getTo()); + simulatorShowHide(e.getPlayer(), i -> null, PlayerInventory::getItemInMainHand, e.getTo()); } @EventHandler public void onPlayerItemHeld(PlayerItemHeldEvent e) { - simulatorShowHide(e.getPlayer(), i -> i.getItem(e.getNewSlot()), e.getPlayer().getLocation()); + simulatorShowHide(e.getPlayer(), i -> i.getItem(e.getPreviousSlot()), i -> i.getItem(e.getNewSlot()), e.getPlayer().getLocation()); } - private void simulatorShowHide(Player player, Function itemStackFunction, Location location) { - TNTSimulator simulator = get(player); - ItemStack itemStack = itemStackFunction.apply(player.getInventory()); - if (!ItemUtils.isItem(itemStack, "simulator")) { - simulator.hide(); + private void simulatorShowHide(Player player, Function oldItemFunction, Function newItemFunction, Location location) { + TNTSimulator oldSimulator = SimulatorStorage.getSimulator(oldItemFunction.apply(player.getInventory())); + SimulatorCursor.hide(player, oldSimulator); + + TNTSimulator simulator = SimulatorStorage.getSimulator(newItemFunction.apply(player.getInventory())); + if (simulator == null) { return; } - simulator.show(trace(player, location)); + SimulatorCursor.show(player, simulator, trace(player, location, simulator)); } @EventHandler @@ -124,31 +125,26 @@ public class TNTSimulatorListener implements Listener, Disable { if (!permissionCheck(event.getPlayer())) { return; } + TNTSimulator simulator = SimulatorStorage.getSimulator(event.getItem()); switch (event.getAction()) { case LEFT_CLICK_BLOCK: case LEFT_CLICK_AIR: - get(event.getPlayer()).start(); + if (simulator == null) { + return; + } + System.out.println("Left click"); break; case RIGHT_CLICK_BLOCK: case RIGHT_CLICK_AIR: - get(event.getPlayer()).edit(trace(event.getPlayer(), event.getPlayer().getLocation())); + if (simulator == null) { + SimulatorSelectionGUI.open(event.getPlayer(), event.getItem()); + } else { + simulator.edit(event.getPlayer(), trace(event.getPlayer(), event.getPlayer().getLocation(), simulator)); + } break; default: break; } } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - get(event.getPlayer()).save(); - get(event.getPlayer()).remove(); - } - - @Override - public void disable() { - for (TNTSimulator simulator : TNTSimulator.TNT_SIMULATOR_MAP.values()) { - simulator.save(); - } - } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/SimulatorSelectionGUI.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSelectionGUI.java similarity index 92% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/SimulatorSelectionGUI.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSelectionGUI.java index 1ff4a4aa..bdb1f6ee 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/SimulatorSelectionGUI.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/SimulatorSelectionGUI.java @@ -17,11 +17,11 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulatorn.gui; +package de.steamwar.bausystem.features.simulator.gui; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulatorn.SimulatorStorage; -import de.steamwar.bausystem.features.simulatorn.TNTSimulator; +import de.steamwar.bausystem.features.simulator.SimulatorStorage; +import de.steamwar.bausystem.features.simulator.TNTSimulator; import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWListInv; import lombok.experimental.UtilityClass; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTElementGUI.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java similarity index 97% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTElementGUI.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java index 1f07cb45..29412935 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTElementGUI.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java @@ -17,14 +17,14 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulatorn.gui; +package de.steamwar.bausystem.features.simulator.gui; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulatorn.OrderUtils; -import de.steamwar.bausystem.features.simulatorn.SimulatorStorage; -import de.steamwar.bausystem.features.simulatorn.TNTSimulator; -import de.steamwar.bausystem.features.simulatorn.tnt.TNTElement; -import de.steamwar.bausystem.features.simulatorn.tnt.TNTGroup; +import de.steamwar.bausystem.features.simulator.OrderUtils; +import de.steamwar.bausystem.features.simulator.SimulatorStorage; +import de.steamwar.bausystem.features.simulator.TNTSimulator; +import de.steamwar.bausystem.features.simulator.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.tnt.TNTGroup; import de.steamwar.inventory.SWAnvilInv; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; @@ -101,6 +101,10 @@ public class TNTElementGUI { otherLore.add(""); otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVATED_WITH", player, BauSystem.MESSAGE.parse(OrderUtils.name(tntElement.getOrder()), player))); otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_NAME_LORE", player, tntElement.getMaterial().name())); + if (tntElement.isDisabled()) { + otherLore.add(""); + otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_DISABLED", player)); + } inv.setItem(24, new SWItem(Material.ANVIL, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_OTHER", player), otherLore, false, clickType -> { editOther(player, tntElement, () -> open(player, tntElement, back)); })); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTSimulatorGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTSimulatorGui.java new file mode 100644 index 00000000..8731af59 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTSimulatorGui.java @@ -0,0 +1,82 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 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.bausystem.features.simulator.gui; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.features.simulator.TNTSimulator; +import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; +import de.steamwar.bausystem.features.simulator.tnt.TNTElement; +import de.steamwar.bausystem.features.simulator.tnt.TNTGroup; +import de.steamwar.inventory.SWItem; +import de.steamwar.inventory.SWListInv; +import lombok.experimental.UtilityClass; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +@UtilityClass +public class TNTSimulatorGui { + + public void open(Player player, TNTSimulator currentTntSimulator, TNTGroup currentTntGroup, List simulatorElements, Runnable back) { + List> swListEntryList = new ArrayList<>(); + + for (SimulatorElement element : simulatorElements) { + swListEntryList.add(new SWListInv.SWListEntry<>(element.menu(player), element)); + } + + SWListInv inv = new SWListInv<>(player, BauSystem.MESSAGE.parse("SIMULATOR_GUI_NAME", player), false, swListEntryList, (clickType, simulatorElement) -> { + if (simulatorElement instanceof TNTGroup) { + TNTGroup tntGroup = (TNTGroup) simulatorElement; + List elements = new ArrayList<>(tntGroup.getElements()); + open(player, null, tntGroup, elements, () -> open(player, currentTntSimulator, currentTntGroup, simulatorElements, back)); + } else { + TNTElementGUI.open(player, (TNTElement) simulatorElement, () -> open(player, currentTntSimulator, currentTntGroup, simulatorElements, back)); + } + }); + if (back != null) { + inv.setItem(47, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); + } + if (currentTntSimulator != null) { + inv.setItem(49, new SWItem(Material.MAGENTA_GLAZED_TERRACOTTA, BauSystem.MESSAGE.parse("SIMULATOR_GUI_MOVE_ALL", player), clickType -> { + })); + } + if (currentTntGroup != null) { + List otherLore = new ArrayList<>(); + otherLore.add(""); + otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_X", player, currentTntGroup.getPosition().getX())); + otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Y", player, currentTntGroup.getPosition().getY())); + otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Z", player, currentTntGroup.getPosition().getZ())); + otherLore.add(""); + otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_MATERIAL_NAME_LORE", player, currentTntGroup.getMaterial().name())); + otherLore.add(""); + otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK", player, currentTntGroup.getTickOffset())); + if (currentTntGroup.isDisabled()) { + otherLore.add(""); + otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_GUI_TNT_DISABLED", player)); + } + inv.setItem(51, new SWItem(Material.ANVIL, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_OTHER", player), otherLore, false, clickType -> { + })); + } + + inv.open(); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/show/SimulatorEntityShowMode.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/show/SimulatorEntityShowMode.java index 1753826e..8cdb228c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/show/SimulatorEntityShowMode.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/show/SimulatorEntityShowMode.java @@ -1,3 +1,5 @@ +package de.steamwar.bausystem.features.simulator.show; + /* * This file is a part of the SteamWar software. * @@ -17,9 +19,8 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulator.show; - import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity; +import de.steamwar.bausystem.features.simulator.SimulatorStorage; import de.steamwar.bausystem.shared.Position; import de.steamwar.bausystem.shared.RoundedPosition; import de.steamwar.bausystem.shared.ShowMode; @@ -43,12 +44,23 @@ public class SimulatorEntityShowMode implements ShowMode { @Override public void show(Position position) { RoundedPosition roundedPosition = new RoundedPosition(position); - AbstractSimulatorEntity entity = entityMap.computeIfAbsent(roundedPosition, pos -> createEntity(player, position.getLocation(), false)); + AbstractSimulatorEntity entity = entityMap.computeIfAbsent(roundedPosition, pos -> createEntity(position.getLocation(), false)); entity.display(player); } - public static AbstractSimulatorEntity createEntity(Player player, Vector position, boolean highlight) { - return NMSWrapper.impl.createSimulator(player.getWorld(), position, highlight); + public static AbstractSimulatorEntity createEntity(Vector position, boolean highlight) { + return NMSWrapper.impl.createSimulator(SimulatorStorage.WORLD, position, highlight); + } + + public void hide(Position position) { + RoundedPosition roundedPosition = new RoundedPosition(position); + AbstractSimulatorEntity abstractSimulatorEntity = entityMap.get(roundedPosition); + if (abstractSimulatorEntity == null) { + return; + } + if (abstractSimulatorEntity.hide(player, false)) { + entityMap.remove(roundedPosition); + } } @Override diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/SimulatorElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java similarity index 95% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/SimulatorElement.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java index 96685764..3147f208 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/SimulatorElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulatorn.tnt; +package de.steamwar.bausystem.features.simulator.tnt; -import de.steamwar.bausystem.features.simulatorn.show.SimulatorEntityShowMode; +import de.steamwar.bausystem.features.simulator.show.SimulatorEntityShowMode; import de.steamwar.bausystem.shared.Pair; import de.steamwar.inventory.SWItem; import org.bukkit.entity.Entity; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java similarity index 96% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTElement.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java index 4dd2db42..47da79e7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java @@ -17,13 +17,13 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulatorn.tnt; +package de.steamwar.bausystem.features.simulator.tnt; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity; -import de.steamwar.bausystem.features.simulatorn.OrderUtils; -import de.steamwar.bausystem.features.simulatorn.SimulatorStorage; -import de.steamwar.bausystem.features.simulatorn.show.SimulatorEntityShowMode; +import de.steamwar.bausystem.features.simulator.OrderUtils; +import de.steamwar.bausystem.features.simulator.SimulatorStorage; +import de.steamwar.bausystem.features.simulator.show.SimulatorEntityShowMode; import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.shared.Position; import de.steamwar.inventory.SWItem; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTGroup.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java similarity index 97% rename from BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTGroup.java rename to BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java index 6809aa9f..f660f6c7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTGroup.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java @@ -17,10 +17,10 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.features.simulatorn.tnt; +package de.steamwar.bausystem.features.simulator.tnt; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulatorn.show.SimulatorEntityShowMode; +import de.steamwar.bausystem.features.simulator.show.SimulatorEntityShowMode; import de.steamwar.bausystem.shared.Pair; import de.steamwar.inventory.SWItem; import lombok.Getter; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorCommand.java deleted file mode 100644 index cfc083de..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/SimulatorCommand.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.bausystem.features.simulatorn; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.features.simulatorn.gui.SimulatorSelectionGUI; -import de.steamwar.bausystem.linkage.LinkageType; -import de.steamwar.bausystem.linkage.Linked; -import de.steamwar.bausystem.utils.ItemUtils; -import de.steamwar.command.GuardCheckType; -import de.steamwar.command.GuardChecker; -import de.steamwar.command.GuardResult; -import de.steamwar.command.SWCommand; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -@Linked(LinkageType.COMMAND) -public class SimulatorCommand extends SWCommand { - - public SimulatorCommand() { - super("simulator", "sim"); - } - - @Register(description = "SIMULATOR_HELP") - public void genericCommand(@Guard Player p) { - SimulatorCursor.hide(p, null); - SWUtils.giveItemToPlayer(p, SimulatorStorage.getWand(p)); - } - - @Register(value = "change", description = "SIMULATOR_CHANGE_HELP") - public void change(@Guard Player p) { - ItemStack itemStack = p.getInventory().getItemInMainHand(); - if (!ItemUtils.isItem(itemStack, "simulator")) { - BauSystem.MESSAGE.send("SIMULATOR_NO_SIM_IN_HAND", p); - return; - } - SimulatorSelectionGUI.open(p, itemStack); - } - - @Register(value = "create", description = "SIMULATOR_CREATE_HELP") - public void create(@Guard Player p, String name) { - if (SimulatorStorage.getSimulatorNames().contains(name)) { - BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", p); - return; - } - SimulatorStorage.createNewSimulator(name); - BauSystem.MESSAGE.send("SIMULATOR_CREATE", p); - } - - @ClassGuard(value = Player.class, local = true) - public GuardChecker guardChecker() { - return (commandSender, guardCheckType, strings, s) -> { - Player player = (Player) commandSender; - if (Permission.hasPermission(player, Permission.WORLD)) { - return GuardResult.ALLOWED; - } - if (guardCheckType != GuardCheckType.TAB_COMPLETE) { - BauSystem.MESSAGE.send("SIMULATOR_NO_PERMS", player); - } - return GuardResult.DENIED; - }; - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/TNTSimulator.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/TNTSimulator.java deleted file mode 100644 index 44c48a58..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/TNTSimulator.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.bausystem.features.simulatorn; - -import de.steamwar.bausystem.features.simulatorn.gui.TNTElementGUI; -import de.steamwar.bausystem.features.simulatorn.gui.TNTSimulatorGui; -import de.steamwar.bausystem.features.simulatorn.show.SimulatorEntityShowMode; -import de.steamwar.bausystem.features.simulatorn.tnt.SimulatorElement; -import de.steamwar.bausystem.features.simulatorn.tnt.TNTElement; -import de.steamwar.bausystem.features.simulatorn.tnt.TNTGroup; -import lombok.Getter; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.util.RayTraceResult; -import yapion.hierarchy.types.YAPIONArray; -import yapion.hierarchy.types.YAPIONObject; -import yapion.hierarchy.types.YAPIONType; - -import java.util.*; -import java.util.stream.Collectors; - -@Getter -public class TNTSimulator { - - private Map playerShowMode = new HashMap<>(); - - private Material material = Material.TNT; - - private List tntElementList = new ArrayList<>(); - - public TNTSimulator() { - - } - - public TNTSimulator(YAPIONObject yapionObject) { - material = Material.valueOf(yapionObject.getStringOrDefault("material", Material.TNT.name())); - YAPIONArray yapionArray = yapionObject.getArrayOrDefault("tntElements", new YAPIONArray()); - for (YAPIONObject element : yapionArray.streamObject().collect(Collectors.toList())) { - if (element.containsKey("elements", YAPIONType.ARRAY)) { - tntElementList.add(new TNTGroup(element)); - } else { - tntElementList.add(new TNTElement(element)); - } - } - } - - public YAPIONObject toYAPION() { - YAPIONObject yapionObject = new YAPIONObject(); - yapionObject.add("material", material.name()); - YAPIONArray yapionArray = new YAPIONArray(); - for (SimulatorElement element : tntElementList) { - yapionArray.add(element.toYAPION()); - } - yapionObject.add("tntElements", yapionArray); - return yapionObject; - } - - public void hide(Player player) { - SimulatorEntityShowMode showMode = playerShowMode.get(player); - if (showMode == null) { - return; - } - tntElementList.forEach(simulatorElement -> { - simulatorElement.hide(showMode); - }); - } - - public void remove(Player player) { - SimulatorEntityShowMode showMode = playerShowMode.remove(player); - if (showMode == null) { - return; - } - tntElementList.forEach(simulatorElement -> { - simulatorElement.hide(showMode); - }); - } - - public void hide(Player player, List simulatorElements) { - SimulatorEntityShowMode showMode = playerShowMode.get(player); - if (showMode == null) { - return; - } - simulatorElements.forEach(simulatorElement -> { - simulatorElement.hide(showMode); - }); - } - - public void hide(TNTElement tntElement) { - playerShowMode.forEach((player, simulatorEntityShowMode) -> { - tntElement.hide(simulatorEntityShowMode); - }); - } - - public void show(Player player) { - SimulatorEntityShowMode showMode = playerShowMode.computeIfAbsent(player, SimulatorEntityShowMode::new); - tntElementList.forEach(simulatorElement -> { - simulatorElement.show(showMode); - }); - } - - public void show(TNTElement tntElement) { - playerShowMode.forEach((player, simulatorEntityShowMode) -> { - tntElement.show(simulatorEntityShowMode); - }); - } - - public List getEntities() { - return tntElementList.stream().flatMap(element -> element.getEntities().stream()).collect(Collectors.toList()); - } - - public List getEntity(Entity entity) { - List tntSpawns = new ArrayList<>(); - for (SimulatorElement spawn : tntElementList) { - spawn.getEntity(tntSpawns, entity); - } - return tntSpawns; - } - - public void remove(TNTElement tntElement) { - hide(tntElement); - tntElementList.remove(tntElement); - Set toRemove = new HashSet<>(); - for (SimulatorElement spawn : tntElementList) { - spawn.remove(tntElement); - if (spawn instanceof TNTGroup) { - if (((TNTGroup) spawn).getElements().isEmpty()) { - toRemove.add(spawn); - } - } - } - tntElementList.removeAll(toRemove); - tntElement.close(); - } - - public void edit(Player player, RayTraceResult result) { - if (result == null) { - TNTSimulatorGui.open(player, vector -> { - - }, null, getTntElementList(), null); - return; - } - - SimulatorCursor.show(player, this, result); - - if (result.getHitEntity() != null) { - List elements = getEntity(result.getHitEntity()); - if (elements.isEmpty()) return; - - if (elements.size() == 1) { - TNTElementGUI.open(player, (TNTElement) elements.get(0), null); - } else { - TNTSimulatorGui.open(player, null, null, elements, null); - } - return; - } - - TNTElement tntElement = new TNTElement(SimulatorCursor.getPos(player, result)); - tntElementList.add(tntElement); - TNTElementGUI.open(player, tntElement, null); - playerShowMode.forEach((p, simulatorEntityShowMode) -> { - show(p); - }); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/TNTSimulatorListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/TNTSimulatorListener.java deleted file mode 100644 index e98a6ae9..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/TNTSimulatorListener.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.bausystem.features.simulatorn; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.features.simulatorn.gui.SimulatorSelectionGUI; -import de.steamwar.bausystem.linkage.LinkageType; -import de.steamwar.bausystem.linkage.Linked; -import de.steamwar.bausystem.utils.ItemUtils; -import org.bukkit.FluidCollisionMode; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerItemHeldEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.util.BoundingBox; -import org.bukkit.util.RayTraceResult; -import org.bukkit.util.Vector; - -import java.util.function.Function; - -@Linked(LinkageType.LISTENER) -public class TNTSimulatorListener implements Listener { - - private boolean permissionCheck(Player player) { - if (true) return true; - if (!Permission.hasPermission(player, Permission.WORLD)) { - BauSystem.MESSAGE.send("SIMULATOR_NO_PERMS", player); - return false; - } - return true; - } - - static RayTraceResult trace(Player player, Location to, TNTSimulator simulator) { - if (player.getGameMode() == GameMode.SPECTATOR) { - return null; - } - - Location startPos = to.clone().add(0.0, player.getEyeHeight(), 0.0); - Vector direction = to.getDirection(); - RayTraceResult blocks = player.getWorld().rayTraceBlocks(startPos, direction, 10.0, FluidCollisionMode.NEVER, true); - - Entity nearestHitEntity = null; - RayTraceResult nearestHitResult = null; - double nearestDistanceSq = Double.MAX_VALUE; - for (Entity entity : simulator.getEntities()) { - BoundingBox boundingBox = entity.getBoundingBox(); - RayTraceResult hitResult = boundingBox.rayTrace(startPos.toVector(), direction, 10.0); - if (hitResult != null) { - double distanceSq = startPos.toVector().distanceSquared(hitResult.getHitPosition()); - if (distanceSq < nearestDistanceSq) { - nearestHitEntity = entity; - nearestHitResult = hitResult; - nearestDistanceSq = distanceSq; - } - } - } - RayTraceResult entities = nearestHitEntity == null ? null : new RayTraceResult(nearestHitResult.getHitPosition(), nearestHitEntity, nearestHitResult.getHitBlockFace()); - - if (blocks == null) { - return entities; - } else if (entities == null) { - return blocks; - } else { - Vector startVec = startPos.toVector(); - double blockHitDistance = startVec.distance(blocks.getHitPosition()); - double entityHitDistanceSquared = startVec.distanceSquared(entities.getHitPosition()); - return entityHitDistanceSquared < blockHitDistance * blockHitDistance ? entities : blocks; - } - } - - @EventHandler - public void onPlayerMove(PlayerMoveEvent e) { - simulatorShowHide(e.getPlayer(), i -> null, PlayerInventory::getItemInMainHand, e.getTo()); - } - - @EventHandler - public void onPlayerItemHeld(PlayerItemHeldEvent e) { - simulatorShowHide(e.getPlayer(), i -> i.getItem(e.getPreviousSlot()), i -> i.getItem(e.getNewSlot()), e.getPlayer().getLocation()); - } - - private void simulatorShowHide(Player player, Function oldItemFunction, Function newItemFunction, Location location) { - TNTSimulator oldSimulator = SimulatorStorage.getSimulator(oldItemFunction.apply(player.getInventory())); - SimulatorCursor.hide(player, oldSimulator); - - TNTSimulator simulator = SimulatorStorage.getSimulator(newItemFunction.apply(player.getInventory())); - if (simulator == null) { - return; - } - - SimulatorCursor.show(player, simulator, trace(player, location, simulator)); - } - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - if (!ItemUtils.isItem(event.getItem(), "simulator")) { - return; - } - - event.setCancelled(true); - if (!permissionCheck(event.getPlayer())) { - return; - } - TNTSimulator simulator = SimulatorStorage.getSimulator(event.getItem()); - - switch (event.getAction()) { - case LEFT_CLICK_BLOCK: - case LEFT_CLICK_AIR: - if (simulator == null) { - return; - } - System.out.println("Left click"); - break; - case RIGHT_CLICK_BLOCK: - case RIGHT_CLICK_AIR: - if (simulator == null) { - SimulatorSelectionGUI.open(event.getPlayer(), event.getItem()); - } else { - simulator.edit(event.getPlayer(), trace(event.getPlayer(), event.getPlayer().getLocation(), simulator)); - } - break; - default: - break; - } - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTSimulatorGui.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTSimulatorGui.java deleted file mode 100644 index 4464966d..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTSimulatorGui.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 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.bausystem.features.simulatorn.gui; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulatorn.tnt.SimulatorElement; -import de.steamwar.bausystem.features.simulatorn.tnt.TNTElement; -import de.steamwar.bausystem.features.simulatorn.tnt.TNTGroup; -import de.steamwar.inventory.SWItem; -import de.steamwar.inventory.SWListInv; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -@UtilityClass -public class TNTSimulatorGui { - - public void open(Player player, Consumer moveAll, Consumer materialChanger, List simulatorElements, Runnable back) { - List> swListEntryList = new ArrayList<>(); - - for (SimulatorElement element : simulatorElements) { - swListEntryList.add(new SWListInv.SWListEntry<>(element.menu(player), element)); - } - - SWListInv inv = new SWListInv<>(player, BauSystem.MESSAGE.parse("SIMULATOR_GUI_NAME", player), false, swListEntryList, (clickType, simulatorElement) -> { - if (simulatorElement instanceof TNTGroup) { - TNTGroup tntGroup = (TNTGroup) simulatorElement; - List elements = new ArrayList<>(tntGroup.getElements()); - open(player, vector -> { - - }, material -> {}, elements, () -> open(player, moveAll, materialChanger, simulatorElements, back)); - } else { - TNTElementGUI.open(player, (TNTElement) simulatorElement, () -> open(player, moveAll, materialChanger, simulatorElements, back)); - } - }); - if (back != null) { - inv.setItem(47, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run())); - } - - // TODO: Add button - - inv.open(); - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/show/SimulatorEntityShowMode.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/show/SimulatorEntityShowMode.java deleted file mode 100644 index 2e73405e..00000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/show/SimulatorEntityShowMode.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.steamwar.bausystem.features.simulatorn.show; - -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 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 . - */ - -import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity; -import de.steamwar.bausystem.features.simulatorn.SimulatorStorage; -import de.steamwar.bausystem.shared.Position; -import de.steamwar.bausystem.shared.RoundedPosition; -import de.steamwar.bausystem.shared.ShowMode; -import de.steamwar.bausystem.utils.NMSWrapper; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; - -import java.util.HashMap; -import java.util.Map; - -public class SimulatorEntityShowMode implements ShowMode { - - protected final Player player; - - private final Map entityMap = new HashMap<>(); - - public SimulatorEntityShowMode(Player player) { - this.player = player; - } - - @Override - public void show(Position position) { - RoundedPosition roundedPosition = new RoundedPosition(position); - AbstractSimulatorEntity entity = entityMap.computeIfAbsent(roundedPosition, pos -> createEntity(position.getLocation(), false)); - entity.display(player); - } - - public static AbstractSimulatorEntity createEntity(Vector position, boolean highlight) { - return NMSWrapper.impl.createSimulator(SimulatorStorage.WORLD, position, highlight); - } - - public void hide(Position position) { - RoundedPosition roundedPosition = new RoundedPosition(position); - AbstractSimulatorEntity abstractSimulatorEntity = entityMap.get(roundedPosition); - if (abstractSimulatorEntity == null) { - return; - } - if (abstractSimulatorEntity.hide(player, false)) { - entityMap.remove(roundedPosition); - } - } - - @Override - public void hide() { - entityMap.forEach((roundedPosition, abstractTraceEntity) -> abstractTraceEntity.hide(player, true)); - entityMap.clear(); - } -}