Add SimulatorExecutor
Dieser Commit ist enthalten in:
Ursprung
834039c4d4
Commit
3506083416
@ -25,9 +25,11 @@ import de.steamwar.bausystem.features.simulator2.data.redstone.RedstoneElement;
|
|||||||
import de.steamwar.bausystem.features.simulator2.data.redstone.RedstonePhase;
|
import de.steamwar.bausystem.features.simulator2.data.redstone.RedstonePhase;
|
||||||
import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement;
|
import de.steamwar.bausystem.features.simulator2.data.tnt.TNTElement;
|
||||||
import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase;
|
import de.steamwar.bausystem.features.simulator2.data.tnt.TNTPhase;
|
||||||
|
import de.steamwar.bausystem.features.simulator2.execute.SimulatorExecutor;
|
||||||
import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui;
|
import de.steamwar.bausystem.features.simulator2.gui.SimulatorGui;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
|
import jdk.jfr.Registered;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
@ -39,18 +41,23 @@ public class SimulatorTestCommand extends SWCommand {
|
|||||||
public SimulatorTestCommand() {
|
public SimulatorTestCommand() {
|
||||||
super("simtest");
|
super("simtest");
|
||||||
|
|
||||||
SimulatorGroup group1 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase())).add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase()));
|
SimulatorGroup group1 = new SimulatorGroup().add(new TNTElement(new Vector(-477.5, 46, 311.5)).add(new TNTPhase()));
|
||||||
SIMULATOR.getElements().add(group1);
|
SIMULATOR.getElements().add(group1);
|
||||||
|
|
||||||
SimulatorGroup group2 = new SimulatorGroup().add(new TNTElement(new Vector(0, 0, 0)).add(new TNTPhase()));
|
SimulatorGroup group2 = new SimulatorGroup().add(new TNTElement(new Vector(-477.5, 47, 312.5)).add(new TNTPhase()));
|
||||||
SIMULATOR.getElements().add(group2);
|
SIMULATOR.getElements().add(group2);
|
||||||
|
|
||||||
SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(0, 0, 0)).add(new RedstonePhase()));
|
SimulatorGroup group3 = new SimulatorGroup().add(new RedstoneElement(new Vector(-484, 47, 307)).add(new RedstonePhase()));
|
||||||
SIMULATOR.getElements().add(group3);
|
SIMULATOR.getElements().add(group3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Register("open")
|
||||||
public void genericCommand(Player player, String... args) {
|
public void openCommand(Player player) {
|
||||||
new SimulatorGui(player, SIMULATOR).open();
|
new SimulatorGui(player, SIMULATOR).open();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Register("run")
|
||||||
|
public void runCommand(Player player) {
|
||||||
|
SimulatorExecutor.run(SIMULATOR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.simulator2.data;
|
package de.steamwar.bausystem.features.simulator2.data;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction;
|
||||||
import de.steamwar.inventory.InvCallback;
|
import de.steamwar.inventory.InvCallback;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -29,6 +30,7 @@ import org.bukkit.entity.Player;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -48,4 +50,10 @@ public class Simulator {
|
|||||||
public SWItem toItem(Player player, InvCallback invCallback) {
|
public SWItem toItem(Player player, InvCallback invCallback) {
|
||||||
return new SWItem(material, "§e" + name, invCallback);
|
return new SWItem(material, "§e" + name, invCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void toSimulatorActions(Map<Integer, List<SimulatorAction>> actions) {
|
||||||
|
elements.forEach(simulatorGroup -> {
|
||||||
|
simulatorGroup.toSimulatorActions(actions);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.simulator2.data;
|
package de.steamwar.bausystem.features.simulator2.data;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction;
|
||||||
import de.steamwar.inventory.InvCallback;
|
import de.steamwar.inventory.InvCallback;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -30,6 +31,7 @@ import org.bukkit.util.Vector;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -88,4 +90,11 @@ public abstract class SimulatorElement<T extends SimulatorPhase> {
|
|||||||
}
|
}
|
||||||
return new SWItem(material, "§e" + getName(), lore, disabled, invCallback);
|
return new SWItem(material, "§e" + getName(), lore, disabled, invCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void toSimulatorActions(Map<Integer, List<SimulatorAction>> actions) {
|
||||||
|
if (disabled) return;
|
||||||
|
phases.forEach(phase -> {
|
||||||
|
phase.toSimulatorActions(actions, position.clone());
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.simulator2.data;
|
package de.steamwar.bausystem.features.simulator2.data;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction;
|
||||||
import de.steamwar.inventory.InvCallback;
|
import de.steamwar.inventory.InvCallback;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -29,6 +30,7 @@ import org.bukkit.entity.Player;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -79,4 +81,11 @@ public class SimulatorGroup {
|
|||||||
return new SWItem(material, "§eGroup", lore, disabled, groupCallback);
|
return new SWItem(material, "§eGroup", lore, disabled, groupCallback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void toSimulatorActions(Map<Integer, List<SimulatorAction>> actions) {
|
||||||
|
if (disabled) return;
|
||||||
|
elements.forEach(simulatorElement -> {
|
||||||
|
simulatorElement.toSimulatorActions(actions);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,13 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.simulator2.data;
|
package de.steamwar.bausystem.features.simulator2.data;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -30,4 +35,6 @@ public abstract class SimulatorPhase {
|
|||||||
protected int tickOffset = 0;
|
protected int tickOffset = 0;
|
||||||
protected int lifetime = 80;
|
protected int lifetime = 80;
|
||||||
protected int order = 1;
|
protected int order = 1;
|
||||||
|
|
||||||
|
public abstract void toSimulatorActions(Map<Integer, List<SimulatorAction>> actions, Vector position);
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,18 @@
|
|||||||
package de.steamwar.bausystem.features.simulator2.data.redstone;
|
package de.steamwar.bausystem.features.simulator2.data.redstone;
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase;
|
import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase;
|
||||||
|
import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class RedstonePhase extends SimulatorPhase {
|
public class RedstonePhase extends SimulatorPhase {
|
||||||
@ -33,4 +43,26 @@ public class RedstonePhase extends SimulatorPhase {
|
|||||||
{
|
{
|
||||||
this.lifetime = 1;
|
this.lifetime = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toSimulatorActions(Map<Integer, List<SimulatorAction>> actions, Vector position) {
|
||||||
|
AtomicReference<BlockState> previousBlockState = new AtomicReference<>();
|
||||||
|
actions.computeIfAbsent(tickOffset, __ -> new ArrayList<>())
|
||||||
|
.add(new SimulatorAction(0, 1) {
|
||||||
|
@Override
|
||||||
|
public void accept(World world) {
|
||||||
|
Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
||||||
|
previousBlockState.set(block.getState());
|
||||||
|
block.setType(Material.REDSTONE_BLOCK);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
actions.computeIfAbsent(tickOffset + lifetime, __ -> new ArrayList<>())
|
||||||
|
.add(new SimulatorAction(0, 1) {
|
||||||
|
@Override
|
||||||
|
public void accept(World world) {
|
||||||
|
previousBlockState.get().update(true, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,9 +20,17 @@
|
|||||||
package de.steamwar.bausystem.features.simulator2.data.tnt;
|
package de.steamwar.bausystem.features.simulator2.data.tnt;
|
||||||
|
|
||||||
import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase;
|
import de.steamwar.bausystem.features.simulator2.data.SimulatorPhase;
|
||||||
|
import de.steamwar.bausystem.features.simulator2.execute.SimulatorAction;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.entity.TNTPrimed;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -46,4 +54,18 @@ public class TNTPhase extends SimulatorPhase {
|
|||||||
yJump = jump;
|
yJump = jump;
|
||||||
zJump = jump;
|
zJump = jump;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toSimulatorActions(Map<Integer, List<SimulatorAction>> actions, Vector position) {
|
||||||
|
actions.computeIfAbsent(tickOffset, __ -> new ArrayList<>()).add(new SimulatorAction(order, count) {
|
||||||
|
@Override
|
||||||
|
public void accept(World world) {
|
||||||
|
TNTPrimed tnt = world.spawn(position.toLocation(world), TNTPrimed.class);
|
||||||
|
if (!xJump) tnt.setVelocity(tnt.getVelocity().setX(0));
|
||||||
|
if (!yJump) tnt.setVelocity(tnt.getVelocity().setY(0));
|
||||||
|
if (!zJump) tnt.setVelocity(tnt.getVelocity().setZ(0));
|
||||||
|
tnt.setFuseTicks(lifetime);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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.simulator2.execute;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.bukkit.World;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public abstract class SimulatorAction implements Consumer<World> {
|
||||||
|
private int order;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private int count;
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* 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.simulator2.execute;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.features.simulator2.data.Simulator;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.World;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
|
public class SimulatorExecutor {
|
||||||
|
|
||||||
|
private static final World WORLD = Bukkit.getWorlds().get(0);
|
||||||
|
private static Set<Simulator> currentlyRunning = new HashSet<>();
|
||||||
|
|
||||||
|
public boolean run(Simulator simulator) {
|
||||||
|
if (currentlyRunning.contains(simulator)) return false;
|
||||||
|
|
||||||
|
Map<Integer, List<SimulatorAction>> map = new HashMap<>();
|
||||||
|
simulator.toSimulatorActions(map);
|
||||||
|
|
||||||
|
Map<Integer, Map<Integer, List<SimulatorAction>>> actions = new HashMap<>();
|
||||||
|
map.forEach((integer, simulatorActions) -> {
|
||||||
|
simulatorActions.forEach(simulatorAction -> {
|
||||||
|
actions.computeIfAbsent(integer, __ -> new HashMap<>()).computeIfAbsent(simulatorAction.getOrder(), __ -> new ArrayList<>()).add(simulatorAction);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
AtomicInteger tick = new AtomicInteger();
|
||||||
|
BauSystem.runTaskTimer(BauSystem.getInstance(), bukkitTask -> {
|
||||||
|
if (actions.isEmpty()) {
|
||||||
|
bukkitTask.cancel();
|
||||||
|
currentlyRunning.remove(simulator);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentTick = tick.getAndIncrement();
|
||||||
|
Map<Integer, List<SimulatorAction>> actionsToRun = actions.remove(currentTick);
|
||||||
|
if (actionsToRun == null) return;
|
||||||
|
List<Integer> keys = new ArrayList<>(actionsToRun.keySet());
|
||||||
|
keys.sort(null);
|
||||||
|
|
||||||
|
for (int actionKey : keys) {
|
||||||
|
List<SimulatorAction> keyedActions = actionsToRun.get(actionKey);
|
||||||
|
while (!keyedActions.isEmpty()) {
|
||||||
|
Collections.shuffle(keyedActions);
|
||||||
|
for (int i = keyedActions.size() - 1 ; i >= 0; i--) {
|
||||||
|
SimulatorAction action = keyedActions.get(i);
|
||||||
|
action.accept(WORLD);
|
||||||
|
action.setCount(action.getCount() - 1);
|
||||||
|
if (action.getCount() == 0) {
|
||||||
|
keyedActions.remove(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 0, 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -136,7 +136,7 @@ public class SimulatorTNTPhaseSettingsGui extends SimulatorBaseGui {
|
|||||||
orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 30)));
|
orderItem.getItemStack().setAmount(Math.max(1, Math.min(order, 30)));
|
||||||
inventory.setItem(22, orderItem);
|
inventory.setItem(22, orderItem);
|
||||||
|
|
||||||
inventory.setItem(31, SWItem.getDye(order > -30 ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
|
inventory.setItem(31, SWItem.getDye(order > -SimulatorPhase.ORDER_LIMIT ? 1 : 8), "§e-1", Arrays.asList("§7Shift§8: §e-5"), false, clickType -> {
|
||||||
tnt.setOrder(Math.max(-30, order - (clickType.isShiftClick() ? 5 : 1)));
|
tnt.setOrder(Math.max(-30, order - (clickType.isShiftClick() ? 5 : 1)));
|
||||||
SimulatorWatcher.update(simulator);
|
SimulatorWatcher.update(simulator);
|
||||||
});
|
});
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren