Add edit properties menu and edit location menu
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful
Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
Ursprung
804afe9cb7
Commit
11560865a8
@ -106,6 +106,12 @@ public class TNTSimulator {
|
||||
});
|
||||
}
|
||||
|
||||
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 -> {
|
||||
@ -113,6 +119,12 @@ public class TNTSimulator {
|
||||
});
|
||||
}
|
||||
|
||||
public void show(TNTElement tntElement) {
|
||||
playerShowMode.forEach((player, simulatorEntityShowMode) -> {
|
||||
tntElement.show(simulatorEntityShowMode);
|
||||
});
|
||||
}
|
||||
|
||||
public List<Entity> getEntities() {
|
||||
return tntElementList.stream().flatMap(element -> element.getEntities().stream()).collect(Collectors.toList());
|
||||
}
|
||||
@ -129,7 +141,7 @@ public class TNTSimulator {
|
||||
if (result == null) {
|
||||
TNTSimulatorGui.open(player, vector -> {
|
||||
|
||||
}, getTntElementList(), null);
|
||||
}, null, getTntElementList(), null);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -142,7 +154,7 @@ public class TNTSimulator {
|
||||
if (elements.size() == 1) {
|
||||
TNTElementGUI.open(player, (TNTElement) elements.get(0), null);
|
||||
} else {
|
||||
TNTSimulatorGui.open(player, null, elements, null);
|
||||
TNTSimulatorGui.open(player, null, null, elements, null);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ import java.util.function.Function;
|
||||
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;
|
||||
|
@ -20,19 +20,41 @@
|
||||
package de.steamwar.bausystem.features.simulatorn.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.simulatorn.tnt.TNTElement;
|
||||
import de.steamwar.inventory.SWAnvilInv;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Consumer;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@UtilityClass
|
||||
public class TNTElementGUI {
|
||||
|
||||
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 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 static final List<Material> MATERIALS = new ArrayList<>();
|
||||
static {
|
||||
Arrays.stream(Material.values())
|
||||
.filter(Material::isItem)
|
||||
.filter(material -> !material.isLegacy())
|
||||
.forEach(MATERIALS::add);
|
||||
}
|
||||
|
||||
private SWInventory open(Player player, String name) {
|
||||
SWInventory inv = new SWInventory(player, 45, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_GUI_NAME", player, name));
|
||||
SWItem gray = new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§f", clickType -> {});
|
||||
@ -49,6 +71,7 @@ public class TNTElementGUI {
|
||||
inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run()));
|
||||
}
|
||||
|
||||
Runnable editObserver = () -> {
|
||||
List<String> locationLore = new ArrayList<>();
|
||||
locationLore.add("");
|
||||
locationLore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_X", player, tntElement.getPosition().getX()));
|
||||
@ -78,6 +101,10 @@ public class TNTElementGUI {
|
||||
inv.setItem(24, new SWItem(Material.ANVIL, BauSystem.MESSAGE.parse("SIMULATOR_EDIT_OTHER", player), otherLore, false, clickType -> {
|
||||
editOther(player, tntElement, () -> open(player, tntElement, back));
|
||||
}));
|
||||
};
|
||||
editObserver.run();
|
||||
tntElement.register(editObserver);
|
||||
inv.addCloseRunnable(() -> tntElement.unregister(editObserver));
|
||||
|
||||
inv.open();
|
||||
}
|
||||
@ -88,6 +115,88 @@ public class TNTElementGUI {
|
||||
inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run()));
|
||||
}
|
||||
|
||||
String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player);
|
||||
String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player);
|
||||
List<String> plusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_PIXEL_SHIFT", player));
|
||||
List<String> minusOnePixelShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_PIXEL_SHIFT", player));
|
||||
List<String> lore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_LORE", player));
|
||||
|
||||
Runnable editObserver = () -> {
|
||||
TNTSimulator tntSimulator = SimulatorStorage.getSimulator(player.getInventory().getItemInMainHand());
|
||||
|
||||
// X Position
|
||||
inv.setItem(10, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().add(clickType.isShiftClick() ? X_VECTOR : FX_VECTOR);
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
}));
|
||||
inv.setItem(19, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_X", player, tntElement.getPosition().getX()), lore, false, clickType -> {
|
||||
changePosition(player, tntElement.getPosition().getX(), x -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().setX(clamp(x - tntElement.getParentPosition().getX()));
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
editLocation(player, tntElement, back);
|
||||
}, () -> editLocation(player, tntElement, back));
|
||||
}));
|
||||
inv.setItem(28, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().subtract(clickType.isShiftClick() ? X_VECTOR : FX_VECTOR);
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
}));
|
||||
|
||||
// Y Position
|
||||
inv.setItem(11, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().add(clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR);
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
}));
|
||||
inv.setItem(20, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Y", player, tntElement.getPosition().getY()), lore, false, clickType -> {
|
||||
changePosition(player, tntElement.getPosition().getY(), y -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().setY(clamp(y - tntElement.getParentPosition().getY()));
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
editLocation(player, tntElement, back);
|
||||
}, () -> editLocation(player, tntElement, back));
|
||||
}));
|
||||
inv.setItem(29, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().subtract(clickType.isShiftClick() ? Y_VECTOR : FY_VECTOR);
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
}));
|
||||
|
||||
// Z Position
|
||||
inv.setItem(12, new SWItem(SWItem.getDye(10), plusOneName, plusOnePixelShiftLore, false, clickType -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().add(clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR);
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
}));
|
||||
inv.setItem(21, new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_POSITION_Z", player, tntElement.getPosition().getZ()), lore, false, clickType -> {
|
||||
changePosition(player, tntElement.getPosition().getZ(), z -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().setZ(clamp(z - tntElement.getParentPosition().getZ()));
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
editLocation(player, tntElement, back);
|
||||
}, () -> editLocation(player, tntElement, back));
|
||||
}));
|
||||
inv.setItem(30, new SWItem(SWItem.getDye(1), minusOneName, minusOnePixelShiftLore, false, clickType -> {
|
||||
if (tntSimulator != null) tntSimulator.hide(tntElement);
|
||||
tntElement.getOwnPosition().subtract(clickType.isShiftClick() ? Z_VECTOR : FZ_VECTOR);
|
||||
if (tntSimulator != null) tntSimulator.show(tntElement);
|
||||
tntElement.change();
|
||||
}));
|
||||
};
|
||||
editObserver.run();
|
||||
tntElement.register(editObserver);
|
||||
inv.addCloseRunnable(() -> tntElement.unregister(editObserver));
|
||||
|
||||
inv.open();
|
||||
}
|
||||
|
||||
@ -97,6 +206,94 @@ public class TNTElementGUI {
|
||||
inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run()));
|
||||
}
|
||||
|
||||
String plusOneName = BauSystem.MESSAGE.parse("SIMULATOR_PLUS_ONE", player);
|
||||
String minusOneName = BauSystem.MESSAGE.parse("SIMULATOR_MINUS_ONE", player);
|
||||
List<String> plusOneFiveShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_PLUS_FIVE_SHIFT", player));
|
||||
List<String> minusOneFiveShiftLore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_MINUS_FIVE_SHIFT", player));
|
||||
List<String> lore = Arrays.asList(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_LORE", player));
|
||||
|
||||
Runnable editObserver = () -> {
|
||||
// Change Count of spawned TNT
|
||||
inv.setItem(10, new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> {
|
||||
tntElement.setCount(tntElement.getCount() + ((clickType.isShiftClick()) ? 5 : 1));
|
||||
tntElement.change();
|
||||
}));
|
||||
SWItem countItem = new SWItem(Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_COUNT", player, tntElement.getCount()), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_COUNT_ANVIL_GUI_NAME", player), tntElement.getCount(), c -> {
|
||||
tntElement.setCount(c);
|
||||
tntElement.change();
|
||||
editProperties(player, tntElement, back);
|
||||
}, () -> editProperties(player, tntElement, back)));
|
||||
countItem.getItemStack().setAmount(tntElement.getCount());
|
||||
inv.setItem(19, countItem);
|
||||
inv.setItem(28, new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> {
|
||||
tntElement.setCount(tntElement.getCount() - ((clickType.isShiftClick()) ? 5 : 1));
|
||||
tntElement.change();
|
||||
}));
|
||||
|
||||
// Change TickOffset
|
||||
inv.setItem(11, new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> {
|
||||
tntElement.setTickOffset(tntElement.getOwnTickOffset() + (clickType.isShiftClick() ? 5 : 1));
|
||||
tntElement.change();
|
||||
}));
|
||||
SWItem tickItem = new SWItem(SWItem.getMaterial("DIODE"), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK", player, tntElement.getTickOffset()), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_TICK_ANVIL_GUI_NAME", player), tntElement.getTickOffset(), tick -> {
|
||||
tntElement.setTickOffset(tick - tntElement.getParentTickOffset());
|
||||
tntElement.change();
|
||||
editProperties(player, tntElement, back);
|
||||
}, () -> editProperties(player, tntElement, back)));
|
||||
tickItem.getItemStack().setAmount(Math.max(tntElement.getTickOffset(), 1));
|
||||
inv.setItem(20, tickItem);
|
||||
inv.setItem(29, new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> {
|
||||
tntElement.setTickOffset(tntElement.getOwnTickOffset() - (clickType.isShiftClick() ? 5 : 1));
|
||||
tntElement.change();
|
||||
}));
|
||||
|
||||
// Change FuseTicks
|
||||
inv.setItem(12, new SWItem(SWItem.getDye(10), plusOneName, plusOneFiveShiftLore, false, clickType -> {
|
||||
tntElement.setFuseTicks(tntElement.getFuseTicks() + (clickType.isShiftClick() ? 5 : 1));
|
||||
tntElement.change();
|
||||
}));
|
||||
SWItem fuseTickItem = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_FUSE", player, tntElement.getFuseTicks()), lore, false, clickType -> changeCount(player, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_FUSE_ANVIL_GUI_NAME", player), tntElement.getFuseTicks(), tick -> {
|
||||
tntElement.setFuseTicks(tick);
|
||||
tntElement.change();
|
||||
editProperties(player, tntElement, back);
|
||||
}, () -> editProperties(player, tntElement, back)));
|
||||
fuseTickItem.getItemStack().setAmount(Math.max(tntElement.getFuseTicks(), 1));
|
||||
inv.setItem(21, fuseTickItem);
|
||||
inv.setItem(30, new SWItem(SWItem.getDye(1), minusOneName, minusOneFiveShiftLore, false, clickType -> {
|
||||
tntElement.setFuseTicks(tntElement.getFuseTicks() - (clickType.isShiftClick() ? 5 : 1));
|
||||
tntElement.change();
|
||||
}));
|
||||
|
||||
// Velocity Settings
|
||||
inv.setItem(24, Material.TNT, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_NAME", player), clickType -> {
|
||||
if (tntElement.isXVelocity() || tntElement.isYVelocity() || tntElement.isZVelocity()) {
|
||||
tntElement.setXVelocity(false);
|
||||
tntElement.setYVelocity(false);
|
||||
tntElement.setZVelocity(false);
|
||||
} else {
|
||||
tntElement.setXVelocity(true);
|
||||
tntElement.setYVelocity(true);
|
||||
tntElement.setZVelocity(true);
|
||||
}
|
||||
tntElement.change();
|
||||
});
|
||||
inv.setItem(32, new SWItem(getWool(tntElement.isXVelocity()), getColor(tntElement.isXVelocity()), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_X", player, active(player, tntElement.isXVelocity())), clickType -> {
|
||||
tntElement.setXVelocity(!tntElement.isXVelocity());
|
||||
tntElement.change();
|
||||
}));
|
||||
inv.setItem(15, new SWItem(getWool(tntElement.isYVelocity()), getColor(tntElement.isYVelocity()), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_Y", player, active(player, tntElement.isYVelocity())), clickType -> {
|
||||
tntElement.setYVelocity(!tntElement.isYVelocity());
|
||||
tntElement.change();
|
||||
}));
|
||||
inv.setItem(34, new SWItem(getWool(tntElement.isZVelocity()), getColor(tntElement.isZVelocity()), BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_VELOCITY_Z", player, active(player, tntElement.isZVelocity())), clickType -> {
|
||||
tntElement.setZVelocity(!tntElement.isZVelocity());
|
||||
tntElement.change();
|
||||
}));
|
||||
};
|
||||
editObserver.run();
|
||||
tntElement.register(editObserver);
|
||||
inv.addCloseRunnable(() -> tntElement.unregister(editObserver));
|
||||
|
||||
inv.open();
|
||||
}
|
||||
|
||||
@ -106,6 +303,13 @@ public class TNTElementGUI {
|
||||
inv.setItem(36, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("SIMULATOR_BACK", player), clickType -> back.run()));
|
||||
}
|
||||
|
||||
Runnable editObserver = () -> {
|
||||
|
||||
};
|
||||
editObserver.run();
|
||||
tntElement.register(editObserver);
|
||||
inv.addCloseRunnable(() -> tntElement.unregister(editObserver));
|
||||
|
||||
inv.open();
|
||||
}
|
||||
|
||||
@ -128,4 +332,42 @@ public class TNTElementGUI {
|
||||
}
|
||||
return BauSystem.MESSAGE.parse(s, p);
|
||||
}
|
||||
|
||||
private Material getWool(boolean b) {
|
||||
return b ? Material.LIME_WOOL : Material.RED_WOOL;
|
||||
}
|
||||
|
||||
private byte getColor(boolean b) {
|
||||
return (byte) (b ? 10 : 1);
|
||||
}
|
||||
|
||||
private double clamp(double d) {
|
||||
return (int) (d * 100) * 0.01;
|
||||
}
|
||||
|
||||
private void changeCount(Player player, String name, int defaultValue, Consumer<Integer> 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<Double> 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();
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ import java.util.function.Consumer;
|
||||
@UtilityClass
|
||||
public class TNTSimulatorGui {
|
||||
|
||||
public void open(Player player, Consumer<Vector> moveAll, List<SimulatorElement> simulatorElements, Runnable back) {
|
||||
public void open(Player player, Consumer<Vector> moveAll, Consumer<Material> materialChanger, List<SimulatorElement> simulatorElements, Runnable back) {
|
||||
List<SWListInv.SWListEntry<SimulatorElement>> swListEntryList = new ArrayList<>();
|
||||
|
||||
for (SimulatorElement element : simulatorElements) {
|
||||
@ -50,9 +50,9 @@ public class TNTSimulatorGui {
|
||||
List<SimulatorElement> elements = new ArrayList<>(tntGroup.getElements());
|
||||
open(player, vector -> {
|
||||
|
||||
}, elements, () -> open(player, moveAll, simulatorElements, back));
|
||||
}, material -> {}, elements, () -> open(player, moveAll, materialChanger, simulatorElements, back));
|
||||
} else {
|
||||
TNTElementGUI.open(player, (TNTElement) simulatorElement, () -> open(player, moveAll, simulatorElements, back));
|
||||
TNTElementGUI.open(player, (TNTElement) simulatorElement, () -> open(player, moveAll, materialChanger, simulatorElements, back));
|
||||
}
|
||||
});
|
||||
if (back != null) {
|
||||
|
@ -24,15 +24,15 @@ import de.steamwar.bausystem.shared.Pair;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
public interface SimulatorElement {
|
||||
|
||||
Map<SimulatorElement, Set<Runnable>> observer = new HashMap<>();
|
||||
|
||||
YAPIONObject toYAPION();
|
||||
List<Entity> getEntities();
|
||||
void getEntity(List<SimulatorElement> elements, Entity entity);
|
||||
@ -45,4 +45,18 @@ public interface SimulatorElement {
|
||||
|
||||
SWItem menu(Player p);
|
||||
void locations(Map<Integer, Map<Integer, Pair<Runnable, Integer>>> result); // Ticks to subtick order to spawning runnable to count of activations
|
||||
|
||||
// Observer
|
||||
default void change() {
|
||||
observer.getOrDefault(this, new HashSet<>()).forEach(Runnable::run);
|
||||
}
|
||||
default void register(Runnable observer) {
|
||||
SimulatorElement.observer.computeIfAbsent(this, k -> new HashSet<>()).add(observer);
|
||||
}
|
||||
default void unregister(Runnable observer) {
|
||||
SimulatorElement.observer.computeIfPresent(this, (k, v) -> {
|
||||
v.remove(observer);
|
||||
return v.isEmpty() ? null : v;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ import de.steamwar.bausystem.shared.Pair;
|
||||
import de.steamwar.bausystem.shared.Position;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -46,8 +47,14 @@ public class TNTElement implements SimulatorElement {
|
||||
private int fuseTicks = 80;
|
||||
private int count = 1;
|
||||
private int tickOffset = 0;
|
||||
|
||||
@Setter
|
||||
private boolean xVelocity = false;
|
||||
|
||||
@Setter
|
||||
private boolean yVelocity = false;
|
||||
|
||||
@Setter
|
||||
private boolean zVelocity = false;
|
||||
private int order = 0;
|
||||
private Material material = Material.TNT;
|
||||
@ -91,12 +98,14 @@ public class TNTElement implements SimulatorElement {
|
||||
@Override
|
||||
public List<Entity> getEntities() {
|
||||
if (disabled) return new ArrayList<>();
|
||||
entity.setPosition(getPosition());
|
||||
return Arrays.asList(entity.getBukkitEntity());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getEntity(List<SimulatorElement> elements, Entity entity) {
|
||||
if (disabled) return;
|
||||
this.entity.setPosition(getPosition());
|
||||
if (this.entity.getId() == entity.getEntityId() || getPosition().equals(entity.getLocation().toVector())) {
|
||||
elements.add(this);
|
||||
}
|
||||
@ -120,12 +129,14 @@ public class TNTElement implements SimulatorElement {
|
||||
@Override
|
||||
public void show(SimulatorEntityShowMode showMode) {
|
||||
if (disabled) return;
|
||||
entity.setPosition(getPosition());
|
||||
showMode.show(new Position(getPosition()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hide(SimulatorEntityShowMode showMode) {
|
||||
if (disabled) return;
|
||||
entity.setPosition(getPosition());
|
||||
showMode.hide(new Position(getPosition()));
|
||||
}
|
||||
|
||||
@ -158,4 +169,44 @@ public class TNTElement implements SimulatorElement {
|
||||
});
|
||||
}, count));
|
||||
}
|
||||
|
||||
public void setCount(int count) {
|
||||
if (count < 0) count = 1;
|
||||
if (count > 400) count = 400;
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
public int getOwnTickOffset() {
|
||||
return tickOffset;
|
||||
}
|
||||
|
||||
public int getParentTickOffset() {
|
||||
if (tntGroup != null) {
|
||||
return tntGroup.getTickOffset();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void setTickOffset(int tickOffset) {
|
||||
if (tickOffset < 0) tickOffset = 0;
|
||||
if (tickOffset > 400) tickOffset = 400;
|
||||
this.tickOffset = tickOffset;
|
||||
}
|
||||
|
||||
public void setFuseTicks(int fuseTicks) {
|
||||
if (fuseTicks < 0) fuseTicks = 0;
|
||||
if (fuseTicks > 160) fuseTicks = 160;
|
||||
this.fuseTicks = fuseTicks;
|
||||
}
|
||||
|
||||
public Vector getOwnPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
public Vector getParentPosition() {
|
||||
if (tntGroup != null) {
|
||||
return tntGroup.getPosition();
|
||||
}
|
||||
return new Vector(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren