SteamWar/BauSystem2.0
Archiviert
12
0

LoaderRework #175

Zusammengeführt
YoyoNow hat 20 Commits von LoaderRework nach master 2023-05-09 18:31:42 +02:00 zusammengeführt
4 geänderte Dateien mit 261 neuen und 38 gelöschten Zeilen
Nur Änderungen aus Commit e997243887 werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -37,15 +37,14 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.EquipmentSlot;
import java.util.HashSet;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.Map;
public class LoaderRecorder implements Listener {
private Player player;
private List<LoaderElement> loaderElementList;
private Set<Location> blockSet = new HashSet<>();
private long lastInteraction = TPSUtils.currentTick.get();
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
public void onPlayerMove(PlayerMoveEvent event) {
if (event.getPlayer() != player) return;
Block fromBlock = event.getTo().getBlock();
Block toBlock = event.getTo().getBlock();
if (!blockSet.contains(toBlock.getLocation())) {
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;
}
}
calcMovementBlocks(fromBlock, toBlock);
fromBlock = fromBlock.getRelative(0, 1, 0);
toBlock = toBlock.getRelative(0, 1, 0);
if (!blockSet.contains(toBlock.getLocation())) {
blockSet.remove(fromBlock.getLocation());
blockSet.add(toBlock.getLocation());
calcMovementBlocks(fromBlock, toBlock);
}
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);
loaderMovement = null;
Material type = toBlock.getType();
switch (type) {
case TRIPWIRE:
loaderElementList.add(new LoaderTicks(toBlock.getLocation(), "Tripwire", Material.STRING, 30));
loaderMovement = new LoaderMovement(toBlock.getLocation(), "Tripwire", Material.STRING);
break;
case LIGHT_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;
default:
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;
}
if (loaderMovement != null) {
movementSet.put(toBlock.getLocation(), loaderMovement);
loaderElementList.add(loaderMovement);
}
}
}
}

Datei anzeigen

@ -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();
}
}

Datei anzeigen

@ -35,12 +35,12 @@ import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.Collections;
public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.StoneButtonSettings> {
public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSettings> {
protected String name;
protected Material material;
protected boolean analogue;
protected int ticks;
private String name;
private Material material;
private boolean analogue;
private int ticks;
public LoaderTicks(Location location, String name, Material material, int ticks) {
super(location);
@ -50,7 +50,7 @@ public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.StoneButto
this.ticks = ticks;
}
public class StoneButtonSettings implements ElementSettings {
public class TicksSettings implements ElementSettings {
private boolean noop = false;
private boolean waitFor = true;
@ -185,7 +185,7 @@ public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.StoneButto
}
@Override
public StoneButtonSettings createNewElement() {
return new StoneButtonSettings();
public TicksSettings createNewElement() {
return new TicksSettings();
}
}

Datei anzeigen

@ -72,6 +72,7 @@ public class LoaderWait implements LoaderElement, Listener {
swAnvilInv.setCallback(s -> {
try {
delay = Long.parseLong(s);
if (delay < 0) delay = 0;
} catch (NumberFormatException ignored) {
}
click(player, backAction);