SteamWar/BauSystem2.0
Archiviert
12
0

Add SimulatorCursor
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful

Add SimulatorCommand

Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
yoyosource 2022-06-09 16:28:06 +02:00
Ursprung c4f1b4f01a
Commit 6ed13702d4
15 geänderte Dateien mit 344 neuen und 30 gelöschten Zeilen

Datei anzeigen

@ -501,6 +501,10 @@ SCRIPT_GUI_CONSTANT_REGION_TYPE_LORE = §eregion type§7 of the current region
UNSIGN_HELP=§8/§eunsign §8- §7Make a signed book writable again
# Simulator
SIMULATORN_NO_SIM_IN_HAND = §cNo simulator item selected
SIMULATORN_GUI_SELECT_SIM = Simulator selection
SIMULATOR_GUI_ITEM_NAME = §eTNT Simulator
SIMULATOR_HELP = §8/§esimulator §8-§7 Gives you the simulator wand
SIMULATOR_START_HELP = §8/§esimulator start §8-§7 Starts the simulation

Datei anzeigen

@ -30,7 +30,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
@Linked(LinkageType.BAU_GUI_ITEM)
// @Linked(LinkageType.BAU_GUI_ITEM)
public class SimulatorBauGuiItem extends BauGuiItem {
public SimulatorBauGuiItem() {

Datei anzeigen

@ -37,7 +37,7 @@ import org.bukkit.entity.Player;
import java.util.List;
@Linked(LinkageType.COMMAND)
// @Linked(LinkageType.COMMAND)
public class SimulatorCommand extends SWCommand {
public SimulatorCommand() {

Datei anzeigen

@ -47,8 +47,8 @@ import java.util.function.Function;
import static de.steamwar.bausystem.features.simulator.TNTSimulator.get;
@Linked(LinkageType.LISTENER)
@Linked(LinkageType.DISABLE_LINK)
// @Linked(LinkageType.LISTENER)
// @Linked(LinkageType.DISABLE_LINK)
public class TNTSimulatorListener implements Listener, Disable {
private boolean permissionCheck(Player player) {

Datei anzeigen

@ -0,0 +1,71 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
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) {
SWUtils.giveItemToPlayer(p, SimulatorStorage.getWand(p));
}
@Register(value = "change", description = "")
public void changeCommand(@Guard Player p) {
ItemStack itemStack = p.getInventory().getItemInMainHand();
if (!ItemUtils.isItem(itemStack, "simulator")) {
BauSystem.MESSAGE.send("SIMULATORN_NO_SIM_IN_HAND", p);
return;
}
SimulatorSelectionGUI.open(p, itemStack);
}
@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;
};
}
}

Datei anzeigen

@ -0,0 +1,119 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bausystem.features.simulatorn;
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 lombok.experimental.UtilityClass;
import net.md_5.bungee.api.ChatMessageType;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.util.RayTraceResult;
import org.bukkit.util.Vector;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@UtilityClass
public class SimulatorCursor {
private Map<Player, AbstractSimulatorEntity> cursors = new HashMap<>();
public void show(Player player, TNTSimulator tntSimulator, RayTraceResult result) {
AbstractSimulatorEntity cursor = cursors.get(player);
if (cursor != null)
cursor.hide(player, false);
tntSimulator.show(player);
if (result == null)
return;
if (result.getHitEntity() != null) {
List<SimulatorElement> elements = tntSimulator.getEntity(result.getHitEntity());
tntSimulator.hide(player, elements);
cursor = SimulatorEntityShowMode.createEntity(player, elements.isEmpty() ? getPos(player, result) : elements.get(0).getPosition(), true);
cursor.display(player);
cursors.put(player, cursor);
BauSystem.MESSAGE.sendPrefixless("SIMULATOR_POSITION_EDIT", player, ChatMessageType.ACTION_BAR);
return;
}
cursor = SimulatorEntityShowMode.createEntity(player, getPos(player, result), false);
cursor.display(player);
cursors.put(player, cursor);
BauSystem.MESSAGE.sendPrefixless("SIMULATOR_POSITION_ADD", player, ChatMessageType.ACTION_BAR);
}
public void hide(Player player, TNTSimulator tntSimulator) {
AbstractSimulatorEntity cursor = cursors.get(player);
if (cursor != null)
cursor.hide(player, false);
tntSimulator.hide(player);
cursors.remove(player);
}
private Vector getPos(Player player, RayTraceResult result) {
Vector pos = result.getHitPosition();
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);
}
}
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;
}
}

Datei anzeigen

@ -21,12 +21,14 @@ package de.steamwar.bausystem.features.simulatorn;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.SWUtils;
import de.steamwar.bausystem.features.simulatorn.tnt.TNTElement;
import de.steamwar.bausystem.linkage.Disable;
import de.steamwar.bausystem.linkage.Enable;
import de.steamwar.bausystem.linkage.LinkageType;
import de.steamwar.bausystem.linkage.Linked;
import de.steamwar.bausystem.utils.ItemUtils;
import de.steamwar.inventory.SWItem;
import de.steamwar.sql.SteamwarUser;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
@ -34,6 +36,7 @@ import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import yapion.exceptions.YAPIONException;
import yapion.hierarchy.types.YAPIONArray;
import yapion.hierarchy.types.YAPIONObject;
import yapion.parser.YAPIONParser;
@ -43,6 +46,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Linked(LinkageType.ENABLE_LINK)
@Linked(LinkageType.DISABLE_LINK)
@ -122,7 +126,9 @@ public class SimulatorStorage implements Enable, Disable {
continue;
}
if (file.getName().endsWith(".yapion")) {
// TODO: Load old simulators
String name = file.getName().substring(0, file.getName().length() - 7);
SteamwarUser steamwarUser = SteamwarUser.get(Integer.parseInt(name));
convert(file, steamwarUser);
} else {
String name = file.getName().substring(0, file.getName().length() - ".simulator".length());
tntSimulators.put(name, new TNTSimulator(yapionObject));
@ -130,6 +136,30 @@ public class SimulatorStorage implements Enable, Disable {
}
}
private static void convert(File file, SteamwarUser steamwarUser) {
YAPIONObject yapionObject;
try {
yapionObject = YAPIONParser.parse(file);
} catch (YAPIONException | IOException e) {
return;
}
try {
file.delete();
} catch (Exception e) {
e.printStackTrace();
}
for (String s : yapionObject.getKeys()) {
String newName = steamwarUser.getUserName() + (s.isEmpty() ? "" : "_" + s);
YAPIONArray content = yapionObject.getArray(s);
if (content.isEmpty()) continue;
TNTSimulator tntSimulator = new TNTSimulator();
for (YAPIONObject element : content.streamObject().collect(Collectors.toList())) {
tntSimulator.getTntElementList().add(new TNTElement(element));
}
tntSimulators.put(newName, tntSimulator);
}
}
@Override
public void disable() {
for (Map.Entry<String, TNTSimulator> entry : tntSimulators.entrySet()) {

Datei anzeigen

@ -19,6 +19,7 @@
package de.steamwar.bausystem.features.simulatorn;
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;
@ -26,18 +27,22 @@ import lombok.Getter;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Getter
public class TNTSimulator {
private Map<Player, SimulatorEntityShowMode> playerShowMode = new HashMap<>();
private Material material = Material.TNT;
private List<SimulatorElement> tntElementList = new ArrayList<>();
@ -70,14 +75,41 @@ public class TNTSimulator {
}
public void hide(Player player) {
SimulatorEntityShowMode showMode = playerShowMode.get(player);
if (showMode == null) {
return;
}
tntElementList.forEach(simulatorElement -> {
simulatorElement.hide(showMode);
});
}
public void show(Player player, RayTraceResult rayTraceResult) {
public void hide(Player player, List<SimulatorElement> simulatorElements) {
SimulatorEntityShowMode showMode = playerShowMode.get(player);
if (showMode == null) {
return;
}
simulatorElements.forEach(simulatorElement -> {
simulatorElement.hide(showMode);
});
}
public void show(Player player) {
SimulatorEntityShowMode showMode = playerShowMode.computeIfAbsent(player, SimulatorEntityShowMode::new);
tntElementList.forEach(simulatorElement -> {
simulatorElement.show(showMode);
});
}
public List<Entity> getEntities() {
return tntElementList.stream().flatMap(element -> element.getEntities().stream()).collect(Collectors.toList());
}
public List<SimulatorElement> getEntity(Entity entity) {
List<SimulatorElement> tntSpawns = new ArrayList<>();
for (SimulatorElement spawn : tntElementList) {
spawn.getEntity(tntSpawns, new Vector(0, 0, 0), entity);
}
return tntSpawns;
}
}

Datei anzeigen

@ -21,6 +21,7 @@ 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;
@ -33,7 +34,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;
@ -42,8 +42,6 @@ import org.bukkit.util.Vector;
import java.util.function.Function;
import static de.steamwar.bausystem.features.simulator.TNTSimulator.get;
@Linked(LinkageType.LISTENER)
public class TNTSimulatorListener implements Listener {
@ -102,7 +100,7 @@ public class TNTSimulatorListener implements Listener {
private void simulatorShowHide(Player player, Function<PlayerInventory, ItemStack> oldItemFunction, Function<PlayerInventory, ItemStack> newItemFunction, Location location) {
TNTSimulator oldSimulator = SimulatorStorage.getSimulator(oldItemFunction.apply(player.getInventory()));
if (oldSimulator != null) {
oldSimulator.hide(player);
SimulatorCursor.hide(player, oldSimulator);
}
TNTSimulator simulator = SimulatorStorage.getSimulator(newItemFunction.apply(player.getInventory()));
@ -110,7 +108,7 @@ public class TNTSimulatorListener implements Listener {
return;
}
simulator.show(player, trace(player, location, simulator));
SimulatorCursor.show(player, simulator, trace(player, location, simulator));
}
@EventHandler
@ -123,5 +121,27 @@ public class TNTSimulatorListener implements Listener {
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 {
}
// get(event.getPlayer()).edit(trace(event.getPlayer(), event.getPlayer().getLocation()));
break;
default:
break;
}
}
}

Datei anzeigen

@ -19,6 +19,7 @@
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.inventory.SWItem;
@ -38,12 +39,13 @@ public class SimulatorSelectionGUI {
for (String name : SimulatorStorage.getSimulatorNames()) {
TNTSimulator simulator = SimulatorStorage.getSimulator(name);
SWItem swItem = new SWItem(simulator.getMaterial(), name, new ArrayList<>(), false, null);
SWItem swItem = new SWItem(simulator.getMaterial(), "§f" + name, new ArrayList<>(), false, null);
swListEntryList.add(new SWListInv.SWListEntry<>(swItem, simulator));
}
SWListInv<TNTSimulator> inv = new SWListInv<>(player, "§6Simulatorauswahl", false, swListEntryList, (clickType, tntSimulator) -> {
SWListInv<TNTSimulator> inv = new SWListInv<>(player, BauSystem.MESSAGE.parse("SIMULATORN_GUI_SELECT_SIM", player), false, swListEntryList, (clickType, tntSimulator) -> {
SimulatorStorage.setSimulator(hand, tntSimulator);
player.getInventory().setItemInMainHand(hand);
});
// TODO: Add button to create new simulator with AnvilGUI

Datei anzeigen

@ -26,6 +26,7 @@ import de.steamwar.bausystem.shared.RoundedPosition;
import de.steamwar.bausystem.shared.ShowMode;
import de.steamwar.bausystem.utils.NMSWrapper;
import org.bukkit.World;
import org.bukkit.entity.Panda;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
@ -53,6 +54,17 @@ public class SimulatorEntityShowMode implements ShowMode<Position> {
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));

Datei anzeigen

@ -19,9 +19,9 @@
package de.steamwar.bausystem.features.simulatorn.tnt;
import de.steamwar.bausystem.features.simulatorn.show.SimulatorEntityShowMode;
import de.steamwar.bausystem.shared.Pair;
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;
@ -33,9 +33,13 @@ public interface SimulatorElement {
YAPIONObject toYAPION();
List<Entity> getEntities();
void getEntity(List<SimulatorElement> elements, Vector origin, Entity entity);
default Vector getPosition() {
return new Vector(0, 0, 0);
}
void show(Player player);
void hide(Player player);
void show(SimulatorEntityShowMode showMode);
void hide(SimulatorEntityShowMode showMode);
ItemStack menu();
void locations(Map<Integer, Map<Integer, Pair<Runnable, Integer>>> result, Vector origin, int tickOffset); // Ticks to subtick order to spawning runnable to count of activations

Datei anzeigen

@ -23,6 +23,7 @@ import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity;
import de.steamwar.bausystem.features.simulatorn.SimulatorStorage;
import de.steamwar.bausystem.features.simulatorn.show.SimulatorEntityShowMode;
import de.steamwar.bausystem.shared.Pair;
import de.steamwar.bausystem.shared.Position;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
@ -56,7 +57,7 @@ public class TNTElement implements SimulatorElement {
}
public TNTElement(YAPIONObject yapionObject) {
this.position = new Vector(yapionObject.getDoubleOrDefault("x", 0), yapionObject.getDoubleOrDefault("y", 0), yapionObject.getDoubleOrDefault("z", 0));
this.position = new Vector(yapionObject.getDoubleOrDefault("x", yapionObject.getDoubleOrDefault("positionX", 0)), yapionObject.getDoubleOrDefault("y", yapionObject.getDoubleOrDefault("positionY", 0)), yapionObject.getDoubleOrDefault("z", yapionObject.getDoubleOrDefault("positionZ", 0)));
this.entity = SimulatorEntityShowMode.createEntity(position, false);
this.fuseTicks = yapionObject.getIntOrDefault("fuseTicks", 80);
this.count = yapionObject.getIntOrDefault("count", 1);
@ -64,7 +65,7 @@ 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", 0);
this.order = yapionObject.getIntOrDefault("order", yapionObject.getBooleanOrDefault("comparator", false) ? 1 : 0);
this.material = Material.valueOf(yapionObject.getStringOrDefault("material", Material.TNT.name()));
}
@ -91,13 +92,25 @@ public class TNTElement implements SimulatorElement {
}
@Override
public void show(Player player) {
entity.sendEntity(player);
public void getEntity(List<SimulatorElement> elements, Vector origin, Entity entity) {
if (this.entity.getId() == entity.getEntityId() || position.clone().add(origin).equals(entity.getLocation().toVector())) {
elements.add(this);
}
}
@Override
public void hide(Player player) {
entity.hide(player, true);
public Vector getPosition() {
return position.clone();
}
@Override
public void show(SimulatorEntityShowMode showMode) {
showMode.show(new Position(position));
}
@Override
public void hide(SimulatorEntityShowMode showMode) {
showMode.hide();
}
@Override

Datei anzeigen

@ -19,10 +19,10 @@
package de.steamwar.bausystem.features.simulatorn.tnt;
import de.steamwar.bausystem.features.simulatorn.show.SimulatorEntityShowMode;
import de.steamwar.bausystem.shared.Pair;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import yapion.hierarchy.types.YAPIONArray;
@ -76,16 +76,23 @@ public class TNTGroup implements SimulatorElement {
}
@Override
public void show(Player player) {
public void getEntity(List<SimulatorElement> elements, Vector origin, Entity entity) {
for (TNTElement tntElement : this.elements) {
tntElement.getEntity(elements, origin, entity);
}
}
@Override
public void show(SimulatorEntityShowMode showMode) {
elements.forEach(tntElement -> {
tntElement.show(player);
tntElement.show(showMode);
});
}
@Override
public void hide(Player player) {
public void hide(SimulatorEntityShowMode showMode) {
elements.forEach(tntElement -> {
tntElement.hide(player);
tntElement.hide(showMode);
});
}

Datei anzeigen

@ -53,7 +53,7 @@ public class ItemUtils {
if (!container.has(key, PersistentDataType.STRING)) {
return null;
}
return container.get(ITEM_KEY, PersistentDataType.STRING);
return container.get(key, PersistentDataType.STRING);
}
public void setTag(ItemStack itemStack, NamespacedKey key, String value) {