diff --git a/BauSystem_Main/src/BauSystem.properties b/BauSystem_Main/src/BauSystem.properties index 8193121a..f4b018be 100644 --- a/BauSystem_Main/src/BauSystem.properties +++ b/BauSystem_Main/src/BauSystem.properties @@ -592,10 +592,13 @@ SIMULATOR_TNT_SPAWN_VELOCITY_OFF = §coff SIMULATOR_TNT_SPAWN_POSITION_X = §7x-Position §8- §e{0} SIMULATOR_TNT_SPAWN_POSITION_Y = §7y-Position §8- §e{0} SIMULATOR_TNT_SPAWN_POSITION_Z = §7z-Position §8- §e{0} +SIMULATOR_TNT_SPAWN_ACTIVATED_NAME = §7Primed by SIMULATOR_TNT_SPAWN_ACTIVATED_WITH = §7Primed by §8- §e{0} SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_COMPARATOR = Comparator SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_REPEATER = Repeater SIMULATOR_TNT_SPAWN_ACTIVATED_UNKNOWN = Unknown +SIMULATOR_TNT_SPAWN_INACTIVE = §7> §7{0} +SIMULATOR_TNT_SPAWN_ACTIVE = §e> §7{0} SIMULATOR_TNT_SPAWN_MATERIAL = §eMaterial SIMULATOR_TNT_SPAWN_MATERIAL_LORE_1 = §7Current material§8: §e{0} SIMULATOR_TNT_SPAWN_MATERIAL_LORE_2 = §eLeft-Click §7to change diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/OrderUtils.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/OrderUtils.java new file mode 100644 index 00000000..07e2410d --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/OrderUtils.java @@ -0,0 +1,93 @@ +/* + * 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 lombok.experimental.UtilityClass; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@UtilityClass +public class OrderUtils { + + private final List activationOrder = new ArrayList<>(); + + private final Map nameMap = new HashMap<>(); + private final Map reverseActivationOrderLookupTable = new HashMap<>(); + + static { + add(Material.REPEATER, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_REPEATER"); + add(Material.COMPARATOR, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_COMPARATOR"); + } + + public Material next(Material material) { + int index = activationOrder.indexOf(material); + if (index == -1) { + return activationOrder.get(0); + } + if (index + 1 >= activationOrder.size()) { + return activationOrder.get(0); + } + return activationOrder.get(index + 1); + } + + public Material previous(Material material) { + int index = activationOrder.indexOf(material); + if (index == -1) { + return activationOrder.get(0); + } + if (index - 1 < 0) { + return activationOrder.get(activationOrder.size() - 1); + } + return activationOrder.get(index - 1); + } + + public List orderList(Material material, Player player) { + List lore = new ArrayList<>(); + for (Material m : activationOrder) { + String element = BauSystem.MESSAGE.parse(name(m), player); + if (m == material) { + lore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVE", player, element)); + } else { + lore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_INACTIVE", player, element)); + } + } + return lore; + } + + public int order(Material material) { + return activationOrder.indexOf(material); + } + + public String name(Material material) { + return nameMap.getOrDefault(material, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_UNKNOWN"); + } + + private void add(Material material, String name) { + activationOrder.add(material); + reverseActivationOrderLookupTable.put(activationOrder.size() - 1, material); + nameMap.put(material, name); + } +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTElementGUI.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTElementGUI.java index 2219ceed..ff020a86 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTElementGUI.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/gui/TNTElementGUI.java @@ -20,6 +20,7 @@ package de.steamwar.bausystem.features.simulatorn.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; @@ -96,7 +97,7 @@ public class TNTElementGUI { List otherLore = new ArrayList<>(); otherLore.add(""); - otherLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVATED_WITH", player, activationType(player, tntElement.getOrder()))); + 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())); inv.setItem(24, new SWItem(Material.ANVIL, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_OTHER", player), otherLore, false, clickType -> { editOther(player, tntElement, () -> open(player, tntElement, back)); @@ -192,6 +193,12 @@ public class TNTElementGUI { if (tntSimulator != null) tntSimulator.show(tntElement); tntElement.change(); })); + + // Alignment + /* + inv.setItem(24, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("", player), clickType -> { + })); + */ }; editObserver.run(); tntElement.register(editObserver); @@ -304,7 +311,14 @@ public class TNTElementGUI { } Runnable editObserver = () -> { - + inv.setItem(42, new SWItem(tntElement.getOrder(), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVATED_NAME", player), OrderUtils.orderList(tntElement.getOrder(), player), false, clickType -> { + if (clickType.isShiftClick()) { + tntElement.setOrder(OrderUtils.previous(tntElement.getOrder())); + } else { + tntElement.setOrder(OrderUtils.next(tntElement.getOrder())); + } + tntElement.change(); + })); }; editObserver.run(); tntElement.register(editObserver); @@ -317,22 +331,6 @@ public class TNTElementGUI { return active ? BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_ON", p) : BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_OFF", p); } - private String activationType(Player p, int order) { - String s; - switch (order) { - case 0: - s = "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_REPEATER"; - break; - case 1: - s = "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_COMPARATOR"; - break; - default: - s = "SIMULATOR_TNT_SPAWN_ACTIVATED_UNKNOWN"; - break; - } - return BauSystem.MESSAGE.parse(s, p); - } - private Material getWool(boolean b) { return b ? Material.LIME_WOOL : Material.RED_WOOL; } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTElement.java index eae9a4ee..ca98e215 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulatorn/tnt/TNTElement.java @@ -21,6 +21,7 @@ package de.steamwar.bausystem.features.simulatorn.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.shared.Pair; @@ -56,7 +57,7 @@ public class TNTElement implements SimulatorElement { @Setter private boolean zVelocity = false; - private int order = 0; + private Material order = Material.REPEATER; private Material material = Material.TNT; private boolean disabled = false; @@ -74,7 +75,11 @@ public class TNTElement implements SimulatorElement { this.xVelocity = yapionObject.getBooleanOrDefault("xVelocity", false); this.yVelocity = yapionObject.getBooleanOrDefault("yVelocity", false); this.zVelocity = yapionObject.getBooleanOrDefault("zVelocity", false); - this.order = yapionObject.getIntOrDefault("order", yapionObject.getBooleanOrDefault("comparator", false) ? 1 : 0); + if (yapionObject.containsKey("order", Integer.class)) { + this.order = yapionObject.getIntOrDefault("order", 0) == 0 ? Material.REPEATER : Material.COMPARATOR; + } else { + this.order = Material.valueOf(yapionObject.getStringOrDefault("order", yapionObject.getBooleanOrDefault("comparator", false) ? Material.COMPARATOR.name() : Material.REPEATER.name())); + } this.material = Material.valueOf(yapionObject.getStringOrDefault("material", Material.TNT.name())); } @@ -90,7 +95,7 @@ public class TNTElement implements SimulatorElement { yapionObject.add("xVelocity", xVelocity); yapionObject.add("yVelocity", yVelocity); yapionObject.add("zVelocity", zVelocity); - yapionObject.add("order", order); + yapionObject.add("order", order.name()); yapionObject.add("material", material.name()); return yapionObject; } @@ -160,7 +165,7 @@ public class TNTElement implements SimulatorElement { public void locations(Map>> result) { if (disabled) return; result.computeIfAbsent(getTickOffset(), ignore -> new HashMap<>()) - .computeIfAbsent(order, ignore -> new Pair<>(() -> { + .computeIfAbsent(OrderUtils.order(order), ignore -> new Pair<>(() -> { SimulatorStorage.WORLD.spawn(getPosition().toLocation(SimulatorStorage.WORLD), TNTPrimed.class, tntPrimed -> { tntPrimed.setFuseTicks(fuseTicks); if (!xVelocity) tntPrimed.setVelocity(tntPrimed.getVelocity().setX(0)); @@ -209,4 +214,8 @@ public class TNTElement implements SimulatorElement { } return new Vector(0, 0, 0); } + + public void setOrder(Material material) { + this.order = material; + } }