Commits vergleichen
350 Commits
Autor | SHA1 | Datum | |
---|---|---|---|
593113bbc3 | |||
|
a62c08b097 | ||
442ba6f483 | |||
|
e253e12994 | ||
|
38bb687c5b | ||
|
30ddf671ae | ||
|
2829706d6b | ||
|
ab6c762323 | ||
|
d5acfa3f5c | ||
|
3370e211f9 | ||
|
29c7732166 | ||
ec3a8a1421 | |||
|
f054710a95 | ||
67f6363852 | |||
7182635558 | |||
|
7d01ebf4ed | ||
|
595c45bb54 | ||
45a61e554f | |||
|
a43e141340 | ||
4a334d8693 | |||
|
6a6833a0e0 | ||
daedbb26a7 | |||
|
d5ab11addd | ||
aa22ccf5b4 | |||
|
723b86b955 | ||
|
a116f7e4b1 | ||
680f9d8b3f | |||
|
00dcb10451 | ||
c815cd52fb | |||
|
ddb701cbd6 | ||
929400b4d9 | |||
|
e9ff8a7dc5 | ||
|
a36bae3a8d | ||
|
7502270b96 | ||
|
0c91261d55 | ||
|
add259788d | ||
|
4568ceee36 | ||
106a13bd13 | |||
|
2aec97304d | ||
|
7fa31704f4 | ||
|
95132a17d3 | ||
|
e08e53a554 | ||
5ab6b8832b | |||
|
2861a4e19b | ||
|
18430e13fe | ||
|
e8eeeb729a | ||
792b089e4f | |||
|
b602fb06d0 | ||
18769a6931 | |||
|
f1b3b27c14 | ||
|
fd17b8315f | ||
2ed6008aea | |||
|
a5b90be2db | ||
|
c278b1cfe1 | ||
|
486d04dd66 | ||
f1d929e33b | |||
6f6b61b310 | |||
|
f50d887da5 | ||
|
5d2886c0a5 | ||
|
9d96d5a2a8 | ||
|
07cd605d2c | ||
aeb5ebfc12 | |||
|
7e96d1c846 | ||
|
5595f3177c | ||
|
e931d7157e | ||
|
b64e06479f | ||
|
86cf7e8ca5 | ||
|
69b629d72e | ||
|
143ba020ed | ||
|
d0a08bc331 | ||
|
d81fb4e020 | ||
|
7ddfcb83ec | ||
|
09aa662171 | ||
|
56a72b1e83 | ||
|
295eb82fe9 | ||
|
f7727eb01c | ||
|
4e56760eea | ||
|
f69cbd2724 | ||
|
0d09db2284 | ||
|
47772ad23d | ||
|
83e5324986 | ||
|
8512a7bec5 | ||
|
35988bfcd3 | ||
|
67a34ee5ca | ||
|
5af9cfcaad | ||
|
8b07e93a70 | ||
|
4d9aacfc3e | ||
|
6a3f3f8b0a | ||
|
4e6755033a | ||
|
4422c249dc | ||
|
1a3850600c | ||
|
33d687b216 | ||
|
2eab79cf69 | ||
|
1bcf415186 | ||
|
27dc30619b | ||
|
17a8389703 | ||
|
d170e96542 | ||
|
356b14d49c | ||
|
7a9a2283a9 | ||
|
d5d8c52862 | ||
|
163967483f | ||
|
ed799b2937 | ||
|
d13c415565 | ||
|
39d2205b85 | ||
|
c4296a3781 | ||
|
31e0a0172f | ||
|
bcdad382c7 | ||
|
597c968463 | ||
|
43a04a68bf | ||
|
80967ab4e7 | ||
|
e06d612a0e | ||
|
224127eac6 | ||
|
1aa63255e7 | ||
|
7f4834412d | ||
|
e01ac8ac58 | ||
|
7ece12de47 | ||
|
af19931946 | ||
|
b8e79f9c55 | ||
|
c7b8b5d2da | ||
|
41d4ce2472 | ||
|
4ed5f40fed | ||
|
a6867cb4f9 | ||
|
7cd61fd9a4 | ||
|
3f9f3341a3 | ||
|
e7438029b0 | ||
3755395eab | |||
|
e64c50b566 | ||
|
207826ae8a | ||
9b70f2b365 | |||
|
ae470ffadd | ||
|
4a0cd6c51e | ||
|
3b53926195 | ||
|
687cb4451e | ||
|
41fab57e1a | ||
|
d8d049d5d9 | ||
|
e8db5d86c2 | ||
|
1fc9a43604 | ||
|
488866cee6 | ||
|
eefe92309d | ||
|
c369662a28 | ||
|
870578dcf9 | ||
|
987a00ae51 | ||
|
c0dcb99f7b | ||
|
d80e4cf3e0 | ||
|
2d7ae67335 | ||
|
be25b71cb8 | ||
|
a94f5747a0 | ||
|
5a59578a66 | ||
|
10a63f1876 | ||
|
5ec9fbb6e0 | ||
719b38f5af | |||
aa8d2bfcd0 | |||
|
cf329f4236 | ||
|
6abeed0b02 | ||
|
45cc3abd0a | ||
|
2cd3c3527e | ||
5a835acb80 | |||
5a991de55a | |||
|
827929382a | ||
|
1282f6066c | ||
|
8a78dcbc78 | ||
|
04b49fe827 | ||
|
8a3d8a9c33 | ||
|
dfd20f03b6 | ||
|
234f476672 | ||
|
b7cb909986 | ||
5b8d7bc28f | |||
|
f1db3c2047 | ||
|
2d5bedc63a | ||
|
8781da6a3d | ||
|
a91c352b15 | ||
|
f7481bfa0f | ||
|
2ccc7920d5 | ||
|
3ecd31e80c | ||
|
1da5b65460 | ||
|
1cbe614171 | ||
|
4620e83a82 | ||
|
6ec62d9720 | ||
|
335e2cc437 | ||
|
75edfc8375 | ||
|
ccf155d500 | ||
|
e4346a36e1 | ||
|
8aa0ee4d9d | ||
|
fccdcb2519 | ||
|
b47d85ebe9 | ||
|
0c37cfc3bb | ||
|
1094f4a979 | ||
|
c03fbb65e6 | ||
|
48175de8d8 | ||
|
eeb47f1d08 | ||
|
e71ccc3160 | ||
|
40f4af2a06 | ||
|
3c22840278 | ||
|
c621048014 | ||
|
1644b96886 | ||
|
f62d9e626b | ||
|
3a3c4819f9 | ||
|
5c96da9acd | ||
|
5a03623b14 | ||
|
f837b37b50 | ||
|
fd603f3c7f | ||
|
280b5b2613 | ||
|
7f62ad8005 | ||
|
d1196c6e4e | ||
|
009a1f3fa4 | ||
|
a05116a16c | ||
|
cc15781b44 | ||
|
8053796341 | ||
|
9466a8c981 | ||
|
338980f0d3 | ||
e4dc05ce02 | |||
|
de08488371 | ||
|
21e7bd89af | ||
|
953db69425 | ||
|
1d49a6981b | ||
d9dd64271e | |||
|
c2c686319d | ||
7ded9eefa4 | |||
|
b211f9cf79 | ||
|
2ba51e66e0 | ||
|
f83ba6ab96 | ||
|
b891c5adf1 | ||
|
78c0bc51b9 | ||
|
d1afb344d9 | ||
|
e77680d25a | ||
|
94bf2f3ae6 | ||
|
775d428671 | ||
|
ea5df6cee3 | ||
|
da1ea27f61 | ||
|
2bf0b0c6e8 | ||
85e6aab9e6 | |||
ad9b0aeab0 | |||
016a2a3469 | |||
c2bec98063 | |||
|
ada8fefd62 | ||
|
21aa22d75f | ||
|
a3f5098137 | ||
|
cdac4235f5 | ||
|
b166d8ff6b | ||
|
2c5a50bff3 | ||
|
beb49cdcd1 | ||
|
96b84a798b | ||
|
6e9693d838 | ||
|
2a55f607d3 | ||
|
0ac735c30f | ||
|
b00babdcbd | ||
|
f5e4d725fe | ||
|
ca8a916042 | ||
|
8da1fdac58 | ||
|
927ce1f495 | ||
|
0bf27db398 | ||
|
202e03c957 | ||
|
2cfed8b84d | ||
|
ec10b0fe71 | ||
|
bff63482ef | ||
|
4f266a30ab | ||
|
85512be3a8 | ||
|
67c9f66d13 | ||
|
f2a957c88f | ||
|
d1ff80b9dc | ||
|
41ed83dfe0 | ||
|
2bf3cfbb1d | ||
|
19bb7cc733 | ||
|
17c03f629a | ||
|
f6644d8ad8 | ||
|
4ff706e1ef | ||
|
3d0ebbe743 | ||
|
5556bd7875 | ||
|
5fe0079e30 | ||
|
006a0edef6 | ||
|
6305453e15 | ||
|
a61f1e2c8c | ||
|
78f7e42629 | ||
|
3dddb48d0c | ||
|
37e6628aaa | ||
|
bcb8b31ba9 | ||
|
832484c2a2 | ||
|
7802a03f48 | ||
|
20af36a4a2 | ||
|
0cec90c55c | ||
|
0b70bdfe97 | ||
|
ec93dfd8ec | ||
|
1a6c0de502 | ||
|
b73af3e2ec | ||
27627c3b41 | |||
4f592e754c | |||
|
52fcb69e1e | ||
|
a0ff726fb4 | ||
|
61282c0f84 | ||
|
1ed10c8c86 | ||
|
f94aeeda01 | ||
|
4c7f56be7c | ||
|
36e0c4c910 | ||
|
bdeb7da4c6 | ||
b58e418ea4 | |||
|
979428d493 | ||
|
84150aadd2 | ||
|
32fb859764 | ||
|
b886745113 | ||
|
27a542590c | ||
|
fdc201e99d | ||
|
06a68a7004 | ||
|
11fdd08f79 | ||
|
8fb4a4669a | ||
|
5686b6bc40 | ||
|
98455a29ce | ||
|
08839343c3 | ||
|
a0859923f0 | ||
|
b379f8457d | ||
|
402de21c47 | ||
|
c05724efda | ||
|
c050046820 | ||
|
b49c75d6bd | ||
|
61d1f0bd45 | ||
|
61f7218fc0 | ||
|
4ee93b59dd | ||
|
21ec66b4e2 | ||
|
20b116f228 | ||
|
d09c3548a7 | ||
|
c0551c0cf8 | ||
|
648482183a | ||
|
4e6ee3b95b | ||
|
3506083416 | ||
|
834039c4d4 | ||
|
327dded73b | ||
|
933e4fe7d9 | ||
|
f6ee55c44f | ||
|
9ceb8b40ae | ||
|
647ef97bfb | ||
aef8edca07 | |||
|
b090b31503 | ||
|
e47cf80d60 | ||
4eb3a310a7 | |||
68f81c8c3e | |||
0f7c19da5a | |||
b5a81eb6db | |||
|
6e39f3e92a | ||
|
1b2d19c31d | ||
|
f067e55d1f | ||
|
273fba879e | ||
|
420cf4a5b8 | ||
|
148761fa63 | ||
|
fbe4f00ac0 | ||
|
7980f49dfa | ||
|
0f1a8f5531 | ||
|
077a9854a5 | ||
|
44f6d1c15d | ||
|
0be117c001 | ||
|
758c32e353 | ||
|
8f1cac6f1f |
8
.gitignore
vendored
8
.gitignore
vendored
|
@ -1,5 +1,7 @@
|
|||
# Package Files
|
||||
# Build files
|
||||
*.jar
|
||||
**/bin
|
||||
**/build
|
||||
|
||||
# Gradle
|
||||
.gradle
|
||||
|
@ -10,6 +12,10 @@ 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 = 1.8
|
||||
targetCompatibility = 1.8
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
/*
|
||||
* 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,6 +106,7 @@ 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)));
|
||||
|
@ -190,7 +191,7 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean backup(Point minPoint, Point maxPoint, File file) {
|
||||
public Clipboard copy(Point minPoint, Point maxPoint, Point copyPoint) {
|
||||
BukkitWorld bukkitWorld = new BukkitWorld(Bukkit.getWorlds().get(0));
|
||||
CuboidRegion region = new CuboidRegion(bukkitWorld, toBlockVector3(minPoint), toBlockVector3(maxPoint));
|
||||
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
|
||||
|
@ -203,12 +204,21 @@ 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 (WorldEditException | IOException e) {
|
||||
} catch (IOException e) {
|
||||
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||
return false;
|
||||
}
|
||||
|
|
23
BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java
Normale Datei
23
BauSystem_15/src/de/steamwar/bausystem/utils/TickListener15.java
Normale Datei
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
public class TickListener15 implements TickListener {
|
||||
}
|
|
@ -27,8 +27,8 @@ version '1.0'
|
|||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -27,8 +27,8 @@ version '1.0'
|
|||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
@ -51,6 +51,7 @@ 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'
|
||||
|
|
51
BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java
Normale Datei
51
BauSystem_19/src/de/steamwar/bausystem/utils/TickListener19.java
Normale Datei
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* 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 = 1.8
|
||||
targetCompatibility = 1.8
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
|
|
@ -27,8 +27,8 @@ version '1.0'
|
|||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
|
||||
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.ELEMENTS.add(" + s + ");");
|
||||
methodBuilder.addLine("BauScoreboard.addElement(" + s + ");");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,8 +27,8 @@ version '1.0'
|
|||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
sourceCompatibility = 17
|
||||
targetCompatibility = 17
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
|
|
@ -16,17 +16,17 @@
|
|||
# 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/>.
|
||||
#
|
||||
|
||||
PREFIX=§eBau§8System§8»
|
||||
TIME=HH:mm:ss
|
||||
DATE=........
|
||||
COMMAND_HELP_HEAD=§7---=== (§e{0}§7) ===---
|
||||
ONLY_SCHEMS=§cFolders are unselectable
|
||||
|
||||
PAGE_LIST=§e Page ({0}/{1}) »»
|
||||
LIST_PREVIOUS_PAGE=§ePrevious page
|
||||
LIST_NEXT_PAGE=§eNext page
|
||||
|
||||
# Permissions
|
||||
NO_PERMISSION=You are not allowed to use that here
|
||||
SPECTATOR=§fSpectator
|
||||
# Scoreboard
|
||||
SCOREBOARD_TIME=Time
|
||||
SCOREBOARD_REGION=Region
|
||||
|
@ -34,12 +34,13 @@ SCOREBOARD_TRACE = Trace
|
|||
SCOREBOARD_LOADER=Loader
|
||||
SCOREBOARD_TPS=TPS
|
||||
SCOREBOARD_TPS_FROZEN=§eFrozen
|
||||
|
||||
SCOREBOARD_TRACE_TICKS=Ticks
|
||||
|
||||
SCOREBOARD_TECHHIDER=TechHider§8: §aOn
|
||||
SCOREBOARD_XRAY=XRay§8: §aOn
|
||||
|
||||
SCOREBOARD_LOCK_TEAM=Bau Lock§8: §eTeam
|
||||
SCOREBOARD_LOCK_TEAM_AND_SERVERTEAM=Bau Lock§8: §e(Server) Team
|
||||
SCOREBOARD_LOCK_SERVERTEAM=Bau Lock§8: §eServer Team
|
||||
SCOREBOARD_LOCK_NOBODY=Bau Lock§8: §cNobody
|
||||
# Flags
|
||||
FLAG_COLOR=Color
|
||||
FLAG_TNT=TNT
|
||||
|
@ -47,24 +48,20 @@ FLAG_FIRE = Fire
|
|||
FLAG_FREEZE=Freeze
|
||||
FLAG_PROTECT=Protect
|
||||
FLAG_ITEMS=Items
|
||||
|
||||
FLAG_TESTBLOCK=Testblock
|
||||
FLAG_CHANGED=Changed
|
||||
FLAG_FIRE_ALLOW=§con
|
||||
FLAG_FIRE_DENY=§aoff
|
||||
|
||||
FLAG_FREEZE_ACTIVE=§aon
|
||||
FLAG_FREEZE_INACTIVE=§coff
|
||||
|
||||
FLAG_PROTECT_ACTIVE=§aon
|
||||
FLAG_PROTECT_INACTIVE=§coff
|
||||
|
||||
FLAG_TNT_ALLOW=§aon
|
||||
FLAG_TNT_DENY=§coff
|
||||
FLAG_TNT_ONLY_TB=§7no §ebuild area
|
||||
FLAG_TNT_ONLY_BUILD=§7no §etestblock area
|
||||
|
||||
FLAG_ITEMS_ACTIVE=§aon
|
||||
FLAG_ITEMS_INACTIVE=§coff
|
||||
|
||||
FLAG_COLOR_WHITE=§fWhite
|
||||
FLAG_COLOR_ORANGE=§6Orange
|
||||
FLAG_COLOR_MAGENTA=§dMagenta
|
||||
|
@ -83,22 +80,23 @@ FLAG_COLOR_BROWN = §eBrown
|
|||
FLAG_COLOR_GREEN=§2Green
|
||||
FLAG_COLOR_RED=§cRed
|
||||
FLAG_COLOR_BLACK=§0Black
|
||||
|
||||
FLAG_TESTBLOCK_NO_VALUE=§eNo Value
|
||||
FLAG_TESTBLOCK_NORTH=§eNorth
|
||||
FLAG_TESTBLOCK_SOUTH=§eSouth
|
||||
FLAG_CHANGED_NO_CHANGE=§cNo
|
||||
FLAG_CHANGED_HAS_CHANGE=§aYes
|
||||
# Region
|
||||
REGION_TYPE_NORMAL=Normal
|
||||
REGION_TYPE_BUILD=Build area
|
||||
REGION_TYPE_ONLY_TB=Dummy
|
||||
|
||||
# AttributesCopy
|
||||
ATTRIBUTES_CANT_COPY=§cYou need to hold the same item type and hover over the same block to copy.
|
||||
ATTRIBUTES_NO_COPY=§cNo attributes to copy.
|
||||
ATTRIBUTES_COPIED=§eAttributes copied.
|
||||
|
||||
ATTRIBUTE_REMOVE_COMMAND_HELP=§8/§eattributeremove §8[§eattribute§8|§7all§8|§7*§8]
|
||||
ATTRIBUTE_REMOVE_ALL=§eAll attributes removed.
|
||||
ATTRIBUTE_REMOVE_SINGLE=§eAttribute §7{0}§e removed.
|
||||
ATTRIBUTE_REMOVE_NOT_FOUND=§cAttribute not found
|
||||
|
||||
# AutoStart
|
||||
AUTOSTART_COMMAND_HELP=§8/§etimer §8- §7Retrieve AutostartTimer Tool
|
||||
AUTOSTART_ITEM_NAME=§eAutostartTimer
|
||||
|
@ -109,14 +107,12 @@ AUTOSTART_MESSAGE_START = §eAutostartTimer started
|
|||
AUTOSTART_MESSAGE_RESULT1=§eTime §7until §eexplosion §7at enemy§8:§e {0}§7 game ticks
|
||||
AUTOSTART_MESSAGE_RESULT2=§7Time difference in §egame-ticks §7until {0} seconds§8:§e {1}
|
||||
AUTOSTART_MESSAGE_RESULT3=§7positive, if too few, negative if too many
|
||||
|
||||
# Backup
|
||||
BACKUP_HELP_CREATE=§8/§ebackup create §8- §7Create a region backup
|
||||
BACKUP_HELP_LOAD=§8/§ebackup load §8[§7BackupName§8] §8- §7Load a region backup
|
||||
BACKUP_HELP_LIST=§8/§ebackup list §8- §7List all region backups
|
||||
BACKUP_HELP_GUI=§8/§ebackup gui §8- §7Open the backup GUI
|
||||
BACKUP_REGION_NO_REGION=§cYou are not inside any region
|
||||
BACKUP_NO_PERMS=§You do not have permission to use the backup system
|
||||
BACKUP_CREATE_SUCCESS=§7Backup created
|
||||
BACKUP_CREATE_FAILURE=§cBackup failed
|
||||
BACKUP_CREATE_NO_CHANGE=§7No changes to save
|
||||
|
@ -127,15 +123,8 @@ BACKUP_LOAD=§7Backup loaded
|
|||
BACKUP_INV_NAME=§eBackup
|
||||
BACKUP_ITEM_NAME=§eBackup §7from §e{0}
|
||||
BACKUP_LORE=§eClick to load
|
||||
|
||||
# Bau
|
||||
BAU_COMMAND_HELP_INFO=§8/§ebau info §8- §7Alias for §8/§ebauinfo
|
||||
BAU_COMMAND_HELP_TOGGLEWE = §8/§ebau togglewe §8[§7Player§8] §8- §7Edit the WorldEdit permissions of a player
|
||||
BAU_COMMAND_HELP_TOGGLEWORLD = §8/§ebau toggleworld §8[§7Player§8] §8- §7Edit the World permissions of a player
|
||||
BAU_UNKNOWN_PLAYER = §cUnknown Player
|
||||
BAU_NO_PLAYER = §cThe player is no member of your world!
|
||||
BAU_NO_WORLD = §cThis is not your world!
|
||||
|
||||
BAU_INFO_ITEM_NAME=§eBau-Management
|
||||
## This is used in BauInfoBauGuiItem.java
|
||||
BAU_INFO_ITEM_LORE_TNT=§7TNT§8: §e{0}
|
||||
|
@ -144,18 +133,11 @@ BAU_INFO_ITEM_LORE_FIRE = §7Fire§8: §e{0}
|
|||
BAU_INFO_ITEM_LORE_COLOR=§7Color§8: §e{0}
|
||||
BAU_INFO_ITEM_LORE_PROTECT=§7Protect§8: §e{0}
|
||||
BAU_INFO_ITEM_LORE_ITEMS=§7Items§8: §e{0}
|
||||
|
||||
BAU_INFO_COMMAND_HELP=§8/§ebauinfo §8- §7Information regarding this build server
|
||||
BAU_INFO_COMMAND_OWNER=§7Owner§8: §e{0}
|
||||
BAU_INFO_COMMAND_MEMBER = §7Member §8[§7{0}§8]§8: §e
|
||||
BAU_INFO_MEMBER_INFO = §e{0}§8[{1}§8,{2}§8] §8
|
||||
BAU_INFO_MEMBER_WE_ALLOW = §aWE
|
||||
BAU_INFO_MEMBER_WE_DISALLOW = §cWE
|
||||
BAU_INFO_MEMBER_WORLD_ALLOW = §aW
|
||||
BAU_INFO_MEMBER_WORLD_DISALLOW = §cW
|
||||
BAU_INFO_COMMAND_MEMBER=§7{0} §8[§7{1}§8]§8: §e{2}
|
||||
BAU_INFO_COMMAND_FLAG=§7{0}§8: §7{1}
|
||||
BAU_INFO_COMMAND_TPS=§7TPS§8:§e
|
||||
|
||||
# Countingwand
|
||||
COUNTINGWAND_COMMAND_HELP=§8/§ecountingwand §8- §7Receive a CountingWand
|
||||
COUNTINGWAND_ITEM_NAME=§eMeterstick
|
||||
|
@ -165,13 +147,11 @@ COUNTINGWAND_MESSAGE_RCLICK = §7First position at: §8[§7{0}§8, §7{1}§8, §
|
|||
COUNTINGWAND_MESSAGE_LCLICK=§7Second position at: §8[§7{0}§8, §7{1}§8, §7{2}§8] ({3}§8) ({4}§8)
|
||||
COUNTINGWAND_MESSAGE_VOLUME=§e{0}
|
||||
COUNTINGWAND_MESSAGE_DIMENSION=§e{0}§8, §e{1}§8, §e{2}
|
||||
|
||||
# Design Endstone
|
||||
DESIGN_ENDSTONE_COMMAND_HELP=§8/§edesignendstone §8- §7Highlight endstone in design
|
||||
DESIGN_ENDSTONE_REGION_ERROR=§cThis region has no build area
|
||||
DESIGN_ENDSTONE_ENABLE=§aEndstone is highlighted
|
||||
DESIGN_ENDSTONE_DISABLE=§cEndstone is no longer hightlighted
|
||||
|
||||
# Detonator
|
||||
DETONATOR_LOC_REMOVE=§e{0} removed
|
||||
DETONATOR_LOC_ADD=§e{0} added
|
||||
|
@ -211,11 +191,6 @@ HOTBAR_INVENTORY=Standard hotbar
|
|||
# GUI
|
||||
GUI_EDITOR_ITEM_NAME=§eGui editor
|
||||
GUI_NAME=Bau GUI
|
||||
GUI_NO_PERMISSION=§cYou do not have enough permissions for this
|
||||
GUI_NO_OWNER=§cYou are not the owner of this World
|
||||
GUI_NO_WORLD=§cYou do not have permissions to change the World
|
||||
GUI_NO_WORLDEDIT=§cYou do not have permissions to use WorldEdit
|
||||
GUI_NO_MEMBER=§cYou need to be a member of this World
|
||||
GUI_ITEM_LORE1=§7Use this item to open the bau gui
|
||||
GUI_ITEM_LORE2=§7or press swap hands twice.
|
||||
GUI_EDITOR_TITLE=Bau GUI Editor
|
||||
|
@ -226,19 +201,16 @@ GUI_EDITOR_ITEM_TRASH_LORE=§7Drop item here
|
|||
GUI_EDITOR_ITEM_MORE=§eMore items
|
||||
GUI_EDITOR_ITEM_CLOSE=§eClose
|
||||
GUI_EDITOR_TITLE_MORE=Select item
|
||||
|
||||
# Script
|
||||
## Errors
|
||||
SCRIPT_ERROR_GUI=§cError in parsing script: Line {0}
|
||||
SCRIPT_ERROR_GLOBAL=§cError in global script: Line {0}
|
||||
SCRIPT_ERROR_CLICK=§cError in script: Line {0}
|
||||
SCRIPT_ERROR_ONLY_IN_GLOBAL=§cThis function is only available in global scripts
|
||||
|
||||
## CustomScript
|
||||
SCRIPT_HOTKEY_ITEM_NAME=§7Hotkey§8: §e{0}
|
||||
SCRIPT_EVENT_ITEM_NAME=§7Event§8: §e{0}
|
||||
SCRIPT_COMMAND_ITEM_NAME=§7Command§8: §e/{0}
|
||||
|
||||
## Script Menu GUI
|
||||
SCRIPT_MENU_GUI_ITEM_LORE_1=§7Click to retrieve
|
||||
SCRIPT_MENU_GUI_ITEM_LORE_2=§7Shift-Click to copy
|
||||
|
@ -247,10 +219,8 @@ SCRIPT_MENU_GUI_ITEM_LORE_4 = §7Middle-Click to preview
|
|||
SCRIPT_MENU_GUI_NAME=§eScript-Menu
|
||||
SCRIPT_MENU_GUI_ITEM_ADD_NAME=§eInsert
|
||||
SCRIPT_MENU_GUI_ITEM_ADD_LORE=§7Click with a book to insert
|
||||
|
||||
SCRIPT_MENU_GUI_ENTER_NAME=§eEnter a name
|
||||
SCRIPT_DEPRECATED=§cThe function §8\'§e{0}§8\'§c is deprecated and will be removed in the future. Please use §8\'§e{1}§8\'§c instead.
|
||||
|
||||
# Shield Printing
|
||||
SHIELD_PRINTING_HELP_START=§8/§eshieldprinting start §8- §7Starts the shield printing
|
||||
SHIELD_PRINTING_HELP_COPY=§8/§eshieldprinting copy §8- §7Copies the shield configuration
|
||||
|
@ -263,13 +233,10 @@ SHIELD_PRINTING_HELP_STEP_4 = §84. §7Edit the shields if necessary
|
|||
SHIELD_PRINTING_HELP_STEP_5=§85. §7Copy the shields printing with §8/§eshieldprinting copy
|
||||
SHIELD_PRINTING_HELP_STEP_6=§86. §7Paste the original schematic
|
||||
SHIELD_PRINTING_HELP_STEP_7=§87. §7Apply the shield printing with §8/§eshieldprinting apply
|
||||
|
||||
SHIELD_PRINTING_NO_REGION=§cYou are not in a region.
|
||||
SHIELD_PRINTING_NOT_RUNNING=§cThe shield printing is not running.
|
||||
SHIELD_PRINTING_DISALLOWED = §cYou are not allowed to use shield printing here.
|
||||
SHIELD_PRINTING_BOSSBAR=§fMovements: {0}
|
||||
SHIELD_PRINTING_BOSSBAR_COPIED=§fMovements: {0} Copied: {1}
|
||||
|
||||
SHIELD_PRINTING_GUI_NAME=§7Shield Printing
|
||||
SHIELD_PRINTING_GUI_APPLY=§aApply
|
||||
SHIELD_PRINTING_GUI_STATE_PREVIOUS=§7R-Click§8: §7Previous
|
||||
|
@ -287,15 +254,12 @@ SHIELD_PRINTING_GUI_STATE_OPENABLE = §7{0} §fOpened
|
|||
SHIELD_PRINTING_GUI_STATE_PISTON=§7{0} §fExtended
|
||||
SHIELD_PRINTING_GUI_STATE_POWERABLE=§7{0} §fPowered
|
||||
SHIELD_PRINTING_GUI_STATE_WALL=§7{0} §fWall Connections
|
||||
|
||||
SHIELD_PRINTING_START=§aThe shield printing has been started.
|
||||
SHIELD_PRINTING_COPY=§aThe shield has been copied.
|
||||
SHIELD_PRINTING_APPLY=§aThe shield has been applied.
|
||||
SHIELD_PRINTING_STOP=§aThe shield printing has been stopped.
|
||||
|
||||
# Unsign Book
|
||||
UNSIGN_HELP=§8/§eunsign §8- §7Make a signed book writable again
|
||||
|
||||
# Simulator
|
||||
SIMULATOR_HELP=§8/§esimulator §8-§7 Gives you the simulator wand
|
||||
SIMULATOR_CREATE_HELP=§8/§esimulator create §8[§7name§8] §8-§7 Create a new simulator
|
||||
|
@ -303,35 +267,29 @@ SIMULATOR_CHANGE_HELP = §8/§esimulator change §8-§7 Change your simulator wa
|
|||
SIMULATOR_DELETE_HELP=§8/§esimulator delete §8[§7name§8] §8-§7 Deletes the simulator
|
||||
SIMULATOR_START_HELP=§8/§esimulator start §8[§7name§8] §8-§7 Starts the simulator
|
||||
SIMULATOR_COPY_HELP=§8/§esimulator copy §8[§7to-copy§8] §8[§7name§8] §8-§7 Copy the simulator
|
||||
SIMULATOR_NO_PERMS = §cYou are not allowed to use the simulator here
|
||||
|
||||
SIMULATOR_GUI_ITEM_NAME=§eTNT Simulator
|
||||
|
||||
SIMULATOR_NO_SIM_IN_HAND=§cNo simulator item selected
|
||||
SIMULATOR_GUI_SELECT_SIM=Simulator selection
|
||||
SIMULATOR_GUI_CREATE_SIM=§eCreate simulator
|
||||
SIMULATOR_GUI_CREATE_SIM_GUI=Create simulator
|
||||
SIMULATOR_NAME_ALREADY_EXISTS=§cSimulator already exists
|
||||
SIMULATOR_NAME_INVALID=§cInvalid name
|
||||
SIMULATOR_ERROR_COPY=§cCopy failed
|
||||
SIMULATOR_NOT_EXISTS=§cSimulator does not exist
|
||||
SIMULATOR_CREATE=§aSimulator created
|
||||
SIMULATOR_EDIT_LOCATION=§7Edit position
|
||||
SIMULATOR_EDIT_PROPERTIES=§7Edit properties
|
||||
SIMULATOR_EDIT_OTHER=§7Edit other
|
||||
SIMULATOR_EDIT_GROUP=§7Edit group
|
||||
|
||||
SIMULATOR_EDIT_GROUP_MENU=§eEdit group
|
||||
|
||||
SIMULATOR_WAND_NAME=§eSimulator
|
||||
SIMULATOR_WAND_NAME_SELECTED=§7Simulator §8- §e{0}
|
||||
SIMULATOR_WAND_LORE_1=§eRight click §8- §7Adds a position
|
||||
SIMULATOR_WAND_LORE_2=§eSneaking §8- §7Free movement
|
||||
SIMULATOR_WAND_LORE_3=§eLeft click §8- §7Start the simulation
|
||||
SIMULATOR_WAND_LORE_4=§eRight click in air §8- §7Opens the gui
|
||||
SIMULATOR_WAND_LORE_5 = §eOffhand §8- §7Simulator preview
|
||||
|
||||
SIMULATOR_WAND_LORE_5=§eDouble Sneak §8- §7Swap between TNT and Redstone Block
|
||||
SIMULATOR_REGION_FROZEN=§cSimulator cannot be used inside frozen regions
|
||||
|
||||
## Other
|
||||
SIMULATOR_PLUS_ONE=§7+1
|
||||
SIMULATOR_PLUS_PIXEL_SHIFT=§eShift §7Click for §e+0,0625
|
||||
|
@ -343,11 +301,8 @@ SIMULATOR_POSITION_X = §7x-Position
|
|||
SIMULATOR_POSITION_Y=§7y-Position
|
||||
SIMULATOR_POSITION_Z=§7z-Position
|
||||
SIMULATOR_BACK=§eBack
|
||||
|
||||
SIMULATOR_GUI_TOTAL_TNT=§7Total TNT§8: §e{0}
|
||||
|
||||
SIMULATOR_DELETED=§cSimulator deleted
|
||||
|
||||
## GUI
|
||||
SIMULATOR_POSITION_EDIT=§eEdit position
|
||||
SIMULATOR_POSITION_ADD=§eSet position
|
||||
|
@ -371,15 +326,12 @@ SIMULATOR_GUI_NAME = Simulator
|
|||
SIMULATOR_GUI_DELETE=§cDelete TNT
|
||||
SIMULATOR_GUI_AUTO_TRACE=§eAutoTrace§8: §7{0}
|
||||
SIMULATOR_GUI_MOVE_ALL=§eMove all
|
||||
|
||||
SIMULATOR_ALIGNMENT_CENTER=§7Alignment§8: §eCenter
|
||||
SIMULATOR_ALIGNMENT_POSITIVE_X=§7Alignment§8: §ePositive X
|
||||
SIMULATOR_ALIGNMENT_NEGATIVE_X=§7Alignment§8: §eNegative X
|
||||
SIMULATOR_ALIGNMENT_POSITIVE_Z=§7Alignment§8: §ePositive Z
|
||||
SIMULATOR_ALIGNMENT_NEGATIVE_Z=§7Alignment§8: §eNegative Z
|
||||
|
||||
SIMULATOR_MOVE_ALL_GUI_NAME=Move TNT
|
||||
|
||||
SIMULATOR_TNT_SPAWN_GUI_NAME=Configure TNT {0}
|
||||
SIMULATOR_TNT_SPAWN_EDIT_LOCATION=- Location
|
||||
SIMULATOR_TNT_SPAWN_EDIT_PROPERTIES=- Properties
|
||||
|
@ -421,19 +373,16 @@ SIMULATOR_TNT_SPAWN_ADD_IGNITION_PHASE = §eAdd prime phase
|
|||
SIMULATOR_TNT_SPAWN_ADD_TNT=§eAdd TNT
|
||||
SIMULATOR_TNT_SPAWN_REMOVE_TNT=§cRemove
|
||||
SIMULATOR_TNT_SPAWN_POSITION_ANVIL_GUI_NAME=Position
|
||||
|
||||
# SmartPlace
|
||||
SMART_PLACE_HELP=§8/§esmartplace §8-§7 Toggles SmartPlace
|
||||
SMART_PLACE_INFO=§7Places rotatable blocks §eaway§7 from you when §esneaking§7.
|
||||
SMART_PLACE_ENABLE=§aSmartPlace activated
|
||||
SMART_PLACE_DISABLE=§cSmartPlace deactivated
|
||||
|
||||
# InventoryFiller
|
||||
INVENTORY_FILL_HELP=§8/§einventoryfill §8- §7Toggles InventoryFill
|
||||
INVENTORY_FILL_INFO=§7Helps you fill containers by looking at them while sneaking and dropping the item. Or just scroll on a container to change the amount of the item inside.
|
||||
INVENTORY_FILL_ENABLE=§aInventoryFiller activated
|
||||
INVENTORY_FILL_DISABLE=§cInventoryFiller deactivated
|
||||
|
||||
# Killchecker
|
||||
KILLCHECKER_HELP_ENABLE=§8/§ekillchecker enable §8- §7Enables Killchecker / Recalculates kills
|
||||
KILLCHECKER_HELP_DISABLE=§8/§ekillchecker disable §8- §7Disables Killchecker
|
||||
|
@ -442,7 +391,6 @@ KILLCHECKER_INFO2 = §7Only colorable blocks like Wool, Terractotta, Stained Gla
|
|||
KILLCHECKER_ENABLE=§aKillchecker activated
|
||||
KILLCHECKER_DISABLE=§cKillchecker deactivated
|
||||
KILLCHECKER_BOSSBAR=§e§l{0} §7(§e{1}%§7) §e§l{2}§7 cannons
|
||||
|
||||
# BlockCounter
|
||||
BLOCK_COUNTER_HELP_TOGGLE=§8/§eblockcounter §8- §7Toggle on/off
|
||||
BLOCK_COUNTER_HELP_ENABLE=§8/§eblockcounter enable §8- §7Toggles BlockCounter on
|
||||
|
@ -451,20 +399,17 @@ BLOCK_COUNTER_MESSAGE = §7Damage §8> §e{0} §7Blocks §e{1} §7TNT §e{2}
|
|||
BLOCK_COUNTER_MESSAGE_SECOND=§7Damage §8> §e{0} §7Blocks §e{1} §7TNT §e{2} §7Blocks/TNT §e{3} §7Blocks/s
|
||||
BLOCK_COUNTER_ENABLE=§7BlockCounter activated
|
||||
BLOCK_COUNTER_DISABLE=§7BlockCounter deactivated
|
||||
|
||||
# DepthCounter
|
||||
DEPTH_COUNTER_MESSAGE=§7Depth §8> §7
|
||||
DEPTH_COUNTER_COUNT={0}{1}§8×{2}{3}§8×{4}{5}
|
||||
DEPTH_COUNTER_HOVER=§7X§8ק7Y§8ק7Z
|
||||
DEPTH_COUNTER_TNT=§7 TNT§8: §e{0}
|
||||
|
||||
# TPSLimit
|
||||
TPSLIMIT_FREEZE_HELP=§8/§etpslimit 0 §8-§7 Freeze TPS
|
||||
TPSLIMIT_LIMIT_HELP=§8/§etpslimit §8[§720>x>0.5§8] §8-§7 Slow TPS down
|
||||
TPSLIMIT_WARP_HELP=§8/§etpslimit §8[§7x>20§8] §8-§7 Speed TPS up
|
||||
TPSLIMIT_DEFAULT_HELP=§8/§etpslimit default §8-§7 Set TPS to 20
|
||||
TPSLIMIT_HELP=§8/§etpslimit §8-§7 Show current TPS
|
||||
|
||||
TICK_FREEZE_HELP=§8/§etick rate 0 §8-§7 Freeze TPS
|
||||
TICK_FREEZE_HELP_2=§8/§etick freeze §8-§7 Freeze TPS
|
||||
TICK_UNFREEZE_HELP=§8/§etick unfreeze §8-§7 Set TPS to 20
|
||||
|
@ -472,56 +417,54 @@ TICK_LIMIT_HELP = §8/§etick rate §8[§720>x>0.5§8] §8-§7 Slow TPS down
|
|||
TICK_WARP_HELP=§8/§etick rate §8[§7x>20§8] §8-§7 Speed TPS up
|
||||
TICK_DEFAULT_HELP=§8/§etick rate default §8-§7 Set TPS to 20
|
||||
TICK_HELP=§8/§etick rate §8-§7 Show current TPS
|
||||
|
||||
TICK_STEPPING_HELP=§8/§etick step §8<§7Ticks§8> §8-§7 Step n ticks or 1 forward
|
||||
TICK_WARPING_HELP=§8/§etick warp §8<§7Ticks§8> §8<§7TPS§8> §8-§7 Warp n ticks or 1 forward
|
||||
|
||||
TICK_BOSSBAR=§7Skipped §e{0}§8/§7{1}
|
||||
TPSLIMIT_GUI_ITEM_NAME=§eTPS limiter
|
||||
TPSLIMIT_GUI_ITEM_LORE=§7Currently: §e{0}
|
||||
TPSLIMIT_ANVIL_GUI=New TPS limit
|
||||
TPSLIMIT_CURRENT=§7Current TPS limit§8: §e{0}
|
||||
TPSLIMIT_NO_PERMS = §cYou are not allowed to use the TPS-Limiter here
|
||||
TPSLIMIT_SET=§eSet TPS limit to {0}
|
||||
TPSLIMIT_FROZEN=§eTPS frozen
|
||||
|
||||
# Trace
|
||||
TRACE_RECORD=§aon
|
||||
TRACE_HAS_TRACES=§ehas Traces
|
||||
TRACE_IDLE_SINGLE=§esingle
|
||||
TRACE_IDLE_AUTO_IGNITE=§eauto
|
||||
TRACE_MESSAGE_AUTO_IDLE_IGNITE = §aAuto-Tracer ignite started
|
||||
TRACE_MESSAGE_AUTO_DELETE_INVALID = §cAuto delete cannot be used currently
|
||||
TRACE_MESSAGE_AUTO_DELETE_ALWAYS = §7Last Shot will §ealways §7be deleted
|
||||
TRACE_MESSAGE_AUTO_DELETE_NEVER = §7Last Shot will §enever §7be deleted
|
||||
TRACE_MESSAGE_AUTO_DELETE_NO_BUILD_DESTROY = §7Last Shot will be deleted if §eno build §7block was destroyed
|
||||
TRACE_MESSAGE_AUTO_DELETE_BUILD_DESTROY = §7Last Shot will be deleted if §ea build §7block was destroyed
|
||||
TRACE_MESSAGE_AUTO_DELETE_NO_TESTBLOCK_DESTROY = §7Last Shot will be deleted if §eno testblock §7block was destroyed
|
||||
TRACE_MESSAGE_AUTO_DELETE_TESTBLOCK_DESTROY = §7Last Shot will be deleted if §ea testlblock §7block was destroyed
|
||||
TRACE_IDLE_AUTO=§eauto
|
||||
TRACE_MESSAGE_START=§aTNT-Tracer started
|
||||
TRACE_MESSAGE_SINGLE = §aSingle-Tracer started
|
||||
TRACE_MESSAGE_AUTO_START=§eAuto TNT-Tracer started
|
||||
TRACE_MESSAGE_AUTO_STOP=§cAuto TNT-Tracer stopped
|
||||
TRACE_MESSAGE_STOP=§cTNT-Tracer stopped
|
||||
TRACE_MESSAGE_DELETE = §cAll TNT-positions deleted
|
||||
TRACE_MESSAGE_CLEAR=§cAll TNT-positions deleted
|
||||
TRACE_MESSAGE_DELETE=§cTrace TNT-positions deleted
|
||||
TRACE_MESSAGE_SHOW=§aAll TNT-positions shown
|
||||
TRACE_MESSAGE_HIDE=§cAll TNT-positions hidden
|
||||
TRACE_MESSAGE_DISALLOWED = §cYou are not allowed to use the TNT-Tracer here
|
||||
TRACE_MESSAGE_SHOW_AT = §aTNT-positions shown with {0} at {1}
|
||||
TRACE_MESSAGE_SHOW_FROM = §aAll TNT-positions shown with {0} from {1}
|
||||
TRACE_MESSAGE_SHOW_FROM_TO = §aAll TNT-positions shown with {0} from {1} to {2}
|
||||
TRACE_MESSAGE_SHOW_AT=§aTNT-positions shown at {0}
|
||||
TRACE_MESSAGE_SHOW_FROM=§aAll TNT-positions shown from {0}
|
||||
TRACE_MESSAGE_SHOW_FROM_TO=§aAll TNT-positions shown from {0} to {1}
|
||||
TRACE_MESSAGE_SHOW_TO_SMALLER=§cTo must be bigger then from
|
||||
|
||||
TRACE_MESSAGE_CLICK_ISOLATE=§eClick to §aisolate§8/§cunisolate
|
||||
TRACE_MESSAGE_ISOLATE=§eTNT Positions have been isolated
|
||||
TRACE_MESSAGE_BROADCAST=§e{0} shared his trace show state.
|
||||
TRACE_MESSAGE_BROADCAST_HOVER=§eClick to view
|
||||
TRACE_MESSAGE_FOLLOW=§aYou are now following {0} Trace show state
|
||||
TRACE_MESSAGE_FOLLOW_SELF=§cYou cannot follow yourself!
|
||||
TRACE_MESSAGE_UNFOLLOW=§cYou are no longer following a Trace show state
|
||||
TRACE_COMMAND_HELP_START=§8/§etrace start §8- §7Starts recording of all TNT-positions
|
||||
TRACE_COMMAND_HELP_SINGLE = §8/§etrace single §8- §7Starts a single recording of all TNT-positions
|
||||
TRACE_COMMAND_HELP_STOP=§8/§etrace stop §8- §7Stops the TNT-Tracer
|
||||
TRACE_COMMAND_HELP_AUTO=§8/§etrace toggleauto §8- §7Automatic start of recording
|
||||
TRACE_COMMAND_HELP_AUTO_REMOVE = §8/§etrace autoremove §8<§eParameter§8> §8- §7Remove last Trace Record automatically
|
||||
TRACE_COMMAND_HELP_SHOW=§8/§etrace show §8<§eParameter§8> - §7Shows all TNT-positions
|
||||
TRACE_COMMAND_HELP_SHOW_AT = §8/§etrace show §8(§etime§8|§7fuse§8) §7at §8<§eTIME§8> - §7Shows all Trace Positions at §8<§eTIME§8>
|
||||
TRACE_COMMAND_HELP_SHOW_FROM = §8/§etrace show §8(§etime§8|§7fuse§8) §7from §8<§eFROM§8> - §7Shows all Trace Positions from §8<§eFROM§8>
|
||||
TRACE_COMMAND_HELP_SHOW_FROM_TO = §8/§etrace show §8(§etime§8|§7fuse§8) §7from §8<§eFROM§8> §7to §8<§eTO§8> - §7Shows all Trace Positions from §8<§eFROM§8> to §8<§eTO§8>
|
||||
TRACE_COMMAND_HELP_SHOW_AT=§8/§etrace show §7at §8<§eTIME§8> - §7Shows all Trace Positions at §8<§eTIME§8>
|
||||
TRACE_COMMAND_HELP_SHOW_AT_WITH=§8/§etrace show §7at §8<§eTIME§8> §7with §8<§eParameter§8> - §7Shows all Trace Positions at §8<§eTIME§8>
|
||||
TRACE_COMMAND_HELP_SHOW_FROM=§8/§etrace show §7from §8<§eFROM§8> - §7Shows all Trace Positions from §8<§eFROM§8>
|
||||
TRACE_COMMAND_HELP_SHOW_FROM_WITH=§8/§etrace show §7from §8<§eFROM§8> §7with §8<§eParameter§8> - §7Shows all Trace Positions from §8<§eFROM§8>
|
||||
TRACE_COMMAND_HELP_SHOW_FROM_TO=§8/§etrace show §7from §8<§eFROM§8> §7to §8<§eTO§8> - §7Shows all Trace Positions from §8<§eFROM§8> to §8<§eTO§8>
|
||||
TRACE_COMMAND_HELP_SHOW_FROM_TO_WITH=§8/§etrace show §7from §8<§eFROM§8> §7to §8<§eTO§8> §7with §8<§eParameter§8> - §7Shows all Trace Positions from §8<§eFROM§8> to §8<§eTO§8>
|
||||
TRACE_COMMAND_HELP_HIDE=§8/§etrace hide §8- §7Hides all TNT-positions
|
||||
TRACE_COMMAND_HELP_DELETE = §8/§etrace delete §8- §7Deletes all TNT-positions
|
||||
|
||||
TRACE_COMMAND_HELP_DELETE=§8/§etrace delete §8[§eTrace§8] §8- §7Deletes all TNT-positions or a Trace
|
||||
TRACE_COMMAND_HELP_ISOLATE=§8/§etrace isolate §8[§eTrace§8] §8[§eTNT§8] §8- §7Isolates specific TNTs from the Trace
|
||||
TRACE_COMMAND_HELP_BROADCAST=§8/§etrace broadcast §8- §7Share your current Trace show state with others
|
||||
TRACE_COMMAND_HELP_FOLLOW=§8/§etrace follow §8[§ePlayer§8] §8- §7Follow a players Trace show state
|
||||
TRACE_COMMAND_HELP_UNFOLLOW=§8/§etrace unfollow §8- §7Unfollow the Trace show state
|
||||
TRACE_GUI_ITEM_NAME=§eTracer
|
||||
TRACE_GUI_ITEM_LORE=§7Status§8: {0}
|
||||
TRACE_GUI_NAME=Trace Gui
|
||||
|
@ -531,13 +474,12 @@ TRACE_GUI_TRACE_ACTIVE_AUTO = §eAuto-Trace is active
|
|||
TRACE_GUI_AUTO_TRACE_INACTIVE=§eacitvate Auto-Tracer
|
||||
TRACE_GUI_AUTO_TRACE_ACTIVE=§edeactivate Auto-Tracer
|
||||
TRACE_GUI_DELETE=§eDelete trace
|
||||
|
||||
# Loader
|
||||
LOADER_SETUP=§eSetup
|
||||
LOADER_RUNNING=§aRunning
|
||||
LOADER_PAUSE=§7Pause
|
||||
LOADER_END=§8Finished
|
||||
|
||||
LOADER_SINGLE=§aSingle
|
||||
LOADER_MESSAGE_INTERACT=§e{0} added {1}
|
||||
LOADER_MESSAGE_UNINTERACT=§eRemoved Element
|
||||
LOADER_BUTTON_TNT=TNT
|
||||
|
@ -555,10 +497,10 @@ LOADER_BUTTON_LECTERN=Lectern
|
|||
LOADER_BUTTON_TRAPDOOR=Trapdoor
|
||||
LOADER_BUTTON_DOOR=Door
|
||||
LOADER_BUTTON_FENCEGATE=Fencegate
|
||||
|
||||
LOADER_HELP_SETUP=§8/§eloader setup §8- §7Starts recording actions
|
||||
LOADER_SETUP_STOP_FIRST=§cPlease stop the current loader first!
|
||||
LOADER_HELP_START=§8/§eloader start §8- §7Playback of previously recorded action
|
||||
LOADER_HELP_START=§8/§eloader start §8- §7Playback of previously recorded actions
|
||||
LOADER_HELP_SINGLE=§8/§7loader single - §7Single playback of previously recoded actions
|
||||
LOADER_HELP_PAUSE=§8/§7loader pause §8- §7Pauses Loader
|
||||
LOADER_HELP_GUI=§8/§7loader gui §8- §7Shows Loader gui
|
||||
LOADER_HELP_STOP=§8/§eloader stop §8- §7Stops recording/playback
|
||||
|
@ -569,12 +511,11 @@ LOADER_NEW=§7Load your cannon and fire it once, to initialise the loader.
|
|||
LOADER_HOW_TO_START=§7Then, execute /§eloader start§7 to start the Loader
|
||||
LOADER_ACTIVE=§7The Loader is now active.
|
||||
LOADER_STOP=§7The Loader has been stopped.
|
||||
LOADER_SINGLE_CMD=§7The Loader does a single playback.
|
||||
LOADER_PAUSED=§7The Loader is now paused.
|
||||
LOADER_SMALL_TIME=§cThe wait time is too small
|
||||
LOADER_NEW_TIME=§7The wait time is now: {0}
|
||||
LOADER_NEW_LOAD_TIME=§7The action wait time is now: {0}
|
||||
LOADER_PERMS=§cYou are not allowed to use the Loader here
|
||||
|
||||
LOADER_NOTHING_RECORDED=§cYou have not recorded anything yet!
|
||||
LOADER_GUI_TITLE=Loader GUI
|
||||
LOADER_GUI_SHOW_ALL=Show all
|
||||
|
@ -591,7 +532,6 @@ LOADER_GUI_SETTINGS_COPY=§7Copy
|
|||
LOADER_GUI_SETTINGS_DELETE=§cDelete
|
||||
LOADER_GUI_WAIT_TITLE=Settings
|
||||
LOADER_GUI_WAIT_BACK=§8Back
|
||||
|
||||
LOADER_GUI_CLICK_TO_EDIT=§7Click to edit
|
||||
LOADER_GUI_ITEM_NAME=§7{0}§8: §e{1}
|
||||
LOADER_SETTING_NAME=§7{0}
|
||||
|
@ -626,7 +566,6 @@ LOADER_INTERACTION_OPEN=Open
|
|||
LOADER_INTERACTION_CLOSED=Closed
|
||||
LOADER_INTERACTION_COMPARE=Compare
|
||||
LOADER_INTERACTION_SUBTRACT=Subtract
|
||||
|
||||
# Loadtimer
|
||||
LOADTIMER_HELP_OVERVIEW=§7Compete with your friends loading your cannon and get information about the cannon
|
||||
LOADTIMER_HELP_START_1=§8/§eloadtimer start §8-§7 Starts the simple Loadtimer
|
||||
|
@ -656,7 +595,6 @@ LOADTIMER_SUMARY_TIMES_LAST=§7\\/
|
|||
LOADTIMER_SUMARY_STATS_HEAD=§7Cannon-Stats§8:
|
||||
LOADTIMER_SUMARY_STATS_TNT=§7TNT: §e{0}
|
||||
LOADTIMER_SUMARY_STATS_FREQ=§7Loading frequency: §e{0}/m§8, §7Shot frequency: §e{1}/m
|
||||
|
||||
# Observer
|
||||
OBSERVER_HELP=§7Right-Click an Observer to get the Trace. Flame particles have to be enabled. The Particles will be shown in the block.
|
||||
OBSERVER_HELP_ENABLE=§8/§eobserver enable §8-§7 Activates the Observer-Tracer
|
||||
|
@ -668,7 +606,6 @@ OBSERVER_DISABLE = §7Observer trace stopped
|
|||
OBSERVER_DELETE=§7Observer trace deleted
|
||||
OBSERVER_RETRACE_DONE=§7Observer trace retraced
|
||||
OBSERVER_RETRACE_NO_TRACE=§7No Observer trace to retrace
|
||||
|
||||
# Other
|
||||
OTHER_ITEMS_TELEPORT_NAME=§eTeleporter
|
||||
OTHER_ITEMS_TELEPORT_GUI_NAME=Teleport
|
||||
|
@ -690,10 +627,9 @@ OTHER_NOCLIP_SLOT_HELP_PICK = §8/§eslot pick §8-§7 Take the faced block into
|
|||
OTHER_NOCLIP_SLOT_HELP_DROP=§8/§eslot drop §8-§7 Clears your slot
|
||||
OTHER_CLEAR_HELP_SELF=§8/§eclear §8- §7Clears your inventory
|
||||
OTHER_CLEAR_HELP_PLAYER=§8/§eclear §8[§7Player§8] §8- §7Clears a player inventory
|
||||
OTHER_CLEAR_CLEARED=Your inventory was cleared.
|
||||
OTHER_CLEAR_FROM=Your invetnory was cleared by {0}.
|
||||
OTHER_CLEAR_TO=The inventory of {0} §7was cleared.
|
||||
OTHER_CLEAR_NO_PERMS=§cYou are not allowed to clear other's inventory here.
|
||||
OTHER_CLEAR_CLEARED=§7Your inventory was cleared.
|
||||
OTHER_CLEAR_FROM=§7Your invetnory was cleared by {0}.
|
||||
OTHER_CLEAR_TO=§7The inventory of {0} §7was cleared.
|
||||
OTHER_DECLUTTER_HELP=§8/§edeclutter §8- §7Organise your inventory
|
||||
OTHER_DECLUTTER_DONE=§aYour inventory was organised.
|
||||
OTHER_GAMEMODE_UNKNOWN=§cUnknown gamemode.
|
||||
|
@ -709,7 +645,6 @@ OTHER_TELEPORT_SELF_2=§cBlocks left to travel: 0; ETA: 0:00
|
|||
OTHER_TELEPORT_SELF_3=§cA little Movement is important.
|
||||
OTHER_TELEPORT_SELF_4=§cFor such a distance?
|
||||
OTHER_TIME_HELP=§8/§etime §8<§7Time 0=Morining§8, §76000=Midday§8, §718000=Midnight§8> - §7Sets the time on the Build
|
||||
OTHER_TIME_NO_PERM=§cYou are not allowed to change the time here
|
||||
OTHER_TIME_INVALID=§cPlease input a time between 0 and 24000
|
||||
OTHER_TIME_RESULT=§7§oWhooosh
|
||||
OTHER_TPS_HEAD=§7TPS: 1s 10s 1m 5m 10m
|
||||
|
@ -738,7 +673,6 @@ NIGHT_VISION_OFF=§eNightvision deactivated
|
|||
NIGHT_VISION_ON=§eNightvision activated
|
||||
NIGHT_VISION_ITEM_ON=§7Nightvision: §eActivated
|
||||
NIGHT_VISION_ITEM_OFF=§7Nightvision: §eDeactivated
|
||||
|
||||
#Navigation Wand
|
||||
NAVIGATION_WAND=§eNavigation Wand
|
||||
NAVIGATION_WAND_LEFT_CLICK=§eLeft click: jump to location
|
||||
|
@ -775,17 +709,6 @@ MATERIAL_FLAMMABLE=§8- §eFlammable block
|
|||
MATERIAL_BURNABLE=§8- §eBurnable block
|
||||
MATERIAL_WATERLOGGABLE=§8- §eWaterloggable block
|
||||
MATERIAL_UNMOVABLE=§8- §eUnmovable block
|
||||
# Redstonetester
|
||||
RT_HELP=§8/§eredstonetester §8-§7 Gives you the redstone tester
|
||||
RT_GIVEN=§7Measure the time between activation of components
|
||||
RT_ITEM_NAME=§eRedstonetester
|
||||
RT_ITEM_LORE_1=§eLeftclick block §8-§7 Sets the 1. Position
|
||||
RT_ITEM_LORE_2=§eRightclick block §8-§7 Sets the 2. Position
|
||||
RT_ITEM_LORE_3=§eShift-rightclick in air §8-§7 Reset
|
||||
RT_LOC=§8: §e{0} {1} {2}
|
||||
RT_INVALID_LOC=§cUnknown Position
|
||||
RT_RESULT=§7Difference§8: §e{0}§7 Ticks §8,§7 R-Ticks §e{1}
|
||||
RT_ACTIVATE=§7Positions deleted§8.
|
||||
# Region Items
|
||||
REGION_ITEM_COLOR=§7Color: §e{0}
|
||||
REGION_ITEM_COLOR_CHOOSE=Choose color
|
||||
|
@ -811,24 +734,18 @@ REGION_COLOR_HELP_COLOR=§8/§ecolor §8[§7Color§8] §8- §7Sets the color of
|
|||
REGION_COLOR_HELP_COLOR_TYPE=§8/§ecolor §8[§7Color§8] §8[§7Type§8] §8- §7Sets the color of the region or globally
|
||||
REGION_COLOR_GLOBAL=§7All regions color set to §e{0}
|
||||
REGION_COLOR_NO_REGION=§cYou are currently not in any region
|
||||
REGION_COLOR_NO_PERMS=§cThis is not your world!
|
||||
REGION_FIRE_HELP=§8/§efire §8- §7Toggle fire damage
|
||||
REGION_FIRE_NO_PERMS=§cYou are not allowed to toggle fire damage here
|
||||
REGION_FIRE_ENABLED=§cFire damage deactivated in this region
|
||||
REGION_FIRE_DISABLED=§aFire damage activated in this region
|
||||
REGION_FREEZE_HELP=§8/§efreeze §8- §7Toggle Freeze
|
||||
REGION_FREEZE_NO_PERMS=§cYou are not allowed to freeze this world
|
||||
REGION_FREEZE_ENABLED=§cRegion frozen
|
||||
REGION_FREEZE_DISABLED=§aRegion thawed
|
||||
REGION_ITEMS_HELP=§8/§eitems §8- §7Toggle Items
|
||||
REGION_ITEMS_NO_PERMS=§cYou are not allowed to toggle items in this world
|
||||
REGION_ITEMS_ENABLED=§aItems enabled in this region
|
||||
REGION_ITEMS_DISABLED_GLOBAL=§cItems disabled in this world
|
||||
REGION_ITEMS_DISABLED=§cItems disabled in this region
|
||||
REGION_PROTECT_HELP=§8/§eprotect §8- §7Protect the region
|
||||
REGION_PROTECT_DISABLE=§cProtection disabled
|
||||
REGION_PROTECT_ENABLE=§aProtection enabled
|
||||
REGION_PROTECT_NO_PERMS=§cYou are not allowed to protect the floor here
|
||||
REGION_PROTECT_FALSE_REGION=§cYou are not currently in a (M)WG-region
|
||||
REGION_REGION_HELP_UNDO=§8/§eregion undo §8- §7undo the last 20 /testblock or /reset
|
||||
REGION_REGION_HELP_REDO=§8/§eregion redo §8- §7redo the last 20 §8/§7rg undo
|
||||
|
@ -836,10 +753,10 @@ REGION_REGION_HELP_RESTORE=§8/§eregion restore §8- §7Resets the region, with
|
|||
REGION_REGION_HELP_RESTORE_SCHEMATIC=§8/§eregion restore §8[§7Schematic§8] §8- §7Resets the region, withoout removing your builds
|
||||
REGION_REGION_HELP_COPYPOINT=§8/§eregion copypoint §8- §7Teleport to the regions copy point
|
||||
REGION_REGION_HELP_TESTBLOCKPOINT=§8/§eregion testblockpoint §8- §7Teleport to the regions dummy point
|
||||
REGION_REGION_HELP_CHANGETYPE_INFO=§8/§eregion changetype §8- §7Returns the region type
|
||||
REGION_REGION_HELP_CHANGETYPE=§8/§eregion changetype §8[§7Type§8] §8- §8Sets the region type
|
||||
REGION_REGION_HELP_CHANGESKIN_INFO=§8/§eregion changeskin §8- §7Returns the region skin
|
||||
REGION_REGION_HELP_CHANGESKIN=§8/§eregion changeskin §8[§7Skin§8] §8- §8Sets the region skin
|
||||
REGION_REGION_HELP_COPY=§8/§eregion copy [-e] [-s] §8- §8Copy the build area optional with extensions or selection at the copypoint
|
||||
REGION_REGION_HELP_PASTE=§8/§eregion paste [-a] [-s] §8[§7Skin§8] §8- §8Pastes at the copypoint optional without air and selecting the pasted region
|
||||
REGION_REGION_NOTHING_UNDO=§cNothing left to undo
|
||||
REGION_REGION_UNDID=§7Last action undone
|
||||
REGION_REGION_NOTHING_REDO=§cNothing left to redo
|
||||
|
@ -853,13 +770,9 @@ REGION_REGION_TP_COPY=§7Teleported to the copy point
|
|||
REGION_REGION_TP_TEST_BLOCK=§7Teleported to the tesblock
|
||||
REGION_REGION_TP_UNKNOWN=§cUndefined teleport point
|
||||
REGION_REGION_NO_REGION=§cYou are not inside any region
|
||||
REGION_REGION_NO_PERMS=§cYou are not allowed to change the region
|
||||
REGION_REGION_CHANGETYPE_INFO=§7RRegion type is §e{0}
|
||||
REGION_REGION_CHANGETYPE_UNKNOWN=§cRegion type is invalid
|
||||
REGION_REGION_CHANGETYPE_INVALID=§cRegion type is not allowed here
|
||||
REGION_REGION_CHANGETYPE_CHANGE=§7Region type changed to §e{0}
|
||||
REGION_REGION_CHANGETYPE_CHANGE_UPDATE=§7Click §e§lHERE §7to change the region type
|
||||
REGION_REGION_CHANGETYPE_CHANGE_UPDATE_HOVER=§8/§ereset
|
||||
REGION_REGION_NO_BUILD=§cThis region has no build area
|
||||
REGION_REGION_COPY_DONE=§eBuild region or selection copied
|
||||
REGION_REGION_PASTE_DONE=§eBuild region or selection pasted
|
||||
REGION_REGION_CHANGESKIN_INFO=§7Region skin is §e{0}
|
||||
REGION_REGION_CHANGESKIN_INFO_CREATOR=§7Skin created by §e{0}
|
||||
REGION_REGION_CHANGESKIN_UNKNOWN=§cRegion skin is invalid
|
||||
|
@ -871,7 +784,6 @@ REGION_RESET_HELP_RESET=§8/§ereset §8- §7Resets the region
|
|||
REGION_RESET_HELP_SCHEMATIC=§8/§ereset §8[§7Schematic§8] §8- §7Resets the region using a schematic
|
||||
REGION_RESET_RESETED=§7Region reset
|
||||
REGION_RESET_ERROR=§cError reseting the region
|
||||
REGION_RESET_NO_PERMS=§cYou are not allowed to reset the region here
|
||||
REGION_RESET_NO_REGION=§cYou are currently not in any region
|
||||
REGION_TB_HELP_RESET=§8/§etestblock §8- §7Reset the dummy
|
||||
REGION_TB_HELP_RESET_EXTENSION=§8/§etestblock §8[§7ExtensionType§8] §8- §7Reset the dummy
|
||||
|
@ -879,7 +791,6 @@ REGION_TB_HELP_SCHEMATIC=§8/§etestblock §8[§7Schematic§8] §8- §7Reset the
|
|||
REGION_TB_HELP_SCHEMATIC_EXTENSION=§8/§etestblock §8[§7Schematic§8] §8[§7ExtensionType§8] §8- §7Reset the dummy using a schematic
|
||||
REGION_TB_DONE=§7Dummy reset
|
||||
REGION_TB_ERROR=§cError resetting the dummy
|
||||
REGION_TB_NO_PERMS=§cYou are not allowed to reset the dummy here
|
||||
REGION_TB_NO_REGION=§cYou are currently not in any region
|
||||
REGION_TB_NO_SCHEMSHARING=§cYou currently cannot share schematics until {0}.
|
||||
REGION_TB_NO_SCHEMRECEIVING=§cThe Owner of this build server cannot receive any schematics until {0}.
|
||||
|
@ -889,52 +800,42 @@ REGION_TNT_ON=§aTNT-Damage activated
|
|||
REGION_TNT_OFF=§cTNT-Damage deactivated
|
||||
REGION_TNT_TB=§aTNT-Damage activated outside the building area
|
||||
REGION_TNT_BUILD=§aTNT-Damage activated outside the testblok area
|
||||
REGION_TNT_NO_PERMS=§cYou are not allowed to toggle tnt damage here
|
||||
REGION_TNT_BUILD_DESTROY=§cAn explosion would have destroyed blocks in the building area
|
||||
REGION_TNT_TB_DESTROY=§cAn explosion would have destroyed blocks in the testblock area
|
||||
|
||||
AFK_KICK_MESSAGE=§cNothing happened on this server for 5 minutes.
|
||||
AFK_KICK_MESSAGE=§cNothing happened on this server for 15 minutes.
|
||||
AFK_WARNING_MESSAGE=§cThis server will stop in one minute if you remain inactive
|
||||
|
||||
SKIN_HELP=§8/§eskin §8[§7Shortform§8] §8[§7Creator§8|§epublic§8] §8[§7Name...§8] §8- §7Creates the skin schematic. Use 'public' as creator to have no creator, then copy the message to YoyoNow by clicking
|
||||
SKIN_NO_REGION=§7You are not in a region with a changealbe skin
|
||||
SKIN_ALREADY_EXISTS=§cThis skin already exists like this
|
||||
SKIN_MESSAGE=§7Skin created
|
||||
SKIN_MESSAGE_HOVER=§eClick to copy for YoyoNow and send
|
||||
|
||||
# Panzern
|
||||
PANZERN_HELP=§8/§epanzern §8[§7Block§8] §8[§7Slab§8] §8- §7Armor your WorldEdit selection
|
||||
PANZERN_PREPARE1=§71. Check, if barrels reach until border of armor.
|
||||
PANZERN_PREPARE2=§72. Carpet on the floor in walkways helps with armoring.
|
||||
PANZERN_PREPARE3=§73. Shieldtechnology should be encased.
|
||||
PANZERN_PREPARE4=§74. Standing in the region that is being armored can improve armoring.
|
||||
PANZERN_NO_PERM = §cYou are not allowed to use the armoring system here
|
||||
PANZERN_NO_WORLDEDIT=§cYou have no WorldEdit selcetion
|
||||
PANZERN_PROGRESS=§e{0} §7Blocks left, §e{1} §7Blocks per second, §e{2} §7block delta
|
||||
PANZERN_DONE=§aDone
|
||||
|
||||
# Laufbau
|
||||
LAUFBAU_HELP=§8/§elaufbau §8[§7smallest§8|§7blastresistant§8] §8- §7Build a barrel in your WorldEdit selection using the traces
|
||||
LAUFBAU_HELP_SETTINGS=§8/§elaufbau settings §8- §7Opens the settings GUI
|
||||
LAUFBAU_PREPARE1=§71. Trace the cannons as often as necessary, in all modes.
|
||||
LAUFBAU_PREPARE2=§72. Try to delete all fails from the traces.
|
||||
LAUFBAU_NO_PERM = §cYou are not allowed to use the barrel building system here
|
||||
LAUFBAU_NO_WORLDEDIT=§cYou don't have a WorldEdit selection
|
||||
LAUFBAU_STATE_FILTERING_TRACES=Filtering traces
|
||||
LAUFBAU_STATE_PROCESSING_TRACES=Connnecting traces
|
||||
LAUFBAU_STATE_CREATE_LAUF=Create Barrel
|
||||
LAUFBAU_SIMPLE_PROGRESS=§e{0}§8: §e{1}§8/§e{2} §7Time left§8: §e{3}
|
||||
LAUFBAU_DONE=§aDone
|
||||
|
||||
LAUFBAU_SETTINGS_GUI_NAME=§eLaufbau
|
||||
LAUFBAU_SETTINGS_ACTIVE=§aActive
|
||||
LAUFBAU_SETTINGS_INACTIVE=§cInactive
|
||||
LAUFBAU_SETTINGS_MIXED=§e{0}§8/§e{1} §aActive
|
||||
LAUFBAU_SETTINGS_GUI_BACK=§eBack
|
||||
|
||||
LAUFBAU_SETTINGS_TOGGLE=§eClick §8-§7 Toggle
|
||||
LAUFBAU_SETTINGS_ADVANCED=§eMiddle-Click §8-§7 Advanced settings
|
||||
|
||||
LAUFBAU_BLOCK_COBWEB=§eCobweb
|
||||
LAUFBAU_BLOCK_GRASS_PATH=§eGrass Path
|
||||
LAUFBAU_BLOCK_SOUL_SAND=§eSoul Sand
|
||||
|
@ -977,39 +878,31 @@ LAUFBAU_BLOCK_AZALEA = §eAzalea
|
|||
LAUFBAU_BLOCK_CANDLE=§eCandle
|
||||
LAUFBAU_BLOCK_CANDLE_CAKE=§eCake with Candle
|
||||
LAUFBAU_BLOCK_LECTERN=§eLectern
|
||||
|
||||
LAUFBAU_FACING_NORTH=§8-§7 Facing North
|
||||
LAUFBAU_FACING_SOUTH=§8-§7 Facing South
|
||||
LAUFBAU_FACING_WEST=§8-§7 Facing West
|
||||
LAUFBAU_FACING_EAST=§8-§7 Facing East
|
||||
LAUFBAU_FACING_UP=§8-§7 Facing Up
|
||||
LAUFBAU_FACING_DOWN=§8-§7 Facing Down
|
||||
|
||||
LAUFBAU_COUNT_1=§8-§7 Count 1
|
||||
LAUFBAU_COUNT_2=§8-§7 Count 2
|
||||
LAUFBAU_COUNT_3=§8-§7 Count 3
|
||||
LAUFBAU_COUNT_4=§8-§7 Count 4
|
||||
|
||||
LAUFBAU_LAYERS_8=§8-§7 Layers 8
|
||||
LAUFBAU_LAYERS_7=§8-§7 Layers 7
|
||||
LAUFBAU_LAYERS_6=§8-§7 Layers 6
|
||||
LAUFBAU_LAYERS_3=§8-§7 Layers 3
|
||||
LAUFBAU_LAYERS_2=§8-§7 Layers 2
|
||||
|
||||
LAUFBAU_TYPE_BOTTOM=§8-§7 Type bottom
|
||||
LAUFBAU_TYPE_TOP=§8-§7 Type top
|
||||
|
||||
LAUFBAU_HALF_BOTTOM=§8-§7 Half bottom
|
||||
LAUFBAU_HALF_TOP=§8-§7 Half top
|
||||
|
||||
LAUFBAU_OPEN=§8-§7 Opened
|
||||
|
||||
LAUFBAU_ATTACHMENT_CEILING=§8-§7 Attachment Ceiling
|
||||
LAUFBAU_ATTACHMENT_FLOOR=§8-§7 Attachment Floor
|
||||
LAUFBAU_ATTACHMENT_DOUBLE_WALL=§8-§7 Attachment double Wall
|
||||
LAUFBAU_ATTACHMENT_SINGLE_WALL=§8-§7 Attachment single Wall
|
||||
LAUFBAU_ATTACHMENT_WALL=§8-§7 Attachment Wall
|
||||
|
||||
LAUFBAU_CONNECTION_FLOOR=§8-§7 Connection Floor
|
||||
LAUFBAU_CONNECTION_NORTH=§8-§7 Connection North
|
||||
LAUFBAU_CONNECTION_SOUTH=§8-§7 Connection South
|
||||
|
@ -1017,29 +910,22 @@ LAUFBAU_CONNECTION_EAST = §8-§7 Connection East
|
|||
LAUFBAU_CONNECTION_WEST=§8-§7 Connection West
|
||||
LAUFBAU_CONNECTION_DOWN=§8-§7 Connection Bottom
|
||||
LAUFBAU_CONNECTION_UP=§8-§7 Connection Top
|
||||
|
||||
LAUFBAU_HANGING=§8-§7 hanging
|
||||
|
||||
LAUFBAU_SHAPE_STRAIGHT=§8-§7 Shape straight
|
||||
LAUFBAU_SHAPE_OUTER_LEFT=§8-§7 Shape outer links
|
||||
LAUFBAU_SHAPE_INNER_LEFT=§8-§7 Shape inner left
|
||||
|
||||
LAUFBAU_TILT_NONE=§8-§7 Tilt none
|
||||
LAUFBAU_TILT_PARTIAL=§8-§7 Tilt partial
|
||||
|
||||
# UTILS
|
||||
SELECT_HELP=§8/§eselect §8[§7RegionsTyp§8] §8- §7Select a region type
|
||||
SELECT_EXTENSION_HELP=§8/§eselect §8[§7RegionsTyp§8] §8[§7Extension§8] §8- §7Select a region type with or without extension
|
||||
SELECT_NO_PERMS = §cYou are not allowed to use the slection tool here
|
||||
SELECT_GLOBAL_REGION=§cThe global region cannot be selected
|
||||
SELECT_NO_TYPE=§cThis region has no {0}
|
||||
SELECT_NO_EXTENSION=§cThis region has no extension
|
||||
SELECT_MESSAGE=§7WorldEdit selection set to {0}, {1}, {2} and {3}, {4}, {5}
|
||||
|
||||
SKULL_HELP=§8/§eskull §8[§eplayer§8] §8-§7 Receive a player head
|
||||
SKULL_INVALID=§cInvalid player name
|
||||
SKULL_ITEM=§e{0}§8s Head
|
||||
|
||||
SPEED_HELP=§8/§espeed §8[§71§8-§710§8|§edefault§8] §8-§7 Set your flight and walking speed.
|
||||
SPEED_CURRENT=§7Current speed§8: §e{0}
|
||||
SPEED_TOO_SMALL=§c{0} is too small
|
||||
|
@ -1047,11 +933,9 @@ SPEED_TOO_HIGH = §c{0} is too big
|
|||
SPEED_ITEM=§eSpeed
|
||||
SPEED_ITEM_LORE=§7Currently: §e
|
||||
SPEED_TAB_NAME=Input speed
|
||||
|
||||
WORLDEDIT_WAND=WorldEdit Wand
|
||||
WORLDEDIT_LEFTCLICK=Left click: select pos #1
|
||||
WORLDEDIT_RIGHTCLICK=Right click: select pos #2
|
||||
|
||||
TNT_CLICK_HEADER=§8---=== §eTNT §8===---
|
||||
TNT_CLICK_ORDER=§eEntity Order§8: §e{0}
|
||||
TNT_CLICK_FUSE_TIME=§eFuseTime§8: §e{0}
|
||||
|
@ -1063,7 +947,6 @@ TNT_CLICK_VELOCITY_Y = §7Velocity §eY§8: §e{0}
|
|||
TNT_CLICK_VELOCITY_Z=§7Velocity §eZ§8: §e{0}
|
||||
TNT_CLICK_COUNT=§7Count §8: §e{0}
|
||||
TNT_CLICK_ISOLATE=§eIsolate
|
||||
|
||||
SELECT_ITEM_CHOOSE_EXTENSION=Choose extension
|
||||
SELECT_ITEM_CHOOSE_SELECTION=Choose selection
|
||||
SELECT_ITEM_NORMAL_EXTENSION=§eNormal
|
||||
|
@ -1074,17 +957,13 @@ SELECT_ITEM_RIGHT_CLICK=§7Right-Click to change
|
|||
SELECT_ITEM_BAURAHMEN=§eBuild area
|
||||
SELECT_ITEM_BAUPLATTFORM=§eBuild platform
|
||||
SELECT_ITEM_TESTBLOCK=§eDummy
|
||||
|
||||
CHESTFILLER_FILLED=§eChest filled
|
||||
CHESTFILLER_COUNT=§7{0}§8: §e§l{1}
|
||||
|
||||
PISTON_HELP_1=§7Right click on piston with a slime ball to calculate the moved blocks.
|
||||
PISTON_HELP_2=§7Count is red, if one unmoveable block is present.
|
||||
PISTON_HELP_3=§7Count is yellow, if too many blocks are present.
|
||||
PISTON_INFO=§7Moved Blocks {0}{1}§8/§712
|
||||
|
||||
# Warp
|
||||
WARP_DISALLOWED = §cYou are not allowed to use the warp here
|
||||
WARP_LOC_X=§7X§8: §e{0}
|
||||
WARP_LOC_Y=§7Y§8: §e{0}
|
||||
WARP_LOC_Z=§7Z§8: §e{0}
|
||||
|
@ -1099,7 +978,7 @@ WARP_GUI_NAME=Warps
|
|||
WARP_GUI_NO=§cNo warps exist
|
||||
WARP_GUI_DISTANCE=§7Distance: §e{0} §7blocks
|
||||
WARP_GUI_LCLICK=§7Left click to teleport
|
||||
WARP_GUI_RCLICK=§7Rickt click to edit
|
||||
WARP_GUI_RCLICK=§7Right click to edit
|
||||
WARP_INFO_NAME=§7Name: §e{0}
|
||||
WARP_HELP_ADD=§8/§ewarp add §8[§7name§8] §8- §7Create a new warp
|
||||
WARP_HELP_TELEPORT=§8/§ewarp §8[§7name§8] §8- §7Teleport to a warp
|
||||
|
@ -1107,33 +986,22 @@ WARP_HELP_INFO=§8/§ewarp info §8[§7name§8] §8- §7Information regarding on
|
|||
WARP_HELP_DELETE=§8/§ewarp delete §8[§7name§8] §8- §7Delete a warp
|
||||
WARP_HELP_GUI=§8/§ewarp gui §8- §7Open the Warp-GUI
|
||||
WARP_HELP_LIST=§8/§ewarp list §8- §7List all warps
|
||||
|
||||
# WORLD
|
||||
STOP_HELP=§8/§estop §8- §7Stops the server
|
||||
STOP_NO_PERMS = §cYou do not have the permission to stop the server
|
||||
STOP_MESSAGE=§eServer is stopping
|
||||
WORLD_EDIT_NO_PERMS = §cYou do not have the permission to use WorldEdit
|
||||
|
||||
KICKALL_HELP=§8/§ekickall §8- §7Kick all players from the server except the owner
|
||||
KICKALL_NO_PERM = §cThis is not your world!
|
||||
|
||||
# Techhider
|
||||
TECHHIDER_HELP=§8/§etechhider §8- §7Toggle Techhider
|
||||
TECHHIDER_GLOBAL=§cNo techhider in global region
|
||||
TECHHIDER_ON=§aTechhider activated
|
||||
TECHHIDER_OFF=§cTechhider deactivated
|
||||
|
||||
# XRAY
|
||||
XRAY_HELP=§8/§exray §8- §7Toggle Xray
|
||||
XRAY_GLOBAL=§cNo xray in global region
|
||||
XRAY_ON=§aXray activated
|
||||
XRAY_OFF=§cXray deactivated
|
||||
|
||||
|
||||
# WorldEdit
|
||||
COLORREPLACE_HELP=§8//§ecolorreplace §8[§7color§8] §8[§7color§8] §8- §7Replace all blocks of one color with another
|
||||
|
||||
TYPEREPLACE_HELP = §8//§etyreplace §8[§7type§8] §8[§7type§8] §8- §7Replace all blocks of one type with another
|
||||
|
||||
TYPEREPLACE_HELP=§8//§etypereplace §8[§7type§8] §8[§7type§8] §8- §7Replace all blocks of one type with another
|
||||
# Schematic
|
||||
SCHEMATIC_GUI_ITEM=§eSchematics
|
||||
|
|
|
@ -16,17 +16,17 @@
|
|||
# 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/>.
|
||||
#
|
||||
|
||||
PREFIX=§eBau§8System§8»
|
||||
TIME=HH:mm:ss
|
||||
DATE=........
|
||||
COMMAND_HELP_HEAD=§7---=== (§e{0}§7) ===---
|
||||
ONLY_SCHEMS=§cDu kannst hier keinen Ordner angeben
|
||||
|
||||
PAGE_LIST=§e Seite ({0}/{1}) »»
|
||||
LIST_PREVIOUS_PAGE=§eVorherige Seite
|
||||
LIST_NEXT_PAGE=§eNächste Seite
|
||||
|
||||
# Permission
|
||||
NO_PERMISSION=Du darfst dies hier nicht nutzen
|
||||
SPECTATOR=§fZuschauer
|
||||
# Scoreboard
|
||||
SCOREBOARD_TIME=Uhrzeit
|
||||
SCOREBOARD_REGION=Region
|
||||
|
@ -34,12 +34,13 @@ SCOREBOARD_TRACE = Trace
|
|||
SCOREBOARD_LOADER=Loader
|
||||
SCOREBOARD_TPS=TPS
|
||||
SCOREBOARD_TPS_FROZEN=§eEingefroren
|
||||
|
||||
SCOREBOARD_TRACE_TICKS=Ticks
|
||||
|
||||
SCOREBOARD_TECHHIDER=TechHider§8: §aAn
|
||||
SCOREBOARD_XRAY=XRay§8: §aAn
|
||||
|
||||
SCOREBOARD_LOCK_TEAM=Bau Lock§8: §eTeam
|
||||
SCOREBOARD_LOCK_TEAM_AND_SERVERTEAM=Bau Lock§8: §e(Server-) Team
|
||||
SCOREBOARD_LOCK_SERVERTEAM=Bau Lock§8: §eServerteam
|
||||
SCOREBOARD_LOCK_NOBODY=Bau Lock§8: §cNiemand
|
||||
# Flags
|
||||
FLAG_COLOR=Color
|
||||
FLAG_TNT=TNT
|
||||
|
@ -47,24 +48,18 @@ FLAG_FIRE = Fire
|
|||
FLAG_FREEZE=Freeze
|
||||
FLAG_PROTECT=Protect
|
||||
FLAG_ITEMS=Items
|
||||
|
||||
FLAG_FIRE_ALLOW=§can
|
||||
FLAG_FIRE_DENY=§aaus
|
||||
|
||||
FLAG_FREEZE_ACTIVE=§aan
|
||||
FLAG_FREEZE_INACTIVE=§caus
|
||||
|
||||
FLAG_PROTECT_ACTIVE=§aan
|
||||
FLAG_PROTECT_INACTIVE=§caus
|
||||
|
||||
FLAG_TNT_ALLOW=§aan
|
||||
FLAG_TNT_DENY=§caus
|
||||
FLAG_TNT_ONLY_TB=§7Kein §eBaurahmen
|
||||
FLAG_TNT_ONLY_BUILD=§7Kein §eTestblock
|
||||
|
||||
FLAG_ITEMS_ACTIVE=§aan
|
||||
FLAG_ITEMS_INACTIVE=§caus
|
||||
|
||||
FLAG_COLOR_WHITE=§fWeiß
|
||||
FLAG_COLOR_ORANGE=§6Orange
|
||||
FLAG_COLOR_MAGENTA=§dMagenta
|
||||
|
@ -83,21 +78,17 @@ FLAG_COLOR_BROWN = §eBraun
|
|||
FLAG_COLOR_GREEN=§2Grün
|
||||
FLAG_COLOR_RED=§cRot
|
||||
FLAG_COLOR_BLACK=§0Schwarz
|
||||
|
||||
# Region
|
||||
REGION_TYPE_NORMAL=Normal
|
||||
REGION_TYPE_BUILD=Baubereich
|
||||
REGION_TYPE_ONLY_TB=Testblock
|
||||
|
||||
# AttributesCopy
|
||||
ATTRIBUTES_CANT_COPY=§cDu musst den Item Type in der Hand halten wo du auch drauf guckst.
|
||||
ATTRIBUTES_NO_COPY=§cKeine Attribute kopiert.
|
||||
ATTRIBUTES_COPIED=§eAttribute kopiert.
|
||||
|
||||
ATTRIBUTE_REMOVE_ALL=§eAlle Attribute entfernt.
|
||||
ATTRIBUTE_REMOVE_SINGLE=§eAttribut §7{0}§e entfernt.
|
||||
ATTRIBUTE_REMOVE_NOT_FOUND=§cAttribut nicht gefunden
|
||||
|
||||
# AutoStart
|
||||
AUTOSTART_COMMAND_HELP=§8/§etimer §8- §7Legt den AutostartTimer ins Inventar
|
||||
AUTOSTART_ITEM_NAME=§eAutostartTimer
|
||||
|
@ -108,14 +99,12 @@ AUTOSTART_MESSAGE_START = §eAutostartTimer gestartet
|
|||
AUTOSTART_MESSAGE_RESULT1=§eZeit §7bis zur §eExplosion §7am Gegner§8:§e {0}§7 in game ticks
|
||||
AUTOSTART_MESSAGE_RESULT2=§7Zeitdifferenz in §egame ticks §7bis {0} Sekunden§8:§e {1}
|
||||
AUTOSTART_MESSAGE_RESULT3=§7Positiv, wenn zu wenig, negativ wenn zu viel
|
||||
|
||||
# Backup
|
||||
BACKUP_HELP_CREATE=§8/§ebackup create §8- §7Erstelle ein Backup der Region
|
||||
BACKUP_HELP_LOAD=§8/§ebackup load §8[§7BackupName§8] §8- §7 Lade ein Backup
|
||||
BACKUP_HELP_LIST=§8/§ebackup list §8- §7Liste alle Backups der Region auf
|
||||
BACKUP_HELP_GUI=§8/§ebackup gui §8- §7Öffne die Backups in einer GUI
|
||||
BACKUP_REGION_NO_REGION=§cDu bist in keiner Region
|
||||
BACKUP_NO_PERMS=§cDu darfst hier nicht das Backup System verwenden
|
||||
BACKUP_CREATE_SUCCESS=§7Das Backup wurde erstellt
|
||||
BACKUP_CREATE_FAILURE=§cDas Backup erstellen ist schiefgegangen
|
||||
BACKUP_CREATE_NO_CHANGE=§7Die Region hat keine Veränderung
|
||||
|
@ -126,15 +115,8 @@ BACKUP_LOAD=§7Backup geladen
|
|||
BACKUP_INV_NAME=§eBackup
|
||||
BACKUP_ITEM_NAME=§eBackup §7von §e{0}
|
||||
BACKUP_LORE=§eKlicken zum Laden
|
||||
|
||||
# Bau
|
||||
BAU_COMMAND_HELP_INFO=§8/§ebau info §8- §7Alias für §8/§ebauinfo
|
||||
BAU_COMMAND_HELP_TOGGLEWE = §8/§ebau togglewe §8[§7Player§8] §8- §7Editiere die WorldEdit Rechte eines Spielers
|
||||
BAU_COMMAND_HELP_TOGGLEWORLD = §8/§ebau toggleworld §8[§7Player§8] §8- §7Editiere die Welt Rechte eines Spielers
|
||||
BAU_UNKNOWN_PLAYER = §cUnbekannter Spieler
|
||||
BAU_NO_PLAYER = §cDer Spieler ist kein Mitglied deiner Welt!
|
||||
BAU_NO_WORLD = §cDies ist nicht deine Welt!
|
||||
|
||||
BAU_INFO_ITEM_NAME=§eBau-Management
|
||||
## This is used in BauInfoBauGuiItem.java
|
||||
BAU_INFO_ITEM_LORE_TNT=§7TNT§8: §e{0}
|
||||
|
@ -143,18 +125,11 @@ BAU_INFO_ITEM_LORE_DAMAGE = §7Damage§8: §e{0}
|
|||
BAU_INFO_ITEM_LORE_FIRE=§7Feuer§8: §e{0}
|
||||
BAU_INFO_ITEM_LORE_COLOR=§7Farbe§8: §e{0}
|
||||
BAU_INFO_ITEM_LORE_PROTECT=§7Protect§8: §e{0}
|
||||
|
||||
BAU_INFO_COMMAND_HELP=§8/§ebauinfo §8- §7Gibt Informationen über den Bau
|
||||
BAU_INFO_COMMAND_OWNER=§7Besitzer§8: §e{0}
|
||||
BAU_INFO_COMMAND_MEMBER = §7Mitglieder §8[§7{0}§8]§8: §e
|
||||
BAU_INFO_MEMBER_INFO = §e{0}§8[{1}§8,{2}§8] §8
|
||||
BAU_INFO_MEMBER_WE_ALLOW = §aWE
|
||||
BAU_INFO_MEMBER_WE_DISALLOW = §cWE
|
||||
BAU_INFO_MEMBER_WORLD_ALLOW = §aW
|
||||
BAU_INFO_MEMBER_WORLD_DISALLOW = §cW
|
||||
BAU_INFO_COMMAND_MEMBER=§7{0} §8[§7{1}§8]§8: §e{2}
|
||||
BAU_INFO_COMMAND_FLAG=§7{0}§8: §7{1}
|
||||
BAU_INFO_COMMAND_TPS=§7TPS§8:§e
|
||||
|
||||
# Countingwand
|
||||
COUNTINGWAND_COMMAND_HELP=§8/§ecountingwand §8- §7Gibt dir ein CountingWand
|
||||
COUNTINGWAND_ITEM_NAME=§eZollstock
|
||||
|
@ -164,13 +139,11 @@ COUNTINGWAND_MESSAGE_RCLICK = §7Erste Position bei: §8[§7{0}§8, §7{1}§8,
|
|||
COUNTINGWAND_MESSAGE_LCLICK=§7Zweite Position bei: §8[§7{0}§8, §7{1}§8, §7{2}§8] ({3}§8) ({4}§8)
|
||||
COUNTINGWAND_MESSAGE_VOLUME=§e{0}
|
||||
COUNTINGWAND_MESSAGE_DIMENSION=§e{0}§8, §e{1}§8, §e{2}
|
||||
|
||||
# Design Endstone
|
||||
DESIGN_ENDSTONE_COMMAND_HELP=§8/§edesign endstone §8- §7Zeige End Stone im Design
|
||||
DESIGN_ENDSTONE_REGION_ERROR=§cDiese Region hat keinen Baubereich
|
||||
DESIGN_ENDSTONE_ENABLE=§aEndstone im Design ist angezeigt
|
||||
DESIGN_ENDSTONE_DISABLE=§cEndstone im Design ist versteckt
|
||||
|
||||
# Detonator
|
||||
DETONATOR_LOC_REMOVE=§e{0} entfernt
|
||||
DETONATOR_LOC_ADD=§e{0} hinzugefügt
|
||||
|
@ -210,11 +183,6 @@ HOTBAR_INVENTORY=Standard Hotbar
|
|||
# GUI
|
||||
GUI_EDITOR_ITEM_NAME=§eGui Editor
|
||||
GUI_NAME=Bau GUI
|
||||
GUI_NO_PERMISSION=§cDu hast nicht genug Rechte um dies zu tun
|
||||
GUI_NO_OWNER=§cDas ist nicht deine Bauwelt
|
||||
GUI_NO_WORLD=§cDu darfst hier die Welt nicht einstellen
|
||||
GUI_NO_WORLDEDIT=§cDu darfst hier kein Worldedit benutzen
|
||||
GUI_NO_MEMBER=§cDu musst ein Member der Bauwelt sein
|
||||
GUI_ITEM_LORE1=§7Du kannst dieses Item zum Öffnen der BauGUI nutzen
|
||||
GUI_ITEM_LORE2=§7oder Doppel F (Swap hands) drücken.
|
||||
GUI_EDITOR_TITLE=Bau GUI Editor
|
||||
|
@ -225,14 +193,12 @@ GUI_EDITOR_ITEM_TRASH_LORE=§7Item hier rein Legen
|
|||
GUI_EDITOR_ITEM_MORE=§eMehr Items
|
||||
GUI_EDITOR_ITEM_CLOSE=§eSchließen
|
||||
GUI_EDITOR_TITLE_MORE=Item auswählen
|
||||
|
||||
# Script
|
||||
## CustomScript
|
||||
SCRIPT_HOTKEY_ITEM_NAME=§7Hotkey§8: §e{0}
|
||||
SCRIPT_EVENT_ITEM_NAME=§7Event§8: §e{0}
|
||||
SCRIPT_COMMAND_ITEM_NAME=§7Befehl§8: §e/{0}
|
||||
SCRIPT_ERROR_ONLY_IN_GLOBAL=§cDieses Skript kann nur als globales Skript ausgeführt werden
|
||||
|
||||
## Script Menu GUI
|
||||
SCRIPT_MENU_GUI_ITEM_LORE_1=§7Klicke zum rausnehmen
|
||||
SCRIPT_MENU_GUI_ITEM_LORE_2=§7Shiftklick zum kopieren
|
||||
|
@ -242,7 +208,6 @@ SCRIPT_MENU_GUI_NAME = §eSkript-Menü
|
|||
SCRIPT_MENU_GUI_ITEM_ADD_NAME=§eHinzufügen
|
||||
SCRIPT_MENU_GUI_ITEM_ADD_LORE=§7Klicke mit einem Buch zum hinzufügen
|
||||
SCRIPT_DEPRECATED=§cDie Funktion §e{0}§c ist veraltet und wird demnächst entfernt. Bitte benutze §e{1}§c.
|
||||
|
||||
# Shield Printing
|
||||
SHIELD_PRINTING_HELP_START=§8/§eshieldprinting start §8- §7Starte das Schild drucken
|
||||
SHIELD_PRINTING_HELP_COPY=§8/§eshieldprinting copy §8- §7Kopiert die Schilder
|
||||
|
@ -255,13 +220,10 @@ SHIELD_PRINTING_HELP_STEP_4 = §84. §7Editiere die Schilde wenn nötig
|
|||
SHIELD_PRINTING_HELP_STEP_5=§85. §7Kopiere das gedruckte mit §8/§eshieldprinting copy
|
||||
SHIELD_PRINTING_HELP_STEP_6=§86. §7Füge die originale Schematic wieder ein
|
||||
SHIELD_PRINTING_HELP_STEP_7=§87. §7Wende das gedruckte mit §8/§eshieldprinting apply§7 an
|
||||
|
||||
SHIELD_PRINTING_NO_REGION=§cDu bist in keiner Region.
|
||||
SHIELD_PRINTING_NOT_RUNNING=§cShield printing ist nicht aktiv.
|
||||
SHIELD_PRINTING_DISALLOWED = §cDu darfst Shield printing nicht benutzen.
|
||||
SHIELD_PRINTING_BOSSBAR=§fBewegungen: {0}
|
||||
SHIELD_PRINTING_BOSSBAR_COPIED=§fBewegungen: {0} Kopiert: {1}
|
||||
|
||||
SHIELD_PRINTING_GUI_NAME=§7Schild Drucken
|
||||
SHIELD_PRINTING_GUI_APPLY=§aAnwenden
|
||||
SHIELD_PRINTING_GUI_STATE_PREVIOUS=§7R-Click§8: §7Vorherige
|
||||
|
@ -279,15 +241,12 @@ SHIELD_PRINTING_GUI_STATE_OPENABLE = §7{0} §fGeöffnet
|
|||
SHIELD_PRINTING_GUI_STATE_PISTON=§7{0} §fAusgefahren
|
||||
SHIELD_PRINTING_GUI_STATE_POWERABLE=§7{0} §fAktiviert
|
||||
SHIELD_PRINTING_GUI_STATE_WALL=§7{0} §fWand Verbindungen
|
||||
|
||||
SHIELD_PRINTING_START=§aShield printing wurde gestartet.
|
||||
SHIELD_PRINTING_COPY=§aSchilde wurden kopiert.
|
||||
SHIELD_PRINTING_APPLY=§aSchilde wurden angewendet.
|
||||
SHIELD_PRINTING_STOP=§aShield printing wurde gestoppt.
|
||||
|
||||
# Unsign Book
|
||||
UNSIGN_HELP=§8/§eunsign §8- §7Mache ein Buch beschreibbar
|
||||
|
||||
# Simulator
|
||||
SIMULATOR_HELP=§8/§esimulator §8-§7 Legt dir den Simulatorstab ins Inventar
|
||||
SIMULATOR_CREATE_HELP=§8/§esimulator create §8[§7name§8] §8-§7 Erstelle einen neuen Simulator
|
||||
|
@ -295,35 +254,29 @@ SIMULATOR_CHANGE_HELP = §8/§esimulator change §8-§7 Wechsel zu einem anderen
|
|||
SIMULATOR_DELETE_HELP=§8/§esimulator delete §8[§7name§8] §8-§7 Löscht den Simulator
|
||||
SIMULATOR_START_HELP=§8/§esimulator start §8[§7name§8] §8-§7 Startet die Simulation
|
||||
SIMULATOR_COPY_HELP=§8/§esimulator copy §8[§7to-copy§8] §8[§7name§8] §8-§7 Kopiert einen Simulator
|
||||
SIMULATOR_NO_PERMS = §cDu darfst hier nicht den Simulator nutzen
|
||||
|
||||
SIMULATOR_GUI_ITEM_NAME=§eTNT Simulator
|
||||
|
||||
SIMULATOR_NO_SIM_IN_HAND=§cKein Simulator Item gewählt
|
||||
SIMULATOR_GUI_SELECT_SIM=Simulator wählen
|
||||
SIMULATOR_GUI_CREATE_SIM=§eSimulator erstellen
|
||||
SIMULATOR_GUI_CREATE_SIM_GUI=Simulator erstellen
|
||||
SIMULATOR_NAME_ALREADY_EXISTS=§cSimulator existiert bereits
|
||||
SIMULATOR_NAME_INVALID=§cUngültiger Name
|
||||
SIMULATOR_ERROR_COPY=§cFehler beim kopieren
|
||||
SIMULATOR_NOT_EXISTS=§cSimulator existiert nicht
|
||||
SIMULATOR_CREATE=§aSimulator erstellt
|
||||
SIMULATOR_EDIT_LOCATION=§7Editiere Positionen
|
||||
SIMULATOR_EDIT_PROPERTIES=§7Editiere Eigenschaften
|
||||
SIMULATOR_EDIT_OTHER=§7Editiere Andere
|
||||
SIMULATOR_EDIT_GROUP=§7Editiere Gruppe
|
||||
|
||||
SIMULATOR_EDIT_GROUP_MENU=§eEditiere Gruppe
|
||||
|
||||
SIMULATOR_WAND_NAME=§eKanonensimulator
|
||||
SIMULATOR_WAND_NAME_SELECTED=§7Kanonensimulator §8- §e{0}
|
||||
SIMULATOR_WAND_LORE_1=§eRechtsklick §8- §7Füge eine Position hinzu
|
||||
SIMULATOR_WAND_LORE_2=§eSneaken §8- §7Freie Bewegung
|
||||
SIMULATOR_WAND_LORE_3=§eLinksklick §8- §7Starte die Simulation
|
||||
SIMULATOR_WAND_LORE_4=§eRechtsklick Luft §8- §7Öffne die GUI
|
||||
SIMULATOR_WAND_LORE_5 = §eOffhand §8- §7Simulator Vorschau
|
||||
|
||||
SIMULATOR_WAND_LORE_5=§eDoppel Shift §8- §7Wechsel zwischen TNT und Redstone Block
|
||||
SIMULATOR_REGION_FROZEN=§cSimulator kann nicht in eingefrorenen Regionen genutzt werden
|
||||
|
||||
## Other
|
||||
SIMULATOR_PLUS_ONE=§7+1
|
||||
SIMULATOR_PLUS_PIXEL_SHIFT=§eShift §7Click für §e+0,0625
|
||||
|
@ -335,11 +288,8 @@ SIMULATOR_POSITION_X = §7x-Position
|
|||
SIMULATOR_POSITION_Y=§7y-Position
|
||||
SIMULATOR_POSITION_Z=§7z-Position
|
||||
SIMULATOR_BACK=§eZurück
|
||||
|
||||
SIMULATOR_GUI_TOTAL_TNT=§7Gesamt TNT§8: §e{0}
|
||||
|
||||
SIMULATOR_DELETED=§cSimulator gelöscht
|
||||
|
||||
## GUI
|
||||
SIMULATOR_POSITION_EDIT=§ePosition bearbeiten
|
||||
SIMULATOR_POSITION_ADD=§ePosition setzen
|
||||
|
@ -353,15 +303,12 @@ SIMULATOR_GUI_NAME = Kanonensimulator
|
|||
SIMULATOR_GUI_DELETE=§cTNT löschen
|
||||
SIMULATOR_GUI_AUTO_TRACE=§eAutoTrace§8: §7{0}
|
||||
SIMULATOR_GUI_MOVE_ALL=§eAlle Verschieben
|
||||
|
||||
SIMULATOR_ALIGNMENT_CENTER=§7Verschiebung§8: §eMitte
|
||||
SIMULATOR_ALIGNMENT_POSITIVE_X=§7Verschiebung§8: §ePositive X
|
||||
SIMULATOR_ALIGNMENT_NEGATIVE_X=§7Verschiebung§8: §eNegative X
|
||||
SIMULATOR_ALIGNMENT_POSITIVE_Z=§7Verschiebung§8: §ePositive Z
|
||||
SIMULATOR_ALIGNMENT_NEGATIVE_Z=§7Verschiebung§8: §eNegative Z
|
||||
|
||||
SIMULATOR_MOVE_ALL_GUI_NAME=TNT Verschieben
|
||||
|
||||
SIMULATOR_TNT_SPAWN_GUI_NAME=TNT konfigurieren {0}
|
||||
SIMULATOR_TNT_SPAWN_LORE=§eZum Ändern klicken
|
||||
SIMULATOR_TNT_SPAWN_COUNT=§7TNT-Anzahl §8- §e{0}
|
||||
|
@ -393,19 +340,16 @@ SIMULATOR_TNT_SPAWN_ADD_IGNITION_PHASE = §eZündphase hinzufügen
|
|||
SIMULATOR_TNT_SPAWN_ADD_TNT=§eTNT hinzufügen
|
||||
SIMULATOR_TNT_SPAWN_REMOVE_TNT=§cEntfernen
|
||||
SIMULATOR_TNT_SPAWN_POSITION_ANVIL_GUI_NAME=Position
|
||||
|
||||
# SmartPlace
|
||||
SMART_PLACE_HELP=§8/§esmartplace §8-§7 Toggled SmartPlace
|
||||
SMART_PLACE_INFO=§7Plaziert rotierbare Blöcke beim §esneaken§7 von dir §eweg§7.
|
||||
SMART_PLACE_ENABLE=§aSmartPlace aktiviert
|
||||
SMART_PLACE_DISABLE=§cSmartPlace deaktiviert
|
||||
|
||||
# InventoryFiller
|
||||
INVENTORY_FILL_HELP=§8/§einventoryfill §8- §7Toggled InventoryFill
|
||||
INVENTORY_FILL_INFO=§7Hilft dir, Behälter zu füllen, indem du sie beim sneaken ansiehst und den Gegenstand fallen lässt. Oder scrolle einfach auf einen Behälter, um die Menge des gehaltenen Gegenstandes darin zu ändern.
|
||||
INVENTORY_FILL_ENABLE=§aInventoryFiller activated
|
||||
INVENTORY_FILL_DISABLE=§cInventoryFiller deactivated
|
||||
|
||||
# Killchecker
|
||||
KILLCHECKER_HELP_ENABLE=§8/§ekillchecker enable §8- §7Aktiviert Killchecker / Berechnet kills neu
|
||||
KILLCHECKER_HELP_DISABLE=§8/§ekillchecker disable §8- §7Deaktiviert Killchecker
|
||||
|
@ -414,7 +358,6 @@ KILLCHECKER_INFO2 = §7Nur farbige Blöcke wie Wolle, Terracotta, Stained Glass
|
|||
KILLCHECKER_ENABLE=§aKillchecker aktiviert
|
||||
KILLCHECKER_DISABLE=§cKillchecker deaktiviert
|
||||
KILLCHECKER_BOSSBAR=§e§l{0} §7(§e{1}%§7) §e§l{2}§7 Kanonnen
|
||||
|
||||
# BlockCounter
|
||||
BLOCK_COUNTER_HELP_TOGGLE=§8/§eblockcounter §8- §7Wechsel zwischen an und aus
|
||||
BLOCK_COUNTER_HELP_ENABLE=§8/§eblockcounter enable §8- §7Schalte den BlockCounter an
|
||||
|
@ -423,17 +366,14 @@ BLOCK_COUNTER_MESSAGE = §7Schaden §8> §e{0} §7Blöcke §e{1} §7TNT §e{2}
|
|||
BLOCK_COUNTER_MESSAGE_SECOND=§7Schaden §8> §e{0} §7Blöcke §e{1} §7TNT §e{2} §7Blöcke/TNT §e{3} §7Blöcke/s
|
||||
BLOCK_COUNTER_ENABLE=§7BlockCounter angemacht
|
||||
BLOCK_COUNTER_DISABLE=§7BlockCounter ausgemacht
|
||||
|
||||
# DepthCounter
|
||||
DEPTH_COUNTER_MESSAGE=§7Tiefe §8> §7
|
||||
|
||||
# TPSLimit
|
||||
TPSLIMIT_FREEZE_HELP=§8/§etpslimit 0 §8-§7 Friere TPS ein
|
||||
TPSLIMIT_LIMIT_HELP=§8/§etpslimit §8[§720>x>0.5§8] §8-§7 Verlangsame die TPS
|
||||
TPSLIMIT_WARP_HELP=§8/§etpslimit §8[§7x>20§8] §8-§7 Beschleunige die TPS
|
||||
TPSLIMIT_DEFAULT_HELP=§8/§etpslimit default §8-§7 Setze die TPS auf 20
|
||||
TPSLIMIT_HELP=§8/§etpslimit §8-§7 Zeige die jetzige TPS
|
||||
|
||||
TICK_FREEZE_HELP=§8/§etick rate 0 §8-§7 Friere TPS ein
|
||||
TICK_FREEZE_HELP_2=§8/§etick freeze §8-§7 Friere TPS ein
|
||||
TICK_UNFREEZE_HELP=§8/§etick unfreeze §8-§7 Setze die TPS auf 20
|
||||
|
@ -441,57 +381,47 @@ TICK_LIMIT_HELP = §8/§etick rate §8[§720>x>0.5§8] §8-§7 Verlangsame die T
|
|||
TICK_WARP_HELP=§8/§etick rate §8[§7x>20§8] §8-§7 Beschleunige die TPS
|
||||
TICK_DEFAULT_HELP=§8/§etick rate default §8-§7 Setze die TPS auf 20
|
||||
TICK_HELP=§8/§etick rate §8-§7 Zeige die jetzige TPS
|
||||
|
||||
TICK_STEPPING_HELP=§8/§etick step §8<§7Ticks§8> §8-§7 Spule n ticks oder 1 vor
|
||||
TICK_WARPING_HELP=§8/§etick warp §8<§7Ticks§8> §8<§7TPS§8> §8-§7 Warpe n ticks oder 1 vor
|
||||
|
||||
TICK_BOSSBAR=§e{0}§8/§7{1} gesprungen
|
||||
TPSLIMIT_GUI_ITEM_NAME=§eTPS Limiter
|
||||
TPSLIMIT_GUI_ITEM_LORE=§7Aktuell: §e{0}
|
||||
TPSLIMIT_ANVIL_GUI=Neues TPS Limit
|
||||
TPSLIMIT_CURRENT=§7Jetziges TPS limit§8: §e{0}
|
||||
TPSLIMIT_NO_PERMS = §cDu darfst hier nicht den TPS-Limiter nutzen
|
||||
TPSLIMIT_SET=§eTPS limit auf {0} gesetzt.
|
||||
TPSLIMIT_FROZEN=§eTPS eingefroren.
|
||||
|
||||
# Trace
|
||||
TRACE_RECORD=§aan
|
||||
TRACE_HAS_TRACES=§ehat Traces
|
||||
TRACE_IDLE_SINGLE=§esingle
|
||||
TRACE_IDLE_AUTO_EXPLODE=§eauto §8(§7explode§8)
|
||||
TRACE_IDLE_AUTO_IGNITE=§eauto §8(§7ignite§8)
|
||||
TRACE_MESSAGE_AUTO_IDLE_IGNITE = §aAuto-Tracer ignite gestartet
|
||||
TRACE_MESSAGE_AUTO_DELETE_INVALID = §cAuto delete kann aktuell nicht genutzt werden
|
||||
TRACE_MESSAGE_AUTO_DELETE_ALWAYS = §7Der letzte Schuss wird §eimmer§7 gelöscht
|
||||
TRACE_MESSAGE_AUTO_DELETE_NEVER = §7Der letzte Schuss wird §enie§7 gelöscht
|
||||
TRACE_MESSAGE_AUTO_DELETE_NO_BUILD_DESTROY = §7Der letzte Schuss wird gelöscht, wenn §ekein§7 Block aus dem §eBaubereich§7 zerstört wurde
|
||||
TRACE_MESSAGE_AUTO_DELETE_BUILD_DESTROY = §7Der letzte Schuss wird gelöscht, wenn §eein§7 Block aus dem §eBaubereich§7 zerstört wurde
|
||||
TRACE_MESSAGE_AUTO_DELETE_NO_TESTBLOCK_DESTROY = §7Der letzte Schuss wird gelöscht, wenn §ekein§7 Block aus dem §eTestblock§7 zerstört wurde
|
||||
TRACE_MESSAGE_AUTO_DELETE_TESTBLOCK_DESTROY = §7Der letzte Schuss wird gelöscht, wenn §eein§7 Block aus dem §eTestblock§7 zerstört wurde
|
||||
TRACE_MESSAGE_START=§aTNT-Tracer gestartet
|
||||
TRACE_MESSAGE_SINGLE = §aSingle-Tracer gestartet
|
||||
TRACE_MESSAGE_AUTO_START=§eAuto TNT-Tracer gestartet
|
||||
TRACE_MESSAGE_AUTO_STOP=§cAuto TNT-Tracer gestoppt
|
||||
TRACE_MESSAGE_STOP=§cTNT-Tracer gestoppt
|
||||
TRACE_MESSAGE_DELETE = §cAlle TNT-Positionen gelöscht
|
||||
TRACE_MESSAGE_SHOW = §aAlle TNT-Positionen angezeigt
|
||||
TRACE_MESSAGE_HIDE = §cAlle TNT-Positionen ausgeblendet
|
||||
TRACE_MESSAGE_DISALLOWED = §cDu darfst hier nicht den TNT-Tracer nutzen
|
||||
TRACE_MESSAGE_SHOW_AT = §aTNT-positions angezeigt mit {0} bei {1}
|
||||
TRACE_MESSAGE_SHOW_FROM = §aAll TNT-positions angezeigt mit {0} von {1}
|
||||
TRACE_MESSAGE_SHOW_FROM_TO = §aAll TNT-positions angezeigt mit {0} von {1} bis {2}
|
||||
TRACE_MESSAGE_CLEAR=§cAlle TNT-Positionen gelöscht
|
||||
TRACE_MESSAGE_CLICK_ISOLATE=§eKlicken zum §aisolieren§8/§causblenden
|
||||
TRACE_MESSAGE_SHOW_AT=§aTNT-positions angezeigt bei {0}
|
||||
TRACE_MESSAGE_SHOW_FROM=§aAll TNT-positions angezeigt von {0}
|
||||
TRACE_MESSAGE_SHOW_FROM_TO=§aAll TNT-positions angezeigt von {0} bis {1}
|
||||
TRACE_MESSAGE_BROADCAST=§e{0} teilte seinen Trace-Show-Status.
|
||||
TRACE_MESSAGE_BROADCAST_HOVER=§eZum Ansehen klicken.
|
||||
TRACE_MESSAGE_FOLLOW=§aSie folgen nun {0} Trace show state
|
||||
TRACE_MESSAGE_FOLLOW_SELF=§cSie können sich selbst nicht folgen!
|
||||
TRACE_MESSAGE_UNFOLLOW=§cSie folgen nicht mehr dem Status einer Trace-Show
|
||||
TRACE_MESSAGE_SHOW_TO_SMALLER=§cBis muss größer als von sein
|
||||
|
||||
TRACE_MESSAGE_ISOLATE=§eTNT Positionen wurden isoliert
|
||||
TRACE_COMMAND_HELP_BROADCAST=§8/§etrace broadcast §8- §7Teilt den aktuellen Trace-Show-Status mit anderen
|
||||
TRACE_COMMAND_HELP_FOLLOW=§8/§etrace follow §8[§ePlayer§8] §8- §7Verfolgen eines Spielers Status anzeigen
|
||||
TRACE_COMMAND_HELP_UNFOLLOW=§8/§etrace unfollow §8- §7Den Status der Trace-Anzeige aufheben
|
||||
TRACE_COMMAND_HELP_START=§8/§etrace start §8- §7Startet die Aufnahme aller TNT-Positionen
|
||||
TRACE_COMMAND_HELP_SINGLE = §8/§etrace single §8- §7Startet eine einzelne Aufnahme aller TNT-Positionen
|
||||
TRACE_COMMAND_HELP_STOP=§8/§etrace stop §8- §7Stoppt den TNT-Tracer
|
||||
TRACE_COMMAND_HELP_AUTO=§8/§etrace toggleauto §8- §7Automatischer Aufnahmenstart
|
||||
TRACE_COMMAND_HELP_AUTO_REMOVE = §8/§etrace autoremove §8<§eParameter§8> §8- §7Löscht den letzten Trace automatisch
|
||||
TRACE_COMMAND_HELP_SHOW=§8/§etrace show §8<§eParameter§8> - §7Zeigt alle TNT-Positionen
|
||||
TRACE_COMMAND_HELP_SHOW_AT=§8/§etrace show §8(§etime§8|§7fuse§8) §7at §8<§eTIME§8> - §7Zeigt alle TNT-Positionen bei §8<§eTIME§8> an
|
||||
TRACE_COMMAND_HELP_SHOW_FROM=§8/§etrace show §8(§etime§8|§7fuse§8) §7from §8<§eFROM§8> - §7Zeigt alle TNT-Positionen von §8<§eFROM§8>
|
||||
TRACE_COMMAND_HELP_SHOW_FROM_TO=§8/§etrace show §8(§etime§8|§7fuse§8) §7from §8<§eFROM§8> §7to §8<§eTO§8> - §7Zeigt alle TNT-Positionen zwischen §8<§eFROM§8> und §8<§eTO§8>
|
||||
TRACE_COMMAND_HELP_HIDE=§8/§etrace hide §8- §7Versteckt alle TNT-Positionen
|
||||
TRACE_COMMAND_HELP_DELETE=§8/§etrace delete §8- §7Löscht alle TNT-Positionen
|
||||
|
||||
TRACE_COMMAND_HELP_ISOLATE=§8/§etrace isolate §8[§eTrace§8] §8[§eTNT§8] §8- §7Isoliert spezifische TNTs des Traces
|
||||
TRACE_GUI_ITEM_NAME=§eTracer
|
||||
TRACE_GUI_ITEM_LORE=§7Status§8: {0}
|
||||
TRACE_GUI_NAME=Tracer Gui
|
||||
|
@ -501,13 +431,12 @@ TRACE_GUI_TRACE_ACTIVE_AUTO = §eAuto-Trace ist Aktiv
|
|||
TRACE_GUI_AUTO_TRACE_INACTIVE=§eAuto-Tracer Aktivieren
|
||||
TRACE_GUI_AUTO_TRACE_ACTIVE=§eAuto-Tracer Deaktivieren
|
||||
TRACE_GUI_DELETE=§eTrace Löschen
|
||||
|
||||
# Loader
|
||||
LOADER_SETUP=§eEinrichtung
|
||||
LOADER_RUNNING=§aLaufend
|
||||
LOADER_PAUSE=§7Pausiert
|
||||
LOADER_END=§8Beendet
|
||||
|
||||
LOADER_SINGLE=§aEinmal
|
||||
LOADER_MESSAGE_INTERACT=§e{0} hinzugefügt {1}
|
||||
LOADER_BUTTON_TNT=TNT
|
||||
LOADER_BUTTON_SWITCH=Hebel
|
||||
|
@ -524,10 +453,10 @@ LOADER_BUTTON_LECTERN=Lectern
|
|||
LOADER_BUTTON_TRAPDOOR=Trapdoor
|
||||
LOADER_BUTTON_DOOR=Door
|
||||
LOADER_BUTTON_FENCEGATE=Fencegate
|
||||
|
||||
LOADER_HELP_SETUP=§8/§eloader setup §8- §7Startet die Aufnahme der Aktionen
|
||||
LOADER_SETUP_STOP_FIRST=§cBitte stoppe zuerst den Loader
|
||||
LOADER_HELP_START=§8/§eloader start §8- §7Spielt die zuvor aufgenommenen Aktionen ab
|
||||
LOADER_HELP_SINGLE=§8/§eloader single §8- §7Spielt die zuvor aufgenommenen Aktionen einmal ab
|
||||
LOADER_HELP_PAUSE=§8/§7loader pause §8- §7Pausiert das Abspielen
|
||||
LOADER_HELP_GUI=§8/§7loader settings §8- §7Zeigt die Einstellungen an
|
||||
LOADER_HELP_STOP=§8/§eloader stop §8- §7Stoppt die Aufnahme bzw. das Abspielen
|
||||
|
@ -538,12 +467,11 @@ LOADER_NEW=§7Belade und feuer einmal die Kanone ab, um den Loader zu initialisi
|
|||
LOADER_HOW_TO_START=§7Führe dann /§eloader start§7 um den Loader zu starten
|
||||
LOADER_ACTIVE=§7Der Loader ist nun aktiviert.
|
||||
LOADER_STOP=§7Der Loader ist nun gestoppt.
|
||||
LOADER_SINGLE_CMD=§7Der Loader spielt nun einmal ab.
|
||||
LOADER_PAUSED=§7Der Loader ist nun pausiert.
|
||||
LOADER_SMALL_TIME=§cDie Wartezeit ist zu klein
|
||||
LOADER_NEW_TIME=§7Die Schusswartezeit ist nun: {0}
|
||||
LOADER_NEW_LOAD_TIME=§7Die Setzwartezeit ist nun: {0}
|
||||
LOADER_PERMS=§cDu darfst hier nicht den Detonator nutzen
|
||||
|
||||
LOADER_NOTHING_RECORDED=§cEs wurden keine Elemente aufgenommen!
|
||||
LOADER_GUI_TITLE=Loader Einstellungen
|
||||
LOADER_GUI_SHOW_ALL=Zeige alles
|
||||
|
@ -560,7 +488,6 @@ LOADER_GUI_SETTINGS_COPY=§7Kopieren
|
|||
LOADER_GUI_SETTINGS_DELETE=§cLöschen
|
||||
LOADER_GUI_WAIT_TITLE=Wartezeit
|
||||
LOADER_GUI_WAIT_BACK=§8Zurück
|
||||
|
||||
LOADER_GUI_CLICK_TO_EDIT=§7Klicke zum editieren
|
||||
LOADER_GUI_ITEM_NAME=§7{0}§8: §e{1}
|
||||
LOADER_SETTING_NAME=§7{0}
|
||||
|
@ -595,7 +522,6 @@ LOADER_INTERACTION_OPEN=Geöffnet
|
|||
LOADER_INTERACTION_CLOSED=Geschlossen
|
||||
LOADER_INTERACTION_COMPARE=Vergleichen
|
||||
LOADER_INTERACTION_SUBTRACT=Subtrahieren
|
||||
|
||||
# Loadtimer
|
||||
LOADTIMER_HELP_OVERVIEW=§7Messe dich und deine Freunde beim Beladen einer Kanone und bekomme informationen über die Kanone
|
||||
LOADTIMER_HELP_START_1=§8/§eloadtimer start §8-§7 Startet den einfachen Loadtimer
|
||||
|
@ -625,7 +551,6 @@ LOADTIMER_SUMARY_TIMES_LAST=§7\\/
|
|||
LOADTIMER_SUMARY_STATS_HEAD=§7Kanonen-Stats§8:
|
||||
LOADTIMER_SUMARY_STATS_TNT=§7TNT: §e{0}
|
||||
LOADTIMER_SUMARY_STATS_FREQ=§7Belade Frequenz: §e{0}/m§8, §7Schuss Frequenz: §e{1}/m
|
||||
|
||||
# Observer
|
||||
OBSERVER_HELP=§7Rechts-Klicke einen Observer um den Trace zu bekommen. Hierfür müssen Flammenpartikel an sein. Die Partikel werden im Block angezeigt.
|
||||
OBSERVER_HELP_ENABLE=§8/§eobserver enable §8-§7 Aktiviere den Observer Tracer
|
||||
|
@ -637,7 +562,6 @@ OBSERVER_DISABLE = §7Observer Trace gestoppt
|
|||
OBSERVER_DELETE=§7Observer Trace gelöscht
|
||||
OBSERVER_RETRACE_DONE=§7Observer Trace neu berechnet
|
||||
OBSERVER_RETRACE_NO_TRACE=§7Kein Observer Trace zum neu berechnen
|
||||
|
||||
# Other
|
||||
OTHER_ITEMS_TELEPORT_NAME=§eTeleporter
|
||||
OTHER_ITEMS_TELEPORT_GUI_NAME=Teleportieren
|
||||
|
@ -658,10 +582,9 @@ OTHER_NOCLIP_SLOT_HELP_PICK = §8/§eslot pick §8-§7 Lege den angeguckten Bloc
|
|||
OTHER_NOCLIP_SLOT_HELP_DROP=§8/§eslot drop §8-§7 Cleared deinen Slot
|
||||
OTHER_CLEAR_HELP_SELF=§8/§eclear §8- §7Leere dein Inventar
|
||||
OTHER_CLEAR_HELP_PLAYER=§8/§eclear §8[§7Player§8] §8- §7Leere ein Spieler Inventar
|
||||
OTHER_CLEAR_CLEARED=Dein Inventar wurde geleert.
|
||||
OTHER_CLEAR_FROM=Dein Inventar wurde von {0} §7geleert.
|
||||
OTHER_CLEAR_TO=Das Inventar von {0} §7wurde geleert.
|
||||
OTHER_CLEAR_NO_PERMS=§cDu darfst hier keine fremden Inventare leeren.
|
||||
OTHER_CLEAR_CLEARED=§7Dein Inventar wurde geleert.
|
||||
OTHER_CLEAR_FROM=§7Dein Inventar wurde von {0} §7geleert.
|
||||
OTHER_CLEAR_TO=§7Das Inventar von {0} §7wurde geleert.
|
||||
OTHER_DECLUTTER_HELP=§8/§edeclutter §8- §7Räume dein Inventar auf
|
||||
OTHER_DECLUTTER_DONE=§aDein Inventar wurde aufgeräumt.
|
||||
OTHER_GAMEMODE_UNKNOWN=§cUnbekannter Spielmodus.
|
||||
|
@ -677,7 +600,6 @@ OTHER_TELEPORT_SELF_2=§cNoch zu reisende Blöcke: 0; ETA: 0:00
|
|||
OTHER_TELEPORT_SELF_3=§cEin wenig bewegung muss ein.
|
||||
OTHER_TELEPORT_SELF_4=§cFür eine solche Distanz?
|
||||
OTHER_TIME_HELP=§8/§etime §8<§7Zeit 0=Morgen§8, §76000=Mittag§8, §718000=Mitternacht§8> - §7Setzt die Zeit auf dem Bau
|
||||
OTHER_TIME_NO_PERM=§cDu darfst hier nicht die Zeit ändern
|
||||
OTHER_TIME_INVALID=§cBitte gib eine Zahl zwischen 0 und 24000 an
|
||||
OTHER_TIME_RESULT=§7§oWhooosh
|
||||
OTHER_TPS_HEAD=§7TPS: 1s 10s 1m 5m 10m
|
||||
|
@ -704,7 +626,6 @@ NIGHT_VISION_OFF=§eNightvision deaktiviert
|
|||
NIGHT_VISION_ON=§eNightvision aktiviert
|
||||
NIGHT_VISION_ITEM_ON=§7Nightvision: §eAktiviert
|
||||
NIGHT_VISION_ITEM_OFF=§7Nightvision: §eDeaktiviert
|
||||
|
||||
#Navigation Wand
|
||||
NAVIGATION_WAND=§eNavigation Wand
|
||||
NAVIGATION_WAND_LEFT_CLICK=§eLeft click: jump to location
|
||||
|
@ -739,17 +660,6 @@ MATERIAL_INTERACTABLE=§8- §eInterargierbarer Block
|
|||
MATERIAL_FLAMMABLE=§8- §eFlammbarer Block
|
||||
MATERIAL_BURNABLE=§8- §eBrennbarer Block
|
||||
MATERIAL_WATERLOGGABLE=§8- §eWasserspeicherbarer Block
|
||||
# Redstonetester
|
||||
RT_HELP=§8/§eredstonetester §8-§7 Gibt den RedstoneTester
|
||||
RT_GIVEN=§7Messe die Zeit zwischen der Aktivierung zweier Redstone Komponenten
|
||||
RT_ITEM_NAME=§eRedstonetester
|
||||
RT_ITEM_LORE_1=§eLinksklick Block §8-§7 Setzt die 1. Position
|
||||
RT_ITEM_LORE_2=§eRechtsklick Block §8-§7 Setzt die 2. Position
|
||||
RT_ITEM_LORE_3=§eShift-Rechtsklick Luft §8-§7 Zurücksetzten
|
||||
RT_LOC=§8: §e{0} {1} {2}
|
||||
RT_INVALID_LOC=§cUnbekannte Position
|
||||
RT_RESULT=§7Differenz§8: §e{0}§7 Ticks §8,§7 R-Ticks §e{1}
|
||||
RT_ACTIVATE=§7Positionen gelöscht§8.
|
||||
# Region Items
|
||||
REGION_ITEM_COLOR=§7Color: §e{0}
|
||||
REGION_ITEM_COLOR_CHOOSE=Farbe Wählen
|
||||
|
@ -775,24 +685,18 @@ REGION_COLOR_HELP_COLOR=§8/§ecolor §8[§7Color§8] §8- §7Setze die Farbe de
|
|||
REGION_COLOR_HELP_COLOR_TYPE=§8/§ecolor §8[§7Color§8] §8[§7Type§8] §8- §7Setze die Farbe der Region oder Global
|
||||
REGION_COLOR_GLOBAL=§7Alle Regions farben auf §e{0}§7 gesetzt
|
||||
REGION_COLOR_NO_REGION=§cDu befindest dich derzeit in keiner Region
|
||||
REGION_COLOR_NO_PERMS=§cDies ist nicht deine Welt!
|
||||
REGION_FIRE_HELP=§8/§efire §8- §7Toggle Feuerschaden
|
||||
REGION_FIRE_NO_PERMS=§cDu darfst hier nicht Feuerschaden (de-)aktivieren
|
||||
REGION_FIRE_ENABLED=§cRegions Feuerschaden deaktiviert
|
||||
REGION_FIRE_DISABLED=§aRegions Feuerschaden aktiviert
|
||||
REGION_FREEZE_HELP=§8/§efreeze §8- §7Toggle Freeze
|
||||
REGION_FREEZE_NO_PERMS=§cDu darfst diese Welt nicht einfrieren
|
||||
REGION_FREEZE_ENABLED=§cRegion eingefroren
|
||||
REGION_FREEZE_DISABLED=§aRegion aufgetaut
|
||||
REGION_ITEMS_HELP=§8/§eitems §8- §7Toggle Items
|
||||
REGION_ITEMS_NO_PERMS=§cDu darfst hier nicht Items (de-)aktivieren
|
||||
REGION_ITEMS_ENABLED=§aItems aktiviert in dieser Region
|
||||
REGION_ITEMS_DISABLED=§cItems deaktiviert in dieser Region
|
||||
REGION_ITEMS_DISABLED_GLOBAL=§cItems sind auf dem Server deaktiviert.
|
||||
REGION_PROTECT_HELP=§8/§eprotect §8- §7Schütze die Region
|
||||
REGION_PROTECT_DISABLE=§cBoden Schutz aufgehoben
|
||||
REGION_PROTECT_ENABLE=§aBoden geschützt
|
||||
REGION_PROTECT_NO_PERMS=§cDu darfst hier nicht den Boden schützen
|
||||
REGION_PROTECT_FALSE_REGION=§cDu befindest dich derzeit in keiner (M)WG-Region
|
||||
REGION_REGION_HELP_UNDO=§8/§eregion undo §8- §7Mache die letzten 20 /testblock oder /reset rückgängig
|
||||
REGION_REGION_HELP_REDO=§8/§eregion redo §8- §7Wiederhole die letzten 20 §8/§7rg undo
|
||||
|
@ -800,10 +704,10 @@ REGION_REGION_HELP_RESTORE=§8/§eregion restore §8- §7Setzte die Region zurü
|
|||
REGION_REGION_HELP_RESTORE_SCHEMATIC=§8/§eregion restore §8[§7Schematic§8] §8- §7Setzte die Region zurück, ohne das Gebaute zu löschen
|
||||
REGION_REGION_HELP_COPYPOINT=§8/§eregion copypoint §8- §7Teleportiere dich zum Regions Kopierpunkt
|
||||
REGION_REGION_HELP_TESTBLOCKPOINT=§8/§eregion testblockpoint §8- §7Teleportiere dich zum Regions Testblockpunkt
|
||||
REGION_REGION_HELP_CHANGETYPE_INFO=§8/§eregion changetype §8- §7Gebe den Regions Type aus
|
||||
REGION_REGION_HELP_CHANGETYPE=§8/§eregion changetype §8[§7Type§8] §8- §8Setzte den Regions Type
|
||||
REGION_REGION_HELP_CHANGESKIN_INFO=§8/§eregion changeskin §8- §7Gebe den Regions Skin aus
|
||||
REGION_REGION_HELP_CHANGESKIN=§8/§eregion changeskin §8[§7Skin§8] §8- §8Setzte den Regions Skin
|
||||
REGION_REGION_HELP_COPY=§8/§eregion copy [-e] [-s] §8- §8Kopieren des Baubereichs optional mit Erweiterungen oder Auswahl am Kopierpunkt
|
||||
REGION_REGION_HELP_PASTE=§8/§eregion paste [-a] [-s] §8[§7Skin§8] §8- §8Einfügen am Kopierpunkt optional ohne Luft und Auswahl des eingefügten Bereichs
|
||||
REGION_REGION_NOTHING_UNDO=§cNichts zum rückgängig machen
|
||||
REGION_REGION_UNDID=§7Letzte Aktion rückgangig gemacht
|
||||
REGION_REGION_NOTHING_REDO=§cNichts zum wiederhohlen
|
||||
|
@ -817,13 +721,9 @@ REGION_REGION_TP_COPY=§7Zum Kopierpunkt teleportiert
|
|||
REGION_REGION_TP_TEST_BLOCK=§7Zum Testblock teleportiert
|
||||
REGION_REGION_TP_UNKNOWN=§cNicht definierter Teleportierpunkt
|
||||
REGION_REGION_NO_REGION=§cDu bist in keiner Region
|
||||
REGION_REGION_NO_PERMS=§cDu darfst hier nicht die Region verändern
|
||||
REGION_REGION_CHANGETYPE_INFO=§7Regions Type ist §e{0}
|
||||
REGION_REGION_CHANGETYPE_UNKNOWN=§cRegions Type ist nicht valide
|
||||
REGION_REGION_CHANGETYPE_INVALID=§cRegions Type ist nicht erlaubt hier
|
||||
REGION_REGION_CHANGETYPE_CHANGE=§7Regions Type ist auf §e{0}§7 geändert
|
||||
REGION_REGION_CHANGETYPE_CHANGE_UPDATE=§7Klicke §e§lHIER §7um den Type anzuwenden
|
||||
REGION_REGION_CHANGETYPE_CHANGE_UPDATE_HOVER=§8/§ereset
|
||||
REGION_REGION_NO_BUILD=§cDiese Region hat kein Baugebiet
|
||||
REGION_REGION_COPY_DONE=§eBauregion oder Selektion kopiert
|
||||
REGION_REGION_PASTE_DONE=§eBauregion oder Selektion eingefügt
|
||||
REGION_REGION_CHANGESKIN_INFO=§7Regions Skin ist §e{0}
|
||||
REGION_REGION_CHANGESKIN_INFO_CREATOR=§7Skin erstellt von §e{0}
|
||||
REGION_REGION_CHANGESKIN_UNKNOWN=§cRegions Skin ist nicht valide
|
||||
|
@ -835,7 +735,6 @@ REGION_RESET_HELP_RESET=§8/§ereset §8- §7Setzte die Region zurück
|
|||
REGION_RESET_HELP_SCHEMATIC=§8/§ereset §8[§7Schematic§8] §8- §7Setzte die Region mit einer Schematic zurück
|
||||
REGION_RESET_RESETED=§7Region zurückgesetzt
|
||||
REGION_RESET_ERROR=§cFehler beim Zurücksetzen der Region
|
||||
REGION_RESET_NO_PERMS=§cDu darfst hier nicht die Region zurücksetzen
|
||||
REGION_RESET_NO_REGION=§cDu befindest dich derzeit in keiner Region
|
||||
REGION_TB_HELP_RESET=§8/§etestblock §8- §7Setzte den Testblock zurück
|
||||
REGION_TB_HELP_RESET_EXTENSION=§8/§etestblock §8[§7ExtensionType§8] §8- §7Setzte den Testblock zurück
|
||||
|
@ -843,7 +742,6 @@ REGION_TB_HELP_SCHEMATIC=§8/§etestblock §8[§7Schematic§8] §8- §7Setzte de
|
|||
REGION_TB_HELP_SCHEMATIC_EXTENSION=§8/§etestblock §8[§7Schematic§8] §8[§7ExtensionType§8] §8- §7Setzte den Testblock mit einer Schematic zurück
|
||||
REGION_TB_DONE=§7Testblock zurückgesetzt
|
||||
REGION_TB_ERROR=§cFehler beim Zurücksetzen des Testblocks
|
||||
REGION_TB_NO_PERMS=§cDu darfst hier nicht den Testblock zurücksetzen
|
||||
REGION_TB_NO_REGION=§cDu befindest dich derzeit in keiner Region
|
||||
REGION_TB_NO_SCHEMSHARING=§cDu kannst aktuell keine Schematics teilen bis {0}.
|
||||
REGION_TB_NO_SCHEMRECEIVING=§cDer Besitzer dieses Bauservers kann keine Schematics erhalten bis {0}.
|
||||
|
@ -852,51 +750,42 @@ REGION_TNT_HELP_MODE=§8/§etnt §8[§7Mode§8] §8- §7Setzte das TNT verhalten
|
|||
REGION_TNT_ON=§aTNT-Schaden aktiviert
|
||||
REGION_TNT_OFF=§cTNT-Schaden deaktiviert
|
||||
REGION_TNT_TB=§aTNT-Schaden außerhalb Baurahmen aktiviert
|
||||
REGION_TNT_NO_PERMS=§cDu darfst hier nicht TNT-Schaden (de-)aktivieren
|
||||
REGION_TNT_BUILD_DESTROY=§cEine Explosion hätte Blöcke im Baubereich zerstört
|
||||
REGION_TNT_TB_DESTROY=§cEine Explosion hätte Blöcke im Testblockbereich zerstört
|
||||
AFK_KICK_MESSAGE=§cAuf diesem Server ist seit 5 Minuten nichts passiert.
|
||||
AFK_KICK_MESSAGE=§cAuf diesem Server ist seit 15 Minuten nichts passiert.
|
||||
AFK_WARNING_MESSAGE=§cDieser Server wird bei weiterer Inaktivität in einer Minute gestoppt
|
||||
|
||||
SKIN_HELP=§8/§eskin §8[§7Kuerzel§8] §8[§7Creator§8|§epublic§8] §8[§7Name...§8] §8- §7Erstellt die Skin Schematics. 'public' als Creator nutzen für keinen Creator, danach die nachricht an YoyoNow kopieren (mit Click kopieren)
|
||||
SKIN_NO_REGION=§7Du steht in keiner Region, welche mit einem Skin versehen werden kann
|
||||
SKIN_ALREADY_EXISTS=§cDieser Skin existiert in der Form bereits
|
||||
SKIN_MESSAGE=§7Skin erstellt
|
||||
SKIN_MESSAGE_HOVER=§eKlicken zum kopieren für YoyoNow und an diesen senden
|
||||
|
||||
# Panzern
|
||||
PANZERN_HELP=§8/§epanzern §8[§7Block§8] §8[§7Slab§8] §8- §7Panzer deine WorldEdit Auswahl
|
||||
PANZERN_PREPARE1=§71. Gucke nochmal nach, ob Läufe auch bis zur Panzergrenze führen.
|
||||
PANZERN_PREPARE2=§72. Teppich in Gänge auf dem Boden vereinfacht das panzern.
|
||||
PANZERN_PREPARE3=§73. Schildtechnik sollte explizit eingeschlossen sein.
|
||||
PANZERN_PREPARE4=§74. Innerhalb der zu panzernden Region zu stehen, beim Befehlausführen kann das Panzern verbessern.
|
||||
PANZERN_NO_PERM = §cDu darfst hier nicht das Panzern System verwenden
|
||||
PANZERN_NO_WORLDEDIT=§cDu hast keine WorldEdit Selection
|
||||
PANZERN_PROGRESS=§e{0} §7Blöcke übrig, §e{1} §7Blöcke pro Sekunde, §e{2} §7Block Delta
|
||||
PANZERN_DONE=§aZuende gepanzert
|
||||
|
||||
# Laufbau
|
||||
LAUFBAU_HELP=§8/§elaufbau §8[§7smallest§8|§7blastresistant§8] §8- §7Baue einen Lauf in deiner WorldEdit Auswahl mit den Traces
|
||||
LAUFBAU_HELP_SETTINGS=§8/§elaufbau settings §8- §7Öffnet die Settings GUI
|
||||
LAUFBAU_PREPARE1=§71. Trace die Kanonen so oft wie nötig, in allen Modi.
|
||||
LAUFBAU_PREPARE2=§72. Versuche alle Fails aus dem Trace zu löschen.
|
||||
LAUFBAU_NO_PERM = §cDu darfst hier nicht das Laufbau System verwenden
|
||||
LAUFBAU_NO_WORLDEDIT=§cDu hast keine WorldEdit Selection
|
||||
LAUFBAU_STATE_FILTERING_TRACES=Traces filtern
|
||||
LAUFBAU_STATE_PROCESSING_TRACES=Traces verbinden
|
||||
LAUFBAU_STATE_CREATE_LAUF=Lauf erstellen
|
||||
LAUFBAU_SIMPLE_PROGRESS=§e{0}§8: §e{1}§8/§e{2} §7Übrige Zeit §8: §e{3}
|
||||
LAUFBAU_DONE=§aZuende gebaut
|
||||
|
||||
LAUFBAU_SETTINGS_GUI_NAME=§eLaufbau
|
||||
LAUFBAU_SETTINGS_ACTIVE=§aAktiv
|
||||
LAUFBAU_SETTINGS_INACTIVE=§cInaktiv
|
||||
LAUFBAU_SETTINGS_MIXED=§e{0}§8/§e{1} §aAktiv
|
||||
LAUFBAU_SETTINGS_GUI_BACK=§eBack
|
||||
|
||||
LAUFBAU_SETTINGS_TOGGLE=§eClick §8-§7 Toggle
|
||||
LAUFBAU_SETTINGS_ADVANCED=§eMiddle-Click §8-§7 Erweiterte Einstellung
|
||||
|
||||
LAUFBAU_BLOCK_COBWEB=§eCobweb
|
||||
LAUFBAU_BLOCK_GRASS_PATH=§eGrass Path
|
||||
LAUFBAU_BLOCK_SOUL_SAND=§eSoul Sand
|
||||
|
@ -935,39 +824,31 @@ LAUFBAU_BLOCK_AZALEA = §eAzalea
|
|||
LAUFBAU_BLOCK_CANDLE=§eKerze
|
||||
LAUFBAU_BLOCK_CANDLE_CAKE=§eKuchen mit Kerze
|
||||
LAUFBAU_BLOCK_LECTERN=§eLectern
|
||||
|
||||
LAUFBAU_FACING_NORTH=§8-§7 Richtung Norden
|
||||
LAUFBAU_FACING_SOUTH=§8-§7 Richtung Süden
|
||||
LAUFBAU_FACING_WEST=§8-§7 Richtung Westen
|
||||
LAUFBAU_FACING_EAST=§8-§7 Richtung Osten
|
||||
LAUFBAU_FACING_UP=§8-§7 Richtung Oben
|
||||
LAUFBAU_FACING_DOWN=§8-§7 Richtung Unten
|
||||
|
||||
LAUFBAU_COUNT_1=§8-§7 Anzahl 1
|
||||
LAUFBAU_COUNT_2=§8-§7 Anzahl 2
|
||||
LAUFBAU_COUNT_3=§8-§7 Anzahl 3
|
||||
LAUFBAU_COUNT_4=§8-§7 Anzahl 4
|
||||
|
||||
LAUFBAU_LAYERS_8=§8-§7 Ebenen 8
|
||||
LAUFBAU_LAYERS_7=§8-§7 Ebenen 7
|
||||
LAUFBAU_LAYERS_6=§8-§7 Ebenen 6
|
||||
LAUFBAU_LAYERS_3=§8-§7 Ebenen 3
|
||||
LAUFBAU_LAYERS_2=§8-§7 Ebenen 2
|
||||
|
||||
LAUFBAU_TYPE_BOTTOM=§8-§7 Type Unten
|
||||
LAUFBAU_TYPE_TOP=§8-§7 Type Oben
|
||||
|
||||
LAUFBAU_HALF_BOTTOM=§8-§7 Hälfte Unten
|
||||
LAUFBAU_HALF_TOP=§8-§7 Hälfte Oben
|
||||
|
||||
LAUFBAU_OPEN=§8-§7 Geöffnet
|
||||
|
||||
LAUFBAU_ATTACHMENT_CEILING=§8-§7 Befestigung Decke
|
||||
LAUFBAU_ATTACHMENT_FLOOR=§8-§7 Befestigung Boden
|
||||
LAUFBAU_ATTACHMENT_DOUBLE_WALL=§8-§7 Befestigung beidseitige Wand
|
||||
LAUFBAU_ATTACHMENT_SINGLE_WALL=§8-§7 Befestigung einseitige Wand
|
||||
LAUFBAU_ATTACHMENT_WALL=§8-§7 Befestigung Wand
|
||||
|
||||
LAUFBAU_CONNECTION_FLOOR=§8-§7 Verbindung Boden
|
||||
LAUFBAU_CONNECTION_NORTH=§8-§7 Verbindung Norden
|
||||
LAUFBAU_CONNECTION_SOUTH=§8-§7 Verbindung Süden
|
||||
|
@ -975,29 +856,22 @@ LAUFBAU_CONNECTION_EAST = §8-§7 Verbindung Osten
|
|||
LAUFBAU_CONNECTION_WEST=§8-§7 Verbindung Westen
|
||||
LAUFBAU_CONNECTION_DOWN=§8-§7 Verbindung Unten
|
||||
LAUFBAU_CONNECTION_UP=§8-§7 Verbindung Oben
|
||||
|
||||
LAUFBAU_HANGING=§8-§7 hängend
|
||||
|
||||
LAUFBAU_SHAPE_STRAIGHT=§8-§7 Form gerade
|
||||
LAUFBAU_SHAPE_OUTER_LEFT=§8-§7 Form äußere links
|
||||
LAUFBAU_SHAPE_INNER_LEFT=§8-§7 Form innere links
|
||||
|
||||
LAUFBAU_TILT_NONE=§8-§7 Neigung keine
|
||||
LAUFBAU_TILT_PARTIAL=§8-§7 Neigung teilweise
|
||||
|
||||
# UTILS
|
||||
SELECT_HELP=§8/§eselect §8[§7RegionsTyp§8] §8- §7Wähle einen RegionsTyp aus
|
||||
SELECT_EXTENSION_HELP=§8/§eselect §8[§7RegionsTyp§8] §8[§7Extension§8] §8- §7Wähle einen RegionsTyp aus mit oder ohne Extension
|
||||
SELECT_NO_PERMS = §cDu darfst hier nicht den Select Befehl verwenden
|
||||
SELECT_GLOBAL_REGION=§cDie globale Region kannst du nicht auswählen
|
||||
SELECT_NO_TYPE=§cDiese Region hat keinen {0}
|
||||
SELECT_NO_EXTENSION=§cDiese Region hat keine Ausfahrmaße
|
||||
SELECT_MESSAGE=§7WorldEdit auswahl auf {0}, {1}, {2} und {3}, {4}, {5} gesetzt
|
||||
|
||||
SKULL_HELP=§8/§eskull §8[§eSpieler§8] §8-§7 Gibt einen SpielerKopf
|
||||
SKULL_INVALID=§cUngültiger Spieler
|
||||
SKULL_ITEM=§e{0}§8s Kopf
|
||||
|
||||
SPEED_HELP=§8/§espeed §8[§71§8-§710§8|§edefault§8] §8-§7 Setzte deine Flug- und Laufgeschindigkeit.
|
||||
SPEED_CURRENT=§7Aktuelle geschwindigkeit§8: §e{0}
|
||||
SPEED_TOO_SMALL=§c{0} ist zu klein
|
||||
|
@ -1005,11 +879,9 @@ SPEED_TOO_HIGH = §c{0} ist zu hoch
|
|||
SPEED_ITEM=§eGeschwindigkeit
|
||||
SPEED_ITEM_LORE=§7Aktuell: §e
|
||||
SPEED_TAB_NAME=Geschwindigkeit eingeben
|
||||
|
||||
WORLDEDIT_WAND=WorldEdit Wand
|
||||
WORLDEDIT_LEFTCLICK=Left click: select pos #1
|
||||
WORLDEDIT_RIGHTCLICK=Right click: select pos #2
|
||||
|
||||
TNT_CLICK_HEADER=§8---=== §eTNT §8===---
|
||||
TNT_CLICK_ORDER=§eEntity Order§8: §e{0}
|
||||
TNT_CLICK_FUSE_TIME=§eFuseTime§8: §e{0}
|
||||
|
@ -1031,16 +903,12 @@ SELECT_ITEM_RIGHT_CLICK=§7Rechtklick zum ändern
|
|||
SELECT_ITEM_BAURAHMEN=§eBaurahmen
|
||||
SELECT_ITEM_BAUPLATTFORM=§eBauplattform
|
||||
SELECT_ITEM_TESTBLOCK=§eTestblock
|
||||
|
||||
CHESTFILLER_FILLED=§eKiste gefüllt
|
||||
|
||||
PISTON_HELP_1=§7Rechts Klick auf Piston mit einem Slime Ball berechnet dir die bewegten Blöcke.
|
||||
PISTON_HELP_2=§7Die Anzahl ist Rot, wenn ein unmovable Block vorhanden ist.
|
||||
PISTON_HELP_3=§7Die Anzahl ist Gelb, wenn zu viele Blöcke vorhanden sind.
|
||||
PISTON_INFO=§7Bewegte Blöcke {0}{1}§8/§712
|
||||
|
||||
# Warp
|
||||
WARP_DISALLOWED = §cDu darfst hier nicht das Warp System nutzen
|
||||
WARP_LOC_X=§7X§8: §e{0}
|
||||
WARP_LOC_Y=§7Y§8: §e{0}
|
||||
WARP_LOC_Z=§7Z§8: §e{0}
|
||||
|
@ -1063,33 +931,22 @@ WARP_HELP_INFO=§8/§ewarp info §8[§7Name§8] §8- §7Infos zu einem Punkt
|
|||
WARP_HELP_DELETE=§8/§ewarp delete §8[§7Name§8] §8- §7Lösche einen Warp
|
||||
WARP_HELP_GUI=§8/§ewarp gui §8- §7Öffne die Warp-GUI
|
||||
WARP_HELP_LIST=§8/§ewarp list §8- §7Liste alle Warp-Punkt auf
|
||||
|
||||
# WORLD
|
||||
STOP_HELP=§8/§estop §8- §7Stoppt den Server
|
||||
STOP_NO_PERMS = §cDu hast keine Rechte den Server zu stoppen
|
||||
STOP_MESSAGE=§eDer Server wird gestoppt
|
||||
WORLD_EDIT_NO_PERMS = §cDu darfst hier kein WorldEdit benutzen
|
||||
|
||||
KICKALL_HELP=§8/§ekickall §8- §7Kickt alle Spieler vom Server außer den Owner
|
||||
KICKALL_NO_PERM = §cDies ist nicht deine Welt!
|
||||
|
||||
# Techhider
|
||||
TECHHIDER_HELP=§8/§etechhider §8- §7Techhider umschalten
|
||||
TECHHIDER_GLOBAL=§cKein Techhider in der globalen region
|
||||
TECHHIDER_ON=§aTechhider aktiviert
|
||||
TECHHIDER_OFF=§cTechHider deaktiviert
|
||||
|
||||
# XRAY
|
||||
XRAY_HELP=§8/§exray §8- §7Xray umschalten
|
||||
XRAY_GLOBAL=§cKein Xray in der globalen region
|
||||
XRAY_ON=§aXray aktiviert
|
||||
XRAY_OFF=§cXray deaktiviert
|
||||
|
||||
|
||||
# WorldEdit
|
||||
COLORREPLACE_HELP=§8//§ecolorreplace §8[§7color§8] §8[§7color§8] §8- §7Ersetzt eine Farbe mit einer anderen
|
||||
|
||||
TYPEREPLACE_HELP=§8//§etyreplace §8[§7type§8] §8[§7type§8] §8- §7Ersetzt einen Blockgruppe mit einer anderen
|
||||
|
||||
# Schematics
|
||||
SCHEMATIC_GUI_ITEM=§eSchematics
|
||||
|
|
|
@ -22,16 +22,19 @@ 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.features.world.RamUsage;
|
||||
import de.steamwar.bausystem.linkage.LinkageUtils;
|
||||
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.message.Message;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
@ -49,16 +52,13 @@ 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,31 +73,40 @@ 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);
|
||||
|
||||
LinkageUtils.link();
|
||||
RamUsage.init();
|
||||
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));
|
||||
|
||||
// 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();
|
||||
LinkageUtils.link();
|
||||
} catch (Exception e) {
|
||||
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||
Bukkit.shutdown();
|
||||
System.exit(1);
|
||||
return;
|
||||
}
|
||||
TickListener.impl.init();
|
||||
}
|
||||
});
|
||||
thread.setName("WatchdogThread ticker");
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
*/
|
||||
|
||||
private <T extends CommandSender> AbstractValidator<T, ?> validator(Permission permission) {
|
||||
return (commandSender, object, messageSender) -> {
|
||||
if (commandSender instanceof Player) {
|
||||
if (permission.hasPermission((Player) commandSender)) {
|
||||
return true;
|
||||
}
|
||||
messageSender.send("NO_PERMISSION");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -20,43 +20,77 @@
|
|||
package de.steamwar.bausystem;
|
||||
|
||||
import de.steamwar.bausystem.config.BauServer;
|
||||
import de.steamwar.command.CommandMetaData;
|
||||
import de.steamwar.command.TypeValidator;
|
||||
import de.steamwar.bausystem.features.world.BauMemberUpdate;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.sql.BauweltMember;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@AllArgsConstructor
|
||||
public enum Permission {
|
||||
|
||||
WORLD(BauweltMember::isWorld),
|
||||
WORLDEDIT(BauweltMember::isWorldEdit),
|
||||
MEMBER(bauweltMember -> true),
|
||||
OWNER(bauweltMember -> false);
|
||||
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());
|
||||
}
|
||||
|
||||
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;
|
||||
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);
|
||||
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();
|
||||
String string = yapionObject.toYAPION(new StringOutput()).getResult().replaceAll("\\+", "\\");
|
||||
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();
|
||||
String string = yapionObject.toYAPION(new StringOutput()).getResult().replaceAll("\\\\+", "\\\\");
|
||||
UserConfig.updatePlayerConfig(uuid, "bausystem", string);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ public class AttributeRemoveCommand extends SWCommand {
|
|||
|
||||
@Register({"all"})
|
||||
@Register({"*"})
|
||||
public void genericCommand(Player player) {
|
||||
public void genericCommand(@Validator 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(Player player, @Mapper("attribute") String attribute) {
|
||||
public void genericCommand(@Validator Player player, @Mapper("attribute") String attribute) {
|
||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
if (itemMeta == null) {
|
||||
|
|
|
@ -41,7 +41,7 @@ public class AttributesCopyCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register
|
||||
public void genericCommand(Player player) {
|
||||
public void genericCommand(@Validator Player player) {
|
||||
Block block = player.getTargetBlockExact(8, FluidCollisionMode.ALWAYS);
|
||||
if (block == null) return;
|
||||
ItemStack mainHand = player.getInventory().getItemInMainHand();
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
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;
|
||||
|
@ -40,6 +41,7 @@ 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(Player p) {
|
||||
public void genericCommand(@Validator Player p) {
|
||||
SWUtils.giveItemToPlayer(p, AutostartListener.getWandItem(p));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,6 +50,6 @@ public class AutoStartGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.MEMBER;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
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;
|
||||
|
@ -29,8 +30,11 @@ 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;
|
||||
|
@ -39,11 +43,9 @@ 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.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
@Linked
|
||||
public class AutostartListener implements Listener {
|
||||
|
@ -66,6 +68,7 @@ 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;
|
||||
}
|
||||
|
@ -75,6 +78,12 @@ public class AutostartListener implements Listener {
|
|||
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());
|
||||
}
|
||||
|
||||
|
@ -83,6 +92,7 @@ public class AutostartListener implements Listener {
|
|||
if (!(event.getPlayer() instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
if(!Permission.BUILD.hasPermission((Player) event.getPlayer())) return;
|
||||
if (!ItemUtils.isItem(event.getPlayer().getInventory().getItemInMainHand(), "autostart")) {
|
||||
return;
|
||||
}
|
||||
|
@ -117,15 +127,24 @@ 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", 30, (600 - tickDiff));
|
||||
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT2", preFightDurationInSeconds, ((preFightDurationInSeconds * 20) - 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 Player p) {
|
||||
public void backupCreate(@Validator("owner") 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 Player p, @Mapper("backupName") String backupName) {
|
||||
public void backupLoad(@Validator("owner") Player p, @Mapper("backupName") String backupName) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
|
@ -130,7 +130,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();
|
||||
backupLoad(p, s);
|
||||
p.performCommand("backup load " + s);
|
||||
});
|
||||
swListInv.open();
|
||||
}
|
||||
|
@ -140,13 +140,6 @@ 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)) {
|
||||
|
|
|
@ -1,41 +0,0 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* 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,6 +1,7 @@
|
|||
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.region.Region;
|
||||
import de.steamwar.bausystem.region.flags.Flag;
|
||||
|
@ -12,7 +13,7 @@ import de.steamwar.sql.BauweltMember;
|
|||
import de.steamwar.sql.SteamwarUser;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
@Linked
|
||||
public class InfoCommand extends SWCommand {
|
||||
|
@ -24,17 +25,8 @@ public class InfoCommand extends SWCommand {
|
|||
super("bauinfo");
|
||||
}
|
||||
|
||||
@Register(help = true)
|
||||
public void genericHelp(Player p, String... args) {
|
||||
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_HELP", p);
|
||||
}
|
||||
|
||||
@Register
|
||||
@Register(description = "BAU_INFO_COMMAND_HELP")
|
||||
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()) {
|
||||
|
@ -47,18 +39,28 @@ public class InfoCommand extends SWCommand {
|
|||
}
|
||||
}
|
||||
|
||||
if (Permission.BUILD.hasPermission(p)) {
|
||||
List<BauweltMember> members = BauweltMember.getMembers(bauServer.getOwnerID());
|
||||
StringBuilder membermessage = new StringBuilder();
|
||||
membermessage.append(BauSystem.MESSAGE.parsePrefixed("BAU_INFO_COMMAND_MEMBER", p, members.size()));
|
||||
|
||||
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)
|
||||
));
|
||||
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));
|
||||
}
|
||||
p.sendMessage(membermessage.toString());
|
||||
|
||||
StringBuilder tpsMessage = new StringBuilder();
|
||||
tpsMessage.append(BauSystem.MESSAGE.parsePrefixed("BAU_INFO_COMMAND_TPS", p));
|
||||
|
@ -69,4 +71,16 @@ public class InfoCommand extends SWCommand {
|
|||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,6 +48,6 @@ public class CountingwandGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.WORLDEDIT;
|
||||
return Permission.MEMBER;
|
||||
}
|
||||
}
|
|
@ -44,7 +44,8 @@ public class DesignEndStone {
|
|||
private REntityServer entityServer = new REntityServer();
|
||||
private List<REntity> entities = new ArrayList<>();
|
||||
private Set<Location> locations = new HashSet<>();
|
||||
private List<Player> players = new ArrayList<>();
|
||||
private boolean wsOrAs;
|
||||
private double maxBlastResistance;
|
||||
|
||||
public DesignEndStone(Region region) {
|
||||
this.minX = region.getMinPointBuild().getX();
|
||||
|
@ -53,6 +54,17 @@ 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() {
|
||||
|
@ -64,8 +76,24 @@ 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);
|
||||
// calc(minX, minY, minZ, maxX, minY, maxZ, 0, 1, 0, maxY - minY);
|
||||
calc(minX, maxY, minZ, maxX, maxY, maxZ, 0, -1, 0, maxY - minY);
|
||||
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);
|
||||
}
|
||||
|
||||
private void calc(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int dirX, int dirY, int dirZ, int steps) {
|
||||
|
@ -77,15 +105,16 @@ public class DesignEndStone {
|
|||
int cy = y + step * dirY;
|
||||
int cz = z + step * dirZ;
|
||||
Material material = WORLD.getBlockAt(cx, cy, cz).getType();
|
||||
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) {
|
||||
|
||||
if (material != Material.WATER && material != Material.LAVA && material.getBlastResistance() >= maxBlastResistance) {
|
||||
Location location = new Location(WORLD, cx + 0.5, cy, cz + 0.5);
|
||||
if (locations.contains(location)) break;
|
||||
if (!locations.add(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()) {
|
||||
} else if (!material.isAir() && material != Material.WATER && material != Material.LAVA) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -95,12 +124,10 @@ public class DesignEndStone {
|
|||
}
|
||||
|
||||
public void toggle(Player player) {
|
||||
if (players.contains(player)) {
|
||||
players.remove(player);
|
||||
if (entityServer.getPlayers().contains(player)) {
|
||||
entityServer.removePlayer(player);
|
||||
BauSystem.MESSAGE.sendPrefixless("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);
|
||||
|
@ -108,7 +135,7 @@ public class DesignEndStone {
|
|||
}
|
||||
|
||||
public boolean removePlayer(Player player) {
|
||||
players.remove(player);
|
||||
return players.isEmpty();
|
||||
entityServer.removePlayer(player);
|
||||
return entityServer.getPlayers().isEmpty();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ 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;
|
||||
|
@ -33,6 +34,7 @@ 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
|
||||
|
@ -45,7 +47,7 @@ public class DesignEndStoneCommand extends SWCommand implements Listener {
|
|||
private Map<Region, DesignEndStone> designEndStoneMap = new HashMap<>();
|
||||
|
||||
@Register(description = "DESIGN_ENDSTONE_COMMAND_HELP")
|
||||
public void genericCommand(Player player) {
|
||||
public void genericCommand(@Validator Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (!region.hasType(RegionType.BUILD)) {
|
||||
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player);
|
||||
|
@ -56,14 +58,20 @@ public class DesignEndStoneCommand extends SWCommand implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
Region region = Region.getRegion(event.getPlayer().getLocation());
|
||||
DesignEndStone designEndStone = designEndStoneMap.get(region);
|
||||
if (designEndStone == null) {
|
||||
return;
|
||||
disableDesignEndStone(event.getPlayer());
|
||||
}
|
||||
if (designEndStone.removePlayer(event.getPlayer())) {
|
||||
designEndStoneMap.remove(region);
|
||||
|
||||
@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
|
||||
|
|
|
@ -47,6 +47,6 @@ public class DetonatorBauGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.MEMBER;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,12 +58,12 @@ public class DetonatorCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register(value = "wand", description = "DETONATOR_HELP_WAND")
|
||||
public void giveWand(Player p) {
|
||||
public void giveWand(@Validator Player p) {
|
||||
SWUtils.giveItemToPlayer(p, getWAND(p));
|
||||
}
|
||||
|
||||
@Register(value = "click", description = "DETONATOR_HELP_CLICK")
|
||||
public void clickDetonator(Player p) {
|
||||
public void clickDetonator(@Validator Player p) {
|
||||
Detonator.activateDetonator(new ItemStorage(p));
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
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;
|
||||
|
@ -65,6 +66,7 @@ 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);
|
||||
|
@ -75,6 +77,7 @@ public class DetonatorListener implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (!Detonator.isDetonator(event.getItem())) {
|
||||
return;
|
||||
}
|
||||
|
@ -89,7 +92,7 @@ public class DetonatorListener implements Listener {
|
|||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onPlayerMove(PlayerMoveEvent event) {
|
||||
if (!Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) {
|
||||
if (!Permission.BUILD.hasPermission(event.getPlayer()) ||!Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) {
|
||||
if (Detonator.hasActiveDetonatorShow(event.getPlayer())) {
|
||||
Detonator.hideDetonator(event.getPlayer());
|
||||
}
|
||||
|
@ -110,6 +113,7 @@ 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());
|
||||
}
|
||||
|
@ -117,6 +121,7 @@ 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("GUI_NO_PERMISSION", p);
|
||||
BauSystem.MESSAGE.send("NO_PERMISSION", p);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -108,26 +108,13 @@ public class BauGUI {
|
|||
if (!permission.hasPermission(p)) {
|
||||
List<String> lore = meta.getLore();
|
||||
if (lore == null) {
|
||||
lore = Collections.singletonList(BauSystem.MESSAGE.parse(permissionString(permission), p));
|
||||
lore = Collections.singletonList(BauSystem.MESSAGE.parse("NO_PERMISSION", p));
|
||||
} else {
|
||||
lore.add(BauSystem.MESSAGE.parse(permissionString(permission), p));
|
||||
lore.add(BauSystem.MESSAGE.parse("NO_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(Player p) {
|
||||
public void loadHotbar(@Validator Player p) {
|
||||
DefaultHotbar.setHotbar(p);
|
||||
BauSystem.MESSAGE.send("HOTBAR_LOADED", p);
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
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;
|
||||
|
@ -30,6 +31,7 @@ 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,6 +20,7 @@
|
|||
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;
|
||||
|
@ -38,6 +39,7 @@ 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);
|
||||
|
@ -59,6 +61,7 @@ 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,6 +21,7 @@ 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;
|
||||
|
@ -54,7 +55,7 @@ public class KillcheckerCommand extends SWCommand implements Listener {
|
|||
}
|
||||
|
||||
@Register(value = "enable", description = "KILLCHECKER_HELP_ENABLE")
|
||||
public void genericCommand(Player player, @OptionalValue("-outline") @StaticValue(value = {"-area", "-outline"}, allowISE = true) boolean onlyOutline) {
|
||||
public void genericCommand(@Validator 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();
|
||||
|
@ -74,16 +75,22 @@ 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) {
|
||||
Player player = event.getPlayer();
|
||||
Set<Region> regions = new HashSet<>();
|
||||
visualizers.forEach((region, visualizer) -> {
|
||||
if (visualizer.disconnect(player)) {
|
||||
regions.add(region);
|
||||
hide(event.getPlayer());
|
||||
}
|
||||
|
||||
private void hide(Player player) {
|
||||
new HashSet<>(visualizers.entrySet()).forEach(regionKillcheckerVisualizerEntry -> {
|
||||
if (regionKillcheckerVisualizerEntry.getValue().hide(player)) {
|
||||
visualizers.remove(regionKillcheckerVisualizerEntry.getKey());
|
||||
}
|
||||
});
|
||||
regions.forEach(visualizers::remove);
|
||||
}
|
||||
|
||||
private void recalc(Block block) {
|
||||
|
|
|
@ -34,8 +34,6 @@ 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;
|
||||
|
@ -45,7 +43,22 @@ import java.util.Set;
|
|||
|
||||
public class KillcheckerVisualizer {
|
||||
|
||||
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 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 World WORLD = Bukkit.getWorlds().get(0);
|
||||
|
||||
private static final double SURROUND = 4.5;
|
||||
|
@ -57,9 +70,6 @@ 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;
|
||||
|
||||
|
@ -261,7 +271,7 @@ public class KillcheckerVisualizer {
|
|||
double zPercent = xCount / (double) zArea;
|
||||
percent = (xPercent + yPercent + zPercent) / 3;
|
||||
kills = zKills + yKills + xKills;
|
||||
players.forEach(this::updateBossBar);
|
||||
outline.getPlayers().forEach(this::updateBossBar);
|
||||
|
||||
Set<Point> pointSet = new HashSet<>(killCount.keySet());
|
||||
Set<Point> outlinePointsCacheLast = new HashSet<>(outlinePointsCache);
|
||||
|
@ -356,40 +366,21 @@ public class KillcheckerVisualizer {
|
|||
return new Cuboid(minX, minY, minZ, maxX, maxY, maxZ);
|
||||
}
|
||||
|
||||
public boolean show(Player player, boolean onlyOutline) {
|
||||
public void show(Player player, boolean onlyOutline) {
|
||||
outline.addPlayer(player);
|
||||
if (!onlyOutline) {
|
||||
inner.addPlayer(player);
|
||||
areaPlayers.add(player);
|
||||
} else if (areaPlayers.contains(player)) {
|
||||
} else {
|
||||
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 (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()) {
|
||||
if (outline.getPlayers().isEmpty() && inner.getPlayers().isEmpty()) {
|
||||
outline.close();
|
||||
inner.close();
|
||||
return true;
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
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;
|
||||
|
@ -38,7 +39,10 @@ import org.bukkit.event.Listener;
|
|||
import org.bukkit.event.inventory.ClickType;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public class Loader implements Listener {
|
||||
|
@ -70,12 +74,17 @@ 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()) {
|
||||
|
@ -90,6 +99,20 @@ public class Loader implements Listener {
|
|||
}, 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;
|
||||
|
@ -347,6 +370,7 @@ public class Loader implements Listener {
|
|||
public enum Stage implements EnumDisplay {
|
||||
SETUP("LOADER_SETUP"),
|
||||
RUNNING("LOADER_RUNNING"),
|
||||
SINGLE("LOADER_SINGLE"),
|
||||
PAUSE("LOADER_PAUSE"),
|
||||
END("LOADER_END");
|
||||
|
||||
|
|
|
@ -20,14 +20,15 @@
|
|||
package de.steamwar.bausystem.features.loader;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
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 {
|
||||
public class LoaderCommand extends SWCommand implements Listener {
|
||||
|
||||
public LoaderCommand() {
|
||||
super("loader");
|
||||
|
@ -102,10 +103,20 @@ public class LoaderCommand extends SWCommand {
|
|||
loader.setTicksBetweenBlocks(delay);
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> loaderValidator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), "LOADER_PERMS");
|
||||
};
|
||||
@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();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,6 +43,8 @@ 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 {
|
||||
|
||||
|
@ -124,53 +126,10 @@ public class LoaderRecorder implements Listener {
|
|||
|
||||
addWaitTime(false);
|
||||
Block block = event.getClickedBlock();
|
||||
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;
|
||||
}
|
||||
getLoaderInteractionElement(block, (loaderInteractionElement, s) -> {
|
||||
loaderElementList.add(loaderInteractionElement);
|
||||
message(s);
|
||||
});
|
||||
}
|
||||
|
||||
private Map<Location, Long> blockSet = new HashMap<>();
|
||||
|
@ -226,6 +185,46 @@ 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,6 +20,7 @@
|
|||
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;
|
||||
|
@ -40,6 +41,7 @@ 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) {
|
||||
|
|
|
@ -32,12 +32,12 @@ public class LoadtimerCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register(value = "start", description = "LOADTIMER_HELP_START_1")
|
||||
public void start(Player p) {
|
||||
public void start(@Validator Player p) {
|
||||
start(p, TimerMode.HALF);
|
||||
}
|
||||
|
||||
@Register(value = "start", description = {"LOADTIMER_HELP_START_2", "LOADTIMER_HELP_START_3"})
|
||||
public void start(Player p, TimerMode mode) {
|
||||
public void start(@Validator 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(Player p) {
|
||||
public void stop(@Validator Player p) {
|
||||
Region r = Region.getRegion(p.getLocation());
|
||||
if (r.isGlobal()) return;
|
||||
if (Loadtimer.hasTimer(r))
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
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;
|
||||
|
@ -46,13 +47,13 @@ public class ObserverTracerCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register(value = "delete", description = "OBSERVER_HELP_DELETE")
|
||||
public void delete(Player p) {
|
||||
public void delete(@Validator Player p) {
|
||||
ObserverTracerListener.observerTracerMap.remove(p);
|
||||
BauSystem.MESSAGE.send("OBSERVER_DELETE", p);
|
||||
}
|
||||
|
||||
@Register(value = "retrace", description = "OBSERVER_HELP_RETRACE")
|
||||
public void retrace(Player p) {
|
||||
public void retrace(@Validator Player p) {
|
||||
if (ObserverTracerListener.observerTracerMap.containsKey(p)) {
|
||||
BauSystem.MESSAGE.send("OBSERVER_RETRACE_NO_TRACE", p);
|
||||
return;
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
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;
|
||||
|
@ -55,6 +57,7 @@ public class ObserverTracerListener implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (!enabled.contains(event.getPlayer())) {
|
||||
return;
|
||||
}
|
||||
|
@ -87,6 +90,11 @@ 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());
|
||||
|
|
|
@ -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()), "REGION_COLOR_NO_PERMS");
|
||||
return !messageSender.send(!bauServer.getOwner().equals(player.getUniqueId()), "NO_PERMISSION");
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -46,10 +46,6 @@ public class FireCommand extends SWCommand {
|
|||
}
|
||||
}
|
||||
|
||||
private String getNoPermMessage() {
|
||||
return "REGION_FIRE_NO_PERMS";
|
||||
}
|
||||
|
||||
private String getEnableMessage() {
|
||||
return "REGION_FIRE_ENABLED";
|
||||
}
|
||||
|
@ -69,11 +65,4 @@ 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,10 +46,6 @@ public class FreezeCommand extends SWCommand {
|
|||
}
|
||||
}
|
||||
|
||||
private String getNoPermMessage() {
|
||||
return "REGION_FREEZE_NO_PERMS";
|
||||
}
|
||||
|
||||
private String getEnableMessage(){
|
||||
return "REGION_FREEZE_ENABLED";
|
||||
}
|
||||
|
@ -69,11 +65,4 @@ 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,10 +49,6 @@ public class ItemsCommand extends SWCommand {
|
|||
}
|
||||
}
|
||||
|
||||
private String getNoPermMessage() {
|
||||
return "REGION_ITEMS_NO_PERMS";
|
||||
}
|
||||
|
||||
private String getEnableMessage(){
|
||||
return "REGION_ITEMS_ENABLED";
|
||||
}
|
||||
|
@ -72,11 +68,4 @@ 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());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,13 +54,6 @@ 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,31 +19,39 @@
|
|||
|
||||
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.Prototype;
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
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;
|
||||
|
@ -71,7 +79,7 @@ public class RegionCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register(value = "undo", description = "REGION_REGION_HELP_UNDO")
|
||||
public void undoCommand(@Validator("WORLD_EDIT") Player p) {
|
||||
public void undoCommand(@Validator Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) return;
|
||||
|
||||
|
@ -83,7 +91,7 @@ public class RegionCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register(value = "redo", description = "REGION_REGION_HELP_REDO")
|
||||
public void redoCommand(@Validator("WORLD_EDIT") Player p) {
|
||||
public void redoCommand(@Validator Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
|
@ -97,7 +105,7 @@ public class RegionCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register(value = "restore", description = "REGION_REGION_HELP_RESTORE")
|
||||
public void genericRestoreCommand(@Validator("WORLD_EDIT") Player p) {
|
||||
public void genericRestoreCommand(@Validator Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if(checkGlobalRegion(region, p)) return;
|
||||
|
||||
|
@ -114,7 +122,7 @@ public class RegionCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register(value = "restore", description = "REGION_REGION_HELP_RESTORE_SCHEMATIC")
|
||||
public void schematicRestoreCommand(@Validator("WORLD_EDIT") Player p, SchematicNode node) {
|
||||
public void schematicRestoreCommand(@Validator Player p, SchematicNode node) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) return;
|
||||
|
||||
|
@ -164,36 +172,6 @@ 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) {
|
||||
|
@ -210,7 +188,7 @@ public class RegionCommand extends SWCommand {
|
|||
|
||||
@Register(value = "changeskin", description = "REGION_REGION_HELP_CHANGESKIN")
|
||||
@Register("skin")
|
||||
public void changeSkinCommand(@Validator("WORLD") Player p, @Mapper("skinTypeMapper") String s) {
|
||||
public void changeSkinCommand(@Validator Player p, @Mapper("skinTypeMapper") String s) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
|
@ -227,26 +205,106 @@ public class RegionCommand extends SWCommand {
|
|||
}
|
||||
}
|
||||
|
||||
@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;
|
||||
@Register(value = "copy", description = "REGION_REGION_HELP_COPY")
|
||||
public void copyCommand(@Validator Player p, @OptionalValue("") @StaticValue(value = {"", "-e", "-s"}, allowISE = true) int option) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
if (region.isGlobal()) {
|
||||
return Collections.emptyList();
|
||||
if (checkGlobalRegion(region, p)) {
|
||||
return;
|
||||
}
|
||||
return region.getPrototypes().stream().map(Prototype::getByName).map(Prototype::getDisplayName).map(c -> c.replace(' ', '_')).collect(Collectors.toList());
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||
return s.replace('_', ' ');
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
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>() {
|
||||
|
@ -266,18 +324,4 @@ 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,13 +97,6 @@ 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()) {
|
||||
|
|
|
@ -157,11 +157,4 @@ 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");
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -157,11 +157,6 @@ 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.WORLDEDIT), "REGION_TB_NO_PERMS");
|
||||
}
|
||||
|
||||
private Region regionCheck(Player player) {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (!region.hasType(RegionType.TESTBLOCK)) {
|
||||
|
|
|
@ -57,6 +57,6 @@ public class FireBauGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.WORLD;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,6 +57,6 @@ public class FreezeBauGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.WORLD;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,6 +58,6 @@ public class ProtectBauGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.WORLDEDIT;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,6 +65,6 @@ public class ResetBauGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.WORLDEDIT;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,6 +64,6 @@ public class TestblockBauGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.WORLDEDIT;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,6 +116,6 @@ public class TntBauGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.WORLD;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ public class ScriptCommand extends SWCommand {
|
|||
}
|
||||
|
||||
@Register
|
||||
public void genericCommand(Player player) {
|
||||
public void genericCommand(@Validator Player player) {
|
||||
ScriptGUI.open(player);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
|
||||
package de.steamwar.bausystem.features.script;
|
||||
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -42,6 +44,8 @@ public class ScriptListener implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onLeftClick(PlayerInteractEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
|
||||
ItemStack item = event.getItem();
|
||||
if (item == null || FlatteningWrapper.impl.isNoBook(item) || item.getItemMeta() == null) {
|
||||
return;
|
||||
|
@ -68,6 +72,13 @@ public class ScriptListener implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
ScriptRunner.updateGlobalScript(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||
event.getNewSpectator().forEach(ScriptRunner::remove);
|
||||
event.getNewBuilder().forEach(ScriptRunner::updateGlobalScript);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
package de.steamwar.bausystem.features.script.event;
|
||||
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.script.ScriptRunner;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -41,6 +42,7 @@ public class CommandListener implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
String[] split = event.getMessage().split(" ");
|
||||
if (calledCommands.getOrDefault(event.getPlayer(), new HashSet<>()).contains(split[0])) {
|
||||
return;
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
package de.steamwar.bausystem.features.script.event;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.script.ScriptRunner;
|
||||
import de.steamwar.bausystem.features.script.lua.SteamWarGlobalLuaPlugin;
|
||||
import de.steamwar.bausystem.features.script.lua.libs.StorageLib;
|
||||
|
@ -64,17 +65,20 @@ public class EventListener implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.SelfJoin, LuaValue.NIL, event);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
StorageLib.removePlayer(event.getPlayer());
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.SelfLeave, LuaValue.NIL, event);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (LAST_FS.containsKey(event.getPlayer())) {
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.DoubleSwap, LuaValue.NIL, event);
|
||||
|
@ -86,6 +90,7 @@ public class EventListener implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockPlace(BlockPlaceEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
LuaTable table = new LuaTable();
|
||||
table.set("x", event.getBlock().getX());
|
||||
table.set("y", event.getBlock().getY());
|
||||
|
@ -96,6 +101,7 @@ public class EventListener implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
LuaTable table = new LuaTable();
|
||||
table.set("x", event.getBlock().getX());
|
||||
table.set("y", event.getBlock().getY());
|
||||
|
@ -108,6 +114,7 @@ public class EventListener implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (ignore.remove(event.getPlayer())) {
|
||||
return;
|
||||
}
|
||||
|
@ -125,6 +132,7 @@ public class EventListener implements Listener {
|
|||
table.set("blockY", event.getClickedBlock().getY());
|
||||
table.set("blockZ", event.getClickedBlock().getZ());
|
||||
table.set("blockFace", event.getBlockFace().name());
|
||||
table.set("blockType", event.getClickedBlock().getType().name());
|
||||
} else {
|
||||
table.set("hasBlock", LuaValue.valueOf(false));
|
||||
}
|
||||
|
@ -144,6 +152,7 @@ public class EventListener implements Listener {
|
|||
Region tntRegion = Region.getRegion(event.getLocation());
|
||||
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if(!Permission.BUILD.hasPermission(player)) continue;
|
||||
if (tntRegion.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) {
|
||||
ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.TNTSpawn, LuaValue.NIL, event);
|
||||
}
|
||||
|
@ -165,6 +174,7 @@ public class EventListener implements Listener {
|
|||
boolean inBuild = event.blockList().stream().anyMatch(block -> tntRegion.inRegion(block.getLocation(), RegionType.BUILD, RegionExtensionType.EXTENSION));
|
||||
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if(!Permission.BUILD.hasPermission(player)) continue;
|
||||
if (tntRegion.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) {
|
||||
ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.TNTExplode, table, event);
|
||||
if (inBuild) {
|
||||
|
@ -176,6 +186,7 @@ public class EventListener implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
ignore.add(event.getPlayer());
|
||||
LuaTable table = new LuaTable();
|
||||
table.set("type", event.getItemDrop().getItemStack().getType().name());
|
||||
|
@ -185,6 +196,7 @@ public class EventListener implements Listener {
|
|||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onEntityDeath(EntityDeathEvent event) {
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if(!Permission.BUILD.hasPermission(player)) continue;
|
||||
LuaTable table = new LuaTable();
|
||||
table.set("type", event.getEntityType().name());
|
||||
ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.EntityDeath, table, event);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
package de.steamwar.bausystem.features.script.event;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.script.ScriptRunner;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.api.Plain;
|
||||
|
@ -36,6 +37,7 @@ public class HotkeyListener implements PluginMessageListener, Plain {
|
|||
|
||||
@Override
|
||||
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
|
||||
if(!Permission.BUILD.hasPermission(player)) return;
|
||||
if (!channel.equals("sw:hotkeys")) return;
|
||||
if (message.length < 5) return;
|
||||
int action = message[4] & 0xFF;
|
||||
|
|
|
@ -22,15 +22,21 @@ package de.steamwar.bausystem.features.script.lua;
|
|||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
import com.sk89q.worldedit.bukkit.BukkitPlayer;
|
||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
||||
import com.sk89q.worldedit.event.platform.CommandEvent;
|
||||
import com.sk89q.worldedit.extension.platform.Actor;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.configplayer.Config;
|
||||
import de.steamwar.bausystem.features.script.ScriptRunner;
|
||||
import de.steamwar.bausystem.features.script.lua.libs.LuaLib;
|
||||
import de.steamwar.bausystem.features.world.WorldEditListener;
|
||||
import de.steamwar.bausystem.utils.WorldEditUtils;
|
||||
import de.steamwar.inventory.SWAnvilInv;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -39,11 +45,10 @@ import org.luaj.vm2.LuaFunction;
|
|||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
import org.luaj.vm2.lib.OneArgFunction;
|
||||
import org.luaj.vm2.lib.ThreeArgFunction;
|
||||
import org.luaj.vm2.lib.TwoArgFunction;
|
||||
import org.luaj.vm2.lib.VarArgFunction;
|
||||
import org.luaj.vm2.lib.*;
|
||||
|
||||
import java.lang.reflect.Proxy;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
|
||||
|
@ -102,14 +107,7 @@ public class SteamWarLuaPlugin extends TwoArgFunction {
|
|||
double x = arg1.checkdouble();
|
||||
double y = arg2.checkdouble();
|
||||
double z = arg3.checkdouble();
|
||||
|
||||
Location loc = new Location(player.getWorld(), x, y, z);
|
||||
|
||||
return tableOf(new LuaValue[] {
|
||||
valueOf("x"), valueOf(loc.getBlockX()),
|
||||
valueOf("y"), valueOf(loc.getBlockY()),
|
||||
valueOf("z"), valueOf(loc.getBlockZ())
|
||||
});
|
||||
return pos(x, y, z);
|
||||
}
|
||||
});
|
||||
env.set("exec", new VarArgFunction() {
|
||||
|
@ -122,6 +120,7 @@ public class SteamWarLuaPlugin extends TwoArgFunction {
|
|||
return LuaValue.NIL;
|
||||
}
|
||||
|
||||
command = preprocessEvent.getMessage().substring(1);
|
||||
Bukkit.getLogger().log(Level.INFO, player.getName() + " dispatched command: " + command);
|
||||
String[] commandSplit = command.split(" ");
|
||||
if (!commandSplit[0].equals("select") && hasFAWE && WorldEditListener.isWorldEditCommand("/" + commandSplit[0])) {
|
||||
|
@ -166,11 +165,86 @@ public class SteamWarLuaPlugin extends TwoArgFunction {
|
|||
env.set("rawget", NIL);
|
||||
env.set("rawlen", NIL);
|
||||
env.set("rawset", NIL);
|
||||
env.set("setmetatable", NIL);
|
||||
env.set("xpcall", NIL);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static LuaTable pos(double x, double y, double z) {
|
||||
LuaTable position = new LuaTable();
|
||||
position.set("x", x);
|
||||
position.set("y", y);
|
||||
position.set("z", z);
|
||||
|
||||
position.set("add", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue luaValue) {
|
||||
LuaTable table = luaValue.checktable();
|
||||
double dx = table.get("x").checkdouble();
|
||||
double dy = table.get("y").checkdouble();
|
||||
double dz = table.get("z").checkdouble();
|
||||
return pos(x + dx, y + dy, z + dz);
|
||||
}
|
||||
});
|
||||
|
||||
position.set("subtract", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue luaValue) {
|
||||
LuaTable table = luaValue.checktable();
|
||||
double dx = table.get("x").checkdouble();
|
||||
double dy = table.get("y").checkdouble();
|
||||
double dz = table.get("z").checkdouble();
|
||||
return pos(x - dx, y - dy, z - dz);
|
||||
}
|
||||
});
|
||||
|
||||
position.set("addX", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue luaValue) {
|
||||
return pos(x + luaValue.checkdouble(), y, z);
|
||||
}
|
||||
});
|
||||
position.set("subtractX", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue luaValue) {
|
||||
return pos(x - luaValue.checkdouble(), y, z);
|
||||
}
|
||||
});
|
||||
position.set("addY", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue luaValue) {
|
||||
return pos(x, y + luaValue.checkdouble(), z);
|
||||
}
|
||||
});
|
||||
position.set("subtractY", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue luaValue) {
|
||||
return pos(x, y - luaValue.checkdouble(), z);
|
||||
}
|
||||
});
|
||||
position.set("addZ", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue luaValue) {
|
||||
return pos(x, y, z + luaValue.checkdouble());
|
||||
}
|
||||
});
|
||||
position.set("subtractZ", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue luaValue) {
|
||||
return pos(x, y, z - luaValue.checkdouble());
|
||||
}
|
||||
});
|
||||
|
||||
position.set("blockPos", new ZeroArgFunction() {
|
||||
@Override
|
||||
public LuaValue call() {
|
||||
Location location = new Location(Bukkit.getWorlds().get(0), x, y, z);
|
||||
return pos(location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||
}
|
||||
});
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
public static String varArgsToString(Varargs args) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (int i = 1; i <= args.narg(); i++) {
|
||||
|
@ -192,7 +266,7 @@ public class SteamWarLuaPlugin extends TwoArgFunction {
|
|||
class Print extends VarArgFunction {
|
||||
@Override
|
||||
public Varargs invoke(Varargs args) {
|
||||
player.sendMessage(varArgsToString(args));
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', varArgsToString(args)));
|
||||
return LuaValue.NIL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
package de.steamwar.bausystem.features.script.lua.libs;
|
||||
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.luaj.vm2.*;
|
||||
|
@ -69,6 +70,15 @@ public interface LuaLib {
|
|||
return de.steamwar.bausystem.features.script.lua.SteamWarLuaPlugin.varArgsToString(varargs);
|
||||
}
|
||||
|
||||
default LuaTable toPos(Point point) {
|
||||
if (point == null) return LuaTable.tableOf();
|
||||
return LuaValue.tableOf(new LuaValue[] {
|
||||
LuaValue.valueOf("x"), LuaValue.valueOf(point.getX()),
|
||||
LuaValue.valueOf("y"), LuaValue.valueOf(point.getY()),
|
||||
LuaValue.valueOf("z"), LuaValue.valueOf(point.getZ())
|
||||
});
|
||||
}
|
||||
|
||||
default Class<? extends LuaLib> parent() {
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -19,9 +19,11 @@
|
|||
|
||||
package de.steamwar.bausystem.features.script.lua.libs;
|
||||
|
||||
import de.steamwar.bausystem.features.script.lua.SteamWarLuaPlugin;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
|
@ -43,6 +45,12 @@ public class PlayerLib implements LuaLib {
|
|||
table.set("chat", new Print(player));
|
||||
table.set("actionbar", new SendActionbar(player));
|
||||
|
||||
table.set("pos", getter(() -> {
|
||||
return SteamWarLuaPlugin.pos(player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ());
|
||||
}));
|
||||
table.set("blockPos", getter(() -> {
|
||||
return SteamWarLuaPlugin.pos(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ());
|
||||
}));
|
||||
table.set("x", getterAndSetter("x", () -> player.getLocation().getX(), x -> {
|
||||
Location location = player.getLocation();
|
||||
location.setX(x);
|
||||
|
@ -93,7 +101,7 @@ public class PlayerLib implements LuaLib {
|
|||
|
||||
@Override
|
||||
public Varargs invoke(Varargs args) {
|
||||
player.sendMessage(varArgsToString(args));
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', varArgsToString(args)));
|
||||
return LuaValue.NIL;
|
||||
}
|
||||
}
|
||||
|
@ -107,7 +115,7 @@ public class PlayerLib implements LuaLib {
|
|||
|
||||
@Override
|
||||
public Varargs invoke(Varargs args) {
|
||||
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(varArgsToString(args)));
|
||||
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', varArgsToString(args))));
|
||||
return LuaValue.NIL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,9 +20,6 @@
|
|||
package de.steamwar.bausystem.features.script.lua.libs;
|
||||
|
||||
import de.steamwar.bausystem.features.loader.Loader;
|
||||
import de.steamwar.bausystem.features.tracer.record.ActiveTracer;
|
||||
import de.steamwar.bausystem.features.tracer.record.AutoTraceRecorder;
|
||||
import de.steamwar.bausystem.features.tracer.record.Recorder;
|
||||
import de.steamwar.bausystem.region.GlobalRegion;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.flags.Flag;
|
||||
|
@ -71,17 +68,28 @@ public class RegionLib implements LuaLib {
|
|||
table.set("freeze", getter(() -> region.get().getPlain(Flag.FREEZE, FreezeMode.class) == FreezeMode.ACTIVE));
|
||||
table.set("protect", getter(() -> region.get().getPlain(Flag.PROTECT, ProtectMode.class) == ProtectMode.ACTIVE));
|
||||
|
||||
LuaValue traceLib = LuaValue.tableOf();
|
||||
traceLib.set("active", getter(() -> !region.get().isGlobal() && Recorder.INSTANCE.get(region.get()) instanceof ActiveTracer));
|
||||
traceLib.set("auto", getter(() -> !region.get().isGlobal() && Recorder.INSTANCE.get(region.get()) instanceof AutoTraceRecorder));
|
||||
traceLib.set("status", getter(() -> Recorder.INSTANCE.get(region.get()).scriptState()));
|
||||
traceLib.set("time", getter(() -> Recorder.INSTANCE.get(region.get()).scriptTime()));
|
||||
//LuaValue traceLib = LuaValue.tableOf();
|
||||
//traceLib.set("active", getter(() -> !region.get().isGlobal() && Recorder.INSTANCE.get(region.get()) instanceof ActiveTracer));
|
||||
//traceLib.set("auto", getter(() -> !region.get().isGlobal() && Recorder.INSTANCE.get(region.get()) instanceof AutoTraceRecorder));
|
||||
//traceLib.set("status", getter(() -> Recorder.INSTANCE.get(region.get()).scriptState()));
|
||||
//traceLib.set("time", getter(() -> Recorder.INSTANCE.get(region.get()).scriptTime()));
|
||||
|
||||
table.set("trace", traceLib);
|
||||
//table.set("trace", traceLib);
|
||||
|
||||
Loader loader = Loader.getLoader(player);
|
||||
table.set("loader", getter(() -> loader == null ? "OFF" : loader.getStage().name()));
|
||||
|
||||
table.set("copyPoint", getter(() -> toPos(region.get().getCopyPoint())));
|
||||
table.set("minPointBuild", getter(() -> toPos(region.get().getMinPointBuild())));
|
||||
table.set("maxPointBuild", getter(() -> toPos(region.get().getMaxPointBuild())));
|
||||
table.set("minPointBuildExtension", getter(() -> toPos(region.get().getMinPointBuildExtension())));
|
||||
table.set("maxPointBuildExtension", getter(() -> toPos(region.get().getMaxPointBuildExtension())));
|
||||
table.set("testblockPoint", getter(() -> toPos(region.get().getTestBlockPoint())));
|
||||
table.set("minPointTestblock", getter(() -> toPos(region.get().getMinPointTestblock())));
|
||||
table.set("maxPointTestblock", getter(() -> toPos(region.get().getMaxPointTestblock())));
|
||||
table.set("minPointTestblockExtension", getter(() -> toPos(region.get().getMinPointTestblockExtension())));
|
||||
table.set("maxPointTestblockExtension", getter(() -> toPos(region.get().getMaxPointTestblockExtension())));
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* 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.script.lua.libs;
|
||||
|
||||
import de.steamwar.bausystem.features.world.BauScoreboard;
|
||||
import de.steamwar.bausystem.utils.ScoreboardElement;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
import org.luaj.vm2.Varargs;
|
||||
import org.luaj.vm2.lib.TwoArgFunction;
|
||||
import org.luaj.vm2.lib.VarArgFunction;
|
||||
|
||||
@Linked
|
||||
public class ScoreboardLib implements LuaLib {
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "scoreboard";
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaTable get(Player player) {
|
||||
LuaTable luaTable = new LuaTable();
|
||||
|
||||
LuaTable groups = new LuaTable();
|
||||
for (ScoreboardElement.ScoreboardGroup group : ScoreboardElement.ScoreboardGroup.values()) {
|
||||
groups.set(group.name(), group.ordinal());
|
||||
}
|
||||
luaTable.set("group", groups);
|
||||
|
||||
luaTable.set("element", new VarArgFunction() {
|
||||
@Override
|
||||
public Varargs invoke(Varargs varargs) {
|
||||
if (varargs.narg() < 2) {
|
||||
return NIL;
|
||||
}
|
||||
String elementKey = varargs.arg(1).checkjstring();
|
||||
ScoreboardElement.ScoreboardGroup elementGroup = ScoreboardElement.ScoreboardGroup.values()[varargs.arg(2).checkint()];
|
||||
int priority = varargs.narg() > 2 ? varargs.arg(2).checkint() : Integer.MAX_VALUE;
|
||||
|
||||
return new VarArgFunction() {
|
||||
@Override
|
||||
public Varargs invoke(Varargs args) {
|
||||
if (args.narg() == 0) {
|
||||
BauScoreboard.setAdditionalElement(player, elementKey, elementGroup, priority, null);
|
||||
} else {
|
||||
BauScoreboard.setAdditionalElement(player, elementKey, elementGroup, priority, args.arg1().checkjstring());
|
||||
}
|
||||
return NIL;
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
return luaTable;
|
||||
}
|
||||
}
|
|
@ -20,11 +20,15 @@
|
|||
package de.steamwar.bausystem.features.script.lua.libs;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.loader.Loader;
|
||||
import de.steamwar.bausystem.features.loader.LoaderRecorder;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
import de.steamwar.core.TPSWatcher;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.luaj.vm2.LuaString;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
|
@ -46,10 +50,14 @@ public class ServerLib implements LuaLib {
|
|||
public LuaTable get(Player player) {
|
||||
LuaTable serverLib = LuaValue.tableOf();
|
||||
serverLib.set("time", getter(() -> new SimpleDateFormat(BauSystem.MESSAGE.parse("TIME", player)).format(Calendar.getInstance().getTime())));
|
||||
serverLib.set("onlinePlayerCount", getter(Bukkit.getOnlinePlayers()::size));
|
||||
serverLib.set("ticks", getter(TPSUtils.currentTick));
|
||||
serverLib.set("getBlockAt", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg1) {
|
||||
if (!Permission.SUPERVISOR.hasPermission(player)) {
|
||||
return LuaValue.NIL;
|
||||
}
|
||||
LuaTable pos = arg1.checktable();
|
||||
return valueOf(player.getWorld().getBlockAt(pos.get("x").checkint(), pos.get("y").checkint(), pos.get("z").checkint()).getType().name());
|
||||
}
|
||||
|
@ -57,6 +65,9 @@ public class ServerLib implements LuaLib {
|
|||
serverLib.set("setBlockAt", new TwoArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg1, LuaValue arg2) {
|
||||
if (!Permission.SUPERVISOR.hasPermission(player)) {
|
||||
return LuaValue.NIL;
|
||||
}
|
||||
LuaTable pos = arg1.checktable();
|
||||
LuaString material = arg2.checkstring();
|
||||
Material mat = SWItem.getMaterial(material.tojstring());
|
||||
|
@ -67,17 +78,19 @@ public class ServerLib implements LuaLib {
|
|||
return NIL;
|
||||
}
|
||||
});
|
||||
|
||||
LuaValue tpsLib = LuaValue.tableOf();
|
||||
tpsLib.set("oneSecond", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_SECOND)));
|
||||
tpsLib.set("tenSecond", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_SECONDS)));
|
||||
tpsLib.set("oneMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_MINUTE)));
|
||||
tpsLib.set("fiveMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES)));
|
||||
tpsLib.set("tenMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES)));
|
||||
tpsLib.set("current", getter(TPSWatcher::getTPS));
|
||||
// tpsLib.set("limit", getter(TPSLimitUtils::getCurrentTPSLimit));
|
||||
|
||||
serverLib.set("tps", tpsLib);
|
||||
serverLib.set("interactAt", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg1) {
|
||||
LuaTable pos = arg1.checktable();
|
||||
Block block = player.getWorld().getBlockAt(pos.get("x").checkint(), pos.get("y").checkint(), pos.get("z").checkint());
|
||||
LoaderRecorder.getLoaderInteractionElement(block, (loaderInteractionElement, s) -> {
|
||||
loaderInteractionElement.execute(aLong -> {
|
||||
// Ignore
|
||||
});
|
||||
});
|
||||
return NIL;
|
||||
}
|
||||
});
|
||||
return serverLib;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,8 +19,14 @@
|
|||
|
||||
package de.steamwar.bausystem.features.script.lua.libs;
|
||||
|
||||
import com.google.gson.*;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.core.Core;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.api.Disable;
|
||||
import de.steamwar.linkage.api.Enable;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
import org.luaj.vm2.LuaValue;
|
||||
|
@ -29,15 +35,173 @@ import org.luaj.vm2.lib.OneArgFunction;
|
|||
import org.luaj.vm2.lib.TwoArgFunction;
|
||||
import org.luaj.vm2.lib.VarArgFunction;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
@Linked
|
||||
public class StorageLib implements LuaLib {
|
||||
public class StorageLib implements LuaLib, Enable, Disable {
|
||||
|
||||
private final Gson gson = new Gson();
|
||||
private final File storageDirectory = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "script_storage");
|
||||
|
||||
private static final HashMap<String, LuaValue> GLOBAL_STORAGE = new HashMap<>();
|
||||
private static final HashMap<Player, HashMap<String, LuaValue>> PLAYER_STORAGE = new HashMap<>();
|
||||
private static final HashMap<UUID, HashMap<String, LuaValue>> PLAYER_STORAGE = new HashMap<>();
|
||||
private static final HashMap<Region, HashMap<String, LuaValue>> REGION_STORAGE = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void enable() {
|
||||
if (Core.getVersion() <= 15) return;
|
||||
if (!storageDirectory.exists()) storageDirectory.mkdirs();
|
||||
|
||||
try {
|
||||
JsonObject jsonObject = JsonParser.parseReader(new FileReader(new File(storageDirectory, "global.json"))).getAsJsonObject();
|
||||
jsonObject.keySet().forEach(key -> {
|
||||
GLOBAL_STORAGE.put(key, fromJson(jsonObject.get(key)));
|
||||
});
|
||||
} catch (Exception e) {}
|
||||
|
||||
File regionStorageDirectory = new File(storageDirectory, "region");
|
||||
regionStorageDirectory.mkdirs();
|
||||
for (File regionStorage : regionStorageDirectory.listFiles()) {
|
||||
try {
|
||||
JsonObject jsonObject = JsonParser.parseReader(new FileReader(regionStorage)).getAsJsonObject();
|
||||
HashMap<String, LuaValue> map = new HashMap<>();
|
||||
jsonObject.keySet().forEach(key -> {
|
||||
map.put(key, fromJson(jsonObject.get(key)));
|
||||
});
|
||||
Region region = Region.getREGION_MAP().get(regionStorage.getName().substring(0, regionStorage.getName().length() - ".json".length()));
|
||||
REGION_STORAGE.put(region, map);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
File playerStorageDirectory = new File(storageDirectory, "player");
|
||||
playerStorageDirectory.mkdirs();
|
||||
for (File playerStorage : playerStorageDirectory.listFiles()) {
|
||||
try {
|
||||
JsonObject jsonObject = JsonParser.parseReader(new FileReader(playerStorage)).getAsJsonObject();
|
||||
HashMap<String, LuaValue> map = new HashMap<>();
|
||||
jsonObject.keySet().forEach(key -> {
|
||||
map.put(key, fromJson(jsonObject.get(key)));
|
||||
});
|
||||
SteamwarUser steamwarUser = SteamwarUser.get(Integer.parseInt(playerStorage.getName().substring(0, playerStorage.getName().length() - ".json".length())));
|
||||
PLAYER_STORAGE.put(steamwarUser.getUUID(), map);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
}
|
||||
|
||||
private LuaValue fromJson(JsonElement jsonElement) {
|
||||
if (jsonElement.isJsonNull()) {
|
||||
return LuaValue.NIL;
|
||||
}
|
||||
if (jsonElement.isJsonPrimitive()) {
|
||||
JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive();
|
||||
if (jsonPrimitive.isBoolean()) {
|
||||
return LuaValue.valueOf(jsonPrimitive.getAsBoolean());
|
||||
}
|
||||
if (jsonPrimitive.isNumber()) {
|
||||
try {
|
||||
return LuaValue.valueOf(jsonPrimitive.getAsInt());
|
||||
} catch (NumberFormatException e) {}
|
||||
try {
|
||||
return LuaValue.valueOf(jsonPrimitive.getAsDouble());
|
||||
} catch (NumberFormatException e) {}
|
||||
}
|
||||
if (jsonPrimitive.isString()) {
|
||||
return LuaValue.valueOf(jsonPrimitive.getAsString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
if (jsonElement.isJsonObject()) {
|
||||
JsonObject jsonObject = jsonElement.getAsJsonObject();
|
||||
LuaTable luaTable = new LuaTable();
|
||||
jsonObject.keySet().forEach(string -> {
|
||||
LuaValue value = fromJson(jsonObject.get(string));
|
||||
if (value == null) return;
|
||||
luaTable.set(string, value);
|
||||
});
|
||||
return luaTable;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable() {
|
||||
if (Core.getVersion() <= 15) return;
|
||||
if (!storageDirectory.exists()) storageDirectory.mkdirs();
|
||||
try {
|
||||
FileWriter fileWriter = new FileWriter(new File(storageDirectory, "global.json"));
|
||||
gson.toJson(toJson(GLOBAL_STORAGE), fileWriter);
|
||||
fileWriter.close();
|
||||
} catch (IOException e) {}
|
||||
|
||||
File regionStorageDirectory = new File(storageDirectory, "region");
|
||||
regionStorageDirectory.mkdirs();
|
||||
for (Map.Entry<Region, HashMap<String, LuaValue>> entry : REGION_STORAGE.entrySet()) {
|
||||
try {
|
||||
FileWriter fileWriter = new FileWriter(new File(regionStorageDirectory, entry.getKey().getName() + ".json"));
|
||||
gson.toJson(toJson(entry.getValue()), fileWriter);
|
||||
fileWriter.close();
|
||||
} catch (IOException e) {}
|
||||
}
|
||||
|
||||
File playerStorageDirectory = new File(storageDirectory, "player");
|
||||
playerStorageDirectory.mkdirs();
|
||||
for (Map.Entry<UUID, HashMap<String, LuaValue>> entry : PLAYER_STORAGE.entrySet()) {
|
||||
try {
|
||||
FileWriter fileWriter = new FileWriter(new File(playerStorageDirectory, SteamwarUser.get(entry.getKey()).getId() + ".json"));
|
||||
gson.toJson(toJson(entry.getValue()), fileWriter);
|
||||
fileWriter.close();
|
||||
} catch (IOException e) {}
|
||||
}
|
||||
}
|
||||
|
||||
private JsonObject toJson(HashMap<String, LuaValue> valueMap) {
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
valueMap.forEach((string, luaValue) -> {
|
||||
JsonElement value = toJson(luaValue);
|
||||
if (value == null) return;
|
||||
jsonObject.add(string, value);
|
||||
});
|
||||
return jsonObject;
|
||||
}
|
||||
|
||||
private JsonElement toJson(LuaValue luaValue) {
|
||||
if (luaValue.isnil()) {
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
try {
|
||||
return new JsonPrimitive(luaValue.checkboolean());
|
||||
} catch (Exception e) {}
|
||||
try {
|
||||
return new JsonPrimitive(luaValue.checkint());
|
||||
} catch (Exception e) {}
|
||||
try {
|
||||
return new JsonPrimitive(luaValue.checkdouble());
|
||||
} catch (Exception e) {}
|
||||
|
||||
if (luaValue.isstring()) {
|
||||
return new JsonPrimitive(luaValue.tojstring());
|
||||
}
|
||||
if (luaValue.istable()) {
|
||||
LuaTable luaTable = luaValue.checktable();
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
for (LuaValue key : luaTable.keys()) {
|
||||
JsonElement value = toJson(luaTable.get(key));
|
||||
if (value == null) continue;
|
||||
try {
|
||||
jsonObject.add(key.checkjstring(), value);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
return jsonObject;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "storage";
|
||||
|
@ -92,7 +256,7 @@ public class StorageLib implements LuaLib {
|
|||
storageLib.set("global", global);
|
||||
|
||||
LuaTable playerStorage = new LuaTable();
|
||||
HashMap<String, LuaValue> playerStorageMap = PLAYER_STORAGE.computeIfAbsent(player, k -> new HashMap<>());
|
||||
HashMap<String, LuaValue> playerStorageMap = PLAYER_STORAGE.computeIfAbsent(player.getUniqueId(), k -> new HashMap<>());
|
||||
playerStorage.set("get", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg) {
|
||||
|
@ -137,34 +301,38 @@ public class StorageLib implements LuaLib {
|
|||
storageLib.set("player", playerStorage);
|
||||
|
||||
LuaTable regionStorage = new LuaTable();
|
||||
HashMap<String, LuaValue> regionStorageMap = REGION_STORAGE.computeIfAbsent(Region.getRegion(player.getLocation()), k -> new HashMap<>());
|
||||
regionStorage.set("get", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg) {
|
||||
HashMap<String, LuaValue> regionStorageMap = REGION_STORAGE.computeIfAbsent(Region.getRegion(player.getLocation()), k -> new HashMap<>());
|
||||
return regionStorageMap.getOrDefault(arg.checkjstring(), NIL);
|
||||
}
|
||||
});
|
||||
regionStorage.set("set", new TwoArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg1, LuaValue arg2) {
|
||||
HashMap<String, LuaValue> regionStorageMap = REGION_STORAGE.computeIfAbsent(Region.getRegion(player.getLocation()), k -> new HashMap<>());
|
||||
return regionStorageMap.put(arg1.checkjstring(), arg2);
|
||||
}
|
||||
});
|
||||
regionStorage.set("has", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg) {
|
||||
HashMap<String, LuaValue> regionStorageMap = REGION_STORAGE.computeIfAbsent(Region.getRegion(player.getLocation()), k -> new HashMap<>());
|
||||
return valueOf(regionStorageMap.containsKey(arg.checkjstring()));
|
||||
}
|
||||
});
|
||||
regionStorage.set("remove", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg) {
|
||||
HashMap<String, LuaValue> regionStorageMap = REGION_STORAGE.computeIfAbsent(Region.getRegion(player.getLocation()), k -> new HashMap<>());
|
||||
return regionStorageMap.remove(arg.checkjstring());
|
||||
}
|
||||
});
|
||||
regionStorage.set("accessor", new OneArgFunction() {
|
||||
@Override
|
||||
public LuaValue call(LuaValue arg) {
|
||||
HashMap<String, LuaValue> regionStorageMap = REGION_STORAGE.computeIfAbsent(Region.getRegion(player.getLocation()), k -> new HashMap<>());
|
||||
String key = arg.checkjstring();
|
||||
return new VarArgFunction() {
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* 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.script.lua.libs;
|
||||
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSSystem;
|
||||
import de.steamwar.core.TPSWatcher;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.LinkedInstance;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.luaj.vm2.LuaTable;
|
||||
|
||||
@Linked
|
||||
public class TpsLib implements LuaLib {
|
||||
|
||||
@LinkedInstance
|
||||
public TPSSystem tpsSystem;
|
||||
|
||||
@Override
|
||||
public Class<? extends LuaLib> parent() {
|
||||
return ServerLib.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "tps";
|
||||
}
|
||||
|
||||
@Override
|
||||
public LuaTable get(Player player) {
|
||||
LuaTable tpsLib = new LuaTable();
|
||||
tpsLib.set("oneSecond", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_SECOND)));
|
||||
tpsLib.set("tenSecond", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_SECONDS)));
|
||||
tpsLib.set("oneMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_MINUTE)));
|
||||
tpsLib.set("fiveMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES)));
|
||||
tpsLib.set("tenMinute", getter(() -> TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES)));
|
||||
tpsLib.set("current", getter(TPSWatcher::getTPS));
|
||||
tpsLib.set("limit", getter(tpsSystem::getCurrentTPSLimit));
|
||||
return tpsLib;
|
||||
}
|
||||
}
|
|
@ -20,8 +20,10 @@
|
|||
package de.steamwar.bausystem.features.shieldprinting;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.shieldprinting.impl.*;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar;
|
||||
import de.steamwar.bausystem.utils.bossbar.BossBarService;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
|
@ -43,6 +45,7 @@ import org.bukkit.entity.Player;
|
|||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockCanBuildEvent;
|
||||
import org.bukkit.event.block.BlockPistonExtendEvent;
|
||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
|
@ -259,18 +262,14 @@ public class ShieldPrinting implements Listener {
|
|||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (event.getClickedBlock() == null) return;
|
||||
if (event.getItem() == null) return;
|
||||
if (Region.getRegion(event.getClickedBlock().getLocation()) != region) return;
|
||||
Vector vector = event.getClickedBlock().getLocation().toVector();
|
||||
if (!shieldMap.containsKey(vector)) return;
|
||||
event.getClickedBlock().setType(Material.AIR);
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
updateBossbar(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
updateBossbar(event.getPlayer());
|
||||
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||
event.getNewSpectator().forEach(player -> BossBarService.instance.remove(player, region, "shieldprinting"));
|
||||
event.getNewBuilder().forEach(this::updateBossbar);
|
||||
}
|
||||
|
||||
private void updateBossbars() {
|
||||
|
|
|
@ -26,9 +26,7 @@ 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;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
@ -108,8 +106,8 @@ public class ShieldPrintingCommand extends SWCommand implements Listener {
|
|||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
if (!Permission.hasPermission(player, Permission.WORLD)) {
|
||||
messageSender.send("SHIELD_PRINTING_DISALLOWED", player);
|
||||
if (!Permission.BUILD.hasPermission(player)) {
|
||||
messageSender.send("NO_PERMISSION", player);
|
||||
return false;
|
||||
}
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
|
@ -120,20 +118,4 @@ public class ShieldPrintingCommand extends SWCommand implements Listener {
|
|||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (event.getClickedBlock() == null) {
|
||||
return;
|
||||
}
|
||||
Region region = Region.getRegion(event.getClickedBlock().getLocation());
|
||||
if (region.isGlobal()) {
|
||||
return;
|
||||
}
|
||||
ShieldPrinting shieldPrinting = SHIELD_PRINTING_MAP.get(region);
|
||||
if (shieldPrinting == null) {
|
||||
return;
|
||||
}
|
||||
shieldPrinting.onPlayerInteract(event);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* 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.simulator;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@UtilityClass
|
||||
public class OrderUtils {
|
||||
|
||||
private final List<Material> activationOrder = new ArrayList<>();
|
||||
|
||||
private final Map<Material, String> nameMap = new HashMap<>();
|
||||
|
||||
static {
|
||||
add(Material.REPEATER, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_REPEATER");
|
||||
add(Material.OBSERVER, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_OBSERVER");
|
||||
add(Material.COMPARATOR, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_COMPARATOR");
|
||||
}
|
||||
|
||||
public Material next(Material material) {
|
||||
int index = activationOrder.indexOf(material);
|
||||
if (index == -1) {
|
||||
return activationOrder.get(0);
|
||||
}
|
||||
if (index + 1 >= activationOrder.size()) {
|
||||
return activationOrder.get(0);
|
||||
}
|
||||
return activationOrder.get(index + 1);
|
||||
}
|
||||
|
||||
public Material previous(Material material) {
|
||||
int index = activationOrder.indexOf(material);
|
||||
if (index == -1) {
|
||||
return activationOrder.get(0);
|
||||
}
|
||||
if (index - 1 < 0) {
|
||||
return activationOrder.get(activationOrder.size() - 1);
|
||||
}
|
||||
return activationOrder.get(index - 1);
|
||||
}
|
||||
|
||||
public List<String> orderList(Material material, Player player) {
|
||||
List<String> lore = new ArrayList<>();
|
||||
for (Material m : activationOrder) {
|
||||
String element = BauSystem.MESSAGE.parse(name(m), player);
|
||||
if (m == material) {
|
||||
lore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ACTIVE", player, element));
|
||||
} else {
|
||||
lore.add(BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_INACTIVE", player, element));
|
||||
}
|
||||
}
|
||||
return lore;
|
||||
}
|
||||
|
||||
public int order(Material material) {
|
||||
return activationOrder.indexOf(material);
|
||||
}
|
||||
|
||||
public String name(Material material) {
|
||||
return nameMap.getOrDefault(material, "SIMULATOR_TNT_SPAWN_ACTIVATED_WITH_UNKNOWN");
|
||||
}
|
||||
|
||||
private void add(Material material, String name) {
|
||||
activationOrder.add(material);
|
||||
nameMap.put(material, name);
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 SteamWar.de-Serverteam
|
||||
* 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
|
||||
|
@ -55,6 +55,6 @@ public class SimulatorBauGuiItem extends BauGuiItem {
|
|||
|
||||
@Override
|
||||
public Permission permission() {
|
||||
return Permission.WORLD;
|
||||
return Permission.BUILD;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
* 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
|
||||
|
@ -22,105 +22,78 @@ package de.steamwar.bausystem.features.simulator;
|
|||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.bausystem.features.simulator.gui.SimulatorSelectionGUI;
|
||||
import de.steamwar.bausystem.utils.ItemUtils;
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorExecutor;
|
||||
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.linkage.MinVersion;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
@Linked
|
||||
@MinVersion(19)
|
||||
public class SimulatorCommand extends SWCommand {
|
||||
|
||||
@LinkedInstance
|
||||
public SimulatorCursor simulatorCursor;
|
||||
|
||||
public SimulatorCommand() {
|
||||
super("simulator", "sim");
|
||||
super("sim", "simulator");
|
||||
}
|
||||
|
||||
@Register(description = "SIMULATOR_HELP")
|
||||
public void genericCommand(@Validator Player p) {
|
||||
SimulatorCursor.hide(p, null);
|
||||
SWUtils.giveItemToPlayer(p, SimulatorStorage.getWand(p));
|
||||
simulatorCursor.calcCursor(p);
|
||||
}
|
||||
|
||||
@Register(value = "change", description = "SIMULATOR_CHANGE_HELP")
|
||||
public void change(@Validator Player p) {
|
||||
ItemStack itemStack = p.getInventory().getItemInMainHand();
|
||||
if (!ItemUtils.isItem(itemStack, "simulator")) {
|
||||
if (!SimulatorCursor.isSimulatorItem(p.getInventory().getItemInMainHand()) && !SimulatorCursor.isSimulatorItem(p.getInventory().getItemInOffHand())) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NO_SIM_IN_HAND", p);
|
||||
return;
|
||||
}
|
||||
SimulatorSelectionGUI.open(p, itemStack);
|
||||
}
|
||||
|
||||
@Register(value = "create", description = "SIMULATOR_CREATE_HELP")
|
||||
public void create(@Validator Player p, String name) {
|
||||
createSimulator(p, name);
|
||||
}
|
||||
|
||||
public static boolean createSimulator(Player p, String name) {
|
||||
if (SimulatorStorage.getSimulatorNames().contains(name)) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", p);
|
||||
return false;
|
||||
}
|
||||
if (!name.matches("[a-zA-Z_0-9-]+")) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NAME_INVALID", p);
|
||||
return false;
|
||||
}
|
||||
SimulatorStorage.createNewSimulator(name);
|
||||
BauSystem.MESSAGE.send("SIMULATOR_CREATE", p);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Register(value = "delete", description = "SIMULATOR_DELETE_HELP")
|
||||
public void delete(@Validator Player p, @Mapper("simulators") String name) {
|
||||
if (!SimulatorStorage.getSimulatorNames().contains(name)) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NOT_EXISTS", p);
|
||||
return;
|
||||
}
|
||||
SimulatorStorage.delete(name);
|
||||
BauSystem.MESSAGE.send("SIMULATOR_DELETED", p);
|
||||
}
|
||||
|
||||
@Register(value = "start", description = "SIMULATOR_START_HELP")
|
||||
public void start(@Validator Player p, @Mapper("simulators") String name) {
|
||||
TNTSimulator tntSimulator = SimulatorStorage.getSimulator(name);
|
||||
if (tntSimulator == null) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NOT_EXISTS", p);
|
||||
return;
|
||||
}
|
||||
tntSimulator.start(p);
|
||||
SimulatorStorage.openSimulatorSelector(p);
|
||||
}
|
||||
|
||||
@Register(value = "copy", description = "SIMULATOR_COPY_HELP")
|
||||
public void copy(@Validator Player p, @Mapper("simulators") String toCopy, String name) {
|
||||
TNTSimulator tntSimulator = SimulatorStorage.getSimulator(toCopy);
|
||||
if (tntSimulator == null) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NOT_EXISTS", p);
|
||||
return;
|
||||
}
|
||||
public void copy(@Validator Player p, @ErrorMessage("SIMULATOR_NOT_EXISTS") Simulator simulator, String name) {
|
||||
if (SimulatorStorage.getSimulator(name) != null) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", p);
|
||||
return;
|
||||
}
|
||||
SimulatorStorage.copySimulator(tntSimulator, name);
|
||||
if (!name.matches("[a-zA-Z_0-9-]+")) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NAME_INVALID", p);
|
||||
return;
|
||||
}
|
||||
if (!SimulatorStorage.copy(simulator, name)) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_ERROR_COPY", p);
|
||||
}
|
||||
}
|
||||
|
||||
@Mapper("simulators")
|
||||
public TypeMapper<String> allSimulators() {
|
||||
return new TypeMapper<String>() {
|
||||
@Override
|
||||
public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||
if (SimulatorStorage.getSimulatorNames().contains(s)) {
|
||||
return s;
|
||||
} else {
|
||||
return null;
|
||||
@Register(value = "delete", description = "SIMULATOR_DELETE_HELP")
|
||||
public void delete(@Validator Player p, @ErrorMessage("SIMULATOR_NOT_EXISTS") Simulator simulator) {
|
||||
SimulatorStorage.delete(simulator);
|
||||
BauSystem.MESSAGE.send("SIMULATOR_DELETED", p);
|
||||
}
|
||||
|
||||
@Register(value = "start", description = "SIMULATOR_START_HELP")
|
||||
public void start(@Validator Player p, @ErrorMessage("SIMULATOR_NOT_EXISTS") Simulator simulator) {
|
||||
SimulatorExecutor.run(simulator);
|
||||
}
|
||||
|
||||
@ClassMapper(value = Simulator.class, local = true)
|
||||
public TypeMapper<Simulator> allSimulators() {
|
||||
return new TypeMapper<>() {
|
||||
@Override
|
||||
public Simulator map(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||
return SimulatorStorage.getSimulator(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -129,11 +102,4 @@ public class SimulatorCommand extends SWCommand {
|
|||
}
|
||||
};
|
||||
}
|
||||
|
||||
@ClassValidator(value = Player.class, local = true)
|
||||
public TypeValidator<Player> validator() {
|
||||
return (commandSender, player, messageSender) -> {
|
||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), "SIMULATOR_NO_PERMS");
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
* 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
|
||||
|
@ -19,89 +19,230 @@
|
|||
|
||||
package de.steamwar.bausystem.features.simulator;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorGroup;
|
||||
import de.steamwar.bausystem.features.simulator.data.observer.ObserverElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.observer.ObserverPhase;
|
||||
import de.steamwar.bausystem.features.simulator.data.redstone.RedstoneElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.redstone.RedstonePhase;
|
||||
import de.steamwar.bausystem.features.simulator.data.tnt.TNTElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.tnt.TNTPhase;
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorExecutor;
|
||||
import de.steamwar.bausystem.features.simulator.gui.SimulatorGroupGui;
|
||||
import de.steamwar.bausystem.features.simulator.gui.SimulatorGui;
|
||||
import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui;
|
||||
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||
import de.steamwar.bausystem.utils.ItemUtils;
|
||||
import de.steamwar.bausystem.utils.RayTraceUtils;
|
||||
import de.steamwar.entity.REntity;
|
||||
import de.steamwar.entity.REntityServer;
|
||||
import de.steamwar.entity.RFallingBlockEntity;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import de.steamwar.inventory.SWAnvilInv;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.MinVersion;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@UtilityClass
|
||||
public class SimulatorCursor {
|
||||
@Linked
|
||||
@MinVersion(19)
|
||||
public class SimulatorCursor implements Listener {
|
||||
|
||||
private static final World WORLD = Bukkit.getWorlds().get(0);
|
||||
private Map<Player, REntityServer> rEntityServerMap = new HashMap<>();
|
||||
private final World WORLD = Bukkit.getWorlds().get(0);
|
||||
private Class<?> position = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPosition");
|
||||
private Class<?> look = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInLook");
|
||||
private Class<?> positionLook = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPositionLook");
|
||||
|
||||
public void show(Player player, TNTSimulator tntSimulator, RayTraceUtils.RRayTraceResult result) {
|
||||
REntityServer cursor = rEntityServerMap.get(player);
|
||||
private Map<Player, CursorType> cursorType = Collections.synchronizedMap(new HashMap<>());
|
||||
private Map<Player, REntityServer> cursors = Collections.synchronizedMap(new HashMap<>());
|
||||
private final Set<Player> calculating = new HashSet<>();
|
||||
|
||||
if (cursor != null)
|
||||
cursor.close();
|
||||
public static boolean isSimulatorItem(ItemStack itemStack) {
|
||||
return ItemUtils.isItem(itemStack, "simulator");
|
||||
}
|
||||
|
||||
tntSimulator.show(player);
|
||||
public SimulatorCursor() {
|
||||
BiFunction<Player, Object, Object> function = (player, object) -> {
|
||||
calcCursor(player);
|
||||
return object;
|
||||
};
|
||||
TinyProtocol.instance.addFilter(position, function);
|
||||
TinyProtocol.instance.addFilter(look, function);
|
||||
TinyProtocol.instance.addFilter(positionLook, function);
|
||||
}
|
||||
|
||||
if (result == null)
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
calcCursor(event.getPlayer());
|
||||
}, 0);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||
if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
calcCursor(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
|
||||
if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
calcCursor(event.getPlayer());
|
||||
}, 1);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||
event.getChanged().forEach(this::calcCursor);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
cursorType.remove(event.getPlayer());
|
||||
cursors.remove(event.getPlayer());
|
||||
synchronized (calculating) {
|
||||
calculating.remove(event.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
private static final Map<Player, Long> LAST_SNEAKS = new HashMap<>();
|
||||
|
||||
static {
|
||||
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
|
||||
long millis = System.currentTimeMillis();
|
||||
LAST_SNEAKS.entrySet().removeIf(entry -> millis - entry.getValue() > 200);
|
||||
}, 1, 1);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerToggleSneak(PlayerToggleSneakEvent event) {
|
||||
if (!event.isSneaking()) return;
|
||||
Player player = event.getPlayer();
|
||||
if (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand())) {
|
||||
return;
|
||||
}
|
||||
if (LAST_SNEAKS.containsKey(player)) {
|
||||
cursorType.put(player, cursorType.getOrDefault(player, CursorType.TNT).switchType());
|
||||
calcCursor(player);
|
||||
} else {
|
||||
LAST_SNEAKS.put(player, System.currentTimeMillis());
|
||||
}
|
||||
}
|
||||
|
||||
if (result.getHitEntity() != null) {
|
||||
List<SimulatorElement> elements = tntSimulator.getEntity(result.getHitEntity());
|
||||
public void calcCursor(Player player) {
|
||||
synchronized (calculating) {
|
||||
if (calculating.contains(player)) return;
|
||||
calculating.add(player);
|
||||
}
|
||||
if (!Permission.BUILD.hasPermission(player) || (!isSimulatorItem(player.getInventory().getItemInMainHand()) && !isSimulatorItem(player.getInventory().getItemInOffHand()))) {
|
||||
if (removeCursor(player) || SimulatorWatcher.show(null, player)) {
|
||||
SWUtils.sendToActionbar(player, "");
|
||||
}
|
||||
synchronized (calculating) {
|
||||
calculating.remove(player);
|
||||
}
|
||||
return;
|
||||
}
|
||||
Simulator simulator = SimulatorStorage.getSimulator(player);
|
||||
SimulatorWatcher.show(simulator, player);
|
||||
|
||||
cursor = new REntityServer();
|
||||
RFallingBlockEntity entity = new RFallingBlockEntity(cursor, (elements.isEmpty() ? getPos(player, result) : elements.get(0).getPosition()).toLocation(WORLD), Material.TNT);
|
||||
entity.setNoGravity(true);
|
||||
entity.setGlowing(true);
|
||||
cursor.addPlayer(player);
|
||||
rEntityServerMap.put(player, cursor);
|
||||
BauSystem.MESSAGE.sendPrefixless("SIMULATOR_POSITION_EDIT", player, ChatMessageType.ACTION_BAR);
|
||||
List<REntity> entities = SimulatorWatcher.getEntitiesOfSimulator(simulator);
|
||||
RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), entities);
|
||||
if (rayTraceResult == null) {
|
||||
removeCursor(player);
|
||||
if (simulator == null) {
|
||||
SWUtils.sendToActionbar(player, "§eSelect Simulator");
|
||||
} else {
|
||||
SWUtils.sendToActionbar(player, "§eOpen Simulator");
|
||||
}
|
||||
synchronized (calculating) {
|
||||
calculating.remove(player);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (SimulatorStorage.getSimulator(player.getInventory().getItemInOffHand()) != null && result.getHitPosition().distanceSquared(player.getLocation().toVector()) < 25) {
|
||||
return;
|
||||
showCursor(player, rayTraceResult, simulator != null);
|
||||
synchronized (calculating) {
|
||||
calculating.remove(player);
|
||||
}
|
||||
}
|
||||
|
||||
cursor = new REntityServer();
|
||||
RFallingBlockEntity entity = new RFallingBlockEntity(cursor, getPos(player, result).toLocation(WORLD), Material.TNT);
|
||||
entity.setNoGravity(true);
|
||||
cursor.addPlayer(player);
|
||||
rEntityServerMap.put(player, cursor);
|
||||
BauSystem.MESSAGE.sendPrefixless("SIMULATOR_POSITION_ADD", player, ChatMessageType.ACTION_BAR);
|
||||
private synchronized boolean removeCursor(Player player) {
|
||||
REntityServer entityServer = cursors.get(player);
|
||||
boolean hadCursor = entityServer != null && !entityServer.getEntities().isEmpty();
|
||||
if (entityServer != null) {
|
||||
entityServer.getEntities().forEach(REntity::die);
|
||||
}
|
||||
return hadCursor;
|
||||
}
|
||||
|
||||
public void hide(Player player) {
|
||||
REntityServer cursor = rEntityServerMap.get(player);
|
||||
if (cursor == null) return;
|
||||
|
||||
cursor.close();
|
||||
SimulatorStorage.getSimulatorNames().forEach(s -> {
|
||||
SimulatorStorage.getSimulator(s).hide(player);
|
||||
private synchronized void showCursor(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, boolean hasSimulatorSelected) {
|
||||
REntityServer entityServer = cursors.computeIfAbsent(player, __ -> {
|
||||
REntityServer rEntityServer = new REntityServer();
|
||||
rEntityServer.addPlayer(player);
|
||||
return rEntityServer;
|
||||
});
|
||||
|
||||
CursorType type = cursorType.getOrDefault(player, CursorType.TNT);
|
||||
REntity hitEntity = rayTraceResult.getHitEntity();
|
||||
Location location = hitEntity != null ? new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ()).toLocation(WORLD) :
|
||||
type.position.apply(player, rayTraceResult).toLocation(WORLD);
|
||||
|
||||
Material material = hitEntity != null ? Material.GLASS : type.getMaterial();
|
||||
List<RFallingBlockEntity> entities = entityServer.getEntitiesByType(RFallingBlockEntity.class);
|
||||
entities.removeIf(rFallingBlockEntity -> {
|
||||
if (rFallingBlockEntity.getMaterial() != material) {
|
||||
rFallingBlockEntity.die();
|
||||
return true;
|
||||
}
|
||||
rFallingBlockEntity.move(location);
|
||||
return false;
|
||||
});
|
||||
if (entities.isEmpty()) {
|
||||
RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(entityServer, location, material);
|
||||
rFallingBlockEntity.setNoGravity(true);
|
||||
if (material == Material.GLASS) {
|
||||
rFallingBlockEntity.setGlowing(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void hide(Player player, TNTSimulator tntSimulator) {
|
||||
REntityServer cursor = rEntityServerMap.get(player);
|
||||
|
||||
if (cursor != null)
|
||||
cursor.close();
|
||||
|
||||
if (tntSimulator != null) {
|
||||
tntSimulator.hide(player);
|
||||
if (hasSimulatorSelected) {
|
||||
if (hitEntity != null) {
|
||||
SWUtils.sendToActionbar(player, "§eEdit Position");
|
||||
} else {
|
||||
SWUtils.sendToActionbar(player, "§eAdd new " + type.name);
|
||||
}
|
||||
} else {
|
||||
SWUtils.sendToActionbar(player, "§eCreate new Simulator");
|
||||
}
|
||||
rEntityServerMap.remove(player);
|
||||
}
|
||||
|
||||
public static Vector getPos(Player player, RayTraceUtils.RRayTraceResult result) {
|
||||
public static Vector getPosFree(Player player, RayTraceUtils.RRayTraceResult result) {
|
||||
Vector pos = result.getHitPosition();
|
||||
|
||||
BlockFace face = result.getHitBlockFace();
|
||||
|
@ -140,4 +281,177 @@ public class SimulatorCursor {
|
|||
|
||||
return pos;
|
||||
}
|
||||
|
||||
private static Vector getPosBlockAligned(Player player, RayTraceUtils.RRayTraceResult result) {
|
||||
Vector pos = result.getHitPosition();
|
||||
|
||||
BlockFace face = result.getHitBlockFace();
|
||||
if (face != null) {
|
||||
switch (face) {
|
||||
case DOWN:
|
||||
pos.setY(pos.getY() - 0.98);
|
||||
break;
|
||||
case EAST:
|
||||
pos.setX(pos.getX() + 0.49);
|
||||
break;
|
||||
case WEST:
|
||||
pos.setX(pos.getX() - 0.49);
|
||||
break;
|
||||
case NORTH:
|
||||
pos.setZ(pos.getZ() - 0.49);
|
||||
break;
|
||||
case SOUTH:
|
||||
pos.setZ(pos.getZ() + 0.49);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pos.setX(pos.getBlockX() + 0.5);
|
||||
if (pos.getY() - pos.getBlockY() != 0 && face == BlockFace.UP) {
|
||||
pos.setY(pos.getBlockY() + 1.0);
|
||||
} else {
|
||||
pos.setY(pos.getBlockY());
|
||||
}
|
||||
pos.setZ(pos.getBlockZ() + 0.5);
|
||||
return pos;
|
||||
}
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum CursorType {
|
||||
TNT(Material.TNT, SimulatorCursor::getPosFree, "TNT", vector -> new TNTElement(vector).add(new TNTPhase())),
|
||||
REDSTONE_BLOCK(Material.REDSTONE_BLOCK, SimulatorCursor::getPosBlockAligned, "Redstone Block", vector -> new RedstoneElement(vector).add(new RedstonePhase())),
|
||||
OBSERVER(Material.OBSERVER, SimulatorCursor::getPosBlockAligned, "Observer", vector -> new ObserverElement(vector).add(new ObserverPhase())),
|
||||
;
|
||||
|
||||
private Material material;
|
||||
private BiFunction<Player, RayTraceUtils.RRayTraceResult, Vector> position;
|
||||
private String name;
|
||||
private Function<Vector, SimulatorElement<?>> elementFunction;
|
||||
|
||||
public CursorType switchType() {
|
||||
if (this == TNT) {
|
||||
return REDSTONE_BLOCK;
|
||||
}
|
||||
if (this == REDSTONE_BLOCK) {
|
||||
return OBSERVER;
|
||||
}
|
||||
return TNT;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||
if (!ItemUtils.isItem(event.getItem(), "simulator")) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
Player player = event.getPlayer();
|
||||
Simulator simulator = SimulatorStorage.getSimulator(player);
|
||||
|
||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_AIR) {
|
||||
if (simulator == null) {
|
||||
return;
|
||||
}
|
||||
SimulatorExecutor.run(simulator);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_AIR) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(player, player.getLocation(), SimulatorWatcher.getEntitiesOfSimulator(simulator));
|
||||
if (simulator == null) {
|
||||
if (rayTraceResult == null) {
|
||||
SimulatorStorage.openSimulatorSelector(player);
|
||||
} else {
|
||||
SWAnvilInv anvilInv = new SWAnvilInv(player, "Name");
|
||||
anvilInv.setCallback(s -> {
|
||||
Simulator sim = SimulatorStorage.getSimulator(s);
|
||||
if (sim != null) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", player);
|
||||
return;
|
||||
}
|
||||
if (!s.matches("[a-zA-Z_0-9-]+")) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NAME_INVALID", player);
|
||||
return;
|
||||
}
|
||||
sim = new Simulator(s);
|
||||
SimulatorStorage.addSimulator(s, sim);
|
||||
createElement(player, rayTraceResult, sim);
|
||||
SimulatorStorage.setSimulator(player, sim);
|
||||
});
|
||||
anvilInv.open();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (rayTraceResult == null) {
|
||||
new SimulatorGui(player, simulator).open();
|
||||
return;
|
||||
}
|
||||
|
||||
if (rayTraceResult.getHitEntity() != null) {
|
||||
REntity hitEntity = rayTraceResult.getHitEntity();
|
||||
Vector vector = new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ());
|
||||
List<SimulatorElement<?>> elements = simulator.getGroups().stream().map(SimulatorGroup::getElements).flatMap(List::stream).filter(element -> {
|
||||
return element.getWorldPos().distanceSquared(vector) < (1 / 16.0) * (1 / 16.0);
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
switch (elements.size()) {
|
||||
case 0:
|
||||
return;
|
||||
case 1:
|
||||
// Open single element present in Simulator
|
||||
SimulatorElement<?> element = elements.get(0);
|
||||
SimulatorGroup group1 = element.getGroup(simulator);
|
||||
SimulatorBaseGui back = new SimulatorGui(player, simulator);
|
||||
if (group1.getElements().size() > 1) {
|
||||
back = new SimulatorGroupGui(player, simulator, group1, back);
|
||||
}
|
||||
element.open(player, simulator, group1, back);
|
||||
break;
|
||||
default:
|
||||
List<SimulatorGroup> parents = elements.stream().map(e -> e.getGroup(simulator)).distinct().collect(Collectors.toList());
|
||||
if (parents.size() == 1) {
|
||||
// Open multi element present in Simulator in existing group
|
||||
SimulatorGui simulatorGui = new SimulatorGui(player, simulator);
|
||||
new SimulatorGroupGui(player, simulator, parents.get(0), simulatorGui).open();
|
||||
} else {
|
||||
// Open multi element present in Simulator in implicit group
|
||||
SimulatorGroup group2 = new SimulatorGroup();
|
||||
group2.setMaterial(null);
|
||||
group2.getElements().addAll(elements);
|
||||
SimulatorGui simulatorGui = new SimulatorGui(player, simulator);
|
||||
new SimulatorGroupGui(player, simulator, group2, simulatorGui).open();
|
||||
}
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Add new Element to current simulator
|
||||
createElement(player, rayTraceResult, simulator);
|
||||
}
|
||||
|
||||
private void createElement(Player player, RayTraceUtils.RRayTraceResult rayTraceResult, Simulator simulator) {
|
||||
CursorType type = cursorType.getOrDefault(player, CursorType.TNT);
|
||||
Vector vector = type.position.apply(player, rayTraceResult);
|
||||
if (type == CursorType.REDSTONE_BLOCK) {
|
||||
vector.subtract(new Vector(0.5, 0, 0.5));
|
||||
}
|
||||
SimulatorElement<?> element = type.elementFunction.apply(vector);
|
||||
SimulatorGroup group = new SimulatorGroup().add(element);
|
||||
simulator.getGroups().add(group);
|
||||
SimulatorGui simulatorGui = new SimulatorGui(player, simulator);
|
||||
element.open(player, simulator, group, simulatorGui);
|
||||
SimulatorWatcher.update(simulator);
|
||||
calcCursor(player);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
* 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
|
||||
|
@ -19,106 +19,154 @@
|
|||
|
||||
package de.steamwar.bausystem.features.simulator;
|
||||
|
||||
import com.google.common.io.Files;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.bausystem.features.simulator.tnt.TNTElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui;
|
||||
import de.steamwar.bausystem.features.simulator.storage.SimFormatSimulatorLoader;
|
||||
import de.steamwar.bausystem.features.simulator.storage.SimulatorFormatSimulatorLoader;
|
||||
import de.steamwar.bausystem.features.simulator.storage.SimulatorSaver;
|
||||
import de.steamwar.bausystem.features.simulator.storage.YAPIONFormatSimulatorLoader;
|
||||
import de.steamwar.bausystem.utils.ItemUtils;
|
||||
import de.steamwar.inventory.SWAnvilInv;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.api.Disable;
|
||||
import de.steamwar.linkage.MinVersion;
|
||||
import de.steamwar.linkage.api.Enable;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import yapion.exceptions.YAPIONException;
|
||||
import yapion.hierarchy.types.YAPIONArray;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
import yapion.parser.YAPIONParser;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.*;
|
||||
|
||||
@Linked
|
||||
public class SimulatorStorage implements Enable, Disable {
|
||||
|
||||
public static final World WORLD = Bukkit.getWorlds().get(0);
|
||||
private static final File simulatorsDir = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "simulators");
|
||||
@MinVersion(19)
|
||||
public class SimulatorStorage implements Enable {
|
||||
|
||||
public static final File simulatorsDir = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "simulators");
|
||||
private static Map<String, Simulator> simulatorMap = new HashMap<>();
|
||||
private static NamespacedKey simulatorSelection = SWUtils.getNamespaceKey("simulator_selection");
|
||||
|
||||
private static Map<String, TNTSimulator> tntSimulators = new HashMap<>();
|
||||
|
||||
public static void createNewSimulator(String name) {
|
||||
tntSimulators.put(name, new TNTSimulator());
|
||||
}
|
||||
|
||||
public static Set<String> getSimulatorNames() {
|
||||
return tntSimulators.keySet();
|
||||
}
|
||||
|
||||
public static TNTSimulator getSimulator(String name) {
|
||||
return tntSimulators.get(name);
|
||||
}
|
||||
|
||||
public static TNTSimulator getSimulator(Player player) {
|
||||
TNTSimulator current = getSimulator(player.getInventory().getItemInMainHand());
|
||||
if (current != null) return current;
|
||||
public static Simulator getSimulator(Player player) {
|
||||
Simulator simulator = getSimulator(player.getInventory().getItemInMainHand());
|
||||
if (simulator != null) return simulator;
|
||||
return getSimulator(player.getInventory().getItemInOffHand());
|
||||
}
|
||||
|
||||
public static TNTSimulator getSimulator(ItemStack itemStack) {
|
||||
if (itemStack == null) {
|
||||
return null;
|
||||
}
|
||||
if (!ItemUtils.isItem(itemStack, "simulator")) {
|
||||
public static Simulator getSimulator(ItemStack itemStack) {
|
||||
if (!SimulatorCursor.isSimulatorItem(itemStack)) {
|
||||
return null;
|
||||
}
|
||||
String selection = ItemUtils.getTag(itemStack, simulatorSelection);
|
||||
if (selection == null) {
|
||||
return null;
|
||||
}
|
||||
return tntSimulators.get(selection);
|
||||
return simulatorMap.get(selection);
|
||||
}
|
||||
|
||||
public static void setSimulator(Player player, ItemStack itemStack, TNTSimulator simulator) {
|
||||
for (Map.Entry<String, TNTSimulator> entry : tntSimulators.entrySet()) {
|
||||
if (entry.getValue() == simulator) {
|
||||
ItemUtils.setTag(itemStack, simulatorSelection, entry.getKey());
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.setDisplayName(BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME_SELECTED", player, entry.getKey()));
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
public static Simulator getSimulator(String name) {
|
||||
return simulatorMap.get(name);
|
||||
}
|
||||
|
||||
public static void addSimulator(String name, Simulator simulator) {
|
||||
simulatorMap.putIfAbsent(name, simulator);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enable() {
|
||||
SimFormatSimulatorLoader simFormatSimulatorLoader = new SimFormatSimulatorLoader();
|
||||
SimulatorFormatSimulatorLoader simulatorFormatSimulatorLoader = new SimulatorFormatSimulatorLoader();
|
||||
YAPIONFormatSimulatorLoader yapionFormatSimulatorLoader = new YAPIONFormatSimulatorLoader();
|
||||
|
||||
File[] files = simulatorsDir.listFiles();
|
||||
if (files == null) return;
|
||||
for (File file : files) {
|
||||
try {
|
||||
List<Simulator> simulators = simFormatSimulatorLoader.load(file)
|
||||
.orElse(null);
|
||||
if (simulators != null) {
|
||||
simulators.forEach(simulator -> {
|
||||
simulatorMap.put(simulator.getName(), simulator);
|
||||
});
|
||||
continue;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Ignore
|
||||
}
|
||||
|
||||
try {
|
||||
List<Simulator> simulators = simulatorFormatSimulatorLoader.load(file)
|
||||
.orElse(null);
|
||||
if (simulators != null) {
|
||||
simulators.forEach(simulator -> {
|
||||
simulatorMap.put(simulator.getName(), simulator);
|
||||
SimulatorSaver.saveSimulator(simulatorsDir, simulator);
|
||||
});
|
||||
continue;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Ignore
|
||||
}
|
||||
|
||||
try {
|
||||
List<Simulator> simulators = yapionFormatSimulatorLoader.load(file)
|
||||
.orElse(null);
|
||||
if (simulators != null) {
|
||||
simulators.forEach(simulator -> {
|
||||
simulatorMap.put(simulator.getName(), simulator);
|
||||
SimulatorSaver.saveSimulator(simulatorsDir, simulator);
|
||||
});
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void openSimulatorSelector(Player player) {
|
||||
SimulatorPageGui<Simulator> simulatorPageGui = new SimulatorPageGui<Simulator>(player, null, 6 * 9, new ArrayList<>(simulatorMap.values())) {
|
||||
@Override
|
||||
public String baseTitle() {
|
||||
return "Simulators";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headerAndFooter() {
|
||||
inventory.setItem(49, new SWItem(Material.NAME_TAG, "§eCreate", clickType -> {
|
||||
SWAnvilInv anvilInv = new SWAnvilInv(player, "Name");
|
||||
anvilInv.setCallback(s -> {
|
||||
Simulator sim = SimulatorStorage.getSimulator(s);
|
||||
if (sim != null) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NAME_ALREADY_EXISTS", player);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void delete(String name) {
|
||||
TNTSimulator tntSimulator = tntSimulators.remove(name);
|
||||
if (tntSimulator != null) {
|
||||
tntSimulator.close();
|
||||
}
|
||||
new File(simulatorsDir, name + ".simulator").delete();
|
||||
}
|
||||
|
||||
public static void copySimulator(TNTSimulator tntSimulator, String name) {
|
||||
tntSimulators.put(name, new TNTSimulator(tntSimulator.toYAPION()));
|
||||
}
|
||||
|
||||
public static void removeSimulator(ItemStack itemStack) {
|
||||
if (!ItemUtils.isItem(itemStack, "simulator")) {
|
||||
if (!s.matches("[a-zA-Z_0-9-]+")) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NAME_INVALID", player);
|
||||
return;
|
||||
}
|
||||
ItemUtils.setTag(itemStack, simulatorSelection, null);
|
||||
sim = new Simulator(s);
|
||||
SimulatorStorage.addSimulator(s, sim);
|
||||
SimulatorStorage.setSimulator(player, sim);
|
||||
});
|
||||
anvilInv.open();
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem convert(Simulator simulator) {
|
||||
return simulator.toItem(player, clickType -> {
|
||||
setSimulator(player, simulator);
|
||||
player.closeInventory();
|
||||
});
|
||||
}
|
||||
};
|
||||
simulatorPageGui.open();
|
||||
}
|
||||
|
||||
public static ItemStack getWand(Player p) {
|
||||
|
@ -130,68 +178,48 @@ public class SimulatorStorage implements Enable, Disable {
|
|||
return itemStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enable() {
|
||||
if (!simulatorsDir.exists()) {
|
||||
simulatorsDir.mkdir();
|
||||
}
|
||||
File[] files = simulatorsDir.listFiles();
|
||||
if (files == null) return;
|
||||
|
||||
for (File file : files) {
|
||||
YAPIONObject yapionObject;
|
||||
try {
|
||||
yapionObject = YAPIONParser.parse(file);
|
||||
} catch (YAPIONException | IOException e) {
|
||||
continue;
|
||||
}
|
||||
if (file.getName().endsWith(".yapion")) {
|
||||
String name = file.getName().substring(0, file.getName().length() - 7);
|
||||
try {
|
||||
SteamwarUser steamwarUser = SteamwarUser.get(Integer.parseInt(name));
|
||||
convert(file, steamwarUser);
|
||||
} catch (Exception e) {
|
||||
file.delete();
|
||||
}
|
||||
public static void setSimulator(Player player, Simulator simulator) {
|
||||
ItemStack mainHand = player.getInventory().getItemInMainHand();
|
||||
ItemStack offHand = player.getInventory().getItemInOffHand();
|
||||
ItemStack itemStack;
|
||||
if (SimulatorCursor.isSimulatorItem(mainHand)) {
|
||||
itemStack = mainHand;
|
||||
} else if (SimulatorCursor.isSimulatorItem(offHand)) {
|
||||
itemStack = offHand;
|
||||
} else {
|
||||
String name = file.getName().substring(0, file.getName().length() - ".simulator".length());
|
||||
tntSimulators.put(name, new TNTSimulator(yapionObject));
|
||||
itemStack = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void convert(File file, SteamwarUser steamwarUser) {
|
||||
YAPIONObject yapionObject;
|
||||
try {
|
||||
yapionObject = YAPIONParser.parse(file);
|
||||
} catch (YAPIONException | IOException e) {
|
||||
if (itemStack == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
file.delete();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
for (String s : yapionObject.getKeys()) {
|
||||
String newName = steamwarUser.getUserName() + (s.isEmpty() ? "" : "_" + s);
|
||||
YAPIONArray content = yapionObject.getArray(s);
|
||||
if (content.isEmpty()) continue;
|
||||
TNTSimulator tntSimulator = new TNTSimulator();
|
||||
for (YAPIONObject element : content.streamObject().collect(Collectors.toList())) {
|
||||
tntSimulator.getTntElementList().add(new TNTElement(element, null, tntSimulator.getEntityServer()));
|
||||
}
|
||||
tntSimulators.put(newName, tntSimulator);
|
||||
}
|
||||
|
||||
ItemUtils.setTag(itemStack, simulatorSelection, simulator.getName());
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.setDisplayName(BauSystem.MESSAGE.parse("SIMULATOR_WAND_NAME_SELECTED", player, simulator.getName()));
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable() {
|
||||
for (Map.Entry<String, TNTSimulator> entry : tntSimulators.entrySet()) {
|
||||
public static List<String> getSimulatorNames() {
|
||||
return new ArrayList<>(simulatorMap.keySet());
|
||||
}
|
||||
|
||||
public static void delete(Simulator simulator) {
|
||||
simulatorMap.remove(simulator.getName());
|
||||
new File(simulatorsDir, simulator.getName() + ".sim").delete();
|
||||
}
|
||||
|
||||
public static boolean copy(Simulator simulator, String name) {
|
||||
try {
|
||||
entry.getValue().toYAPION().toFile(new File(simulatorsDir, entry.getKey() + ".simulator"));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
File file = new File(simulatorsDir, name + ".sim");
|
||||
Files.copy(new File(simulatorsDir, simulator.getName() + ".sim"), file);
|
||||
new SimFormatSimulatorLoader().load(file).ifPresent(simulators -> {
|
||||
simulators.forEach(sim -> {
|
||||
simulatorMap.put(sim.getName(), sim);
|
||||
});
|
||||
});
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,129 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorGroup;
|
||||
import de.steamwar.bausystem.features.simulator.storage.SimulatorSaver;
|
||||
import de.steamwar.bausystem.shared.Pair;
|
||||
import de.steamwar.entity.REntity;
|
||||
import de.steamwar.entity.REntityServer;
|
||||
import de.steamwar.entity.RFallingBlockEntity;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.MinVersion;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@UtilityClass
|
||||
public class SimulatorWatcher {
|
||||
|
||||
private final World WORLD = Bukkit.getWorlds().get(0);
|
||||
private Map<Simulator, REntityServer> entityServers = new HashMap<>();
|
||||
private Map<Player, Pair<Simulator, Runnable>> watchers = new HashMap<>();
|
||||
|
||||
public void watch(Player player, Simulator simulator, Runnable watcher) {
|
||||
if (simulator == null || watcher == null) {
|
||||
watchers.remove(player);
|
||||
} else {
|
||||
watchers.put(player, new Pair<>(simulator, watcher));
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void update(Simulator simulator) {
|
||||
REntityServer rEntityServer = entityServers.get(simulator);
|
||||
if (rEntityServer != null) {
|
||||
rEntityServer.getEntities().forEach(REntity::die);
|
||||
createSim(rEntityServer, simulator);
|
||||
}
|
||||
|
||||
new ArrayList<>(watchers.values()).forEach(simulatorRunnablePair -> {
|
||||
if (simulatorRunnablePair.getKey() == simulator) {
|
||||
simulatorRunnablePair.getValue().run();
|
||||
}
|
||||
});
|
||||
SimulatorSaver.saveSimulator(SimulatorStorage.simulatorsDir, simulator);
|
||||
}
|
||||
|
||||
@Linked
|
||||
@MinVersion(19)
|
||||
public static class QuitListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
watchers.remove(event.getPlayer());
|
||||
show(null, event.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
private REntityServer createSim(REntityServer server, Simulator simulator) {
|
||||
if (simulator == null) {
|
||||
return null;
|
||||
}
|
||||
Map<Vector, Set<Class<?>>> positionCache = new HashMap<>();
|
||||
simulator.getGroups().stream().map(group -> group.getElements().stream().map(element -> new Pair<>(group, element)).collect(Collectors.toList())).flatMap(List::stream).forEach(pair -> {
|
||||
SimulatorGroup group = pair.getKey();
|
||||
SimulatorElement<?> element = pair.getValue();
|
||||
|
||||
boolean wasNotPresent = positionCache.computeIfAbsent(element.getPosition(), __ -> new HashSet<>())
|
||||
.add(element.getClass());
|
||||
if (!wasNotPresent) return;
|
||||
Material material = group.isDisabled() || element.isDisabled() ? element.getWorldDisabledMaterial() : element.getWorldMaterial();
|
||||
Location location = element.getWorldPos().toLocation(WORLD);
|
||||
RFallingBlockEntity rFallingBlockEntity = new RFallingBlockEntity(server, location, material);
|
||||
rFallingBlockEntity.setNoGravity(true);
|
||||
});
|
||||
return server;
|
||||
}
|
||||
|
||||
public synchronized boolean show(Simulator sim, Player player) {
|
||||
AtomicBoolean removed = new AtomicBoolean();
|
||||
entityServers.forEach((simulator, rEntityServer) -> {
|
||||
if (rEntityServer == null) return;
|
||||
if (rEntityServer.getPlayers().contains(player) && sim != simulator) {
|
||||
rEntityServer.removePlayer(player);
|
||||
removed.set(true);
|
||||
}
|
||||
});
|
||||
if (sim == null) return removed.get();
|
||||
entityServers.computeIfAbsent(sim, __ -> createSim(new REntityServer(), sim)).addPlayer(player);
|
||||
return removed.get();
|
||||
}
|
||||
|
||||
synchronized List<REntity> getEntitiesOfSimulator(Simulator simulator) {
|
||||
REntityServer entityServer = entityServers.get(simulator);
|
||||
if (entityServer == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return entityServer.getEntities();
|
||||
}
|
||||
}
|
|
@ -1,270 +0,0 @@
|
|||
/*
|
||||
* 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.simulator;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.configplayer.Config;
|
||||
import de.steamwar.bausystem.features.simulator.gui.TNTElementGUI;
|
||||
import de.steamwar.bausystem.features.simulator.gui.TNTSimulatorGui;
|
||||
import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement;
|
||||
import de.steamwar.bausystem.features.simulator.tnt.TNTElement;
|
||||
import de.steamwar.bausystem.features.simulator.tnt.TNTGroup;
|
||||
import de.steamwar.bausystem.features.tracer.record.Recorder;
|
||||
import de.steamwar.bausystem.features.tracer.record.SingleTraceRecorder;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.shared.Pair;
|
||||
import de.steamwar.bausystem.utils.RayTraceUtils;
|
||||
import de.steamwar.entity.REntity;
|
||||
import de.steamwar.entity.REntityServer;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import yapion.hierarchy.types.YAPIONArray;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
import yapion.hierarchy.types.YAPIONType;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Getter
|
||||
public class TNTSimulator {
|
||||
|
||||
private Set<Player> players = new HashSet<>();
|
||||
private REntityServer entityServer = new REntityServer();
|
||||
|
||||
private Material material = Material.TNT;
|
||||
|
||||
private List<SimulatorElement> tntElementList = new ArrayList<>();
|
||||
|
||||
public TNTSimulator() {
|
||||
|
||||
}
|
||||
|
||||
public TNTSimulator(YAPIONObject yapionObject) {
|
||||
material = Material.valueOf(yapionObject.getStringOrDefault("material", Material.TNT.name()));
|
||||
YAPIONArray yapionArray = yapionObject.getArrayOrDefault("tntElements", new YAPIONArray());
|
||||
for (YAPIONObject element : yapionArray.streamObject().collect(Collectors.toList())) {
|
||||
if (element.containsKey("elements", YAPIONType.ARRAY)) {
|
||||
tntElementList.add(new TNTGroup(element, entityServer));
|
||||
} else {
|
||||
tntElementList.add(new TNTElement(element, null, entityServer));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public YAPIONObject toYAPION() {
|
||||
YAPIONObject yapionObject = new YAPIONObject();
|
||||
yapionObject.add("material", material.name());
|
||||
YAPIONArray yapionArray = new YAPIONArray();
|
||||
for (SimulatorElement element : tntElementList) {
|
||||
yapionArray.add(element.toYAPION());
|
||||
}
|
||||
yapionObject.add("tntElements", yapionArray);
|
||||
return yapionObject;
|
||||
}
|
||||
|
||||
public void close() {
|
||||
entityServer.close();
|
||||
}
|
||||
|
||||
public void show(Player player) {
|
||||
if (!players.contains(player)) {
|
||||
entityServer.addPlayer(player);
|
||||
players.add(player);
|
||||
}
|
||||
}
|
||||
|
||||
public void hide(Player player) {
|
||||
if (players.contains(player)) {
|
||||
entityServer.removePlayer(player);
|
||||
players.remove(player);
|
||||
}
|
||||
}
|
||||
|
||||
void _hide(Player player) {
|
||||
players.remove(player);
|
||||
}
|
||||
|
||||
public List<REntity> getEntities() {
|
||||
return tntElementList.stream().flatMap(element -> element.getEntities().stream()).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public List<SimulatorElement> getEntity(REntity entity) {
|
||||
List<SimulatorElement> tntSpawns = new ArrayList<>();
|
||||
for (SimulatorElement spawn : tntElementList) {
|
||||
spawn.getEntity(tntSpawns, entity);
|
||||
}
|
||||
return tntSpawns;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
new ArrayList<>(tntElementList).forEach(this::remove);
|
||||
}
|
||||
|
||||
public void remove(SimulatorElement element) {
|
||||
if (element instanceof TNTElement) {
|
||||
TNTElement tntElement = (TNTElement) element;
|
||||
if (tntElement.hasParent()) {
|
||||
tntElement.getParent().remove(tntElement);
|
||||
if (tntElement.getParent().getElements().isEmpty()) {
|
||||
remove(tntElement.getParent());
|
||||
}
|
||||
} else {
|
||||
element.remove(tntElement);
|
||||
}
|
||||
} else if (element instanceof TNTGroup) {
|
||||
TNTGroup tntGroup = (TNTGroup) element;
|
||||
tntGroup.getElements().forEach(tntElement -> {
|
||||
tntElement.remove(tntElement);
|
||||
});
|
||||
tntGroup.getElements().clear();
|
||||
}
|
||||
element.close();
|
||||
tntElementList.remove(element);
|
||||
}
|
||||
|
||||
public void change() {
|
||||
tntElementList.forEach(simulatorElement -> {
|
||||
simulatorElement.change();
|
||||
if (simulatorElement instanceof TNTGroup) {
|
||||
((TNTGroup) simulatorElement).getElements().forEach(SimulatorElement::change);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void edit(Player player, RayTraceUtils.RRayTraceResult result) {
|
||||
if (result == null) {
|
||||
TNTSimulatorGui.open(player, this, null, this::getTntElementList, null);
|
||||
return;
|
||||
}
|
||||
|
||||
SimulatorCursor.show(player, this, result);
|
||||
|
||||
if (result.getHitEntity() != null) {
|
||||
List<SimulatorElement> elements = getEntity(result.getHitEntity());
|
||||
if (elements.isEmpty()) return;
|
||||
|
||||
if (elements.size() == 1) {
|
||||
TNTElementGUI.open(player, (TNTElement) elements.get(0), null);
|
||||
} else {
|
||||
List<TNTGroup> tntGroups = tntElementList.stream().filter(TNTGroup.class::isInstance).map(TNTGroup.class::cast).collect(Collectors.toList());
|
||||
List<SimulatorElement> newElementList = new ArrayList<>();
|
||||
for (TNTGroup tntGroup : tntGroups) {
|
||||
if (new HashSet<>(elements).containsAll(tntGroup.getElements())) {
|
||||
newElementList.add(tntGroup);
|
||||
elements.removeAll(tntGroup.getElements());
|
||||
}
|
||||
}
|
||||
newElementList.addAll(elements);
|
||||
if (newElementList.size() == 1) {
|
||||
SimulatorElement element = newElementList.get(0);
|
||||
if (element instanceof TNTGroup) {
|
||||
TNTGroup tntGroup = (TNTGroup) element;
|
||||
TNTSimulatorGui.open(player, null, tntGroup, () -> {
|
||||
List<SimulatorElement> elementList = new ArrayList<>();
|
||||
elementList.addAll(tntGroup.getElements());
|
||||
return elementList;
|
||||
}, null);
|
||||
} else {
|
||||
TNTElementGUI.open(player, (TNTElement) elements.get(0), null);
|
||||
}
|
||||
} else {
|
||||
TNTSimulatorGui.open(player, null, null, () -> newElementList, null);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (SimulatorStorage.getSimulator(player.getInventory().getItemInOffHand()) != null && result.getHitPosition().distanceSquared(player.getLocation().toVector()) < 25) {
|
||||
return;
|
||||
}
|
||||
|
||||
TNTElement tntElement = new TNTElement(SimulatorCursor.getPos(player, result), null, entityServer);
|
||||
tntElementList.add(tntElement);
|
||||
TNTElementGUI.open(player, tntElement, null);
|
||||
}
|
||||
|
||||
public void start(Player p) {
|
||||
Region region = Region.getRegion(p.getLocation());
|
||||
Map<Integer, Map<Integer, Set<Pair<Runnable, Integer>>>> result = new HashMap<>();
|
||||
boolean regionFrozen = false;
|
||||
for (SimulatorElement element : tntElementList) {
|
||||
regionFrozen |= element.locations(result, region, p.getLocation());
|
||||
}
|
||||
if (regionFrozen) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_REGION_FROZEN", p);
|
||||
return;
|
||||
}
|
||||
|
||||
AtomicBoolean needsAutoTrace = new AtomicBoolean();
|
||||
players.forEach(player -> {
|
||||
boolean simulatorAutoTrace = Config.getInstance().get(player).getPlainValueOrDefault("simulatorAutoTrace", false);
|
||||
if (simulatorAutoTrace) {
|
||||
needsAutoTrace.set(true);
|
||||
player.performCommand("trace show");
|
||||
}
|
||||
});
|
||||
if (needsAutoTrace.get()) {
|
||||
Recorder.INSTANCE.set(region, new SingleTraceRecorder());
|
||||
}
|
||||
|
||||
AtomicInteger maxTick = new AtomicInteger(0);
|
||||
Map<Integer, List<List<Pair<Runnable, Integer>>>> toSpawn = new HashMap<>();
|
||||
result.forEach((integer, integerSetMap) -> {
|
||||
List<Pair<Integer, Set<Pair<Runnable, Integer>>>> internal = new ArrayList<>();
|
||||
integerSetMap.forEach((integer1, pairs) -> {
|
||||
internal.add(new Pair<>(integer1, pairs));
|
||||
});
|
||||
internal.sort(Comparator.comparingInt(Pair::getKey));
|
||||
|
||||
toSpawn.put(integer, internal.stream().map(Pair::getValue).map(ArrayList::new).peek(Collections::shuffle).collect(Collectors.toList()));
|
||||
|
||||
if (maxTick.get() < integer) {
|
||||
maxTick.set(integer);
|
||||
}
|
||||
});
|
||||
|
||||
AtomicInteger currentTick = new AtomicInteger(0);
|
||||
BauSystem.runTaskTimer(BauSystem.getInstance(), bukkitTask -> {
|
||||
int tick = currentTick.get();
|
||||
if (tick > maxTick.get()) bukkitTask.cancel();
|
||||
currentTick.incrementAndGet();
|
||||
|
||||
List<List<Pair<Runnable, Integer>>> toSpawnInTick = toSpawn.get(tick);
|
||||
if (toSpawnInTick == null) return;
|
||||
toSpawnInTick.forEach(pairs -> {
|
||||
AtomicBoolean hasSomeLeft = new AtomicBoolean(true);
|
||||
while(hasSomeLeft.get()) {
|
||||
hasSomeLeft.set(false);
|
||||
pairs.forEach(pair -> {
|
||||
if (pair.getValue() > 0) {
|
||||
hasSomeLeft.set(true);
|
||||
pair.getKey().run();
|
||||
pair.setValue(pair.getValue() - 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}, 1, 1);
|
||||
}
|
||||
}
|
|
@ -1,130 +0,0 @@
|
|||
/*
|
||||
* 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.simulator;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.features.simulator.gui.SimulatorSelectionGUI;
|
||||
import de.steamwar.bausystem.utils.ItemUtils;
|
||||
import de.steamwar.bausystem.utils.RayTraceUtils;
|
||||
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.player.*;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
@Linked
|
||||
public class TNTSimulatorListener implements Listener {
|
||||
|
||||
private boolean permissionCheck(Player player) {
|
||||
if (!Permission.hasPermission(player, Permission.WORLD)) {
|
||||
BauSystem.MESSAGE.send("SIMULATOR_NO_PERMS", player);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static RayTraceUtils.RRayTraceResult trace(Player player, Location to, TNTSimulator simulator) {
|
||||
return RayTraceUtils.traceREntity(player, to, simulator.getEntities());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerMove(PlayerMoveEvent e) {
|
||||
if (ItemUtils.isItem(e.getPlayer().getInventory().getItemInMainHand(), "simulator")) {
|
||||
simulatorShowHide(e.getPlayer(), i -> null, PlayerInventory::getItemInMainHand, e.getTo());
|
||||
} else {
|
||||
SimulatorCursor.hide(e.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerItemHeld(PlayerItemHeldEvent e) {
|
||||
simulatorShowHide(e.getPlayer(), i -> i.getItem(e.getPreviousSlot()), i -> i.getItem(e.getNewSlot()), e.getPlayer().getLocation());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerDropItem(PlayerDropItemEvent e) {
|
||||
simulatorShowHide(e.getPlayer(), i -> e.getItemDrop().getItemStack(), i -> null, e.getPlayer().getLocation());
|
||||
}
|
||||
|
||||
private TNTSimulator simulatorShowHide(Player player, Function<PlayerInventory, ItemStack> oldItemFunction, Function<PlayerInventory, ItemStack> newItemFunction, Location location) {
|
||||
TNTSimulator oldSimulator = SimulatorStorage.getSimulator(oldItemFunction.apply(player.getInventory()));
|
||||
SimulatorCursor.hide(player, oldSimulator);
|
||||
|
||||
TNTSimulator simulator = SimulatorStorage.getSimulator(newItemFunction.apply(player.getInventory()));
|
||||
if (simulator == null) return null;
|
||||
|
||||
SimulatorCursor.show(player, simulator, trace(player, location, simulator));
|
||||
return simulator;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent e) {
|
||||
if (ItemUtils.isItem(e.getPlayer().getInventory().getItemInMainHand(), "simulator")) {
|
||||
simulatorShowHide(e.getPlayer(), i -> null, PlayerInventory::getItemInMainHand, e.getPlayer().getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
SimulatorCursor.hide(event.getPlayer(), null);
|
||||
SimulatorStorage.getSimulatorNames().forEach(s -> {
|
||||
SimulatorStorage.getSimulator(s)._hide(event.getPlayer());
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (!ItemUtils.isItem(event.getItem(), "simulator")) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
if (!permissionCheck(event.getPlayer())) {
|
||||
return;
|
||||
}
|
||||
TNTSimulator simulator = SimulatorStorage.getSimulator(event.getItem());
|
||||
|
||||
switch (event.getAction()) {
|
||||
case LEFT_CLICK_BLOCK:
|
||||
case LEFT_CLICK_AIR:
|
||||
if (simulator == null) {
|
||||
return;
|
||||
}
|
||||
simulator.start(event.getPlayer());
|
||||
break;
|
||||
case RIGHT_CLICK_BLOCK:
|
||||
case RIGHT_CLICK_AIR:
|
||||
if (simulator == null) {
|
||||
SimulatorSelectionGUI.open(event.getPlayer(), event.getItem());
|
||||
} else {
|
||||
simulator.edit(event.getPlayer(), trace(event.getPlayer(), event.getPlayer().getLocation(), simulator));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* 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.data;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorAction;
|
||||
import de.steamwar.inventory.InvCallback;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@RequiredArgsConstructor
|
||||
public final class Simulator {
|
||||
private Material material = Material.BARREL;
|
||||
private final String name;
|
||||
private boolean autoTrace = false;
|
||||
private final List<SimulatorGroup> groups = new ArrayList<>();
|
||||
|
||||
public void move(int x, int y, int z) {
|
||||
groups.forEach(simulatorGroup -> {
|
||||
simulatorGroup.move(x, y, z);
|
||||
});
|
||||
}
|
||||
|
||||
public SWItem toItem(Player player, InvCallback invCallback) {
|
||||
return new SWItem(material, "§e" + name, invCallback);
|
||||
}
|
||||
|
||||
public void toSimulatorActions(BiConsumer<Integer, SimulatorAction> tickStart, BiConsumer<Integer, SimulatorAction> tickEnd) {
|
||||
groups.forEach(simulatorGroup -> {
|
||||
simulatorGroup.toSimulatorActions(tickStart, tickEnd);
|
||||
});
|
||||
}
|
||||
|
||||
public Simulator add(SimulatorGroup group) {
|
||||
groups.add(group);
|
||||
return this;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* 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.data;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
public abstract class SimulatorBlockAlignedElement<T extends SimulatorPhase> extends SimulatorElement<T> {
|
||||
|
||||
protected SimulatorBlockAlignedElement(Material material, Vector position) {
|
||||
super(material, position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean canBeInGroup(SimulatorGroup simulatorGroup) {
|
||||
return simulatorGroup.getElements().stream().allMatch(SimulatorBlockAlignedElement.class::isInstance);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* 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.data;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorAction;
|
||||
import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui;
|
||||
import de.steamwar.inventory.InvCallback;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public abstract class SimulatorElement<T extends SimulatorPhase> {
|
||||
protected Material material;
|
||||
protected final Vector position;
|
||||
protected boolean disabled = false;
|
||||
protected final List<T> phases = new ArrayList<>();
|
||||
|
||||
protected SimulatorElement(Material material, Vector position) {
|
||||
this.material = material;
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
public SimulatorElement<T> add(T setting) {
|
||||
phases.add(setting);
|
||||
return this;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
phases.sort(Comparator.comparingInt(SimulatorPhase::getTickOffset));
|
||||
}
|
||||
|
||||
public abstract String getName(Player player);
|
||||
|
||||
public int getBaseTick() {
|
||||
return phases.stream()
|
||||
.mapToInt(value -> value.tickOffset)
|
||||
.min()
|
||||
.orElse(0);
|
||||
}
|
||||
|
||||
public void changeBaseTicks(int tick) {
|
||||
phases.forEach(t -> {
|
||||
t.tickOffset += tick;
|
||||
});
|
||||
}
|
||||
|
||||
public void move(double x, double y, double z) {
|
||||
position.setX(position.getX() + x);
|
||||
position.setY(position.getY() + y);
|
||||
position.setZ(position.getZ() + z);
|
||||
}
|
||||
|
||||
public abstract Material getWorldMaterial();
|
||||
|
||||
public abstract Material getWorldDisabledMaterial();
|
||||
|
||||
public abstract boolean canBeInGroup(SimulatorGroup simulatorGroup);
|
||||
|
||||
public Vector getWorldPos() {
|
||||
return position;
|
||||
}
|
||||
|
||||
public SWItem toItem(Player player, InvCallback invCallback) {
|
||||
List<String> lore = new ArrayList<>();
|
||||
lore.add("§7Phase count§8:§e " + phases.size());
|
||||
lore.add("§7Tick§8:§e " + getBaseTick());
|
||||
lore.add("");
|
||||
lore.add("§7X§8:§e " + position.getX());
|
||||
lore.add("§7Y§8:§e " + position.getY());
|
||||
lore.add("§7Z§8:§e " + position.getZ());
|
||||
if (disabled) {
|
||||
lore.add("");
|
||||
lore.add("§cDisabled");
|
||||
}
|
||||
return new SWItem(material, "§e" + getName(player), lore, disabled, invCallback);
|
||||
}
|
||||
|
||||
public void toSimulatorActions(BiConsumer<Integer, SimulatorAction> tickStart, BiConsumer<Integer, SimulatorAction> tickEnd) {
|
||||
if (disabled) return;
|
||||
phases.forEach(phase -> {
|
||||
phase.toSimulatorActions(position.clone(), tickStart, tickEnd);
|
||||
});
|
||||
}
|
||||
|
||||
public abstract void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back);
|
||||
|
||||
public SimulatorGroup getGroup(Simulator simulator) {
|
||||
return simulator.getGroups().stream()
|
||||
.filter(simulatorGroup -> simulatorGroup.getElements().contains(this))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
public abstract String getType();
|
||||
public void saveExtra(YAPIONObject elementObject) {}
|
||||
public void loadExtra(YAPIONObject elementObject) {}
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* 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.data;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorAction;
|
||||
import de.steamwar.inventory.InvCallback;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public final class SimulatorGroup {
|
||||
private Material material = Material.CHEST;
|
||||
private boolean disabled = false;
|
||||
private final List<SimulatorElement<?>> elements = new ArrayList<>();
|
||||
|
||||
public SimulatorGroup add(SimulatorElement<?> element) {
|
||||
if (!elements.contains(element)) {
|
||||
elements.add(element);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public void sort() {
|
||||
elements.sort(Comparator.comparingInt(SimulatorElement::getBaseTick));
|
||||
}
|
||||
|
||||
public int getBaseTick() {
|
||||
return elements.stream()
|
||||
.mapToInt(SimulatorElement::getBaseTick)
|
||||
.min()
|
||||
.orElse(0);
|
||||
}
|
||||
|
||||
public void changeBaseTicks(int tick) {
|
||||
elements.forEach(simulatorElement -> {
|
||||
simulatorElement.changeBaseTicks(tick);
|
||||
});
|
||||
}
|
||||
|
||||
public void move(double x, double y, double z) {
|
||||
elements.forEach(simulatorElement -> {
|
||||
simulatorElement.move(x, y, z);
|
||||
});
|
||||
}
|
||||
|
||||
public SWItem toItem(Player player, InvCallback groupCallback, InvCallback itemCallback) {
|
||||
if (elements.size() == 1) {
|
||||
return elements.get(0).toItem(player, itemCallback);
|
||||
} else {
|
||||
List<String> lore = new ArrayList<>();
|
||||
lore.add("§7Element count§8:§e " + elements.size());
|
||||
lore.add("§7Tick§8:§e " + getBaseTick());
|
||||
if (disabled) {
|
||||
lore.add("");
|
||||
lore.add("§cDisabled");
|
||||
}
|
||||
return new SWItem(material != null ? material : Material.ENDER_CHEST, "§eGroup", lore, disabled, groupCallback);
|
||||
}
|
||||
}
|
||||
|
||||
public void toSimulatorActions(BiConsumer<Integer, SimulatorAction> tickStart, BiConsumer<Integer, SimulatorAction> tickEnd) {
|
||||
if (disabled) return;
|
||||
elements.forEach(simulatorElement -> {
|
||||
simulatorElement.toSimulatorActions(tickStart, tickEnd);
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* 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.data;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorAction;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.util.Vector;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public abstract class SimulatorPhase {
|
||||
public static final int ORDER_LIMIT = 30;
|
||||
|
||||
protected int tickOffset = 0;
|
||||
protected int lifetime = 80;
|
||||
protected int order = 0;
|
||||
|
||||
public abstract void toSimulatorActions(Vector position, BiConsumer<Integer, SimulatorAction> tickStart, BiConsumer<Integer, SimulatorAction> tickEnd);
|
||||
public void saveExtra(YAPIONObject phaseObject) {}
|
||||
public void loadExtra(YAPIONObject phaseObject) {}
|
||||
}
|
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* 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.data.observer;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorBlockAlignedElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorGroup;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorPhase;
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorAction;
|
||||
import de.steamwar.bausystem.features.simulator.gui.SimulatorObserverGui;
|
||||
import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
public final class ObserverElement extends SimulatorBlockAlignedElement<ObserverPhase> {
|
||||
|
||||
public ObserverElement(Vector position) {
|
||||
super(Material.OBSERVER, position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName(Player player) {
|
||||
return "Observer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getWorldMaterial() {
|
||||
return Material.OBSERVER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getWorldDisabledMaterial() {
|
||||
return Material.GRAY_STAINED_GLASS;
|
||||
}
|
||||
|
||||
public void toSimulatorActions(BiConsumer<Integer, SimulatorAction> tickStart, BiConsumer<Integer, SimulatorAction> tickEnd) {
|
||||
if (disabled) return;
|
||||
phases.forEach(phase -> {
|
||||
phase.toSimulatorActions(position.clone(), tickStart, tickEnd);
|
||||
});
|
||||
|
||||
int end = phases.stream().mapToInt(SimulatorPhase::getTickOffset).max().orElse(0) + 4;
|
||||
AtomicReference<BlockState> blockState = new AtomicReference<>();
|
||||
tickStart.accept(0, new SimulatorAction(-100, 1) {
|
||||
@Override
|
||||
public void accept(World world) {
|
||||
Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
||||
blockState.set(block.getState());
|
||||
block.setType(Material.OBSERVER, false);
|
||||
}
|
||||
});
|
||||
tickEnd.accept(end, new SimulatorAction(0, 1) {
|
||||
@Override
|
||||
public void accept(World world) {
|
||||
BlockState oldState = blockState.get();
|
||||
if (oldState != null) {
|
||||
oldState.update(true, true);
|
||||
} else {
|
||||
Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
||||
block.setType(Material.AIR);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) {
|
||||
new SimulatorObserverGui(player, simulator, group, this, back).open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "Observer";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2023 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.simulator.data.observer;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorPhase;
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorAction;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.data.type.Observer;
|
||||
import org.bukkit.util.Vector;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
@NoArgsConstructor
|
||||
public final class ObserverPhase extends SimulatorPhase {
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
private BlockFace orientation = BlockFace.UP;
|
||||
|
||||
public ObserverPhase(int tickOffset) {
|
||||
this.tickOffset = tickOffset;
|
||||
}
|
||||
|
||||
{
|
||||
this.lifetime = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toSimulatorActions(Vector position, BiConsumer<Integer, SimulatorAction> tickStart, BiConsumer<Integer, SimulatorAction> tickEnd) {
|
||||
Observer observer = (Observer) Material.OBSERVER.createBlockData();
|
||||
observer.setFacing(orientation.getOppositeFace());
|
||||
observer.setPowered(true);
|
||||
|
||||
tickStart.accept(tickOffset, new SimulatorAction(order, 1) {
|
||||
@Override
|
||||
public void accept(World world) {
|
||||
Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
||||
Block updateBlock = block.getRelative(orientation);
|
||||
BlockState state = updateBlock.getState();
|
||||
updateBlock.setType(Material.SPONGE, true);
|
||||
block.setBlockData(observer, true);
|
||||
state.update(true, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveExtra(YAPIONObject phaseObject) {
|
||||
phaseObject.add("orientation", orientation.name());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadExtra(YAPIONObject phaseObject) {
|
||||
orientation = BlockFace.valueOf(phaseObject.getPlainValue("orientation"));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* 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.data.redstone;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorBlockAlignedElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorGroup;
|
||||
import de.steamwar.bausystem.features.simulator.gui.SimulatorRedstoneGui;
|
||||
import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
public final class RedstoneElement extends SimulatorBlockAlignedElement<RedstonePhase> {
|
||||
|
||||
public RedstoneElement(Vector position) {
|
||||
super(Material.REDSTONE_BLOCK, position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName(Player player) {
|
||||
return "Redstone";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getWorldMaterial() {
|
||||
return Material.REDSTONE_BLOCK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getWorldDisabledMaterial() {
|
||||
return Material.WHITE_STAINED_GLASS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector getWorldPos() {
|
||||
return position.clone().add(new Vector(0.5, 0, 0.5));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) {
|
||||
new SimulatorRedstoneGui(player, simulator, group, this, back).open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "Redstone";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
|
||||
/*
|
||||
* 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.data.redstone;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorPhase;
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorAction;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
@NoArgsConstructor
|
||||
public final class RedstonePhase extends SimulatorPhase {
|
||||
|
||||
public RedstonePhase(int tickOffset) {
|
||||
this.tickOffset = tickOffset;
|
||||
}
|
||||
|
||||
{
|
||||
this.lifetime = 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toSimulatorActions(Vector position, BiConsumer<Integer, SimulatorAction> tickStart, BiConsumer<Integer, SimulatorAction> tickEnd) {
|
||||
AtomicReference<BlockState> blockState = new AtomicReference<>();
|
||||
tickStart.accept(tickOffset, new SimulatorAction(order, 1) {
|
||||
@Override
|
||||
public void accept(World world) {
|
||||
Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
||||
blockState.set(block.getState());
|
||||
block.setType(Material.REDSTONE_BLOCK);
|
||||
}
|
||||
});
|
||||
tickStart.accept(tickOffset + lifetime, new SimulatorAction(ORDER_LIMIT + 1, 1) {
|
||||
@Override
|
||||
public void accept(World world) {
|
||||
BlockState state = blockState.get();
|
||||
if (state != null) {
|
||||
state.update(true, true);
|
||||
} else {
|
||||
Block block = world.getBlockAt(position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
||||
block.setType(Material.AIR);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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.data.tnt;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorGroup;
|
||||
import de.steamwar.bausystem.features.simulator.gui.SimulatorTNTGui;
|
||||
import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui;
|
||||
import de.steamwar.inventory.InvCallback;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
|
||||
public final class TNTElement extends SimulatorElement<TNTPhase> {
|
||||
|
||||
public static final double SUB_PIXEL = 0.00999999046326;
|
||||
@Getter
|
||||
private final Vector alignment = new Vector();
|
||||
|
||||
public TNTElement(Vector position) {
|
||||
super(Material.TNT, position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName(Player player) {
|
||||
return "TNT";
|
||||
}
|
||||
|
||||
public void move(double x, double y, double z) {
|
||||
position.setX(position.getX() + x);
|
||||
position.setY(position.getY() + y);
|
||||
position.setZ(position.getZ() + z);
|
||||
}
|
||||
|
||||
public void alignX(int direction) {
|
||||
position.setX(position.getX() - SUB_PIXEL * alignment.getX());
|
||||
alignment.setX(direction);
|
||||
position.setX(position.getX() + SUB_PIXEL * alignment.getX());
|
||||
}
|
||||
|
||||
public void alignZ(int direction) {
|
||||
position.setZ(position.getZ() - SUB_PIXEL * alignment.getZ());
|
||||
alignment.setZ(direction);
|
||||
position.setZ(position.getZ() + SUB_PIXEL * alignment.getZ());
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem toItem(Player player, InvCallback invCallback) {
|
||||
long sum = phases.stream().mapToInt(TNTPhase::getCount).sum();
|
||||
SWItem swItem = super.toItem(player, invCallback);
|
||||
swItem.getItemStack().setAmount((int) Math.min(64, Math.max(1, sum)));
|
||||
swItem.setName("§e" + getName(player) + "§8:§7 " + sum);
|
||||
return swItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getWorldMaterial() {
|
||||
return Material.TNT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getWorldDisabledMaterial() {
|
||||
return Material.RED_STAINED_GLASS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeInGroup(SimulatorGroup simulatorGroup) {
|
||||
return simulatorGroup.getElements().stream().allMatch(TNTElement.class::isInstance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open(Player player, Simulator simulator, SimulatorGroup group, SimulatorBaseGui back) {
|
||||
new SimulatorTNTGui(player, simulator, this, group, back).open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return "TNT";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveExtra(YAPIONObject elementObject) {
|
||||
elementObject.add("alignmentX", alignment.getX());
|
||||
elementObject.add("alignmentZ", alignment.getZ());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadExtra(YAPIONObject elementObject) {
|
||||
alignment.setX(elementObject.getDoubleOrSetDefault("alignmentX", 0));
|
||||
alignment.setZ(elementObject.getDoubleOrSetDefault("alignmentZ", 0));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* 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.data.tnt;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorPhase;
|
||||
import de.steamwar.bausystem.features.simulator.execute.SimulatorAction;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.region.flags.Flag;
|
||||
import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.util.Vector;
|
||||
import yapion.hierarchy.types.YAPIONObject;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
public final class TNTPhase extends SimulatorPhase {
|
||||
private int count = 1;
|
||||
private boolean xJump = false;
|
||||
private boolean yJump = false;
|
||||
private boolean zJump = false;
|
||||
|
||||
public TNTPhase(int tickOffset) {
|
||||
this.tickOffset = tickOffset;
|
||||
}
|
||||
|
||||
public boolean hasJump() {
|
||||
return xJump || yJump || zJump;
|
||||
}
|
||||
|
||||
public void setJump(boolean jump) {
|
||||
xJump = jump;
|
||||
yJump = jump;
|
||||
zJump = jump;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toSimulatorActions(Vector position, BiConsumer<Integer, SimulatorAction> tickStart, BiConsumer<Integer, SimulatorAction> tickEnd) {
|
||||
tickStart.accept(tickOffset, new SimulatorAction(order, count) {
|
||||
@Override
|
||||
public void accept(World world) {
|
||||
Location location = position.toLocation(world);
|
||||
if (Region.getRegion(location).get(Flag.FREEZE) == FreezeMode.ACTIVE) return;
|
||||
TNTPrimed tnt = world.spawn(location, TNTPrimed.class);
|
||||
if (!xJump) tnt.setVelocity(tnt.getVelocity().setX(0));
|
||||
if (!yJump) tnt.setVelocity(tnt.getVelocity().setY(0));
|
||||
if (!zJump) tnt.setVelocity(tnt.getVelocity().setZ(0));
|
||||
tnt.setFuseTicks(lifetime);
|
||||
}
|
||||
});
|
||||
tickEnd.accept(tickOffset + lifetime, new SimulatorAction(0, 1) {
|
||||
@Override
|
||||
public void accept(World world) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveExtra(YAPIONObject phaseObject) {
|
||||
phaseObject.add("count", count);
|
||||
phaseObject.add("xJump", xJump);
|
||||
phaseObject.add("yJump", yJump);
|
||||
phaseObject.add("zJump", zJump);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadExtra(YAPIONObject phaseObject) {
|
||||
count = phaseObject.getPlainValue("count");
|
||||
xJump = phaseObject.getPlainValue("xJump");
|
||||
yJump = phaseObject.getPlainValue("yJump");
|
||||
zJump = phaseObject.getPlainValue("zJump");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2023 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.simulator.execute;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.World;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public abstract class SimulatorAction implements Consumer<World> {
|
||||
private int order;
|
||||
|
||||
@Setter
|
||||
private int count;
|
||||
}
|
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
* 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.execute;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorGroup;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
import de.steamwar.bausystem.features.tracer.TraceRecorder;
|
||||
import de.steamwar.bausystem.region.Region;
|
||||
import de.steamwar.bausystem.utils.TickEndEvent;
|
||||
import de.steamwar.bausystem.utils.TickStartEvent;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.MinVersion;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
@Linked
|
||||
@MinVersion(19)
|
||||
public class SimulatorExecutor implements Listener {
|
||||
|
||||
private static final World WORLD = Bukkit.getWorlds().get(0);
|
||||
private static Set<Simulator> currentlyRunning = new HashSet<>();
|
||||
private static Map<Long, Map<Integer, List<SimulatorAction>>> tickStartActions = new HashMap<>();
|
||||
private static Map<Long, List<SimulatorAction>> tickEndActions = new HashMap<>();
|
||||
|
||||
public static boolean run(Simulator simulator) {
|
||||
if (currentlyRunning.contains(simulator)) return false;
|
||||
currentlyRunning.add(simulator);
|
||||
|
||||
long currentTick = TPSUtils.currentRealTick.get();
|
||||
AtomicLong lastTick = new AtomicLong();
|
||||
simulator.toSimulatorActions((tickOffset, simulatorAction) -> {
|
||||
lastTick.set(Math.max(lastTick.get(), tickOffset));
|
||||
tickStartActions.computeIfAbsent(currentTick + tickOffset, __ -> new HashMap<>())
|
||||
.computeIfAbsent(simulatorAction.getOrder(), __ -> new ArrayList<>())
|
||||
.add(simulatorAction);
|
||||
}, (tickOffset, simulatorAction) -> {
|
||||
lastTick.set(Math.max(lastTick.get(), tickOffset));
|
||||
tickEndActions.computeIfAbsent(currentTick + tickOffset, __ -> new ArrayList<>())
|
||||
.add(simulatorAction);
|
||||
});
|
||||
|
||||
tickEndActions.computeIfAbsent(currentTick + lastTick.get() + 4, __ -> new ArrayList<>())
|
||||
.add(new SimulatorAction(0, 1) {
|
||||
@Override
|
||||
public void accept(World world) {
|
||||
currentlyRunning.remove(simulator);
|
||||
|
||||
if (simulator.isAutoTrace()) {
|
||||
simulator.getGroups()
|
||||
.stream()
|
||||
.map(SimulatorGroup::getElements)
|
||||
.flatMap(List::stream)
|
||||
.map(SimulatorElement::getPosition)
|
||||
.map(pos -> pos.toLocation(WORLD))
|
||||
.map(Region::getRegion)
|
||||
.distinct()
|
||||
.forEach(region -> {
|
||||
TraceRecorder.instance.stopRecording(region);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (simulator.isAutoTrace()) {
|
||||
simulator.getGroups()
|
||||
.stream()
|
||||
.map(SimulatorGroup::getElements)
|
||||
.flatMap(List::stream)
|
||||
.map(SimulatorElement::getPosition)
|
||||
.map(pos -> pos.toLocation(WORLD))
|
||||
.map(Region::getRegion)
|
||||
.distinct()
|
||||
.forEach(region -> {
|
||||
TraceRecorder.instance.startRecording(region);
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onTickStart(TickStartEvent event) {
|
||||
long currentTick = TPSUtils.currentRealTick.get();
|
||||
Map<Integer, List<SimulatorAction>> actionsToRun = tickStartActions.remove(currentTick);
|
||||
if (actionsToRun == null) return;
|
||||
|
||||
List<Integer> keys = new ArrayList<>(actionsToRun.keySet());
|
||||
keys.sort(null);
|
||||
for (int actionKey : keys) {
|
||||
runActions(actionsToRun.get(actionKey));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onTickEnd(TickEndEvent event) {
|
||||
long currentTick = TPSUtils.currentRealTick.get() - 1;
|
||||
List<SimulatorAction> actionsToRun = tickEndActions.remove(currentTick);
|
||||
if (actionsToRun == null) return;
|
||||
runActions(actionsToRun);
|
||||
}
|
||||
|
||||
private void runActions(List<SimulatorAction> actionsToRun) {
|
||||
while (!actionsToRun.isEmpty()) {
|
||||
Collections.shuffle(actionsToRun);
|
||||
for (int i = actionsToRun.size() - 1 ; i >= 0; i--) {
|
||||
SimulatorAction action = actionsToRun.get(i);
|
||||
action.accept(WORLD);
|
||||
action.setCount(action.getCount() - 1);
|
||||
if (action.getCount() == 0) {
|
||||
actionsToRun.remove(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/*
|
||||
* 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.simulator.gui;
|
||||
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
@UtilityClass
|
||||
public class ItemUtils {
|
||||
|
||||
public static SWItem unique(SWItem swItem) {
|
||||
ItemMeta itemMeta = swItem.getItemMeta();
|
||||
itemMeta.getPersistentDataContainer().set(NamespacedKey.minecraft(UUID.randomUUID().toString()), PersistentDataType.INTEGER, 0);
|
||||
swItem.setItemMeta(itemMeta);
|
||||
return swItem;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* 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.gui;
|
||||
|
||||
import de.steamwar.bausystem.features.simulator.SimulatorWatcher;
|
||||
import de.steamwar.bausystem.features.simulator.data.Simulator;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorElement;
|
||||
import de.steamwar.bausystem.features.simulator.data.SimulatorGroup;
|
||||
import de.steamwar.bausystem.features.simulator.gui.base.SimulatorBaseGui;
|
||||
import de.steamwar.bausystem.features.simulator.gui.base.SimulatorPageGui;
|
||||
import de.steamwar.inventory.InvCallback;
|
||||
import de.steamwar.inventory.SWItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class SimulatorGroupChooserGui extends SimulatorPageGui<SimulatorGroup> {
|
||||
|
||||
private final SimulatorElement<?> subject;
|
||||
private final SimulatorGroup parent;
|
||||
private final SimulatorBaseGui back;
|
||||
|
||||
public SimulatorGroupChooserGui(Player player, Simulator simulator, SimulatorElement<?> subject, SimulatorGroup parent, SimulatorBaseGui back) {
|
||||
super(player, simulator, 6 * 9, simulator.getGroups().stream().filter(e -> e != parent).filter(e -> subject.canBeInGroup(e)).collect(Collectors.toList()));
|
||||
this.subject = subject;
|
||||
this.parent = parent;
|
||||
this.back = back;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headerAndFooter() {
|
||||
inventory.setItem(4, new SWItem(simulator.getMaterial(), "§e" + simulator.getName(), clickType -> {
|
||||
}));
|
||||
if (parent.getElements().size() != 1) {
|
||||
inventory.setItem(49, new SWItem(Material.BARRIER, "§cRemove from Group", clickType -> {
|
||||
SimulatorGroup newParent = new SimulatorGroup();
|
||||
newParent.add(subject);
|
||||
simulator.getGroups().add(newParent);
|
||||
parent.getElements().remove(subject);
|
||||
back.open();
|
||||
SimulatorWatcher.update(simulator);
|
||||
if (parent.getElements().size() == 1) {
|
||||
parent.setDisabled(false);
|
||||
parent.setMaterial(Material.BARREL);
|
||||
}
|
||||
}));
|
||||
}
|
||||
inventory.addCloseCallback(clickType -> {
|
||||
back.open();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public String baseTitle() {
|
||||
return "Choose Group";
|
||||
}
|
||||
|
||||
@Override
|
||||
public SWItem convert(SimulatorGroup simulatorGroup) {
|
||||
InvCallback invCallback = clickType -> {
|
||||
simulatorGroup.add(subject);
|
||||
parent.getElements().remove(subject);
|
||||
if (parent.getElements().size() == 1) {
|
||||
parent.setDisabled(false);
|
||||
parent.setMaterial(Material.BARREL);
|
||||
}
|
||||
back.open();
|
||||
SimulatorWatcher.update(simulator);
|
||||
};
|
||||
return simulatorGroup.toItem(player, invCallback, invCallback);
|
||||
}
|
||||
}
|
Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren