Commits vergleichen
37 Commits
master
...
SimulatorP
Autor | SHA1 | Datum | |
---|---|---|---|
|
b787b96913 | ||
|
4d26ba5166 | ||
|
35c37b9c06 | ||
|
7f7081adfe | ||
|
85527f7004 | ||
|
63e8b96ec9 | ||
|
8a3cce0a3a | ||
|
2774b29342 | ||
|
7e2780f326 | ||
|
e49724e593 | ||
|
c92d610ca9 | ||
|
4fbbdf3a49 | ||
|
d09c4970a0 | ||
|
1af342d2c3 | ||
|
12d0ecbf0e | ||
|
853aae1b8e | ||
|
5ea2b52985 | ||
|
6b727dd915 | ||
|
d5d25e9fb0 | ||
|
0b8a34bbe5 | ||
|
6ebc9b1068 | ||
|
6409748d32 | ||
|
02c68a8b0b | ||
|
e42e123aaa | ||
|
9d91c4e3eb | ||
|
bb489fd185 | ||
|
a83b538b04 | ||
|
8f54fa1ef0 | ||
|
fb3db5d4dd | ||
|
faf62a6ee7 | ||
|
a2cdcc0b47 | ||
|
5f6696885d | ||
|
8d4f1bf2da | ||
|
ff0d3fe2e5 | ||
|
92ed98a8a1 | ||
|
89ee198968 | ||
|
a68f45d824 |
8
.gitignore
vendored
8
.gitignore
vendored
@ -1,7 +1,5 @@
|
||||
# Build files
|
||||
# Package Files
|
||||
*.jar
|
||||
**/bin
|
||||
**/build
|
||||
|
||||
# Gradle
|
||||
.gradle
|
||||
@ -12,10 +10,6 @@ steamwar.properties
|
||||
# IntelliJ IDEA
|
||||
.idea
|
||||
*.iml
|
||||
plugin.yml
|
||||
|
||||
# Other
|
||||
lib
|
||||
|
||||
#linkage
|
||||
LinkageUtils.java
|
@ -27,8 +27,8 @@ version '1.0'
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
@ -17,7 +17,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.utils;
|
||||
package de.steamwar.bausystem.features.simulator.preview;
|
||||
|
||||
public class TickListener15 implements TickListener {
|
||||
public class Simulator15 implements Simulator {
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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.tracer.record;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.EntityTNTPrimed;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class TNTPrimedIterator15 implements TNTPrimedIterator {
|
||||
|
||||
private static final CraftWorld WORLD = (CraftWorld) Bukkit.getWorlds().get(0);
|
||||
|
||||
@Override
|
||||
public Stream<TNTPrimed> iterator() {
|
||||
return WORLD.getHandle().entitiesById.values().stream()
|
||||
.filter(EntityTNTPrimed.class::isInstance)
|
||||
.map(entity -> (TNTPrimed) entity.getBukkitEntity());
|
||||
}
|
||||
}
|
@ -106,7 +106,6 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
||||
|
||||
private static final WorldEditPlugin WORLDEDIT_PLUGIN = Objects.requireNonNull((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"));
|
||||
private static final World BUKKITWORLD = new BukkitWorld(Bukkit.getWorlds().get(0));
|
||||
|
||||
@Override
|
||||
public void setSelection(Player p, Point minPoint, Point maxPoint) {
|
||||
WORLDEDIT_PLUGIN.getSession(p).setRegionSelector(BUKKITWORLD, new CuboidRegionSelector(BUKKITWORLD, toBlockVector3(minPoint), toBlockVector3(maxPoint)));
|
||||
@ -191,7 +190,7 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Clipboard copy(Point minPoint, Point maxPoint, Point copyPoint) {
|
||||
public boolean backup(Point minPoint, Point maxPoint, File file) {
|
||||
BukkitWorld bukkitWorld = new BukkitWorld(Bukkit.getWorlds().get(0));
|
||||
CuboidRegion region = new CuboidRegion(bukkitWorld, toBlockVector3(minPoint), toBlockVector3(maxPoint));
|
||||
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
|
||||
@ -204,21 +203,12 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
||||
copy.setCopyingBiomes(false);
|
||||
|
||||
Operations.complete(copy);
|
||||
clipboard.setOrigin(toBlockVector3(copyPoint));
|
||||
return clipboard;
|
||||
} catch (WorldEditException e) {
|
||||
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean backup(Point minPoint, Point maxPoint, File file) {
|
||||
Clipboard clipboard = copy(minPoint, maxPoint, minPoint);
|
||||
try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(file))) {
|
||||
writer.write(clipboard);
|
||||
}
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
} catch (WorldEditException | IOException e) {
|
||||
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||
return false;
|
||||
}
|
||||
|
@ -63,6 +63,38 @@ public class NMSWrapper15 implements NMSWrapper {
|
||||
player.updateInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(LongSupplier longSupplier) {
|
||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
||||
}
|
||||
|
||||
private static final List<Packet<?>> packets = new ArrayList<>();
|
||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
||||
|
||||
@Override
|
||||
public void createTickCache(World world) {
|
||||
packets.clear();
|
||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
||||
|
||||
if (entity instanceof TNTPrimed) {
|
||||
net.minecraft.server.v1_15_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.getId(), serverEntity.getDataWatcher(), true));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendTickPackets() {
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
|
||||
for (Packet<?> p : packets) {
|
||||
connection.sendPacket(p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static final Reflection.FieldAccessor<Integer> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, int.class, 0);
|
||||
|
||||
@Override
|
||||
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* 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.utils;
|
||||
|
||||
import org.bukkit.Material;
|
||||
|
||||
public class PlaceItemWrapper15 implements PlaceItemWrapper {
|
||||
|
||||
public PlaceItemWrapper15() {
|
||||
for (Material material : Material.values()) {
|
||||
if (!material.isBlock()) continue;
|
||||
if (material.isLegacy()) continue;
|
||||
|
||||
String nonWall = material.name().replace("_WALL_", "").replace("WALL_", "").replace("_WALL", "");
|
||||
try {
|
||||
Material nonWallMaterial = Material.valueOf(nonWall);
|
||||
if (nonWallMaterial != material && nonWallMaterial.isItem() && !nonWallMaterial.isBlock()) {
|
||||
BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(nonWallMaterial, material);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Ignore
|
||||
}
|
||||
}
|
||||
ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(Material.REDSTONE, Material.REDSTONE_WIRE);
|
||||
}
|
||||
}
|
@ -19,12 +19,9 @@
|
||||
|
||||
package de.steamwar.bausystem.utils;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import de.steamwar.bausystem.utils.PlayerMovementWrapper;
|
||||
import net.minecraft.server.v1_15_R1.EntityPlayer;
|
||||
import net.minecraft.server.v1_15_R1.PacketPlayInFlying;
|
||||
import net.minecraft.server.v1_15_R1.PacketPlayOutEntity;
|
||||
import net.minecraft.server.v1_15_R1.PacketPlayOutEntityTeleport;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@ -40,20 +37,4 @@ public class PlayerMovementWrapper15 implements PlayerMovementWrapper {
|
||||
entityPlayer.setLocation(packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0), packetPlayInFlying.a(0F), packetPlayInFlying.b(0F));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertToOut(Player player, Object object) {
|
||||
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||
Object packet = Reflection.newInstance(teleportPacket);
|
||||
teleportEntity.set(packet, player.getEntityId());
|
||||
teleportPosition.set(packet, packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0));
|
||||
if (Float.isNaN(packetPlayInFlying.a(Float.NaN))) {
|
||||
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw()));
|
||||
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
|
||||
} else {
|
||||
teleportYaw.set(packet, rotToByte(packetPlayInFlying.a(0.0F)));
|
||||
teleportPitch.set(packet, rotToByte(packetPlayInFlying.b(0.0F)));
|
||||
}
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
|
@ -27,8 +27,8 @@ version '1.0'
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* 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.tracer.record;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import net.minecraft.server.level.WorldServer;
|
||||
import net.minecraft.world.level.entity.LevelEntityGetter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
public class TNTPrimedIterator18 implements TNTPrimedIterator {
|
||||
|
||||
private static final Reflection.MethodInvoker getWorld = Reflection.getMethod(Reflection.getClass("{obc}.CraftWorld"), "getHandle");
|
||||
private static final Reflection.MethodInvoker getWorldEntities = Reflection.getTypedMethod(WorldServer.class, null, LevelEntityGetter.class);
|
||||
private static final Reflection.MethodInvoker getIterable = Reflection.getTypedMethod(LevelEntityGetter.class, null, Iterable.class);
|
||||
private static final Reflection.MethodInvoker getBukkitEntity = Reflection.getTypedMethod(Reflection.getClass("{nms.world.entity}.Entity"), "getBukkitEntity", null);
|
||||
|
||||
@Override
|
||||
public Stream<TNTPrimed> iterator() {
|
||||
return StreamSupport.stream(((Iterable<?>) getIterable.invoke(getWorldEntities.invoke(getWorld.invoke(Bukkit.getWorlds().get(0))))).spliterator(), false)
|
||||
.map(getBukkitEntity::invoke)
|
||||
.filter(TNTPrimed.class::isInstance)
|
||||
.map(TNTPrimed.class::cast);
|
||||
}
|
||||
}
|
||||
|
@ -73,6 +73,37 @@ public class NMSWrapper18 implements NMSWrapper {
|
||||
player.updateInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(LongSupplier longSupplier) {
|
||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
||||
}
|
||||
|
||||
private static final List<Packet<?>> packets = new ArrayList<>();
|
||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
||||
|
||||
@Override
|
||||
public void createTickCache(World world) {
|
||||
packets.clear();
|
||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
||||
|
||||
if (entity instanceof TNTPrimed) {
|
||||
net.minecraft.world.entity.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.ae(), serverEntity.ai(), true));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendTickPackets() {
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
for (Packet<?> p : packets) {
|
||||
TinyProtocol.instance.sendPacket(player, p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
|
||||
|
||||
@Override
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
package de.steamwar.bausystem.utils;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import de.steamwar.bausystem.utils.PlayerMovementWrapper;
|
||||
import net.minecraft.network.protocol.game.PacketPlayInFlying;
|
||||
import net.minecraft.server.level.EntityPlayer;
|
||||
@ -38,20 +37,4 @@ public class PlayerMovementWrapper18 implements PlayerMovementWrapper {
|
||||
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertToOut(Player player, Object object) {
|
||||
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||
Object packet = Reflection.newInstance(teleportPacket);
|
||||
teleportEntity.set(packet, player.getEntityId());
|
||||
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||
if (packetPlayInFlying.h) {
|
||||
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw()));
|
||||
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
|
||||
} else {
|
||||
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
|
||||
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
|
||||
}
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
|
@ -27,8 +27,8 @@ version '1.0'
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
@ -51,7 +51,6 @@ dependencies {
|
||||
implementation project(":BauSystem_Main")
|
||||
|
||||
compileOnly 'org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT'
|
||||
compileOnly 'io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT'
|
||||
compileOnly 'it.unimi.dsi:fastutil:8.5.6'
|
||||
compileOnly 'com.mojang:datafixerupper:4.0.26'
|
||||
compileOnly 'io.netty:netty-all:4.1.68.Final'
|
||||
|
@ -0,0 +1,178 @@
|
||||
/*
|
||||
* 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.simulator.preview;
|
||||
|
||||
import org.bukkit.Axis;
|
||||
import org.bukkit.util.BoundingBox;
|
||||
import org.bukkit.util.VoxelShape;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AxisMovementLimiter19 {
|
||||
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
private Axis axis;
|
||||
private double movement;
|
||||
|
||||
private double minX;
|
||||
private double maxX;
|
||||
private double minY;
|
||||
private double maxY;
|
||||
private double minZ;
|
||||
private double maxZ;
|
||||
|
||||
public AxisMovementLimiter19(double x, double y, double z, Axis axis, double movement) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.axis = axis;
|
||||
this.movement = movement;
|
||||
|
||||
// Calculate the min and max values for the movement
|
||||
minX = x;
|
||||
maxX = x + 0.98;
|
||||
|
||||
minY = y;
|
||||
maxY = y + 0.98;
|
||||
|
||||
minZ = z;
|
||||
maxZ = z + 0.98;
|
||||
|
||||
switch (axis) {
|
||||
case X:
|
||||
if (movement < 0) {
|
||||
minX += movement;
|
||||
} else if (movement > 0) {
|
||||
maxX += movement;
|
||||
}
|
||||
break;
|
||||
case Y:
|
||||
if (movement < 0) {
|
||||
minY += movement;
|
||||
} else if (movement > 0) {
|
||||
maxY += movement;
|
||||
}
|
||||
break;
|
||||
case Z:
|
||||
if (movement < 0) {
|
||||
minZ += movement;
|
||||
} else if (movement > 0) {
|
||||
maxZ += movement;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// System.out.println(axis + " " + minX + " -> " + maxX + " " + minY + " -> " + maxY + " " + minZ + " -> " + maxZ);
|
||||
}
|
||||
|
||||
private List<Pos19> possibleCollisions() {
|
||||
int minX = TNT19.floor(this.minX);
|
||||
int maxX = TNT19.floor(this.maxX);
|
||||
int minY = TNT19.floor(this.minY) - 1;
|
||||
int maxY = TNT19.floor(this.maxY);
|
||||
int minZ = TNT19.floor(this.minZ);
|
||||
int maxZ = TNT19.floor(this.maxZ);
|
||||
|
||||
List<Pos19> poss = new ArrayList<>();
|
||||
for (int x = minX; x <= maxX; x++) {
|
||||
for (int y = minY; y <= maxY; y++) {
|
||||
for (int z = minZ; z <= maxZ; z++) {
|
||||
poss.add(new Pos19(x, y, z));
|
||||
}
|
||||
}
|
||||
}
|
||||
return poss;
|
||||
}
|
||||
|
||||
// TODO: This can be optimized by optimizing the x,y,z loop layout
|
||||
public double run(SimulatorData19 simulatorData) {
|
||||
if (movement == 0.0) return 0.0;
|
||||
|
||||
BoundingBox movementBoundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ);
|
||||
List<Pos19> poss = possibleCollisions();
|
||||
|
||||
Double collision = null;
|
||||
for (Pos19 pos : poss) {
|
||||
VoxelShape voxelShape = simulatorData.getVoxelShape(pos);
|
||||
for (BoundingBox boundingBox : voxelShape.getBoundingBoxes()) {
|
||||
boundingBox = boundingBox.clone().shift(pos.x, pos.y, pos.z);
|
||||
boolean collides = boundingBox.overlaps(movementBoundingBox);
|
||||
if (!collides) continue;
|
||||
|
||||
double value;
|
||||
switch (axis) {
|
||||
case X:
|
||||
if (movement < 0) {
|
||||
value = boundingBox.getMaxX();
|
||||
} else {
|
||||
value = boundingBox.getMinX() - 0.98;
|
||||
}
|
||||
break;
|
||||
case Y:
|
||||
if (movement < 0) {
|
||||
value = boundingBox.getMaxY();
|
||||
} else {
|
||||
value = boundingBox.getMinY() - 0.98;
|
||||
}
|
||||
break;
|
||||
case Z:
|
||||
if (movement < 0) {
|
||||
value = boundingBox.getMaxZ();
|
||||
} else {
|
||||
value = boundingBox.getMinZ() - 0.98;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + axis);
|
||||
}
|
||||
|
||||
if (collision == null) {
|
||||
collision = value;
|
||||
} else {
|
||||
if (movement < 0) {
|
||||
collision = Math.max(collision, value);
|
||||
} else {
|
||||
collision = Math.min(collision, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (collision == null) {
|
||||
return movement;
|
||||
} else {
|
||||
switch (axis) {
|
||||
case X:
|
||||
// System.out.println(axis + " " + movement + " " + x + " " + collision);
|
||||
return collision - x;
|
||||
case Y:
|
||||
// System.out.println(axis + " " + movement + " " + y + " " + collision);
|
||||
return collision - y;
|
||||
case Z:
|
||||
// System.out.println(axis + " " + movement + " " + z + " " + collision);
|
||||
return collision - z;
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + axis);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,218 @@
|
||||
/*
|
||||
* 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.simulator.preview;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.Waterlogged;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
public class Explosion19 {
|
||||
|
||||
private static final double[] FACE_BLOCKS = new double[(16 * 16 * 2 + 14 * 16 * 2 + 14 * 14 * 2) * 3];
|
||||
|
||||
static {
|
||||
int index = 0;
|
||||
for (int x = 0; x < 16; ++x) {
|
||||
for (int y = 0; y < 16; ++y) {
|
||||
for (int z = 0; z < 16; ++z) {
|
||||
if (x == 0 || x == 15 || y == 0 || y == 15 || z == 0 || z == 15) {
|
||||
double dX = x / 15.0F * 2.0F - 1.0F;
|
||||
double dY = y / 15.0F * 2.0F - 1.0F;
|
||||
double dZ = z / 15.0F * 2.0F - 1.0F;
|
||||
double length = Math.sqrt(dX * dX + dY * dY + dZ * dZ);
|
||||
FACE_BLOCKS[index++] = dX / length;
|
||||
FACE_BLOCKS[index++] = dY / length;
|
||||
FACE_BLOCKS[index++] = dZ / length;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final Set<Material> WATER_LOGABLE = new HashSet<>();
|
||||
|
||||
static {
|
||||
for (Material material : Material.values()) {
|
||||
if (Waterlogged.class.isAssignableFrom(material.data)) {
|
||||
WATER_LOGABLE.add(material);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final Random RANDOM = new Random();
|
||||
private static final float POWER = 4.0F;
|
||||
|
||||
private final TNT19 tnt;
|
||||
private final double x;
|
||||
private final double y;
|
||||
private final double z;
|
||||
|
||||
|
||||
public Explosion19(TNT19 tnt, double x, double y, double z) {
|
||||
this.tnt = tnt;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public void calculate(SimulatorData19 simulatorData) {
|
||||
Set<Pos19> affectedBlocks = new HashSet<>();
|
||||
for (int i = 0; i < FACE_BLOCKS.length; i += 3) {
|
||||
double d = FACE_BLOCKS[i + 0];
|
||||
double e = FACE_BLOCKS[i + 1];
|
||||
double f = FACE_BLOCKS[i + 2];
|
||||
|
||||
float h = POWER * (0.7F + RANDOM.nextFloat() * 0.6F);
|
||||
double m = x;
|
||||
double n = y;
|
||||
double o = z;
|
||||
|
||||
for (; h > 0.0F; h -= 0.22500001F) {
|
||||
int x = TNT19.floor(m);
|
||||
int y = TNT19.floor(n);
|
||||
int z = TNT19.floor(o);
|
||||
|
||||
Material material = simulatorData.getBlockType(x, y, z);
|
||||
if (!material.isAir()) {
|
||||
h -= (material.getBlastResistance() + 0.3F) * 0.3F;
|
||||
}
|
||||
if (WATER_LOGABLE.contains(material)) {
|
||||
Waterlogged waterlogged = (Waterlogged) simulatorData.getBlockData(x, y, z);
|
||||
if (waterlogged.isWaterlogged()) {
|
||||
h = 0.0F;
|
||||
}
|
||||
}
|
||||
|
||||
if (h > 0.0F) {
|
||||
affectedBlocks.add(new Pos19(x, y, z));
|
||||
}
|
||||
|
||||
m += d * 0.30000001192092896;
|
||||
n += e * 0.30000001192092896;
|
||||
o += f * 0.30000001192092896;
|
||||
}
|
||||
}
|
||||
simulatorData.clearBlocks(affectedBlocks);
|
||||
|
||||
float q = POWER * 2.0F;
|
||||
int k = floor(x - q - 1.0D);
|
||||
int l = floor(x + q + 1.0D);
|
||||
int r = floor(y - q - 1.0D);
|
||||
int s = floor(y + q + 1.0D);
|
||||
int t = floor(z - q - 1.0D);
|
||||
int u = floor(z + q + 1.0D);
|
||||
|
||||
for (TNT19 currentTNT : simulatorData.tntList) {
|
||||
if (currentTNT == tnt) continue;
|
||||
if (!(currentTNT.getX() >= k && currentTNT.getY() >= r && currentTNT.getZ() >= t && currentTNT.getX() <= l && currentTNT.getY() <= s && currentTNT.getZ() <= u)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
double x = currentTNT.getX() - this.x;
|
||||
double y = currentTNT.getY() - this.y;
|
||||
double z = currentTNT.getZ() - this.z;
|
||||
double aa = Math.sqrt(x * x + y * y + z * z);
|
||||
double w = aa / q;
|
||||
if (w > 1.0) {
|
||||
continue;
|
||||
}
|
||||
if (aa == 0.0) {
|
||||
continue;
|
||||
}
|
||||
x /= aa;
|
||||
y /= aa;
|
||||
z /= aa;
|
||||
|
||||
double ab = getExposure(simulatorData, currentTNT.getX(), currentTNT.getY(), currentTNT.getZ());
|
||||
double ac = (1.0 - w) * ab;
|
||||
currentTNT.setVx(currentTNT.getVx() + x * ac);
|
||||
currentTNT.setVy(currentTNT.getVy() + y * ac);
|
||||
currentTNT.setVz(currentTNT.getVz() + z * ac);
|
||||
}
|
||||
}
|
||||
|
||||
private static int floor(double value) {
|
||||
int i = (int) value;
|
||||
return value < (double) i ? i - 1 : i;
|
||||
}
|
||||
|
||||
private static final double SIZE = 0.98;
|
||||
private static final double MIN_POINT = 0.01;
|
||||
private static final double MAX_POINT = SIZE + MIN_POINT;
|
||||
private static final double EXPOSURE_CONSTANT_1 = 1.0 / (SIZE * 2 + 1.0);
|
||||
private static final double EXPOSURE_CONSTANT_2 = (1.0 - Math.floor(1.0 / EXPOSURE_CONSTANT_1) * EXPOSURE_CONSTANT_1) / 2.0;
|
||||
|
||||
private float getExposure(SimulatorData19 simulatorData, double x, double y, double z) {
|
||||
float blockMisses = 0;
|
||||
float blockTotal = 0;
|
||||
|
||||
for (double k = 0.0; k <= 1.0; k += EXPOSURE_CONSTANT_1) {
|
||||
for (double l = 0.0; l <= 1.0; l += EXPOSURE_CONSTANT_1) {
|
||||
for (double m = 0.0; m <= 1.0; m += EXPOSURE_CONSTANT_1) {
|
||||
double dx = lerp(k, MIN_POINT, MAX_POINT) + EXPOSURE_CONSTANT_2 + x;
|
||||
double dy = lerp(l, 0.0, SIZE) + y;
|
||||
double dz = lerp(m, MIN_POINT, MAX_POINT) + EXPOSURE_CONSTANT_2 + z;
|
||||
|
||||
if (rayTrace(simulatorData, dx, dy, dz, this.x, this.y, this.z)) {
|
||||
blockMisses++;
|
||||
}
|
||||
blockTotal++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return blockMisses / blockTotal;
|
||||
}
|
||||
|
||||
public static double lerp(double delta, double start, double end) {
|
||||
return start + delta * (end - start);
|
||||
}
|
||||
|
||||
public static boolean rayTrace(SimulatorData19 simulatorData, double sX, double sY, double sZ, double dX, double dY, double dZ) {
|
||||
double x = sX;
|
||||
double y = sY;
|
||||
double z = sZ;
|
||||
int oX = sX > dX ? -1 : 1;
|
||||
int oY = sY > dY ? -1 : 1;
|
||||
int oZ = sZ > dZ ? -1 : 1;
|
||||
while (true) {
|
||||
Material material = simulatorData.getBlockType(floor(x), floor(y), floor(z));
|
||||
if (material != Material.LAVA && material != Material.WATER && material != Material.AIR) {
|
||||
return true;
|
||||
}
|
||||
|
||||
double cX = x - (floor(x) + oX);
|
||||
double cY = y - (floor(y) + oY);
|
||||
double cZ = z - (floor(z) + oZ);
|
||||
|
||||
double maxChange = Math.min(Math.abs(cX), Math.min(Math.abs(cY), Math.abs(cZ)));
|
||||
x += Math.signum(cX) * maxChange;
|
||||
y += Math.signum(cY) * maxChange;
|
||||
z += Math.signum(cZ) * maxChange;
|
||||
|
||||
if (floor(x) == floor(dX) && floor(y) == floor(dY) && floor(z) == floor(dZ)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,299 @@
|
||||
/*
|
||||
* 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.simulator.preview;
|
||||
|
||||
import org.bukkit.Axis;
|
||||
import org.bukkit.util.BoundingBox;
|
||||
import org.bukkit.util.VoxelShape;
|
||||
|
||||
public class OptimizedAxisMovementLimiter19 {
|
||||
|
||||
private Axis axis;
|
||||
private double movement;
|
||||
|
||||
private double minX;
|
||||
private double maxX;
|
||||
private double minY;
|
||||
private double maxY;
|
||||
private double minZ;
|
||||
private double maxZ;
|
||||
|
||||
private int minIX;
|
||||
private int maxIX;
|
||||
private int minIY;
|
||||
private int maxIY;
|
||||
private int minIZ;
|
||||
private int maxIZ;
|
||||
|
||||
private BoundingBox movementBoundingBox;
|
||||
|
||||
public OptimizedAxisMovementLimiter19(double x, double y, double z, Axis axis, double movement) {
|
||||
this.axis = axis;
|
||||
this.movement = movement;
|
||||
|
||||
// Calculate the min and max values for the movement
|
||||
minX = x;
|
||||
maxX = x + 0.98;
|
||||
|
||||
minY = y;
|
||||
maxY = y + 0.98;
|
||||
|
||||
minZ = z;
|
||||
maxZ = z + 0.98;
|
||||
|
||||
switch (axis) {
|
||||
case X:
|
||||
if (movement < 0) {
|
||||
minX += movement;
|
||||
} else if (movement > 0) {
|
||||
maxX += movement;
|
||||
}
|
||||
break;
|
||||
case Y:
|
||||
if (movement < 0) {
|
||||
minY += movement;
|
||||
} else if (movement > 0) {
|
||||
maxY += movement;
|
||||
}
|
||||
break;
|
||||
case Z:
|
||||
if (movement < 0) {
|
||||
minZ += movement;
|
||||
} else if (movement > 0) {
|
||||
maxZ += movement;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
minIX = TNT19.floor(minX);
|
||||
maxIX = TNT19.floor(maxX);
|
||||
minIY = TNT19.floor(minY) - 1;
|
||||
maxIY = TNT19.floor(maxY);
|
||||
minIZ = TNT19.floor(minZ);
|
||||
maxIZ = TNT19.floor(maxZ);
|
||||
|
||||
movementBoundingBox = new BoundingBox(minX, minY, minZ, maxX, maxY, maxZ);
|
||||
}
|
||||
|
||||
public double run(SimulatorData19 simulatorData) {
|
||||
if (movement == 0.0) return 0.0;
|
||||
switch (axis) {
|
||||
case X:
|
||||
if (movement < 0.0) {
|
||||
return runNX(simulatorData);
|
||||
} else {
|
||||
return runPX(simulatorData);
|
||||
}
|
||||
case Y:
|
||||
if (movement < 0.0) {
|
||||
return runNY(simulatorData);
|
||||
} else {
|
||||
return runPY(simulatorData);
|
||||
}
|
||||
case Z:
|
||||
default:
|
||||
if (movement < 0.0) {
|
||||
return runNZ(simulatorData);
|
||||
} else {
|
||||
return runPZ(simulatorData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private double runNX(SimulatorData19 simulatorData) {
|
||||
Double collision = null;
|
||||
for (int x = maxIX - 1; x >= minIX; x--) {
|
||||
for (int y = minIY; y < maxIY; y++) {
|
||||
for (int z = minIZ; z < maxIZ; z++) {
|
||||
Pos19 pos = new Pos19(x, y, z);
|
||||
VoxelShape voxelShape = simulatorData.getVoxelShape(pos);
|
||||
for (BoundingBox boundingBox : voxelShape.getBoundingBoxes()) {
|
||||
boundingBox = boundingBox.clone().shift(x, y, z);
|
||||
if (!boundingBox.overlaps(movementBoundingBox)) continue;
|
||||
|
||||
double value = boundingBox.getMaxX();
|
||||
if (collision == null) {
|
||||
collision = value;
|
||||
} else {
|
||||
collision = Math.max(value, collision);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (collision != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (collision == null) {
|
||||
return movement;
|
||||
}
|
||||
return movement + (collision - minX);
|
||||
}
|
||||
|
||||
private double runPX(SimulatorData19 simulatorData) {
|
||||
Double collision = null;
|
||||
for (int x = minIX; x < maxIX; x++) {
|
||||
for (int y = minIY; y < maxIY; y++) {
|
||||
for (int z = minIZ; z < maxIZ; z++) {
|
||||
Pos19 pos = new Pos19(x, y, z);
|
||||
VoxelShape voxelShape = simulatorData.getVoxelShape(pos);
|
||||
for (BoundingBox boundingBox : voxelShape.getBoundingBoxes()) {
|
||||
boundingBox = boundingBox.clone().shift(x, y, z);
|
||||
if (!boundingBox.overlaps(movementBoundingBox)) continue;
|
||||
|
||||
double value = boundingBox.getMinX() - 0.98;
|
||||
if (collision == null) {
|
||||
collision = value;
|
||||
} else {
|
||||
collision = Math.min(value, collision);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (collision != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (collision == null) {
|
||||
return movement;
|
||||
}
|
||||
return movement + (collision - minX);
|
||||
}
|
||||
|
||||
private double runNY(SimulatorData19 simulatorData) {
|
||||
Double collision = null;
|
||||
for (int y = maxIY - 1; y >= minIY; y--) {
|
||||
for (int x = minIX; x < maxIX; x++) {
|
||||
for (int z = minIZ; z < maxIZ; z++) {
|
||||
Pos19 pos = new Pos19(x, y, z);
|
||||
VoxelShape voxelShape = simulatorData.getVoxelShape(pos);
|
||||
for (BoundingBox boundingBox : voxelShape.getBoundingBoxes()) {
|
||||
boundingBox = boundingBox.clone().shift(x, y, z);
|
||||
if (!boundingBox.overlaps(movementBoundingBox)) continue;
|
||||
|
||||
double value = boundingBox.getMaxY();
|
||||
if (collision == null) {
|
||||
collision = value;
|
||||
} else {
|
||||
collision = Math.max(value, collision);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (collision != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (collision == null) {
|
||||
return movement;
|
||||
}
|
||||
return movement + (collision - minY);
|
||||
}
|
||||
|
||||
private double runPY(SimulatorData19 simulatorData) {
|
||||
Double collision = null;
|
||||
for (int y = minIY; y < maxIY; y++) {
|
||||
for (int x = minIX; x < maxIX; x++) {
|
||||
for (int z = minIZ; z < maxIZ; z++) {
|
||||
Pos19 pos = new Pos19(x, y, z);
|
||||
VoxelShape voxelShape = simulatorData.getVoxelShape(pos);
|
||||
for (BoundingBox boundingBox : voxelShape.getBoundingBoxes()) {
|
||||
boundingBox = boundingBox.clone().shift(x, y, z);
|
||||
if (!boundingBox.overlaps(movementBoundingBox)) continue;
|
||||
|
||||
double value = boundingBox.getMinY() - 0.98;
|
||||
if (collision == null) {
|
||||
collision = value;
|
||||
} else {
|
||||
collision = Math.min(value, collision);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (collision != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (collision == null) {
|
||||
return movement;
|
||||
}
|
||||
return movement + (collision - minY);
|
||||
}
|
||||
|
||||
private double runNZ(SimulatorData19 simulatorData) {
|
||||
Double collision = null;
|
||||
for (int z = maxIZ - 1; z >= minIZ; z--) {
|
||||
for (int x = minIX; x < maxIX; x++) {
|
||||
for (int y = minIY; y < maxIY; y++) {
|
||||
Pos19 pos = new Pos19(x, y, z);
|
||||
VoxelShape voxelShape = simulatorData.getVoxelShape(pos);
|
||||
for (BoundingBox boundingBox : voxelShape.getBoundingBoxes()) {
|
||||
boundingBox = boundingBox.clone().shift(x, y, z);
|
||||
if (!boundingBox.overlaps(movementBoundingBox)) continue;
|
||||
|
||||
double value = boundingBox.getMaxZ();
|
||||
if (collision == null) {
|
||||
collision = value;
|
||||
} else {
|
||||
collision = Math.max(value, collision);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (collision != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (collision == null) {
|
||||
return movement;
|
||||
}
|
||||
return movement + (collision - minZ);
|
||||
}
|
||||
|
||||
private double runPZ(SimulatorData19 simulatorData) {
|
||||
Double collision = null;
|
||||
for (int z = minIZ; z < maxIZ; z++) {
|
||||
for (int x = minIX; x < maxIX; x++) {
|
||||
for (int y = minIY; y < maxIY; y++) {
|
||||
Pos19 pos = new Pos19(x, y, z);
|
||||
VoxelShape voxelShape = simulatorData.getVoxelShape(pos);
|
||||
for (BoundingBox boundingBox : voxelShape.getBoundingBoxes()) {
|
||||
boundingBox = boundingBox.clone().shift(x, y, z);
|
||||
if (!boundingBox.overlaps(movementBoundingBox)) continue;
|
||||
|
||||
double value = boundingBox.getMinZ() - 0.98;
|
||||
if (collision == null) {
|
||||
collision = value;
|
||||
} else {
|
||||
collision = Math.min(value, collision);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (collision != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (collision == null) {
|
||||
return movement;
|
||||
}
|
||||
return movement + (collision - minZ);
|
||||
}
|
||||
}
|
@ -17,16 +17,13 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.world;
|
||||
package de.steamwar.bausystem.features.simulator.preview;
|
||||
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import lombok.Data;
|
||||
|
||||
@Linked
|
||||
public class ArceonCommand extends SWCommand {
|
||||
|
||||
public ArceonCommand() {
|
||||
super("arceon");
|
||||
unregister();
|
||||
}
|
||||
@Data
|
||||
public class Pos19 {
|
||||
public final int x;
|
||||
public final int y;
|
||||
public final int z;
|
||||
}
|
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* 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.simulator.preview;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.simulator.TNTData;
|
||||
import de.steamwar.bausystem.features.tracer.show.Record;
|
||||
import de.steamwar.bausystem.shared.Pair;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class Simulator19 implements Simulator {
|
||||
|
||||
protected static final World WORLD = Bukkit.getWorlds().get(0);
|
||||
|
||||
@Override
|
||||
public BukkitTask run(Pair<Integer, Map<Integer, List<List<Pair<TNTData, Integer>>>>> toCalculate, Consumer<PreviewRecord> consumer) { // TODO: Implement multi tick calculation max 40 ms per tick
|
||||
if (toCalculate == null) return null;
|
||||
|
||||
BukkitRunnable bukkitRunnable = new BukkitRunnable() {
|
||||
private SimulatorData19 simulatorData = new SimulatorData19();
|
||||
private PreviewRecord previewRecord = new PreviewRecord();
|
||||
private int currentTick = 0;
|
||||
private Map<TNT19, Record.TNTRecord> recordMap = new IdentityHashMap<>();
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
long time = System.currentTimeMillis();
|
||||
while (!simulatorData.tntList.isEmpty() || currentTick <= toCalculate.getKey()) {
|
||||
if (System.currentTimeMillis() - time >= 40) break;
|
||||
|
||||
List<List<Pair<TNTData, Integer>>> toSpawnInTick = toCalculate.getValue().get(currentTick);
|
||||
if (toSpawnInTick != null) {
|
||||
int finalCurrentTick = currentTick;
|
||||
toSpawnInTick.forEach(pairs -> {
|
||||
AtomicBoolean hasSomeLeft = new AtomicBoolean(true);
|
||||
while(hasSomeLeft.get()) {
|
||||
hasSomeLeft.set(false);
|
||||
pairs.forEach(pair -> {
|
||||
if (pair.getValue() > 0) {
|
||||
hasSomeLeft.set(true);
|
||||
TNT19 tnt = new TNT19(pair.getKey().location.getX(), pair.getKey().location.getY(), pair.getKey().location.getZ());
|
||||
if (!pair.getKey().xVelocity) tnt.setVx(0.0);
|
||||
if (!pair.getKey().yVelocity) tnt.setVy(0.0);
|
||||
if (!pair.getKey().zVelocity) tnt.setVz(0.0);
|
||||
tnt.setFuse(tnt.getFuse());
|
||||
simulatorData.tntList.add(tnt);
|
||||
pair.setValue(pair.getValue() - 1);
|
||||
Record.TNTRecord record = previewRecord.getRecord().spawn(finalCurrentTick);
|
||||
record.source(pair.getKey().location.toVector(), new Vector(tnt.getVx(), tnt.getVy(), tnt.getVz()), tnt.getFuse());
|
||||
recordMap.put(tnt, record);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
currentTick++;
|
||||
|
||||
List<TNT19> remove = new ArrayList<>();
|
||||
for (TNT19 tnt : simulatorData.tntList) {
|
||||
// System.out.println("CALC: " + simulatorData.blockTypesMap.size() + "/" + simulatorData.blockDataMap.size() + "/" + simulatorData.collisionDataMap.size() + "/" + simulatorData.airBlocks.size() + " " + recordMap.size());
|
||||
if (tnt.tick(simulatorData)) {
|
||||
remove.add(tnt);
|
||||
recordMap.remove(tnt).explode(new Vector(tnt.getX(), tnt.getY(), tnt.getZ()), new Vector(tnt.getVx(), tnt.getVy(), tnt.getVz()), tnt.getFuse());
|
||||
} else {
|
||||
recordMap.get(tnt).location(new Vector(tnt.getX(), tnt.getY(), tnt.getZ()), new Vector(tnt.getVx(), tnt.getVy(), tnt.getVz()), tnt.getFuse());
|
||||
}
|
||||
}
|
||||
simulatorData.tntList.removeAll(remove);
|
||||
}
|
||||
|
||||
System.out.println("Time: " + (System.currentTimeMillis() - time) + "ms " + simulatorData.blockTypesMap.size() + "/" + simulatorData.blockDataMap.size() + "/" + simulatorData.collisionDataMap.size() + "/" + simulatorData.airBlocks.size() + " " + recordMap.size());
|
||||
if (simulatorData.tntList.isEmpty() && currentTick > toCalculate.getKey()) {
|
||||
previewRecord.setDestroyedBlocks(simulatorData.airBlocks());
|
||||
previewRecord.setAccessedBlocks(simulatorData.accessedBlocks());
|
||||
consumer.accept(previewRecord);
|
||||
cancel();
|
||||
}
|
||||
}
|
||||
};
|
||||
return bukkitRunnable.runTaskTimer(BauSystem.getInstance(), 0, 1);
|
||||
}
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* 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.simulator.preview;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.util.BoundingBox;
|
||||
import org.bukkit.util.Vector;
|
||||
import org.bukkit.util.VoxelShape;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class SimulatorData19 {
|
||||
|
||||
private static final BlockData AIR_BLOCK_DATA = Material.AIR.createBlockData();
|
||||
private static final VoxelShape AIR_VOXEL_SHAPE = new VoxelShape() {
|
||||
@Override
|
||||
public Collection<BoundingBox> getBoundingBoxes() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean overlaps(BoundingBox boundingBox) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
long accessed = 0;
|
||||
long cacheMisses = 0;
|
||||
long aired = 0;
|
||||
final List<TNT19> tntList = new ArrayList<>();
|
||||
final Set<Pos19> airBlocks = new HashSet<>();
|
||||
final Map<Pos19, Material> blockTypesMap = new HashMap<>();
|
||||
final Map<Pos19, BlockData> blockDataMap = new HashMap<>();
|
||||
final Map<Pos19, VoxelShape> collisionDataMap = new HashMap<>();
|
||||
|
||||
public Material getBlockType(int x, int y, int z) { // Get BlockType of Chunk Data array?
|
||||
accessed++;
|
||||
Pos19 pos = new Pos19(x, y, z);
|
||||
if (airBlocks.contains(pos)) {
|
||||
return Material.AIR;
|
||||
}
|
||||
return blockTypesMap.computeIfAbsent(pos, v -> {
|
||||
cacheMisses++;
|
||||
return Simulator19.WORLD.getBlockAt(x, y, z).getType();
|
||||
});
|
||||
}
|
||||
|
||||
public BlockData getBlockData(int x, int y, int z) {
|
||||
accessed++;
|
||||
Pos19 pos = new Pos19(x, y, z);
|
||||
if (airBlocks.contains(pos)) {
|
||||
return AIR_BLOCK_DATA;
|
||||
}
|
||||
return blockDataMap.computeIfAbsent(pos, v -> {
|
||||
cacheMisses++;
|
||||
return Simulator19.WORLD.getBlockAt(x, y, z).getBlockData();
|
||||
});
|
||||
}
|
||||
|
||||
public VoxelShape getVoxelShape(Pos19 pos) {
|
||||
accessed++;
|
||||
if (airBlocks.contains(pos)) {
|
||||
return AIR_VOXEL_SHAPE;
|
||||
}
|
||||
return collisionDataMap.computeIfAbsent(pos, v -> {
|
||||
cacheMisses++;
|
||||
return Simulator19.WORLD.getBlockAt(pos.x, pos.y, pos.z).getCollisionShape();
|
||||
});
|
||||
}
|
||||
|
||||
public void clearBlock(Pos19 pos) {
|
||||
aired++;
|
||||
airBlocks.add(pos);
|
||||
blockTypesMap.remove(pos);
|
||||
blockDataMap.remove(pos);
|
||||
collisionDataMap.remove(pos);
|
||||
}
|
||||
|
||||
public void clearBlocks(Set<Pos19> poss) {
|
||||
poss.forEach(this::clearBlock);
|
||||
}
|
||||
|
||||
public Set<Vector> airBlocks() {
|
||||
return airBlocks.stream().map(pos -> new Vector(pos.x, pos.y, pos.z)).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
public Predicate<Vector> accessedBlocks() {
|
||||
return vector -> {
|
||||
Pos19 pos = new Pos19(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ());
|
||||
return airBlocks.contains(pos) || blockTypesMap.containsKey(pos) || blockDataMap.containsKey(pos) || collisionDataMap.containsKey(pos);
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,327 @@
|
||||
/*
|
||||
* 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.simulator.preview;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.minecraft.world.level.RayTrace;
|
||||
import net.minecraft.world.phys.MovingObjectPosition;
|
||||
import net.minecraft.world.phys.Vec3D;
|
||||
import org.bukkit.Axis;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.block.data.type.*;
|
||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class TNT19 {
|
||||
|
||||
private static final Random R = new Random();
|
||||
|
||||
// Bottom left corner
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
|
||||
private double vx;
|
||||
private double vy;
|
||||
private double vz;
|
||||
|
||||
private int fuse;
|
||||
|
||||
private boolean onGround = false;
|
||||
private float fallDistance = 0;
|
||||
|
||||
private boolean horizontalCollision = false;
|
||||
private boolean verticalCollision = false;
|
||||
private Vector movementMultiplier = new Vector(0, 0, 0);
|
||||
|
||||
public TNT19(double x, double y, double z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
|
||||
double seed = R.nextDouble() * 6.2831854820251465;
|
||||
this.vx = -Math.sin(seed) * 0.02;
|
||||
this.vy = 0.20000000298023224;
|
||||
this.vz = -Math.cos(seed) * 0.02;
|
||||
|
||||
this.fuse = 80;
|
||||
}
|
||||
|
||||
public boolean tick(SimulatorData19 simulatorData) {
|
||||
this.vy -= 0.04;
|
||||
|
||||
move(simulatorData, new Vector(this.vx, this.vy, this.vz));
|
||||
|
||||
this.vx *= 0.98;
|
||||
this.vy *= 0.98;
|
||||
this.vz *= 0.98;
|
||||
|
||||
if (onGround) {
|
||||
this.vx *= 0.7;
|
||||
this.vy *= -0.5;
|
||||
this.vz *= 0.7;
|
||||
}
|
||||
|
||||
this.fuse--;
|
||||
if (this.fuse <= 0) {
|
||||
Explosion19 explosion = new Explosion19(this, x, y + 0.98 * 0.0625, z);
|
||||
explosion.calculate(simulatorData);
|
||||
return true;
|
||||
} else {
|
||||
// TODO: Update Water and Lava Flowing
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void move(SimulatorData19 simulatorData, Vector movement) {
|
||||
if (movementMultiplier.lengthSquared() > 1.0E-7) {
|
||||
movement.multiply(movementMultiplier);
|
||||
movementMultiplier = new Vector(0, 0, 0);
|
||||
vx = 0;
|
||||
vy = 0;
|
||||
vz = 0;
|
||||
}
|
||||
|
||||
Vector vec3d = adjustMovementForCollisions(simulatorData, movement);
|
||||
// System.out.println(movement + " " + vec3d);
|
||||
double lengthSquared = vec3d.lengthSquared();
|
||||
if (lengthSquared > 1.0E-7) {
|
||||
if (fallDistance != 0.0F && lengthSquared >= 1.0) {
|
||||
// TODO: This could be wrong
|
||||
MovingObjectPosition movingObjectPosition = ((CraftWorld) Simulator19.WORLD).getHandle().a(new RayTrace(new Vec3D(x, y, z), new Vec3D(x + vec3d.getX(), y + vec3d.getY(), z + vec3d.getZ()), RayTrace.BlockCollisionOption.d, RayTrace.FluidCollisionOption.d, null));
|
||||
if (movingObjectPosition.c() != MovingObjectPosition.EnumMovingObjectType.a) {
|
||||
onLanding();
|
||||
}
|
||||
}
|
||||
|
||||
this.x += vec3d.getX();
|
||||
this.y += vec3d.getY();
|
||||
this.z += vec3d.getZ();
|
||||
}
|
||||
|
||||
boolean bl = !approximatelyEquals(movement.getX(), vec3d.getX());
|
||||
boolean bl2 = !approximatelyEquals(movement.getZ(), vec3d.getZ());
|
||||
this.horizontalCollision = bl || bl2;
|
||||
this.verticalCollision = movement.getY() != vec3d.getY();
|
||||
|
||||
this.onGround = this.verticalCollision && movement.getY() < 0.0D;
|
||||
Vector blockPos = getLandingPos(simulatorData);
|
||||
Material material = simulatorData.getBlockType(blockPos.getBlockX(), blockPos.getBlockY(), blockPos.getBlockZ());
|
||||
BlockData blockData = simulatorData.getBlockData(blockPos.getBlockX(), blockPos.getBlockY(), blockPos.getBlockZ());
|
||||
fall(vec3d.getY(), onGround);
|
||||
|
||||
if (horizontalCollision) {
|
||||
this.vx = bl ? 0.0 : this.vx;
|
||||
this.vz = bl2 ? 0.0 : this.vz;
|
||||
}
|
||||
|
||||
if (movement.getY() != vec3d.getY()) {
|
||||
if (material == Material.SLIME_BLOCK) {
|
||||
if (this.vy < 0.0) {
|
||||
this.vy = -this.vy * 0.8;
|
||||
}
|
||||
} else if (blockData instanceof Bed) {
|
||||
if (this.vy < 0.0) {
|
||||
this.vy = -this.vy * 0.6600000262260437 * 0.8;
|
||||
}
|
||||
} else {
|
||||
this.vy = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
if (onGround && material == Material.SLIME_BLOCK) {
|
||||
double cy = Math.abs(this.vy);
|
||||
if (cy < 0.1) {
|
||||
double cy2 = 0.4 + cy * 0.2;
|
||||
this.vx = vx * cy2;
|
||||
this.vz = vz * cy2;
|
||||
}
|
||||
}
|
||||
|
||||
checkBlockCollision(simulatorData);
|
||||
float j = this.getVelocityMultiplier(simulatorData);
|
||||
this.vx *= j;
|
||||
this.vz *= j;
|
||||
}
|
||||
|
||||
private Vector adjustMovementForCollisions(SimulatorData19 simulatorData, Vector movement) {
|
||||
if (movement.lengthSquared() == 0.0) {
|
||||
return movement;
|
||||
}
|
||||
|
||||
double mY = new AxisMovementLimiter19(x, y, z, Axis.Y, movement.getY()).run(simulatorData);
|
||||
|
||||
boolean bl = Math.abs(movement.getX()) < Math.abs(movement.getZ());
|
||||
if (bl) {
|
||||
double mZ = new AxisMovementLimiter19(x, y + mY, z, Axis.Z, movement.getZ()).run(simulatorData);
|
||||
double mX = new AxisMovementLimiter19(x, y + mY, z + mZ, Axis.X, movement.getX()).run(simulatorData);
|
||||
return new Vector(mX, mY, mZ);
|
||||
} else {
|
||||
double mX = new AxisMovementLimiter19(x, y + mY, z, Axis.X, movement.getX()).run(simulatorData);
|
||||
double mZ = new AxisMovementLimiter19(x + mX, y + mY, z, Axis.Z, movement.getZ()).run(simulatorData);
|
||||
return new Vector(mX, mY, mZ);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean approximatelyEquals(double a, double b) {
|
||||
return Math.abs(b - a) < 9.999999747378752E-6;
|
||||
}
|
||||
|
||||
public static int floor(double value) {
|
||||
int i = (int)value;
|
||||
return value < (double)i ? i - 1 : i;
|
||||
}
|
||||
|
||||
private Vector getLandingPos(SimulatorData19 simulatorData) {
|
||||
int x = floor(this.x);
|
||||
int y = floor(this.y - 0.2F);
|
||||
int z = floor(this.z);
|
||||
|
||||
if (simulatorData.getBlockType(x, y, z).isAir()) {
|
||||
BlockData blockData = simulatorData.getBlockData(x, y - 1, z);
|
||||
if (blockData instanceof Fence || blockData instanceof Wall || blockData instanceof Gate) {
|
||||
return new Vector(x, y - 1, z);
|
||||
}
|
||||
}
|
||||
return new Vector(x, y, z);
|
||||
}
|
||||
|
||||
private void fall(double heightDifference, boolean onGround) {
|
||||
if (onGround) {
|
||||
if (fallDistance > 0.0F) {
|
||||
// TODO: onLandedUpon
|
||||
}
|
||||
this.onLanding();
|
||||
} else if (heightDifference < 0.0) {
|
||||
this.fallDistance -= (float)heightDifference;
|
||||
}
|
||||
}
|
||||
|
||||
private void checkBlockCollision(SimulatorData19 simulatorData) {
|
||||
int x1 = floor(x + 1.0E-7);
|
||||
int y1 = floor(y + 1.0E-7);
|
||||
int z1 = floor(z + 1.0E-7);
|
||||
int x2 = floor(x + 0.98 - 1.0E-7);
|
||||
int y2 = floor(y + 0.98 - 1.0E-7);
|
||||
int z2 = floor(z + 0.98 - 1.0E-7);
|
||||
|
||||
for (int x = x1; x <= x2; x++) {
|
||||
for (int y = y1; y <= y2; y++) {
|
||||
for (int z = z1; z <= z2; z++) {
|
||||
Material material = simulatorData.getBlockType(x, y, z);
|
||||
|
||||
if (material == Material.POWDER_SNOW) {
|
||||
slowMovement(new Vector(0.8999999761581421, 1.5, 0.8999999761581421));
|
||||
} else if (material == Material.HONEY_BLOCK) {
|
||||
if (isSliding(new Vector(x, y, z))) {
|
||||
updateSlidingVelocity();
|
||||
}
|
||||
} else if (material == Material.COBWEB) {
|
||||
slowMovement(new Vector(0.25, 0.05000000074505806, 0.25));
|
||||
} else if (material == Material.BUBBLE_COLUMN) {
|
||||
boolean drag = ((BubbleColumn) simulatorData.getBlockData(x, y, z)).isDrag();
|
||||
if (simulatorData.getBlockType(x, y + 1, z).isAir()) {
|
||||
if (drag) {
|
||||
this.vy = Math.max(-0.9, vy - 0.03);
|
||||
} else {
|
||||
this.vy = Math.min(1.8, vy + 0.1);
|
||||
}
|
||||
} else {
|
||||
if (drag) {
|
||||
this.vy = Math.max(-0.3, vy - 0.03);
|
||||
} else {
|
||||
this.vy = Math.min(0.7, vy + 0.06);
|
||||
}
|
||||
onLanding();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void slowMovement(Vector movementMultiplier) {
|
||||
onLanding();
|
||||
this.movementMultiplier = movementMultiplier;
|
||||
}
|
||||
|
||||
private void updateSlidingVelocity() {
|
||||
if (vy < -0.13) {
|
||||
double d = -0.05 / vy;
|
||||
vx *= d;
|
||||
vz *= d;
|
||||
}
|
||||
vy = -0.05;
|
||||
onLanding();
|
||||
}
|
||||
|
||||
private boolean isSliding(Vector pos) {
|
||||
if (onGround) return false;
|
||||
if (y > pos.getY() + 0.9375 - 1.0E-7) return false;
|
||||
if (vy >= -0.08) return false;
|
||||
double d = Math.abs(pos.getX() + 0.5 - x);
|
||||
double e = Math.abs(pos.getZ() + 0.5 - z);
|
||||
double f = 0.4375 + 0.98 / 2.0;
|
||||
return d + 1.0E-7 > f || e + 1.0E-7 > f;
|
||||
}
|
||||
|
||||
private float getVelocityMultiplier(SimulatorData19 simulatorData) {
|
||||
Material material = simulatorData.getBlockType(floor(x), floor(y), floor(z));
|
||||
float f = 1F;
|
||||
if (material == Material.SOUL_SAND) {
|
||||
f = 0.5F;
|
||||
} else if (material == Material.HONEY_BLOCK) {
|
||||
f = 0.4F;
|
||||
}
|
||||
if (material != Material.WATER && material != Material.BUBBLE_COLUMN) {
|
||||
if (f != 1) return f;
|
||||
material = simulatorData.getBlockType(floor(x), floor(y - 0.5000001), floor(z));
|
||||
if (material == Material.SOUL_SAND) {
|
||||
f = 0.5F;
|
||||
} else if (material == Material.HONEY_BLOCK) {
|
||||
f = 0.4F;
|
||||
}
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
private void onLanding() {
|
||||
this.fallDistance = 0.0F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TNT{" +
|
||||
"x=" + x +
|
||||
", y=" + y +
|
||||
", z=" + z +
|
||||
", vx=" + vx +
|
||||
", vy=" + vy +
|
||||
", vz=" + vz +
|
||||
", fuse=" + fuse +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -73,6 +73,39 @@ public class NMSWrapper19 implements NMSWrapper {
|
||||
player.updateInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(LongSupplier longSupplier) {
|
||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
||||
}
|
||||
|
||||
private static final List<Packet<?>> packets = new ArrayList<>();
|
||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
||||
|
||||
@Override
|
||||
public void createTickCache(World world) {
|
||||
packets.clear();
|
||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
||||
|
||||
if (entity instanceof TNTPrimed) {
|
||||
net.minecraft.world.entity.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
||||
List<DataWatcher.b<?>> list = serverEntity.al().c();
|
||||
if(list != null)
|
||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.ah(), list));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendTickPackets() {
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
for (Packet<?> p : packets) {
|
||||
TinyProtocol.instance.sendPacket(player, p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
|
||||
|
||||
@Override
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
package de.steamwar.bausystem.utils;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import net.minecraft.network.protocol.game.PacketPlayInFlying;
|
||||
import net.minecraft.server.level.EntityPlayer;
|
||||
import org.bukkit.Location;
|
||||
@ -32,30 +31,50 @@ import java.util.UUID;
|
||||
|
||||
public class PlayerMovementWrapper19 implements PlayerMovementWrapper {
|
||||
|
||||
private static class Position {
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
private float yaw;
|
||||
private float pitch;
|
||||
}
|
||||
|
||||
private Map<UUID, Position> playerLocationMap = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void setPosition(Player player, Object object) {
|
||||
Position position = playerLocationMap.computeIfAbsent(player.getUniqueId(), uuid -> {
|
||||
Position pos = new Position();
|
||||
Location location = player.getLocation();
|
||||
pos.x = location.getX();
|
||||
pos.y = location.getY();
|
||||
pos.z = location.getZ();
|
||||
pos.yaw = location.getYaw();
|
||||
pos.pitch = location.getPitch();
|
||||
return pos;
|
||||
});
|
||||
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (packetPlayInFlying.h) {
|
||||
entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
|
||||
position.x = packetPlayInFlying.a;
|
||||
position.y = packetPlayInFlying.b;
|
||||
position.z = packetPlayInFlying.c;
|
||||
position.yaw = packetPlayInFlying.d;
|
||||
position.pitch = packetPlayInFlying.e;
|
||||
} else {
|
||||
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||
position.x = packetPlayInFlying.a;
|
||||
position.y = packetPlayInFlying.b;
|
||||
position.z = packetPlayInFlying.c;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertToOut(Player player, Object object) {
|
||||
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||
Object packet = Reflection.newInstance(teleportPacket);
|
||||
teleportEntity.set(packet, player.getEntityId());
|
||||
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||
if (packetPlayInFlying.h) {
|
||||
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw()));
|
||||
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
|
||||
} else {
|
||||
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
|
||||
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
|
||||
public void disable(Player player) {
|
||||
Position position = playerLocationMap.remove(player.getUniqueId());
|
||||
if (position != null) {
|
||||
player.teleport(new Location(player.getWorld(), position.x, position.y, position.z, position.yaw, position.pitch));
|
||||
}
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
|
@ -1,51 +0,0 @@
|
||||
/*
|
||||
* 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.utils;
|
||||
|
||||
import com.destroystokyo.paper.event.server.ServerTickEndEvent;
|
||||
import com.destroystokyo.paper.event.server.ServerTickStartEvent;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
public class TickListener19 implements TickListener, Listener {
|
||||
|
||||
private boolean tickStartRan = false;
|
||||
|
||||
public TickListener19() {
|
||||
Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onServerTickStart(ServerTickStartEvent event) {
|
||||
if (TPSFreezeUtils.isFrozen()) return;
|
||||
Bukkit.getPluginManager().callEvent(new TickStartEvent());
|
||||
tickStartRan = true;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onServerTickEnd(ServerTickEndEvent event) {
|
||||
if (!tickStartRan) return;
|
||||
Bukkit.getPluginManager().callEvent(new TickEndEvent());
|
||||
tickStartRan = false;
|
||||
}
|
||||
}
|
@ -27,8 +27,8 @@ version '1.0'
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
@ -17,15 +17,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.utils;
|
||||
package de.steamwar.bausystem.features.simulator.preview;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.core.VersionDependent;
|
||||
|
||||
public interface TickListener {
|
||||
|
||||
TickListener impl = VersionDependent.getVersionImpl(BauSystem.getInstance());
|
||||
|
||||
default void init() {
|
||||
}
|
||||
public class Simulator20 implements Simulator {
|
||||
}
|
@ -20,23 +20,32 @@
|
||||
package de.steamwar.bausystem.utils;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import de.steamwar.bausystem.features.util.NoClipCommand;
|
||||
import net.minecraft.SystemUtils;
|
||||
import net.minecraft.nbt.NBTBase;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.network.protocol.game.PacketPlayInSetCreativeSlot;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutExplosion;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange;
|
||||
import net.minecraft.network.protocol.Packet;
|
||||
import net.minecraft.network.protocol.game.*;
|
||||
import net.minecraft.network.syncher.DataWatcher;
|
||||
import net.minecraft.server.level.PlayerInteractManager;
|
||||
import net.minecraft.world.level.EnumGamemode;
|
||||
import net.minecraft.world.phys.Vec3D;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
|
||||
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.LongSupplier;
|
||||
|
||||
public class NMSWrapper20 implements NMSWrapper {
|
||||
|
||||
@ -45,7 +54,7 @@ public class NMSWrapper20 implements NMSWrapper {
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void setInternalGameMode(Player player, GameMode gameMode) {
|
||||
playerGameMode.set(((CraftPlayer) player).getHandle().e, EnumGamemode.a(gameMode.getValue()));
|
||||
playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -64,6 +73,39 @@ public class NMSWrapper20 implements NMSWrapper {
|
||||
player.updateInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(LongSupplier longSupplier) {
|
||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
||||
}
|
||||
|
||||
private static final List<Packet<?>> packets = new ArrayList<>();
|
||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
||||
|
||||
@Override
|
||||
public void createTickCache(World world) {
|
||||
packets.clear();
|
||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
||||
|
||||
if (entity instanceof TNTPrimed) {
|
||||
net.minecraft.world.entity.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
||||
List<DataWatcher.b<?>> list = serverEntity.aj().c();
|
||||
if(list != null)
|
||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.af(), list));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendTickPackets() {
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
for (Packet<?> p : packets) {
|
||||
TinyProtocol.instance.sendPacket(player, p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
|
||||
|
||||
@Override
|
||||
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* 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.utils;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
public class PlaceItemWrapper20 implements PlaceItemWrapper {
|
||||
|
||||
public PlaceItemWrapper20() {
|
||||
for (Material material : Material.values()) {
|
||||
if (!material.isBlock()) continue;
|
||||
if (material.isLegacy()) continue;
|
||||
BlockData blockData = material.createBlockData();
|
||||
Material placementMaterial = blockData.getPlacementMaterial();
|
||||
if (material == placementMaterial) continue;
|
||||
if (placementMaterial == Material.AIR) continue;
|
||||
if (placementMaterial.isItem() && !placementMaterial.isBlock()) {
|
||||
ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(placementMaterial, material);
|
||||
}
|
||||
if (material.name().contains("WALL")) {
|
||||
BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(placementMaterial, material);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -19,9 +19,7 @@
|
||||
|
||||
package de.steamwar.bausystem.utils;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import net.minecraft.network.protocol.game.PacketPlayInFlying;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutEntityTeleport;
|
||||
import net.minecraft.server.level.EntityPlayer;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
|
||||
@ -33,30 +31,50 @@ import java.util.UUID;
|
||||
|
||||
public class PlayerMovementWrapper20 implements PlayerMovementWrapper {
|
||||
|
||||
private static class Position {
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
private float yaw;
|
||||
private float pitch;
|
||||
}
|
||||
|
||||
private Map<UUID, Position> playerLocationMap = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void setPosition(Player player, Object object) {
|
||||
Position position = playerLocationMap.computeIfAbsent(player.getUniqueId(), uuid -> {
|
||||
Position pos = new Position();
|
||||
Location location = player.getLocation();
|
||||
pos.x = location.getX();
|
||||
pos.y = location.getY();
|
||||
pos.z = location.getZ();
|
||||
pos.yaw = location.getYaw();
|
||||
pos.pitch = location.getPitch();
|
||||
return pos;
|
||||
});
|
||||
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (packetPlayInFlying.h) {
|
||||
entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
|
||||
position.x = packetPlayInFlying.a;
|
||||
position.y = packetPlayInFlying.b;
|
||||
position.z = packetPlayInFlying.c;
|
||||
position.yaw = packetPlayInFlying.d;
|
||||
position.pitch = packetPlayInFlying.e;
|
||||
} else {
|
||||
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||
position.x = packetPlayInFlying.a;
|
||||
position.y = packetPlayInFlying.b;
|
||||
position.z = packetPlayInFlying.c;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertToOut(Player player, Object object) {
|
||||
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||
Object packet = Reflection.newInstance(teleportPacket);
|
||||
teleportEntity.set(packet, player.getEntityId());
|
||||
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||
if (packetPlayInFlying.h) {
|
||||
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw()));
|
||||
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
|
||||
} else {
|
||||
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
|
||||
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
|
||||
public void disable(Player player) {
|
||||
Position position = playerLocationMap.remove(player.getUniqueId());
|
||||
if (position != null) {
|
||||
player.teleport(new Location(player.getWorld(), position.x, position.y, position.z, position.yaw, position.pitch));
|
||||
}
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
|
@ -27,8 +27,8 @@ version '1.0'
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
@ -35,6 +35,6 @@ public class ScoreboardElement_GENERIC implements LinkageType {
|
||||
@Override
|
||||
public void generateCode(BuildPlan buildPlan, MethodBuilder methodBuilder, String s, TypeElement typeElement) {
|
||||
buildPlan.addImport("de.steamwar.bausystem.features.world.BauScoreboard");
|
||||
methodBuilder.addLine("BauScoreboard.addElement(" + s + ");");
|
||||
methodBuilder.addLine("BauScoreboard.ELEMENTS.add(" + s + ");");
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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.linkage.types;
|
||||
|
||||
import de.steamwar.linkage.LinkageType;
|
||||
import de.steamwar.linkage.plan.BuildPlan;
|
||||
import de.steamwar.linkage.plan.MethodBuilder;
|
||||
|
||||
import javax.lang.model.element.TypeElement;
|
||||
|
||||
public class SmartPlaceBehaviour_GENERIC implements LinkageType {
|
||||
|
||||
@Override
|
||||
public String method() {
|
||||
return "linkSmartPlace";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateCode(BuildPlan buildPlan, MethodBuilder methodBuilder, String s, TypeElement typeElement) {
|
||||
buildPlan.addImport("de.steamwar.bausystem.features.smartplace.SmartPlaceListener");
|
||||
methodBuilder.addLine("SmartPlaceListener.add(" + s + ");");
|
||||
}
|
||||
}
|
@ -27,8 +27,8 @@ version '1.0'
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
@ -54,16 +54,16 @@ dependencies {
|
||||
implementation project(":BauSystem_Linkage")
|
||||
annotationProcessor project(":BauSystem_Linkage")
|
||||
|
||||
compileOnly 'org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT'
|
||||
compileOnly 'org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT'
|
||||
compileOnly 'com.mojang:authlib:1.5.25'
|
||||
compileOnly 'io.netty:netty-all:4.1.68.Final'
|
||||
|
||||
compileOnly swdep('Spigot-1.20')
|
||||
compileOnly swdep('Spigot-1.19')
|
||||
// compileOnly swdep('WorldEdit-1.15')
|
||||
compileOnly swdep('SpigotCore')
|
||||
annotationProcessor swdep('SpigotCore')
|
||||
|
||||
compileOnly swdep('FastAsyncWorldEdit-1.18')
|
||||
compileOnly swdep('AxiomPaper')
|
||||
|
||||
implementation 'org.luaj:luaj-jse:3.0.1'
|
||||
}
|
Datei-Diff unterdrückt, da er zu groß ist
Diff laden
Datei-Diff unterdrückt, da er zu groß ist
Diff laden
@ -21,20 +21,20 @@ package de.steamwar.bausystem;
|
||||
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import de.steamwar.bausystem.configplayer.Config;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils;
|
||||
import de.steamwar.bausystem.linkage.LinkageUtils;
|
||||
import de.steamwar.bausystem.features.tpslimit.FreezeUtils;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSLimitUtils;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSWarpUtils;
|
||||
import de.steamwar.bausystem.features.world.RamUsage;
|
||||
import de.steamwar.bausystem.region.loader.PrototypeLoader;
|
||||
import de.steamwar.bausystem.region.loader.RegionLoader;
|
||||
import de.steamwar.bausystem.region.loader.Updater;
|
||||
import de.steamwar.bausystem.utils.TickListener;
|
||||
import de.steamwar.bausystem.worlddata.WorldData;
|
||||
import de.steamwar.command.AbstractValidator;
|
||||
import de.steamwar.command.SWCommandUtils;
|
||||
import de.steamwar.bausystem.linkage.LinkageUtils;
|
||||
import de.steamwar.message.Message;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
@ -52,13 +52,16 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
|
||||
// This should be treated as final!
|
||||
public static Message MESSAGE;
|
||||
public static final boolean DEV_SERVER = !System.getProperty("user.home").endsWith("minecraft");
|
||||
|
||||
@Getter
|
||||
private static BauSystem instance;
|
||||
|
||||
private World world;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
world = Bukkit.getWorlds().get(0);
|
||||
|
||||
// LOGGER
|
||||
fixLogging();
|
||||
|
||||
@ -73,40 +76,31 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
} catch (SecurityException e) {
|
||||
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||
Bukkit.shutdown();
|
||||
System.exit(1);
|
||||
return;
|
||||
}
|
||||
|
||||
new Updater(PrototypeLoader.file, PrototypeLoader::load);
|
||||
new Updater(RegionLoader.file, RegionLoader::load);
|
||||
|
||||
SWCommandUtils.addValidator(Player.class, validator(Permission.BUILD));
|
||||
SWCommandUtils.addValidator(CommandSender.class, validator(Permission.BUILD));
|
||||
SWCommandUtils.addValidator("supervisor", validator(Permission.SUPERVISOR));
|
||||
SWCommandUtils.addValidator("owner", validator(Permission.OWNER));
|
||||
|
||||
try {
|
||||
LinkageUtils.link();
|
||||
} catch (Exception e) {
|
||||
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||
Bukkit.shutdown();
|
||||
System.exit(1);
|
||||
return;
|
||||
}
|
||||
TickListener.impl.init();
|
||||
}
|
||||
RamUsage.init();
|
||||
|
||||
private <T extends CommandSender> AbstractValidator<T, ?> validator(Permission permission) {
|
||||
return (commandSender, object, messageSender) -> {
|
||||
if (commandSender instanceof Player) {
|
||||
if (permission.hasPermission((Player) commandSender)) {
|
||||
return true;
|
||||
// This could disable any watchdog stuff. We need to investigate if this is a problem.
|
||||
/*
|
||||
Thread thread = new Thread(() -> {
|
||||
while (true) {
|
||||
WatchdogThread.tick();
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
messageSender.send("NO_PERMISSION");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
});
|
||||
thread.setName("WatchdogThread ticker");
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -145,7 +139,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (TPSFreezeUtils.isFrozen()) return;
|
||||
if (FreezeUtils.isFrozen()) return;
|
||||
if (counter >= delay) {
|
||||
runnable.run();
|
||||
cancel();
|
||||
@ -163,7 +157,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (TPSFreezeUtils.isFrozen()) return;
|
||||
if (FreezeUtils.isFrozen()) return;
|
||||
if (counter >= (first ? delay : period)) {
|
||||
first = false;
|
||||
runnable.run();
|
||||
|
@ -20,77 +20,72 @@
|
||||
package de.steamwar.bausystem;
|
||||
|
||||
import de.steamwar.bausystem.config.BauServer;
|
||||
import de.steamwar.bausystem.features.world.BauMemberUpdate;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.command.CommandMetaData;
|
||||
import de.steamwar.command.TypeValidator;
|
||||
import de.steamwar.sql.BauweltMember;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@AllArgsConstructor
|
||||
public enum Permission {
|
||||
|
||||
OWNER(bauweltMember -> false),
|
||||
SUPERVISOR(bauweltMember -> {
|
||||
return bauweltMember.isSupervisor();
|
||||
}),
|
||||
BUILD(bauweltMember -> {
|
||||
if (isTempOnlySpectator(bauweltMember)) return false;
|
||||
return bauweltMember.isBuild() || SUPERVISOR.permissionPredicate.test(bauweltMember);
|
||||
}),
|
||||
/**
|
||||
* Only used for {@link BauMemberUpdate}
|
||||
*/
|
||||
REAL_SPECTATOR(bauweltMember -> {
|
||||
return !bauweltMember.isBuild() && !bauweltMember.isSupervisor();
|
||||
}),
|
||||
/**
|
||||
* Primarily used for {@link de.steamwar.bausystem.linkage.specific.GuiItem}
|
||||
*/
|
||||
MEMBER(bauweltMember -> {
|
||||
return true;
|
||||
});
|
||||
|
||||
private static final Set<Integer> TEMP_ONLY_SPECTATOR = new HashSet<>();
|
||||
|
||||
private static boolean isTempOnlySpectator(BauweltMember bauweltMember) {
|
||||
return TEMP_ONLY_SPECTATOR.contains(bauweltMember.getMemberID());
|
||||
}
|
||||
|
||||
public static boolean isTempOnlySpectator(Player player) {
|
||||
return TEMP_ONLY_SPECTATOR.contains(SteamwarUser.get(player.getUniqueId()).getId());
|
||||
}
|
||||
|
||||
public static void forceOnlySpectator(Player player) {
|
||||
TEMP_ONLY_SPECTATOR.add(SteamwarUser.get(player.getUniqueId()).getId());
|
||||
BauMemberUpdate.baumemberUpdate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Only used by {@link BauMemberUpdate}
|
||||
*/
|
||||
public static void removeForceOnlySpectator(Player player) {
|
||||
TEMP_ONLY_SPECTATOR.remove(SteamwarUser.get(player.getUniqueId()).getId());
|
||||
}
|
||||
WORLD(BauweltMember::isWorld),
|
||||
WORLDEDIT(BauweltMember::isWorldEdit),
|
||||
MEMBER(bauweltMember -> true),
|
||||
OWNER(bauweltMember -> false);
|
||||
|
||||
private final Predicate<BauweltMember> permissionPredicate;
|
||||
|
||||
public boolean hasPermission(BauweltMember bauweltMember) {
|
||||
if (bauweltMember == null) return false;
|
||||
return permissionPredicate.test(bauweltMember);
|
||||
public boolean hasPermission(Player member) {
|
||||
if (member.getUniqueId().equals(BauServer.getInstance().getOwner())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean hasPermission(Player member) {
|
||||
if (SteamwarUser.get(member.getUniqueId()).getId() == BauServer.getInstance().getOwnerID()) {
|
||||
return this != REAL_SPECTATOR;
|
||||
BauweltMember bauMember = BauweltMember.getBauMember(BauServer.getInstance().getOwner(), member.getUniqueId());
|
||||
if (bauMember == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return permissionPredicate.test(bauMember);
|
||||
}
|
||||
|
||||
public static boolean hasPermission(Player member, Permission permission) {
|
||||
return permission.hasPermission(member);
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.PARAMETER)
|
||||
@CommandMetaData.Parameter({Player.class})
|
||||
@CommandMetaData.ImplicitValidator(handler = Perm.Handler.class, order = -10)
|
||||
public @interface Perm {
|
||||
Permission value();
|
||||
String message() default "";
|
||||
|
||||
class Handler implements TypeValidator<Player> {
|
||||
|
||||
private Permission permission;
|
||||
private String message;
|
||||
|
||||
public Handler(Perm perm) {
|
||||
this.permission = perm.value();
|
||||
this.message = perm.message();
|
||||
if (message != null && message.isEmpty()) message = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validate(CommandSender commandSender, Player player, MessageSender messageSender) {
|
||||
if (message == null) {
|
||||
return permission.hasPermission(player);
|
||||
}
|
||||
return !messageSender.send(!permission.hasPermission((Player) commandSender), message);
|
||||
}
|
||||
}
|
||||
BauweltMember bauweltMember = BauweltMember.getBauMember(BauServer.getInstance().getOwner(), member.getUniqueId());
|
||||
if (bauweltMember == null) return this == REAL_SPECTATOR;
|
||||
return permissionPredicate.test(bauweltMember);
|
||||
}
|
||||
}
|
@ -97,7 +97,7 @@ public class Config implements Listener {
|
||||
|
||||
public void saveAll() {
|
||||
playerConfigurations.forEach((uuid, yapionObject) -> {
|
||||
String string = yapionObject.toYAPION(new StringOutput()).getResult().replaceAll("\\+", "\\");
|
||||
String string = yapionObject.toYAPION(new StringOutput()).getResult();
|
||||
UserConfig.updatePlayerConfig(uuid, "bausystem", string);
|
||||
});
|
||||
playerConfigurations.clear();
|
||||
@ -112,7 +112,7 @@ public class Config implements Listener {
|
||||
UUID uuid = player.getUniqueId();
|
||||
if (playerConfigurations.containsKey(uuid)) {
|
||||
YAPIONObject yapionObject = playerConfigurations.get(uuid);
|
||||
String string = yapionObject.toYAPION(new StringOutput()).getResult().replaceAll("\\\\+", "\\\\");
|
||||
String string = yapionObject.toYAPION(new StringOutput()).getResult();
|
||||
UserConfig.updatePlayerConfig(uuid, "bausystem", string);
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ public class AttributeRemoveCommand extends SWCommand {
|
||||
|
||||
@Register({"all"})
|
||||
@Register({"*"})
|
||||
public void genericCommand(@Validator Player player) {
|
||||
public void genericCommand(Player player) {
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.setLore(new ArrayList<>());
|
||||
@ -53,7 +53,7 @@ public class AttributeRemoveCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(description = "ATTRIBUTE_REMOVE_COMMAND_HELP")
|
||||
public void genericCommand(@Validator Player player, @Mapper("attribute") String attribute) {
|
||||
public void genericCommand(Player player, @Mapper("attribute") String attribute) {
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (itemMeta == null) {
|
||||
@ -73,7 +73,7 @@ public class AttributeRemoveCommand extends SWCommand {
|
||||
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_NOT_FOUND", player);
|
||||
return;
|
||||
}
|
||||
lore.removeIf(s -> s.startsWith("§8-§7 " + attribute + "§8:"));
|
||||
lore.removeIf(s -> s.equals("§8-§7 " + attribute));
|
||||
if (lore.size() == 1) {
|
||||
itemStack.setItemMeta(null);
|
||||
} else {
|
||||
@ -99,13 +99,15 @@ public class AttributeRemoveCommand extends SWCommand {
|
||||
return lore.stream()
|
||||
.skip(1)
|
||||
.map(s1 -> s1.substring(6))
|
||||
.map(s1 -> s1.substring(0, s1.indexOf("§8:")))
|
||||
.map(s1 -> s1.replace('§', '&'))
|
||||
.map(s1 -> s1.replace(' ', '_'))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||
return s;
|
||||
return s.replace('_', ' ')
|
||||
.replace('&', '§');
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ public class AttributesCopyCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register
|
||||
public void genericCommand(@Validator Player player) {
|
||||
public void genericCommand(Player player) {
|
||||
Block block = player.getTargetBlockExact(8, FluidCollisionMode.ALWAYS);
|
||||
if (block == null) return;
|
||||
ItemStack mainHand = player.getInventory().getItemInMainHand();
|
||||
|
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bausystem.features.attributescopy;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
@ -41,7 +40,6 @@ public class AttributesPlaceListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onBlockPlace(BlockPlaceEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
ItemStack itemStack = event.getItemInHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (itemMeta == null) return;
|
||||
|
@ -32,7 +32,7 @@ public class AutoStartCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(description = "AUTOSTART_COMMAND_HELP")
|
||||
public void genericCommand(@Validator Player p) {
|
||||
public void genericCommand(Player p) {
|
||||
SWUtils.giveItemToPlayer(p, AutostartListener.getWandItem(p));
|
||||
}
|
||||
}
|
||||
|
@ -50,6 +50,6 @@ public class AutoStartGuiItem extends BauGuiItem {
|
||||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.BUILD;
|
||||
return Permission.MEMBER;
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bausystem.features.autostart;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.RegionUtils;
|
||||
@ -30,22 +29,19 @@ import de.steamwar.bausystem.utils.ItemUtils;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.type.Chest;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Linked
|
||||
public class AutostartListener implements Listener {
|
||||
@ -68,42 +64,15 @@ public class AutostartListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (!ItemUtils.isItem(event.getItem(), "autostart")) {
|
||||
return;
|
||||
}
|
||||
if (event.getClickedBlock() == null) {
|
||||
return;
|
||||
}
|
||||
if (event.getClickedBlock().getBlockData() instanceof Chest) {
|
||||
return;
|
||||
}
|
||||
if (event.getClickedBlock().getType() == Material.BEDROCK) {
|
||||
event.getClickedBlock().setType(Material.SLIME_BLOCK);
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
event.getClickedBlock().setType(Material.BEDROCK, false);
|
||||
}, 1);
|
||||
}
|
||||
activate(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryClose(InventoryCloseEvent event) {
|
||||
if (!(event.getPlayer() instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
if(!Permission.BUILD.hasPermission((Player) event.getPlayer())) return;
|
||||
if (!ItemUtils.isItem(event.getPlayer().getInventory().getItemInMainHand(), "autostart")) {
|
||||
return;
|
||||
}
|
||||
if (event.getInventory().getLocation() == null) {
|
||||
return;
|
||||
}
|
||||
if (event.getInventory().getLocation().getBlock().getBlockData() instanceof Chest) {
|
||||
activate((Player) event.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
public void activate(Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region.isGlobal()) {
|
||||
@ -127,24 +96,17 @@ public class AutostartListener implements Listener {
|
||||
if (regionStartTime.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.blockList().forEach(block -> {
|
||||
Region region = Region.getRegion(block.getLocation());
|
||||
if (!regionStartTime.containsKey(region)) return;
|
||||
if (!region.hasType(RegionType.TESTBLOCK)) return;
|
||||
if (!region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) return;
|
||||
long tickDiff = TPSUtils.currentRealTick.get() - regionStartTime.remove(region);
|
||||
long preFightDurationInSeconds = getPreFightDurationInSeconds(region);
|
||||
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT1", tickDiff);
|
||||
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT2", preFightDurationInSeconds, ((preFightDurationInSeconds * 20) - tickDiff));
|
||||
RegionUtils.message(region, player -> {
|
||||
return BauSystem.MESSAGE.parse("AUTOSTART_MESSAGE_RESULT1", player, new SimpleDateFormat(BauSystem.MESSAGE.parse("AUTOSTART_MESSAGE_DATE_PATTERN", player)).format(new Date(tickDiff * 50)));
|
||||
});
|
||||
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT2", 30, (600 - tickDiff));
|
||||
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT3");
|
||||
});
|
||||
}
|
||||
|
||||
private int getPreFightDurationInSeconds(Region region) {
|
||||
File file = region.gameModeConfig();
|
||||
if (file == null) return 30;
|
||||
FileConfiguration config = YamlConfiguration.loadConfiguration(file);
|
||||
return config.getInt("Times.PreFightDuration", 30);
|
||||
}
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ public class BackupCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "create", description = "BACKUP_HELP_CREATE")
|
||||
public void backupCreate(@Validator("owner") Player p) {
|
||||
public void backupCreate(@Validator Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
@ -79,7 +79,7 @@ public class BackupCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "load", description = "BACKUP_HELP_LOAD")
|
||||
public void backupLoad(@Validator("owner") Player p, @Mapper("backupName") String backupName) {
|
||||
public void backupLoad(@Validator Player p, @Mapper("backupName") String backupName) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
@ -92,6 +92,7 @@ public class BackupCommand extends SWCommand {
|
||||
}
|
||||
EditSession editSession = new PasteBuilder(new PasteBuilder.FileProvider(backupFile))
|
||||
.pastePoint(region.getMinPoint().add(region.getPrototype().getSizeX() / 2, 0, region.getPrototype().getSizeZ() / 2))
|
||||
.color(region.getPlain(Flag.COLOR, ColorMode.class).getColor())
|
||||
.minPoint(region.getMinPoint())
|
||||
.maxPoint(region.getMaxPoint())
|
||||
.waterLevel(region.getWaterLevel())
|
||||
@ -130,7 +131,7 @@ public class BackupCommand extends SWCommand {
|
||||
}
|
||||
SWListInv<String> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("BACKUP_INV_NAME", p), swListEntries, (clickType, s) -> {
|
||||
p.getOpenInventory().close();
|
||||
p.performCommand("backup load " + s);
|
||||
backupLoad(p, s);
|
||||
});
|
||||
swListInv.open();
|
||||
}
|
||||
@ -140,6 +141,13 @@ public class BackupCommand extends SWCommand {
|
||||
return SWCommandUtils.createMapper(s -> s, (commandSender, s) -> listBackup((Player) commandSender));
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> backupValidator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLDEDIT), "BACKUP_NO_PERMS");
|
||||
};
|
||||
}
|
||||
|
||||
private List<String> listBackup(Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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.bau;
|
||||
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.LinkedInstance;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@Linked
|
||||
public class BauCommand extends SWCommand {
|
||||
|
||||
@LinkedInstance
|
||||
public InfoCommand infoCommand;
|
||||
|
||||
public BauCommand() {
|
||||
super("bau", "b", "gs");
|
||||
}
|
||||
|
||||
@Register(value = "info", description = "BAU_COMMAND_HELP_INFO")
|
||||
public void infoCommand(Player p) {
|
||||
infoCommand.sendBauInfo(p);
|
||||
}
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
/*
|
||||
* 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.bau;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.command.PreviousArguments;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.command.TypeMapper;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.techhider.TechHider;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Linked
|
||||
public class ForceSpectatorCommand extends SWCommand {
|
||||
|
||||
public ForceSpectatorCommand() {
|
||||
super("forcespectator");
|
||||
}
|
||||
|
||||
@Register
|
||||
public void forceSpectator(@Validator("supervisor") Player player, @Mapper("builder") Player other) {
|
||||
Permission.forceOnlySpectator(other);
|
||||
}
|
||||
|
||||
@Mapper("builder")
|
||||
public TypeMapper<Player> spectatorMapper() {
|
||||
return new TypeMapper<>() {
|
||||
@Override
|
||||
public Player map(CommandSender commandSender, String[] previousArguments, String s) {
|
||||
Player player = Bukkit.getPlayer(s);
|
||||
if (player == null) {
|
||||
return null;
|
||||
}
|
||||
if (Permission.BUILD.hasPermission(player) && !Permission.SUPERVISOR.hasPermission(player)) {
|
||||
return player;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
||||
return Bukkit.getOnlinePlayers().stream()
|
||||
.filter(Permission.BUILD::hasPermission)
|
||||
.filter(player -> !Permission.SUPERVISOR.hasPermission(player))
|
||||
.map(Player::getName)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
package de.steamwar.bausystem.features.bau;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.config.BauServer;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSWarpUtils;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.flags.Flag;
|
||||
import de.steamwar.command.SWCommand;
|
||||
@ -13,7 +13,9 @@ import de.steamwar.sql.BauweltMember;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
import static de.steamwar.bausystem.features.tpslimit.TPSWarpUtils.getTps;
|
||||
|
||||
@Linked
|
||||
public class InfoCommand extends SWCommand {
|
||||
@ -25,8 +27,17 @@ public class InfoCommand extends SWCommand {
|
||||
super("bauinfo");
|
||||
}
|
||||
|
||||
@Register(description = "BAU_INFO_COMMAND_HELP")
|
||||
@Register(help = true)
|
||||
public void genericHelp(Player p, String... args) {
|
||||
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_HELP", p);
|
||||
}
|
||||
|
||||
@Register
|
||||
public void genericCommand(Player p) {
|
||||
sendBauInfo(p);
|
||||
}
|
||||
|
||||
public void sendBauInfo(Player p) {
|
||||
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_OWNER", p, SteamwarUser.get(bauServer.getOwnerID()).getUserName());
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
for (Flag flag : Flag.getFlags()) {
|
||||
@ -39,48 +50,28 @@ public class InfoCommand extends SWCommand {
|
||||
}
|
||||
}
|
||||
|
||||
if (Permission.BUILD.hasPermission(p)) {
|
||||
List<BauweltMember> members = BauweltMember.getMembers(bauServer.getOwnerID());
|
||||
Map<Permission, List<BauweltMember>> memberByPermission = new HashMap<>();
|
||||
members.forEach(member -> {
|
||||
if (Permission.SUPERVISOR.hasPermission(member)) {
|
||||
memberByPermission.computeIfAbsent(Permission.SUPERVISOR, __ -> new ArrayList<>()).add(member);
|
||||
} else if (Permission.BUILD.hasPermission(member)) {
|
||||
memberByPermission.computeIfAbsent(Permission.BUILD, __ -> new ArrayList<>()).add(member);
|
||||
} else {
|
||||
memberByPermission.computeIfAbsent(Permission.MEMBER, __ -> new ArrayList<>()).add(member);
|
||||
}
|
||||
});
|
||||
|
||||
List<BauweltMember> supervisor = memberByPermission.getOrDefault(Permission.SUPERVISOR, Collections.emptyList());
|
||||
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_MEMBER", p, "§eSupervisor", supervisor.size(), supervisor.isEmpty() ? "§8<none>" : joining(supervisor));
|
||||
|
||||
List<BauweltMember> builder = memberByPermission.getOrDefault(Permission.BUILD, Collections.emptyList());
|
||||
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_MEMBER", p, "§6Builder", builder.size(), builder.isEmpty() ? "§8<none>" : joining(builder));
|
||||
|
||||
List<BauweltMember> spectator = memberByPermission.getOrDefault(Permission.MEMBER, Collections.emptyList());
|
||||
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_MEMBER", p, "§7Spectator", spectator.size(), spectator.isEmpty() ? "§8<none>" : joining(spectator));
|
||||
StringBuilder membermessage = new StringBuilder();
|
||||
membermessage.append(BauSystem.MESSAGE.parsePrefixed("BAU_INFO_COMMAND_MEMBER", p));
|
||||
|
||||
for (BauweltMember member : members) {
|
||||
membermessage.append(BauSystem.MESSAGE.parse("BAU_INFO_MEMBER_INFO", p,
|
||||
SteamwarUser.get(member.getMemberID()).getUserName(),
|
||||
member.isWorldEdit() ? BauSystem.MESSAGE.parse("BAU_INFO_MEMBER_WE_ALLOW", p) : BauSystem.MESSAGE.parse("BAU_INFO_MEMBER_WE_DISALLOW", p),
|
||||
member.isWorld() ? BauSystem.MESSAGE.parse("BAU_INFO_MEMBER_WORLD_ALLOW", p) : BauSystem.MESSAGE.parse("BAU_INFO_MEMBER_WORLD_DISALLOW", p)
|
||||
));
|
||||
}
|
||||
p.sendMessage(membermessage.toString());
|
||||
|
||||
StringBuilder tpsMessage = new StringBuilder();
|
||||
tpsMessage.append(BauSystem.MESSAGE.parsePrefixed("BAU_INFO_COMMAND_TPS", p));
|
||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_SECOND));
|
||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_SECONDS));
|
||||
tpsMessage.append(" ").append(getTps(TPSWatcher.TPSType.ONE_SECOND));
|
||||
tpsMessage.append(" ").append(getTps(TPSWatcher.TPSType.TEN_SECONDS));
|
||||
if (!TPSWarpUtils.isWarping()) {
|
||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_MINUTE));
|
||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES));
|
||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES));
|
||||
}
|
||||
p.sendMessage(tpsMessage.toString());
|
||||
}
|
||||
|
||||
private String joining(List<BauweltMember> bauweltMembers) {
|
||||
StringBuilder st = new StringBuilder();
|
||||
for (int i = 0; i < bauweltMembers.size(); i++) {
|
||||
if (i != 0) {
|
||||
st.append("§8, ");
|
||||
}
|
||||
st.append("§7");
|
||||
st.append(SteamwarUser.get(bauweltMembers.get(i).getMemberID()).getUserName());
|
||||
}
|
||||
return st.toString();
|
||||
}
|
||||
}
|
||||
|
@ -28,29 +28,28 @@ import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Linked
|
||||
public class CannonDetector implements Listener {
|
||||
|
||||
private Map<TNTPrimed, Vector> velocities = new HashMap<>();
|
||||
private Map<TNTPrimed, Set<UUID>> propulsionOfProjectile = new HashMap<>();
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
@EventHandler
|
||||
public void onEntityExplode(EntityExplodeEvent event) {
|
||||
if (!(event.getEntity() instanceof TNTPrimed)) {
|
||||
return;
|
||||
}
|
||||
|
||||
TNTPrimed tnt = (TNTPrimed) event.getEntity();
|
||||
propulsionOfProjectile.remove(tnt);
|
||||
|
||||
DepthManager.update(tnt, event.blockList());
|
||||
|
||||
List<TNTPrimed> tnts = Bukkit.getWorlds().get(0).getEntitiesByClass(TNTPrimed.class)
|
||||
@ -67,7 +66,6 @@ public class CannonDetector implements Listener {
|
||||
boolean isEmpty = velocities.isEmpty();
|
||||
tnts.forEach(tntPrimed -> {
|
||||
velocities.put(tntPrimed, tntPrimed.getVelocity().clone());
|
||||
propulsionOfProjectile.computeIfAbsent(tntPrimed, __ -> new HashSet<>()).add(tnt.getUniqueId());
|
||||
});
|
||||
|
||||
if (!isEmpty) {
|
||||
@ -77,10 +75,7 @@ public class CannonDetector implements Listener {
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||
Map<CannonKey, List<TNTPrimed>> grouped = new HashMap<>();
|
||||
velocities.forEach((tntPrimed, vector) -> {
|
||||
boolean xBiggest = Math.abs(vector.getX()) > Math.abs(vector.getZ());
|
||||
boolean zBiggest = Math.abs(vector.getZ()) > Math.abs(vector.getX());
|
||||
Vector vec = new Vector(xBiggest ? Math.signum(vector.getX()) : 0, Math.round(vector.getY() * 100), zBiggest ? Math.signum(vector.getZ()) : 0);
|
||||
grouped.computeIfAbsent(new CannonKey(propulsionOfProjectile.get(tntPrimed), vec), ignored -> new ArrayList<>()).add(tntPrimed);
|
||||
grouped.computeIfAbsent(new CannonKey(round(tntPrimed.getLocation().toVector()), round(vector)), ignored -> new ArrayList<>()).add(tntPrimed);
|
||||
});
|
||||
grouped.forEach((cannonKey, tntPrimeds) -> {
|
||||
if (tntPrimeds.size() <= 5) return;
|
||||
@ -93,4 +88,12 @@ public class CannonDetector implements Listener {
|
||||
velocities.clear();
|
||||
}, 1);
|
||||
}
|
||||
|
||||
private Vector round(Vector vector) {
|
||||
vector.multiply(10000);
|
||||
vector.setX(Math.round(vector.getX()));
|
||||
vector.setY(Math.round(vector.getY()));
|
||||
vector.setZ(Math.round(vector.getZ()));
|
||||
return vector;
|
||||
}
|
||||
}
|
||||
|
@ -22,16 +22,12 @@ package de.steamwar.bausystem.features.cannon;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
@AllArgsConstructor
|
||||
@EqualsAndHashCode
|
||||
@Getter
|
||||
public final class CannonKey {
|
||||
private Set<UUID> propulsions;
|
||||
private Vector locationVector;
|
||||
private Vector velocityVector;
|
||||
}
|
||||
|
@ -51,6 +51,7 @@ public class Depth {
|
||||
List<Block> blocksList = blocks.stream()
|
||||
.filter(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION))
|
||||
.collect(Collectors.toList());
|
||||
if (blocksList.isEmpty()) return;
|
||||
tntCount++;
|
||||
for (Block block : blocksList) {
|
||||
internalUpdate(block);
|
||||
|
@ -48,6 +48,6 @@ public class CountingwandGuiItem extends BauGuiItem {
|
||||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.MEMBER;
|
||||
return Permission.WORLDEDIT;
|
||||
}
|
||||
}
|
@ -44,8 +44,7 @@ public class DesignEndStone {
|
||||
private REntityServer entityServer = new REntityServer();
|
||||
private List<REntity> entities = new ArrayList<>();
|
||||
private Set<Location> locations = new HashSet<>();
|
||||
private boolean wsOrAs;
|
||||
private double maxBlastResistance;
|
||||
private List<Player> players = new ArrayList<>();
|
||||
|
||||
public DesignEndStone(Region region) {
|
||||
this.minX = region.getMinPointBuild().getX();
|
||||
@ -54,20 +53,9 @@ public class DesignEndStone {
|
||||
this.maxX = region.getMaxPointBuild().getX();
|
||||
this.maxY = region.getMaxPointBuild().getY();
|
||||
this.maxZ = region.getMaxPointBuild().getZ();
|
||||
wsOrAs = region.getName().startsWith("ws") || region.getName().startsWith("as");
|
||||
maxBlastResistance = wsOrAs ? 6.1 : 9.0;
|
||||
|
||||
entityServer.setCallback((player, rEntity, entityAction) -> {
|
||||
if (entityAction != REntityServer.EntityAction.ATTACK) return;
|
||||
Location location = new Location(WORLD, rEntity.getX(), rEntity.getY(), rEntity.getZ());
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
location.getBlock().breakNaturally();
|
||||
calc();
|
||||
}, 1);
|
||||
});
|
||||
}
|
||||
|
||||
public void calc() {
|
||||
private void calc() {
|
||||
entities.forEach(REntity::die);
|
||||
entities.clear();
|
||||
locations.clear();
|
||||
@ -76,24 +64,8 @@ public class DesignEndStone {
|
||||
calc(minX, minY, maxZ, maxX, maxY, maxZ, 0, 0, -1, maxZ - minZ);
|
||||
calc(minX, minY, minZ, minX, maxY, maxZ, 1, 0, 0, maxX - minX);
|
||||
calc(maxX, minY, minZ, maxX, maxY, maxZ, -1, 0, 0, maxX - minX);
|
||||
if (wsOrAs) {
|
||||
calc(minX, minY, minZ, maxX, minY, maxZ, 0, 1, 0, maxY - minY + 1);
|
||||
} else {
|
||||
int airBlocks = 0;
|
||||
double minAirBlocks = (maxX - minX) * (maxZ - minZ) * 0.1;
|
||||
for (int x = minX; x < maxX; x++) {
|
||||
for (int z = minZ; z < maxZ; z++) {
|
||||
if (WORLD.getBlockAt(x, minY, z).getType().isAir()) {
|
||||
airBlocks++;
|
||||
if (airBlocks > minAirBlocks) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (airBlocks > minAirBlocks) {
|
||||
calc(minX, minY, minZ, maxX, minY, maxZ, 0, 1, 0, maxY - minY + 1);
|
||||
}
|
||||
}
|
||||
calc(minX, maxY, minZ, maxX, maxY, maxZ, 0, -1, 0, maxY - minY + 1);
|
||||
// calc(minX, minY, minZ, maxX, minY, maxZ, 0, 1, 0, maxY - minY);
|
||||
calc(minX, maxY, minZ, maxX, maxY, maxZ, 0, -1, 0, maxY - minY);
|
||||
}
|
||||
|
||||
private void calc(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int dirX, int dirY, int dirZ, int steps) {
|
||||
@ -105,16 +77,15 @@ public class DesignEndStone {
|
||||
int cy = y + step * dirY;
|
||||
int cz = z + step * dirZ;
|
||||
Material material = WORLD.getBlockAt(cx, cy, cz).getType();
|
||||
|
||||
if (material != Material.WATER && material != Material.LAVA && material.getBlastResistance() >= maxBlastResistance) {
|
||||
if (material == Material.END_STONE || material == Material.END_STONE_BRICKS || material == Material.END_STONE_BRICK_SLAB || material == Material.END_STONE_BRICK_STAIRS || material == Material.END_STONE_BRICK_WALL) {
|
||||
Location location = new Location(WORLD, cx + 0.5, cy, cz + 0.5);
|
||||
if (!locations.add(location)) break;
|
||||
if (locations.contains(location)) break;
|
||||
RFallingBlockEntity entity = new RFallingBlockEntity(entityServer, location, Material.RED_STAINED_GLASS);
|
||||
entity.setNoGravity(true);
|
||||
entity.setGlowing(true);
|
||||
entities.add(entity);
|
||||
break;
|
||||
} else if (!material.isAir() && material != Material.WATER && material != Material.LAVA) {
|
||||
} else if (!material.isAir()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -124,18 +95,15 @@ public class DesignEndStone {
|
||||
}
|
||||
|
||||
public void toggle(Player player) {
|
||||
if (entityServer.getPlayers().contains(player)) {
|
||||
if (players.contains(player)) {
|
||||
players.remove(player);
|
||||
entityServer.removePlayer(player);
|
||||
BauSystem.MESSAGE.sendPrefixless("DESIGN_ENDSTONE_DISABLE", player, ChatMessageType.ACTION_BAR);
|
||||
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_DISABLE", player, ChatMessageType.ACTION_BAR);
|
||||
} else {
|
||||
players.add(player);
|
||||
entityServer.addPlayer(player);
|
||||
calc();
|
||||
BauSystem.MESSAGE.sendPrefixless("DESIGN_ENDSTONE_ENABLE", player, ChatMessageType.ACTION_BAR);
|
||||
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_ENABLE", player, ChatMessageType.ACTION_BAR);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean removePlayer(Player player) {
|
||||
entityServer.removePlayer(player);
|
||||
return entityServer.getPlayers().isEmpty();
|
||||
}
|
||||
}
|
||||
|
@ -22,23 +22,15 @@ package de.steamwar.bausystem.features.design.endstone;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.utils.RegionType;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
|
||||
@Linked
|
||||
public class DesignEndStoneCommand extends SWCommand implements Listener {
|
||||
public class DesignEndStoneCommand extends SWCommand {
|
||||
|
||||
public DesignEndStoneCommand() {
|
||||
super("designendstone");
|
||||
@ -47,7 +39,7 @@ public class DesignEndStoneCommand extends SWCommand implements Listener {
|
||||
private Map<Region, DesignEndStone> designEndStoneMap = new HashMap<>();
|
||||
|
||||
@Register(description = "DESIGN_ENDSTONE_COMMAND_HELP")
|
||||
public void genericCommand(@Validator Player player) {
|
||||
public void genericCommand(Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (!region.hasType(RegionType.BUILD)) {
|
||||
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player);
|
||||
@ -55,43 +47,4 @@ public class DesignEndStoneCommand extends SWCommand implements Listener {
|
||||
}
|
||||
designEndStoneMap.computeIfAbsent(region, DesignEndStone::new).toggle(player);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
disableDesignEndStone(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||
event.getNewSpectator().forEach(this::disableDesignEndStone);
|
||||
}
|
||||
|
||||
private void disableDesignEndStone(Player player) {
|
||||
new HashSet<>(designEndStoneMap.entrySet()).forEach(regionDesignEndStoneEntry -> {
|
||||
if (regionDesignEndStoneEntry.getValue().removePlayer(player)) {
|
||||
designEndStoneMap.remove(regionDesignEndStoneEntry.getKey());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockPlace(BlockPlaceEvent event) {
|
||||
update(event.getBlock().getLocation());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||
update(event.getBlock().getLocation());
|
||||
}, 1);
|
||||
}
|
||||
|
||||
private void update(Location location) {
|
||||
Region region = Region.getRegion(location);
|
||||
DesignEndStone designEndStone = designEndStoneMap.get(region);
|
||||
if (designEndStone == null) {
|
||||
return;
|
||||
}
|
||||
designEndStone.calc();
|
||||
}
|
||||
}
|
||||
|
@ -47,6 +47,6 @@ public class DetonatorBauGuiItem extends BauGuiItem {
|
||||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.BUILD;
|
||||
return Permission.MEMBER;
|
||||
}
|
||||
}
|
||||
|
@ -58,12 +58,12 @@ public class DetonatorCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "wand", description = "DETONATOR_HELP_WAND")
|
||||
public void giveWand(@Validator Player p) {
|
||||
public void giveWand(Player p) {
|
||||
SWUtils.giveItemToPlayer(p, getWAND(p));
|
||||
}
|
||||
|
||||
@Register(value = "click", description = "DETONATOR_HELP_CLICK")
|
||||
public void clickDetonator(@Validator Player p) {
|
||||
public void clickDetonator(Player p) {
|
||||
Detonator.activateDetonator(new ItemStorage(p));
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bausystem.features.detonator;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage;
|
||||
import de.steamwar.bausystem.features.detonator.storage.ItemStorage;
|
||||
@ -66,7 +65,6 @@ public class DetonatorListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
Player p = event.getPlayer();
|
||||
if (Detonator.isDetonator(p.getInventory().getItemInMainHand())) {
|
||||
event.setCancelled(true);
|
||||
@ -77,7 +75,6 @@ public class DetonatorListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (!Detonator.isDetonator(event.getItem())) {
|
||||
return;
|
||||
}
|
||||
@ -92,7 +89,7 @@ public class DetonatorListener implements Listener {
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onPlayerMove(PlayerMoveEvent event) {
|
||||
if (!Permission.BUILD.hasPermission(event.getPlayer()) ||!Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) {
|
||||
if (!Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) {
|
||||
if (Detonator.hasActiveDetonatorShow(event.getPlayer())) {
|
||||
Detonator.hideDetonator(event.getPlayer());
|
||||
}
|
||||
@ -113,7 +110,6 @@ public class DetonatorListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) {
|
||||
HAS_UPDATED.add(event.getPlayer());
|
||||
}
|
||||
@ -121,7 +117,6 @@ public class DetonatorListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (Detonator.isDetonator(event.getMainHandItem()) || Detonator.isDetonator(event.getOffHandItem())) {
|
||||
HAS_UPDATED.add(event.getPlayer());
|
||||
}
|
||||
|
@ -81,7 +81,7 @@ public class BauGUI {
|
||||
}
|
||||
} else {
|
||||
p.closeInventory();
|
||||
BauSystem.MESSAGE.send("NO_PERMISSION", p);
|
||||
BauSystem.MESSAGE.send("GUI_NO_PERMISSION", p);
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -108,13 +108,26 @@ public class BauGUI {
|
||||
if (!permission.hasPermission(p)) {
|
||||
List<String> lore = meta.getLore();
|
||||
if (lore == null) {
|
||||
lore = Collections.singletonList(BauSystem.MESSAGE.parse("NO_PERMISSION", p));
|
||||
lore = Collections.singletonList(BauSystem.MESSAGE.parse(permissionString(permission), p));
|
||||
} else {
|
||||
lore.add(BauSystem.MESSAGE.parse("NO_PERMISSION", p));
|
||||
lore.add(BauSystem.MESSAGE.parse(permissionString(permission), p));
|
||||
}
|
||||
meta.setLore(lore);
|
||||
}
|
||||
itemStack.setItemMeta(meta);
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
private static String permissionString(Permission permission) {
|
||||
switch (permission) {
|
||||
case OWNER:
|
||||
return "GUI_NO_OWNER";
|
||||
case WORLD:
|
||||
return "GUI_NO_WORLD";
|
||||
case WORLDEDIT:
|
||||
return "GUI_NO_WORLDEDIT";
|
||||
default:
|
||||
return "GUI_NO_MEMBER";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ public class HotbarCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "load", description = "HOTBAR_HELP_LOAD")
|
||||
public void loadHotbar(@Validator Player p) {
|
||||
public void loadHotbar(Player p) {
|
||||
DefaultHotbar.setHotbar(p);
|
||||
BauSystem.MESSAGE.send("HOTBAR_LOADED", p);
|
||||
}
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
package de.steamwar.bausystem.features.hotbar;
|
||||
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@ -31,7 +30,6 @@ public class HotbarListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (allNull(event.getPlayer().getInventory().getContents()) && allNull(event.getPlayer().getInventory().getArmorContents())) {
|
||||
DefaultHotbar.setHotbar(event.getPlayer());
|
||||
}
|
||||
|
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bausystem.features.inventoryfiller;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.configplayer.Config;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
@ -39,7 +38,6 @@ public class InventoryFiller implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("inventoryfill", false)) return;
|
||||
if (!event.getPlayer().isSneaking()) return;
|
||||
Block block = event.getPlayer().getTargetBlockExact(5);
|
||||
@ -61,7 +59,6 @@ public class InventoryFiller implements Listener {
|
||||
*/
|
||||
@EventHandler
|
||||
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("inventoryfill", false)) return;
|
||||
if (!event.getPlayer().isSneaking()) return;
|
||||
ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand();
|
||||
|
@ -21,7 +21,6 @@ package de.steamwar.bausystem.features.killchecker;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.bausystem.utils.bossbar.BossBarService;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
@ -55,7 +54,7 @@ public class KillcheckerCommand extends SWCommand implements Listener {
|
||||
}
|
||||
|
||||
@Register(value = "enable", description = "KILLCHECKER_HELP_ENABLE")
|
||||
public void genericCommand(@Validator Player player, @OptionalValue("-outline") @StaticValue(value = {"-area", "-outline"}, allowISE = true) boolean onlyOutline) {
|
||||
public void genericCommand(Player player, @OptionalValue("-outline") @StaticValue(value = {"-area", "-outline"}, allowISE = true) boolean onlyOutline) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
KillcheckerVisualizer killcheckerVisualizer = visualizers.computeIfAbsent(region, region1 -> new KillcheckerVisualizer(region1, bossBarService));
|
||||
killcheckerVisualizer.recalc();
|
||||
@ -75,22 +74,16 @@ public class KillcheckerCommand extends SWCommand implements Listener {
|
||||
BauSystem.MESSAGE.send("KILLCHECKER_DISABLE", player);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||
event.getNewSpectator().forEach(this::hide);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
hide(event.getPlayer());
|
||||
}
|
||||
|
||||
private void hide(Player player) {
|
||||
new HashSet<>(visualizers.entrySet()).forEach(regionKillcheckerVisualizerEntry -> {
|
||||
if (regionKillcheckerVisualizerEntry.getValue().hide(player)) {
|
||||
visualizers.remove(regionKillcheckerVisualizerEntry.getKey());
|
||||
Player player = event.getPlayer();
|
||||
Set<Region> regions = new HashSet<>();
|
||||
visualizers.forEach((region, visualizer) -> {
|
||||
if (visualizer.disconnect(player)) {
|
||||
regions.add(region);
|
||||
}
|
||||
});
|
||||
regions.forEach(visualizers::remove);
|
||||
}
|
||||
|
||||
private void recalc(Block block) {
|
||||
|
@ -34,6 +34,8 @@ import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.boss.BarColor;
|
||||
import org.bukkit.boss.BarStyle;
|
||||
import org.bukkit.boss.BossBar;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.HashMap;
|
||||
@ -43,25 +45,10 @@ import java.util.Set;
|
||||
|
||||
public class KillcheckerVisualizer {
|
||||
|
||||
private static final Material[] MATERIALS = new Material[]{
|
||||
Material.LIME_STAINED_GLASS,
|
||||
Material.LIME_CONCRETE,
|
||||
Material.GREEN_STAINED_GLASS,
|
||||
Material.GREEN_CONCRETE,
|
||||
Material.YELLOW_STAINED_GLASS,
|
||||
Material.YELLOW_CONCRETE,
|
||||
Material.ORANGE_STAINED_GLASS,
|
||||
Material.ORANGE_CONCRETE,
|
||||
Material.RED_STAINED_GLASS,
|
||||
Material.RED_CONCRETE,
|
||||
Material.PURPLE_STAINED_GLASS,
|
||||
Material.PURPLE_CONCRETE,
|
||||
Material.BLACK_STAINED_GLASS,
|
||||
Material.BLACK_CONCRETE,
|
||||
};
|
||||
private static final Material[] MATERIALS = new Material[] {Material.YELLOW_STAINED_GLASS, Material.ORANGE_STAINED_GLASS, Material.RED_STAINED_GLASS, Material.PURPLE_STAINED_GLASS, Material.BLACK_STAINED_GLASS};
|
||||
private static final World WORLD = Bukkit.getWorlds().get(0);
|
||||
|
||||
private static final double SURROUND = 4.5;
|
||||
private static final double SURROUND = 4;
|
||||
|
||||
private final Point minPoint;
|
||||
private final Point maxPoint;
|
||||
@ -70,6 +57,9 @@ public class KillcheckerVisualizer {
|
||||
private final int zArea;
|
||||
private final int xArea;
|
||||
|
||||
private final Set<Player> players = new HashSet<>();
|
||||
private final Set<Player> areaPlayers = new HashSet<>();
|
||||
|
||||
private final Region region;
|
||||
private final BossBarService bossBarService;
|
||||
|
||||
@ -271,7 +261,7 @@ public class KillcheckerVisualizer {
|
||||
double zPercent = xCount / (double) zArea;
|
||||
percent = (xPercent + yPercent + zPercent) / 3;
|
||||
kills = zKills + yKills + xKills;
|
||||
outline.getPlayers().forEach(this::updateBossBar);
|
||||
players.forEach(this::updateBossBar);
|
||||
|
||||
Set<Point> pointSet = new HashSet<>(killCount.keySet());
|
||||
Set<Point> outlinePointsCacheLast = new HashSet<>(outlinePointsCache);
|
||||
@ -366,21 +356,40 @@ public class KillcheckerVisualizer {
|
||||
return new Cuboid(minX, minY, minZ, maxX, maxY, maxZ);
|
||||
}
|
||||
|
||||
public void show(Player player, boolean onlyOutline) {
|
||||
public boolean show(Player player, boolean onlyOutline) {
|
||||
outline.addPlayer(player);
|
||||
if (!onlyOutline) {
|
||||
inner.addPlayer(player);
|
||||
} else {
|
||||
areaPlayers.add(player);
|
||||
} else if (areaPlayers.contains(player)) {
|
||||
inner.removePlayer(player);
|
||||
areaPlayers.remove(player);
|
||||
}
|
||||
updateBossBar(player);
|
||||
return players.add(player);
|
||||
}
|
||||
|
||||
public boolean hide(Player player) {
|
||||
outline.removePlayer(player);
|
||||
if (areaPlayers.contains(player)) {
|
||||
inner.removePlayer(player);
|
||||
}
|
||||
players.remove(player);
|
||||
areaPlayers.remove(player);
|
||||
bossBarService.remove(player, region, "killchecker");
|
||||
if (outline.getPlayers().isEmpty() && inner.getPlayers().isEmpty()) {
|
||||
if (players.isEmpty()) {
|
||||
outline.close();
|
||||
inner.close();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean disconnect(Player player) {
|
||||
players.remove(player);
|
||||
areaPlayers.remove(player);
|
||||
bossBarService.remove(player, region, "killchecker");
|
||||
if (players.isEmpty()) {
|
||||
outline.close();
|
||||
inner.close();
|
||||
return true;
|
||||
|
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bausystem.features.loader;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.impl.LoaderTNT;
|
||||
@ -36,14 +35,9 @@ import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.*;
|
||||
|
||||
public class Loader implements Listener {
|
||||
|
||||
@ -74,45 +68,25 @@ public class Loader implements Listener {
|
||||
|
||||
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
if (stage != Stage.RUNNING) return;
|
||||
if(!Permission.BUILD.hasPermission(p)) return;
|
||||
if (waitTime > 0) {
|
||||
waitTime--;
|
||||
return;
|
||||
}
|
||||
if (currentElement >= elements.size()) {
|
||||
currentElement = 0;
|
||||
if (stage == Stage.SINGLE) {
|
||||
stage = Stage.PAUSE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
while (currentElement < elements.size()) {
|
||||
LoaderElement element = elements.get(currentElement);
|
||||
currentElement++;
|
||||
element.execute(delay -> waitTime = delay);
|
||||
if (waitTime > 0) {
|
||||
if (element instanceof LoaderTNT) currentElement--;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (currentElement >= elements.size()) {
|
||||
currentElement = 0;
|
||||
}
|
||||
}, 0, 1);
|
||||
}
|
||||
|
||||
public void single() {
|
||||
if (stage == Stage.END) return;
|
||||
if (stage == Stage.RUNNING) return;
|
||||
stage = Stage.SINGLE;
|
||||
if (recorder != null) {
|
||||
recorder.stop();
|
||||
recorder = null;
|
||||
}
|
||||
if (elements.isEmpty()) {
|
||||
BauSystem.MESSAGE.send("LOADER_NOTHING_RECORDED", p);
|
||||
stop();
|
||||
}
|
||||
}
|
||||
|
||||
public void start() {
|
||||
if (stage == Stage.END) return;
|
||||
if (stage == Stage.RUNNING) return;
|
||||
@ -147,67 +121,27 @@ public class Loader implements Listener {
|
||||
LOADER_MAP.remove(p);
|
||||
}
|
||||
|
||||
public boolean setTicksBetweenShots(int delay) {
|
||||
if (elements.size() == 0) return false;
|
||||
LoaderElement loaderElement = elements.get(elements.size() - 1);
|
||||
if (loaderElement instanceof LoaderWait) {
|
||||
((LoaderWait) loaderElement).setDelay(delay);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setTicksBetweenBlocks(int delay) {
|
||||
for (int i = 0; i < elements.size() - 1; i++) {
|
||||
LoaderElement loaderElement = elements.get(i);
|
||||
if (loaderElement instanceof LoaderWait) {
|
||||
((LoaderWait) loaderElement).setDelay(delay);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void gui(SettingsSorting settingsSorting) {
|
||||
List<SWListInv.SWListEntry<LoaderElement>> list = new ArrayList<>();
|
||||
AtomicBoolean allWait = new AtomicBoolean(true);
|
||||
Runnable updateRunnable = () -> {
|
||||
list.clear();
|
||||
for (int i = 0; i < elements.size(); i++) {
|
||||
LoaderElement previous = i > 0 ? elements.get(i - 1) : null;
|
||||
LoaderElement current = elements.get(i);
|
||||
LoaderElement next = i < elements.size() - 1 ? elements.get(i + 1) : null;
|
||||
|
||||
if (!settingsSorting.shouldShow(previous, current, next)) {
|
||||
for (LoaderElement element : elements) {
|
||||
if (settingsSorting != null) {
|
||||
if (settingsSorting == SettingsSorting.WAIT && !(element instanceof LoaderWait)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((!(current instanceof LoaderWait))) {
|
||||
allWait.set(false);
|
||||
if (settingsSorting == SettingsSorting.INTERACTIONS && (element instanceof LoaderWait || element instanceof LoaderTNT)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SWItem item = current.menu(p);
|
||||
if (current instanceof LoaderInteractionElement<?>) {
|
||||
LoaderInteractionElement<?> interactionElement = (LoaderInteractionElement<?>) current;
|
||||
List<String> lore = new ArrayList<>();
|
||||
if (item.getItemMeta() != null && item.getItemMeta().getLore() != null) {
|
||||
lore.addAll(item.getItemMeta().getLore());
|
||||
lore.add("§8");
|
||||
}
|
||||
lore.add(BauSystem.MESSAGE.parse("LOADER_SETTING_MODES", p, interactionElement.size()));
|
||||
lore.add(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", p));
|
||||
item.setLore(lore);
|
||||
SWItem item = element.menu(p);
|
||||
if (element instanceof LoaderInteractionElement<?>) {
|
||||
LoaderInteractionElement<?> interactionElement = (LoaderInteractionElement<?>) element;
|
||||
item.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_MODES", p, interactionElement.size()), "§8", BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", p)));
|
||||
} else {
|
||||
List<String> lore = new ArrayList<>();
|
||||
if (item.getItemMeta() != null && item.getItemMeta().getLore() != null) {
|
||||
lore.addAll(item.getItemMeta().getLore());
|
||||
lore.add("§8");
|
||||
item.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", p)));
|
||||
}
|
||||
lore.add(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", p));
|
||||
item.setLore(lore);
|
||||
}
|
||||
list.add(new SWListInv.SWListEntry<>(item, current));
|
||||
}
|
||||
if (list.isEmpty()) {
|
||||
allWait.set(false);
|
||||
list.add(new SWListInv.SWListEntry<>(item, element));
|
||||
}
|
||||
};
|
||||
updateRunnable.run();
|
||||
@ -218,51 +152,65 @@ public class Loader implements Listener {
|
||||
swListInv.open();
|
||||
}));
|
||||
|
||||
SWItem settingItem = new SWItem(settingsSorting.getMaterial(), "§e" + BauSystem.MESSAGE.parse(settingsSorting.getName(), p), clickType -> {
|
||||
if (clickType == ClickType.LEFT) {
|
||||
int index = settingsSorting.ordinal() + 1;
|
||||
if (index >= SettingsSorting.LENGTH) {
|
||||
index = 0;
|
||||
}
|
||||
gui(SettingsSorting.values()[index]);
|
||||
} else if (clickType == ClickType.RIGHT) {
|
||||
int index = settingsSorting.ordinal() - 1;
|
||||
if (index < 0) {
|
||||
index = SettingsSorting.LENGTH - 1;
|
||||
}
|
||||
gui(SettingsSorting.values()[index]);
|
||||
}
|
||||
SWItem onlyInteractionsElements = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_INTERACTIONS", p), clickType -> {
|
||||
gui(settingsSorting == SettingsSorting.INTERACTIONS ? null : SettingsSorting.INTERACTIONS);
|
||||
});
|
||||
List<String> strings = new ArrayList<>();
|
||||
for (SettingsSorting setting : SettingsSorting.values()) {
|
||||
if (setting == settingsSorting) {
|
||||
strings.add("§e> §7" + BauSystem.MESSAGE.parse(setting.getName(), p));
|
||||
} else {
|
||||
strings.add("§8> §7" + BauSystem.MESSAGE.parse(setting.getName(), p));
|
||||
}
|
||||
}
|
||||
settingItem.setLore(strings);
|
||||
swListInv.setItem(48, settingItem);
|
||||
if (settingsSorting == SettingsSorting.INTERACTIONS) onlyInteractionsElements.setEnchanted(true);
|
||||
swListInv.setItem(47, onlyInteractionsElements);
|
||||
|
||||
if (allWait.get()) {
|
||||
SWItem setWait = new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_SET_ALL", p), clickType -> {
|
||||
SWItem onlyWaitElements = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS", p), clickType -> {
|
||||
gui(settingsSorting == SettingsSorting.WAIT ? null : SettingsSorting.WAIT);
|
||||
});
|
||||
if (settingsSorting == SettingsSorting.WAIT) onlyWaitElements.setEnchanted(true);
|
||||
swListInv.setItem(48, onlyWaitElements);
|
||||
|
||||
if (settingsSorting == SettingsSorting.WAIT) {
|
||||
SWItem waitBetweenTNT = new SWItem(Material.TNT, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_SET_BETWEEN_TNT", p), clickType -> {
|
||||
SWAnvilInv swAnvilInv = new SWAnvilInv(p, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_TITLE", p), "");
|
||||
swAnvilInv.setCallback(s -> {
|
||||
try {
|
||||
long delay = Math.max(Long.parseLong(s), 0);
|
||||
list.forEach(loaderElementSWListEntry -> {
|
||||
((LoaderWait) loaderElementSWListEntry.getObject()).setDelay(delay);
|
||||
});
|
||||
long delay = Long.parseLong(s);
|
||||
if (delay < 0) delay = 0;
|
||||
for (int i = 1; i < elements.size() - 1; i++) {
|
||||
if (!(elements.get(i - 1) instanceof LoaderTNT)) continue;
|
||||
if (!(elements.get(i + 1) instanceof LoaderTNT)) continue;
|
||||
if (!(elements.get(i) instanceof LoaderWait)) continue;
|
||||
((LoaderWait) elements.get(i)).setDelay(delay);
|
||||
}
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
gui(settingsSorting);
|
||||
});
|
||||
updateRunnable.run();
|
||||
swAnvilInv.open();
|
||||
});
|
||||
swListInv.setItem(50, setWait);
|
||||
} else {
|
||||
swListInv.setItem(50, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§8"));
|
||||
swListInv.setItem(50, waitBetweenTNT);
|
||||
|
||||
SWItem waitTime = new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_SET_ALL", p), clickType -> {
|
||||
SWAnvilInv swAnvilInv = new SWAnvilInv(p, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_TITLE", p), "");
|
||||
swAnvilInv.setCallback(s -> {
|
||||
try {
|
||||
long delay = Long.parseLong(s);
|
||||
if (delay < 0) delay = 0;
|
||||
long finalDelay = delay;
|
||||
elements.stream()
|
||||
.filter(LoaderWait.class::isInstance)
|
||||
.map(LoaderWait.class::cast)
|
||||
.forEach(loaderWait -> loaderWait.setDelay(finalDelay));
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
gui(settingsSorting);
|
||||
});
|
||||
updateRunnable.run();
|
||||
swAnvilInv.open();
|
||||
});
|
||||
swListInv.setItem(51, waitTime);
|
||||
} else {
|
||||
SWItem empty = new SWItem(Material.STRUCTURE_VOID, "§7", clickType -> {});
|
||||
swListInv.setItem(50, empty);
|
||||
swListInv.setItem(51, empty);
|
||||
}
|
||||
|
||||
swListInv.open();
|
||||
}
|
||||
|
||||
@ -273,104 +221,18 @@ public class Loader implements Listener {
|
||||
}
|
||||
|
||||
public String getProgress() {
|
||||
return Math.max(currentElement, 1) + "§8/§7" + elements.size();
|
||||
return (currentElement + 1) + "§8/§7" + elements.size();
|
||||
}
|
||||
|
||||
public enum SettingsSorting {
|
||||
ALL {
|
||||
@Override
|
||||
public Material getMaterial() {
|
||||
return Material.STRUCTURE_VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "LOADER_GUI_SHOW_ALL";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
WAIT {
|
||||
@Override
|
||||
public Material getMaterial() {
|
||||
return Material.CLOCK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "LOADER_GUI_SHOW_WAITS";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||
return current instanceof LoaderWait;
|
||||
}
|
||||
},
|
||||
WAIT_BETWEEN_TNT {
|
||||
@Override
|
||||
public Material getMaterial() {
|
||||
return Material.REDSTONE_BLOCK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "LOADER_GUI_SHOW_WAITS_BETWEEN_TNT";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||
return previous instanceof LoaderTNT && current instanceof LoaderWait && next instanceof LoaderTNT;
|
||||
}
|
||||
},
|
||||
INTERACTIONS {
|
||||
@Override
|
||||
public Material getMaterial() {
|
||||
return Material.REPEATER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "LOADER_GUI_SHOW_INTERACTIONS";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||
return current instanceof LoaderInteractionElement && !(current instanceof LoaderTNT);
|
||||
}
|
||||
},
|
||||
TNT {
|
||||
@Override
|
||||
public Material getMaterial() {
|
||||
return Material.TNT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "LOADER_GUI_SHOW_TNT";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||
return current instanceof LoaderTNT;
|
||||
}
|
||||
},
|
||||
;
|
||||
|
||||
public static int LENGTH = SettingsSorting.values().length;
|
||||
|
||||
public abstract Material getMaterial();
|
||||
public abstract String getName();
|
||||
public abstract boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next);
|
||||
WAIT,
|
||||
INTERACTIONS,
|
||||
}
|
||||
|
||||
@AllArgsConstructor
|
||||
public enum Stage implements EnumDisplay {
|
||||
SETUP("LOADER_SETUP"),
|
||||
RUNNING("LOADER_RUNNING"),
|
||||
SINGLE("LOADER_SINGLE"),
|
||||
PAUSE("LOADER_PAUSE"),
|
||||
END("LOADER_END");
|
||||
|
||||
|
@ -20,15 +20,14 @@
|
||||
package de.steamwar.bausystem.features.loader;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.command.TypeValidator;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
@Linked
|
||||
public class LoaderCommand extends SWCommand implements Listener {
|
||||
public class LoaderCommand extends SWCommand {
|
||||
|
||||
public LoaderCommand() {
|
||||
super("loader");
|
||||
@ -81,42 +80,13 @@ public class LoaderCommand extends SWCommand implements Listener {
|
||||
public void guiLoader(@Validator Player player) {
|
||||
Loader loader = Loader.getLoader(player);
|
||||
if (loaderNullCheck(loader, player)) return;
|
||||
loader.gui(Loader.SettingsSorting.ALL);
|
||||
loader.gui(null);
|
||||
}
|
||||
|
||||
@Register(value = "wait", description = "LOADER_HELP_WAIT")
|
||||
public void shotDelayLoader(@Validator Player p, @Min(intValue = 1) @ErrorMessage("LOADER_SMALL_TIME") int delay) {
|
||||
Loader loader = Loader.getLoader(p);
|
||||
if (loaderNullCheck(loader, p)) return;
|
||||
if (loader.setTicksBetweenShots(delay)) {
|
||||
BauSystem.MESSAGE.send("LOADER_NEW_TIME", p, delay);
|
||||
} else {
|
||||
BauSystem.MESSAGE.send("LOADER_SMALL_TIME", p);
|
||||
}
|
||||
}
|
||||
|
||||
@Register(value = "speed", description = "LOADER_HELP_SPEED")
|
||||
public void speedLoader(@Validator Player p, @Min(intValue = 0) @ErrorMessage("LOADER_SMALL_TIME") int delay) {
|
||||
Loader loader = Loader.getLoader(p);
|
||||
if (loaderNullCheck(loader, p)) return;
|
||||
BauSystem.MESSAGE.send("LOADER_NEW_LOAD_TIME", p, delay);
|
||||
loader.setTicksBetweenBlocks(delay);
|
||||
}
|
||||
|
||||
@Register(value = "single", description = "LOADER_HELP_SINGLE")
|
||||
public void singleLoader(@Validator Player p) {
|
||||
Loader loader = Loader.getLoader(p);
|
||||
if (loaderNullCheck(loader, p)) return;
|
||||
loader.single();
|
||||
BauSystem.MESSAGE.send("LOADER_SINGLE_CMD", p);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||
event.getNewSpectator().forEach(player -> {
|
||||
Loader loader = Loader.getLoader(player);
|
||||
if (loader == null) return;
|
||||
loader.stop();
|
||||
});
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> loaderValidator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), "LOADER_PERMS");
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,6 @@ package de.steamwar.bausystem.features.loader;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.impl.*;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
@ -34,7 +33,6 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
@ -43,8 +41,6 @@ import org.bukkit.inventory.EquipmentSlot;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderRecorder implements Listener {
|
||||
|
||||
@ -74,7 +70,7 @@ public class LoaderRecorder implements Listener {
|
||||
return;
|
||||
}
|
||||
long diff = TPSUtils.currentRealTick.get() - lastInteraction;
|
||||
if (last) diff = 120;
|
||||
if (last && diff > 160) diff = 160;
|
||||
lastInteraction = TPSUtils.currentRealTick.get();
|
||||
loaderElementList.add(new LoaderWait(diff));
|
||||
}
|
||||
@ -90,34 +86,7 @@ public class LoaderRecorder implements Listener {
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
if (event.getPlayer() != player) return;
|
||||
|
||||
boolean removedOne = false;
|
||||
for (int i = 0; i < loaderElementList.size(); i++) {
|
||||
LoaderElement element = loaderElementList.get(i);
|
||||
if (!(element instanceof LoaderInteractionElement)) continue;
|
||||
LoaderInteractionElement interactionElement = (LoaderInteractionElement) element;
|
||||
if (interactionElement.getLocation().equals(event.getBlock().getLocation())) {
|
||||
loaderElementList.remove(i);
|
||||
if (i > 0) {
|
||||
loaderElementList.remove(i - 1);
|
||||
}
|
||||
removedOne = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (removedOne) {
|
||||
if (event.getBlock().getType() != Material.TNT) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("LOADER_MESSAGE_UNINTERACT", player));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
public void onPlayerInteractEntity(PlayerInteractEvent event) {
|
||||
if (event.getPlayer() != player) return;
|
||||
if (player.isSneaking()) return;
|
||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.PHYSICAL) return;
|
||||
@ -126,10 +95,53 @@ public class LoaderRecorder implements Listener {
|
||||
|
||||
addWaitTime(false);
|
||||
Block block = event.getClickedBlock();
|
||||
getLoaderInteractionElement(block, (loaderInteractionElement, s) -> {
|
||||
loaderElementList.add(loaderInteractionElement);
|
||||
message(s);
|
||||
});
|
||||
Material type = block.getType();
|
||||
switch (type) {
|
||||
case COMPARATOR:
|
||||
loaderElementList.add(new LoaderComparator(block.getLocation()));
|
||||
message("LOADER_BUTTON_COMPARATOR");
|
||||
break;
|
||||
case REPEATER:
|
||||
loaderElementList.add(new LoaderRepeater(block.getLocation()));
|
||||
message("LOADER_BUTTON_REPEATER");
|
||||
break;
|
||||
case NOTE_BLOCK:
|
||||
loaderElementList.add(new LoaderNoteBlock(block.getLocation()));
|
||||
message("LOADER_BUTTON_NOTEBLOCK");
|
||||
break;
|
||||
case LEVER:
|
||||
loaderElementList.add(new LoaderLever(block.getLocation()));
|
||||
message("LOADER_BUTTON_SWITCH");
|
||||
break;
|
||||
case DAYLIGHT_DETECTOR:
|
||||
loaderElementList.add(new LoaderDaylightDetector(block.getLocation()));
|
||||
message("LOADER_BUTTON_DAYLIGHT_DETECTOR");
|
||||
break;
|
||||
case LECTERN:
|
||||
loaderElementList.add(new LoaderLectern(block.getLocation()));
|
||||
message("LOADER_BUTTON_LECTERN");
|
||||
break;
|
||||
case IRON_TRAPDOOR:
|
||||
break;
|
||||
default:
|
||||
if (type.name().endsWith("_TRAPDOOR")) {
|
||||
loaderElementList.add(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_TRAPDOOR", type));
|
||||
message("LOADER_BUTTON_TRAPDOOR");
|
||||
} else if (type.name().endsWith("_DOOR")) {
|
||||
loaderElementList.add(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_DOOR", type));
|
||||
message("LOADER_BUTTON_DOOR");
|
||||
} else if (type.name().endsWith("FENCE_GATE")) {
|
||||
loaderElementList.add(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_FENCEGATE", type));
|
||||
message("LOADER_BUTTON_FENCEGATE");
|
||||
} else if (type.name().endsWith("STONE_BUTTON")) {
|
||||
loaderElementList.add(new LoaderTicks(block.getLocation(), "LOADER_BUTTON_STONE_BUTTON", type, 20));
|
||||
message("LOADER_BUTTON_STONE_BUTTON");
|
||||
} else if (type.name().endsWith("BUTTON")) {
|
||||
loaderElementList.add(new LoaderTicks(block.getLocation(), "LOADER_BUTTON_WOOD_BUTTON", type, 30));
|
||||
message("LOADER_BUTTON_WOOD_BUTTON");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private Map<Location, Long> blockSet = new HashMap<>();
|
||||
@ -185,46 +197,6 @@ public class LoaderRecorder implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
public static void getLoaderInteractionElement(Block block, BiConsumer<LoaderInteractionElement<?>, String> consumer) {
|
||||
Material type = block.getType();
|
||||
switch (type) {
|
||||
case COMPARATOR:
|
||||
consumer.accept(new LoaderComparator(block.getLocation()), "LOADER_BUTTON_COMPARATOR");
|
||||
break;
|
||||
case REPEATER:
|
||||
consumer.accept(new LoaderRepeater(block.getLocation()), "LOADER_BUTTON_REPEATER");
|
||||
break;
|
||||
case NOTE_BLOCK:
|
||||
consumer.accept(new LoaderNoteBlock(block.getLocation()), "LOADER_BUTTON_NOTEBLOCK");
|
||||
break;
|
||||
case LEVER:
|
||||
consumer.accept(new LoaderLever(block.getLocation()), "LOADER_BUTTON_SWITCH");
|
||||
break;
|
||||
case DAYLIGHT_DETECTOR:
|
||||
consumer.accept(new LoaderDaylightDetector(block.getLocation()), "LOADER_BUTTON_DAYLIGHT_DETECTOR");
|
||||
break;
|
||||
case LECTERN:
|
||||
consumer.accept(new LoaderLectern(block.getLocation()), "LOADER_BUTTON_LECTERN");
|
||||
break;
|
||||
case IRON_TRAPDOOR:
|
||||
case IRON_DOOR:
|
||||
break;
|
||||
default:
|
||||
if (type.name().endsWith("_TRAPDOOR")) {
|
||||
consumer.accept(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_TRAPDOOR", type), "LOADER_BUTTON_TRAPDOOR");
|
||||
} else if (type.name().endsWith("_DOOR")) {
|
||||
consumer.accept(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_DOOR", type), "LOADER_BUTTON_DOOR");
|
||||
} else if (type.name().endsWith("FENCE_GATE")) {
|
||||
consumer.accept(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_FENCEGATE", type), "LOADER_BUTTON_FENCEGATE");
|
||||
} else if (type.name().endsWith("STONE_BUTTON")) {
|
||||
consumer.accept(new LoaderTicks(block.getLocation(), "LOADER_BUTTON_STONE_BUTTON", type, 20), "LOADER_BUTTON_STONE_BUTTON");
|
||||
} else if (type.name().endsWith("BUTTON")) {
|
||||
consumer.accept(new LoaderTicks(block.getLocation(), "LOADER_BUTTON_WOOD_BUTTON", type, 30), "LOADER_BUTTON_WOOD_BUTTON");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void message(String type) {
|
||||
SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("LOADER_MESSAGE_INTERACT", player, BauSystem.MESSAGE.parse(type, player), loaderElementList.size()));
|
||||
}
|
||||
|
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bausystem.features.loader;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.utils.ScoreboardElement;
|
||||
import de.steamwar.linkage.Linked;
|
||||
@ -41,7 +40,6 @@ public class LoaderScoreboardElement implements ScoreboardElement {
|
||||
|
||||
@Override
|
||||
public String get(Region region, Player p) {
|
||||
if(!Permission.BUILD.hasPermission(p)) return null;
|
||||
Loader loader = Loader.getLoader(p);
|
||||
if (loader == null) return null;
|
||||
if (loader.getStage() == Loader.Stage.RUNNING) {
|
||||
|
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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.loader.elements;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public interface ElementSettings {
|
||||
SWItem menu(Player player);
|
||||
void execute(Consumer<Long> delay);
|
||||
void click(Player player, Runnable backAction, Runnable deleteAction);
|
||||
|
||||
default void playerInteract() {}
|
||||
void noop();
|
||||
|
||||
default String translateItemName(String name, String mode, Player player, Object... args) {
|
||||
return BauSystem.MESSAGE.parse("LOADER_GUI_ITEM_NAME", player, BauSystem.MESSAGE.parse(name, player), BauSystem.MESSAGE.parse(mode, player, args));
|
||||
}
|
||||
}
|
@ -21,93 +21,62 @@ package de.steamwar.bausystem.features.loader.elements;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.inventory.SWAnvilInv;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import de.steamwar.inventory.SWListInv;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.data.*;
|
||||
import org.bukkit.block.data.type.Door;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.block.data.FaceAttachable;
|
||||
import org.bukkit.block.data.type.Switch;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public abstract class LoaderInteractionElement<T extends Enum<T> & LoaderSettingsEnum> implements LoaderElement {
|
||||
public abstract class LoaderInteractionElement<T extends ElementSettings> implements LoaderElement {
|
||||
|
||||
@Getter
|
||||
protected final Location location;
|
||||
protected int currentShot = 0;
|
||||
protected T defaultSetting;
|
||||
protected T newSetting;
|
||||
protected T[] allSettings;
|
||||
protected List<T> elements = new ArrayList<>();
|
||||
protected List<Integer> extraPower = new ArrayList<>();
|
||||
protected List<Long> extraTicks = new ArrayList<>();
|
||||
protected int settingsGuiSize = 0;
|
||||
|
||||
protected LoaderInteractionElement(Location location, T defaultSetting, T newSetting, T[] allSettings) {
|
||||
protected LoaderInteractionElement(Location location) {
|
||||
this.location = location;
|
||||
|
||||
this.defaultSetting = defaultSetting;
|
||||
this.newSetting = newSetting;
|
||||
this.allSettings = allSettings;
|
||||
|
||||
elements.add(defaultSetting);
|
||||
extraPower.add(0);
|
||||
extraTicks.add(0L);
|
||||
|
||||
for (T element : allSettings) {
|
||||
settingsGuiSize = Math.max(element.getPos(), settingsGuiSize);
|
||||
}
|
||||
while (settingsGuiSize % 9 != 0) settingsGuiSize++;
|
||||
settingsGuiSize += 9;
|
||||
T element = createNewElement();
|
||||
element.playerInteract();
|
||||
elements.add(element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (currentShot >= elements.size()) currentShot = 0;
|
||||
if (checkBlockInWorld()) {
|
||||
BlockData blockData = location.getBlock().getBlockData();
|
||||
elements.get(currentShot).execute(location, blockData, this, extraPower.get(currentShot), extraTicks.get(currentShot), delay);
|
||||
}
|
||||
elements.get(currentShot).execute(delay);
|
||||
currentShot++;
|
||||
if (currentShot >= elements.size()) currentShot = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void click(Player player, Runnable backAction) {
|
||||
List<SWListInv.SWListEntry<Integer>> entries = new ArrayList<>();
|
||||
List<SWListInv.SWListEntry<T>> entries = new ArrayList<>();
|
||||
Runnable updateRunnable = () -> {
|
||||
entries.clear();
|
||||
for (int i = 0; i < elements.size(); i++) {
|
||||
SWItem swItem = elements.get(i).menu(player, this, extraPower.get(i), extraTicks.get(i));
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
entries.add(new SWListInv.SWListEntry<>(swItem, i));
|
||||
for (T element : elements) {
|
||||
entries.add(new SWListInv.SWListEntry<>(element.menu(player), element));
|
||||
}
|
||||
};
|
||||
updateRunnable.run();
|
||||
|
||||
SWListInv<Integer> listInv = new SWListInv<>(player, "Interaction Settings", false, entries, (clickType, entry) -> {});
|
||||
SWListInv<T> listInv = new SWListInv<>(player, "Interaction Settings", false, entries, (clickType, entry) -> {});
|
||||
listInv.setCallback((clickType, entry) -> {
|
||||
openIndividualSettingsMenu(player, entry, () -> {
|
||||
entry.click(player, () -> {
|
||||
updateRunnable.run();
|
||||
listInv.open();
|
||||
}, () -> {
|
||||
elements.remove((int) entry);
|
||||
extraPower.remove((int) entry);
|
||||
extraTicks.remove((int) entry);
|
||||
if (elements.isEmpty()) {
|
||||
elements.add(newSetting);
|
||||
extraPower.add(0);
|
||||
extraTicks.add(1L);
|
||||
}
|
||||
if (elements.size() == 1) return;
|
||||
elements.remove(entry);
|
||||
click(player, backAction);
|
||||
});
|
||||
});
|
||||
@ -115,190 +84,69 @@ public abstract class LoaderInteractionElement<T extends Enum<T> & LoaderSetting
|
||||
backAction.run();
|
||||
}));
|
||||
listInv.setItem(50, new SWItem(Material.GHAST_SPAWN_EGG, "§7Insert another Setting", clickType -> {
|
||||
elements.add(defaultSetting);
|
||||
extraPower.add(0);
|
||||
extraTicks.add(1L);
|
||||
openIndividualSettingsMenu(player, elements.size() - 1, () -> {
|
||||
T element = createNewElement();
|
||||
elements.add(element);
|
||||
element.click(player, () -> {
|
||||
updateRunnable.run();
|
||||
listInv.open();
|
||||
}, () -> {
|
||||
elements.remove(elements.size() - 1);
|
||||
extraPower.remove(extraPower.size() - 1);
|
||||
extraTicks.remove(extraTicks.size() - 1);
|
||||
if (elements.isEmpty()) {
|
||||
elements.add(newSetting);
|
||||
extraPower.add(0);
|
||||
extraTicks.add(1L);
|
||||
}
|
||||
if (elements.size() == 1) return;
|
||||
elements.remove(element);
|
||||
click(player, backAction);
|
||||
});
|
||||
}));
|
||||
listInv.setItem(51, new SWItem(Material.STRUCTURE_VOID, "§7Insert NOOP's", clickType -> {
|
||||
SWAnvilInv anvilInv = new SWAnvilInv(player, "§7NOOP Count", "1");
|
||||
anvilInv.setCallback(s -> {
|
||||
try {
|
||||
int count = Integer.parseInt(s);
|
||||
for (int i = 0; i < count; i++) {
|
||||
T element = createNewElement();
|
||||
element.noop();
|
||||
elements.add(element);
|
||||
}
|
||||
updateRunnable.run();
|
||||
listInv.open();
|
||||
} catch (NumberFormatException e) {
|
||||
player.sendMessage("§cInvalid Number");
|
||||
}
|
||||
});
|
||||
anvilInv.open();
|
||||
}));
|
||||
listInv.open();
|
||||
}
|
||||
|
||||
private void openIndividualSettingsMenu(Player player, int index, Runnable back, Runnable delete) {
|
||||
T currentElement = elements.get(index);
|
||||
int guiSize = settingsGuiSize;
|
||||
int powerStart = guiSize - 9;
|
||||
if (currentElement.hasPower(this)) {
|
||||
guiSize += 18;
|
||||
}
|
||||
int ticksStart = guiSize - 9;
|
||||
if (currentElement.hasTicks(this)) {
|
||||
guiSize += 9;
|
||||
}
|
||||
|
||||
SWInventory swInventory = new SWInventory(player, guiSize, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = guiSize - 9; i < guiSize; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7", clickType -> {}));
|
||||
swInventory.setItem(guiSize - 9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> back.run());
|
||||
swInventory.setItem(guiSize - 5, new SWItem(Material.WOODEN_AXE, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_COPY", player)).getItemStack(), clickType -> {
|
||||
SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("LOADER_GUI_COPY_TITLE", player), "1");
|
||||
swAnvilInv.setCallback(s -> {
|
||||
try {
|
||||
int count = Integer.parseInt(s);
|
||||
if (count < 1) count = 1;
|
||||
if (count > 65536) count = 65536;
|
||||
|
||||
int power = extraPower.get(index);
|
||||
long ticks = extraTicks.get(index);
|
||||
for (int i = 0; i < count; i++) {
|
||||
elements.add(currentElement);
|
||||
extraPower.add(power);
|
||||
extraTicks.add(ticks);
|
||||
}
|
||||
|
||||
if (count == 1) {
|
||||
openIndividualSettingsMenu(player, elements.size() - 1, back, delete);
|
||||
} else {
|
||||
back.run();
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
back.run();
|
||||
}
|
||||
});
|
||||
swAnvilInv.open();
|
||||
});
|
||||
swInventory.setItem(guiSize - 1, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> delete.run());
|
||||
|
||||
for (T element : allSettings) {
|
||||
SWItem item = element.menu(player, this, extraPower.get(index), extraTicks.get(index));
|
||||
if (element == currentElement) {
|
||||
item.setEnchanted(true);
|
||||
}
|
||||
|
||||
swInventory.setItem(element.getPos(), item.getItemStack(), clickType -> {
|
||||
elements.set(index, element);
|
||||
openIndividualSettingsMenu(player, index, back, delete);
|
||||
});
|
||||
}
|
||||
|
||||
if (currentElement.hasPower(this)) {
|
||||
for (int power = 0; power < 16; power++) {
|
||||
int finalPowerPosition = power;
|
||||
if (power >= 9) finalPowerPosition++;
|
||||
SWItem powerItem = new SWItem(Material.REDSTONE, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, power), Arrays.asList(), false, clickType -> {});
|
||||
powerItem.getItemStack().setAmount(Math.max(power, 1));
|
||||
if (extraPower.get(index) == power) powerItem.setEnchanted(true);
|
||||
|
||||
int finalPower = power;
|
||||
swInventory.setItem(finalPowerPosition + powerStart, powerItem.getItemStack(), clickType -> {
|
||||
extraPower.set(index, finalPower);
|
||||
openIndividualSettingsMenu(player, index, back, delete);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (currentElement.hasTicks(this)) {
|
||||
swInventory.setItem(ticksStart + 3, new SWItem(SWItem.getDye(1), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> {
|
||||
long ticks = extraTicks.get(index);
|
||||
ticks -= clickType.isShiftClick() ? 5 : 1;
|
||||
if (ticks < 1) ticks = 1;
|
||||
extraTicks.set(index, ticks);
|
||||
openIndividualSettingsMenu(player, index, back, delete);
|
||||
});
|
||||
|
||||
SWItem ticksItem = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS", player, extraTicks.get(index)), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)), false, clickType -> {});
|
||||
ticksItem.getItemStack().setAmount((int) Math.min(extraTicks.get(index), 64));
|
||||
swInventory.setItem(ticksStart + 4, ticksItem.getItemStack(), clickType -> {
|
||||
SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_NAME", player), extraTicks.get(index) + "");
|
||||
swAnvilInv.setCallback(s -> {
|
||||
try {
|
||||
long ticks = Long.parseLong(s);
|
||||
if (ticks < 1) ticks = 1;
|
||||
extraTicks.set(index, ticks);
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
openIndividualSettingsMenu(player, index, back, delete);
|
||||
});
|
||||
swAnvilInv.open();
|
||||
});
|
||||
|
||||
swInventory.setItem(ticksStart + 5, new SWItem(SWItem.getDye(10), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> {
|
||||
long ticks = extraTicks.get(index);
|
||||
ticks += clickType.isShiftClick() ? 5 : 1;
|
||||
extraTicks.set(index, ticks);
|
||||
openIndividualSettingsMenu(player, index, back, delete);
|
||||
});
|
||||
}
|
||||
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
protected void update(BlockData blockData) {
|
||||
Material material = blockData.getMaterial();
|
||||
Block block = location.getBlock();
|
||||
if (blockData instanceof Door) {
|
||||
Door door = (Door) blockData;
|
||||
block.setBlockData(door);
|
||||
if (door.getHalf() == Bisected.Half.BOTTOM) {
|
||||
updateBlock(block.getRelative(BlockFace.UP), door.isOpen() ? 15 : 0);
|
||||
} else {
|
||||
updateBlock(block.getRelative(BlockFace.DOWN), door.isOpen() ? 15 : 0);
|
||||
}
|
||||
} else if (blockData instanceof Switch) {
|
||||
if (blockData instanceof Switch) {
|
||||
Switch sw = (Switch) blockData;
|
||||
updateBlock(block, sw);
|
||||
FaceAttachable.AttachedFace face = sw.getAttachedFace();
|
||||
if (face == FaceAttachable.AttachedFace.FLOOR) {
|
||||
updateBlock(block.getRelative(BlockFace.DOWN), sw.isPowered() ? 15 : 0);
|
||||
updateBlock(block.getRelative(BlockFace.DOWN));
|
||||
} else if (face == FaceAttachable.AttachedFace.CEILING) {
|
||||
updateBlock(block.getRelative(BlockFace.UP), sw.isPowered() ? 15 : 0);
|
||||
updateBlock(block.getRelative(BlockFace.UP));
|
||||
} else {
|
||||
updateBlock(block.getRelative(sw.getFacing().getOppositeFace()), sw.isPowered() ? 15 : 0);
|
||||
updateBlock(block.getRelative(sw.getFacing().getOppositeFace()));
|
||||
}
|
||||
} else if (blockData instanceof Powerable) {
|
||||
updateBlock(block, blockData);
|
||||
updateBlock(block.getRelative(BlockFace.DOWN), ((Powerable) blockData).isPowered() ? 15 : 0);
|
||||
} else if (blockData instanceof AnaloguePowerable) {
|
||||
updateBlock(block, blockData);
|
||||
updateBlock(block.getRelative(BlockFace.DOWN), ((AnaloguePowerable) blockData).getPower());
|
||||
} else {
|
||||
} else if (material == Material.TRIPWIRE) {
|
||||
updateBlock(block, blockData);
|
||||
} else if (material.name().endsWith("_PLATE")) {
|
||||
updateBlock(block.getRelative(BlockFace.DOWN));
|
||||
}
|
||||
}
|
||||
|
||||
private void updateBlock(Block block, int powered) {
|
||||
BlockData data = block.getBlockData();
|
||||
if (data instanceof Door) {
|
||||
Door door = (Door) data;
|
||||
door.setOpen(powered > 0);
|
||||
block.setBlockData(door);
|
||||
return;
|
||||
} else if (data instanceof Powerable) {
|
||||
Powerable powerable = (Powerable) data;
|
||||
powerable.setPowered(powered > 0);
|
||||
} else if (data instanceof AnaloguePowerable) {
|
||||
AnaloguePowerable analoguePowerable = (AnaloguePowerable) data;
|
||||
analoguePowerable.setPower(powered);
|
||||
}
|
||||
updateBlock(block, data);
|
||||
protected void updateBlock(Block block) {
|
||||
updateBlock(block, block.getBlockData());
|
||||
}
|
||||
|
||||
private void updateBlock(Block block, BlockData data) {
|
||||
block.setType(Material.BARRIER);
|
||||
block.setBlockData(data);
|
||||
protected void updateBlock(Block block, BlockData data) {
|
||||
block.setType(Material.BARRIER, true);
|
||||
block.setBlockData(data, true);
|
||||
}
|
||||
|
||||
public abstract boolean checkBlockInWorld();
|
||||
public abstract T createNewElement();
|
||||
|
||||
protected final String translateItemName(String name, Player player) {
|
||||
return BauSystem.MESSAGE.parse("LOADER_SETTING_NAME", player, BauSystem.MESSAGE.parse(name, player));
|
||||
|
@ -1,44 +0,0 @@
|
||||
/*
|
||||
* 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.loader.elements;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public interface LoaderSettingsEnum<T, P extends LoaderInteractionElement<E>, E extends Enum<E> & LoaderSettingsEnum<T, P, E>> {
|
||||
int getPos();
|
||||
SWItem menu(Player player, P parent, int power, long ticks);
|
||||
default boolean hasPower(P parent) {
|
||||
return false;
|
||||
}
|
||||
default boolean hasTicks(P parent) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void execute(Location location, T blockData, P parent, int power, long ticks, Consumer<Long> delay);
|
||||
|
||||
default String translateItemName(String name, String mode, Player player, Object... args) {
|
||||
return BauSystem.MESSAGE.parse("LOADER_GUI_ITEM_NAME", player, BauSystem.MESSAGE.parse(name, player), BauSystem.MESSAGE.parse(mode, player, args));
|
||||
}
|
||||
}
|
@ -19,8 +19,10 @@
|
||||
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@ -28,83 +30,101 @@ import org.bukkit.block.data.type.Comparator;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderComparator extends LoaderInteractionElement<LoaderComparator.ComparatorSettingsEnum> {
|
||||
public class LoaderComparator extends LoaderInteractionElement<LoaderComparator.ComparatorSettings> {
|
||||
|
||||
public LoaderComparator(Location location) {
|
||||
super(location, ComparatorSettingsEnum.INTERACT, ComparatorSettingsEnum.NOOP, ComparatorSettingsEnum.values());
|
||||
super(location);
|
||||
}
|
||||
|
||||
public enum ComparatorSettingsEnum implements LoaderSettingsEnum<Comparator, LoaderComparator, ComparatorSettingsEnum> {
|
||||
NOOP {
|
||||
public class ComparatorSettings implements ElementSettings {
|
||||
|
||||
private boolean interact = false;
|
||||
private Comparator.Mode mode = Comparator.Mode.COMPARE;
|
||||
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
public SWItem menu(Player player) {
|
||||
return menu(player, interact, mode);
|
||||
}
|
||||
|
||||
private SWItem menu(Player player, boolean interact, Comparator.Mode mode) {
|
||||
SWItem swItem;
|
||||
if (interact) {
|
||||
swItem = new SWItem(Material.STICK, "§7Comparator§8: §eInteract");
|
||||
} else if (mode == null) {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, "§7Comparator§8: §eNOOP");
|
||||
} else {
|
||||
swItem = new SWItem(Material.COMPARATOR, "§7Comparator§8: §e" + mode.name());
|
||||
}
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_COMPARATOR", "LOADER_INTERACTION_NOOP", player));
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (location.getBlock().getType() != Material.COMPARATOR) return;
|
||||
Comparator comparator = (Comparator) location.getBlock().getBlockData();
|
||||
if (interact) {
|
||||
comparator.setMode(comparator.getMode() == Comparator.Mode.COMPARE ? Comparator.Mode.SUBTRACT : Comparator.Mode.COMPARE);
|
||||
} else if (mode == null) {
|
||||
return;
|
||||
} else {
|
||||
comparator.setMode(mode);
|
||||
}
|
||||
location.getBlock().setBlockData(comparator, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer<Long> delay) {
|
||||
}
|
||||
},
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
INTERACT {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 3;
|
||||
swInventory.setItem(2, item(player, false, null).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
mode = null;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(3, item(player, true, null).getItemStack(), clickType -> {
|
||||
interact = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(5, item(player, false, Comparator.Mode.COMPARE).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
mode = Comparator.Mode.COMPARE;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(6, item(player, false, Comparator.Mode.SUBTRACT).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
mode = Comparator.Mode.SUBTRACT;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
private SWItem item(Player player, boolean interact, Comparator.Mode mode) {
|
||||
SWItem swItem = menu(player, interact, mode);
|
||||
if (swItem.getItemStack().equals(menu(player, this.interact, this.mode).getItemStack())) {
|
||||
swItem.setEnchanted(true);
|
||||
}
|
||||
swItem.setLore(Collections.emptyList());
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) {
|
||||
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_COMPARATOR", "LOADER_INTERACTION_INTERACT", player));
|
||||
public void playerInteract() {
|
||||
interact = true;
|
||||
mode = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setMode(blockData.getMode() == Comparator.Mode.COMPARE ? Comparator.Mode.SUBTRACT : Comparator.Mode.COMPARE);
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
COMPARE {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) {
|
||||
return new SWItem(Material.COMPARATOR, translateItemName("LOADER_BUTTON_COMPARATOR", "LOADER_INTERACTION_COMPARE", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setMode(Comparator.Mode.COMPARE);
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
SUBTRACT {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 6;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) {
|
||||
return new SWItem(Material.COMPARATOR, translateItemName("LOADER_BUTTON_COMPARATOR", "LOADER_INTERACTION_SUBTRACT", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setMode(Comparator.Mode.SUBTRACT);
|
||||
parent.update(blockData);
|
||||
}
|
||||
public void noop() {
|
||||
interact = false;
|
||||
mode = null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -116,7 +136,7 @@ public class LoaderComparator extends LoaderInteractionElement<LoaderComparator.
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return location.getBlock().getType() == Material.COMPARATOR;
|
||||
public ComparatorSettings createNewElement() {
|
||||
return new ComparatorSettings();
|
||||
}
|
||||
}
|
||||
|
@ -19,98 +19,137 @@
|
||||
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.type.DaylightDetector;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderDaylightDetector extends LoaderInteractionElement<LoaderDaylightDetector.DaylightSettingsEnum> {
|
||||
public class LoaderDaylightDetector extends LoaderInteractionElement<LoaderDaylightDetector.DaylightDetectorSettings> {
|
||||
|
||||
public LoaderDaylightDetector(Location location) {
|
||||
super(location, DaylightSettingsEnum.INTERACT, DaylightSettingsEnum.NOOP, DaylightSettingsEnum.values());
|
||||
super(location);
|
||||
}
|
||||
|
||||
public enum DaylightSettingsEnum implements LoaderSettingsEnum<DaylightDetector, LoaderDaylightDetector, DaylightSettingsEnum> {
|
||||
NOOP {
|
||||
public class DaylightDetectorSettings implements ElementSettings {
|
||||
|
||||
private boolean noop = false;
|
||||
private boolean interact = false;
|
||||
private boolean inverted = true;
|
||||
private int power = 0;
|
||||
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
public SWItem menu(Player player) {
|
||||
return menu(player, noop, interact, inverted);
|
||||
}
|
||||
|
||||
private SWItem menu(Player player, boolean noop, boolean interact, boolean powered) {
|
||||
SWItem swItem;
|
||||
if (noop) {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_NOOP", player));
|
||||
} else if (interact) {
|
||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_INTERACT", player));
|
||||
} else {
|
||||
swItem = new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", powered ? "LOADER_INTERACTION_POWERED": "LOADER_INTERACTION_UNPOWERED", player));
|
||||
}
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_NOOP", player));
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (location.getBlock().getType() != Material.DAYLIGHT_DETECTOR) return;
|
||||
DaylightDetector daylightDetector = (DaylightDetector) location.getBlock().getBlockData();
|
||||
if (noop) {
|
||||
return;
|
||||
} else if (interact) {
|
||||
daylightDetector.setInverted(!daylightDetector.isInverted());
|
||||
} else {
|
||||
daylightDetector.setInverted(inverted);
|
||||
}
|
||||
daylightDetector.setPower(daylightDetector.isInverted() ? 15 - power : power);
|
||||
location.getBlock().setBlockData(daylightDetector);
|
||||
updateBlock(location.getBlock().getRelative(0, -1, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer<Long> delay) {
|
||||
}
|
||||
},
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, 36, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = 27; i < 35; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||
swInventory.setItem(27, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(35, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
INTERACT {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 3;
|
||||
swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> {
|
||||
noop = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = false;
|
||||
inverted = false;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = false;
|
||||
inverted = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
int finalI = i;
|
||||
int finalI2 = i;
|
||||
if (i >= 9) finalI2++;
|
||||
swInventory.setItem(finalI2 + 9, item(player, finalI).getItemStack(), clickType -> {
|
||||
power = finalI;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
}
|
||||
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
private SWItem item(Player player, boolean noop, boolean interact, boolean inverted) {
|
||||
SWItem swItem = menu(player, noop, interact, inverted);
|
||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.inverted).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, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, power));
|
||||
swItem.getItemStack().setAmount(power == 0 ? 1 : power);
|
||||
if (!this.noop && this.power == power) swItem.setEnchanted(true);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) {
|
||||
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_INTERACT", player));
|
||||
public void playerInteract() {
|
||||
noop = false;
|
||||
interact = true;
|
||||
inverted = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setInverted(!blockData.isInverted());
|
||||
blockData.setPower(15 - blockData.getPower());
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
DAY_MODE {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) {
|
||||
return new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_UNPOWERED", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (blockData.isInverted()) {
|
||||
blockData.setInverted(false);
|
||||
blockData.setPower(15 - blockData.getPower());
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
NIGHT_MODE {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 6;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) {
|
||||
return new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_POWERED", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.isInverted()) {
|
||||
blockData.setInverted(true);
|
||||
blockData.setPower(15 - blockData.getPower());
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
public void noop() {
|
||||
noop = true;
|
||||
interact = false;
|
||||
inverted = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -120,7 +159,7 @@ public class LoaderDaylightDetector extends LoaderInteractionElement<LoaderDayli
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return location.getBlock().getType() == Material.DAYLIGHT_DETECTOR;
|
||||
public DaylightDetectorSettings createNewElement() {
|
||||
return new DaylightDetectorSettings();
|
||||
}
|
||||
}
|
||||
|
@ -19,493 +19,132 @@
|
||||
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Lectern;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.BookMeta;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderLectern extends LoaderInteractionElement<LoaderLectern.LecternSettingsEnum> {
|
||||
public class LoaderLectern extends LoaderInteractionElement<LoaderLectern.LecternSettings> {
|
||||
|
||||
|
||||
public LoaderLectern(Location location) {
|
||||
super(location, LecternSettingsEnum.NEXT_PAGE, LecternSettingsEnum.NOOP, LecternSettingsEnum.values());
|
||||
super(location);
|
||||
}
|
||||
|
||||
public enum LecternSettingsEnum implements LoaderSettingsEnum<org.bukkit.block.data.type.Lectern, LoaderLectern, LecternSettingsEnum> {
|
||||
NOOP {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
}
|
||||
public class LecternSettings implements ElementSettings {
|
||||
|
||||
private boolean noop = true;
|
||||
private LecternAction action = LecternAction.PAGE_NEXT;
|
||||
private int page = 0;
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_NOOP", player));
|
||||
public SWItem menu(Player player) {
|
||||
return menu(player, noop, action, page);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
private SWItem menu(Player player, boolean noop, LecternAction action, int page) {
|
||||
SWItem swItem;
|
||||
if (noop) {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_NOOP", player));
|
||||
} else if (action == LecternAction.PAGE_PREV) {
|
||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_PREV", player));
|
||||
} else if (action == LecternAction.PAGE_NEXT) {
|
||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_NEXT", player));
|
||||
} else {
|
||||
swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, page));
|
||||
swItem.getItemStack().setAmount(page);
|
||||
}
|
||||
},
|
||||
|
||||
PREVIOUS_PAGE {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_PREV", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
if (lectern.getPage() > 0) {
|
||||
lectern.setPage(lectern.getPage() - 1);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
NEXT_PAGE {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 6;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_NEXT", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (lectern.getPage() < pages) {
|
||||
lectern.setPage(lectern.getPage() + 1);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_1 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 9;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 1));
|
||||
swItem.getItemStack().setAmount(1);
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (location.getBlock().getType() != Material.LECTERN) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (1 <= pages) {
|
||||
lectern.setPage(1);
|
||||
parent.update(blockData);
|
||||
if (!((org.bukkit.block.data.type.Lectern) lectern.getBlockData()).hasBook()) return;
|
||||
int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size();
|
||||
if (noop) {
|
||||
return;
|
||||
} else if (action == LecternAction.PAGE_PREV) {
|
||||
int page = lectern.getPage();
|
||||
if (page > 1) lectern.setPage(page - 1);
|
||||
} else if (action == LecternAction.PAGE_NEXT) {
|
||||
int page = lectern.getPage();
|
||||
if (page < pages) lectern.setPage(page + 1);
|
||||
} else if (action == LecternAction.PAGE_SET) {
|
||||
if (page <= pages) lectern.setPage(page);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_2 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 10;
|
||||
lectern.update(false, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 2));
|
||||
swItem.getItemStack().setAmount(2);
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, 36, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = 27; i < 35; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||
swInventory.setItem(27, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(35, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
swInventory.setItem(2, item(player, true, LecternAction.PAGE_SET, 0).getItemStack(), clickType -> {
|
||||
noop = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(5, item(player, false, LecternAction.PAGE_PREV, 0).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
action = LecternAction.PAGE_PREV;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(6, item(player, false, LecternAction.PAGE_NEXT, 0).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
action = LecternAction.PAGE_NEXT;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
|
||||
for (int i = 0; i < 15; i++) {
|
||||
int finalI = i;
|
||||
int finalI2 = i;
|
||||
if (i >= 9) finalI2++;
|
||||
if (i >= 12) finalI2++;
|
||||
swInventory.setItem(finalI2 + 9, item(player, false, LecternAction.PAGE_SET, finalI + 1).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
action = LecternAction.PAGE_SET;
|
||||
page = finalI + 1;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
}
|
||||
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
private SWItem item(Player player, boolean noop, LecternAction action, int page) {
|
||||
SWItem swItem = menu(player, noop, action, page);
|
||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.action, this.page).getItemStack())) {
|
||||
swItem.setEnchanted(true);
|
||||
}
|
||||
swItem.setLore(Collections.emptyList());
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (2 <= pages) {
|
||||
lectern.setPage(2);
|
||||
parent.update(blockData);
|
||||
public void noop() {
|
||||
noop = true;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_3 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 11;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 3));
|
||||
swItem.getItemStack().setAmount(3);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (3 <= pages) {
|
||||
lectern.setPage(3);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_4 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 12;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 4));
|
||||
swItem.getItemStack().setAmount(4);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (4 <= pages) {
|
||||
lectern.setPage(4);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_5 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 13;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 5));
|
||||
swItem.getItemStack().setAmount(5);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (5 <= pages) {
|
||||
lectern.setPage(5);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_6 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 14;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 6));
|
||||
swItem.getItemStack().setAmount(6);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (6 <= pages) {
|
||||
lectern.setPage(6);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_7 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 15;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 7));
|
||||
swItem.getItemStack().setAmount(7);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (7 <= pages) {
|
||||
lectern.setPage(7);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_8 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 8));
|
||||
swItem.getItemStack().setAmount(8);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (8 <= pages) {
|
||||
lectern.setPage(8);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_9 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 17;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 9));
|
||||
swItem.getItemStack().setAmount(9);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (9 <= pages) {
|
||||
lectern.setPage(9);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_10 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 19;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 10));
|
||||
swItem.getItemStack().setAmount(10);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (10 <= pages) {
|
||||
lectern.setPage(10);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_11 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 20;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 11));
|
||||
swItem.getItemStack().setAmount(11);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (11 <= pages) {
|
||||
lectern.setPage(11);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_12 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 21;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 12));
|
||||
swItem.getItemStack().setAmount(12);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (12 <= pages) {
|
||||
lectern.setPage(12);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_13 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 23;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 13));
|
||||
swItem.getItemStack().setAmount(13);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (13 <= pages) {
|
||||
lectern.setPage(13);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_14 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 24;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 14));
|
||||
swItem.getItemStack().setAmount(14);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (14 <= pages) {
|
||||
lectern.setPage(14);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
PAGE_15 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 25;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 15));
|
||||
swItem.getItemStack().setAmount(15);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (!blockData.hasBook()) return;
|
||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||
if (itemStack == null) return;
|
||||
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||
if (15 <= pages) {
|
||||
lectern.setPage(15);
|
||||
parent.update(blockData);
|
||||
}
|
||||
}
|
||||
}
|
||||
public enum LecternAction {
|
||||
PAGE_NEXT,
|
||||
PAGE_PREV,
|
||||
PAGE_SET
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -514,7 +153,7 @@ public class LoaderLectern extends LoaderInteractionElement<LoaderLectern.Lecter
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return location.getBlock().getType() == Material.LECTERN;
|
||||
public LecternSettings createNewElement() {
|
||||
return new LecternSettings();
|
||||
}
|
||||
}
|
||||
|
@ -19,91 +19,108 @@
|
||||
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.type.Switch;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderLever extends LoaderInteractionElement<LoaderLever.LeverSettingsEnum> {
|
||||
public class LoaderLever extends LoaderInteractionElement<LoaderLever.LeverSettings> {
|
||||
|
||||
public LoaderLever(Location location) {
|
||||
super(location, LeverSettingsEnum.INTERACT, LeverSettingsEnum.NOOP, LeverSettingsEnum.values());
|
||||
super(location);
|
||||
}
|
||||
|
||||
public enum LeverSettingsEnum implements LoaderSettingsEnum<Switch, LoaderLever, LeverSettingsEnum> {
|
||||
public class LeverSettings implements ElementSettings {
|
||||
|
||||
private boolean noop = false;
|
||||
private boolean interact = true;
|
||||
private boolean power = false;
|
||||
|
||||
NOOP {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
public SWItem menu(Player player) {
|
||||
return menu(player, noop, interact, power);
|
||||
}
|
||||
|
||||
private SWItem menu(Player player, boolean noop, boolean interact, boolean power) {
|
||||
SWItem swItem;
|
||||
if (noop) {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_NOOP", player));
|
||||
} else if (interact) {
|
||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INTERACT", player));
|
||||
} else {
|
||||
swItem = new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", power ? "LOADER_INTERACTION_ACTIVE" : "LOADER_INTERACTION_INACTIVE", player));
|
||||
}
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLever parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_NOOP", player));
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (location.getBlock().getType() != Material.LEVER) return;
|
||||
if (noop) return;
|
||||
|
||||
Switch lever = (Switch) location.getBlock().getBlockData();
|
||||
if (interact) {
|
||||
lever.setPowered(!lever.isPowered());
|
||||
} else {
|
||||
lever.setPowered(power);
|
||||
}
|
||||
location.getBlock().setBlockData(lever, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer<Long> delay) {
|
||||
}
|
||||
},
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
INTERACT {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 3;
|
||||
swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> {
|
||||
noop = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = false;
|
||||
power = false;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = false;
|
||||
power = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
private SWItem item(Player player, boolean noop, boolean interact, boolean power) {
|
||||
SWItem swItem = menu(player, noop, interact, power);
|
||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.power).getItemStack())) {
|
||||
swItem.setEnchanted(true);
|
||||
}
|
||||
swItem.setLore(Collections.emptyList());
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLever parent, int power, long ticks) {
|
||||
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INTERACT", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setPowered(!blockData.isPowered());
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
POWER_OFF {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLever parent, int power, long ticks) {
|
||||
return new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INACTIVE", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setPowered(false);
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
POWER_ON {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 6;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderLever parent, int power, long ticks) {
|
||||
return new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_ACTIVE", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setPowered(true);
|
||||
}
|
||||
public void noop() {
|
||||
noop = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -113,7 +130,7 @@ public class LoaderLever extends LoaderInteractionElement<LoaderLever.LeverSetti
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return location.getBlock().getType() == Material.LEVER;
|
||||
public LeverSettings createNewElement() {
|
||||
return new LeverSettings();
|
||||
}
|
||||
}
|
||||
|
@ -20,9 +20,12 @@
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
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;
|
||||
@ -30,16 +33,18 @@ 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;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.MovementSettingsEnum> {
|
||||
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, MovementSettingsEnum.NO_WAIT_FOR, MovementSettingsEnum.NOOP, MovementSettingsEnum.values());
|
||||
super(location);
|
||||
this.name = name;
|
||||
this.material = material;
|
||||
this.analogue = location.getBlock().getBlockData() instanceof AnaloguePowerable;
|
||||
@ -47,56 +52,48 @@ public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.Move
|
||||
|
||||
public void setInitialTicks(long ticks) {
|
||||
if (ticks < 1) ticks = 1;
|
||||
extraTicks.set(currentShot, ticks);
|
||||
elements.get(currentShot).ticks = ticks;
|
||||
}
|
||||
|
||||
public enum MovementSettingsEnum implements LoaderSettingsEnum<BlockData, LoaderMovement, MovementSettingsEnum> {
|
||||
public class MovementSettings implements ElementSettings {
|
||||
|
||||
private boolean noop = false;
|
||||
private boolean waitFor = false;
|
||||
private int power = 15;
|
||||
private long ticks = 1;
|
||||
|
||||
NOOP {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
public SWItem menu(Player player) {
|
||||
return menu(player, noop, waitFor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer<Long> delay) {
|
||||
}
|
||||
},
|
||||
|
||||
NO_WAIT_FOR {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_WAIT_FOR", player));
|
||||
private SWItem menu(Player player, boolean noop, boolean waitFor) {
|
||||
SWItem swItem;
|
||||
if (noop) {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName(name, "LOADER_INTERACTION_NOOP", player));
|
||||
} else if (waitFor) {
|
||||
swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_WAIT_FOR", player));
|
||||
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
||||
} else {
|
||||
swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_NO_WAIT_FOR", player));
|
||||
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
||||
swItem.setEnchanted(true);
|
||||
}
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPower(LoaderMovement parent) {
|
||||
return parent.analogue;
|
||||
}
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (!(material == Material.STRING && location.getBlock().getType() == Material.TRIPWIRE) && location.getBlock().getType() != material) return;
|
||||
if (noop) return;
|
||||
|
||||
@Override
|
||||
public boolean hasTicks(LoaderMovement parent) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer<Long> delay) {
|
||||
BlockData blockData = location.getBlock().getBlockData();
|
||||
if (blockData instanceof AnaloguePowerable) {
|
||||
AnaloguePowerable analoguePowerable = (AnaloguePowerable) location.getBlock().getBlockData();
|
||||
analoguePowerable.setPower(power);
|
||||
parent.update(analoguePowerable);
|
||||
location.getBlock().setBlockData(analoguePowerable, true);
|
||||
update(analoguePowerable);
|
||||
} else if (blockData instanceof Powerable) {
|
||||
Powerable powerable = (Powerable) location.getBlock().getBlockData();
|
||||
if (ticks < 0) {
|
||||
@ -104,51 +101,118 @@ public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.Move
|
||||
} else {
|
||||
powerable.setPowered(true);
|
||||
}
|
||||
parent.update(powerable);
|
||||
location.getBlock().setBlockData(powerable, true);
|
||||
update(powerable);
|
||||
}
|
||||
|
||||
if (ticks >= 0) {
|
||||
if (waitFor) {
|
||||
delay.accept(ticks);
|
||||
}
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||
if (blockData instanceof AnaloguePowerable) {
|
||||
AnaloguePowerable analoguePowerable = (AnaloguePowerable) blockData;
|
||||
analoguePowerable.setPower(0);
|
||||
parent.update(analoguePowerable);
|
||||
location.getBlock().setBlockData(analoguePowerable, true);
|
||||
update(analoguePowerable);
|
||||
} else {
|
||||
Powerable powerable = (Powerable) blockData;
|
||||
powerable.setPowered(false);
|
||||
parent.update(powerable);
|
||||
location.getBlock().setBlockData(powerable, true);
|
||||
update(powerable);
|
||||
}
|
||||
}, ticks);
|
||||
}
|
||||
},
|
||||
|
||||
WAIT_FOR {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 6;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_NO_WAIT_FOR", player));
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, analogue ? 45 : 27, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
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, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(analogue ? 44 : 26, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
swInventory.setItem(2, 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), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE_SHIFT", player)), false, clickType -> {}).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, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_NAME", player), 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), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE_SHIFT", player)), false, clickType -> {}).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, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, 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, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS", player, ticks));
|
||||
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPower(LoaderMovement parent) {
|
||||
return parent.analogue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTicks(LoaderMovement parent) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer<Long> delay) {
|
||||
NO_WAIT_FOR.execute(location, blockData, parent, power, ticks, delay);
|
||||
delay.accept(ticks);
|
||||
}
|
||||
public void noop() {
|
||||
noop = true;
|
||||
waitFor = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -158,8 +222,7 @@ public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.Move
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
if (material == Material.STRING && location.getBlock().getType() == Material.TRIPWIRE) return true;
|
||||
return location.getBlock().getType() == material;
|
||||
public MovementSettings createNewElement() {
|
||||
return new MovementSettings();
|
||||
}
|
||||
}
|
||||
|
@ -19,8 +19,10 @@
|
||||
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Instrument;
|
||||
import org.bukkit.Location;
|
||||
@ -28,50 +30,80 @@ import org.bukkit.Material;
|
||||
import org.bukkit.block.data.type.NoteBlock;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderNoteBlock extends LoaderInteractionElement<LoaderNoteBlock.NoteBlockSettingsEnum> {
|
||||
public class LoaderNoteBlock extends LoaderInteractionElement<LoaderNoteBlock.NoteBlockSettings> {
|
||||
|
||||
public LoaderNoteBlock(Location location) {
|
||||
super(location, NoteBlockSettingsEnum.INTERACT, NoteBlockSettingsEnum.NOOP, NoteBlockSettingsEnum.values());
|
||||
super(location);
|
||||
}
|
||||
|
||||
public enum NoteBlockSettingsEnum implements LoaderSettingsEnum<NoteBlock, LoaderNoteBlock, NoteBlockSettingsEnum> {
|
||||
public class NoteBlockSettings implements ElementSettings {
|
||||
|
||||
private boolean interact = true;
|
||||
|
||||
NOOP {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
public SWItem menu(Player player) {
|
||||
return menu(player, interact);
|
||||
}
|
||||
|
||||
private SWItem menu(Player player, boolean interact) {
|
||||
SWItem swItem;
|
||||
if (interact) {
|
||||
swItem = new SWItem(Material.NOTE_BLOCK, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_INTERACT", player));
|
||||
} else {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_NOOP", player));
|
||||
}
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderNoteBlock parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_NOOP", player));
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (location.getBlock().getType() != Material.NOTE_BLOCK) return;
|
||||
NoteBlock noteBlock = (NoteBlock) location.getBlock().getBlockData();
|
||||
if (interact) {
|
||||
if (noteBlock.getInstrument() == Instrument.BANJO) noteBlock.setInstrument(Instrument.BIT);
|
||||
else noteBlock.setInstrument(Instrument.BANJO);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
location.getBlock().setBlockData(noteBlock);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, NoteBlock blockData, LoaderNoteBlock parent, int power, long ticks, Consumer<Long> delay) {
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
swInventory.setItem(2, item(player, false).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(3, item(player, true).getItemStack(), clickType -> {
|
||||
interact = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
|
||||
swInventory.open();
|
||||
}
|
||||
},
|
||||
|
||||
INTERACT {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 3;
|
||||
private SWItem item(Player player, boolean interact) {
|
||||
SWItem swItem = menu(player, interact);
|
||||
if (swItem.getItemStack().equals(menu(player, this.interact).getItemStack())) {
|
||||
swItem.setEnchanted(true);
|
||||
}
|
||||
swItem.setLore(Collections.emptyList());
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderNoteBlock parent, int power, long ticks) {
|
||||
return new SWItem(Material.NOTE_BLOCK, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_INTERACT", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, NoteBlock blockData, LoaderNoteBlock parent, int power, long ticks, Consumer<Long> delay) {
|
||||
if (blockData.getInstrument() == Instrument.BANJO) blockData.setInstrument(Instrument.BIT);
|
||||
else blockData.setInstrument(Instrument.BANJO);
|
||||
parent.update(blockData);
|
||||
}
|
||||
public void noop() {
|
||||
interact = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -81,7 +113,7 @@ public class LoaderNoteBlock extends LoaderInteractionElement<LoaderNoteBlock.No
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return location.getBlock().getType() == Material.NOTE_BLOCK;
|
||||
public NoteBlockSettings createNewElement() {
|
||||
return new NoteBlockSettings();
|
||||
}
|
||||
}
|
||||
|
@ -19,97 +19,113 @@
|
||||
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.Openable;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderOpenable extends LoaderInteractionElement<LoaderOpenable.OpenableSettingsEnum> {
|
||||
public class LoaderOpenable extends LoaderInteractionElement<LoaderOpenable.TrapdoorSettings> {
|
||||
|
||||
private String name;
|
||||
private Material material;
|
||||
|
||||
public LoaderOpenable(Location location, String name, Material material) {
|
||||
super(location, OpenableSettingsEnum.INTERACT, OpenableSettingsEnum.NOOP, OpenableSettingsEnum.values());
|
||||
super(location);
|
||||
this.name = name;
|
||||
this.material = material;
|
||||
}
|
||||
|
||||
public enum OpenableSettingsEnum implements LoaderSettingsEnum<Openable, LoaderOpenable, OpenableSettingsEnum> {
|
||||
public class TrapdoorSettings implements ElementSettings {
|
||||
|
||||
private boolean noop = false;
|
||||
private boolean interact = true;
|
||||
private boolean open = false;
|
||||
|
||||
NOOP {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
public SWItem menu(Player player) {
|
||||
return menu(player, noop, interact, open);
|
||||
}
|
||||
|
||||
private SWItem menu(Player player, boolean noop, boolean interact, boolean powered) {
|
||||
SWItem swItem;
|
||||
if (noop) {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName(name, "LOADER_INTERACTION_NOOP", player));
|
||||
} else if (interact) {
|
||||
swItem = new SWItem(Material.STICK, translateItemName(name, "LOADER_INTERACTION_INTERACT", player));
|
||||
} else {
|
||||
swItem = new SWItem(material, translateItemName(name, open ? "LOADER_INTERACTION_OPEN" : "LOADER_INTERACTION_CLOSED", player));
|
||||
}
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player));
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (location.getBlock().getType() != material) return;
|
||||
Openable openable = (Openable) location.getBlock().getBlockData();
|
||||
if (noop) {
|
||||
return;
|
||||
} else if (interact) {
|
||||
openable.setOpen(!openable.isOpen());
|
||||
} else {
|
||||
openable.setOpen(open);
|
||||
}
|
||||
location.getBlock().setBlockData(openable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer<Long> delay) {
|
||||
}
|
||||
},
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
INTERACT {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 3;
|
||||
swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> {
|
||||
noop = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = false;
|
||||
open = false;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> {
|
||||
noop = false;
|
||||
interact = false;
|
||||
open = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
private SWItem item(Player player, boolean noop, boolean interact, boolean open) {
|
||||
SWItem swItem = menu(player, noop, interact, open);
|
||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.open).getItemStack())) {
|
||||
swItem.setEnchanted(true);
|
||||
}
|
||||
swItem.setLore(Collections.emptyList());
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) {
|
||||
return new SWItem(Material.STICK, translateItemName(parent.name, "LOADER_INTERACTION_INTERACT", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setOpen(!blockData.isOpen());
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
CLOSED {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) {
|
||||
return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_CLOSED", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setOpen(false);
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
OPEN {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 6;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) {
|
||||
return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_OPEN", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setOpen(true);
|
||||
parent.update(blockData);
|
||||
}
|
||||
public void noop() {
|
||||
noop = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,7 +135,7 @@ public class LoaderOpenable extends LoaderInteractionElement<LoaderOpenable.Open
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return location.getBlock().getType() == material;
|
||||
public TrapdoorSettings createNewElement() {
|
||||
return new TrapdoorSettings();
|
||||
}
|
||||
}
|
||||
|
@ -20,140 +20,125 @@
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
import de.steamwar.inventory.SWInventory;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.type.Repeater;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderRepeater extends LoaderInteractionElement<LoaderRepeater.RepeaterSettingsEnum> {
|
||||
public class LoaderRepeater extends LoaderInteractionElement<LoaderRepeater.RepeaterSettings> {
|
||||
|
||||
public LoaderRepeater(Location location) {
|
||||
super(location, RepeaterSettingsEnum.INTERACT, RepeaterSettingsEnum.NOOP, RepeaterSettingsEnum.values());
|
||||
super(location);
|
||||
}
|
||||
|
||||
public enum RepeaterSettingsEnum implements LoaderSettingsEnum<Repeater, LoaderRepeater, RepeaterSettingsEnum> {
|
||||
public class RepeaterSettings implements ElementSettings {
|
||||
|
||||
private boolean interact = false;
|
||||
private int delay = 1;
|
||||
|
||||
NOOP {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 1;
|
||||
public SWItem menu(Player player) {
|
||||
return menu(player, interact, delay);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_NOOP", player));
|
||||
private SWItem menu(Player player, boolean interact, int delay) {
|
||||
SWItem swItem;
|
||||
if (interact) {
|
||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_INTERACT", player));
|
||||
} else if (delay == 0) {
|
||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_NOOP", player));
|
||||
} else {
|
||||
swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, delay));
|
||||
swItem.getItemStack().setAmount(delay);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
INTERACT {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_INTERACT", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||
int repeaterDelay = blockData.getDelay();
|
||||
repeaterDelay++;
|
||||
if (repeaterDelay > 4) repeaterDelay = 1;
|
||||
blockData.setDelay(repeaterDelay);
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
DELAY_1 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 4;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 1));
|
||||
swItem.getItemStack().setAmount(1);
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setDelay(1);
|
||||
parent.update(blockData);
|
||||
public void execute(Consumer<Long> __) {
|
||||
if (location.getBlock().getType() != Material.REPEATER) return;
|
||||
Repeater repeater = (Repeater) location.getBlock().getBlockData();
|
||||
if (interact) {
|
||||
int delay = repeater.getDelay();
|
||||
delay++;
|
||||
if (delay > 4) delay = 1;
|
||||
repeater.setDelay(delay);
|
||||
} else if (delay == 0) {
|
||||
return;
|
||||
} else {
|
||||
repeater.setDelay(delay);
|
||||
}
|
||||
},
|
||||
|
||||
DELAY_2 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 5;
|
||||
location.getBlock().setBlockData(repeater, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 2));
|
||||
swItem.getItemStack().setAmount(2);
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
swInventory.setItem(1, item(player, false, 0).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
delay = 0;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(2, item(player, true, -1).getItemStack(), clickType -> {
|
||||
interact = true;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(4, item(player, false, 1).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
delay = 1;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(5, item(player, false, 2).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
delay = 2;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(6, item(player, false, 3).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
delay = 3;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
swInventory.setItem(7, item(player, false, 4).getItemStack(), clickType -> {
|
||||
interact = false;
|
||||
delay = 4;
|
||||
click(player, backAction, deleteAction);
|
||||
});
|
||||
|
||||
swInventory.open();
|
||||
}
|
||||
|
||||
private SWItem item(Player player, boolean interact, int delay) {
|
||||
SWItem swItem = menu(player, interact, delay);
|
||||
if (swItem.getItemStack().equals(menu(player, this.interact, this.delay).getItemStack())) {
|
||||
swItem.setEnchanted(true);
|
||||
}
|
||||
swItem.setLore(Collections.emptyList());
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setDelay(2);
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
DELAY_3 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 6;
|
||||
public void playerInteract() {
|
||||
interact = true;
|
||||
delay = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 3));
|
||||
swItem.getItemStack().setAmount(3);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setDelay(3);
|
||||
parent.update(blockData);
|
||||
}
|
||||
},
|
||||
|
||||
DELAY_4 {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 7;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||
SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 4));
|
||||
swItem.getItemStack().setAmount(4);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||
blockData.setDelay(4);
|
||||
parent.update(blockData);
|
||||
}
|
||||
public void noop() {
|
||||
interact = false;
|
||||
delay = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -163,7 +148,7 @@ public class LoaderRepeater extends LoaderInteractionElement<LoaderRepeater.Repe
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return location.getBlock().getType() == Material.REPEATER;
|
||||
public RepeaterSettings createNewElement() {
|
||||
return new RepeaterSettings();
|
||||
}
|
||||
}
|
||||
|
@ -20,57 +20,23 @@
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderElement;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderTNT extends LoaderInteractionElement<LoaderTNT.TNTSettingsEnum> {
|
||||
public class LoaderTNT implements LoaderElement {
|
||||
|
||||
private Location location;
|
||||
|
||||
public LoaderTNT(Location location) {
|
||||
super(location, TNTSettingsEnum.PLACE, TNTSettingsEnum.NOOP, TNTSettingsEnum.values());
|
||||
}
|
||||
|
||||
public enum TNTSettingsEnum implements LoaderSettingsEnum<BlockData, LoaderTNT, TNTSettingsEnum> {
|
||||
NOOP {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderTNT parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_TNT", "LOADER_INTERACTION_NOOP", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, BlockData blockData, LoaderTNT parent, int power, long ticks, Consumer<Long> delay) {
|
||||
}
|
||||
},
|
||||
|
||||
PLACE {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderTNT parent, int power, long ticks) {
|
||||
return new SWItem(Material.TNT, translateItemName("LOADER_BUTTON_TNT", "LOADER_INTERACTION_PLACE", player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, BlockData blockData, LoaderTNT parent, int power, long ticks, Consumer<Long> delay) {
|
||||
location.getBlock().setType(Material.TNT);
|
||||
}
|
||||
}
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -88,11 +54,10 @@ public class LoaderTNT extends LoaderInteractionElement<LoaderTNT.TNTSettingsEnu
|
||||
return;
|
||||
}
|
||||
|
||||
super.execute(delay);
|
||||
block.setType(Material.TNT, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return true;
|
||||
public void click(Player player, Runnable backAction) {
|
||||
}
|
||||
}
|
||||
|
@ -20,87 +20,120 @@
|
||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||
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.Powerable;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSettingsEnum> {
|
||||
public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSettings> {
|
||||
|
||||
private String name;
|
||||
private Material material;
|
||||
private int ticks;
|
||||
|
||||
public LoaderTicks(Location location, String name, Material material, int ticks) {
|
||||
super(location, TicksSettingsEnum.NO_WAIT_FOR, TicksSettingsEnum.NOOP, TicksSettingsEnum.values());
|
||||
super(location);
|
||||
this.name = name;
|
||||
this.material = material;
|
||||
this.ticks = ticks;
|
||||
}
|
||||
|
||||
public enum TicksSettingsEnum implements LoaderSettingsEnum<Powerable, LoaderTicks, TicksSettingsEnum> {
|
||||
public class TicksSettings implements ElementSettings {
|
||||
|
||||
private boolean noop = false;
|
||||
private boolean waitFor = false;
|
||||
|
||||
NOOP {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 2;
|
||||
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, translateItemName(name, "LOADER_INTERACTION_NOOP", player));
|
||||
} else if (waitFor) {
|
||||
swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_WAIT_FOR", player, ticks));
|
||||
} else {
|
||||
swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_NO_WAIT_FOR", player, ticks));
|
||||
swItem.setEnchanted(true);
|
||||
}
|
||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) {
|
||||
return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player));
|
||||
public void execute(Consumer<Long> delay) {
|
||||
if (location.getBlock().getType() != material) {
|
||||
return;
|
||||
}
|
||||
if (noop) {
|
||||
return;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer<Long> delay) {
|
||||
}
|
||||
},
|
||||
|
||||
NO_WAIT_FOR {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) {
|
||||
return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_NO_WAIT_FOR", player, ticks));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer<Long> delay) {
|
||||
Powerable powerable = (Powerable) location.getBlock().getBlockData();
|
||||
powerable.setPowered(true);
|
||||
parent.update(powerable);
|
||||
location.getBlock().setBlockData(powerable, true);
|
||||
update(powerable);
|
||||
|
||||
if (waitFor) {
|
||||
delay.accept((long) ticks);
|
||||
}
|
||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||
powerable.setPowered(false);
|
||||
parent.update(powerable);
|
||||
}, parent.ticks);
|
||||
}
|
||||
},
|
||||
|
||||
WAIT_FOR {
|
||||
@Override
|
||||
public int getPos() {
|
||||
return 6;
|
||||
location.getBlock().setBlockData(powerable, true);
|
||||
update(powerable);
|
||||
}, ticks);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) {
|
||||
return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_WAIT_FOR", player, ticks));
|
||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
||||
|
||||
swInventory.setItem(2, 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.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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer<Long> delay) {
|
||||
NO_WAIT_FOR.execute(location, blockData, parent, power, ticks, delay);
|
||||
delay.accept((long) parent.ticks);
|
||||
}
|
||||
public void noop() {
|
||||
noop = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -110,7 +143,7 @@ public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSetti
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkBlockInWorld() {
|
||||
return location.getBlock().getType() == material;
|
||||
public TicksSettings createNewElement() {
|
||||
return new TicksSettings();
|
||||
}
|
||||
}
|
||||
|
@ -32,12 +32,12 @@ public class LoadtimerCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "start", description = "LOADTIMER_HELP_START_1")
|
||||
public void start(@Validator Player p) {
|
||||
public void start(Player p) {
|
||||
start(p, TimerMode.HALF);
|
||||
}
|
||||
|
||||
@Register(value = "start", description = {"LOADTIMER_HELP_START_2", "LOADTIMER_HELP_START_3"})
|
||||
public void start(@Validator Player p, TimerMode mode) {
|
||||
public void start(Player p, TimerMode mode) {
|
||||
Region r = Region.getRegion(p.getLocation());
|
||||
if (r.isGlobal()) return;
|
||||
if (!Loadtimer.hasTimer(r))
|
||||
@ -45,7 +45,7 @@ public class LoadtimerCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "stop", description = "LOADTIMER_HELP_STOP")
|
||||
public void stop(@Validator Player p) {
|
||||
public void stop(Player p) {
|
||||
Region r = Region.getRegion(p.getLocation());
|
||||
if (r.isGlobal()) return;
|
||||
if (Loadtimer.hasTimer(r))
|
||||
|
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bausystem.features.observer;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -47,13 +46,13 @@ public class ObserverTracerCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "delete", description = "OBSERVER_HELP_DELETE")
|
||||
public void delete(@Validator Player p) {
|
||||
public void delete(Player p) {
|
||||
ObserverTracerListener.observerTracerMap.remove(p);
|
||||
BauSystem.MESSAGE.send("OBSERVER_DELETE", p);
|
||||
}
|
||||
|
||||
@Register(value = "retrace", description = "OBSERVER_HELP_RETRACE")
|
||||
public void retrace(@Validator Player p) {
|
||||
public void retrace(Player p) {
|
||||
if (ObserverTracerListener.observerTracerMap.containsKey(p)) {
|
||||
BauSystem.MESSAGE.send("OBSERVER_RETRACE_NO_TRACE", p);
|
||||
return;
|
||||
|
@ -20,8 +20,6 @@
|
||||
package de.steamwar.bausystem.features.observer;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameMode;
|
||||
@ -57,7 +55,6 @@ public class ObserverTracerListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (!enabled.contains(event.getPlayer())) {
|
||||
return;
|
||||
}
|
||||
@ -90,11 +87,6 @@ public class ObserverTracerListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||
event.getNewSpectator().forEach(observerTracerMap::remove);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
enabled.add(event.getPlayer());
|
||||
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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.redstonetester;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.linkage.specific.BauGuiItem;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@Linked
|
||||
public class RedstoneTesterGuiItem extends BauGuiItem {
|
||||
|
||||
public RedstoneTesterGuiItem() {
|
||||
super(23);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItem(Player player) {
|
||||
return new SWItem(Material.REPEATER,
|
||||
BauSystem.MESSAGE.parse("RT_ITEM_NAME", player),
|
||||
Arrays.asList(BauSystem.MESSAGE.parse("RT_ITEM_LORE_1", player),
|
||||
BauSystem.MESSAGE.parse("RT_ITEM_LORE_2", player),
|
||||
BauSystem.MESSAGE.parse("RT_ITEM_LORE_3", player))
|
||||
, false, null).getItemStack();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean click(ClickType click, Player p) {
|
||||
p.closeInventory();
|
||||
p.performCommand("redstonetester");
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.MEMBER;
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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.redstonetester;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@Linked
|
||||
public class RedstonetesterCommand extends SWCommand {
|
||||
|
||||
public RedstonetesterCommand() {
|
||||
super("redstonetester", "rt");
|
||||
}
|
||||
|
||||
@Register(description = "RT_HELP")
|
||||
public void genericCommand(Player p) {
|
||||
BauSystem.MESSAGE.send("RT_GIVEN", p);
|
||||
SWUtils.giveItemToPlayer(p, RedstonetesterUtils.getWand(p));
|
||||
}
|
||||
}
|
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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.redstonetester;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
import de.steamwar.bausystem.utils.ItemUtils;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.block.data.Powerable;
|
||||
import org.bukkit.block.data.type.Piston;
|
||||
import org.bukkit.block.data.type.RedstoneWire;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@UtilityClass
|
||||
public class RedstonetesterUtils {
|
||||
|
||||
public static ItemStack getWand(Player player) {
|
||||
ItemStack i = new SWItem(Material.BLAZE_ROD,
|
||||
BauSystem.MESSAGE.parse("RT_ITEM_NAME", player),
|
||||
Arrays.asList(BauSystem.MESSAGE.parse("RT_ITEM_LORE_1", player),
|
||||
BauSystem.MESSAGE.parse("RT_ITEM_LORE_2", player),
|
||||
BauSystem.MESSAGE.parse("RT_ITEM_LORE_3", player)),
|
||||
false, null).getItemStack();
|
||||
ItemUtils.setItem(i, "redstonetester");
|
||||
return i;
|
||||
}
|
||||
|
||||
@Getter
|
||||
private final Map<Player, RedstoneTester> playerMap = new HashMap<>();
|
||||
|
||||
public void sendLocation(Player player, String prefix, Location location) {
|
||||
BauSystem.MESSAGE.send("RT_LOC", player, location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||
}
|
||||
|
||||
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
|
||||
public boolean validBlock(Player player, BlockData block) {
|
||||
if (block instanceof Powerable) return true;
|
||||
if (block instanceof Piston) return true;
|
||||
if (block instanceof RedstoneWire) return true;
|
||||
BauSystem.MESSAGE.send("RT_INVALID_LOC", player);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public static class RedstoneTester {
|
||||
|
||||
private final Player player;
|
||||
private Location loc1 = null;
|
||||
private Location loc2 = null;
|
||||
|
||||
private long lastTick = 0;
|
||||
private Long tick = null;
|
||||
|
||||
public RedstoneTester(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public void activate(Location location) {
|
||||
if (loc1 == null || loc2 == null) {
|
||||
tick = null;
|
||||
return;
|
||||
}
|
||||
if (TPSUtils.currentRealTick.get() - lastTick > 100) {
|
||||
tick = null;
|
||||
}
|
||||
if (loc1.equals(location)) {
|
||||
lastTick = TPSUtils.currentRealTick.get();
|
||||
if (tick == null) {
|
||||
tick = TPSUtils.currentRealTick.get();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (tick != null && loc2.equals(location)) {
|
||||
BauSystem.MESSAGE.send("RT_RESULT", player, (TPSUtils.currentRealTick.get() - tick), ((TPSUtils.currentRealTick.get() - tick) / 2.0));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,94 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 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.redstonetester;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.utils.ItemUtils;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockDispenseEvent;
|
||||
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||
import org.bukkit.event.block.BlockRedstoneEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@Linked
|
||||
public class RestonetesterListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (!ItemUtils.isItem(event.getItem(), "redstonetester")) return;
|
||||
Player player = event.getPlayer();
|
||||
Block block = event.getClickedBlock();
|
||||
event.setCancelled(true);
|
||||
|
||||
switch (event.getAction()) {
|
||||
case RIGHT_CLICK_AIR:
|
||||
if (player.isSneaking()) {
|
||||
RedstonetesterUtils.getPlayerMap().remove(event.getPlayer());
|
||||
BauSystem.MESSAGE.send("RT_ACTIVATE", player);
|
||||
}
|
||||
break;
|
||||
case LEFT_CLICK_BLOCK:
|
||||
if (!RedstonetesterUtils.validBlock(event.getPlayer(), Objects.requireNonNull(block).getBlockData())) return;
|
||||
RedstonetesterUtils.getPlayerMap().computeIfAbsent(event.getPlayer(), RedstonetesterUtils.RedstoneTester::new).setLoc1(block.getLocation());
|
||||
RedstonetesterUtils.sendLocation(event.getPlayer(), "POS1", block.getLocation());
|
||||
break;
|
||||
case RIGHT_CLICK_BLOCK:
|
||||
if (!RedstonetesterUtils.validBlock(event.getPlayer(), Objects.requireNonNull(block).getBlockData())) return;
|
||||
RedstonetesterUtils.getPlayerMap().computeIfAbsent(event.getPlayer(), RedstonetesterUtils.RedstoneTester::new).setLoc2(block.getLocation());
|
||||
RedstonetesterUtils.sendLocation(event.getPlayer(), "POS2", block.getLocation());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
RedstonetesterUtils.getPlayerMap().remove(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPistonExtend(BlockPistonExtendEvent e) {
|
||||
RedstonetesterUtils.getPlayerMap().forEach((player, redstoneTester) -> redstoneTester.activate(e.getBlock().getLocation()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPistonRetract(BlockPistonRetractEvent e) {
|
||||
RedstonetesterUtils.getPlayerMap().forEach((player, redstoneTester) -> redstoneTester.activate(e.getBlock().getLocation()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onRedstoneEvent(BlockRedstoneEvent e) {
|
||||
RedstonetesterUtils.getPlayerMap().forEach((player, redstoneTester) -> redstoneTester.activate(e.getBlock().getLocation()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBlockDispense(BlockDispenseEvent e) {
|
||||
RedstonetesterUtils.getPlayerMap().forEach((player, redstoneTester) -> redstoneTester.activate(e.getBlock().getLocation()));
|
||||
}
|
||||
}
|
@ -85,7 +85,7 @@ public class ColorCommand extends SWCommand {
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!bauServer.getOwner().equals(player.getUniqueId()), "NO_PERMISSION");
|
||||
return !messageSender.send(!bauServer.getOwner().equals(player.getUniqueId()), "REGION_COLOR_NO_PERMS");
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -46,6 +46,10 @@ public class FireCommand extends SWCommand {
|
||||
}
|
||||
}
|
||||
|
||||
private String getNoPermMessage() {
|
||||
return "REGION_FIRE_NO_PERMS";
|
||||
}
|
||||
|
||||
private String getEnableMessage() {
|
||||
return "REGION_FIRE_ENABLED";
|
||||
}
|
||||
@ -65,4 +69,11 @@ public class FireCommand extends SWCommand {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), getNoPermMessage());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -46,6 +46,10 @@ public class FreezeCommand extends SWCommand {
|
||||
}
|
||||
}
|
||||
|
||||
private String getNoPermMessage() {
|
||||
return "REGION_FREEZE_NO_PERMS";
|
||||
}
|
||||
|
||||
private String getEnableMessage(){
|
||||
return "REGION_FREEZE_ENABLED";
|
||||
}
|
||||
@ -65,4 +69,11 @@ public class FreezeCommand extends SWCommand {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), getNoPermMessage());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -49,6 +49,10 @@ public class ItemsCommand extends SWCommand {
|
||||
}
|
||||
}
|
||||
|
||||
private String getNoPermMessage() {
|
||||
return "REGION_ITEMS_NO_PERMS";
|
||||
}
|
||||
|
||||
private String getEnableMessage(){
|
||||
return "REGION_ITEMS_ENABLED";
|
||||
}
|
||||
@ -68,4 +72,11 @@ public class ItemsCommand extends SWCommand {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), getNoPermMessage());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,66 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2024 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.region;
|
||||
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.RegionUtils;
|
||||
import de.steamwar.bausystem.region.flags.Flag;
|
||||
import de.steamwar.bausystem.region.flags.flagvalues.NoGravityMode;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@Linked
|
||||
public class NoGravityCommand extends SWCommand {
|
||||
|
||||
public NoGravityCommand() {
|
||||
super("nogravity");
|
||||
}
|
||||
|
||||
@Register(description = "REGION_NO_GRAVITY_HELP")
|
||||
public void toggleCommand(@Validator Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (toggle(region)) {
|
||||
RegionUtils.actionBar(region, getEnableMessage());
|
||||
} else {
|
||||
RegionUtils.actionBar(region, getDisableMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private String getEnableMessage() {
|
||||
return "REGION_NO_GRAVITY_ENABLED";
|
||||
}
|
||||
|
||||
private String getDisableMessage() {
|
||||
return "REGION_NO_GRAVITY_DISABLED";
|
||||
}
|
||||
|
||||
private boolean toggle(Region region) {
|
||||
switch (region.getPlain(Flag.NO_GRAVITY, NoGravityMode.class)) {
|
||||
case ACTIVE:
|
||||
region.set(Flag.NO_GRAVITY, NoGravityMode.INACTIVE);
|
||||
return false;
|
||||
default:
|
||||
case INACTIVE:
|
||||
region.set(Flag.NO_GRAVITY, NoGravityMode.ACTIVE);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2024 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.region;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.flags.Flag;
|
||||
import de.steamwar.bausystem.region.flags.flagvalues.NoGravityMode;
|
||||
import de.steamwar.bausystem.utils.ScoreboardElement;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||
|
||||
@Linked
|
||||
public class NoGravityListener implements Listener, ScoreboardElement {
|
||||
|
||||
private static NoGravityMode getMode(Region region) {
|
||||
return region.getPlain(Flag.NO_GRAVITY, NoGravityMode.class);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onEntitySpawn(EntitySpawnEvent event) {
|
||||
if (event.getEntityType() == EntityType.PLAYER) return;
|
||||
if (getMode(Region.getRegion(event.getLocation())) == NoGravityMode.ACTIVE) {
|
||||
event.getEntity().setGravity(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ScoreboardGroup getGroup() {
|
||||
return ScoreboardGroup.REGION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int order() {
|
||||
return 4;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String get(Region region, Player p) {
|
||||
if (region.get(Flag.NO_GRAVITY) == Flag.NO_GRAVITY.getDefaultValue()) return null;
|
||||
return "§e" + BauSystem.MESSAGE.parse(Flag.NO_GRAVITY.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.NO_GRAVITY).getChatValue(), p);
|
||||
}
|
||||
}
|
@ -54,6 +54,13 @@ public class ProtectCommand extends SWCommand {
|
||||
}
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLDEDIT), "REGION_PROTECT_NO_PERMS");
|
||||
};
|
||||
}
|
||||
|
||||
private Region regionCheck(Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region.getFloorLevel() == 0) {
|
||||
|
@ -19,39 +19,31 @@
|
||||
|
||||
package de.steamwar.bausystem.features.region;
|
||||
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||
import com.sk89q.worldedit.function.operation.Operations;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.session.ClipboardHolder;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.util.SelectCommand;
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import de.steamwar.bausystem.region.Prototype;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.RegionUtils;
|
||||
import de.steamwar.bausystem.region.flags.Flag;
|
||||
import de.steamwar.bausystem.region.flags.flagvalues.ColorMode;
|
||||
import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
||||
import de.steamwar.bausystem.region.utils.RegionType;
|
||||
import de.steamwar.bausystem.shared.Pair;
|
||||
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
||||
import de.steamwar.bausystem.utils.PasteBuilder;
|
||||
import de.steamwar.bausystem.utils.WorldEditUtils;
|
||||
import de.steamwar.command.PreviousArguments;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.command.TypeMapper;
|
||||
import de.steamwar.command.TypeValidator;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.LinkedInstance;
|
||||
import de.steamwar.sql.SchematicNode;
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
@ -79,7 +71,7 @@ public class RegionCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "undo", description = "REGION_REGION_HELP_UNDO")
|
||||
public void undoCommand(@Validator Player p) {
|
||||
public void undoCommand(@Validator("WORLD_EDIT") Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) return;
|
||||
|
||||
@ -91,7 +83,7 @@ public class RegionCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "redo", description = "REGION_REGION_HELP_REDO")
|
||||
public void redoCommand(@Validator Player p) {
|
||||
public void redoCommand(@Validator("WORLD_EDIT") Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
@ -105,7 +97,7 @@ public class RegionCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "restore", description = "REGION_REGION_HELP_RESTORE")
|
||||
public void genericRestoreCommand(@Validator Player p) {
|
||||
public void genericRestoreCommand(@Validator("WORLD_EDIT") Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if(checkGlobalRegion(region, p)) return;
|
||||
|
||||
@ -122,7 +114,7 @@ public class RegionCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register(value = "restore", description = "REGION_REGION_HELP_RESTORE_SCHEMATIC")
|
||||
public void schematicRestoreCommand(@Validator Player p, SchematicNode node) {
|
||||
public void schematicRestoreCommand(@Validator("WORLD_EDIT") Player p, SchematicNode node) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) return;
|
||||
|
||||
@ -172,6 +164,36 @@ public class RegionCommand extends SWCommand {
|
||||
BauSystem.MESSAGE.send("REGION_REGION_TP_TEST_BLOCK", p);
|
||||
}
|
||||
|
||||
@Register(value = "changetype", description = "REGION_REGION_HELP_CHANGETYPE_INFO")
|
||||
@Register("type")
|
||||
public void changeTypeCommand(Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
}
|
||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGETYPE_INFO", p, region.getPrototype().getDisplayName());
|
||||
}
|
||||
|
||||
@Register(value = "changetype", description = "REGION_REGION_HELP_CHANGETYPE")
|
||||
@Register("type")
|
||||
public void changeTypeCommand(@Validator("WORLD") Player p, @Mapper("regionTypeMapper") String s) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
}
|
||||
Prototype prototype = Prototype.getByDisplayName(s);
|
||||
if (prototype == null) {
|
||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGETYPE_UNKNOWN", p);
|
||||
} else {
|
||||
if (region.setPrototype(prototype)) {
|
||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGETYPE_CHANGE", p, s);
|
||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGETYPE_CHANGE_UPDATE", p, BauSystem.MESSAGE.parse("REGION_REGION_CHANGETYPE_CHANGE_UPDATE_HOVER", p), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/reset"));
|
||||
} else {
|
||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGETYPE_INVALID", p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Register(value = "changeskin", description = "REGION_REGION_HELP_CHANGESKIN_INFO")
|
||||
@Register("skin")
|
||||
public void changeSkinCommand(Player p) {
|
||||
@ -188,7 +210,7 @@ public class RegionCommand extends SWCommand {
|
||||
|
||||
@Register(value = "changeskin", description = "REGION_REGION_HELP_CHANGESKIN")
|
||||
@Register("skin")
|
||||
public void changeSkinCommand(@Validator Player p, @Mapper("skinTypeMapper") String s) {
|
||||
public void changeSkinCommand(@Validator("WORLD") Player p, @Mapper("skinTypeMapper") String s) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
@ -205,106 +227,26 @@ public class RegionCommand extends SWCommand {
|
||||
}
|
||||
}
|
||||
|
||||
@Register(value = "copy", description = "REGION_REGION_HELP_COPY")
|
||||
public void copyCommand(@Validator Player p, @OptionalValue("") @StaticValue(value = {"", "-e", "-s"}, allowISE = true) int option) {
|
||||
@Mapper(value = "regionTypeMapper", local = true)
|
||||
private TypeMapper<String> regionTypeMapper() {
|
||||
return new TypeMapper<String>() {
|
||||
@Override
|
||||
public List<String> tabCompletes(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||
Player p = (Player) commandSender;
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
if (region.isGlobal()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
if (!region.hasType(RegionType.BUILD)) {
|
||||
BauSystem.MESSAGE.send("REGION_REGION_NO_BUILD", p);
|
||||
return;
|
||||
}
|
||||
if (region.getCopyPoint() == null) {
|
||||
BauSystem.MESSAGE.send("REGION_REGION_TP_UNKNOWN", p);
|
||||
return;
|
||||
return region.getPrototypes().stream().map(Prototype::getByName).map(Prototype::getDisplayName).map(c -> c.replace(' ', '_')).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
Point minPoint = region.getMinPoint(RegionType.BUILD, RegionExtensionType.NORMAL);
|
||||
Point maxPoint = region.getMaxPoint(RegionType.BUILD, RegionExtensionType.NORMAL);
|
||||
switch (option) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
minPoint = region.getMinPoint(RegionType.BUILD, RegionExtensionType.EXTENSION);
|
||||
maxPoint = region.getMaxPoint(RegionType.BUILD, RegionExtensionType.EXTENSION);
|
||||
break;
|
||||
case 2:
|
||||
Pair<Location, Location> selection = WorldEditUtils.getSelection(p);
|
||||
minPoint = Point.fromLocation(selection.getKey());
|
||||
maxPoint = Point.fromLocation(selection.getValue());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@Override
|
||||
public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||
return s.replace('_', ' ');
|
||||
}
|
||||
|
||||
Clipboard clipboard = FlatteningWrapper.impl.copy(minPoint, maxPoint, region.getCopyPoint());
|
||||
WorldEdit.getInstance()
|
||||
.getSessionManager()
|
||||
.get(BukkitAdapter.adapt(p))
|
||||
.setClipboard(new ClipboardHolder(clipboard));
|
||||
BauSystem.MESSAGE.send("REGION_REGION_COPY_DONE", p);
|
||||
};
|
||||
}
|
||||
|
||||
@Register(value = "paste", description = "REGION_REGION_HELP_PASTE")
|
||||
public void pasteCommand(@Validator Player p, @OptionalValue("") @StaticValue(value = {"", "-a", "-s", "-as", "-sa"}, allowISE = true) int options) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
}
|
||||
if (!region.hasType(RegionType.BUILD)) {
|
||||
BauSystem.MESSAGE.send("REGION_REGION_NO_BUILD", p);
|
||||
return;
|
||||
}
|
||||
if (region.getCopyPoint() == null) {
|
||||
BauSystem.MESSAGE.send("REGION_REGION_TP_UNKNOWN", p);
|
||||
return;
|
||||
}
|
||||
|
||||
ClipboardHolder clipboardHolder = WorldEdit.getInstance()
|
||||
.getSessionManager()
|
||||
.get(BukkitAdapter.adapt(p))
|
||||
.getClipboard();
|
||||
|
||||
boolean selectPasted = false;
|
||||
boolean ignoreAir = false;
|
||||
switch (options) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
ignoreAir = true;
|
||||
break;
|
||||
case 2:
|
||||
selectPasted = true;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
selectPasted = true;
|
||||
ignoreAir = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
try (EditSession e = WorldEditUtils.getEditSession(p)) {
|
||||
Operations.completeBlindly(clipboardHolder.createPaste(e).ignoreAirBlocks(ignoreAir).to(toBlockVector3(region.getCopyPoint())).build());
|
||||
WorldEditUtils.addToPlayer(p, e);
|
||||
|
||||
if (selectPasted) {
|
||||
Clipboard clipboard = clipboardHolder.getClipboards().get(0);
|
||||
BlockVector3 minPointSelection = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()).add(toBlockVector3(region.getCopyPoint()));
|
||||
BlockVector3 maxPointSelection = clipboard.getRegion().getMaximumPoint().subtract(clipboard.getOrigin()).add(toBlockVector3(region.getCopyPoint()));
|
||||
FlatteningWrapper.impl.setSelection(p, Point.fromBlockVector3(minPointSelection), Point.fromBlockVector3(maxPointSelection));
|
||||
}
|
||||
BauSystem.MESSAGE.send("REGION_REGION_PASTE_DONE", p);
|
||||
}
|
||||
}
|
||||
|
||||
private BlockVector3 toBlockVector3(Point point) {
|
||||
return BlockVector3.at(point.getX(), point.getY(), point.getZ());
|
||||
}
|
||||
|
||||
|
||||
@Mapper(value = "skinTypeMapper", local = true)
|
||||
private TypeMapper<String> skinTypeMapper() {
|
||||
return new TypeMapper<String>() {
|
||||
@ -324,4 +266,18 @@ public class RegionCommand extends SWCommand {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Validator(value = "WORLD", local = true)
|
||||
public TypeValidator<Player> worldValidator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), "REGION_REGION_NO_PERMS");
|
||||
};
|
||||
}
|
||||
|
||||
@Validator(value = "WORLD_EDIT", local = true)
|
||||
public TypeValidator<Player> worldEditValidator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLDEDIT), "REGION_REGION_NO_PERMS");
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -97,6 +97,13 @@ public class ResetCommand extends SWCommand {
|
||||
}
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), "REGION_RESET_NO_PERMS");
|
||||
};
|
||||
}
|
||||
|
||||
private Region regionCheck(Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (region == GlobalRegion.getInstance()) {
|
||||
|
@ -74,9 +74,6 @@ public class TNTCommand extends SWCommand {
|
||||
case ONLY_TB:
|
||||
requestedMessage = getTestblockEnableMessage();
|
||||
break;
|
||||
case ONLY_BUILD:
|
||||
requestedMessage = getBuildEnableMessage();
|
||||
break;
|
||||
}
|
||||
tntToggle(region, tntMode, requestedMessage);
|
||||
}
|
||||
@ -92,7 +89,6 @@ public class TNTCommand extends SWCommand {
|
||||
Map<String, TNTMode> tntModeMap = new HashMap<>(tntModeMapReduced);
|
||||
tntModeMap.put("testblock", TNTMode.ONLY_TB);
|
||||
tntModeMap.put("tb", TNTMode.ONLY_TB);
|
||||
tntModeMap.put("build", TNTMode.ONLY_BUILD);
|
||||
|
||||
return new TypeMapper<TNTMode>() {
|
||||
@Override
|
||||
@ -129,10 +125,6 @@ public class TNTCommand extends SWCommand {
|
||||
return "REGION_TNT_TB";
|
||||
}
|
||||
|
||||
private String getBuildEnableMessage() {
|
||||
return "REGION_TNT_BUILD";
|
||||
}
|
||||
|
||||
private void tntToggle(Region region, TNTMode requestedMode, String requestedMessage) {
|
||||
if (requestedMode != null && region.hasType(RegionType.TESTBLOCK) && region.hasType(RegionType.BUILD)) {
|
||||
region.set(Flag.TNT, requestedMode);
|
||||
@ -142,7 +134,6 @@ public class TNTCommand extends SWCommand {
|
||||
switch (region.getPlain(Flag.TNT, TNTMode.class)) {
|
||||
case ALLOW:
|
||||
case ONLY_TB:
|
||||
case ONLY_BUILD:
|
||||
region.set(Flag.TNT, TNTMode.DENY);
|
||||
RegionUtils.actionBar(region, getDisableMessage());
|
||||
break;
|
||||
@ -157,4 +148,11 @@ public class TNTCommand extends SWCommand {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), "REGION_TNT_NO_PERMS");
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -28,8 +28,12 @@ import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
||||
import de.steamwar.bausystem.region.utils.RegionType;
|
||||
import de.steamwar.bausystem.utils.ScoreboardElement;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.LinkedInstance;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
@ -43,30 +47,23 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
public class TNTListener implements Listener, ScoreboardElement {
|
||||
|
||||
private void explode(List<Block> blockList) {
|
||||
AtomicBoolean inBuild = new AtomicBoolean();
|
||||
blockList.removeIf(block -> {
|
||||
Region region = Region.getRegion(block.getLocation());
|
||||
TNTMode value = region.getPlain(Flag.TNT);
|
||||
if (value == TNTMode.ALLOW) {
|
||||
return false;
|
||||
} else if (value == TNTMode.ONLY_TB) {
|
||||
}
|
||||
if (region.hasType(RegionType.BUILD) && region.inRegion(block.getLocation(), RegionType.BUILD, RegionExtensionType.NORMAL)) {
|
||||
RegionUtils.actionBar(region, "REGION_TNT_BUILD_DESTROY");
|
||||
RegionUtils.actionBar(region, "REGION_TNT_BUILD");
|
||||
inBuild.set(true);
|
||||
return true;
|
||||
}
|
||||
if (region.hasType(RegionType.BUILD) && region.inRegion(block.getLocation(), RegionType.BUILD, RegionExtensionType.EXTENSION)) {
|
||||
RegionUtils.actionBar(region, "REGION_TNT_BUILD_DESTROY");
|
||||
RegionUtils.actionBar(region, "REGION_TNT_BUILD");
|
||||
inBuild.set(true);
|
||||
return true;
|
||||
}
|
||||
} else if (value == TNTMode.ONLY_BUILD) {
|
||||
if (region.hasType(RegionType.TESTBLOCK) && region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.NORMAL)) {
|
||||
RegionUtils.actionBar(region, "REGION_TNT_TB_DESTROY");
|
||||
return true;
|
||||
}
|
||||
if (region.hasType(RegionType.TESTBLOCK) && region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) {
|
||||
RegionUtils.actionBar(region, "REGION_TNT_TB_DESTROY");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return value == TNTMode.DENY;
|
||||
});
|
||||
}
|
||||
|
@ -157,6 +157,11 @@ public class TestblockCommand extends SWCommand {
|
||||
};
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), "REGION_TB_NO_PERMS");
|
||||
}
|
||||
|
||||
private Region regionCheck(Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (!region.hasType(RegionType.TESTBLOCK)) {
|
||||
@ -187,12 +192,44 @@ public class TestblockCommand extends SWCommand {
|
||||
};
|
||||
}
|
||||
|
||||
public static class TestblockParameter {
|
||||
private boolean water = false;
|
||||
private boolean tnt = false;
|
||||
private boolean extension = false;
|
||||
private boolean onlyColor = false;
|
||||
|
||||
private boolean ignoreAir = false;
|
||||
|
||||
public void enableWater() {
|
||||
this.water = true;
|
||||
}
|
||||
|
||||
public void enableTNT() {
|
||||
this.tnt = true;
|
||||
}
|
||||
|
||||
public void enableExtension() {
|
||||
this.extension = true;
|
||||
}
|
||||
|
||||
public void enableOnlyColor() {
|
||||
this.onlyColor = true;
|
||||
}
|
||||
|
||||
public void enableIgnoreAir() {
|
||||
this.ignoreAir = true;
|
||||
}
|
||||
}
|
||||
|
||||
public enum TestblockParameterType {
|
||||
EXTENSION(Arrays.asList("-e", "-extension")),
|
||||
TNT(Arrays.asList("-t", "-tnt")),
|
||||
WATER(Arrays.asList("-w", "-water")),
|
||||
IGNORE_AIR(Arrays.asList("-ig", "-ignore_air")),
|
||||
ONLY_COLOR(Arrays.asList("-o", "-color", "-only_color"));
|
||||
EXTENSION(TestblockParameter::enableExtension, Arrays.asList("-e", "-extension")),
|
||||
TNT(TestblockParameter::enableTNT, Arrays.asList("-t", "-tnt")),
|
||||
WATER(TestblockParameter::enableWater, Arrays.asList("-w", "-water")),
|
||||
IGNORE_AIR(TestblockParameter::enableIgnoreAir, Arrays.asList("-ig", "-ignore_air")),
|
||||
ONLY_COLOR(TestblockParameter::enableOnlyColor, Arrays.asList("-o", "-color", "-only_color"));
|
||||
|
||||
@Getter
|
||||
private final Consumer<TestblockParameter> testblockParameterConsumer;
|
||||
|
||||
@Getter
|
||||
private List<String> tabCompletes;
|
||||
@ -201,7 +238,8 @@ public class TestblockCommand extends SWCommand {
|
||||
private final Supplier<TestblockParameterType[]> removed;
|
||||
private AtomicReference<TestblockParameterType[]> cached = new AtomicReference<>();
|
||||
|
||||
TestblockParameterType(List<String> tabCompletes, String... removed) {
|
||||
TestblockParameterType(Consumer<TestblockParameter> testblockParameterConsumer, List<String> tabCompletes, String... removed) {
|
||||
this.testblockParameterConsumer = testblockParameterConsumer;
|
||||
this.tabCompletes = tabCompletes;
|
||||
this.removed = () -> {
|
||||
if (cached.get() == null) {
|
||||
|
@ -57,6 +57,6 @@ public class FireBauGuiItem extends BauGuiItem {
|
||||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.BUILD;
|
||||
return Permission.WORLD;
|
||||
}
|
||||
}
|
||||
|
@ -57,6 +57,6 @@ public class FreezeBauGuiItem extends BauGuiItem {
|
||||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.BUILD;
|
||||
return Permission.WORLD;
|
||||
}
|
||||
}
|
||||
|
Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen
In neuem Issue referenzieren
Einen Benutzer sperren