Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
Ursprung
b4d63e1fe9
Commit
e997243887
@ -37,15 +37,14 @@ import org.bukkit.event.player.PlayerInteractEvent;
|
|||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.bukkit.inventory.EquipmentSlot;
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Map;
|
||||||
|
|
||||||
public class LoaderRecorder implements Listener {
|
public class LoaderRecorder implements Listener {
|
||||||
|
|
||||||
private Player player;
|
private Player player;
|
||||||
private List<LoaderElement> loaderElementList;
|
private List<LoaderElement> loaderElementList;
|
||||||
private Set<Location> blockSet = new HashSet<>();
|
|
||||||
private long lastInteraction = TPSUtils.currentTick.get();
|
private long lastInteraction = TPSUtils.currentTick.get();
|
||||||
|
|
||||||
public LoaderRecorder(Player player, List<LoaderElement> loaderElementList) {
|
public LoaderRecorder(Player player, List<LoaderElement> loaderElementList) {
|
||||||
@ -132,56 +131,53 @@ public class LoaderRecorder implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Map<Location, Long> blockSet = new HashMap<>();
|
||||||
|
private Map<Location, LoaderMovement> movementSet = new HashMap<>();
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerMove(PlayerMoveEvent event) {
|
public void onPlayerMove(PlayerMoveEvent event) {
|
||||||
if (event.getPlayer() != player) return;
|
if (event.getPlayer() != player) return;
|
||||||
|
|
||||||
Block fromBlock = event.getTo().getBlock();
|
Block fromBlock = event.getTo().getBlock();
|
||||||
Block toBlock = event.getTo().getBlock();
|
Block toBlock = event.getTo().getBlock();
|
||||||
if (!blockSet.contains(toBlock.getLocation())) {
|
calcMovementBlocks(fromBlock, toBlock);
|
||||||
blockSet.remove(fromBlock.getLocation());
|
|
||||||
blockSet.add(toBlock.getLocation());
|
|
||||||
|
|
||||||
addWaitTime(false);
|
|
||||||
Material type = toBlock.getType();
|
|
||||||
switch (type) {
|
|
||||||
case TRIPWIRE:
|
|
||||||
loaderElementList.add(new LoaderTicks(toBlock.getLocation(), "Tripwire", Material.STRING, 30));
|
|
||||||
break;
|
|
||||||
case LIGHT_WEIGHTED_PRESSURE_PLATE:
|
|
||||||
case HEAVY_WEIGHTED_PRESSURE_PLATE:
|
|
||||||
loaderElementList.add(new LoaderTicks(toBlock.getLocation(), "Weighted Pressure Plate", type, 20));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (type.name().endsWith("PRESSURE_PLATE")) {
|
|
||||||
loaderElementList.add(new LoaderTicks(toBlock.getLocation(), "Pressure Plate", type, 30));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fromBlock = fromBlock.getRelative(0, 1, 0);
|
fromBlock = fromBlock.getRelative(0, 1, 0);
|
||||||
toBlock = toBlock.getRelative(0, 1, 0);
|
toBlock = toBlock.getRelative(0, 1, 0);
|
||||||
if (!blockSet.contains(toBlock.getLocation())) {
|
calcMovementBlocks(fromBlock, toBlock);
|
||||||
blockSet.remove(fromBlock.getLocation());
|
}
|
||||||
blockSet.add(toBlock.getLocation());
|
|
||||||
|
private void calcMovementBlocks(Block fromBlock, Block toBlock) {
|
||||||
|
if (!blockSet.containsKey(toBlock.getLocation())) {
|
||||||
|
Long startTime = blockSet.remove(fromBlock.getLocation());
|
||||||
|
LoaderMovement loaderMovement = movementSet.remove(fromBlock.getLocation());
|
||||||
|
if (loaderMovement != null && startTime != null) {
|
||||||
|
loaderMovement.setInitialTicks(TPSUtils.currentTick.get() - startTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
blockSet.put(toBlock.getLocation(), TPSUtils.currentTick.get());
|
||||||
|
|
||||||
addWaitTime(false);
|
addWaitTime(false);
|
||||||
|
loaderMovement = null;
|
||||||
Material type = toBlock.getType();
|
Material type = toBlock.getType();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TRIPWIRE:
|
case TRIPWIRE:
|
||||||
loaderElementList.add(new LoaderTicks(toBlock.getLocation(), "Tripwire", Material.STRING, 30));
|
loaderMovement = new LoaderMovement(toBlock.getLocation(), "Tripwire", Material.STRING);
|
||||||
break;
|
break;
|
||||||
case LIGHT_WEIGHTED_PRESSURE_PLATE:
|
case LIGHT_WEIGHTED_PRESSURE_PLATE:
|
||||||
case HEAVY_WEIGHTED_PRESSURE_PLATE:
|
case HEAVY_WEIGHTED_PRESSURE_PLATE:
|
||||||
loaderElementList.add(new LoaderTicks(toBlock.getLocation(), "Weighted Pressure Plate", type, 20));
|
loaderMovement = new LoaderMovement(toBlock.getLocation(), "Weighted Pressure Plate", type);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (type.name().endsWith("PRESSURE_PLATE")) {
|
if (type.name().endsWith("PRESSURE_PLATE")) {
|
||||||
loaderElementList.add(new LoaderTicks(toBlock.getLocation(), "Pressure Plate", type, 30));
|
loaderMovement = new LoaderMovement(toBlock.getLocation(), "Pressure Plate", type);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (loaderMovement != null) {
|
||||||
|
movementSet.put(toBlock.getLocation(), loaderMovement);
|
||||||
|
loaderElementList.add(loaderMovement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,226 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 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.loadern.elements.impl;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.features.loadern.elements.ElementSettings;
|
||||||
|
import de.steamwar.bausystem.features.loadern.elements.LoaderInteractionElement;
|
||||||
|
import de.steamwar.inventory.SWAnvilInv;
|
||||||
|
import de.steamwar.inventory.SWInventory;
|
||||||
|
import de.steamwar.inventory.SWItem;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.data.AnaloguePowerable;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.block.data.Powerable;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.MovementSettings> {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private Material material;
|
||||||
|
private boolean analogue;
|
||||||
|
|
||||||
|
public LoaderMovement(Location location, String name, Material material) {
|
||||||
|
super(location);
|
||||||
|
this.name = name;
|
||||||
|
this.material = material;
|
||||||
|
this.analogue = location.getBlock().getBlockData() instanceof AnaloguePowerable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInitialTicks(long ticks) {
|
||||||
|
elements.get(currentShot).ticks = ticks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MovementSettings implements ElementSettings {
|
||||||
|
|
||||||
|
private boolean noop = false;
|
||||||
|
private boolean waitFor = true;
|
||||||
|
private int power = 0;
|
||||||
|
private long ticks = 1;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player) {
|
||||||
|
return menu(player, noop, waitFor);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SWItem menu(Player player, boolean noop, boolean waitFor) {
|
||||||
|
SWItem swItem;
|
||||||
|
if (noop) {
|
||||||
|
swItem = new SWItem(Material.STRUCTURE_VOID, "§7" + name + "§8: §eNOOP");
|
||||||
|
} else if (waitFor) {
|
||||||
|
swItem = new SWItem(material, "§7" + name + "§8: §eWaitFor");
|
||||||
|
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
||||||
|
} else {
|
||||||
|
swItem = new SWItem(material, "§7" + name + "§8: §eNoWaitFor");
|
||||||
|
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
||||||
|
swItem.setEnchanted(true);
|
||||||
|
}
|
||||||
|
swItem.setLore(Arrays.asList("§7Click to edit"));
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Runnable nextAction) {
|
||||||
|
if (location.getBlock().getType() != material) {
|
||||||
|
nextAction.run();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (noop) {
|
||||||
|
nextAction.run();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockData blockData = location.getBlock().getBlockData();
|
||||||
|
if (blockData instanceof AnaloguePowerable) {
|
||||||
|
AnaloguePowerable analoguePowerable = (AnaloguePowerable) location.getBlock().getBlockData();
|
||||||
|
analoguePowerable.setPower(power);
|
||||||
|
} else if (blockData instanceof Powerable) {
|
||||||
|
Powerable powerable = (Powerable) location.getBlock().getBlockData();
|
||||||
|
if (ticks < 0) {
|
||||||
|
powerable.setPowered(power > 0);
|
||||||
|
} else {
|
||||||
|
powerable.setPowered(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
location.getBlock().setBlockData(blockData);
|
||||||
|
update(location.getBlock());
|
||||||
|
if (ticks >= 0) {
|
||||||
|
boolean finalWaitFor = waitFor;
|
||||||
|
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||||
|
if (blockData instanceof AnaloguePowerable) {
|
||||||
|
((AnaloguePowerable) blockData).setPower(0);
|
||||||
|
} else {
|
||||||
|
((Powerable) blockData).setPowered(false);
|
||||||
|
}
|
||||||
|
location.getBlock().setBlockData(blockData);
|
||||||
|
update(location.getBlock());
|
||||||
|
if (finalWaitFor) {
|
||||||
|
nextAction.run();
|
||||||
|
}
|
||||||
|
}, ticks);
|
||||||
|
if (!finalWaitFor) {
|
||||||
|
nextAction.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||||
|
SWInventory swInventory = new SWInventory(player, analogue ? 45 : 27, "Settings");
|
||||||
|
for (int i = analogue ? 36 : 18; i < (analogue ? 44 : 26); i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||||
|
swInventory.setItem(analogue ? 36 : 18, new SWItem(Material.ARROW, "§8Back").getItemStack(), clickType -> backAction.run());
|
||||||
|
swInventory.setItem(analogue ? 44 : 26, new SWItem(Material.BARRIER, "§cDelete").getItemStack(), clickType -> deleteAction.run());
|
||||||
|
|
||||||
|
swInventory.setItem(3, item(player, true, false).getItemStack(), clickType -> {
|
||||||
|
noop = true;
|
||||||
|
click(player, backAction, deleteAction);
|
||||||
|
});
|
||||||
|
if (ticks >= 0) {
|
||||||
|
swInventory.setItem(5, item(player, false, false).getItemStack(), clickType -> {
|
||||||
|
noop = false;
|
||||||
|
waitFor = false;
|
||||||
|
click(player, backAction, deleteAction);
|
||||||
|
});
|
||||||
|
swInventory.setItem(6, item(player, false, true).getItemStack(), clickType -> {
|
||||||
|
noop = false;
|
||||||
|
waitFor = true;
|
||||||
|
click(player, backAction, deleteAction);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
swInventory.setItem(12, new SWItem(SWItem.getDye(1), "§c-1").getItemStack(), clickType -> {
|
||||||
|
ticks -= clickType.isShiftClick() ? 5 : 1;
|
||||||
|
if (ticks < 1) ticks = 1;
|
||||||
|
swInventory.setItem(13, item(player));
|
||||||
|
});
|
||||||
|
swInventory.setItem(13, item(player).getItemStack(), clickType -> {
|
||||||
|
SWAnvilInv swAnvilInv = new SWAnvilInv(player, "Ticks", ticks + "");
|
||||||
|
swAnvilInv.setCallback(s -> {
|
||||||
|
try {
|
||||||
|
ticks = Long.parseLong(s);
|
||||||
|
if (ticks < 1) ticks = 1;
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
}
|
||||||
|
click(player, backAction, deleteAction);
|
||||||
|
});
|
||||||
|
swAnvilInv.open();
|
||||||
|
});
|
||||||
|
swInventory.setItem(14, new SWItem(SWItem.getDye(10), "§a+1").getItemStack(), clickType -> {
|
||||||
|
ticks += clickType.isShiftClick() ? 5 : 1;
|
||||||
|
swInventory.setItem(13, item(player));
|
||||||
|
});
|
||||||
|
|
||||||
|
if (analogue) {
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
int finalI = i;
|
||||||
|
int finalI2 = i;
|
||||||
|
if (i >= 9) finalI2++;
|
||||||
|
swInventory.setItem(finalI2 + 18, item(player, finalI).getItemStack(), clickType -> {
|
||||||
|
power = finalI;
|
||||||
|
click(player, backAction, deleteAction);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
swInventory.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
private SWItem item(Player player, boolean noop, boolean waitFor) {
|
||||||
|
SWItem swItem = menu(player, noop, waitFor);
|
||||||
|
if (swItem.getItemStack().equals(menu(player, this.noop, this.waitFor).getItemStack())) {
|
||||||
|
swItem.setEnchanted(true);
|
||||||
|
}
|
||||||
|
swItem.setLore(Collections.emptyList());
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SWItem item(Player player, int power) {
|
||||||
|
SWItem swItem = new SWItem(power == 0 ? Material.GUNPOWDER : Material.REDSTONE, "§7Power §8:§e " + power);
|
||||||
|
swItem.getItemStack().setAmount(power == 0 ? 1 : power);
|
||||||
|
if (!this.noop && this.power == power) swItem.setEnchanted(true);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SWItem item(Player player) {
|
||||||
|
SWItem swItem = new SWItem(Material.CLOCK, "§7Ticks§8: §e" + ticks);
|
||||||
|
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
||||||
|
swItem.setLore(Arrays.asList("§7Click to edit"));
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player) {
|
||||||
|
SWItem swItem = new SWItem(material, "§7" + name);
|
||||||
|
swItem.setLore(Arrays.asList("§7Modes§8: §e" + elements.size(), "§8", "§7Click to edit"));
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MovementSettings createNewElement() {
|
||||||
|
return new MovementSettings();
|
||||||
|
}
|
||||||
|
}
|
@ -35,12 +35,12 @@ import org.bukkit.entity.Player;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.StoneButtonSettings> {
|
public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSettings> {
|
||||||
|
|
||||||
protected String name;
|
private String name;
|
||||||
protected Material material;
|
private Material material;
|
||||||
protected boolean analogue;
|
private boolean analogue;
|
||||||
protected int ticks;
|
private int ticks;
|
||||||
|
|
||||||
public LoaderTicks(Location location, String name, Material material, int ticks) {
|
public LoaderTicks(Location location, String name, Material material, int ticks) {
|
||||||
super(location);
|
super(location);
|
||||||
@ -50,7 +50,7 @@ public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.StoneButto
|
|||||||
this.ticks = ticks;
|
this.ticks = ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StoneButtonSettings implements ElementSettings {
|
public class TicksSettings implements ElementSettings {
|
||||||
|
|
||||||
private boolean noop = false;
|
private boolean noop = false;
|
||||||
private boolean waitFor = true;
|
private boolean waitFor = true;
|
||||||
@ -185,7 +185,7 @@ public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.StoneButto
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StoneButtonSettings createNewElement() {
|
public TicksSettings createNewElement() {
|
||||||
return new StoneButtonSettings();
|
return new TicksSettings();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,7 @@ public class LoaderWait implements LoaderElement, Listener {
|
|||||||
swAnvilInv.setCallback(s -> {
|
swAnvilInv.setCallback(s -> {
|
||||||
try {
|
try {
|
||||||
delay = Long.parseLong(s);
|
delay = Long.parseLong(s);
|
||||||
|
if (delay < 0) delay = 0;
|
||||||
} catch (NumberFormatException ignored) {
|
} catch (NumberFormatException ignored) {
|
||||||
}
|
}
|
||||||
click(player, backAction);
|
click(player, backAction);
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren