Commits vergleichen
516 Commits
Autor | SHA1 | Datum | |
---|---|---|---|
|
47d5f29ae6 | ||
|
552a1ea7fc | ||
|
d77e8e829e | ||
|
bd06bce3dc | ||
|
76ecc8e6e4 | ||
|
820e7fcbb2 | ||
|
94958de2da | ||
|
2214b7dc3d | ||
75e6b28e0e | |||
a1dd919afa | |||
|
2b0b2a08d7 | ||
|
7fc76e5e2a | ||
|
5153609776 | ||
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 | ||
|
5de070c90e | ||
|
c330fdcc1d | ||
|
40dcee6eee | ||
|
04e7c5f565 | ||
|
89e8148158 | ||
|
d281860b81 | ||
|
05c01e25e2 | ||
|
f0741dbc19 | ||
|
e18b2622eb | ||
|
2b3f2a72d7 | ||
|
8128aa7324 | ||
|
83a281b278 | ||
|
6197fd81c1 | ||
|
fcb1ce4e4b | ||
|
f82d5815ee | ||
|
71f1a1244e | ||
|
3183d71478 | ||
cf569d6e76 | |||
|
cc8c6ba61d | ||
|
b8c74db0f3 | ||
|
643486cfe5 | ||
|
1a93f2fc41 | ||
|
8217e9645b | ||
|
925ba19ff3 | ||
|
c0b40d00a5 | ||
|
b1cd4604eb | ||
|
2f5eb080cf | ||
|
910762126f | ||
|
207953cb98 | ||
|
9982804a20 | ||
|
898d6269e5 | ||
|
8da3c7bcf7 | ||
|
71c8b7c062 | ||
|
a0c7f024ad | ||
|
cbe41f7e7f | ||
|
06cc2bb35b | ||
|
b956f34a7e | ||
|
c08bb9d702 | ||
|
33e070bc43 | ||
|
22334ab15a | ||
|
438010a7fb | ||
|
c0880fc62a | ||
|
d810d50d22 | ||
|
451c47d3ed | ||
|
5abd29056b | ||
|
b47210a5ae | ||
|
110172a98a | ||
|
292907b735 | ||
|
a59bf7345f | ||
|
952d2f03dc | ||
|
7cd8d40e11 | ||
|
c20eb8c331 | ||
|
f7cfe5d2bd | ||
|
b59a4a637e | ||
|
23fba7074d | ||
|
42e8df6b53 | ||
|
91960f501b | ||
|
9c9d7bc533 | ||
|
adc394e660 | ||
|
13afc55b1f | ||
|
8ecb6e173f | ||
|
bf2de904dc | ||
|
f2978a16c0 | ||
|
9e9c653aba | ||
|
1da569c41b | ||
|
ce6c101df3 | ||
c6a045fe94 | |||
|
e2779ba107 | ||
|
ce1de0dfdf | ||
|
6096d48a05 | ||
|
db349c2a05 | ||
|
6400e20bbb | ||
|
a8aa431210 | ||
|
85b383c596 | ||
|
b434a406e0 | ||
4ec83673cf | |||
d3a49bbeb0 | |||
|
0c6b1b7f68 | ||
|
ecc24470f6 | ||
|
56f7fddb0e | ||
|
8e4b383655 | ||
|
a0fe836616 | ||
|
213667541c | ||
5897b1da75 | |||
|
9af09f5863 | ||
|
59caeca6f7 | ||
|
f6e71a03c1 | ||
|
88e772896c | ||
|
11ce513ec2 | ||
|
4afaec91bb | ||
|
98b5b8605e | ||
dce679afa2 | |||
eec5e97842 | |||
|
ed862ba6b2 | ||
|
ca907a7478 | ||
|
00dcfe3a49 | ||
|
02c095a946 | ||
|
7f3c0d2fd0 | ||
|
fc03ba67e5 | ||
|
3e27a0b366 | ||
|
c398ad239d | ||
|
82b385e5ff | ||
|
a1c45b86af | ||
|
b5e67bc576 | ||
|
9ca83f02d9 | ||
|
13ec64a4fa | ||
|
bae39e2921 | ||
|
814a5f4364 | ||
|
b02eda9fe8 | ||
|
ad55b25cf0 | ||
|
8a01394092 | ||
|
86df9ceef6 | ||
|
d8b93e976f | ||
|
6ab820ad71 | ||
|
c3f75cdc2a | ||
|
bdd437eebd | ||
|
531fb013aa | ||
|
b1e376d47f | ||
|
3584b83b28 | ||
|
3c30f57e08 | ||
|
edfc331d03 | ||
|
9ad455ea2d | ||
|
1fe2394e01 | ||
|
9003884dad | ||
8ebef6d097 | |||
542adab804 | |||
|
69347e652f | ||
|
d4c38367c7 | ||
|
966a7336e1 | ||
|
65f11dc917 | ||
|
6afc5f3e81 | ||
|
3e703c8b06 | ||
fdd579af5a | |||
|
040f0373c8 | ||
|
361d96ddf3 | ||
|
df882e3382 | ||
|
de2a393bf8 | ||
|
37559ca688 | ||
|
f53f0cedd9 | ||
|
a1880a61e9 | ||
|
040b25d601 | ||
|
f9c61808bb | ||
|
9d644782a8 | ||
|
2f66580e60 | ||
|
5d55784f79 | ||
|
55a63dacaf | ||
|
4bae6b8d43 | ||
|
5c8b70fc12 | ||
|
d2a3483d31 | ||
|
cdc0dbea86 | ||
|
3d8a6e95fa | ||
|
8a425cc435 | ||
|
50d4e7ef2f |
8
.gitignore
vendored
8
.gitignore
vendored
@ -1,5 +1,7 @@
|
|||||||
# Package Files
|
# Build files
|
||||||
*.jar
|
*.jar
|
||||||
|
**/bin
|
||||||
|
**/build
|
||||||
|
|
||||||
# Gradle
|
# Gradle
|
||||||
.gradle
|
.gradle
|
||||||
@ -10,6 +12,10 @@ steamwar.properties
|
|||||||
# IntelliJ IDEA
|
# IntelliJ IDEA
|
||||||
.idea
|
.idea
|
||||||
*.iml
|
*.iml
|
||||||
|
plugin.yml
|
||||||
|
|
||||||
# Other
|
# Other
|
||||||
lib
|
lib
|
||||||
|
|
||||||
|
#linkage
|
||||||
|
LinkageUtils.java
|
@ -27,8 +27,8 @@ version '1.0'
|
|||||||
|
|
||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 17
|
||||||
targetCompatibility = 1.8
|
targetCompatibility = 17
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
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());
|
|
||||||
}
|
|
||||||
}
|
|
@ -37,14 +37,11 @@ import com.sk89q.worldedit.function.operation.Operations;
|
|||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.math.transform.AffineTransform;
|
import com.sk89q.worldedit.math.transform.AffineTransform;
|
||||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
|
||||||
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
|
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
|
||||||
import com.sk89q.worldedit.session.ClipboardHolder;
|
import com.sk89q.worldedit.session.ClipboardHolder;
|
||||||
import com.sk89q.worldedit.world.World;
|
import com.sk89q.worldedit.world.World;
|
||||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||||
import de.steamwar.bausystem.region.Color;
|
|
||||||
import de.steamwar.bausystem.region.PasteOptions;
|
|
||||||
import de.steamwar.bausystem.region.Point;
|
import de.steamwar.bausystem.region.Point;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -60,7 +57,12 @@ import java.io.File;
|
|||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import java.util.function.BiPredicate;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class FlatteningWrapper15 implements FlatteningWrapper {
|
public class FlatteningWrapper15 implements FlatteningWrapper {
|
||||||
@ -104,56 +106,55 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
|||||||
|
|
||||||
private static final WorldEditPlugin WORLDEDIT_PLUGIN = Objects.requireNonNull((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"));
|
private static final WorldEditPlugin WORLDEDIT_PLUGIN = Objects.requireNonNull((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"));
|
||||||
private static final World BUKKITWORLD = new BukkitWorld(Bukkit.getWorlds().get(0));
|
private static final World BUKKITWORLD = new BukkitWorld(Bukkit.getWorlds().get(0));
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSelection(Player p, Point minPoint, Point maxPoint) {
|
public void setSelection(Player p, Point minPoint, Point maxPoint) {
|
||||||
WORLDEDIT_PLUGIN.getSession(p).setRegionSelector(BUKKITWORLD, new CuboidRegionSelector(BUKKITWORLD, toBlockVector3(minPoint), toBlockVector3(maxPoint)));
|
WORLDEDIT_PLUGIN.getSession(p).setRegionSelector(BUKKITWORLD, new CuboidRegionSelector(BUKKITWORLD, toBlockVector3(minPoint), toBlockVector3(maxPoint)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final BaseBlock WOOL = Objects.requireNonNull(BlockTypes.PINK_WOOL).getDefaultState().toBaseBlock();
|
|
||||||
private static final BaseBlock CLAY = Objects.requireNonNull(BlockTypes.PINK_TERRACOTTA).getDefaultState().toBaseBlock();
|
|
||||||
private static final BaseBlock GLAZED = Objects.requireNonNull(BlockTypes.PINK_GLAZED_TERRACOTTA).getDefaultState().toBaseBlock();
|
|
||||||
private static final BaseBlock GLASS = Objects.requireNonNull(BlockTypes.PINK_STAINED_GLASS).getDefaultState().toBaseBlock();
|
|
||||||
private static final BaseBlock GLASS_PANE = Objects.requireNonNull(BlockTypes.PINK_STAINED_GLASS_PANE).getDefaultState().toBaseBlock();
|
|
||||||
private static final BaseBlock CONCRETE = Objects.requireNonNull(BlockTypes.PINK_CONCRETE).getDefaultState().toBaseBlock();
|
|
||||||
private static final BaseBlock CONCRETE_POWDER = Objects.requireNonNull(BlockTypes.PINK_CONCRETE_POWDER).getDefaultState().toBaseBlock();
|
|
||||||
private static final BaseBlock CARPET = Objects.requireNonNull(BlockTypes.PINK_CARPET).getDefaultState().toBaseBlock();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EditSession paste(File file, Point pastePoint, PasteOptions pasteOptions) {
|
public Clipboard loadSchematic(File file) {
|
||||||
Clipboard clipboard;
|
Clipboard clipboard;
|
||||||
try (ClipboardReader reader = Objects.requireNonNull(ClipboardFormats.findByFile(file)).getReader(new FileInputStream(file))) {
|
try (ClipboardReader reader = Objects.requireNonNull(ClipboardFormats.findByFile(file)).getReader(new FileInputStream(file))) {
|
||||||
clipboard = reader.read();
|
clipboard = reader.read();
|
||||||
} catch (NullPointerException | IOException e) {
|
} catch (NullPointerException | IOException e) {
|
||||||
throw new SecurityException("Bausystem schematic not found", e);
|
throw new SecurityException("Bausystem schematic not found", e);
|
||||||
}
|
}
|
||||||
|
return clipboard;
|
||||||
EditSession editSession = paste(clipboard, pastePoint, pasteOptions);
|
|
||||||
return editSession;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public EditSession paste(Clipboard clipboard, Point pastePoint, PasteOptions pasteOptions) {
|
public EditSession paste(PasteBuilder pasteBuilder) {
|
||||||
try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) {
|
try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) {
|
||||||
if (pasteOptions.getColor() != Color.PINK) {
|
Clipboard clipboard = pasteBuilder.getClipboard();
|
||||||
changeColor(clipboard, pasteOptions.getColor());
|
|
||||||
}
|
|
||||||
if (pasteOptions.isOnlyColors()) {
|
|
||||||
Set<String> blocks = new HashSet<>();
|
|
||||||
blocks.add("minecraft:" + pasteOptions.getColor().name().toLowerCase() + "_wool");
|
|
||||||
blocks.add("minecraft:" + pasteOptions.getColor().name().toLowerCase() + "_terracotta");
|
|
||||||
blocks.add("minecraft:" + pasteOptions.getColor().name().toLowerCase() + "_glazed_terracotta");
|
|
||||||
blocks.add("minecraft:" + pasteOptions.getColor().name().toLowerCase() + "_stained_glass");
|
|
||||||
blocks.add("minecraft:" + pasteOptions.getColor().name().toLowerCase() + "_stained_glass_pane");
|
|
||||||
blocks.add("minecraft:" + pasteOptions.getColor().name().toLowerCase() + "_concrete");
|
|
||||||
blocks.add("minecraft:" + pasteOptions.getColor().name().toLowerCase() + "_concrete_powder");
|
|
||||||
blocks.add("minecraft:" + pasteOptions.getColor().name().toLowerCase() + "_carpet");
|
|
||||||
|
|
||||||
|
if (!pasteBuilder.getMappers().isEmpty()) {
|
||||||
|
BlockVector3 minimum = clipboard.getRegion().getMinimumPoint();
|
||||||
|
for (int x = 0; x < clipboard.getDimensions().getX(); x++) {
|
||||||
|
for (int y = 0; y < clipboard.getDimensions().getY(); y++) {
|
||||||
|
for (int z = 0; z < clipboard.getDimensions().getZ(); z++) {
|
||||||
|
BlockVector3 pos = minimum.add(x, y, z);
|
||||||
|
pasteBuilder.getMappers().forEach(mapper -> mapper.accept(clipboard, pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AtomicReference<BlockVector3> pastePoint = new AtomicReference<>();
|
||||||
|
if (!pasteBuilder.getPredicates().isEmpty()) {
|
||||||
e.setMask(new Mask() {
|
e.setMask(new Mask() {
|
||||||
@Override
|
@Override
|
||||||
public boolean test(BlockVector3 blockVector3) {
|
public boolean test(BlockVector3 blockVector3) {
|
||||||
BaseBlock block = clipboard.getFullBlock(blockVector3);
|
BaseBlock block = clipboard.getFullBlock(blockVector3.subtract(pastePoint.get()).add(clipboard.getRegion().getMinimumPoint()));
|
||||||
String blockName = block.toString().toLowerCase();
|
String blockName = block.getBlockType().toString().toLowerCase();
|
||||||
return blocks.contains(blockName);
|
for (BiPredicate<BaseBlock, String> predicate : pasteBuilder.getPredicates()) {
|
||||||
|
if (!predicate.test(block, blockName)) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mask copy() {
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@ -161,31 +162,28 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
|||||||
public Mask2D toMask2D() {
|
public Mask2D toMask2D() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Mask copy() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ClipboardHolder ch = new ClipboardHolder(clipboard);
|
ClipboardHolder ch = new ClipboardHolder(clipboard);
|
||||||
BlockVector3 dimensions = clipboard.getDimensions();
|
BlockVector3 dimensions = clipboard.getDimensions();
|
||||||
BlockVector3 v = BlockVector3.at(pastePoint.getX(), pastePoint.getY(), pastePoint.getZ());
|
BlockVector3 v = BlockVector3.at(pasteBuilder.getPastPoint().getX(), pasteBuilder.getPastPoint().getY(), pasteBuilder.getPastPoint().getZ());
|
||||||
BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
|
BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
|
||||||
if (pasteOptions.isRotate()) {
|
if (pasteBuilder.isRotate()) {
|
||||||
ch.setTransform(new AffineTransform().rotateY(180));
|
ch.setTransform(new AffineTransform().rotateY(180));
|
||||||
v = v.add(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset.multiply(-1, 1, -1)).subtract(0, 0, 1);
|
v = v.add(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset.multiply(-1, 1, -1)).subtract(0, 0, 1);
|
||||||
} else {
|
} else {
|
||||||
v = v.subtract(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset);
|
v = v.subtract(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset);
|
||||||
}
|
}
|
||||||
|
pastePoint.set(v);
|
||||||
|
|
||||||
if (pasteOptions.isReset()) {
|
if (pasteBuilder.isReset()) {
|
||||||
e.setBlocks((Region) new CuboidRegion(toBlockVector3(pasteOptions.getMinPoint()), toBlockVector3(pasteOptions.getMaxPoint())), Objects.requireNonNull(BlockTypes.AIR).getDefaultState().toBaseBlock());
|
e.setBlocks(new CuboidRegion(toBlockVector3(pasteBuilder.getMinPoint()), toBlockVector3(pasteBuilder.getMaxPoint())), Objects.requireNonNull(BlockTypes.AIR).getDefaultState().toBaseBlock());
|
||||||
if (pasteOptions.getWaterLevel() != 0) {
|
if (pasteBuilder.getWaterLevel() != 0) {
|
||||||
e.setBlocks((Region) new CuboidRegion(toBlockVector3(pasteOptions.getMinPoint()), toBlockVector3(pasteOptions.getMaxPoint()).withY(pasteOptions.getWaterLevel())), Objects.requireNonNull(BlockTypes.WATER).getDefaultState().toBaseBlock());
|
e.setBlocks(new CuboidRegion(toBlockVector3(pasteBuilder.getMinPoint()), toBlockVector3(pasteBuilder.getMaxPoint()).withY(pasteBuilder.getWaterLevel())), Objects.requireNonNull(BlockTypes.WATER).getDefaultState().toBaseBlock());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Operations.completeBlindly(ch.createPaste(e).to(v).ignoreAirBlocks(pasteOptions.isIgnoreAir()).build());
|
Operations.completeBlindly(ch.createPaste(e).to(v).ignoreAirBlocks(pasteBuilder.isIgnoreAir()).build());
|
||||||
return e;
|
return e;
|
||||||
} catch (WorldEditException e) {
|
} catch (WorldEditException e) {
|
||||||
throw new SecurityException(e.getMessage(), e);
|
throw new SecurityException(e.getMessage(), e);
|
||||||
@ -193,46 +191,7 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void changeColor(Clipboard clipboard, Color color) throws WorldEditException {
|
public Clipboard copy(Point minPoint, Point maxPoint, Point copyPoint) {
|
||||||
BlockVector3 minimum = clipboard.getRegion().getMinimumPoint();
|
|
||||||
BaseBlock wool = Objects.requireNonNull(BlockTypes.get(color.name().toLowerCase() + "_wool")).getDefaultState().toBaseBlock();
|
|
||||||
BaseBlock clay = Objects.requireNonNull(BlockTypes.get(color.name().toLowerCase() + "_terracotta")).getDefaultState().toBaseBlock();
|
|
||||||
BaseBlock glazed = Objects.requireNonNull(BlockTypes.get(color.name().toLowerCase() + "_glazed_terracotta")).getDefaultState().toBaseBlock();
|
|
||||||
BaseBlock glass = Objects.requireNonNull(BlockTypes.get(color.name().toLowerCase() + "_stained_glass")).getDefaultState().toBaseBlock();
|
|
||||||
BaseBlock glassPane = Objects.requireNonNull(BlockTypes.get(color.name().toLowerCase() + "_stained_glass_pane")).getDefaultState().toBaseBlock();
|
|
||||||
BaseBlock carpet = Objects.requireNonNull(BlockTypes.get(color.name().toLowerCase() + "_carpet")).getDefaultState().toBaseBlock();
|
|
||||||
BaseBlock concrete = Objects.requireNonNull(BlockTypes.get(color.name().toLowerCase() + "_concrete")).getDefaultState().toBaseBlock();
|
|
||||||
BaseBlock concretePowder = Objects.requireNonNull(BlockTypes.get(color.name().toLowerCase() + "_concrete_powder")).getDefaultState().toBaseBlock();
|
|
||||||
|
|
||||||
for (int x = 0; x < clipboard.getDimensions().getX(); x++) {
|
|
||||||
for (int y = 0; y < clipboard.getDimensions().getY(); y++) {
|
|
||||||
for (int z = 0; z < clipboard.getDimensions().getZ(); z++) {
|
|
||||||
BlockVector3 pos = minimum.add(x, y, z);
|
|
||||||
BaseBlock block = clipboard.getFullBlock(pos);
|
|
||||||
if (block.equals(WOOL)) {
|
|
||||||
clipboard.setBlock(pos, wool);
|
|
||||||
} else if (block.equals(CLAY)) {
|
|
||||||
clipboard.setBlock(pos, clay);
|
|
||||||
} else if (block.equals(GLAZED)) {
|
|
||||||
clipboard.setBlock(pos, glazed);
|
|
||||||
} else if (block.equals(GLASS)) {
|
|
||||||
clipboard.setBlock(pos, glass);
|
|
||||||
} else if (block.equals(GLASS_PANE)) {
|
|
||||||
clipboard.setBlock(pos, glassPane);
|
|
||||||
} else if (block.equals(CARPET)) {
|
|
||||||
clipboard.setBlock(pos, carpet);
|
|
||||||
} else if (block.equals(CONCRETE)) {
|
|
||||||
clipboard.setBlock(pos, concrete);
|
|
||||||
} else if (block.equals(CONCRETE_POWDER)) {
|
|
||||||
clipboard.setBlock(pos, concretePowder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean backup(Point minPoint, Point maxPoint, File file) {
|
|
||||||
BukkitWorld bukkitWorld = new BukkitWorld(Bukkit.getWorlds().get(0));
|
BukkitWorld bukkitWorld = new BukkitWorld(Bukkit.getWorlds().get(0));
|
||||||
CuboidRegion region = new CuboidRegion(bukkitWorld, toBlockVector3(minPoint), toBlockVector3(maxPoint));
|
CuboidRegion region = new CuboidRegion(bukkitWorld, toBlockVector3(minPoint), toBlockVector3(maxPoint));
|
||||||
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
|
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
|
||||||
@ -245,12 +204,21 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
|||||||
copy.setCopyingBiomes(false);
|
copy.setCopyingBiomes(false);
|
||||||
|
|
||||||
Operations.complete(copy);
|
Operations.complete(copy);
|
||||||
|
clipboard.setOrigin(toBlockVector3(copyPoint));
|
||||||
|
return clipboard;
|
||||||
|
} catch (WorldEditException e) {
|
||||||
|
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(file))) {
|
@Override
|
||||||
writer.write(clipboard);
|
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;
|
return true;
|
||||||
} catch (WorldEditException | IOException e) {
|
} catch (IOException e) {
|
||||||
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -272,19 +240,4 @@ public class FlatteningWrapper15 implements FlatteningWrapper {
|
|||||||
|
|
||||||
return ((Waterlogged) data).isWaterlogged();
|
return ((Waterlogged) data).isWaterlogged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material getTraceShowMaterial() {
|
|
||||||
return Material.LIME_CONCRETE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material getTraceHideMaterial() {
|
|
||||||
return Material.RED_CONCRETE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Material getTraceXZMaterial() {
|
|
||||||
return Material.QUARTZ_SLAB;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -63,38 +63,6 @@ public class NMSWrapper15 implements NMSWrapper {
|
|||||||
player.updateInventory();
|
player.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(LongSupplier longSupplier) {
|
|
||||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final List<Packet<?>> packets = new ArrayList<>();
|
|
||||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void createTickCache(World world) {
|
|
||||||
packets.clear();
|
|
||||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
|
||||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
|
||||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
|
||||||
|
|
||||||
if (entity instanceof TNTPrimed) {
|
|
||||||
net.minecraft.server.v1_15_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
|
||||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.getId(), serverEntity.getDataWatcher(), true));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendTickPackets() {
|
|
||||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
|
||||||
PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
|
|
||||||
for (Packet<?> p : packets) {
|
|
||||||
connection.sendPacket(p);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Reflection.FieldAccessor<Integer> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, int.class, 0);
|
private static final Reflection.FieldAccessor<Integer> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, int.class, 0);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
43
BauSystem_15/src/de/steamwar/bausystem/utils/PlaceItemWrapper15.java
Normale Datei
43
BauSystem_15/src/de/steamwar/bausystem/utils/PlaceItemWrapper15.java
Normale Datei
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bausystem.utils;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
public class PlaceItemWrapper15 implements PlaceItemWrapper {
|
||||||
|
|
||||||
|
public PlaceItemWrapper15() {
|
||||||
|
for (Material material : Material.values()) {
|
||||||
|
if (!material.isBlock()) continue;
|
||||||
|
if (material.isLegacy()) continue;
|
||||||
|
|
||||||
|
String nonWall = material.name().replace("_WALL_", "").replace("WALL_", "").replace("_WALL", "");
|
||||||
|
try {
|
||||||
|
Material nonWallMaterial = Material.valueOf(nonWall);
|
||||||
|
if (nonWallMaterial != material && nonWallMaterial.isItem() && !nonWallMaterial.isBlock()) {
|
||||||
|
BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(nonWallMaterial, material);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(Material.REDSTONE, Material.REDSTONE_WIRE);
|
||||||
|
}
|
||||||
|
}
|
@ -19,9 +19,12 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.utils;
|
package de.steamwar.bausystem.utils;
|
||||||
|
|
||||||
|
import com.comphenix.tinyprotocol.Reflection;
|
||||||
import de.steamwar.bausystem.utils.PlayerMovementWrapper;
|
import de.steamwar.bausystem.utils.PlayerMovementWrapper;
|
||||||
import net.minecraft.server.v1_15_R1.EntityPlayer;
|
import net.minecraft.server.v1_15_R1.EntityPlayer;
|
||||||
import net.minecraft.server.v1_15_R1.PacketPlayInFlying;
|
import net.minecraft.server.v1_15_R1.PacketPlayInFlying;
|
||||||
|
import net.minecraft.server.v1_15_R1.PacketPlayOutEntity;
|
||||||
|
import net.minecraft.server.v1_15_R1.PacketPlayOutEntityTeleport;
|
||||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@ -37,4 +40,20 @@ public class PlayerMovementWrapper15 implements PlayerMovementWrapper {
|
|||||||
entityPlayer.setLocation(packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0), packetPlayInFlying.a(0F), packetPlayInFlying.b(0F));
|
entityPlayer.setLocation(packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0), packetPlayInFlying.a(0F), packetPlayInFlying.b(0F));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object convertToOut(Player player, Object object) {
|
||||||
|
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||||
|
Object packet = Reflection.newInstance(teleportPacket);
|
||||||
|
teleportEntity.set(packet, player.getEntityId());
|
||||||
|
teleportPosition.set(packet, packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0));
|
||||||
|
if (Float.isNaN(packetPlayInFlying.a(Float.NaN))) {
|
||||||
|
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw()));
|
||||||
|
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
|
||||||
|
} else {
|
||||||
|
teleportYaw.set(packet, rotToByte(packetPlayInFlying.a(0.0F)));
|
||||||
|
teleportPitch.set(packet, rotToByte(packetPlayInFlying.b(0.0F)));
|
||||||
|
}
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
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'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 17
|
||||||
targetCompatibility = 1.8
|
targetCompatibility = 17
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
|
@ -1,41 +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.world.entity.item.EntityTNTPrimed;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
|
|
||||||
import org.bukkit.entity.TNTPrimed;
|
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
import java.util.stream.StreamSupport;
|
|
||||||
|
|
||||||
public class TNTPrimedIterator18 implements TNTPrimedIterator {
|
|
||||||
|
|
||||||
private static final CraftWorld WORLD = (CraftWorld) Bukkit.getWorlds().get(0);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Stream<TNTPrimed> iterator() {
|
|
||||||
return StreamSupport.stream(WORLD.getHandle().H().a().spliterator(), false)
|
|
||||||
.filter(EntityTNTPrimed.class::isInstance)
|
|
||||||
.map(entity -> (TNTPrimed) entity.getBukkitEntity());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -73,37 +73,6 @@ public class NMSWrapper18 implements NMSWrapper {
|
|||||||
player.updateInventory();
|
player.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(LongSupplier longSupplier) {
|
|
||||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final List<Packet<?>> packets = new ArrayList<>();
|
|
||||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void createTickCache(World world) {
|
|
||||||
packets.clear();
|
|
||||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
|
||||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
|
||||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
|
||||||
|
|
||||||
if (entity instanceof TNTPrimed) {
|
|
||||||
net.minecraft.world.entity.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
|
||||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.ae(), serverEntity.ai(), true));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendTickPackets() {
|
|
||||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
|
||||||
for (Packet<?> p : packets) {
|
|
||||||
TinyProtocol.instance.sendPacket(player, p);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
|
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.utils;
|
package de.steamwar.bausystem.utils;
|
||||||
|
|
||||||
|
import com.comphenix.tinyprotocol.Reflection;
|
||||||
import de.steamwar.bausystem.utils.PlayerMovementWrapper;
|
import de.steamwar.bausystem.utils.PlayerMovementWrapper;
|
||||||
import net.minecraft.network.protocol.game.PacketPlayInFlying;
|
import net.minecraft.network.protocol.game.PacketPlayInFlying;
|
||||||
import net.minecraft.server.level.EntityPlayer;
|
import net.minecraft.server.level.EntityPlayer;
|
||||||
@ -37,4 +38,20 @@ public class PlayerMovementWrapper18 implements PlayerMovementWrapper {
|
|||||||
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object convertToOut(Player player, Object object) {
|
||||||
|
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||||
|
Object packet = Reflection.newInstance(teleportPacket);
|
||||||
|
teleportEntity.set(packet, player.getEntityId());
|
||||||
|
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||||
|
if (packetPlayInFlying.h) {
|
||||||
|
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw()));
|
||||||
|
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
|
||||||
|
} else {
|
||||||
|
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
|
||||||
|
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
|
||||||
|
}
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,8 @@ version '1.0'
|
|||||||
|
|
||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 17
|
||||||
targetCompatibility = 1.8
|
targetCompatibility = 17
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
@ -51,6 +51,7 @@ dependencies {
|
|||||||
implementation project(":BauSystem_Main")
|
implementation project(":BauSystem_Main")
|
||||||
|
|
||||||
compileOnly 'org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT'
|
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 'it.unimi.dsi:fastutil:8.5.6'
|
||||||
compileOnly 'com.mojang:datafixerupper:4.0.26'
|
compileOnly 'com.mojang:datafixerupper:4.0.26'
|
||||||
compileOnly 'io.netty:netty-all:4.1.68.Final'
|
compileOnly 'io.netty:netty-all:4.1.68.Final'
|
||||||
|
@ -1,41 +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.world.entity.item.EntityTNTPrimed;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
|
|
||||||
import org.bukkit.entity.TNTPrimed;
|
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
import java.util.stream.StreamSupport;
|
|
||||||
|
|
||||||
public class TNTPrimedIterator19 implements TNTPrimedIterator {
|
|
||||||
|
|
||||||
private static final CraftWorld WORLD = (CraftWorld) Bukkit.getWorlds().get(0);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Stream<TNTPrimed> iterator() {
|
|
||||||
return StreamSupport.stream(WORLD.getHandle().F().a().spliterator(), false)
|
|
||||||
.filter(EntityTNTPrimed.class::isInstance)
|
|
||||||
.map(entity -> (TNTPrimed) entity.getBukkitEntity());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -55,7 +55,6 @@ public class NMSWrapper19 implements NMSWrapper {
|
|||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public void setInternalGameMode(Player player, GameMode gameMode) {
|
public void setInternalGameMode(Player player, GameMode gameMode) {
|
||||||
playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue()));
|
playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -74,39 +73,6 @@ public class NMSWrapper19 implements NMSWrapper {
|
|||||||
player.updateInventory();
|
player.updateInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(LongSupplier longSupplier) {
|
|
||||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final List<Packet<?>> packets = new ArrayList<>();
|
|
||||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void createTickCache(World world) {
|
|
||||||
packets.clear();
|
|
||||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
|
||||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
|
||||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
|
||||||
|
|
||||||
if (entity instanceof TNTPrimed) {
|
|
||||||
net.minecraft.world.entity.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
|
||||||
List<DataWatcher.b<?>> list = serverEntity.al().c();
|
|
||||||
if(list != null)
|
|
||||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.ah(), list));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sendTickPackets() {
|
|
||||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
|
||||||
for (Packet<?> p : packets) {
|
|
||||||
TinyProtocol.instance.sendPacket(player, p);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
|
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.utils;
|
package de.steamwar.bausystem.utils;
|
||||||
|
|
||||||
|
import com.comphenix.tinyprotocol.Reflection;
|
||||||
import net.minecraft.network.protocol.game.PacketPlayInFlying;
|
import net.minecraft.network.protocol.game.PacketPlayInFlying;
|
||||||
import net.minecraft.server.level.EntityPlayer;
|
import net.minecraft.server.level.EntityPlayer;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@ -31,50 +32,30 @@ import java.util.UUID;
|
|||||||
|
|
||||||
public class PlayerMovementWrapper19 implements PlayerMovementWrapper {
|
public class PlayerMovementWrapper19 implements PlayerMovementWrapper {
|
||||||
|
|
||||||
private static class Position {
|
|
||||||
private double x;
|
|
||||||
private double y;
|
|
||||||
private double z;
|
|
||||||
private float yaw;
|
|
||||||
private float pitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Map<UUID, Position> playerLocationMap = new HashMap<>();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPosition(Player player, Object object) {
|
public void setPosition(Player player, Object object) {
|
||||||
Position position = playerLocationMap.computeIfAbsent(player.getUniqueId(), uuid -> {
|
|
||||||
Position pos = new Position();
|
|
||||||
Location location = player.getLocation();
|
|
||||||
pos.x = location.getX();
|
|
||||||
pos.y = location.getY();
|
|
||||||
pos.z = location.getZ();
|
|
||||||
pos.yaw = location.getYaw();
|
|
||||||
pos.pitch = location.getPitch();
|
|
||||||
return pos;
|
|
||||||
});
|
|
||||||
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||||
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||||
if (packetPlayInFlying.h) {
|
if (packetPlayInFlying.h) {
|
||||||
entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
|
entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
|
||||||
position.x = packetPlayInFlying.a;
|
|
||||||
position.y = packetPlayInFlying.b;
|
|
||||||
position.z = packetPlayInFlying.c;
|
|
||||||
position.yaw = packetPlayInFlying.d;
|
|
||||||
position.pitch = packetPlayInFlying.e;
|
|
||||||
} else {
|
} else {
|
||||||
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||||
position.x = packetPlayInFlying.a;
|
|
||||||
position.y = packetPlayInFlying.b;
|
|
||||||
position.z = packetPlayInFlying.c;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disable(Player player) {
|
public Object convertToOut(Player player, Object object) {
|
||||||
Position position = playerLocationMap.remove(player.getUniqueId());
|
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||||
if (position != null) {
|
Object packet = Reflection.newInstance(teleportPacket);
|
||||||
player.teleport(new Location(player.getWorld(), position.x, position.y, position.z, position.yaw, position.pitch));
|
teleportEntity.set(packet, player.getEntityId());
|
||||||
|
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||||
|
if (packetPlayInFlying.h) {
|
||||||
|
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw()));
|
||||||
|
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
|
||||||
|
} else {
|
||||||
|
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
|
||||||
|
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
|
||||||
}
|
}
|
||||||
|
return packet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
62
BauSystem_20/build.gradle
Normale Datei
62
BauSystem_20/build.gradle
Normale Datei
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id 'base'
|
||||||
|
id 'java'
|
||||||
|
}
|
||||||
|
|
||||||
|
group 'steamwar'
|
||||||
|
version '1.0'
|
||||||
|
|
||||||
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
|
sourceCompatibility = 17
|
||||||
|
targetCompatibility = 17
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main {
|
||||||
|
java {
|
||||||
|
srcDirs = ['src/']
|
||||||
|
}
|
||||||
|
resources {
|
||||||
|
srcDirs = ['src/']
|
||||||
|
exclude '**/*.java', '**/*.kt'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly 'org.projectlombok:lombok:1.18.22'
|
||||||
|
testCompileOnly 'org.projectlombok:lombok:1.18.22'
|
||||||
|
annotationProcessor 'org.projectlombok:lombok:1.18.22'
|
||||||
|
testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
|
||||||
|
|
||||||
|
implementation project(":BauSystem_Main")
|
||||||
|
|
||||||
|
compileOnly 'org.spigotmc:spigot-api:1.20-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'
|
||||||
|
compileOnly 'com.mojang:authlib:1.5.25'
|
||||||
|
compileOnly 'com.mojang:brigadier:1.0.18'
|
||||||
|
|
||||||
|
compileOnly swdep('Spigot-1.20')
|
||||||
|
compileOnly swdep('SpigotCore')
|
||||||
|
}
|
136
BauSystem_20/src/de/steamwar/bausystem/utils/NMSWrapper20.java
Normale Datei
136
BauSystem_20/src/de/steamwar/bausystem/utils/NMSWrapper20.java
Normale Datei
@ -0,0 +1,136 @@
|
|||||||
|
/*
|
||||||
|
* 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.utils;
|
||||||
|
|
||||||
|
import com.comphenix.tinyprotocol.Reflection;
|
||||||
|
import de.steamwar.bausystem.features.util.NoClipCommand;
|
||||||
|
import net.minecraft.nbt.NBTBase;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraft.network.protocol.game.PacketPlayInSetCreativeSlot;
|
||||||
|
import net.minecraft.network.protocol.game.PacketPlayOutExplosion;
|
||||||
|
import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange;
|
||||||
|
import net.minecraft.server.level.PlayerInteractManager;
|
||||||
|
import net.minecraft.world.level.EnumGamemode;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NMSWrapper20 implements NMSWrapper {
|
||||||
|
|
||||||
|
private static final Reflection.FieldAccessor<EnumGamemode> playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void setInternalGameMode(Player player, GameMode gameMode) {
|
||||||
|
playerGameMode.set(((CraftPlayer) player).getHandle().e, EnumGamemode.a(gameMode.getValue()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSlotToItemStack(Player player, Object o) {
|
||||||
|
PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
|
||||||
|
int index = packetPlayInSetCreativeSlot.a();
|
||||||
|
if (index >= 36 && index <= 44) {
|
||||||
|
index -= 36;
|
||||||
|
} else if (index > 44) {
|
||||||
|
index -= 5;
|
||||||
|
} else if (index <= 8) {
|
||||||
|
index = index - 8 + 36;
|
||||||
|
}
|
||||||
|
player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.c()));
|
||||||
|
if (index < 9) player.getInventory().setHeldItemSlot(index);
|
||||||
|
player.updateInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setGameStateChangeReason(Object packet) {
|
||||||
|
gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlayerBuildAbilities(Player player) {
|
||||||
|
((CraftPlayer) player).getHandle().fO().d = true;
|
||||||
|
((CraftPlayer) player).getHandle().fO().e = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Material pathMaterial() {
|
||||||
|
return Material.DIRT_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int threshold = 2048;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkItemStack(ItemStack item) {
|
||||||
|
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
|
||||||
|
NBTTagCompound tag = nmsItem.v();
|
||||||
|
if (tag != null && tag.e("BlockEntityTag")) {
|
||||||
|
NBTTagCompound blockTag = tag.p("BlockEntityTag");
|
||||||
|
if (blockTag.e("Items")) {
|
||||||
|
return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int drillDown(NBTTagList items, int layer, int start) {
|
||||||
|
if (layer > 2) return start + threshold;
|
||||||
|
int invalid = start;
|
||||||
|
for (NBTBase nbtBase : items) {
|
||||||
|
if (!(nbtBase instanceof NBTTagCompound))
|
||||||
|
continue;
|
||||||
|
NBTTagCompound slot = (NBTTagCompound) nbtBase;
|
||||||
|
if (slot.e("tag")) {
|
||||||
|
invalid += slot.f("Count");
|
||||||
|
NBTTagCompound iTag = slot.p("tag");
|
||||||
|
if (iTag.e("BlockEntityTag")) {
|
||||||
|
NBTTagCompound blockTag = iTag.p("BlockEntityTag");
|
||||||
|
if (blockTag.e("Items")) {
|
||||||
|
invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (invalid > threshold)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Class<?> explosionPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutExplosion");
|
||||||
|
private final Reflection.FieldAccessor<Double> a = Reflection.getField(explosionPacket, double.class, 0);
|
||||||
|
private final Reflection.FieldAccessor<Double> b = Reflection.getField(explosionPacket, double.class, 1);
|
||||||
|
private final Reflection.FieldAccessor<Double> c = Reflection.getField(explosionPacket, double.class, 2);
|
||||||
|
private final Reflection.FieldAccessor<Float> d = Reflection.getField(explosionPacket, float.class, 0);
|
||||||
|
private final Reflection.FieldAccessor<List> e = Reflection.getField(explosionPacket, List.class, 0);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object resetExplosionKnockback(Object packet) {
|
||||||
|
PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
|
||||||
|
return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), null);
|
||||||
|
}
|
||||||
|
}
|
43
BauSystem_20/src/de/steamwar/bausystem/utils/PlaceItemWrapper20.java
Normale Datei
43
BauSystem_20/src/de/steamwar/bausystem/utils/PlaceItemWrapper20.java
Normale Datei
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bausystem.utils;
|
||||||
|
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
|
public class PlaceItemWrapper20 implements PlaceItemWrapper {
|
||||||
|
|
||||||
|
public PlaceItemWrapper20() {
|
||||||
|
for (Material material : Material.values()) {
|
||||||
|
if (!material.isBlock()) continue;
|
||||||
|
if (material.isLegacy()) continue;
|
||||||
|
BlockData blockData = material.createBlockData();
|
||||||
|
Material placementMaterial = blockData.getPlacementMaterial();
|
||||||
|
if (material == placementMaterial) continue;
|
||||||
|
if (placementMaterial == Material.AIR) continue;
|
||||||
|
if (placementMaterial.isItem() && !placementMaterial.isBlock()) {
|
||||||
|
ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(placementMaterial, material);
|
||||||
|
}
|
||||||
|
if (material.name().contains("WALL")) {
|
||||||
|
BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(placementMaterial, material);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* 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.utils;
|
||||||
|
|
||||||
|
import com.comphenix.tinyprotocol.Reflection;
|
||||||
|
import net.minecraft.network.protocol.game.PacketPlayInFlying;
|
||||||
|
import net.minecraft.network.protocol.game.PacketPlayOutEntityTeleport;
|
||||||
|
import net.minecraft.server.level.EntityPlayer;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class PlayerMovementWrapper20 implements PlayerMovementWrapper {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPosition(Player player, Object object) {
|
||||||
|
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||||
|
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||||
|
if (packetPlayInFlying.h) {
|
||||||
|
entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
|
||||||
|
} else {
|
||||||
|
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object convertToOut(Player player, Object object) {
|
||||||
|
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
|
||||||
|
Object packet = Reflection.newInstance(teleportPacket);
|
||||||
|
teleportEntity.set(packet, player.getEntityId());
|
||||||
|
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
|
||||||
|
if (packetPlayInFlying.h) {
|
||||||
|
teleportYaw.set(packet, rotToByte(player.getLocation().getYaw()));
|
||||||
|
teleportPitch.set(packet, rotToByte(player.getLocation().getPitch()));
|
||||||
|
} else {
|
||||||
|
teleportYaw.set(packet, rotToByte(packetPlayInFlying.d));
|
||||||
|
teleportPitch.set(packet, rotToByte(packetPlayInFlying.e));
|
||||||
|
}
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
}
|
@ -27,8 +27,8 @@ version '1.0'
|
|||||||
|
|
||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 17
|
||||||
targetCompatibility = 1.8
|
targetCompatibility = 17
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
|
@ -35,6 +35,6 @@ public class ScoreboardElement_GENERIC implements LinkageType {
|
|||||||
@Override
|
@Override
|
||||||
public void generateCode(BuildPlan buildPlan, MethodBuilder methodBuilder, String s, TypeElement typeElement) {
|
public void generateCode(BuildPlan buildPlan, MethodBuilder methodBuilder, String s, TypeElement typeElement) {
|
||||||
buildPlan.addImport("de.steamwar.bausystem.features.world.BauScoreboard");
|
buildPlan.addImport("de.steamwar.bausystem.features.world.BauScoreboard");
|
||||||
methodBuilder.addLine("BauScoreboard.ELEMENTS.add(" + s + ");");
|
methodBuilder.addLine("BauScoreboard.addElement(" + s + ");");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,40 +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.linkage.types;
|
|
||||||
|
|
||||||
import de.steamwar.linkage.LinkageType;
|
|
||||||
import de.steamwar.linkage.plan.BuildPlan;
|
|
||||||
import de.steamwar.linkage.plan.MethodBuilder;
|
|
||||||
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
|
|
||||||
public class SmartPlaceBehaviour_GENERIC implements LinkageType {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String method() {
|
|
||||||
return "linkSmartPlace";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void generateCode(BuildPlan buildPlan, MethodBuilder methodBuilder, String s, TypeElement typeElement) {
|
|
||||||
buildPlan.addImport("de.steamwar.bausystem.features.smartplace.SmartPlaceListener");
|
|
||||||
methodBuilder.addLine("SmartPlaceListener.add(" + s + ");");
|
|
||||||
}
|
|
||||||
}
|
|
@ -27,8 +27,8 @@ version '1.0'
|
|||||||
|
|
||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 17
|
||||||
targetCompatibility = 1.8
|
targetCompatibility = 17
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
@ -43,6 +43,9 @@ sourceSets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
// implementation 'yoyosource:YAPION:0.25.3'
|
||||||
|
implementation files("${projectDir}/../libs/YAPION-SNAPSHOT.jar")
|
||||||
|
|
||||||
compileOnly 'org.projectlombok:lombok:1.18.22'
|
compileOnly 'org.projectlombok:lombok:1.18.22'
|
||||||
testCompileOnly 'org.projectlombok:lombok:1.18.22'
|
testCompileOnly 'org.projectlombok:lombok:1.18.22'
|
||||||
annotationProcessor 'org.projectlombok:lombok:1.18.22'
|
annotationProcessor 'org.projectlombok:lombok:1.18.22'
|
||||||
@ -51,16 +54,16 @@ dependencies {
|
|||||||
implementation project(":BauSystem_Linkage")
|
implementation project(":BauSystem_Linkage")
|
||||||
annotationProcessor project(":BauSystem_Linkage")
|
annotationProcessor project(":BauSystem_Linkage")
|
||||||
|
|
||||||
compileOnly 'org.spigotmc:spigot-api:1.19-R0.1-SNAPSHOT'
|
compileOnly 'org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT'
|
||||||
compileOnly 'com.mojang:authlib:1.5.25'
|
compileOnly 'com.mojang:authlib:1.5.25'
|
||||||
compileOnly 'io.netty:netty-all:4.1.68.Final'
|
compileOnly 'io.netty:netty-all:4.1.68.Final'
|
||||||
|
|
||||||
compileOnly swdep('Spigot-1.19')
|
compileOnly swdep('Spigot-1.20')
|
||||||
// compileOnly swdep('WorldEdit-1.15')
|
|
||||||
compileOnly swdep('SpigotCore')
|
compileOnly swdep('SpigotCore')
|
||||||
annotationProcessor swdep('SpigotCore')
|
annotationProcessor swdep('SpigotCore')
|
||||||
|
|
||||||
compileOnly swdep('FastAsyncWorldEdit-1.18')
|
compileOnly swdep('FastAsyncWorldEdit-1.18')
|
||||||
|
compileOnly swdep('AxiomPaper')
|
||||||
|
|
||||||
implementation 'org.luaj:luaj-jse:3.0.1'
|
implementation 'org.luaj:luaj-jse:3.0.1'
|
||||||
}
|
}
|
Datei-Diff unterdrückt, da er zu groß ist
Diff laden
Datei-Diff unterdrückt, da er zu groß ist
Diff laden
@ -21,19 +21,20 @@ package de.steamwar.bausystem;
|
|||||||
|
|
||||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||||
import de.steamwar.bausystem.configplayer.Config;
|
import de.steamwar.bausystem.configplayer.Config;
|
||||||
import de.steamwar.bausystem.features.tpslimit.FreezeUtils;
|
import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils;
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSLimitUtils;
|
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSWarpUtils;
|
|
||||||
import de.steamwar.bausystem.features.world.RamUsage;
|
|
||||||
import de.steamwar.bausystem.linkage.LinkageUtils;
|
import de.steamwar.bausystem.linkage.LinkageUtils;
|
||||||
import de.steamwar.bausystem.region.loader.PrototypeLoader;
|
import de.steamwar.bausystem.region.loader.PrototypeLoader;
|
||||||
import de.steamwar.bausystem.region.loader.RegionLoader;
|
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.bausystem.worlddata.WorldData;
|
||||||
|
import de.steamwar.command.AbstractValidator;
|
||||||
|
import de.steamwar.command.SWCommandUtils;
|
||||||
import de.steamwar.message.Message;
|
import de.steamwar.message.Message;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.bukkit.Bukkit;
|
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.event.Listener;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
@ -51,16 +52,13 @@ public class BauSystem extends JavaPlugin implements Listener {
|
|||||||
|
|
||||||
// This should be treated as final!
|
// This should be treated as final!
|
||||||
public static Message MESSAGE;
|
public static Message MESSAGE;
|
||||||
|
public static final boolean DEV_SERVER = !System.getProperty("user.home").endsWith("minecraft");
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private static BauSystem instance;
|
private static BauSystem instance;
|
||||||
|
|
||||||
private World world;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
world = Bukkit.getWorlds().get(0);
|
|
||||||
|
|
||||||
// LOGGER
|
// LOGGER
|
||||||
fixLogging();
|
fixLogging();
|
||||||
|
|
||||||
@ -75,36 +73,48 @@ public class BauSystem extends JavaPlugin implements Listener {
|
|||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||||
Bukkit.shutdown();
|
Bukkit.shutdown();
|
||||||
|
System.exit(1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LinkageUtils.link();
|
new Updater(PrototypeLoader.file, PrototypeLoader::load);
|
||||||
RamUsage.init();
|
new Updater(RegionLoader.file, RegionLoader::load);
|
||||||
|
|
||||||
// This could disable any watchdog stuff. We need to investigate if this is a problem.
|
SWCommandUtils.addValidator(Player.class, validator(Permission.BUILD));
|
||||||
/*
|
SWCommandUtils.addValidator(CommandSender.class, validator(Permission.BUILD));
|
||||||
Thread thread = new Thread(() -> {
|
SWCommandUtils.addValidator("supervisor", validator(Permission.SUPERVISOR));
|
||||||
while (true) {
|
SWCommandUtils.addValidator("owner", validator(Permission.OWNER));
|
||||||
WatchdogThread.tick();
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000);
|
LinkageUtils.link();
|
||||||
} catch (InterruptedException e) {
|
} catch (Exception e) {
|
||||||
Thread.currentThread().interrupt();
|
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||||
|
Bukkit.shutdown();
|
||||||
|
System.exit(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TickListener.impl.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T extends CommandSender> AbstractValidator<T, ?> validator(Permission permission) {
|
||||||
|
return (commandSender, object, messageSender) -> {
|
||||||
|
if (commandSender instanceof Player) {
|
||||||
|
if (permission.hasPermission((Player) commandSender)) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
messageSender.send("NO_PERMISSION");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
return true;
|
||||||
thread.setName("WatchdogThread ticker");
|
};
|
||||||
thread.setDaemon(true);
|
|
||||||
thread.start();
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
LinkageUtils.unlink();
|
LinkageUtils.unlink();
|
||||||
|
|
||||||
WorldData.getInstance().save();
|
WorldData.write();
|
||||||
Config.saveAll();
|
Config.getInstance().saveAll();
|
||||||
TinyProtocol.instance.close();
|
TinyProtocol.instance.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +145,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (FreezeUtils.isFrozen()) return;
|
if (TPSFreezeUtils.isFrozen()) return;
|
||||||
if (counter >= delay) {
|
if (counter >= delay) {
|
||||||
runnable.run();
|
runnable.run();
|
||||||
cancel();
|
cancel();
|
||||||
@ -153,7 +163,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (FreezeUtils.isFrozen()) return;
|
if (TPSFreezeUtils.isFrozen()) return;
|
||||||
if (counter >= (first ? delay : period)) {
|
if (counter >= (first ? delay : period)) {
|
||||||
first = false;
|
first = false;
|
||||||
runnable.run();
|
runnable.run();
|
||||||
|
@ -20,72 +20,77 @@
|
|||||||
package de.steamwar.bausystem;
|
package de.steamwar.bausystem;
|
||||||
|
|
||||||
import de.steamwar.bausystem.config.BauServer;
|
import de.steamwar.bausystem.config.BauServer;
|
||||||
import de.steamwar.command.CommandMetaData;
|
import de.steamwar.bausystem.features.world.BauMemberUpdate;
|
||||||
import de.steamwar.command.TypeValidator;
|
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||||
import de.steamwar.sql.BauweltMember;
|
import de.steamwar.sql.BauweltMember;
|
||||||
|
import de.steamwar.sql.SteamwarUser;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
import java.util.HashSet;
|
||||||
import java.lang.annotation.Retention;
|
import java.util.Set;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum Permission {
|
public enum Permission {
|
||||||
|
|
||||||
WORLD(BauweltMember::isWorld),
|
OWNER(bauweltMember -> false),
|
||||||
WORLDEDIT(BauweltMember::isWorldEdit),
|
SUPERVISOR(bauweltMember -> {
|
||||||
MEMBER(bauweltMember -> true),
|
return bauweltMember.isSupervisor();
|
||||||
OWNER(bauweltMember -> false);
|
}),
|
||||||
|
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;
|
private final Predicate<BauweltMember> permissionPredicate;
|
||||||
|
|
||||||
|
public boolean hasPermission(BauweltMember bauweltMember) {
|
||||||
|
if (bauweltMember == null) return false;
|
||||||
|
return permissionPredicate.test(bauweltMember);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean hasPermission(Player member) {
|
public boolean hasPermission(Player member) {
|
||||||
if (member.getUniqueId().equals(BauServer.getInstance().getOwner())) {
|
if (SteamwarUser.get(member.getUniqueId()).getId() == BauServer.getInstance().getOwnerID()) {
|
||||||
return true;
|
return this != REAL_SPECTATOR;
|
||||||
}
|
|
||||||
|
|
||||||
BauweltMember bauMember = BauweltMember.getBauMember(BauServer.getInstance().getOwner(), member.getUniqueId());
|
|
||||||
if (bauMember == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return permissionPredicate.test(bauMember);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean hasPermission(Player member, Permission permission) {
|
|
||||||
return permission.hasPermission(member);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Target(ElementType.PARAMETER)
|
|
||||||
@CommandMetaData.Parameter({Player.class})
|
|
||||||
@CommandMetaData.ImplicitValidator(handler = Perm.Handler.class, order = -10)
|
|
||||||
public @interface Perm {
|
|
||||||
Permission value();
|
|
||||||
String message() default "";
|
|
||||||
|
|
||||||
class Handler implements TypeValidator<Player> {
|
|
||||||
|
|
||||||
private Permission permission;
|
|
||||||
private String message;
|
|
||||||
|
|
||||||
public Handler(Perm perm) {
|
|
||||||
this.permission = perm.value();
|
|
||||||
this.message = perm.message();
|
|
||||||
if (message != null && message.isEmpty()) message = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean validate(CommandSender commandSender, Player player, MessageSender messageSender) {
|
|
||||||
if (message == null) {
|
|
||||||
return permission.hasPermission(player);
|
|
||||||
}
|
|
||||||
return !messageSender.send(!permission.hasPermission((Player) commandSender), message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
BauweltMember bauweltMember = BauweltMember.getBauMember(BauServer.getInstance().getOwner(), member.getUniqueId());
|
||||||
|
if (bauweltMember == null) return this == REAL_SPECTATOR;
|
||||||
|
return permissionPredicate.test(bauweltMember);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2023 SteamWar.de-Serverteam
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.steamwar.bausystem.config;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
@Target({ElementType.FIELD})
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
public @interface ConfigField {
|
|
||||||
boolean required() default false;
|
|
||||||
}
|
|
@ -1,95 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2023 SteamWar.de-Serverteam
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.steamwar.bausystem.config;
|
|
||||||
|
|
||||||
import de.steamwar.sql.UserConfig;
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.bukkit.configuration.serialization.ConfigurationSerializable;
|
|
||||||
import org.bukkit.configuration.serialization.ConfigurationSerialization;
|
|
||||||
|
|
||||||
import java.io.StringReader;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class YamlConfig implements ConfigurationSerializable {
|
|
||||||
|
|
||||||
public static void register(Class<? extends YamlConfig> configType) {
|
|
||||||
ConfigurationSerialization.registerClass(configType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static YamlConfiguration fromUserConfig(UUID uuid, String name) {
|
|
||||||
String config = UserConfig.getConfig(uuid, name);
|
|
||||||
if(config == null)
|
|
||||||
return new YamlConfiguration();
|
|
||||||
|
|
||||||
return YamlConfiguration.loadConfiguration(new StringReader(config));
|
|
||||||
}
|
|
||||||
|
|
||||||
public YamlConfig() {}
|
|
||||||
|
|
||||||
public YamlConfig(ConfigurationSection configuration) {
|
|
||||||
this(configuration.getValues(false));
|
|
||||||
}
|
|
||||||
|
|
||||||
public YamlConfig(Map<String, Object> map) {
|
|
||||||
Arrays.stream(getClass().getDeclaredFields())
|
|
||||||
.filter(field -> field.isAnnotationPresent(ConfigField.class))
|
|
||||||
.forEach(field -> {
|
|
||||||
String name = field.getName();
|
|
||||||
try {
|
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(this, map.containsKey(name) ? map.get(name) : getClass().getDeclaredField(name.toUpperCase() + "_DEFAULT").get(null));
|
|
||||||
} catch (NoSuchFieldException e) {
|
|
||||||
if(field.getAnnotation(ConfigField.class).required())
|
|
||||||
throw new IllegalStateException(getClass().getName() + "." + field.getName() + " is required", e);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new IllegalStateException(getClass().getName() + "." + field.getName() + " is inaccessible for deserializer", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<String, Object> serialize() {
|
|
||||||
return Arrays.stream(getClass().getDeclaredFields())
|
|
||||||
.filter(field -> field.isAnnotationPresent(ConfigField.class))
|
|
||||||
.collect(Collectors.toMap(
|
|
||||||
Field::getName,
|
|
||||||
field -> {
|
|
||||||
try {
|
|
||||||
field.setAccessible(true);
|
|
||||||
return field.get(this);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new IllegalStateException(getClass().getName() + "." + field.getName() + " is inaccessible for serializer", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
public YamlConfiguration toYaml() {
|
|
||||||
YamlConfiguration config = new YamlConfiguration();
|
|
||||||
for(Map.Entry<String, Object> entry : serialize().entrySet())
|
|
||||||
config.set(entry.getKey(), entry.getValue());
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}
|
|
@ -19,120 +19,129 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.configplayer;
|
package de.steamwar.bausystem.configplayer;
|
||||||
|
|
||||||
import de.steamwar.bausystem.config.ConfigField;
|
import de.steamwar.bausystem.configplayer.serializer.ConfigurationSerializableSerializer;
|
||||||
import de.steamwar.bausystem.config.YamlConfig;
|
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import de.steamwar.sql.UserConfig;
|
import de.steamwar.sql.UserConfig;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import yapion.hierarchy.output.StringOutput;
|
||||||
|
import yapion.hierarchy.types.YAPIONObject;
|
||||||
|
import yapion.parser.YAPIONParser;
|
||||||
|
import yapion.serializing.SerializeManager;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class Config extends YamlConfig {
|
@Linked
|
||||||
|
public class Config implements Listener {
|
||||||
|
|
||||||
private static final Map<UUID, Config> playerConfigurations = new HashMap<>();
|
static {
|
||||||
|
SerializeManager.add(new ConfigurationSerializableSerializer());
|
||||||
public static Config get(Player player) { //TODO: NULL
|
|
||||||
return playerConfigurations.computeIfAbsent(player.getUniqueId(), uuid -> new Config(uuid, fromUserConfig(uuid, "bausystem")));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveAll() {
|
@Getter
|
||||||
playerConfigurations.forEach((uuid, config) -> config.save());
|
private static Config instance;
|
||||||
|
|
||||||
|
{
|
||||||
|
instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Map<UUID, YAPIONObject> playerConfigurations = new HashMap<>();
|
||||||
|
|
||||||
|
private static final Map<Integer, ConfigConverter> CONFIG_CONVERTER_MAP = new HashMap<>();
|
||||||
|
|
||||||
|
public static void addConfigConverter(ConfigConverter configConverter) {
|
||||||
|
CONFIG_CONVERTER_MAP.putIfAbsent(configConverter.version(), configConverter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
|
get(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
|
save(event.getPlayer());
|
||||||
|
playerConfigurations.remove(event.getPlayer().getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a PlayerConfig, optionally loads it from the DataBase and migrates it if necessary.
|
||||||
|
*
|
||||||
|
* @param player the player from whom to get the config.
|
||||||
|
* @return the config object
|
||||||
|
*/
|
||||||
|
public YAPIONObject get(Player player) {
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
|
if (!playerConfigurations.containsKey(uuid)) {
|
||||||
|
String s = UserConfig.getConfig(uuid, "bausystem");
|
||||||
|
YAPIONObject yapionObject;
|
||||||
|
if (s == null) {
|
||||||
|
yapionObject = ConfigCreator.createDefaultConfig();
|
||||||
|
} else {
|
||||||
|
yapionObject = YAPIONParser.parse(s);
|
||||||
|
}
|
||||||
|
yapionObject = update(yapionObject);
|
||||||
|
playerConfigurations.put(uuid, yapionObject);
|
||||||
|
return yapionObject;
|
||||||
|
}
|
||||||
|
return playerConfigurations.get(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveAll() {
|
||||||
|
playerConfigurations.forEach((uuid, yapionObject) -> {
|
||||||
|
String string = yapionObject.toYAPION(new StringOutput()).getResult().replaceAll("\\+", "\\");
|
||||||
|
UserConfig.updatePlayerConfig(uuid, "bausystem", string);
|
||||||
|
});
|
||||||
playerConfigurations.clear();
|
playerConfigurations.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final UUID uuid;
|
/**
|
||||||
|
* Save a PlayerConfig, this does not remove the key value mapping from the map.
|
||||||
@Getter
|
*
|
||||||
@Setter
|
* @param player the player to save the config.
|
||||||
@ConfigField
|
*/
|
||||||
private boolean nightvision;
|
public void save(Player player) {
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
@Getter
|
if (playerConfigurations.containsKey(uuid)) {
|
||||||
@Setter
|
YAPIONObject yapionObject = playerConfigurations.get(uuid);
|
||||||
@ConfigField
|
String string = yapionObject.toYAPION(new StringOutput()).getResult().replaceAll("\\\\+", "\\\\");
|
||||||
private boolean simulatorAutoTrace;
|
UserConfig.updatePlayerConfig(uuid, "bausystem", string);
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@ConfigField
|
|
||||||
private boolean detonatorAutostart;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@ConfigField
|
|
||||||
private boolean blockCounter;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@ConfigField
|
|
||||||
private boolean smartPlace;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@ConfigField
|
|
||||||
private boolean inventoryFill;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@ConfigField
|
|
||||||
private final Map<String, Integer> baugui = new HashMap<>();
|
|
||||||
|
|
||||||
private Config(UUID uuid, ConfigurationSection configuration) {
|
|
||||||
super(configuration);
|
|
||||||
this.uuid = uuid;
|
|
||||||
|
|
||||||
if(baugui.isEmpty()) {
|
|
||||||
// 0: ? | 1: ? | 2: 10 | 3: 3 | 4: 7 | 5: 17 | 6: 15 | 7: ? | 8: ?
|
|
||||||
// 9: 5 | 10: ? | 11: ? | 12: ? | 13: ? | 14: ? | 15: ? | 16: ? | 17: 16
|
|
||||||
// 18: 4 | 19: ? | 20: 19 | 21: 21 | 22: 9 | 23: 0 | 24: 1 | 25: ? | 26: 11
|
|
||||||
// 27: 6 | 28: ? | 29: ? | 30: ? | 31: ? | 32: ? | 33: ? | 34: ? | 35: 18
|
|
||||||
// 36: ? | 37: 23 | 38: 20 | 39: 8 | 40: 22 | 41: 26 | 42: 12 | 43: 14 | 44: ?
|
|
||||||
|
|
||||||
baugui.put("size", 45);
|
|
||||||
baugui.put("10", 2);
|
|
||||||
baugui.put("3", 3);
|
|
||||||
baugui.put("7", 4);
|
|
||||||
baugui.put("17", 5);
|
|
||||||
baugui.put("15", 6);
|
|
||||||
baugui.put("5", 9);
|
|
||||||
baugui.put("16", 17);
|
|
||||||
baugui.put("4", 18);
|
|
||||||
baugui.put("19", 20);
|
|
||||||
baugui.put("21", 21);
|
|
||||||
baugui.put("9", 22);
|
|
||||||
baugui.put("0", 23);
|
|
||||||
baugui.put("1", 24);
|
|
||||||
baugui.put("11", 26);
|
|
||||||
baugui.put("6", 27);
|
|
||||||
baugui.put("18", 35);
|
|
||||||
baugui.put("23", 37);
|
|
||||||
baugui.put("20", 38);
|
|
||||||
baugui.put("8", 39);
|
|
||||||
baugui.put("22", 40);
|
|
||||||
baugui.put("26", 41);
|
|
||||||
baugui.put("12", 42);
|
|
||||||
baugui.put("14", 43);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save() {
|
private YAPIONObject update(YAPIONObject yapionObject) {
|
||||||
UserConfig.updatePlayerConfig(uuid, "bausystem", toYaml().saveToString());
|
int version = yapionObject.getPlainValue("@version");
|
||||||
}
|
while (version < ConfigCreator.currentVersion) {
|
||||||
|
ConfigConverter configConverter = CONFIG_CONVERTER_MAP.getOrDefault(version, null);
|
||||||
@Linked
|
if (configConverter == null) {
|
||||||
public static class ConfigListener implements Listener {
|
Bukkit.getLogger().log(Level.SEVERE, "No updater found for version " + version);
|
||||||
|
return ConfigCreator.createDefaultConfig();
|
||||||
@EventHandler
|
}
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
try {
|
||||||
get(event.getPlayer()).save();
|
configConverter.update(yapionObject);
|
||||||
playerConfigurations.remove(event.getPlayer().getUniqueId());
|
} catch (Exception e) {
|
||||||
|
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
|
||||||
|
return ConfigCreator.createDefaultConfig();
|
||||||
|
}
|
||||||
|
int newVersion = yapionObject.getPlainValue("@version");
|
||||||
|
if (version == newVersion) {
|
||||||
|
Bukkit.getLogger().log(Level.SEVERE, "Version Tag was the same after conversion");
|
||||||
|
return ConfigCreator.createDefaultConfig();
|
||||||
|
}
|
||||||
|
if (newVersion < version) {
|
||||||
|
Bukkit.getLogger().log(Level.SEVERE, "Version Tag was earlier after conversion");
|
||||||
|
return ConfigCreator.createDefaultConfig();
|
||||||
|
}
|
||||||
|
version = newVersion;
|
||||||
}
|
}
|
||||||
|
return yapionObject;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package de.steamwar.bausystem.configplayer;
|
||||||
|
|
||||||
|
import yapion.hierarchy.types.YAPIONObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A new {@link ConfigConverter} should be written when you remove anything
|
||||||
|
* from the Config or modify any mayor part. When you move anything from
|
||||||
|
* any key to any other key you should write a new {@link ConfigConverter}.
|
||||||
|
* For adding any new key you should be able to get the default without
|
||||||
|
* having it in the Config. Anything you need to change you should also
|
||||||
|
* change the {@link ConfigCreator} accordingly, to produce the new Config.
|
||||||
|
*/
|
||||||
|
public interface ConfigConverter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This describes the version this Converter can convert from. The version
|
||||||
|
* it should convert to is the version 1 above this number. But this is not
|
||||||
|
* a necessity. In the config Object as parameter given in {@link #update(YAPIONObject)}
|
||||||
|
* you should update the <b>@version</b> variable in the root object to the
|
||||||
|
* new version this converter produced.
|
||||||
|
*
|
||||||
|
* @return the version number
|
||||||
|
*/
|
||||||
|
int version();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method should update everything needed to go from a lower config
|
||||||
|
* version to a higher. It should update the <b>@version</b> variable
|
||||||
|
* accordingly. Anything else is up the implementation. If anything goes wrong
|
||||||
|
* do not silently exit this method, throw an Exception. The updater Code will
|
||||||
|
* deal with it. Never leave the inputted object in a corrupted state.
|
||||||
|
*
|
||||||
|
* @param config the config object to update
|
||||||
|
*/
|
||||||
|
void update(YAPIONObject config);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* 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.configplayer;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.features.hotbar.DefaultHotbar;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
import yapion.hierarchy.types.YAPIONObject;
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
|
public class ConfigCreator {
|
||||||
|
|
||||||
|
public static final int currentVersion = 1;
|
||||||
|
|
||||||
|
public YAPIONObject createDefaultConfig() {
|
||||||
|
YAPIONObject yapionObject = new YAPIONObject();
|
||||||
|
// This call should never be touched
|
||||||
|
yapionObject.add("@version", currentVersion);
|
||||||
|
|
||||||
|
// Any initialising goes into here
|
||||||
|
yapionObject.add("baugui", defaultBauGui());
|
||||||
|
|
||||||
|
// Default Hotbar Gui
|
||||||
|
yapionObject.add("hotbar", DefaultHotbar.defaultHotbar());
|
||||||
|
return yapionObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
private YAPIONObject defaultBauGui() {
|
||||||
|
YAPIONObject yapionObject = new YAPIONObject();
|
||||||
|
|
||||||
|
// 0: ? | 1: ? | 2: 10 | 3: 3 | 4: 7 | 5: 17 | 6: 15 | 7: ? | 8: ?
|
||||||
|
// 9: 5 | 10: ? | 11: ? | 12: ? | 13: ? | 14: ? | 15: ? | 16: ? | 17: 16
|
||||||
|
// 18: 4 | 19: ? | 20: 19 | 21: 21 | 22: 9 | 23: 0 | 24: 1 | 25: ? | 26: 11
|
||||||
|
// 27: 6 | 28: ? | 29: ? | 30: ? | 31: ? | 32: ? | 33: ? | 34: ? | 35: 18
|
||||||
|
// 36: ? | 37: 23 | 38: 20 | 39: 8 | 40: 22 | 41: 26 | 42: 12 | 43: 14 | 44: ?
|
||||||
|
|
||||||
|
yapionObject.add("10", 2).add("3", 3).add("7", 4).add("17", 5).add("15", 6);
|
||||||
|
yapionObject.add("5", 9).add("4", 18).add("6", 27);
|
||||||
|
yapionObject.add("16", 17).add("11", 26).add("18", 35);
|
||||||
|
yapionObject.add("19", 20).add("21", 21).add("9", 22).add("0", 23).add("1", 24);
|
||||||
|
yapionObject.add("23", 37).add("20", 38).add("8", 39).add("22", 40).add("26", 41).add("12", 42).add("14", 43);
|
||||||
|
yapionObject.add("size", 45);
|
||||||
|
return yapionObject;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* 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.configplayer.serializer;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.serialization.ConfigurationSerializable;
|
||||||
|
import org.bukkit.configuration.serialization.ConfigurationSerialization;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import yapion.hierarchy.api.groups.YAPIONAnyType;
|
||||||
|
import yapion.hierarchy.types.YAPIONObject;
|
||||||
|
import yapion.serializing.api.SerializerObject;
|
||||||
|
import yapion.serializing.data.DeserializeData;
|
||||||
|
import yapion.serializing.data.SerializeData;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static yapion.utils.IdentifierUtils.TYPE_IDENTIFIER;
|
||||||
|
|
||||||
|
public class ConfigurationSerializableSerializer extends SerializerObject<ConfigurationSerializable> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<ConfigurationSerializable> type() {
|
||||||
|
return ConfigurationSerializable.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isInterface() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public YAPIONObject serialize(SerializeData<ConfigurationSerializable> serializeData) {
|
||||||
|
YAPIONObject yapionObject = new YAPIONObject();
|
||||||
|
yapionObject.add(TYPE_IDENTIFIER, serializeData.object.getClass().getTypeName());
|
||||||
|
if (serializeData.object instanceof ItemStack) {
|
||||||
|
yapionObject.add(TYPE_IDENTIFIER, ItemStack.class.getTypeName());
|
||||||
|
}
|
||||||
|
if (serializeData.object instanceof ItemMeta) {
|
||||||
|
yapionObject.add(TYPE_IDENTIFIER, ItemMeta.class.getTypeName());
|
||||||
|
}
|
||||||
|
Map<String, Object> serializeDataMap = serializeData.object.serialize();
|
||||||
|
serializeDataMap.forEach((s, o) -> {
|
||||||
|
YAPIONAnyType yapionAnyType = serializeData.serialize(o);
|
||||||
|
if (yapionAnyType instanceof YAPIONObject) {
|
||||||
|
YAPIONObject object = (YAPIONObject) yapionAnyType;
|
||||||
|
if (object.containsKey(TYPE_IDENTIFIER) && object.getPlainValue(TYPE_IDENTIFIER).equals("com.google.common.collect.RegularImmutableList")) {
|
||||||
|
object.put(TYPE_IDENTIFIER, ArrayList.class.getTypeName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
yapionObject.add(s, yapionAnyType);
|
||||||
|
});
|
||||||
|
return yapionObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConfigurationSerializable deserialize(DeserializeData<YAPIONObject> deserializeData) {
|
||||||
|
Map<String, Object> deserializeDataMap = new HashMap<>();
|
||||||
|
deserializeData.object.forEach((s, yapionAnyType) -> {
|
||||||
|
if (s.equals(TYPE_IDENTIFIER)) {
|
||||||
|
if (yapionAnyType.toString().equals("(org.bukkit.inventory.meta.ItemMeta)")) {
|
||||||
|
deserializeDataMap.put("==", "ItemMeta");
|
||||||
|
} else {
|
||||||
|
deserializeDataMap.put("==", deserializeData.deserialize(yapionAnyType));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
deserializeDataMap.put(s, deserializeData.deserialize(yapionAnyType));
|
||||||
|
});
|
||||||
|
return ConfigurationSerialization.deserializeObject(deserializeDataMap);
|
||||||
|
}
|
||||||
|
}
|
@ -44,7 +44,7 @@ public class AttributeRemoveCommand extends SWCommand {
|
|||||||
|
|
||||||
@Register({"all"})
|
@Register({"all"})
|
||||||
@Register({"*"})
|
@Register({"*"})
|
||||||
public void genericCommand(Player player) {
|
public void genericCommand(@Validator Player player) {
|
||||||
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||||
itemMeta.setLore(new ArrayList<>());
|
itemMeta.setLore(new ArrayList<>());
|
||||||
@ -53,7 +53,7 @@ public class AttributeRemoveCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "ATTRIBUTE_REMOVE_COMMAND_HELP")
|
@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();
|
ItemStack itemStack = player.getInventory().getItemInMainHand();
|
||||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||||
if (itemMeta == null) {
|
if (itemMeta == null) {
|
||||||
@ -73,7 +73,7 @@ public class AttributeRemoveCommand extends SWCommand {
|
|||||||
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_NOT_FOUND", player);
|
BauSystem.MESSAGE.send("ATTRIBUTE_REMOVE_NOT_FOUND", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lore.removeIf(s -> s.equals("§8-§7 " + attribute));
|
lore.removeIf(s -> s.startsWith("§8-§7 " + attribute + "§8:"));
|
||||||
if (lore.size() == 1) {
|
if (lore.size() == 1) {
|
||||||
itemStack.setItemMeta(null);
|
itemStack.setItemMeta(null);
|
||||||
} else {
|
} else {
|
||||||
@ -99,15 +99,13 @@ public class AttributeRemoveCommand extends SWCommand {
|
|||||||
return lore.stream()
|
return lore.stream()
|
||||||
.skip(1)
|
.skip(1)
|
||||||
.map(s1 -> s1.substring(6))
|
.map(s1 -> s1.substring(6))
|
||||||
.map(s1 -> s1.replace('§', '&'))
|
.map(s1 -> s1.substring(0, s1.indexOf("§8:")))
|
||||||
.map(s1 -> s1.replace(' ', '_'))
|
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) {
|
||||||
return s.replace('_', ' ')
|
return s;
|
||||||
.replace('&', '§');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ public class AttributesCopyCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Register
|
||||||
public void genericCommand(Player player) {
|
public void genericCommand(@Validator Player player) {
|
||||||
Block block = player.getTargetBlockExact(8, FluidCollisionMode.ALWAYS);
|
Block block = player.getTargetBlockExact(8, FluidCollisionMode.ALWAYS);
|
||||||
if (block == null) return;
|
if (block == null) return;
|
||||||
ItemStack mainHand = player.getInventory().getItemInMainHand();
|
ItemStack mainHand = player.getInventory().getItemInMainHand();
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package de.steamwar.bausystem.features.attributescopy;
|
package de.steamwar.bausystem.features.attributescopy;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -40,6 +41,7 @@ public class AttributesPlaceListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockPlace(BlockPlaceEvent event) {
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
ItemStack itemStack = event.getItemInHand();
|
ItemStack itemStack = event.getItemInHand();
|
||||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||||
if (itemMeta == null) return;
|
if (itemMeta == null) return;
|
||||||
|
@ -32,7 +32,7 @@ public class AutoStartCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "AUTOSTART_COMMAND_HELP")
|
@Register(description = "AUTOSTART_COMMAND_HELP")
|
||||||
public void genericCommand(Player p) {
|
public void genericCommand(@Validator Player p) {
|
||||||
SWUtils.giveItemToPlayer(p, AutostartListener.getWandItem(p));
|
SWUtils.giveItemToPlayer(p, AutostartListener.getWandItem(p));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,6 @@ public class AutoStartGuiItem extends BauGuiItem {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Permission permission() {
|
public Permission permission() {
|
||||||
return Permission.MEMBER;
|
return Permission.BUILD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package de.steamwar.bausystem.features.autostart;
|
package de.steamwar.bausystem.features.autostart;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.region.RegionUtils;
|
import de.steamwar.bausystem.region.RegionUtils;
|
||||||
@ -29,19 +30,22 @@ import de.steamwar.bausystem.utils.ItemUtils;
|
|||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
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.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
|
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Arrays;
|
import java.util.*;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Linked
|
@Linked
|
||||||
public class AutostartListener implements Listener {
|
public class AutostartListener implements Listener {
|
||||||
@ -64,15 +68,42 @@ public class AutostartListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
if (!ItemUtils.isItem(event.getItem(), "autostart")) {
|
if (!ItemUtils.isItem(event.getItem(), "autostart")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (event.getClickedBlock() == null) {
|
if (event.getClickedBlock() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (event.getClickedBlock().getBlockData() instanceof Chest) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getClickedBlock().getType() == Material.BEDROCK) {
|
||||||
|
event.getClickedBlock().setType(Material.SLIME_BLOCK);
|
||||||
|
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||||
|
event.getClickedBlock().setType(Material.BEDROCK, false);
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
activate(event.getPlayer());
|
activate(event.getPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInventoryClose(InventoryCloseEvent event) {
|
||||||
|
if (!(event.getPlayer() instanceof Player)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!Permission.BUILD.hasPermission((Player) event.getPlayer())) return;
|
||||||
|
if (!ItemUtils.isItem(event.getPlayer().getInventory().getItemInMainHand(), "autostart")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getInventory().getLocation() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getInventory().getLocation().getBlock().getBlockData() instanceof Chest) {
|
||||||
|
activate((Player) event.getPlayer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void activate(Player player) {
|
public void activate(Player player) {
|
||||||
Region region = Region.getRegion(player.getLocation());
|
Region region = Region.getRegion(player.getLocation());
|
||||||
if (region.isGlobal()) {
|
if (region.isGlobal()) {
|
||||||
@ -96,17 +127,24 @@ public class AutostartListener implements Listener {
|
|||||||
if (regionStartTime.isEmpty()) {
|
if (regionStartTime.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
event.blockList().forEach(block -> {
|
event.blockList().forEach(block -> {
|
||||||
Region region = Region.getRegion(block.getLocation());
|
Region region = Region.getRegion(block.getLocation());
|
||||||
if (!regionStartTime.containsKey(region)) return;
|
if (!regionStartTime.containsKey(region)) return;
|
||||||
if (!region.hasType(RegionType.TESTBLOCK)) return;
|
if (!region.hasType(RegionType.TESTBLOCK)) return;
|
||||||
if (!region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) return;
|
if (!region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) return;
|
||||||
long tickDiff = TPSUtils.currentRealTick.get() - regionStartTime.remove(region);
|
long tickDiff = TPSUtils.currentRealTick.get() - regionStartTime.remove(region);
|
||||||
RegionUtils.message(region, player -> {
|
long preFightDurationInSeconds = getPreFightDurationInSeconds(region);
|
||||||
return BauSystem.MESSAGE.parse("AUTOSTART_MESSAGE_RESULT1", player, new SimpleDateFormat(BauSystem.MESSAGE.parse("AUTOSTART_MESSAGE_DATE_PATTERN", player)).format(new Date(tickDiff * 50)));
|
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT1", tickDiff);
|
||||||
});
|
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT2", preFightDurationInSeconds, ((preFightDurationInSeconds * 20) - tickDiff));
|
||||||
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT2", 30, (600 - tickDiff));
|
|
||||||
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT3");
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,15 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.backup;
|
package de.steamwar.bausystem.features.backup;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.EditSession;
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.Permission;
|
import de.steamwar.bausystem.Permission;
|
||||||
|
import de.steamwar.bausystem.region.Color;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
|
import de.steamwar.bausystem.region.flags.Flag;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.ColorMode;
|
||||||
import de.steamwar.bausystem.region.tags.Tag;
|
import de.steamwar.bausystem.region.tags.Tag;
|
||||||
|
import de.steamwar.bausystem.utils.PasteBuilder;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.command.SWCommandUtils;
|
import de.steamwar.command.SWCommandUtils;
|
||||||
import de.steamwar.command.TypeMapper;
|
import de.steamwar.command.TypeMapper;
|
||||||
@ -57,7 +62,7 @@ public class BackupCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "create", description = "BACKUP_HELP_CREATE")
|
@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());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if (checkGlobalRegion(region, p)) {
|
if (checkGlobalRegion(region, p)) {
|
||||||
return;
|
return;
|
||||||
@ -74,7 +79,7 @@ public class BackupCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "load", description = "BACKUP_HELP_LOAD")
|
@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());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if (checkGlobalRegion(region, p)) {
|
if (checkGlobalRegion(region, p)) {
|
||||||
return;
|
return;
|
||||||
@ -85,7 +90,13 @@ public class BackupCommand extends SWCommand {
|
|||||||
BauSystem.MESSAGE.send("BACKUP_LOAD_FAILURE", p);
|
BauSystem.MESSAGE.send("BACKUP_LOAD_FAILURE", p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
region.reset(backupFile);
|
EditSession editSession = new PasteBuilder(new PasteBuilder.FileProvider(backupFile))
|
||||||
|
.pastePoint(region.getMinPoint().add(region.getPrototype().getSizeX() / 2, 0, region.getPrototype().getSizeZ() / 2))
|
||||||
|
.minPoint(region.getMinPoint())
|
||||||
|
.maxPoint(region.getMaxPoint())
|
||||||
|
.waterLevel(region.getWaterLevel())
|
||||||
|
.run();
|
||||||
|
region.remember(editSession);
|
||||||
BauSystem.MESSAGE.send("BACKUP_LOAD", p);
|
BauSystem.MESSAGE.send("BACKUP_LOAD", p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +130,7 @@ public class BackupCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
SWListInv<String> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("BACKUP_INV_NAME", p), swListEntries, (clickType, s) -> {
|
SWListInv<String> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("BACKUP_INV_NAME", p), swListEntries, (clickType, s) -> {
|
||||||
p.getOpenInventory().close();
|
p.getOpenInventory().close();
|
||||||
backupLoad(p, s);
|
p.performCommand("backup load " + s);
|
||||||
});
|
});
|
||||||
swListInv.open();
|
swListInv.open();
|
||||||
}
|
}
|
||||||
@ -129,13 +140,6 @@ public class BackupCommand extends SWCommand {
|
|||||||
return SWCommandUtils.createMapper(s -> s, (commandSender, s) -> listBackup((Player) commandSender));
|
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) {
|
private List<String> listBackup(Player p) {
|
||||||
Region region = Region.getRegion(p.getLocation());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if (checkGlobalRegion(region, p)) {
|
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,8 +1,8 @@
|
|||||||
package de.steamwar.bausystem.features.bau;
|
package de.steamwar.bausystem.features.bau;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.bausystem.config.BauServer;
|
import de.steamwar.bausystem.config.BauServer;
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSWarpUtils;
|
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.region.flags.Flag;
|
import de.steamwar.bausystem.region.flags.Flag;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
@ -13,9 +13,7 @@ import de.steamwar.sql.BauweltMember;
|
|||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.sql.SteamwarUser;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
|
|
||||||
import static de.steamwar.bausystem.features.tpslimit.TPSWarpUtils.getTps;
|
|
||||||
|
|
||||||
@Linked
|
@Linked
|
||||||
public class InfoCommand extends SWCommand {
|
public class InfoCommand extends SWCommand {
|
||||||
@ -27,17 +25,8 @@ public class InfoCommand extends SWCommand {
|
|||||||
super("bauinfo");
|
super("bauinfo");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(help = true)
|
@Register(description = "BAU_INFO_COMMAND_HELP")
|
||||||
public void genericHelp(Player p, String... args) {
|
|
||||||
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_HELP", p);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register
|
|
||||||
public void genericCommand(Player p) {
|
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());
|
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_OWNER", p, SteamwarUser.get(bauServer.getOwnerID()).getUserName());
|
||||||
Region region = Region.getRegion(p.getLocation());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
for (Flag flag : Flag.getFlags()) {
|
for (Flag flag : Flag.getFlags()) {
|
||||||
@ -50,28 +39,48 @@ public class InfoCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<BauweltMember> members = BauweltMember.getMembers(bauServer.getOwnerID());
|
if (Permission.BUILD.hasPermission(p)) {
|
||||||
StringBuilder membermessage = new StringBuilder();
|
List<BauweltMember> members = BauweltMember.getMembers(bauServer.getOwnerID());
|
||||||
membermessage.append(BauSystem.MESSAGE.parsePrefixed("BAU_INFO_COMMAND_MEMBER", 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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
for (BauweltMember member : members) {
|
List<BauweltMember> supervisor = memberByPermission.getOrDefault(Permission.SUPERVISOR, Collections.emptyList());
|
||||||
membermessage.append(BauSystem.MESSAGE.parse("BAU_INFO_MEMBER_INFO", p,
|
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_MEMBER", p, "§eSupervisor", supervisor.size(), supervisor.isEmpty() ? "§8<none>" : joining(supervisor));
|
||||||
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),
|
List<BauweltMember> builder = memberByPermission.getOrDefault(Permission.BUILD, Collections.emptyList());
|
||||||
member.isWorld() ? BauSystem.MESSAGE.parse("BAU_INFO_MEMBER_WORLD_ALLOW", p) : BauSystem.MESSAGE.parse("BAU_INFO_MEMBER_WORLD_DISALLOW", p)
|
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();
|
StringBuilder tpsMessage = new StringBuilder();
|
||||||
tpsMessage.append(BauSystem.MESSAGE.parsePrefixed("BAU_INFO_COMMAND_TPS", p));
|
tpsMessage.append(BauSystem.MESSAGE.parsePrefixed("BAU_INFO_COMMAND_TPS", p));
|
||||||
tpsMessage.append(" ").append(getTps(TPSWatcher.TPSType.ONE_SECOND));
|
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_SECOND));
|
||||||
tpsMessage.append(" ").append(getTps(TPSWatcher.TPSType.TEN_SECONDS));
|
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_SECONDS));
|
||||||
if (!TPSWarpUtils.isWarping()) {
|
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_MINUTE));
|
||||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.ONE_MINUTE));
|
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES));
|
||||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.FIVE_MINUTES));
|
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES));
|
||||||
tpsMessage.append(" ").append(TPSWatcher.getTPS(TPSWatcher.TPSType.TEN_MINUTES));
|
|
||||||
}
|
|
||||||
p.sendMessage(tpsMessage.toString());
|
p.sendMessage(tpsMessage.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String joining(List<BauweltMember> bauweltMembers) {
|
||||||
|
StringBuilder st = new StringBuilder();
|
||||||
|
for (int i = 0; i < bauweltMembers.size(); i++) {
|
||||||
|
if (i != 0) {
|
||||||
|
st.append("§8, ");
|
||||||
|
}
|
||||||
|
st.append("§7");
|
||||||
|
st.append(SteamwarUser.get(bauweltMembers.get(i).getMemberID()).getUserName());
|
||||||
|
}
|
||||||
|
return st.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,28 +28,29 @@ import de.steamwar.linkage.Linked;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.TNTPrimed;
|
import org.bukkit.entity.TNTPrimed;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Linked
|
@Linked
|
||||||
public class CannonDetector implements Listener {
|
public class CannonDetector implements Listener {
|
||||||
|
|
||||||
private Map<TNTPrimed, Vector> velocities = new HashMap<>();
|
private Map<TNTPrimed, Vector> velocities = new HashMap<>();
|
||||||
|
private Map<TNTPrimed, Set<UUID>> propulsionOfProjectile = new HashMap<>();
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
public void onEntityExplode(EntityExplodeEvent event) {
|
public void onEntityExplode(EntityExplodeEvent event) {
|
||||||
if (!(event.getEntity() instanceof TNTPrimed)) {
|
if (!(event.getEntity() instanceof TNTPrimed)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TNTPrimed tnt = (TNTPrimed) event.getEntity();
|
TNTPrimed tnt = (TNTPrimed) event.getEntity();
|
||||||
|
propulsionOfProjectile.remove(tnt);
|
||||||
|
|
||||||
DepthManager.update(tnt, event.blockList());
|
DepthManager.update(tnt, event.blockList());
|
||||||
|
|
||||||
List<TNTPrimed> tnts = Bukkit.getWorlds().get(0).getEntitiesByClass(TNTPrimed.class)
|
List<TNTPrimed> tnts = Bukkit.getWorlds().get(0).getEntitiesByClass(TNTPrimed.class)
|
||||||
@ -66,6 +67,7 @@ public class CannonDetector implements Listener {
|
|||||||
boolean isEmpty = velocities.isEmpty();
|
boolean isEmpty = velocities.isEmpty();
|
||||||
tnts.forEach(tntPrimed -> {
|
tnts.forEach(tntPrimed -> {
|
||||||
velocities.put(tntPrimed, tntPrimed.getVelocity().clone());
|
velocities.put(tntPrimed, tntPrimed.getVelocity().clone());
|
||||||
|
propulsionOfProjectile.computeIfAbsent(tntPrimed, __ -> new HashSet<>()).add(tnt.getUniqueId());
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!isEmpty) {
|
if (!isEmpty) {
|
||||||
@ -75,7 +77,10 @@ public class CannonDetector implements Listener {
|
|||||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||||
Map<CannonKey, List<TNTPrimed>> grouped = new HashMap<>();
|
Map<CannonKey, List<TNTPrimed>> grouped = new HashMap<>();
|
||||||
velocities.forEach((tntPrimed, vector) -> {
|
velocities.forEach((tntPrimed, vector) -> {
|
||||||
grouped.computeIfAbsent(new CannonKey(round(tntPrimed.getLocation().toVector()), round(vector)), ignored -> new ArrayList<>()).add(tntPrimed);
|
boolean xBiggest = Math.abs(vector.getX()) > Math.abs(vector.getZ());
|
||||||
|
boolean zBiggest = Math.abs(vector.getZ()) > Math.abs(vector.getX());
|
||||||
|
Vector vec = new Vector(xBiggest ? Math.signum(vector.getX()) : 0, Math.round(vector.getY() * 100), zBiggest ? Math.signum(vector.getZ()) : 0);
|
||||||
|
grouped.computeIfAbsent(new CannonKey(propulsionOfProjectile.get(tntPrimed), vec), ignored -> new ArrayList<>()).add(tntPrimed);
|
||||||
});
|
});
|
||||||
grouped.forEach((cannonKey, tntPrimeds) -> {
|
grouped.forEach((cannonKey, tntPrimeds) -> {
|
||||||
if (tntPrimeds.size() <= 5) return;
|
if (tntPrimeds.size() <= 5) return;
|
||||||
@ -88,12 +93,4 @@ public class CannonDetector implements Listener {
|
|||||||
velocities.clear();
|
velocities.clear();
|
||||||
}, 1);
|
}, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Vector round(Vector vector) {
|
|
||||||
vector.multiply(10000);
|
|
||||||
vector.setX(Math.round(vector.getX()));
|
|
||||||
vector.setY(Math.round(vector.getY()));
|
|
||||||
vector.setZ(Math.round(vector.getZ()));
|
|
||||||
return vector;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -22,12 +22,16 @@ package de.steamwar.bausystem.features.cannon;
|
|||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.bukkit.entity.TNTPrimed;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@EqualsAndHashCode
|
@EqualsAndHashCode
|
||||||
@Getter
|
@Getter
|
||||||
public final class CannonKey {
|
public final class CannonKey {
|
||||||
private Vector locationVector;
|
private Set<UUID> propulsions;
|
||||||
private Vector velocityVector;
|
private Vector velocityVector;
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,6 @@ public class Depth {
|
|||||||
List<Block> blocksList = blocks.stream()
|
List<Block> blocksList = blocks.stream()
|
||||||
.filter(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION))
|
.filter(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
if (blocksList.isEmpty()) return;
|
|
||||||
tntCount++;
|
tntCount++;
|
||||||
for (Block block : blocksList) {
|
for (Block block : blocksList) {
|
||||||
internalUpdate(block);
|
internalUpdate(block);
|
||||||
|
@ -48,6 +48,6 @@ public class CountingwandGuiItem extends BauGuiItem {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Permission permission() {
|
public Permission permission() {
|
||||||
return Permission.WORLDEDIT;
|
return Permission.MEMBER;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -44,7 +44,8 @@ public class DesignEndStone {
|
|||||||
private REntityServer entityServer = new REntityServer();
|
private REntityServer entityServer = new REntityServer();
|
||||||
private List<REntity> entities = new ArrayList<>();
|
private List<REntity> entities = new ArrayList<>();
|
||||||
private Set<Location> locations = new HashSet<>();
|
private Set<Location> locations = new HashSet<>();
|
||||||
private List<Player> players = new ArrayList<>();
|
private boolean wsOrAs;
|
||||||
|
private double maxBlastResistance;
|
||||||
|
|
||||||
public DesignEndStone(Region region) {
|
public DesignEndStone(Region region) {
|
||||||
this.minX = region.getMinPointBuild().getX();
|
this.minX = region.getMinPointBuild().getX();
|
||||||
@ -53,9 +54,20 @@ public class DesignEndStone {
|
|||||||
this.maxX = region.getMaxPointBuild().getX();
|
this.maxX = region.getMaxPointBuild().getX();
|
||||||
this.maxY = region.getMaxPointBuild().getY();
|
this.maxY = region.getMaxPointBuild().getY();
|
||||||
this.maxZ = region.getMaxPointBuild().getZ();
|
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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void calc() {
|
public void calc() {
|
||||||
entities.forEach(REntity::die);
|
entities.forEach(REntity::die);
|
||||||
entities.clear();
|
entities.clear();
|
||||||
locations.clear();
|
locations.clear();
|
||||||
@ -64,8 +76,24 @@ public class DesignEndStone {
|
|||||||
calc(minX, minY, maxZ, maxX, maxY, maxZ, 0, 0, -1, maxZ - minZ);
|
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(minX, minY, minZ, minX, maxY, maxZ, 1, 0, 0, maxX - minX);
|
||||||
calc(maxX, minY, minZ, maxX, 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);
|
if (wsOrAs) {
|
||||||
calc(minX, maxY, minZ, maxX, maxY, maxZ, 0, -1, 0, maxY - minY);
|
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) {
|
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 cy = y + step * dirY;
|
||||||
int cz = z + step * dirZ;
|
int cz = z + step * dirZ;
|
||||||
Material material = WORLD.getBlockAt(cx, cy, cz).getType();
|
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);
|
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);
|
RFallingBlockEntity entity = new RFallingBlockEntity(entityServer, location, Material.RED_STAINED_GLASS);
|
||||||
entity.setNoGravity(true);
|
entity.setNoGravity(true);
|
||||||
entity.setGlowing(true);
|
entity.setGlowing(true);
|
||||||
entities.add(entity);
|
entities.add(entity);
|
||||||
break;
|
break;
|
||||||
} else if (!material.isAir()) {
|
} else if (!material.isAir() && material != Material.WATER && material != Material.LAVA) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -95,15 +124,18 @@ public class DesignEndStone {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void toggle(Player player) {
|
public void toggle(Player player) {
|
||||||
if (players.contains(player)) {
|
if (entityServer.getPlayers().contains(player)) {
|
||||||
players.remove(player);
|
|
||||||
entityServer.removePlayer(player);
|
entityServer.removePlayer(player);
|
||||||
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_DISABLE", player, ChatMessageType.ACTION_BAR);
|
BauSystem.MESSAGE.sendPrefixless("DESIGN_ENDSTONE_DISABLE", player, ChatMessageType.ACTION_BAR);
|
||||||
} else {
|
} else {
|
||||||
players.add(player);
|
|
||||||
entityServer.addPlayer(player);
|
entityServer.addPlayer(player);
|
||||||
calc();
|
calc();
|
||||||
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_ENABLE", player, ChatMessageType.ACTION_BAR);
|
BauSystem.MESSAGE.sendPrefixless("DESIGN_ENDSTONE_ENABLE", player, ChatMessageType.ACTION_BAR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean removePlayer(Player player) {
|
||||||
|
entityServer.removePlayer(player);
|
||||||
|
return entityServer.getPlayers().isEmpty();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,15 +22,23 @@ package de.steamwar.bausystem.features.design.endstone;
|
|||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.region.utils.RegionType;
|
import de.steamwar.bausystem.region.utils.RegionType;
|
||||||
|
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Linked
|
@Linked
|
||||||
public class DesignEndStoneCommand extends SWCommand {
|
public class DesignEndStoneCommand extends SWCommand implements Listener {
|
||||||
|
|
||||||
public DesignEndStoneCommand() {
|
public DesignEndStoneCommand() {
|
||||||
super("designendstone");
|
super("designendstone");
|
||||||
@ -39,7 +47,7 @@ public class DesignEndStoneCommand extends SWCommand {
|
|||||||
private Map<Region, DesignEndStone> designEndStoneMap = new HashMap<>();
|
private Map<Region, DesignEndStone> designEndStoneMap = new HashMap<>();
|
||||||
|
|
||||||
@Register(description = "DESIGN_ENDSTONE_COMMAND_HELP")
|
@Register(description = "DESIGN_ENDSTONE_COMMAND_HELP")
|
||||||
public void genericCommand(Player player) {
|
public void genericCommand(@Validator Player player) {
|
||||||
Region region = Region.getRegion(player.getLocation());
|
Region region = Region.getRegion(player.getLocation());
|
||||||
if (!region.hasType(RegionType.BUILD)) {
|
if (!region.hasType(RegionType.BUILD)) {
|
||||||
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player);
|
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player);
|
||||||
@ -47,4 +55,43 @@ public class DesignEndStoneCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
designEndStoneMap.computeIfAbsent(region, DesignEndStone::new).toggle(player);
|
designEndStoneMap.computeIfAbsent(region, DesignEndStone::new).toggle(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
|
disableDesignEndStone(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||||
|
event.getNewSpectator().forEach(this::disableDesignEndStone);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void disableDesignEndStone(Player player) {
|
||||||
|
new HashSet<>(designEndStoneMap.entrySet()).forEach(regionDesignEndStoneEntry -> {
|
||||||
|
if (regionDesignEndStoneEntry.getValue().removePlayer(player)) {
|
||||||
|
designEndStoneMap.remove(regionDesignEndStoneEntry.getKey());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
|
update(event.getBlock().getLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBlockBreak(BlockBreakEvent event) {
|
||||||
|
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||||
|
update(event.getBlock().getLocation());
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void update(Location location) {
|
||||||
|
Region region = Region.getRegion(location);
|
||||||
|
DesignEndStone designEndStone = designEndStoneMap.get(region);
|
||||||
|
if (designEndStone == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
designEndStone.calc();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ public class Detonator {
|
|||||||
|
|
||||||
public static void activateDetonator(DetonatorStorage detonator) {
|
public static void activateDetonator(DetonatorStorage detonator) {
|
||||||
Player p = detonator.getPlayer();
|
Player p = detonator.getPlayer();
|
||||||
if (Config.get(p).isDetonatorAutostart()) {
|
if (Config.getInstance().get(p).getPlainValueOrDefault("detonator-autostart", false)) {
|
||||||
AutostartListener.instance.activate(p);
|
AutostartListener.instance.activate(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,6 @@ public class DetonatorBauGuiItem extends BauGuiItem {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Permission permission() {
|
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")
|
@Register(value = "wand", description = "DETONATOR_HELP_WAND")
|
||||||
public void giveWand(Player p) {
|
public void giveWand(@Validator Player p) {
|
||||||
SWUtils.giveItemToPlayer(p, getWAND(p));
|
SWUtils.giveItemToPlayer(p, getWAND(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "click", description = "DETONATOR_HELP_CLICK")
|
@Register(value = "click", description = "DETONATOR_HELP_CLICK")
|
||||||
public void clickDetonator(Player p) {
|
public void clickDetonator(@Validator Player p) {
|
||||||
Detonator.activateDetonator(new ItemStorage(p));
|
Detonator.activateDetonator(new ItemStorage(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,8 +76,8 @@ public class DetonatorCommand extends SWCommand {
|
|||||||
|
|
||||||
@Register(value = "autostart", description = "DETONATOR_HELP_AUTOSTART")
|
@Register(value = "autostart", description = "DETONATOR_HELP_AUTOSTART")
|
||||||
public void toggleAutostartTimer(Player p) {
|
public void toggleAutostartTimer(Player p) {
|
||||||
boolean current = Config.get(p).isDetonatorAutostart();
|
boolean current = Config.getInstance().get(p).getPlainValueOrDefault("detonator-autostart", false);
|
||||||
Config.get(p).setDetonatorAutostart(!current);
|
Config.getInstance().get(p).put("detonator-autostart", !current);
|
||||||
if (!current) {
|
if (!current) {
|
||||||
BauSystem.MESSAGE.send("DETONATOR_AUTOSTART_ENABLE", p);
|
BauSystem.MESSAGE.send("DETONATOR_AUTOSTART_ENABLE", p);
|
||||||
} else {
|
} else {
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package de.steamwar.bausystem.features.detonator;
|
package de.steamwar.bausystem.features.detonator;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.bausystem.SWUtils;
|
import de.steamwar.bausystem.SWUtils;
|
||||||
import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage;
|
import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage;
|
||||||
import de.steamwar.bausystem.features.detonator.storage.ItemStorage;
|
import de.steamwar.bausystem.features.detonator.storage.ItemStorage;
|
||||||
@ -65,6 +66,7 @@ public class DetonatorListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBlockBreak(BlockBreakEvent event) {
|
public void onBlockBreak(BlockBreakEvent event) {
|
||||||
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
Player p = event.getPlayer();
|
Player p = event.getPlayer();
|
||||||
if (Detonator.isDetonator(p.getInventory().getItemInMainHand())) {
|
if (Detonator.isDetonator(p.getInventory().getItemInMainHand())) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
@ -75,6 +77,7 @@ public class DetonatorListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
if (!Detonator.isDetonator(event.getItem())) {
|
if (!Detonator.isDetonator(event.getItem())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -89,7 +92,7 @@ public class DetonatorListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onPlayerMove(PlayerMoveEvent event) {
|
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())) {
|
if (Detonator.hasActiveDetonatorShow(event.getPlayer())) {
|
||||||
Detonator.hideDetonator(event.getPlayer());
|
Detonator.hideDetonator(event.getPlayer());
|
||||||
}
|
}
|
||||||
@ -110,6 +113,7 @@ public class DetonatorListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
|
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
|
||||||
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
if (Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) {
|
if (Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) {
|
||||||
HAS_UPDATED.add(event.getPlayer());
|
HAS_UPDATED.add(event.getPlayer());
|
||||||
}
|
}
|
||||||
@ -117,6 +121,7 @@ public class DetonatorListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
|
||||||
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
if (Detonator.isDetonator(event.getMainHandItem()) || Detonator.isDetonator(event.getOffHandItem())) {
|
if (Detonator.isDetonator(event.getMainHandItem()) || Detonator.isDetonator(event.getOffHandItem())) {
|
||||||
HAS_UPDATED.add(event.getPlayer());
|
HAS_UPDATED.add(event.getPlayer());
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ public class BauGUI {
|
|||||||
if (!updating) {
|
if (!updating) {
|
||||||
OPEN_INVS.add(p);
|
OPEN_INVS.add(p);
|
||||||
}
|
}
|
||||||
BauGuiMapping mapping = new BauGuiMapping(p);
|
BauGuiMapping mapping = BauGuiMapping.getGuiMapping(p);
|
||||||
SWInventory inv = new SWInventory(p, mapping.getSize(), BauSystem.MESSAGE.parse("GUI_NAME", p));
|
SWInventory inv = new SWInventory(p, mapping.getSize(), BauSystem.MESSAGE.parse("GUI_NAME", p));
|
||||||
getITEMS().values().forEach(item -> {
|
getITEMS().values().forEach(item -> {
|
||||||
if (!mapping.isShown(item.getId())) {
|
if (!mapping.isShown(item.getId())) {
|
||||||
@ -81,7 +81,7 @@ public class BauGUI {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
p.closeInventory();
|
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)) {
|
if (!permission.hasPermission(p)) {
|
||||||
List<String> lore = meta.getLore();
|
List<String> lore = meta.getLore();
|
||||||
if (lore == null) {
|
if (lore == null) {
|
||||||
lore = Collections.singletonList(BauSystem.MESSAGE.parse(permissionString(permission), p));
|
lore = Collections.singletonList(BauSystem.MESSAGE.parse("NO_PERMISSION", p));
|
||||||
} else {
|
} else {
|
||||||
lore.add(BauSystem.MESSAGE.parse(permissionString(permission), p));
|
lore.add(BauSystem.MESSAGE.parse("NO_PERMISSION", p));
|
||||||
}
|
}
|
||||||
meta.setLore(lore);
|
meta.setLore(lore);
|
||||||
}
|
}
|
||||||
itemStack.setItemMeta(meta);
|
itemStack.setItemMeta(meta);
|
||||||
return itemStack;
|
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";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ public class BauGuiEditor implements Listener {
|
|||||||
private static final List<Player> open_Edits = new ArrayList<>();
|
private static final List<Player> open_Edits = new ArrayList<>();
|
||||||
|
|
||||||
public static void openGuiEditor(Player p, ItemStack cursor) {
|
public static void openGuiEditor(Player p, ItemStack cursor) {
|
||||||
BauGuiMapping mapping = new BauGuiMapping(p);
|
BauGuiMapping mapping = BauGuiMapping.getGuiMapping(p);
|
||||||
Inventory inv = Bukkit.createInventory(null, mapping.getSize() + 9, BauSystem.MESSAGE.parse("GUI_EDITOR_TITLE", p));
|
Inventory inv = Bukkit.createInventory(null, mapping.getSize() + 9, BauSystem.MESSAGE.parse("GUI_EDITOR_TITLE", p));
|
||||||
for (Map.Entry<Integer, Integer> e : mapping.getMapping().entrySet()) {
|
for (Map.Entry<Integer, Integer> e : mapping.getMapping().entrySet()) {
|
||||||
if (e.getValue() >= 0) {
|
if (e.getValue() >= 0) {
|
||||||
@ -78,6 +78,7 @@ public class BauGuiEditor implements Listener {
|
|||||||
p.openInventory(inv);
|
p.openInventory(inv);
|
||||||
p.getOpenInventory().setCursor(cursor == null ? new SWItem().getItemStack() : cursor);
|
p.getOpenInventory().setCursor(cursor == null ? new SWItem().getItemStack() : cursor);
|
||||||
open_Edits.add(p);
|
open_Edits.add(p);
|
||||||
|
BauGuiMapping.startWatchdog();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ItemStack addId(ItemStack itemStack, int id) {
|
private static ItemStack addId(ItemStack itemStack, int id) {
|
||||||
@ -100,7 +101,7 @@ public class BauGuiEditor implements Listener {
|
|||||||
|
|
||||||
ItemStack i = event.getCurrentItem();
|
ItemStack i = event.getCurrentItem();
|
||||||
Player p = (Player) event.getWhoClicked();
|
Player p = (Player) event.getWhoClicked();
|
||||||
BauGuiMapping mapping = new BauGuiMapping(p);
|
BauGuiMapping mapping = BauGuiMapping.getGuiMapping(p);
|
||||||
if (event.getClickedInventory() == p.getInventory()) {
|
if (event.getClickedInventory() == p.getInventory()) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
@ -193,10 +194,13 @@ public class BauGuiEditor implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void saveMapping(Player p) {
|
private void saveMapping(Player p) {
|
||||||
saveMapping(p.getOpenInventory(), new BauGuiMapping(p));
|
saveMapping(p.getOpenInventory(), BauGuiMapping.getGuiMapping(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveMapping(InventoryView view, BauGuiMapping mapping) {
|
private void saveMapping(InventoryView view, BauGuiMapping mapping) {
|
||||||
|
if (mapping.isSaved()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
HashMap<Integer, Integer> newMapping = new HashMap<>();
|
HashMap<Integer, Integer> newMapping = new HashMap<>();
|
||||||
|
|
||||||
for (int i = 0; i < view.getTopInventory().getContents().length; i++) {
|
for (int i = 0; i < view.getTopInventory().getContents().length; i++) {
|
||||||
@ -212,6 +216,7 @@ public class BauGuiEditor implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mapping.setMapping(newMapping);
|
mapping.setMapping(newMapping);
|
||||||
|
mapping.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
@ -222,7 +227,7 @@ public class BauGuiEditor implements Listener {
|
|||||||
|
|
||||||
Player p = (Player) event.getPlayer();
|
Player p = (Player) event.getPlayer();
|
||||||
|
|
||||||
saveMapping(event.getView(), new BauGuiMapping(p));
|
saveMapping(event.getView(), BauGuiMapping.getGuiMapping(p));
|
||||||
open_Edits.remove(p);
|
open_Edits.remove(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,50 +19,82 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.gui.editor;
|
package de.steamwar.bausystem.features.gui.editor;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.configplayer.Config;
|
import de.steamwar.bausystem.configplayer.Config;
|
||||||
|
import de.steamwar.bausystem.features.gui.BauGUI;
|
||||||
|
import de.steamwar.bausystem.linkage.specific.BauGuiItem;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
import yapion.hierarchy.types.YAPIONObject;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class BauGuiMapping {
|
public class BauGuiMapping {
|
||||||
|
|
||||||
@Getter
|
private static final HashMap<UUID, BauGuiMapping> fromUUID = new HashMap<>();
|
||||||
private final Player owner;
|
private static final List<BauGuiMapping> mappings = new ArrayList<>();
|
||||||
|
|
||||||
public BauGuiMapping(Player p) {
|
private static BukkitTask task;
|
||||||
this.owner = p;
|
|
||||||
|
public static void startWatchdog() {
|
||||||
|
if (task == null) {
|
||||||
|
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), bukkitTask -> {
|
||||||
|
mappings.forEach(BauGuiMapping::tick);
|
||||||
|
if (BauGuiEditor.getOpen_Edits().isEmpty()) {
|
||||||
|
bukkitTask.cancel();
|
||||||
|
task = null;
|
||||||
|
}
|
||||||
|
}, 1, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, Integer> getInternalMapping() {
|
@Getter
|
||||||
return Config.get(owner).getBaugui();
|
private final YAPIONObject object;
|
||||||
|
@Getter
|
||||||
|
private final Player owner;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private boolean saved;
|
||||||
|
|
||||||
|
protected BauGuiMapping(YAPIONObject object, Player p) {
|
||||||
|
this.object = object;
|
||||||
|
this.owner = p;
|
||||||
|
fromUUID.put(p.getUniqueId(), this);
|
||||||
|
mappings.add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BauGuiMapping getGuiMapping(Player p) {
|
||||||
|
BauGuiMapping mapping = fromUUID.get(p.getUniqueId());
|
||||||
|
|
||||||
|
if (mapping == null) {
|
||||||
|
YAPIONObject yapionObject = Config.getInstance().get(p);
|
||||||
|
mapping = new BauGuiMapping(yapionObject.getObject("baugui"), p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isShown(int id) {
|
public boolean isShown(int id) {
|
||||||
return getInternalMapping().getOrDefault(Integer.toString(id), -1) >= 0;
|
return object.getPlainValueOrDefault(Integer.toString(id), -1) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSlot(int id) {
|
public int getSlot(int id) {
|
||||||
return getInternalMapping().getOrDefault(Integer.toString(id), 0);
|
return object.getPlainValue(Integer.toString(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<Integer, Integer> getMapping() {
|
public Map<Integer, Integer> getMapping() {
|
||||||
return getInternalMapping().entrySet().stream().collect(Collectors.toMap(entry -> Integer.valueOf(entry.getKey()), Map.Entry::getValue));
|
return internalReadMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMapping(Map<Integer, Integer> mapping) {
|
public void setMapping(Map<Integer, Integer> mapping) {
|
||||||
Map<String, Integer> map = getInternalMapping();
|
internalWriteMap(mapping);
|
||||||
map.clear();
|
|
||||||
|
|
||||||
for(Map.Entry<Integer, Integer> entry : mapping.entrySet())
|
|
||||||
map.put(String.valueOf(entry.getKey()), entry.getValue());
|
|
||||||
|
|
||||||
Config.get(owner).save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSize() {
|
public int getSize() {
|
||||||
return getInternalMapping().getOrDefault("size", 45);
|
return object.getPlainValueOrDefault("size", 45);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSize(int size) {
|
public void setSize(int size) {
|
||||||
@ -70,6 +102,37 @@ public class BauGuiMapping {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
getInternalMapping().put("size", size);
|
object.add("size", size);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tick() {
|
||||||
|
this.saved = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save() {
|
||||||
|
if (saved) return;
|
||||||
|
YAPIONObject config = Config.getInstance().get(owner);
|
||||||
|
config.add("baugui", object);
|
||||||
|
Config.getInstance().save(owner);
|
||||||
|
saved = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Integer, Integer> internalReadMap() {
|
||||||
|
Map<Integer, Integer> map = new HashMap<>();
|
||||||
|
for (Map.Entry<Integer, BauGuiItem> e : BauGUI.getITEMS().entrySet()) {
|
||||||
|
Integer value = object.getPlainValueOrDefault(e.getKey().toString(), -1);
|
||||||
|
if (value == -1) continue;
|
||||||
|
map.put(e.getKey(), value);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void internalWriteMap(Map<Integer, Integer> map) {
|
||||||
|
for (Map.Entry<Integer, BauGuiItem> e : BauGUI.getITEMS().entrySet()) {
|
||||||
|
object.remove(e.getKey().toString());
|
||||||
|
Integer value = map.getOrDefault(e.getKey(), -1);
|
||||||
|
if (value == -1) continue;
|
||||||
|
object.add(e.getKey().toString(), value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,89 +19,75 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.hotbar;
|
package de.steamwar.bausystem.features.hotbar;
|
||||||
|
|
||||||
import de.steamwar.bausystem.config.ConfigField;
|
import de.steamwar.bausystem.configplayer.Config;
|
||||||
import de.steamwar.bausystem.config.YamlConfig;
|
|
||||||
import de.steamwar.core.Core;
|
import de.steamwar.core.Core;
|
||||||
import de.steamwar.sql.UserConfig;
|
import lombok.experimental.UtilityClass;
|
||||||
import lombok.Getter;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import yapion.hierarchy.types.YAPIONArray;
|
||||||
|
import yapion.hierarchy.types.YAPIONObject;
|
||||||
|
import yapion.hierarchy.types.YAPIONValue;
|
||||||
|
import yapion.parser.YAPIONParser;
|
||||||
|
import yapion.serializing.YAPIONDeserializer;
|
||||||
|
import yapion.serializing.YAPIONSerializer;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.HashSet;
|
||||||
import java.util.Arrays;
|
import java.util.Set;
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class DefaultHotbar extends YamlConfig {
|
@UtilityClass
|
||||||
|
public class DefaultHotbar {
|
||||||
|
|
||||||
public static final String configName = "bauhotbar-" + Core.getVersion();
|
private final YAPIONArray DEFAULT_HOTBAR = YAPIONParser.parse("{[{@type(org.bukkit.inventory.ItemStack)v(2230)type(WOODEN_AXE)meta{@type(org.bukkit.inventory.meta.ItemMeta)meta-type(UNSPECIFIC)display-name(WorldEdit Wand)lore{@type(java.util.ArrayList)values[Left click: select pos #1,Right click: select pos #2]}}},{@type(org.bukkit.inventory.ItemStack)v(2230)type(COMPASS)meta{@type(org.bukkit.inventory.meta.ItemMeta)meta-type(UNSPECIFIC)display-name(Navigation Wand)lore{@type(java.util.ArrayList)values[Left click: jump to location,Right click: pass through walls]}}},null,null,null,null,null,null,{@type(org.bukkit.inventory.ItemStack)v(2230)type(NETHER_STAR)meta{@type(org.bukkit.inventory.meta.ItemMeta)meta-type(UNSPECIFIC)display-name(§eBau GUI)}},null,null,{@type(org.bukkit.inventory.ItemStack)v(3117)type(ELYTRA)},null]}").getArray("");
|
||||||
|
|
||||||
public static DefaultHotbar get(Player p) {
|
public void updateHotbar(Player p) {
|
||||||
return new DefaultHotbar(p, fromUserConfig(p.getUniqueId(), configName));
|
ItemStack[] hotbar = new ItemStack[13];
|
||||||
}
|
System.arraycopy(p.getInventory().getContents(), 0, hotbar, 0, 9);
|
||||||
|
System.arraycopy(p.getInventory().getArmorContents(), 0, hotbar, 9, 4);
|
||||||
private final Player player;
|
YAPIONArray yapionArray = new YAPIONArray();
|
||||||
|
for (ItemStack itemStack : hotbar) {
|
||||||
@Getter
|
if (itemStack != null) {
|
||||||
@ConfigField
|
yapionArray.add(YAPIONSerializer.serialize(itemStack));
|
||||||
private final List<ItemStack> hotbar = new ArrayList<>(13);
|
} else {
|
||||||
|
yapionArray.add(new YAPIONValue<>(null));
|
||||||
public DefaultHotbar(Player player, ConfigurationSection config) {
|
}
|
||||||
super(config);
|
|
||||||
this.player = player;
|
|
||||||
|
|
||||||
if(hotbar.isEmpty()) {
|
|
||||||
hotbar.add(newNamedStack(Material.WOODEN_AXE, "WorldEdit Wand", "Left click: select pos #1", "Right click: select pos #2"));
|
|
||||||
hotbar.add(newNamedStack(Material.COMPASS, "Navigation Wand", "Left click: jump to location", "Right click: pass through walls"));
|
|
||||||
hotbar.add(null);
|
|
||||||
hotbar.add(null);
|
|
||||||
hotbar.add(null);
|
|
||||||
hotbar.add(null);
|
|
||||||
hotbar.add(null);
|
|
||||||
hotbar.add(null);
|
|
||||||
hotbar.add(newNamedStack(Material.NETHER_STAR, "§eBau GUI"));
|
|
||||||
hotbar.add(null);
|
|
||||||
hotbar.add(null);
|
|
||||||
hotbar.add(new ItemStack(Material.ELYTRA));
|
|
||||||
hotbar.add(null);
|
|
||||||
}
|
}
|
||||||
|
Config.getInstance().get(p).add("hotbar-" + Core.getVersion(), yapionArray);
|
||||||
|
Config.getInstance().save(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update() {
|
public void setHotbar(Player p) {
|
||||||
hotbar.clear();
|
ItemStack[] hotbar = getItems(p);
|
||||||
|
ItemStack[] inv = p.getInventory().getContents();
|
||||||
for(int i = 0; i < 9; i++)
|
ItemStack[] armor = p.getInventory().getArmorContents();
|
||||||
hotbar.add(player.getInventory().getContents()[i]);
|
System.arraycopy(hotbar, 0, inv, 0, 9);
|
||||||
|
System.arraycopy(hotbar, 9, armor, 0, 4);
|
||||||
for(int i = 0; i < 4; i++)
|
p.getInventory().setContents(inv);
|
||||||
hotbar.add(player.getInventory().getArmorContents()[i]);
|
p.getInventory().setArmorContents(armor);
|
||||||
|
|
||||||
UserConfig.updatePlayerConfig(player.getUniqueId(), configName, toYaml().saveToString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void load() {
|
public ItemStack[] getItems(Player p) {
|
||||||
ItemStack[] inv = player.getInventory().getContents();
|
Config.getInstance().get(p).remap("hotbar", "hotbar-19");
|
||||||
ItemStack[] armor = player.getInventory().getArmorContents();
|
YAPIONArray yapionArray = Config.getInstance().get(p).getYAPIONArrayOrSetDefault("hotbar-" + Core.getVersion(), defaultHotbar());
|
||||||
System.arraycopy(hotbar.toArray(new ItemStack[0]), 0, inv, 0, 9);
|
ItemStack[] hotbar = new ItemStack[13];
|
||||||
System.arraycopy(hotbar.toArray(new ItemStack[0]), 9, armor, 0, 4);
|
Set<Integer> invalid = new HashSet<>();
|
||||||
player.getInventory().setContents(inv);
|
yapionArray.forEach((integer, yapionAnyType) -> {
|
||||||
player.getInventory().setArmorContents(armor);
|
if (yapionAnyType instanceof YAPIONValue) {
|
||||||
|
hotbar[integer] = null;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
hotbar[integer] = YAPIONDeserializer.deserialize((YAPIONObject) yapionAnyType);
|
||||||
|
} catch (Exception e) {
|
||||||
|
invalid.add(integer);
|
||||||
|
hotbar[integer] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
invalid.forEach(i -> yapionArray.set(i, new YAPIONValue<>(null)));
|
||||||
|
if (!invalid.isEmpty()) Config.getInstance().save(p);
|
||||||
|
return hotbar;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ItemStack newNamedStack(Material material, String displayName, String... lore) {
|
public YAPIONArray defaultHotbar() {
|
||||||
ItemStack stack = new ItemStack(material);
|
return DEFAULT_HOTBAR;
|
||||||
ItemMeta meta = stack.getItemMeta();
|
|
||||||
|
|
||||||
if(displayName != null)
|
|
||||||
meta.setDisplayName(displayName);
|
|
||||||
|
|
||||||
if(lore.length > 0)
|
|
||||||
meta.setLore(Arrays.stream(lore).collect(Collectors.toList()));
|
|
||||||
|
|
||||||
stack.setItemMeta(meta);
|
|
||||||
return stack;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,8 +26,6 @@ import de.steamwar.linkage.Linked;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Linked
|
@Linked
|
||||||
public class HotbarCommand extends SWCommand {
|
public class HotbarCommand extends SWCommand {
|
||||||
|
|
||||||
@ -37,24 +35,24 @@ public class HotbarCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "load", description = "HOTBAR_HELP_LOAD")
|
@Register(value = "load", description = "HOTBAR_HELP_LOAD")
|
||||||
public void loadHotbar(Player p) {
|
public void loadHotbar(@Validator Player p) {
|
||||||
DefaultHotbar.get(p).load();
|
DefaultHotbar.setHotbar(p);
|
||||||
BauSystem.MESSAGE.send("HOTBAR_LOADED", p);
|
BauSystem.MESSAGE.send("HOTBAR_LOADED", p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "save", description = "HOTBAR_HELP_SAVE")
|
@Register(value = "save", description = "HOTBAR_HELP_SAVE")
|
||||||
public void saveHotbar(Player p) {
|
public void saveHotbar(Player p) {
|
||||||
DefaultHotbar.get(p).update();
|
DefaultHotbar.updateHotbar(p);
|
||||||
BauSystem.MESSAGE.send("HOTBAR_SAVED", p);
|
BauSystem.MESSAGE.send("HOTBAR_SAVED", p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "show", description = "HOTBAR_HELP_SHOW")
|
@Register(value = "show", description = "HOTBAR_HELP_SHOW")
|
||||||
public void showHotbar(Player p) {
|
public void showHotbar(Player p) {
|
||||||
SWInventory inv = new SWInventory(p, 18, BauSystem.MESSAGE.parse("HOTBAR_INVENTORY", p));
|
SWInventory inv = new SWInventory(p, 18, BauSystem.MESSAGE.parse("HOTBAR_INVENTORY", p));
|
||||||
List<ItemStack> hotbar = DefaultHotbar.get(p).getHotbar();
|
ItemStack[] hotbar = DefaultHotbar.getItems(p);
|
||||||
for (int i = 0; i < hotbar.size(); i++) {
|
for (int i = 0; i < hotbar.length; i++) {
|
||||||
if (hotbar.get(i) == null) continue;
|
if (hotbar[i] == null) continue;
|
||||||
inv.setItem(i, hotbar.get(i), clickType -> {
|
inv.setItem(i, hotbar[i], clickType -> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
inv.open();
|
inv.open();
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.hotbar;
|
package de.steamwar.bausystem.features.hotbar;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@ -30,8 +31,9 @@ public class HotbarListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
if (allNull(event.getPlayer().getInventory().getContents()) && allNull(event.getPlayer().getInventory().getArmorContents())) {
|
if (allNull(event.getPlayer().getInventory().getContents()) && allNull(event.getPlayer().getInventory().getArmorContents())) {
|
||||||
DefaultHotbar.get(event.getPlayer()).load();
|
DefaultHotbar.setHotbar(event.getPlayer());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ public class InventoryFillBauGuiItem extends BauGuiItem {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getItem(Player player) {
|
public ItemStack getItem(Player player) {
|
||||||
String loreKey = Config.get(player).isInventoryFill() ? "OTHER_ITEMS_INVENTORY_FILL_LORE_ACTIVE" : "OTHER_ITEMS_INVENTORY_FILL_LORE_INACTIVE";
|
String loreKey = Config.getInstance().get(player).getPlainValueOrDefault("inventoryfill", false) ? "OTHER_ITEMS_INVENTORY_FILL_LORE_ACTIVE" : "OTHER_ITEMS_INVENTORY_FILL_LORE_INACTIVE";
|
||||||
return new SWItem(Material.HOPPER, BauSystem.MESSAGE.parse("OTHER_ITEMS_INVENTORY_FILL_NAME", player), Collections.singletonList(BauSystem.MESSAGE.parse(loreKey, player)), false, clickType -> {}).getItemStack();
|
return new SWItem(Material.HOPPER, BauSystem.MESSAGE.parse("OTHER_ITEMS_INVENTORY_FILL_NAME", player), Collections.singletonList(BauSystem.MESSAGE.parse(loreKey, player)), false, clickType -> {}).getItemStack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package de.steamwar.bausystem.features.inventoryfiller;
|
package de.steamwar.bausystem.features.inventoryfiller;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.bausystem.configplayer.Config;
|
import de.steamwar.bausystem.configplayer.Config;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import net.md_5.bungee.api.ChatMessageType;
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
@ -38,7 +39,8 @@ public class InventoryFiller implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||||
if (!Config.get(event.getPlayer()).isInventoryFill()) return;
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
|
if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("inventoryfill", false)) return;
|
||||||
if (!event.getPlayer().isSneaking()) return;
|
if (!event.getPlayer().isSneaking()) return;
|
||||||
Block block = event.getPlayer().getTargetBlockExact(5);
|
Block block = event.getPlayer().getTargetBlockExact(5);
|
||||||
if (block == null) return;
|
if (block == null) return;
|
||||||
@ -59,7 +61,8 @@ public class InventoryFiller implements Listener {
|
|||||||
*/
|
*/
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
|
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
|
||||||
if (!Config.get(event.getPlayer()).isInventoryFill()) return;
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
|
if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("inventoryfill", false)) return;
|
||||||
if (!event.getPlayer().isSneaking()) return;
|
if (!event.getPlayer().isSneaking()) return;
|
||||||
ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand();
|
ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand();
|
||||||
if (itemStack.getType() == Material.AIR) return;
|
if (itemStack.getType() == Material.AIR) return;
|
||||||
|
@ -16,8 +16,8 @@ public class InventoryFillerCommand extends SWCommand {
|
|||||||
|
|
||||||
@Register(description = {"INVENTORY_FILL_HELP", "INVENTORY_FILL_INFO"})
|
@Register(description = {"INVENTORY_FILL_HELP", "INVENTORY_FILL_INFO"})
|
||||||
public void toggle(Player player) {
|
public void toggle(Player player) {
|
||||||
boolean inventoryFill = Config.get(player).isInventoryFill();
|
boolean inventoryFill = Config.getInstance().get(player).getPlainValueOrDefault("inventoryfill", false);
|
||||||
Config.get(player).setInventoryFill(!inventoryFill);
|
Config.getInstance().get(player).put("inventoryfill", !inventoryFill);
|
||||||
if (!inventoryFill) {
|
if (!inventoryFill) {
|
||||||
SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("INVENTORY_FILL_ENABLE", player));
|
SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("INVENTORY_FILL_ENABLE", player));
|
||||||
BauSystem.MESSAGE.send("INVENTORY_FILL_INFO", player);
|
BauSystem.MESSAGE.send("INVENTORY_FILL_INFO", player);
|
||||||
|
@ -21,6 +21,7 @@ package de.steamwar.bausystem.features.killchecker;
|
|||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
|
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||||
import de.steamwar.bausystem.utils.bossbar.BossBarService;
|
import de.steamwar.bausystem.utils.bossbar.BossBarService;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
@ -54,7 +55,7 @@ public class KillcheckerCommand extends SWCommand implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "enable", description = "KILLCHECKER_HELP_ENABLE")
|
@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());
|
Region region = Region.getRegion(player.getLocation());
|
||||||
KillcheckerVisualizer killcheckerVisualizer = visualizers.computeIfAbsent(region, region1 -> new KillcheckerVisualizer(region1, bossBarService));
|
KillcheckerVisualizer killcheckerVisualizer = visualizers.computeIfAbsent(region, region1 -> new KillcheckerVisualizer(region1, bossBarService));
|
||||||
killcheckerVisualizer.recalc();
|
killcheckerVisualizer.recalc();
|
||||||
@ -74,16 +75,22 @@ public class KillcheckerCommand extends SWCommand implements Listener {
|
|||||||
BauSystem.MESSAGE.send("KILLCHECKER_DISABLE", player);
|
BauSystem.MESSAGE.send("KILLCHECKER_DISABLE", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||||
|
event.getNewSpectator().forEach(this::hide);
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
Player player = event.getPlayer();
|
hide(event.getPlayer());
|
||||||
Set<Region> regions = new HashSet<>();
|
}
|
||||||
visualizers.forEach((region, visualizer) -> {
|
|
||||||
if (visualizer.disconnect(player)) {
|
private void hide(Player player) {
|
||||||
regions.add(region);
|
new HashSet<>(visualizers.entrySet()).forEach(regionKillcheckerVisualizerEntry -> {
|
||||||
|
if (regionKillcheckerVisualizerEntry.getValue().hide(player)) {
|
||||||
|
visualizers.remove(regionKillcheckerVisualizerEntry.getKey());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
regions.forEach(visualizers::remove);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void recalc(Block block) {
|
private void recalc(Block block) {
|
||||||
|
@ -34,8 +34,6 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.boss.BarColor;
|
import org.bukkit.boss.BarColor;
|
||||||
import org.bukkit.boss.BarStyle;
|
|
||||||
import org.bukkit.boss.BossBar;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -45,10 +43,25 @@ import java.util.Set;
|
|||||||
|
|
||||||
public class KillcheckerVisualizer {
|
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 World WORLD = Bukkit.getWorlds().get(0);
|
||||||
|
|
||||||
private static final double SURROUND = 4;
|
private static final double SURROUND = 4.5;
|
||||||
|
|
||||||
private final Point minPoint;
|
private final Point minPoint;
|
||||||
private final Point maxPoint;
|
private final Point maxPoint;
|
||||||
@ -57,9 +70,6 @@ public class KillcheckerVisualizer {
|
|||||||
private final int zArea;
|
private final int zArea;
|
||||||
private final int xArea;
|
private final int xArea;
|
||||||
|
|
||||||
private final Set<Player> players = new HashSet<>();
|
|
||||||
private final Set<Player> areaPlayers = new HashSet<>();
|
|
||||||
|
|
||||||
private final Region region;
|
private final Region region;
|
||||||
private final BossBarService bossBarService;
|
private final BossBarService bossBarService;
|
||||||
|
|
||||||
@ -261,7 +271,7 @@ public class KillcheckerVisualizer {
|
|||||||
double zPercent = xCount / (double) zArea;
|
double zPercent = xCount / (double) zArea;
|
||||||
percent = (xPercent + yPercent + zPercent) / 3;
|
percent = (xPercent + yPercent + zPercent) / 3;
|
||||||
kills = zKills + yKills + xKills;
|
kills = zKills + yKills + xKills;
|
||||||
players.forEach(this::updateBossBar);
|
outline.getPlayers().forEach(this::updateBossBar);
|
||||||
|
|
||||||
Set<Point> pointSet = new HashSet<>(killCount.keySet());
|
Set<Point> pointSet = new HashSet<>(killCount.keySet());
|
||||||
Set<Point> outlinePointsCacheLast = new HashSet<>(outlinePointsCache);
|
Set<Point> outlinePointsCacheLast = new HashSet<>(outlinePointsCache);
|
||||||
@ -356,40 +366,21 @@ public class KillcheckerVisualizer {
|
|||||||
return new Cuboid(minX, minY, minZ, maxX, maxY, maxZ);
|
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);
|
outline.addPlayer(player);
|
||||||
if (!onlyOutline) {
|
if (!onlyOutline) {
|
||||||
inner.addPlayer(player);
|
inner.addPlayer(player);
|
||||||
areaPlayers.add(player);
|
} else {
|
||||||
} else if (areaPlayers.contains(player)) {
|
|
||||||
inner.removePlayer(player);
|
inner.removePlayer(player);
|
||||||
areaPlayers.remove(player);
|
|
||||||
}
|
}
|
||||||
updateBossBar(player);
|
updateBossBar(player);
|
||||||
return players.add(player);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hide(Player player) {
|
public boolean hide(Player player) {
|
||||||
outline.removePlayer(player);
|
outline.removePlayer(player);
|
||||||
if (areaPlayers.contains(player)) {
|
inner.removePlayer(player);
|
||||||
inner.removePlayer(player);
|
|
||||||
}
|
|
||||||
players.remove(player);
|
|
||||||
areaPlayers.remove(player);
|
|
||||||
bossBarService.remove(player, region, "killchecker");
|
bossBarService.remove(player, region, "killchecker");
|
||||||
if (players.isEmpty()) {
|
if (outline.getPlayers().isEmpty() && inner.getPlayers().isEmpty()) {
|
||||||
outline.close();
|
|
||||||
inner.close();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean disconnect(Player player) {
|
|
||||||
players.remove(player);
|
|
||||||
areaPlayers.remove(player);
|
|
||||||
bossBarService.remove(player, region, "killchecker");
|
|
||||||
if (players.isEmpty()) {
|
|
||||||
outline.close();
|
outline.close();
|
||||||
inner.close();
|
inner.close();
|
||||||
return true;
|
return true;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package de.steamwar.bausystem.features.loader;
|
package de.steamwar.bausystem.features.loader;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
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.LoaderElement;
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.bausystem.features.loader.elements.impl.LoaderTNT;
|
import de.steamwar.bausystem.features.loader.elements.impl.LoaderTNT;
|
||||||
@ -35,9 +36,14 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.inventory.ClickType;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
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 {
|
public class Loader implements Listener {
|
||||||
|
|
||||||
@ -68,25 +74,45 @@ public class Loader implements Listener {
|
|||||||
|
|
||||||
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
|
||||||
if (stage != Stage.RUNNING) return;
|
if (stage != Stage.RUNNING) return;
|
||||||
|
if(!Permission.BUILD.hasPermission(p)) return;
|
||||||
if (waitTime > 0) {
|
if (waitTime > 0) {
|
||||||
waitTime--;
|
waitTime--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (currentElement >= elements.size()) {
|
||||||
|
currentElement = 0;
|
||||||
|
if (stage == Stage.SINGLE) {
|
||||||
|
stage = Stage.PAUSE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (currentElement < elements.size()) {
|
while (currentElement < elements.size()) {
|
||||||
LoaderElement element = elements.get(currentElement);
|
LoaderElement element = elements.get(currentElement);
|
||||||
currentElement++;
|
currentElement++;
|
||||||
element.execute(delay -> waitTime = delay);
|
element.execute(delay -> waitTime = delay);
|
||||||
if (waitTime > 0) {
|
if (waitTime > 0) {
|
||||||
break;
|
if (element instanceof LoaderTNT) currentElement--;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (currentElement >= elements.size()) {
|
|
||||||
currentElement = 0;
|
|
||||||
}
|
|
||||||
}, 0, 1);
|
}, 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() {
|
public void start() {
|
||||||
if (stage == Stage.END) return;
|
if (stage == Stage.END) return;
|
||||||
if (stage == Stage.RUNNING) return;
|
if (stage == Stage.RUNNING) return;
|
||||||
@ -121,86 +147,122 @@ public class Loader implements Listener {
|
|||||||
LOADER_MAP.remove(p);
|
LOADER_MAP.remove(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean setTicksBetweenShots(int delay) {
|
||||||
|
if (elements.size() == 0) return false;
|
||||||
|
LoaderElement loaderElement = elements.get(elements.size() - 1);
|
||||||
|
if (loaderElement instanceof LoaderWait) {
|
||||||
|
((LoaderWait) loaderElement).setDelay(delay);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTicksBetweenBlocks(int delay) {
|
||||||
|
for (int i = 0; i < elements.size() - 1; i++) {
|
||||||
|
LoaderElement loaderElement = elements.get(i);
|
||||||
|
if (loaderElement instanceof LoaderWait) {
|
||||||
|
((LoaderWait) loaderElement).setDelay(delay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void gui(SettingsSorting settingsSorting) {
|
public void gui(SettingsSorting settingsSorting) {
|
||||||
List<SWListInv.SWListEntry<LoaderElement>> list = new ArrayList<>();
|
List<SWListInv.SWListEntry<LoaderElement>> list = new ArrayList<>();
|
||||||
for (LoaderElement element : elements) {
|
AtomicBoolean allWait = new AtomicBoolean(true);
|
||||||
if (settingsSorting != null) {
|
Runnable updateRunnable = () -> {
|
||||||
if (settingsSorting == SettingsSorting.WAIT && !(element instanceof LoaderWait)) {
|
list.clear();
|
||||||
|
for (int i = 0; i < elements.size(); i++) {
|
||||||
|
LoaderElement previous = i > 0 ? elements.get(i - 1) : null;
|
||||||
|
LoaderElement current = elements.get(i);
|
||||||
|
LoaderElement next = i < elements.size() - 1 ? elements.get(i + 1) : null;
|
||||||
|
|
||||||
|
if (!settingsSorting.shouldShow(previous, current, next)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (settingsSorting == SettingsSorting.INTERACTIONS && (element instanceof LoaderWait || element instanceof LoaderTNT)) {
|
|
||||||
continue;
|
if ((!(current instanceof LoaderWait))) {
|
||||||
|
allWait.set(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SWItem item = current.menu(p);
|
||||||
|
if (current instanceof LoaderInteractionElement<?>) {
|
||||||
|
LoaderInteractionElement<?> interactionElement = (LoaderInteractionElement<?>) current;
|
||||||
|
List<String> lore = new ArrayList<>();
|
||||||
|
if (item.getItemMeta() != null && item.getItemMeta().getLore() != null) {
|
||||||
|
lore.addAll(item.getItemMeta().getLore());
|
||||||
|
lore.add("§8");
|
||||||
|
}
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("LOADER_SETTING_MODES", p, interactionElement.size()));
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", p));
|
||||||
|
item.setLore(lore);
|
||||||
|
} else {
|
||||||
|
List<String> lore = new ArrayList<>();
|
||||||
|
if (item.getItemMeta() != null && item.getItemMeta().getLore() != null) {
|
||||||
|
lore.addAll(item.getItemMeta().getLore());
|
||||||
|
lore.add("§8");
|
||||||
|
}
|
||||||
|
lore.add(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", p));
|
||||||
|
item.setLore(lore);
|
||||||
|
}
|
||||||
|
list.add(new SWListInv.SWListEntry<>(item, current));
|
||||||
}
|
}
|
||||||
SWItem item = element.menu(p);
|
if (list.isEmpty()) {
|
||||||
if (element instanceof LoaderInteractionElement<?>) {
|
allWait.set(false);
|
||||||
LoaderInteractionElement<?> interactionElement = (LoaderInteractionElement<?>) element;
|
|
||||||
item.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_MODES", p, interactionElement.size()), "§8", BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", p)));
|
|
||||||
} else {
|
|
||||||
item.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", p)));
|
|
||||||
}
|
}
|
||||||
list.add(new SWListInv.SWListEntry<>(item, element));
|
};
|
||||||
}
|
updateRunnable.run();
|
||||||
|
|
||||||
SWListInv<LoaderElement> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("LOADER_GUI_TITLE", p), false, list, (clickType, loaderElement) -> {});
|
SWListInv<LoaderElement> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("LOADER_GUI_TITLE", p), false, list, (clickType, loaderElement) -> {});
|
||||||
swListInv.setCallback((clickType, entry) -> entry.click(p, swListInv::open));
|
swListInv.setCallback((clickType, entry) -> entry.click(p, () -> {
|
||||||
|
updateRunnable.run();
|
||||||
|
swListInv.open();
|
||||||
|
}));
|
||||||
|
|
||||||
SWItem onlyInteractionsElements = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_INTERACTIONS", p), clickType -> {
|
SWItem settingItem = new SWItem(settingsSorting.getMaterial(), "§e" + BauSystem.MESSAGE.parse(settingsSorting.getName(), p), clickType -> {
|
||||||
gui(settingsSorting == SettingsSorting.INTERACTIONS ? null : SettingsSorting.INTERACTIONS);
|
if (clickType == ClickType.LEFT) {
|
||||||
|
int index = settingsSorting.ordinal() + 1;
|
||||||
|
if (index >= SettingsSorting.LENGTH) {
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
gui(SettingsSorting.values()[index]);
|
||||||
|
} else if (clickType == ClickType.RIGHT) {
|
||||||
|
int index = settingsSorting.ordinal() - 1;
|
||||||
|
if (index < 0) {
|
||||||
|
index = SettingsSorting.LENGTH - 1;
|
||||||
|
}
|
||||||
|
gui(SettingsSorting.values()[index]);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
if (settingsSorting == SettingsSorting.INTERACTIONS) onlyInteractionsElements.setEnchanted(true);
|
List<String> strings = new ArrayList<>();
|
||||||
swListInv.setItem(47, onlyInteractionsElements);
|
for (SettingsSorting setting : SettingsSorting.values()) {
|
||||||
|
if (setting == settingsSorting) {
|
||||||
SWItem onlyWaitElements = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS", p), clickType -> {
|
strings.add("§e> §7" + BauSystem.MESSAGE.parse(setting.getName(), p));
|
||||||
gui(settingsSorting == SettingsSorting.WAIT ? null : SettingsSorting.WAIT);
|
} else {
|
||||||
});
|
strings.add("§8> §7" + BauSystem.MESSAGE.parse(setting.getName(), p));
|
||||||
if (settingsSorting == SettingsSorting.WAIT) onlyWaitElements.setEnchanted(true);
|
}
|
||||||
swListInv.setItem(48, onlyWaitElements);
|
|
||||||
|
|
||||||
if (settingsSorting == SettingsSorting.WAIT) {
|
|
||||||
SWItem waitBetweenTNT = new SWItem(Material.TNT, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_SET_BETWEEN_TNT", p), clickType -> {
|
|
||||||
SWAnvilInv swAnvilInv = new SWAnvilInv(p, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_TITLE", p), "");
|
|
||||||
swAnvilInv.setCallback(s -> {
|
|
||||||
try {
|
|
||||||
long delay = Long.parseLong(s);
|
|
||||||
if (delay < 0) delay = 0;
|
|
||||||
for (int i = 1; i < elements.size() - 1; i++) {
|
|
||||||
if (!(elements.get(i - 1) instanceof LoaderTNT)) continue;
|
|
||||||
if (!(elements.get(i + 1) instanceof LoaderTNT)) continue;
|
|
||||||
if (!(elements.get(i) instanceof LoaderWait)) continue;
|
|
||||||
((LoaderWait) elements.get(i)).setDelay(delay);
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException ignored) {
|
|
||||||
}
|
|
||||||
gui(settingsSorting);
|
|
||||||
});
|
|
||||||
swAnvilInv.open();
|
|
||||||
});
|
|
||||||
swListInv.setItem(50, waitBetweenTNT);
|
|
||||||
|
|
||||||
SWItem waitTime = new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_SET_ALL", p), clickType -> {
|
|
||||||
SWAnvilInv swAnvilInv = new SWAnvilInv(p, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_TITLE", p), "");
|
|
||||||
swAnvilInv.setCallback(s -> {
|
|
||||||
try {
|
|
||||||
long delay = Long.parseLong(s);
|
|
||||||
if (delay < 0) delay = 0;
|
|
||||||
long finalDelay = delay;
|
|
||||||
elements.stream()
|
|
||||||
.filter(LoaderWait.class::isInstance)
|
|
||||||
.map(LoaderWait.class::cast)
|
|
||||||
.forEach(loaderWait -> loaderWait.setDelay(finalDelay));
|
|
||||||
} catch (NumberFormatException ignored) {
|
|
||||||
}
|
|
||||||
gui(settingsSorting);
|
|
||||||
});
|
|
||||||
swAnvilInv.open();
|
|
||||||
});
|
|
||||||
swListInv.setItem(51, waitTime);
|
|
||||||
} else {
|
|
||||||
SWItem empty = new SWItem(Material.STRUCTURE_VOID, "§7", clickType -> {});
|
|
||||||
swListInv.setItem(50, empty);
|
|
||||||
swListInv.setItem(51, empty);
|
|
||||||
}
|
}
|
||||||
|
settingItem.setLore(strings);
|
||||||
|
swListInv.setItem(48, settingItem);
|
||||||
|
|
||||||
|
if (allWait.get()) {
|
||||||
|
SWItem setWait = new SWItem(Material.PAPER, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_SET_ALL", p), clickType -> {
|
||||||
|
SWAnvilInv swAnvilInv = new SWAnvilInv(p, BauSystem.MESSAGE.parse("LOADER_GUI_SHOW_WAITS_TITLE", p), "");
|
||||||
|
swAnvilInv.setCallback(s -> {
|
||||||
|
try {
|
||||||
|
long delay = Math.max(Long.parseLong(s), 0);
|
||||||
|
list.forEach(loaderElementSWListEntry -> {
|
||||||
|
((LoaderWait) loaderElementSWListEntry.getObject()).setDelay(delay);
|
||||||
|
});
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
}
|
||||||
|
gui(settingsSorting);
|
||||||
|
});
|
||||||
|
swAnvilInv.open();
|
||||||
|
});
|
||||||
|
swListInv.setItem(50, setWait);
|
||||||
|
} else {
|
||||||
|
swListInv.setItem(50, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§8"));
|
||||||
|
}
|
||||||
swListInv.open();
|
swListInv.open();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,18 +273,104 @@ public class Loader implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getProgress() {
|
public String getProgress() {
|
||||||
return (currentElement + 1) + "§8/§7" + elements.size();
|
return Math.max(currentElement, 1) + "§8/§7" + elements.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum SettingsSorting {
|
public enum SettingsSorting {
|
||||||
WAIT,
|
ALL {
|
||||||
INTERACTIONS,
|
@Override
|
||||||
|
public Material getMaterial() {
|
||||||
|
return Material.STRUCTURE_VOID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "LOADER_GUI_SHOW_ALL";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
WAIT {
|
||||||
|
@Override
|
||||||
|
public Material getMaterial() {
|
||||||
|
return Material.CLOCK;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "LOADER_GUI_SHOW_WAITS";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||||
|
return current instanceof LoaderWait;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
WAIT_BETWEEN_TNT {
|
||||||
|
@Override
|
||||||
|
public Material getMaterial() {
|
||||||
|
return Material.REDSTONE_BLOCK;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "LOADER_GUI_SHOW_WAITS_BETWEEN_TNT";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||||
|
return previous instanceof LoaderTNT && current instanceof LoaderWait && next instanceof LoaderTNT;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
INTERACTIONS {
|
||||||
|
@Override
|
||||||
|
public Material getMaterial() {
|
||||||
|
return Material.REPEATER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "LOADER_GUI_SHOW_INTERACTIONS";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||||
|
return current instanceof LoaderInteractionElement && !(current instanceof LoaderTNT);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
TNT {
|
||||||
|
@Override
|
||||||
|
public Material getMaterial() {
|
||||||
|
return Material.TNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "LOADER_GUI_SHOW_TNT";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next) {
|
||||||
|
return current instanceof LoaderTNT;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
;
|
||||||
|
|
||||||
|
public static int LENGTH = SettingsSorting.values().length;
|
||||||
|
|
||||||
|
public abstract Material getMaterial();
|
||||||
|
public abstract String getName();
|
||||||
|
public abstract boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next);
|
||||||
}
|
}
|
||||||
|
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum Stage implements EnumDisplay {
|
public enum Stage implements EnumDisplay {
|
||||||
SETUP("LOADER_SETUP"),
|
SETUP("LOADER_SETUP"),
|
||||||
RUNNING("LOADER_RUNNING"),
|
RUNNING("LOADER_RUNNING"),
|
||||||
|
SINGLE("LOADER_SINGLE"),
|
||||||
PAUSE("LOADER_PAUSE"),
|
PAUSE("LOADER_PAUSE"),
|
||||||
END("LOADER_END");
|
END("LOADER_END");
|
||||||
|
|
||||||
|
@ -20,14 +20,15 @@
|
|||||||
package de.steamwar.bausystem.features.loader;
|
package de.steamwar.bausystem.features.loader;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
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.SWCommand;
|
||||||
import de.steamwar.command.TypeValidator;
|
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
@Linked
|
@Linked
|
||||||
public class LoaderCommand extends SWCommand {
|
public class LoaderCommand extends SWCommand implements Listener {
|
||||||
|
|
||||||
public LoaderCommand() {
|
public LoaderCommand() {
|
||||||
super("loader");
|
super("loader");
|
||||||
@ -80,13 +81,42 @@ public class LoaderCommand extends SWCommand {
|
|||||||
public void guiLoader(@Validator Player player) {
|
public void guiLoader(@Validator Player player) {
|
||||||
Loader loader = Loader.getLoader(player);
|
Loader loader = Loader.getLoader(player);
|
||||||
if (loaderNullCheck(loader, player)) return;
|
if (loaderNullCheck(loader, player)) return;
|
||||||
loader.gui(null);
|
loader.gui(Loader.SettingsSorting.ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ClassValidator(value = Player.class, local = true)
|
@Register(value = "wait", description = "LOADER_HELP_WAIT")
|
||||||
public TypeValidator<Player> loaderValidator() {
|
public void shotDelayLoader(@Validator Player p, @Min(intValue = 1) @ErrorMessage("LOADER_SMALL_TIME") int delay) {
|
||||||
return (commandSender, player, messageSender) -> {
|
Loader loader = Loader.getLoader(p);
|
||||||
return !messageSender.send(!Permission.hasPermission(player, Permission.WORLD), "LOADER_PERMS");
|
if (loaderNullCheck(loader, p)) return;
|
||||||
};
|
if (loader.setTicksBetweenShots(delay)) {
|
||||||
|
BauSystem.MESSAGE.send("LOADER_NEW_TIME", p, delay);
|
||||||
|
} else {
|
||||||
|
BauSystem.MESSAGE.send("LOADER_SMALL_TIME", p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Register(value = "speed", description = "LOADER_HELP_SPEED")
|
||||||
|
public void speedLoader(@Validator Player p, @Min(intValue = 0) @ErrorMessage("LOADER_SMALL_TIME") int delay) {
|
||||||
|
Loader loader = Loader.getLoader(p);
|
||||||
|
if (loaderNullCheck(loader, p)) return;
|
||||||
|
BauSystem.MESSAGE.send("LOADER_NEW_LOAD_TIME", p, delay);
|
||||||
|
loader.setTicksBetweenBlocks(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Register(value = "single", description = "LOADER_HELP_SINGLE")
|
||||||
|
public void singleLoader(@Validator Player p) {
|
||||||
|
Loader loader = Loader.getLoader(p);
|
||||||
|
if (loaderNullCheck(loader, p)) return;
|
||||||
|
loader.single();
|
||||||
|
BauSystem.MESSAGE.send("LOADER_SINGLE_CMD", p);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||||
|
event.getNewSpectator().forEach(player -> {
|
||||||
|
Loader loader = Loader.getLoader(player);
|
||||||
|
if (loader == null) return;
|
||||||
|
loader.stop();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ package de.steamwar.bausystem.features.loader;
|
|||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.SWUtils;
|
import de.steamwar.bausystem.SWUtils;
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderElement;
|
||||||
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.bausystem.features.loader.elements.impl.*;
|
import de.steamwar.bausystem.features.loader.elements.impl.*;
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -33,6 +34,7 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
@ -41,6 +43,8 @@ import org.bukkit.inventory.EquipmentSlot;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderRecorder implements Listener {
|
public class LoaderRecorder implements Listener {
|
||||||
|
|
||||||
@ -70,7 +74,7 @@ public class LoaderRecorder implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
long diff = TPSUtils.currentRealTick.get() - lastInteraction;
|
long diff = TPSUtils.currentRealTick.get() - lastInteraction;
|
||||||
if (last && diff > 160) diff = 160;
|
if (last) diff = 120;
|
||||||
lastInteraction = TPSUtils.currentRealTick.get();
|
lastInteraction = TPSUtils.currentRealTick.get();
|
||||||
loaderElementList.add(new LoaderWait(diff));
|
loaderElementList.add(new LoaderWait(diff));
|
||||||
}
|
}
|
||||||
@ -86,7 +90,34 @@ public class LoaderRecorder implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerInteractEntity(PlayerInteractEvent event) {
|
public void onBlockBreak(BlockBreakEvent event) {
|
||||||
|
if (event.getPlayer() != player) return;
|
||||||
|
|
||||||
|
boolean removedOne = false;
|
||||||
|
for (int i = 0; i < loaderElementList.size(); i++) {
|
||||||
|
LoaderElement element = loaderElementList.get(i);
|
||||||
|
if (!(element instanceof LoaderInteractionElement)) continue;
|
||||||
|
LoaderInteractionElement interactionElement = (LoaderInteractionElement) element;
|
||||||
|
if (interactionElement.getLocation().equals(event.getBlock().getLocation())) {
|
||||||
|
loaderElementList.remove(i);
|
||||||
|
if (i > 0) {
|
||||||
|
loaderElementList.remove(i - 1);
|
||||||
|
}
|
||||||
|
removedOne = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (removedOne) {
|
||||||
|
if (event.getBlock().getType() != Material.TNT) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("LOADER_MESSAGE_UNINTERACT", player));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
if (event.getPlayer() != player) return;
|
if (event.getPlayer() != player) return;
|
||||||
if (player.isSneaking()) return;
|
if (player.isSneaking()) return;
|
||||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.PHYSICAL) return;
|
if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.PHYSICAL) return;
|
||||||
@ -95,53 +126,10 @@ public class LoaderRecorder implements Listener {
|
|||||||
|
|
||||||
addWaitTime(false);
|
addWaitTime(false);
|
||||||
Block block = event.getClickedBlock();
|
Block block = event.getClickedBlock();
|
||||||
Material type = block.getType();
|
getLoaderInteractionElement(block, (loaderInteractionElement, s) -> {
|
||||||
switch (type) {
|
loaderElementList.add(loaderInteractionElement);
|
||||||
case COMPARATOR:
|
message(s);
|
||||||
loaderElementList.add(new LoaderComparator(block.getLocation()));
|
});
|
||||||
message("LOADER_BUTTON_COMPARATOR");
|
|
||||||
break;
|
|
||||||
case REPEATER:
|
|
||||||
loaderElementList.add(new LoaderRepeater(block.getLocation()));
|
|
||||||
message("LOADER_BUTTON_REPEATER");
|
|
||||||
break;
|
|
||||||
case NOTE_BLOCK:
|
|
||||||
loaderElementList.add(new LoaderNoteBlock(block.getLocation()));
|
|
||||||
message("LOADER_BUTTON_NOTEBLOCK");
|
|
||||||
break;
|
|
||||||
case LEVER:
|
|
||||||
loaderElementList.add(new LoaderLever(block.getLocation()));
|
|
||||||
message("LOADER_BUTTON_SWITCH");
|
|
||||||
break;
|
|
||||||
case DAYLIGHT_DETECTOR:
|
|
||||||
loaderElementList.add(new LoaderDaylightDetector(block.getLocation()));
|
|
||||||
message("LOADER_BUTTON_DAYLIGHT_DETECTOR");
|
|
||||||
break;
|
|
||||||
case LECTERN:
|
|
||||||
loaderElementList.add(new LoaderLectern(block.getLocation()));
|
|
||||||
message("LOADER_BUTTON_LECTERN");
|
|
||||||
break;
|
|
||||||
case IRON_TRAPDOOR:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (type.name().endsWith("_TRAPDOOR")) {
|
|
||||||
loaderElementList.add(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_TRAPDOOR", type));
|
|
||||||
message("LOADER_BUTTON_TRAPDOOR");
|
|
||||||
} else if (type.name().endsWith("_DOOR")) {
|
|
||||||
loaderElementList.add(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_DOOR", type));
|
|
||||||
message("LOADER_BUTTON_DOOR");
|
|
||||||
} else if (type.name().endsWith("FENCE_GATE")) {
|
|
||||||
loaderElementList.add(new LoaderOpenable(block.getLocation(), "LOADER_BUTTON_FENCEGATE", type));
|
|
||||||
message("LOADER_BUTTON_FENCEGATE");
|
|
||||||
} else if (type.name().endsWith("STONE_BUTTON")) {
|
|
||||||
loaderElementList.add(new LoaderTicks(block.getLocation(), "LOADER_BUTTON_STONE_BUTTON", type, 20));
|
|
||||||
message("LOADER_BUTTON_STONE_BUTTON");
|
|
||||||
} else if (type.name().endsWith("BUTTON")) {
|
|
||||||
loaderElementList.add(new LoaderTicks(block.getLocation(), "LOADER_BUTTON_WOOD_BUTTON", type, 30));
|
|
||||||
message("LOADER_BUTTON_WOOD_BUTTON");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<Location, Long> blockSet = new HashMap<>();
|
private Map<Location, Long> blockSet = new HashMap<>();
|
||||||
@ -197,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) {
|
private void message(String type) {
|
||||||
SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("LOADER_MESSAGE_INTERACT", player, BauSystem.MESSAGE.parse(type, player), loaderElementList.size()));
|
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;
|
package de.steamwar.bausystem.features.loader;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.utils.ScoreboardElement;
|
import de.steamwar.bausystem.utils.ScoreboardElement;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
@ -40,6 +41,7 @@ public class LoaderScoreboardElement implements ScoreboardElement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String get(Region region, Player p) {
|
public String get(Region region, Player p) {
|
||||||
|
if(!Permission.BUILD.hasPermission(p)) return null;
|
||||||
Loader loader = Loader.getLoader(p);
|
Loader loader = Loader.getLoader(p);
|
||||||
if (loader == null) return null;
|
if (loader == null) return null;
|
||||||
if (loader.getStage() == Loader.Stage.RUNNING) {
|
if (loader.getStage() == Loader.Stage.RUNNING) {
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2023 SteamWar.de-Serverteam
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.steamwar.bausystem.features.loader.elements;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
public interface ElementSettings {
|
|
||||||
SWItem menu(Player player);
|
|
||||||
void execute(Consumer<Long> delay);
|
|
||||||
void click(Player player, Runnable backAction, Runnable deleteAction);
|
|
||||||
|
|
||||||
default void playerInteract() {}
|
|
||||||
|
|
||||||
default String translateItemName(String name, String mode, Player player, Object... args) {
|
|
||||||
return BauSystem.MESSAGE.parse("LOADER_GUI_ITEM_NAME", player, BauSystem.MESSAGE.parse(name, player), BauSystem.MESSAGE.parse(mode, player, args));
|
|
||||||
}
|
|
||||||
}
|
|
@ -20,56 +20,94 @@
|
|||||||
package de.steamwar.bausystem.features.loader.elements;
|
package de.steamwar.bausystem.features.loader.elements;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.inventory.SWAnvilInv;
|
||||||
|
import de.steamwar.inventory.SWInventory;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import de.steamwar.inventory.SWListInv;
|
import de.steamwar.inventory.SWListInv;
|
||||||
|
import lombok.Getter;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.*;
|
||||||
import org.bukkit.block.data.FaceAttachable;
|
import org.bukkit.block.data.type.Door;
|
||||||
import org.bukkit.block.data.type.Switch;
|
import org.bukkit.block.data.type.Switch;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public abstract class LoaderInteractionElement<T extends ElementSettings> implements LoaderElement {
|
public abstract class LoaderInteractionElement<T extends Enum<T> & LoaderSettingsEnum> implements LoaderElement {
|
||||||
|
|
||||||
|
@Getter
|
||||||
protected final Location location;
|
protected final Location location;
|
||||||
protected int currentShot = 0;
|
protected int currentShot = 0;
|
||||||
|
protected T defaultSetting;
|
||||||
|
protected T newSetting;
|
||||||
|
protected T[] allSettings;
|
||||||
protected List<T> elements = new ArrayList<>();
|
protected List<T> elements = new ArrayList<>();
|
||||||
|
protected List<Integer> extraPower = new ArrayList<>();
|
||||||
|
protected List<Long> extraTicks = new ArrayList<>();
|
||||||
|
protected int settingsGuiSize = 0;
|
||||||
|
|
||||||
protected LoaderInteractionElement(Location location) {
|
protected LoaderInteractionElement(Location location, T defaultSetting, T newSetting, T[] allSettings) {
|
||||||
this.location = location;
|
this.location = location;
|
||||||
|
|
||||||
T element = createNewElement();
|
this.defaultSetting = defaultSetting;
|
||||||
element.playerInteract();
|
this.newSetting = newSetting;
|
||||||
elements.add(element);
|
this.allSettings = allSettings;
|
||||||
|
|
||||||
|
elements.add(defaultSetting);
|
||||||
|
extraPower.add(0);
|
||||||
|
extraTicks.add(0L);
|
||||||
|
|
||||||
|
for (T element : allSettings) {
|
||||||
|
settingsGuiSize = Math.max(element.getPos(), settingsGuiSize);
|
||||||
|
}
|
||||||
|
while (settingsGuiSize % 9 != 0) settingsGuiSize++;
|
||||||
|
settingsGuiSize += 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Consumer<Long> delay) {
|
public void execute(Consumer<Long> delay) {
|
||||||
if (currentShot >= elements.size()) currentShot = 0;
|
if (currentShot >= elements.size()) currentShot = 0;
|
||||||
elements.get(currentShot).execute(delay);
|
if (checkBlockInWorld()) {
|
||||||
|
BlockData blockData = location.getBlock().getBlockData();
|
||||||
|
elements.get(currentShot).execute(location, blockData, this, extraPower.get(currentShot), extraTicks.get(currentShot), delay);
|
||||||
|
}
|
||||||
currentShot++;
|
currentShot++;
|
||||||
if (currentShot >= elements.size()) currentShot = 0;
|
if (currentShot >= elements.size()) currentShot = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click(Player player, Runnable backAction) {
|
public void click(Player player, Runnable backAction) {
|
||||||
List<SWListInv.SWListEntry<T>> entries = new ArrayList<>();
|
List<SWListInv.SWListEntry<Integer>> entries = new ArrayList<>();
|
||||||
for (T element : elements) {
|
Runnable updateRunnable = () -> {
|
||||||
entries.add(new SWListInv.SWListEntry<>(element.menu(player), element));
|
entries.clear();
|
||||||
}
|
for (int i = 0; i < elements.size(); i++) {
|
||||||
|
SWItem swItem = elements.get(i).menu(player, this, extraPower.get(i), extraTicks.get(i));
|
||||||
|
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
||||||
|
entries.add(new SWListInv.SWListEntry<>(swItem, i));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
updateRunnable.run();
|
||||||
|
|
||||||
SWListInv<T> listInv = new SWListInv<>(player, "Interaction Settings", false, entries, (clickType, entry) -> {
|
SWListInv<Integer> listInv = new SWListInv<>(player, "Interaction Settings", false, entries, (clickType, entry) -> {});
|
||||||
entry.click(player, () -> {
|
listInv.setCallback((clickType, entry) -> {
|
||||||
click(player, backAction);
|
openIndividualSettingsMenu(player, entry, () -> {
|
||||||
|
updateRunnable.run();
|
||||||
|
listInv.open();
|
||||||
}, () -> {
|
}, () -> {
|
||||||
if (elements.size() == 1) return;
|
elements.remove((int) entry);
|
||||||
elements.remove(entry);
|
extraPower.remove((int) entry);
|
||||||
|
extraTicks.remove((int) entry);
|
||||||
|
if (elements.isEmpty()) {
|
||||||
|
elements.add(newSetting);
|
||||||
|
extraPower.add(0);
|
||||||
|
extraTicks.add(1L);
|
||||||
|
}
|
||||||
click(player, backAction);
|
click(player, backAction);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -77,48 +115,190 @@ public abstract class LoaderInteractionElement<T extends ElementSettings> implem
|
|||||||
backAction.run();
|
backAction.run();
|
||||||
}));
|
}));
|
||||||
listInv.setItem(50, new SWItem(Material.GHAST_SPAWN_EGG, "§7Insert another Setting", clickType -> {
|
listInv.setItem(50, new SWItem(Material.GHAST_SPAWN_EGG, "§7Insert another Setting", clickType -> {
|
||||||
T element = createNewElement();
|
elements.add(defaultSetting);
|
||||||
elements.add(element);
|
extraPower.add(0);
|
||||||
element.click(player, () -> click(player, backAction), () -> {
|
extraTicks.add(1L);
|
||||||
if (elements.size() == 1) return;
|
openIndividualSettingsMenu(player, elements.size() - 1, () -> {
|
||||||
elements.remove(element);
|
updateRunnable.run();
|
||||||
|
listInv.open();
|
||||||
|
}, () -> {
|
||||||
|
elements.remove(elements.size() - 1);
|
||||||
|
extraPower.remove(extraPower.size() - 1);
|
||||||
|
extraTicks.remove(extraTicks.size() - 1);
|
||||||
|
if (elements.isEmpty()) {
|
||||||
|
elements.add(newSetting);
|
||||||
|
extraPower.add(0);
|
||||||
|
extraTicks.add(1L);
|
||||||
|
}
|
||||||
click(player, backAction);
|
click(player, backAction);
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
listInv.open();
|
listInv.open();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void openIndividualSettingsMenu(Player player, int index, Runnable back, Runnable delete) {
|
||||||
|
T currentElement = elements.get(index);
|
||||||
|
int guiSize = settingsGuiSize;
|
||||||
|
int powerStart = guiSize - 9;
|
||||||
|
if (currentElement.hasPower(this)) {
|
||||||
|
guiSize += 18;
|
||||||
|
}
|
||||||
|
int ticksStart = guiSize - 9;
|
||||||
|
if (currentElement.hasTicks(this)) {
|
||||||
|
guiSize += 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
SWInventory swInventory = new SWInventory(player, guiSize, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
||||||
|
for (int i = guiSize - 9; i < guiSize; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7", clickType -> {}));
|
||||||
|
swInventory.setItem(guiSize - 9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> back.run());
|
||||||
|
swInventory.setItem(guiSize - 5, new SWItem(Material.WOODEN_AXE, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_COPY", player)).getItemStack(), clickType -> {
|
||||||
|
SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("LOADER_GUI_COPY_TITLE", player), "1");
|
||||||
|
swAnvilInv.setCallback(s -> {
|
||||||
|
try {
|
||||||
|
int count = Integer.parseInt(s);
|
||||||
|
if (count < 1) count = 1;
|
||||||
|
if (count > 65536) count = 65536;
|
||||||
|
|
||||||
|
int power = extraPower.get(index);
|
||||||
|
long ticks = extraTicks.get(index);
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
elements.add(currentElement);
|
||||||
|
extraPower.add(power);
|
||||||
|
extraTicks.add(ticks);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 1) {
|
||||||
|
openIndividualSettingsMenu(player, elements.size() - 1, back, delete);
|
||||||
|
} else {
|
||||||
|
back.run();
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
back.run();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
swAnvilInv.open();
|
||||||
|
});
|
||||||
|
swInventory.setItem(guiSize - 1, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> delete.run());
|
||||||
|
|
||||||
|
for (T element : allSettings) {
|
||||||
|
SWItem item = element.menu(player, this, extraPower.get(index), extraTicks.get(index));
|
||||||
|
if (element == currentElement) {
|
||||||
|
item.setEnchanted(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
swInventory.setItem(element.getPos(), item.getItemStack(), clickType -> {
|
||||||
|
elements.set(index, element);
|
||||||
|
openIndividualSettingsMenu(player, index, back, delete);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentElement.hasPower(this)) {
|
||||||
|
for (int power = 0; power < 16; power++) {
|
||||||
|
int finalPowerPosition = power;
|
||||||
|
if (power >= 9) finalPowerPosition++;
|
||||||
|
SWItem powerItem = new SWItem(Material.REDSTONE, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, power), Arrays.asList(), false, clickType -> {});
|
||||||
|
powerItem.getItemStack().setAmount(Math.max(power, 1));
|
||||||
|
if (extraPower.get(index) == power) powerItem.setEnchanted(true);
|
||||||
|
|
||||||
|
int finalPower = power;
|
||||||
|
swInventory.setItem(finalPowerPosition + powerStart, powerItem.getItemStack(), clickType -> {
|
||||||
|
extraPower.set(index, finalPower);
|
||||||
|
openIndividualSettingsMenu(player, index, back, delete);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentElement.hasTicks(this)) {
|
||||||
|
swInventory.setItem(ticksStart + 3, new SWItem(SWItem.getDye(1), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> {
|
||||||
|
long ticks = extraTicks.get(index);
|
||||||
|
ticks -= clickType.isShiftClick() ? 5 : 1;
|
||||||
|
if (ticks < 1) ticks = 1;
|
||||||
|
extraTicks.set(index, ticks);
|
||||||
|
openIndividualSettingsMenu(player, index, back, delete);
|
||||||
|
});
|
||||||
|
|
||||||
|
SWItem ticksItem = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS", player, extraTicks.get(index)), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)), false, clickType -> {});
|
||||||
|
ticksItem.getItemStack().setAmount((int) Math.min(extraTicks.get(index), 64));
|
||||||
|
swInventory.setItem(ticksStart + 4, ticksItem.getItemStack(), clickType -> {
|
||||||
|
SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_NAME", player), extraTicks.get(index) + "");
|
||||||
|
swAnvilInv.setCallback(s -> {
|
||||||
|
try {
|
||||||
|
long ticks = Long.parseLong(s);
|
||||||
|
if (ticks < 1) ticks = 1;
|
||||||
|
extraTicks.set(index, ticks);
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
}
|
||||||
|
openIndividualSettingsMenu(player, index, back, delete);
|
||||||
|
});
|
||||||
|
swAnvilInv.open();
|
||||||
|
});
|
||||||
|
|
||||||
|
swInventory.setItem(ticksStart + 5, new SWItem(SWItem.getDye(10), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> {
|
||||||
|
long ticks = extraTicks.get(index);
|
||||||
|
ticks += clickType.isShiftClick() ? 5 : 1;
|
||||||
|
extraTicks.set(index, ticks);
|
||||||
|
openIndividualSettingsMenu(player, index, back, delete);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
swInventory.open();
|
||||||
|
}
|
||||||
|
|
||||||
protected void update(BlockData blockData) {
|
protected void update(BlockData blockData) {
|
||||||
Material material = blockData.getMaterial();
|
|
||||||
Block block = location.getBlock();
|
Block block = location.getBlock();
|
||||||
if (blockData instanceof Switch) {
|
if (blockData instanceof Door) {
|
||||||
|
Door door = (Door) blockData;
|
||||||
|
block.setBlockData(door);
|
||||||
|
if (door.getHalf() == Bisected.Half.BOTTOM) {
|
||||||
|
updateBlock(block.getRelative(BlockFace.UP), door.isOpen() ? 15 : 0);
|
||||||
|
} else {
|
||||||
|
updateBlock(block.getRelative(BlockFace.DOWN), door.isOpen() ? 15 : 0);
|
||||||
|
}
|
||||||
|
} else if (blockData instanceof Switch) {
|
||||||
Switch sw = (Switch) blockData;
|
Switch sw = (Switch) blockData;
|
||||||
updateBlock(block, sw);
|
updateBlock(block, sw);
|
||||||
FaceAttachable.AttachedFace face = sw.getAttachedFace();
|
FaceAttachable.AttachedFace face = sw.getAttachedFace();
|
||||||
if (face == FaceAttachable.AttachedFace.FLOOR) {
|
if (face == FaceAttachable.AttachedFace.FLOOR) {
|
||||||
updateBlock(block.getRelative(BlockFace.DOWN));
|
updateBlock(block.getRelative(BlockFace.DOWN), sw.isPowered() ? 15 : 0);
|
||||||
} else if (face == FaceAttachable.AttachedFace.CEILING) {
|
} else if (face == FaceAttachable.AttachedFace.CEILING) {
|
||||||
updateBlock(block.getRelative(BlockFace.UP));
|
updateBlock(block.getRelative(BlockFace.UP), sw.isPowered() ? 15 : 0);
|
||||||
} else {
|
} else {
|
||||||
updateBlock(block.getRelative(sw.getFacing().getOppositeFace()));
|
updateBlock(block.getRelative(sw.getFacing().getOppositeFace()), sw.isPowered() ? 15 : 0);
|
||||||
}
|
}
|
||||||
} else if (material == Material.TRIPWIRE) {
|
} else if (blockData instanceof Powerable) {
|
||||||
|
updateBlock(block, blockData);
|
||||||
|
updateBlock(block.getRelative(BlockFace.DOWN), ((Powerable) blockData).isPowered() ? 15 : 0);
|
||||||
|
} else if (blockData instanceof AnaloguePowerable) {
|
||||||
|
updateBlock(block, blockData);
|
||||||
|
updateBlock(block.getRelative(BlockFace.DOWN), ((AnaloguePowerable) blockData).getPower());
|
||||||
|
} else {
|
||||||
updateBlock(block, blockData);
|
updateBlock(block, blockData);
|
||||||
} else if (material.name().endsWith("_PLATE")) {
|
|
||||||
updateBlock(block.getRelative(BlockFace.DOWN));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateBlock(Block block) {
|
private void updateBlock(Block block, int powered) {
|
||||||
updateBlock(block, block.getBlockData());
|
BlockData data = block.getBlockData();
|
||||||
|
if (data instanceof Door) {
|
||||||
|
Door door = (Door) data;
|
||||||
|
door.setOpen(powered > 0);
|
||||||
|
block.setBlockData(door);
|
||||||
|
return;
|
||||||
|
} else if (data instanceof Powerable) {
|
||||||
|
Powerable powerable = (Powerable) data;
|
||||||
|
powerable.setPowered(powered > 0);
|
||||||
|
} else if (data instanceof AnaloguePowerable) {
|
||||||
|
AnaloguePowerable analoguePowerable = (AnaloguePowerable) data;
|
||||||
|
analoguePowerable.setPower(powered);
|
||||||
|
}
|
||||||
|
updateBlock(block, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateBlock(Block block, BlockData data) {
|
private void updateBlock(Block block, BlockData data) {
|
||||||
block.setType(Material.BARRIER, true);
|
block.setType(Material.BARRIER);
|
||||||
block.setBlockData(data, true);
|
block.setBlockData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract T createNewElement();
|
public abstract boolean checkBlockInWorld();
|
||||||
|
|
||||||
protected final String translateItemName(String name, Player player) {
|
protected final String translateItemName(String name, Player player) {
|
||||||
return BauSystem.MESSAGE.parse("LOADER_SETTING_NAME", player, BauSystem.MESSAGE.parse(name, player));
|
return BauSystem.MESSAGE.parse("LOADER_SETTING_NAME", player, BauSystem.MESSAGE.parse(name, player));
|
||||||
|
@ -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.loader.elements;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.inventory.SWItem;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public interface LoaderSettingsEnum<T, P extends LoaderInteractionElement<E>, E extends Enum<E> & LoaderSettingsEnum<T, P, E>> {
|
||||||
|
int getPos();
|
||||||
|
SWItem menu(Player player, P parent, int power, long ticks);
|
||||||
|
default boolean hasPower(P parent) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
default boolean hasTicks(P parent) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void execute(Location location, T blockData, P parent, int power, long ticks, Consumer<Long> delay);
|
||||||
|
|
||||||
|
default String translateItemName(String name, String mode, Player player, Object... args) {
|
||||||
|
return BauSystem.MESSAGE.parse("LOADER_GUI_ITEM_NAME", player, BauSystem.MESSAGE.parse(name, player), BauSystem.MESSAGE.parse(mode, player, args));
|
||||||
|
}
|
||||||
|
}
|
@ -19,10 +19,8 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -30,95 +28,83 @@ import org.bukkit.block.data.type.Comparator;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderComparator extends LoaderInteractionElement<LoaderComparator.ComparatorSettings> {
|
public class LoaderComparator extends LoaderInteractionElement<LoaderComparator.ComparatorSettingsEnum> {
|
||||||
|
|
||||||
public LoaderComparator(Location location) {
|
public LoaderComparator(Location location) {
|
||||||
super(location);
|
super(location, ComparatorSettingsEnum.INTERACT, ComparatorSettingsEnum.NOOP, ComparatorSettingsEnum.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ComparatorSettings implements ElementSettings {
|
public enum ComparatorSettingsEnum implements LoaderSettingsEnum<Comparator, LoaderComparator, ComparatorSettingsEnum> {
|
||||||
|
NOOP {
|
||||||
private boolean interact = false;
|
@Override
|
||||||
private Comparator.Mode mode = Comparator.Mode.COMPARE;
|
public int getPos() {
|
||||||
|
return 2;
|
||||||
@Override
|
|
||||||
public SWItem menu(Player player) {
|
|
||||||
return menu(player, interact, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean interact, Comparator.Mode mode) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (interact) {
|
|
||||||
swItem = new SWItem(Material.STICK, "§7Comparator§8: §eInteract");
|
|
||||||
} else if (mode == null) {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, "§7Comparator§8: §eNOOP");
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(Material.COMPARATOR, "§7Comparator§8: §e" + mode.name());
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Consumer<Long> delay) {
|
public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) {
|
||||||
if (location.getBlock().getType() != Material.COMPARATOR) return;
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_COMPARATOR", "LOADER_INTERACTION_NOOP", player));
|
||||||
Comparator comparator = (Comparator) location.getBlock().getBlockData();
|
|
||||||
if (interact) {
|
|
||||||
comparator.setMode(comparator.getMode() == Comparator.Mode.COMPARE ? Comparator.Mode.SUBTRACT : Comparator.Mode.COMPARE);
|
|
||||||
} else if (mode == null) {
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
comparator.setMode(mode);
|
|
||||||
}
|
}
|
||||||
location.getBlock().setBlockData(comparator, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
|
||||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
|
||||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
|
||||||
|
|
||||||
swInventory.setItem(2, item(player, false, null).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
mode = null;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(3, item(player, true, null).getItemStack(), clickType -> {
|
|
||||||
interact = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(5, item(player, false, Comparator.Mode.COMPARE).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
mode = Comparator.Mode.COMPARE;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(6, item(player, false, Comparator.Mode.SUBTRACT).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
mode = Comparator.Mode.SUBTRACT;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
|
|
||||||
swInventory.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem item(Player player, boolean interact, Comparator.Mode mode) {
|
|
||||||
SWItem swItem = menu(player, interact, mode);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.interact, this.mode).getItemStack())) {
|
|
||||||
swItem.setEnchanted(true);
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
},
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
INTERACT {
|
||||||
public void playerInteract() {
|
@Override
|
||||||
interact = true;
|
public int getPos() {
|
||||||
mode = null;
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_COMPARATOR", "LOADER_INTERACTION_INTERACT", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setMode(blockData.getMode() == Comparator.Mode.COMPARE ? Comparator.Mode.SUBTRACT : Comparator.Mode.COMPARE);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
COMPARE {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.COMPARATOR, translateItemName("LOADER_BUTTON_COMPARATOR", "LOADER_INTERACTION_COMPARE", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setMode(Comparator.Mode.COMPARE);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
SUBTRACT {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderComparator parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.COMPARATOR, translateItemName("LOADER_BUTTON_COMPARATOR", "LOADER_INTERACTION_SUBTRACT", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Comparator blockData, LoaderComparator parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setMode(Comparator.Mode.SUBTRACT);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +116,7 @@ public class LoaderComparator extends LoaderInteractionElement<LoaderComparator.
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ComparatorSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new ComparatorSettings();
|
return location.getBlock().getType() == Material.COMPARATOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,130 +19,98 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.type.DaylightDetector;
|
import org.bukkit.block.data.type.DaylightDetector;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderDaylightDetector extends LoaderInteractionElement<LoaderDaylightDetector.DaylightDetectorSettings> {
|
public class LoaderDaylightDetector extends LoaderInteractionElement<LoaderDaylightDetector.DaylightSettingsEnum> {
|
||||||
|
|
||||||
public LoaderDaylightDetector(Location location) {
|
public LoaderDaylightDetector(Location location) {
|
||||||
super(location);
|
super(location, DaylightSettingsEnum.INTERACT, DaylightSettingsEnum.NOOP, DaylightSettingsEnum.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DaylightDetectorSettings implements ElementSettings {
|
public enum DaylightSettingsEnum implements LoaderSettingsEnum<DaylightDetector, LoaderDaylightDetector, DaylightSettingsEnum> {
|
||||||
|
NOOP {
|
||||||
private boolean noop = false;
|
@Override
|
||||||
private boolean interact = false;
|
public int getPos() {
|
||||||
private boolean inverted = true;
|
return 2;
|
||||||
private int power = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SWItem menu(Player player) {
|
|
||||||
return menu(player, noop, interact, inverted);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean noop, boolean interact, boolean powered) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (noop) {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_NOOP", player));
|
|
||||||
} else if (interact) {
|
|
||||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_INTERACT", player));
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", powered ? "LOADER_INTERACTION_POWERED": "LOADER_INTERACTION_UNPOWERED", player));
|
|
||||||
}
|
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(Consumer<Long> delay) {
|
|
||||||
if (location.getBlock().getType() != Material.DAYLIGHT_DETECTOR) return;
|
|
||||||
DaylightDetector daylightDetector = (DaylightDetector) location.getBlock().getBlockData();
|
|
||||||
if (noop) {
|
|
||||||
return;
|
|
||||||
} else if (interact) {
|
|
||||||
daylightDetector.setInverted(!daylightDetector.isInverted());
|
|
||||||
} else {
|
|
||||||
daylightDetector.setInverted(inverted);
|
|
||||||
}
|
|
||||||
daylightDetector.setPower(daylightDetector.isInverted() ? 15 - power : power);
|
|
||||||
location.getBlock().setBlockData(daylightDetector);
|
|
||||||
updateBlock(location.getBlock().getRelative(0, -1, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
|
||||||
SWInventory swInventory = new SWInventory(player, 36, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
|
||||||
for (int i = 27; i < 35; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
|
||||||
swInventory.setItem(27, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(35, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
|
||||||
|
|
||||||
swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> {
|
|
||||||
noop = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
interact = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
interact = false;
|
|
||||||
inverted = false;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
interact = false;
|
|
||||||
inverted = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
int finalI = i;
|
|
||||||
int finalI2 = i;
|
|
||||||
if (i >= 9) finalI2++;
|
|
||||||
swInventory.setItem(finalI2 + 9, item(player, finalI).getItemStack(), clickType -> {
|
|
||||||
power = finalI;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swInventory.open();
|
@Override
|
||||||
}
|
public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_NOOP", player));
|
||||||
private SWItem item(Player player, boolean noop, boolean interact, boolean inverted) {
|
|
||||||
SWItem swItem = menu(player, noop, interact, inverted);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.inverted).getItemStack())) {
|
|
||||||
swItem.setEnchanted(true);
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem item(Player player, int power) {
|
@Override
|
||||||
SWItem swItem = new SWItem(power == 0 ? Material.GUNPOWDER : Material.REDSTONE, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, power));
|
public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
swItem.getItemStack().setAmount(power == 0 ? 1 : power);
|
}
|
||||||
if (!this.noop && this.power == power) swItem.setEnchanted(true);
|
},
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
INTERACT {
|
||||||
public void playerInteract() {
|
@Override
|
||||||
noop = false;
|
public int getPos() {
|
||||||
interact = true;
|
return 3;
|
||||||
inverted = false;
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_INTERACT", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setInverted(!blockData.isInverted());
|
||||||
|
blockData.setPower(15 - blockData.getPower());
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
DAY_MODE {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_UNPOWERED", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (blockData.isInverted()) {
|
||||||
|
blockData.setInverted(false);
|
||||||
|
blockData.setPower(15 - blockData.getPower());
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
NIGHT_MODE {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderDaylightDetector parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.DAYLIGHT_DETECTOR, translateItemName("LOADER_BUTTON_DAYLIGHT_DETECTOR", "LOADER_INTERACTION_POWERED", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, DaylightDetector blockData, LoaderDaylightDetector parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.isInverted()) {
|
||||||
|
blockData.setInverted(true);
|
||||||
|
blockData.setPower(15 - blockData.getPower());
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,7 +120,7 @@ public class LoaderDaylightDetector extends LoaderInteractionElement<LoaderDayli
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DaylightDetectorSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new DaylightDetectorSettings();
|
return location.getBlock().getType() == Material.DAYLIGHT_DETECTOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,127 +19,493 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Lectern;
|
import org.bukkit.block.Lectern;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderLectern extends LoaderInteractionElement<LoaderLectern.LecternSettings> {
|
public class LoaderLectern extends LoaderInteractionElement<LoaderLectern.LecternSettingsEnum> {
|
||||||
|
|
||||||
|
|
||||||
public LoaderLectern(Location location) {
|
public LoaderLectern(Location location) {
|
||||||
super(location);
|
super(location, LecternSettingsEnum.NEXT_PAGE, LecternSettingsEnum.NOOP, LecternSettingsEnum.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LecternSettings implements ElementSettings {
|
public enum LecternSettingsEnum implements LoaderSettingsEnum<org.bukkit.block.data.type.Lectern, LoaderLectern, LecternSettingsEnum> {
|
||||||
|
NOOP {
|
||||||
private boolean noop = true;
|
@Override
|
||||||
private LecternAction action = LecternAction.PAGE_NEXT;
|
public int getPos() {
|
||||||
private int page = 0;
|
return 2;
|
||||||
|
|
||||||
@Override
|
|
||||||
public SWItem menu(Player player) {
|
|
||||||
return menu(player, noop, action, page);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean noop, LecternAction action, int page) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (noop) {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_NOOP", player));
|
|
||||||
} else if (action == LecternAction.PAGE_PREV) {
|
|
||||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_PREV", player));
|
|
||||||
} else if (action == LecternAction.PAGE_NEXT) {
|
|
||||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_NEXT", player));
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, page));
|
|
||||||
swItem.getItemStack().setAmount(page);
|
|
||||||
}
|
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(Consumer<Long> delay) {
|
|
||||||
if (location.getBlock().getType() != Material.LECTERN) return;
|
|
||||||
Lectern lectern = (Lectern) location.getBlock().getState();
|
|
||||||
if (!((org.bukkit.block.data.type.Lectern) lectern.getBlockData()).hasBook()) return;
|
|
||||||
int pages = ((BookMeta) lectern.getInventory().getItem(0).getItemMeta()).getPages().size();
|
|
||||||
if (noop) {
|
|
||||||
return;
|
|
||||||
} else if (action == LecternAction.PAGE_PREV) {
|
|
||||||
int page = lectern.getPage();
|
|
||||||
if (page > 1) lectern.setPage(page - 1);
|
|
||||||
} else if (action == LecternAction.PAGE_NEXT) {
|
|
||||||
int page = lectern.getPage();
|
|
||||||
if (page < pages) lectern.setPage(page + 1);
|
|
||||||
} else if (action == LecternAction.PAGE_SET) {
|
|
||||||
if (page <= pages) lectern.setPage(page);
|
|
||||||
}
|
|
||||||
lectern.update(false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
|
||||||
SWInventory swInventory = new SWInventory(player, 36, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
|
||||||
for (int i = 27; i < 35; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
|
||||||
swInventory.setItem(27, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(35, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
|
||||||
|
|
||||||
swInventory.setItem(2, item(player, true, LecternAction.PAGE_SET, 0).getItemStack(), clickType -> {
|
|
||||||
noop = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(5, item(player, false, LecternAction.PAGE_PREV, 0).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
action = LecternAction.PAGE_PREV;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(6, item(player, false, LecternAction.PAGE_NEXT, 0).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
action = LecternAction.PAGE_NEXT;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
|
|
||||||
for (int i = 0; i < 15; i++) {
|
|
||||||
int finalI = i;
|
|
||||||
int finalI2 = i;
|
|
||||||
if (i >= 9) finalI2++;
|
|
||||||
if (i >= 12) finalI2++;
|
|
||||||
swInventory.setItem(finalI2 + 9, item(player, false, LecternAction.PAGE_SET, finalI + 1).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
action = LecternAction.PAGE_SET;
|
|
||||||
page = finalI + 1;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swInventory.open();
|
@Override
|
||||||
}
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_NOOP", player));
|
||||||
private SWItem item(Player player, boolean noop, LecternAction action, int page) {
|
|
||||||
SWItem swItem = menu(player, noop, action, page);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.action, this.page).getItemStack())) {
|
|
||||||
swItem.setEnchanted(true);
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum LecternAction {
|
@Override
|
||||||
PAGE_NEXT,
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
PAGE_PREV,
|
}
|
||||||
PAGE_SET
|
},
|
||||||
|
|
||||||
|
PREVIOUS_PAGE {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_PREV", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
if (lectern.getPage() > 0) {
|
||||||
|
lectern.setPage(lectern.getPage() - 1);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
NEXT_PAGE {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE_NEXT", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (lectern.getPage() < pages) {
|
||||||
|
lectern.setPage(lectern.getPage() + 1);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_1 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 1));
|
||||||
|
swItem.getItemStack().setAmount(1);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (1 <= pages) {
|
||||||
|
lectern.setPage(1);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_2 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 2));
|
||||||
|
swItem.getItemStack().setAmount(2);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (2 <= pages) {
|
||||||
|
lectern.setPage(2);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_3 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 3));
|
||||||
|
swItem.getItemStack().setAmount(3);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (3 <= pages) {
|
||||||
|
lectern.setPage(3);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_4 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 4));
|
||||||
|
swItem.getItemStack().setAmount(4);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (4 <= pages) {
|
||||||
|
lectern.setPage(4);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_5 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 13;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 5));
|
||||||
|
swItem.getItemStack().setAmount(5);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (5 <= pages) {
|
||||||
|
lectern.setPage(5);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_6 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 14;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 6));
|
||||||
|
swItem.getItemStack().setAmount(6);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (6 <= pages) {
|
||||||
|
lectern.setPage(6);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_7 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 7));
|
||||||
|
swItem.getItemStack().setAmount(7);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (7 <= pages) {
|
||||||
|
lectern.setPage(7);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_8 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 8));
|
||||||
|
swItem.getItemStack().setAmount(8);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (8 <= pages) {
|
||||||
|
lectern.setPage(8);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_9 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 17;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 9));
|
||||||
|
swItem.getItemStack().setAmount(9);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (9 <= pages) {
|
||||||
|
lectern.setPage(9);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_10 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 19;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 10));
|
||||||
|
swItem.getItemStack().setAmount(10);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (10 <= pages) {
|
||||||
|
lectern.setPage(10);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_11 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 11));
|
||||||
|
swItem.getItemStack().setAmount(11);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (11 <= pages) {
|
||||||
|
lectern.setPage(11);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_12 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 21;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 12));
|
||||||
|
swItem.getItemStack().setAmount(12);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (12 <= pages) {
|
||||||
|
lectern.setPage(12);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_13 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 23;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 13));
|
||||||
|
swItem.getItemStack().setAmount(13);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (13 <= pages) {
|
||||||
|
lectern.setPage(13);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_14 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 14));
|
||||||
|
swItem.getItemStack().setAmount(14);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (14 <= pages) {
|
||||||
|
lectern.setPage(14);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PAGE_15 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLectern parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.LECTERN, translateItemName("LOADER_BUTTON_LECTERN", "LOADER_INTERACTION_PAGE", player, 15));
|
||||||
|
swItem.getItemStack().setAmount(15);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, org.bukkit.block.data.type.Lectern blockData, LoaderLectern parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (!blockData.hasBook()) return;
|
||||||
|
Lectern lectern = (Lectern) location.getBlock().getState();
|
||||||
|
ItemStack itemStack = lectern.getInventory().getItem(0);
|
||||||
|
if (itemStack == null) return;
|
||||||
|
int pages = ((BookMeta) itemStack.getItemMeta()).getPages().size();
|
||||||
|
if (15 <= pages) {
|
||||||
|
lectern.setPage(15);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -148,7 +514,7 @@ public class LoaderLectern extends LoaderInteractionElement<LoaderLectern.Lecter
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LecternSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new LecternSettings();
|
return location.getBlock().getType() == Material.LECTERN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,103 +19,91 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.type.Switch;
|
import org.bukkit.block.data.type.Switch;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderLever extends LoaderInteractionElement<LoaderLever.LeverSettings> {
|
public class LoaderLever extends LoaderInteractionElement<LoaderLever.LeverSettingsEnum> {
|
||||||
|
|
||||||
public LoaderLever(Location location) {
|
public LoaderLever(Location location) {
|
||||||
super(location);
|
super(location, LeverSettingsEnum.INTERACT, LeverSettingsEnum.NOOP, LeverSettingsEnum.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LeverSettings implements ElementSettings {
|
public enum LeverSettingsEnum implements LoaderSettingsEnum<Switch, LoaderLever, LeverSettingsEnum> {
|
||||||
|
|
||||||
private boolean noop = false;
|
NOOP {
|
||||||
private boolean interact = false;
|
@Override
|
||||||
private boolean power = false;
|
public int getPos() {
|
||||||
|
return 2;
|
||||||
@Override
|
|
||||||
public SWItem menu(Player player) {
|
|
||||||
return menu(player, noop, interact, power);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean noop, boolean interact, boolean power) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (noop) {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_NOOP", player));
|
|
||||||
} else if (interact) {
|
|
||||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INTERACT", player));
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", power ? "LOADER_INTERACTION_ACTIVE" : "LOADER_INTERACTION_INACTIVE", player));
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Consumer<Long> delay) {
|
public SWItem menu(Player player, LoaderLever parent, int power, long ticks) {
|
||||||
if (location.getBlock().getType() != Material.LEVER) return;
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_NOOP", player));
|
||||||
if (noop) return;
|
|
||||||
|
|
||||||
Switch lever = (Switch) location.getBlock().getBlockData();
|
|
||||||
if (interact) {
|
|
||||||
lever.setPowered(!lever.isPowered());
|
|
||||||
} else {
|
|
||||||
lever.setPowered(power);
|
|
||||||
}
|
}
|
||||||
location.getBlock().setBlockData(lever, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
}
|
||||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
},
|
||||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
INTERACT {
|
||||||
|
@Override
|
||||||
swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> {
|
public int getPos() {
|
||||||
noop = true;
|
return 3;
|
||||||
click(player, backAction, deleteAction);
|
}
|
||||||
});
|
|
||||||
swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> {
|
@Override
|
||||||
noop = false;
|
public SWItem menu(Player player, LoaderLever parent, int power, long ticks) {
|
||||||
interact = true;
|
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INTERACT", player));
|
||||||
click(player, backAction, deleteAction);
|
}
|
||||||
});
|
|
||||||
swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> {
|
@Override
|
||||||
noop = false;
|
public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
interact = false;
|
blockData.setPowered(!blockData.isPowered());
|
||||||
power = false;
|
parent.update(blockData);
|
||||||
click(player, backAction, deleteAction);
|
}
|
||||||
});
|
},
|
||||||
swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
POWER_OFF {
|
||||||
interact = false;
|
@Override
|
||||||
power = true;
|
public int getPos() {
|
||||||
click(player, backAction, deleteAction);
|
return 5;
|
||||||
});
|
}
|
||||||
|
|
||||||
swInventory.open();
|
@Override
|
||||||
}
|
public SWItem menu(Player player, LoaderLever parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_INACTIVE", player));
|
||||||
private SWItem item(Player player, boolean noop, boolean interact, boolean power) {
|
}
|
||||||
SWItem swItem = menu(player, noop, interact, power);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.power).getItemStack())) {
|
@Override
|
||||||
swItem.setEnchanted(true);
|
public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setPowered(false);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
POWER_ON {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderLever parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.LEVER, translateItemName("LOADER_BUTTON_SWITCH", "LOADER_INTERACTION_ACTIVE", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Switch blockData, LoaderLever parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setPowered(true);
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
|
||||||
return swItem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +113,7 @@ public class LoaderLever extends LoaderInteractionElement<LoaderLever.LeverSetti
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LeverSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new LeverSettings();
|
return location.getBlock().getType() == Material.LEVER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,12 +20,9 @@
|
|||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWAnvilInv;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWInventory;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.AnaloguePowerable;
|
import org.bukkit.block.data.AnaloguePowerable;
|
||||||
@ -33,18 +30,16 @@ import org.bukkit.block.data.BlockData;
|
|||||||
import org.bukkit.block.data.Powerable;
|
import org.bukkit.block.data.Powerable;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.MovementSettings> {
|
public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.MovementSettingsEnum> {
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private Material material;
|
private Material material;
|
||||||
private boolean analogue;
|
private boolean analogue;
|
||||||
|
|
||||||
public LoaderMovement(Location location, String name, Material material) {
|
public LoaderMovement(Location location, String name, Material material) {
|
||||||
super(location);
|
super(location, MovementSettingsEnum.NO_WAIT_FOR, MovementSettingsEnum.NOOP, MovementSettingsEnum.values());
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.material = material;
|
this.material = material;
|
||||||
this.analogue = location.getBlock().getBlockData() instanceof AnaloguePowerable;
|
this.analogue = location.getBlock().getBlockData() instanceof AnaloguePowerable;
|
||||||
@ -52,161 +47,108 @@ public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.Move
|
|||||||
|
|
||||||
public void setInitialTicks(long ticks) {
|
public void setInitialTicks(long ticks) {
|
||||||
if (ticks < 1) ticks = 1;
|
if (ticks < 1) ticks = 1;
|
||||||
elements.get(currentShot).ticks = ticks;
|
extraTicks.set(currentShot, ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MovementSettings implements ElementSettings {
|
public enum MovementSettingsEnum implements LoaderSettingsEnum<BlockData, LoaderMovement, MovementSettingsEnum> {
|
||||||
|
|
||||||
private boolean noop = false;
|
NOOP {
|
||||||
private boolean waitFor = false;
|
@Override
|
||||||
private int power = 15;
|
public int getPos() {
|
||||||
private long ticks = 1;
|
return 2;
|
||||||
|
|
||||||
@Override
|
|
||||||
public SWItem menu(Player player) {
|
|
||||||
return menu(player, noop, waitFor);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean noop, boolean waitFor) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (noop) {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName(name, "LOADER_INTERACTION_NOOP", player));
|
|
||||||
} else if (waitFor) {
|
|
||||||
swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_WAIT_FOR", player));
|
|
||||||
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_NO_WAIT_FOR", player));
|
|
||||||
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
|
||||||
swItem.setEnchanted(true);
|
|
||||||
}
|
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(Consumer<Long> delay) {
|
|
||||||
if (!(material == Material.STRING && location.getBlock().getType() == Material.TRIPWIRE) && location.getBlock().getType() != material) return;
|
|
||||||
if (noop) return;
|
|
||||||
|
|
||||||
BlockData blockData = location.getBlock().getBlockData();
|
|
||||||
if (blockData instanceof AnaloguePowerable) {
|
|
||||||
AnaloguePowerable analoguePowerable = (AnaloguePowerable) location.getBlock().getBlockData();
|
|
||||||
analoguePowerable.setPower(power);
|
|
||||||
location.getBlock().setBlockData(analoguePowerable, true);
|
|
||||||
update(analoguePowerable);
|
|
||||||
} else if (blockData instanceof Powerable) {
|
|
||||||
Powerable powerable = (Powerable) location.getBlock().getBlockData();
|
|
||||||
if (ticks < 0) {
|
|
||||||
powerable.setPowered(power > 0);
|
|
||||||
} else {
|
|
||||||
powerable.setPowered(true);
|
|
||||||
}
|
|
||||||
location.getBlock().setBlockData(powerable, true);
|
|
||||||
update(powerable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ticks >= 0) {
|
@Override
|
||||||
if (waitFor) {
|
public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) {
|
||||||
delay.accept(ticks);
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
NO_WAIT_FOR {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_WAIT_FOR", player));
|
||||||
|
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasPower(LoaderMovement parent) {
|
||||||
|
return parent.analogue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasTicks(LoaderMovement parent) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (blockData instanceof AnaloguePowerable) {
|
||||||
|
AnaloguePowerable analoguePowerable = (AnaloguePowerable) location.getBlock().getBlockData();
|
||||||
|
analoguePowerable.setPower(power);
|
||||||
|
parent.update(analoguePowerable);
|
||||||
|
} else if (blockData instanceof Powerable) {
|
||||||
|
Powerable powerable = (Powerable) location.getBlock().getBlockData();
|
||||||
|
if (ticks < 0) {
|
||||||
|
powerable.setPowered(power > 0);
|
||||||
|
} else {
|
||||||
|
powerable.setPowered(true);
|
||||||
|
}
|
||||||
|
parent.update(powerable);
|
||||||
}
|
}
|
||||||
|
|
||||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||||
if (blockData instanceof AnaloguePowerable) {
|
if (blockData instanceof AnaloguePowerable) {
|
||||||
AnaloguePowerable analoguePowerable = (AnaloguePowerable) blockData;
|
AnaloguePowerable analoguePowerable = (AnaloguePowerable) blockData;
|
||||||
analoguePowerable.setPower(0);
|
analoguePowerable.setPower(0);
|
||||||
location.getBlock().setBlockData(analoguePowerable, true);
|
parent.update(analoguePowerable);
|
||||||
update(analoguePowerable);
|
|
||||||
} else {
|
} else {
|
||||||
Powerable powerable = (Powerable) blockData;
|
Powerable powerable = (Powerable) blockData;
|
||||||
powerable.setPowered(false);
|
powerable.setPowered(false);
|
||||||
location.getBlock().setBlockData(powerable, true);
|
parent.update(powerable);
|
||||||
update(powerable);
|
|
||||||
}
|
}
|
||||||
}, ticks);
|
}, ticks);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
@Override
|
WAIT_FOR {
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
@Override
|
||||||
SWInventory swInventory = new SWInventory(player, analogue ? 45 : 27, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
public int getPos() {
|
||||||
for (int i = analogue ? 36 : 18; i < (analogue ? 44 : 26); i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
return 6;
|
||||||
swInventory.setItem(analogue ? 36 : 18, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(analogue ? 44 : 26, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
|
||||||
|
|
||||||
swInventory.setItem(2, item(player, true, false).getItemStack(), clickType -> {
|
|
||||||
noop = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
if (ticks >= 0) {
|
|
||||||
swInventory.setItem(5, item(player, false, false).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
waitFor = false;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(6, item(player, false, true).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
waitFor = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swInventory.setItem(12, new SWItem(SWItem.getDye(1), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_REMOVE_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> {
|
@Override
|
||||||
ticks -= clickType.isShiftClick() ? 5 : 1;
|
public SWItem menu(Player player, LoaderMovement parent, int power, long ticks) {
|
||||||
if (ticks < 1) ticks = 1;
|
SWItem swItem = new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_NO_WAIT_FOR", player));
|
||||||
swInventory.setItem(13, item(player));
|
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
||||||
});
|
return swItem;
|
||||||
swInventory.setItem(13, item(player).getItemStack(), clickType -> {
|
|
||||||
SWAnvilInv swAnvilInv = new SWAnvilInv(player, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_NAME", player), ticks + "");
|
|
||||||
swAnvilInv.setCallback(s -> {
|
|
||||||
try {
|
|
||||||
ticks = Long.parseLong(s);
|
|
||||||
if (ticks < 1) ticks = 1;
|
|
||||||
} catch (NumberFormatException ignored) {
|
|
||||||
}
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swAnvilInv.open();
|
|
||||||
});
|
|
||||||
swInventory.setItem(14, new SWItem(SWItem.getDye(10), BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE", player), Arrays.asList(BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS_ADD_ONE_SHIFT", player)), false, clickType -> {}).getItemStack(), clickType -> {
|
|
||||||
ticks += clickType.isShiftClick() ? 5 : 1;
|
|
||||||
swInventory.setItem(13, item(player));
|
|
||||||
});
|
|
||||||
|
|
||||||
if (analogue) {
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
int finalI = i;
|
|
||||||
int finalI2 = i;
|
|
||||||
if (i >= 9) finalI2++;
|
|
||||||
swInventory.setItem(finalI2 + 18, item(player, finalI).getItemStack(), clickType -> {
|
|
||||||
power = finalI;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swInventory.open();
|
@Override
|
||||||
}
|
public boolean hasPower(LoaderMovement parent) {
|
||||||
|
return parent.analogue;
|
||||||
private SWItem item(Player player, boolean noop, boolean waitFor) {
|
|
||||||
SWItem swItem = menu(player, noop, waitFor);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.waitFor).getItemStack())) {
|
|
||||||
swItem.setEnchanted(true);
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem item(Player player, int power) {
|
@Override
|
||||||
SWItem swItem = new SWItem(power == 0 ? Material.GUNPOWDER : Material.REDSTONE, BauSystem.MESSAGE.parse("LOADER_SETTING_POWER", player, power));
|
public boolean hasTicks(LoaderMovement parent) {
|
||||||
swItem.getItemStack().setAmount(power == 0 ? 1 : power);
|
return true;
|
||||||
if (!this.noop && this.power == power) swItem.setEnchanted(true);
|
}
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem item(Player player) {
|
@Override
|
||||||
SWItem swItem = new SWItem(Material.CLOCK, BauSystem.MESSAGE.parse("LOADER_SETTING_TICKS", player, ticks));
|
public void execute(Location location, BlockData blockData, LoaderMovement parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
swItem.getItemStack().setAmount((int) Math.min(ticks, 64));
|
NO_WAIT_FOR.execute(location, blockData, parent, power, ticks, delay);
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
delay.accept(ticks);
|
||||||
return swItem;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,7 +158,8 @@ public class LoaderMovement extends LoaderInteractionElement<LoaderMovement.Move
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MovementSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new MovementSettings();
|
if (material == Material.STRING && location.getBlock().getType() == Material.TRIPWIRE) return true;
|
||||||
|
return location.getBlock().getType() == material;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,8 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Instrument;
|
import org.bukkit.Instrument;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@ -30,75 +28,50 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.block.data.type.NoteBlock;
|
import org.bukkit.block.data.type.NoteBlock;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderNoteBlock extends LoaderInteractionElement<LoaderNoteBlock.NoteBlockSettings> {
|
public class LoaderNoteBlock extends LoaderInteractionElement<LoaderNoteBlock.NoteBlockSettingsEnum> {
|
||||||
|
|
||||||
public LoaderNoteBlock(Location location) {
|
public LoaderNoteBlock(Location location) {
|
||||||
super(location);
|
super(location, NoteBlockSettingsEnum.INTERACT, NoteBlockSettingsEnum.NOOP, NoteBlockSettingsEnum.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NoteBlockSettings implements ElementSettings {
|
public enum NoteBlockSettingsEnum implements LoaderSettingsEnum<NoteBlock, LoaderNoteBlock, NoteBlockSettingsEnum> {
|
||||||
|
|
||||||
private boolean interact = true;
|
NOOP {
|
||||||
|
@Override
|
||||||
@Override
|
public int getPos() {
|
||||||
public SWItem menu(Player player) {
|
return 2;
|
||||||
return menu(player, interact);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean interact) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (interact) {
|
|
||||||
swItem = new SWItem(Material.NOTE_BLOCK, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_INTERACT", player));
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_NOOP", player));
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Consumer<Long> delay) {
|
public SWItem menu(Player player, LoaderNoteBlock parent, int power, long ticks) {
|
||||||
if (location.getBlock().getType() != Material.NOTE_BLOCK) return;
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_NOOP", player));
|
||||||
NoteBlock noteBlock = (NoteBlock) location.getBlock().getBlockData();
|
|
||||||
if (interact) {
|
|
||||||
if (noteBlock.getInstrument() == Instrument.BANJO) noteBlock.setInstrument(Instrument.BIT);
|
|
||||||
else noteBlock.setInstrument(Instrument.BANJO);
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
location.getBlock().setBlockData(noteBlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
public void execute(Location location, NoteBlock blockData, LoaderNoteBlock parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
|
||||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
|
||||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
|
||||||
|
|
||||||
swInventory.setItem(2, item(player, false).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(3, item(player, true).getItemStack(), clickType -> {
|
|
||||||
interact = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
|
|
||||||
swInventory.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem item(Player player, boolean interact) {
|
|
||||||
SWItem swItem = menu(player, interact);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.interact).getItemStack())) {
|
|
||||||
swItem.setEnchanted(true);
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
},
|
||||||
return swItem;
|
|
||||||
|
INTERACT {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderNoteBlock parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.NOTE_BLOCK, translateItemName("LOADER_BUTTON_NOTEBLOCK", "LOADER_INTERACTION_INTERACT", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, NoteBlock blockData, LoaderNoteBlock parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
if (blockData.getInstrument() == Instrument.BANJO) blockData.setInstrument(Instrument.BIT);
|
||||||
|
else blockData.setInstrument(Instrument.BANJO);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,7 +81,7 @@ public class LoaderNoteBlock extends LoaderInteractionElement<LoaderNoteBlock.No
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NoteBlockSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new NoteBlockSettings();
|
return location.getBlock().getType() == Material.NOTE_BLOCK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,108 +19,97 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.Openable;
|
import org.bukkit.block.data.Openable;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderOpenable extends LoaderInteractionElement<LoaderOpenable.TrapdoorSettings> {
|
public class LoaderOpenable extends LoaderInteractionElement<LoaderOpenable.OpenableSettingsEnum> {
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private Material material;
|
private Material material;
|
||||||
|
|
||||||
public LoaderOpenable(Location location, String name, Material material) {
|
public LoaderOpenable(Location location, String name, Material material) {
|
||||||
super(location);
|
super(location, OpenableSettingsEnum.INTERACT, OpenableSettingsEnum.NOOP, OpenableSettingsEnum.values());
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.material = material;
|
this.material = material;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TrapdoorSettings implements ElementSettings {
|
public enum OpenableSettingsEnum implements LoaderSettingsEnum<Openable, LoaderOpenable, OpenableSettingsEnum> {
|
||||||
|
|
||||||
private boolean noop = false;
|
NOOP {
|
||||||
private boolean interact = true;
|
@Override
|
||||||
private boolean open = false;
|
public int getPos() {
|
||||||
|
return 2;
|
||||||
@Override
|
|
||||||
public SWItem menu(Player player) {
|
|
||||||
return menu(player, noop, interact, open);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean noop, boolean interact, boolean powered) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (noop) {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName(name, "LOADER_INTERACTION_NOOP", player));
|
|
||||||
} else if (interact) {
|
|
||||||
swItem = new SWItem(Material.STICK, translateItemName(name, "LOADER_INTERACTION_INTERACT", player));
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(material, translateItemName(name, open ? "LOADER_INTERACTION_OPEN" : "LOADER_INTERACTION_CLOSED", player));
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Consumer<Long> delay) {
|
public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) {
|
||||||
if (location.getBlock().getType() != material) return;
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player));
|
||||||
Openable openable = (Openable) location.getBlock().getBlockData();
|
|
||||||
if (noop) {
|
|
||||||
return;
|
|
||||||
} else if (interact) {
|
|
||||||
openable.setOpen(!openable.isOpen());
|
|
||||||
} else {
|
|
||||||
openable.setOpen(open);
|
|
||||||
}
|
}
|
||||||
location.getBlock().setBlockData(openable);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
}
|
||||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
},
|
||||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
INTERACT {
|
||||||
|
@Override
|
||||||
swInventory.setItem(2, item(player, true, false, false).getItemStack(), clickType -> {
|
public int getPos() {
|
||||||
noop = true;
|
return 3;
|
||||||
click(player, backAction, deleteAction);
|
}
|
||||||
});
|
|
||||||
swInventory.setItem(3, item(player, false, true, false).getItemStack(), clickType -> {
|
@Override
|
||||||
noop = false;
|
public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) {
|
||||||
interact = true;
|
return new SWItem(Material.STICK, translateItemName(parent.name, "LOADER_INTERACTION_INTERACT", player));
|
||||||
click(player, backAction, deleteAction);
|
}
|
||||||
});
|
|
||||||
swInventory.setItem(5, item(player, false, false, false).getItemStack(), clickType -> {
|
@Override
|
||||||
noop = false;
|
public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
interact = false;
|
blockData.setOpen(!blockData.isOpen());
|
||||||
open = false;
|
parent.update(blockData);
|
||||||
click(player, backAction, deleteAction);
|
}
|
||||||
});
|
},
|
||||||
swInventory.setItem(6, item(player, false, false, true).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
CLOSED {
|
||||||
interact = false;
|
@Override
|
||||||
open = true;
|
public int getPos() {
|
||||||
click(player, backAction, deleteAction);
|
return 5;
|
||||||
});
|
}
|
||||||
|
|
||||||
swInventory.open();
|
@Override
|
||||||
}
|
public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) {
|
||||||
|
return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_CLOSED", player));
|
||||||
private SWItem item(Player player, boolean noop, boolean interact, boolean open) {
|
}
|
||||||
SWItem swItem = menu(player, noop, interact, open);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.interact, this.open).getItemStack())) {
|
@Override
|
||||||
swItem.setEnchanted(true);
|
public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setOpen(false);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
OPEN {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderOpenable parent, int power, long ticks) {
|
||||||
|
return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_OPEN", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Openable blockData, LoaderOpenable parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setOpen(true);
|
||||||
|
parent.update(blockData);
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
|
||||||
return swItem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +119,7 @@ public class LoaderOpenable extends LoaderInteractionElement<LoaderOpenable.Trap
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TrapdoorSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new TrapdoorSettings();
|
return location.getBlock().getType() == material;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,119 +20,140 @@
|
|||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.type.Repeater;
|
import org.bukkit.block.data.type.Repeater;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderRepeater extends LoaderInteractionElement<LoaderRepeater.RepeaterSettings> {
|
public class LoaderRepeater extends LoaderInteractionElement<LoaderRepeater.RepeaterSettingsEnum> {
|
||||||
|
|
||||||
public LoaderRepeater(Location location) {
|
public LoaderRepeater(Location location) {
|
||||||
super(location);
|
super(location, RepeaterSettingsEnum.INTERACT, RepeaterSettingsEnum.NOOP, RepeaterSettingsEnum.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RepeaterSettings implements ElementSettings {
|
public enum RepeaterSettingsEnum implements LoaderSettingsEnum<Repeater, LoaderRepeater, RepeaterSettingsEnum> {
|
||||||
|
|
||||||
private boolean interact = false;
|
NOOP {
|
||||||
private int delay = 1;
|
@Override
|
||||||
|
public int getPos() {
|
||||||
@Override
|
return 1;
|
||||||
public SWItem menu(Player player) {
|
|
||||||
return menu(player, interact, delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean interact, int delay) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (interact) {
|
|
||||||
swItem = new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_INTERACT", player));
|
|
||||||
} else if (delay == 0) {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_NOOP", player));
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, delay));
|
|
||||||
swItem.getItemStack().setAmount(delay);
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Consumer<Long> __) {
|
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||||
if (location.getBlock().getType() != Material.REPEATER) return;
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_NOOP", player));
|
||||||
Repeater repeater = (Repeater) location.getBlock().getBlockData();
|
|
||||||
if (interact) {
|
|
||||||
int delay = repeater.getDelay();
|
|
||||||
delay++;
|
|
||||||
if (delay > 4) delay = 1;
|
|
||||||
repeater.setDelay(delay);
|
|
||||||
} else if (delay == 0) {
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
repeater.setDelay(delay);
|
|
||||||
}
|
}
|
||||||
location.getBlock().setBlockData(repeater, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
|
||||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
|
||||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
|
||||||
|
|
||||||
swInventory.setItem(1, item(player, false, 0).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
delay = 0;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(2, item(player, true, -1).getItemStack(), clickType -> {
|
|
||||||
interact = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(4, item(player, false, 1).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
delay = 1;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(5, item(player, false, 2).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
delay = 2;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(6, item(player, false, 3).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
delay = 3;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(7, item(player, false, 4).getItemStack(), clickType -> {
|
|
||||||
interact = false;
|
|
||||||
delay = 4;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
|
|
||||||
swInventory.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem item(Player player, boolean interact, int delay) {
|
|
||||||
SWItem swItem = menu(player, interact, delay);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.interact, this.delay).getItemStack())) {
|
|
||||||
swItem.setEnchanted(true);
|
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
},
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
INTERACT {
|
||||||
public void playerInteract() {
|
@Override
|
||||||
interact = true;
|
public int getPos() {
|
||||||
delay = 0;
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.STICK, translateItemName("LOADER_BUTTON_REPEATER", "LOADER_INTERACTION_INTERACT", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
int repeaterDelay = blockData.getDelay();
|
||||||
|
repeaterDelay++;
|
||||||
|
if (repeaterDelay > 4) repeaterDelay = 1;
|
||||||
|
blockData.setDelay(repeaterDelay);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
DELAY_1 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 1));
|
||||||
|
swItem.getItemStack().setAmount(1);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setDelay(1);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
DELAY_2 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 2));
|
||||||
|
swItem.getItemStack().setAmount(2);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setDelay(2);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
DELAY_3 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 3));
|
||||||
|
swItem.getItemStack().setAmount(3);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setDelay(3);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
DELAY_4 {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderRepeater parent, int power, long ticks) {
|
||||||
|
SWItem swItem = new SWItem(Material.REPEATER, BauSystem.MESSAGE.parse("LOADER_SETTING_REPEATER", player, 4));
|
||||||
|
swItem.getItemStack().setAmount(4);
|
||||||
|
return swItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Repeater blockData, LoaderRepeater parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
blockData.setDelay(4);
|
||||||
|
parent.update(blockData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +163,7 @@ public class LoaderRepeater extends LoaderInteractionElement<LoaderRepeater.Repe
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RepeaterSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new RepeaterSettings();
|
return location.getBlock().getType() == Material.REPEATER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,23 +20,57 @@
|
|||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderTNT implements LoaderElement {
|
public class LoaderTNT extends LoaderInteractionElement<LoaderTNT.TNTSettingsEnum> {
|
||||||
|
|
||||||
private Location location;
|
|
||||||
|
|
||||||
public LoaderTNT(Location location) {
|
public LoaderTNT(Location location) {
|
||||||
this.location = location;
|
super(location, TNTSettingsEnum.PLACE, TNTSettingsEnum.NOOP, TNTSettingsEnum.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum TNTSettingsEnum implements LoaderSettingsEnum<BlockData, LoaderTNT, TNTSettingsEnum> {
|
||||||
|
NOOP {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderTNT parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName("LOADER_BUTTON_TNT", "LOADER_INTERACTION_NOOP", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, BlockData blockData, LoaderTNT parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
PLACE {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderTNT parent, int power, long ticks) {
|
||||||
|
return new SWItem(Material.TNT, translateItemName("LOADER_BUTTON_TNT", "LOADER_INTERACTION_PLACE", player));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, BlockData blockData, LoaderTNT parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
location.getBlock().setType(Material.TNT);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -54,10 +88,11 @@ public class LoaderTNT implements LoaderElement {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
block.setType(Material.TNT, true);
|
super.execute(delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click(Player player, Runnable backAction) {
|
public boolean checkBlockInWorld() {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,115 +20,87 @@
|
|||||||
package de.steamwar.bausystem.features.loader.elements.impl;
|
package de.steamwar.bausystem.features.loader.elements.impl;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.features.loader.elements.ElementSettings;
|
|
||||||
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
|
||||||
import de.steamwar.inventory.SWInventory;
|
import de.steamwar.bausystem.features.loader.elements.LoaderSettingsEnum;
|
||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.data.Powerable;
|
import org.bukkit.block.data.Powerable;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSettings> {
|
public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSettingsEnum> {
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private Material material;
|
private Material material;
|
||||||
private int ticks;
|
private int ticks;
|
||||||
|
|
||||||
public LoaderTicks(Location location, String name, Material material, int ticks) {
|
public LoaderTicks(Location location, String name, Material material, int ticks) {
|
||||||
super(location);
|
super(location, TicksSettingsEnum.NO_WAIT_FOR, TicksSettingsEnum.NOOP, TicksSettingsEnum.values());
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.material = material;
|
this.material = material;
|
||||||
this.ticks = ticks;
|
this.ticks = ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TicksSettings implements ElementSettings {
|
public enum TicksSettingsEnum implements LoaderSettingsEnum<Powerable, LoaderTicks, TicksSettingsEnum> {
|
||||||
|
|
||||||
private boolean noop = false;
|
NOOP {
|
||||||
private boolean waitFor = false;
|
@Override
|
||||||
|
public int getPos() {
|
||||||
@Override
|
return 2;
|
||||||
public SWItem menu(Player player) {
|
|
||||||
return menu(player, noop, waitFor);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem menu(Player player, boolean noop, boolean waitFor) {
|
|
||||||
SWItem swItem;
|
|
||||||
if (noop) {
|
|
||||||
swItem = new SWItem(Material.STRUCTURE_VOID, translateItemName(name, "LOADER_INTERACTION_NOOP", player));
|
|
||||||
} else if (waitFor) {
|
|
||||||
swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_WAIT_FOR", player, ticks));
|
|
||||||
} else {
|
|
||||||
swItem = new SWItem(material, translateItemName(name, "LOADER_INTERACTION_NO_WAIT_FOR", player, ticks));
|
|
||||||
swItem.setEnchanted(true);
|
|
||||||
}
|
|
||||||
swItem.setLore(Arrays.asList(BauSystem.MESSAGE.parse("LOADER_GUI_CLICK_TO_EDIT", player)));
|
|
||||||
return swItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(Consumer<Long> delay) {
|
|
||||||
if (location.getBlock().getType() != material) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (noop) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Powerable powerable = (Powerable) location.getBlock().getBlockData();
|
@Override
|
||||||
powerable.setPowered(true);
|
public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) {
|
||||||
location.getBlock().setBlockData(powerable, true);
|
return new SWItem(Material.STRUCTURE_VOID, translateItemName(parent.name, "LOADER_INTERACTION_NOOP", player));
|
||||||
update(powerable);
|
|
||||||
|
|
||||||
if (waitFor) {
|
|
||||||
delay.accept((long) ticks);
|
|
||||||
}
|
|
||||||
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
|
||||||
powerable.setPowered(false);
|
|
||||||
location.getBlock().setBlockData(powerable, true);
|
|
||||||
update(powerable);
|
|
||||||
}, ticks);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void click(Player player, Runnable backAction, Runnable deleteAction) {
|
|
||||||
SWInventory swInventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_TITLE", player));
|
|
||||||
for (int i = 9; i < 18; i++) swInventory.setItem(i, new SWItem(Material.GRAY_STAINED_GLASS_PANE, "§7"));
|
|
||||||
swInventory.setItem(9, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_BACK", player)).getItemStack(), clickType -> backAction.run());
|
|
||||||
swInventory.setItem(17, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("LOADER_GUI_SETTINGS_DELETE", player)).getItemStack(), clickType -> deleteAction.run());
|
|
||||||
|
|
||||||
swInventory.setItem(2, item(player, true, false).getItemStack(), clickType -> {
|
|
||||||
noop = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
if (ticks >= 0) {
|
|
||||||
swInventory.setItem(5, item(player, false, false).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
waitFor = false;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
swInventory.setItem(6, item(player, false, true).getItemStack(), clickType -> {
|
|
||||||
noop = false;
|
|
||||||
waitFor = true;
|
|
||||||
click(player, backAction, deleteAction);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
swInventory.open();
|
@Override
|
||||||
}
|
public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
}
|
||||||
private SWItem item(Player player, boolean noop, boolean waitFor) {
|
},
|
||||||
SWItem swItem = menu(player, noop, waitFor);
|
|
||||||
if (swItem.getItemStack().equals(menu(player, this.noop, this.waitFor).getItemStack())) {
|
NO_WAIT_FOR {
|
||||||
swItem.setEnchanted(true);
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) {
|
||||||
|
return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_NO_WAIT_FOR", player, ticks));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
Powerable powerable = (Powerable) location.getBlock().getBlockData();
|
||||||
|
powerable.setPowered(true);
|
||||||
|
parent.update(powerable);
|
||||||
|
|
||||||
|
BauSystem.runTaskLater(BauSystem.getInstance(), () -> {
|
||||||
|
powerable.setPowered(false);
|
||||||
|
parent.update(powerable);
|
||||||
|
}, parent.ticks);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
WAIT_FOR {
|
||||||
|
@Override
|
||||||
|
public int getPos() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWItem menu(Player player, LoaderTicks parent, int power, long ticks) {
|
||||||
|
return new SWItem(parent.material, translateItemName(parent.name, "LOADER_INTERACTION_WAIT_FOR", player, ticks));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Location location, Powerable blockData, LoaderTicks parent, int power, long ticks, Consumer<Long> delay) {
|
||||||
|
NO_WAIT_FOR.execute(location, blockData, parent, power, ticks, delay);
|
||||||
|
delay.accept((long) parent.ticks);
|
||||||
}
|
}
|
||||||
swItem.setLore(Collections.emptyList());
|
|
||||||
return swItem;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +110,7 @@ public class LoaderTicks extends LoaderInteractionElement<LoaderTicks.TicksSetti
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TicksSettings createNewElement() {
|
public boolean checkBlockInWorld() {
|
||||||
return new TicksSettings();
|
return location.getBlock().getType() == material;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,15 +26,13 @@ import de.steamwar.inventory.SWInventory;
|
|||||||
import de.steamwar.inventory.SWItem;
|
import de.steamwar.inventory.SWItem;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class LoaderWait implements LoaderElement, Listener {
|
public class LoaderWait implements LoaderElement {
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -54,8 +52,8 @@ public class LoaderWait implements LoaderElement, Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Consumer<Long> __) {
|
public void execute(Consumer<Long> wait) {
|
||||||
__.accept(delay);
|
wait.accept(delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -32,12 +32,12 @@ public class LoadtimerCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "start", description = "LOADTIMER_HELP_START_1")
|
@Register(value = "start", description = "LOADTIMER_HELP_START_1")
|
||||||
public void start(Player p) {
|
public void start(@Validator Player p) {
|
||||||
start(p, TimerMode.HALF);
|
start(p, TimerMode.HALF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "start", description = {"LOADTIMER_HELP_START_2", "LOADTIMER_HELP_START_3"})
|
@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());
|
Region r = Region.getRegion(p.getLocation());
|
||||||
if (r.isGlobal()) return;
|
if (r.isGlobal()) return;
|
||||||
if (!Loadtimer.hasTimer(r))
|
if (!Loadtimer.hasTimer(r))
|
||||||
@ -45,7 +45,7 @@ public class LoadtimerCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "stop", description = "LOADTIMER_HELP_STOP")
|
@Register(value = "stop", description = "LOADTIMER_HELP_STOP")
|
||||||
public void stop(Player p) {
|
public void stop(@Validator Player p) {
|
||||||
Region r = Region.getRegion(p.getLocation());
|
Region r = Region.getRegion(p.getLocation());
|
||||||
if (r.isGlobal()) return;
|
if (r.isGlobal()) return;
|
||||||
if (Loadtimer.hasTimer(r))
|
if (Loadtimer.hasTimer(r))
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
package de.steamwar.bausystem.features.observer;
|
package de.steamwar.bausystem.features.observer;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -46,13 +47,13 @@ public class ObserverTracerCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "delete", description = "OBSERVER_HELP_DELETE")
|
@Register(value = "delete", description = "OBSERVER_HELP_DELETE")
|
||||||
public void delete(Player p) {
|
public void delete(@Validator Player p) {
|
||||||
ObserverTracerListener.observerTracerMap.remove(p);
|
ObserverTracerListener.observerTracerMap.remove(p);
|
||||||
BauSystem.MESSAGE.send("OBSERVER_DELETE", p);
|
BauSystem.MESSAGE.send("OBSERVER_DELETE", p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "retrace", description = "OBSERVER_HELP_RETRACE")
|
@Register(value = "retrace", description = "OBSERVER_HELP_RETRACE")
|
||||||
public void retrace(Player p) {
|
public void retrace(@Validator Player p) {
|
||||||
if (ObserverTracerListener.observerTracerMap.containsKey(p)) {
|
if (ObserverTracerListener.observerTracerMap.containsKey(p)) {
|
||||||
BauSystem.MESSAGE.send("OBSERVER_RETRACE_NO_TRACE", p);
|
BauSystem.MESSAGE.send("OBSERVER_RETRACE_NO_TRACE", p);
|
||||||
return;
|
return;
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
package de.steamwar.bausystem.features.observer;
|
package de.steamwar.bausystem.features.observer;
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.Permission;
|
||||||
|
import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
@ -55,6 +57,7 @@ public class ObserverTracerListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
if(!Permission.BUILD.hasPermission(event.getPlayer())) return;
|
||||||
if (!enabled.contains(event.getPlayer())) {
|
if (!enabled.contains(event.getPlayer())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -87,6 +90,11 @@ public class ObserverTracerListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||||
|
event.getNewSpectator().forEach(observerTracerMap::remove);
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
enabled.add(event.getPlayer());
|
enabled.add(event.getPlayer());
|
||||||
|
@ -1,62 +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.redstonetester;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.Permission;
|
|
||||||
import de.steamwar.bausystem.linkage.specific.BauGuiItem;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.inventory.ClickType;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class RedstoneTesterGuiItem extends BauGuiItem {
|
|
||||||
|
|
||||||
public RedstoneTesterGuiItem() {
|
|
||||||
super(23);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack getItem(Player player) {
|
|
||||||
return new SWItem(Material.REPEATER,
|
|
||||||
BauSystem.MESSAGE.parse("RT_ITEM_NAME", player),
|
|
||||||
Arrays.asList(BauSystem.MESSAGE.parse("RT_ITEM_LORE_1", player),
|
|
||||||
BauSystem.MESSAGE.parse("RT_ITEM_LORE_2", player),
|
|
||||||
BauSystem.MESSAGE.parse("RT_ITEM_LORE_3", player))
|
|
||||||
, false, null).getItemStack();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean click(ClickType click, Player p) {
|
|
||||||
p.closeInventory();
|
|
||||||
p.performCommand("redstonetester");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Permission permission() {
|
|
||||||
return Permission.MEMBER;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +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.redstonetester;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.SWUtils;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class RedstonetesterCommand extends SWCommand {
|
|
||||||
|
|
||||||
public RedstonetesterCommand() {
|
|
||||||
super("redstonetester", "rt");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(description = "RT_HELP")
|
|
||||||
public void genericCommand(Player p) {
|
|
||||||
BauSystem.MESSAGE.send("RT_GIVEN", p);
|
|
||||||
SWUtils.giveItemToPlayer(p, RedstonetesterUtils.getWand(p));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,108 +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.redstonetester;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
|
||||||
import de.steamwar.bausystem.utils.ItemUtils;
|
|
||||||
import de.steamwar.inventory.SWItem;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import lombok.experimental.UtilityClass;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
|
||||||
import org.bukkit.block.data.Powerable;
|
|
||||||
import org.bukkit.block.data.type.Piston;
|
|
||||||
import org.bukkit.block.data.type.RedstoneWire;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@UtilityClass
|
|
||||||
public class RedstonetesterUtils {
|
|
||||||
|
|
||||||
public static ItemStack getWand(Player player) {
|
|
||||||
ItemStack i = new SWItem(Material.BLAZE_ROD,
|
|
||||||
BauSystem.MESSAGE.parse("RT_ITEM_NAME", player),
|
|
||||||
Arrays.asList(BauSystem.MESSAGE.parse("RT_ITEM_LORE_1", player),
|
|
||||||
BauSystem.MESSAGE.parse("RT_ITEM_LORE_2", player),
|
|
||||||
BauSystem.MESSAGE.parse("RT_ITEM_LORE_3", player)),
|
|
||||||
false, null).getItemStack();
|
|
||||||
ItemUtils.setItem(i, "redstonetester");
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Map<Player, RedstoneTester> playerMap = new HashMap<>();
|
|
||||||
|
|
||||||
public void sendLocation(Player player, String prefix, Location location) {
|
|
||||||
BauSystem.MESSAGE.send("RT_LOC", player, location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
|
|
||||||
public boolean validBlock(Player player, BlockData block) {
|
|
||||||
if (block instanceof Powerable) return true;
|
|
||||||
if (block instanceof Piston) return true;
|
|
||||||
if (block instanceof RedstoneWire) return true;
|
|
||||||
BauSystem.MESSAGE.send("RT_INVALID_LOC", player);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
public static class RedstoneTester {
|
|
||||||
|
|
||||||
private final Player player;
|
|
||||||
private Location loc1 = null;
|
|
||||||
private Location loc2 = null;
|
|
||||||
|
|
||||||
private long lastTick = 0;
|
|
||||||
private Long tick = null;
|
|
||||||
|
|
||||||
public RedstoneTester(Player player) {
|
|
||||||
this.player = player;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void activate(Location location) {
|
|
||||||
if (loc1 == null || loc2 == null) {
|
|
||||||
tick = null;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (TPSUtils.currentRealTick.get() - lastTick > 100) {
|
|
||||||
tick = null;
|
|
||||||
}
|
|
||||||
if (loc1.equals(location)) {
|
|
||||||
lastTick = TPSUtils.currentRealTick.get();
|
|
||||||
if (tick == null) {
|
|
||||||
tick = TPSUtils.currentRealTick.get();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (tick != null && loc2.equals(location)) {
|
|
||||||
BauSystem.MESSAGE.send("RT_RESULT", player, (TPSUtils.currentRealTick.get() - tick), ((TPSUtils.currentRealTick.get() - tick) / 2.0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,94 +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.redstonetester;
|
|
||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
|
||||||
import de.steamwar.bausystem.utils.ItemUtils;
|
|
||||||
import de.steamwar.linkage.Linked;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.block.BlockDispenseEvent;
|
|
||||||
import org.bukkit.event.block.BlockPistonExtendEvent;
|
|
||||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
|
||||||
import org.bukkit.event.block.BlockRedstoneEvent;
|
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
@Linked
|
|
||||||
public class RestonetesterListener implements Listener {
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
|
||||||
if (!ItemUtils.isItem(event.getItem(), "redstonetester")) return;
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
Block block = event.getClickedBlock();
|
|
||||||
event.setCancelled(true);
|
|
||||||
|
|
||||||
switch (event.getAction()) {
|
|
||||||
case RIGHT_CLICK_AIR:
|
|
||||||
if (player.isSneaking()) {
|
|
||||||
RedstonetesterUtils.getPlayerMap().remove(event.getPlayer());
|
|
||||||
BauSystem.MESSAGE.send("RT_ACTIVATE", player);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case LEFT_CLICK_BLOCK:
|
|
||||||
if (!RedstonetesterUtils.validBlock(event.getPlayer(), Objects.requireNonNull(block).getBlockData())) return;
|
|
||||||
RedstonetesterUtils.getPlayerMap().computeIfAbsent(event.getPlayer(), RedstonetesterUtils.RedstoneTester::new).setLoc1(block.getLocation());
|
|
||||||
RedstonetesterUtils.sendLocation(event.getPlayer(), "POS1", block.getLocation());
|
|
||||||
break;
|
|
||||||
case RIGHT_CLICK_BLOCK:
|
|
||||||
if (!RedstonetesterUtils.validBlock(event.getPlayer(), Objects.requireNonNull(block).getBlockData())) return;
|
|
||||||
RedstonetesterUtils.getPlayerMap().computeIfAbsent(event.getPlayer(), RedstonetesterUtils.RedstoneTester::new).setLoc2(block.getLocation());
|
|
||||||
RedstonetesterUtils.sendLocation(event.getPlayer(), "POS2", block.getLocation());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
|
||||||
RedstonetesterUtils.getPlayerMap().remove(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPistonExtend(BlockPistonExtendEvent e) {
|
|
||||||
RedstonetesterUtils.getPlayerMap().forEach((player, redstoneTester) -> redstoneTester.activate(e.getBlock().getLocation()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPistonRetract(BlockPistonRetractEvent e) {
|
|
||||||
RedstonetesterUtils.getPlayerMap().forEach((player, redstoneTester) -> redstoneTester.activate(e.getBlock().getLocation()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onRedstoneEvent(BlockRedstoneEvent e) {
|
|
||||||
RedstonetesterUtils.getPlayerMap().forEach((player, redstoneTester) -> redstoneTester.activate(e.getBlock().getLocation()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onBlockDispense(BlockDispenseEvent e) {
|
|
||||||
RedstonetesterUtils.getPlayerMap().forEach((player, redstoneTester) -> redstoneTester.activate(e.getBlock().getLocation()));
|
|
||||||
}
|
|
||||||
}
|
|
@ -27,6 +27,7 @@ import de.steamwar.bausystem.region.flags.Flag;
|
|||||||
import de.steamwar.bausystem.region.flags.flagvalues.ColorMode;
|
import de.steamwar.bausystem.region.flags.flagvalues.ColorMode;
|
||||||
import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
import de.steamwar.bausystem.region.utils.RegionExtensionType;
|
||||||
import de.steamwar.bausystem.region.utils.RegionType;
|
import de.steamwar.bausystem.region.utils.RegionType;
|
||||||
|
import de.steamwar.bausystem.utils.PasteBuilder;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.command.TypeValidator;
|
import de.steamwar.command.TypeValidator;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
@ -64,10 +65,14 @@ public class ColorCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
region.set(Flag.COLOR, color);
|
region.set(Flag.COLOR, color);
|
||||||
try {
|
try {
|
||||||
region.reset(null, RegionType.NORMAL, RegionExtensionType.NORMAL, true, true);
|
PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getResetFile(RegionType.NORMAL)))
|
||||||
|
.ignoreAir(true)
|
||||||
|
.onlyColors(true)
|
||||||
|
.color(color.getColor());
|
||||||
|
region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL);
|
||||||
RegionUtils.message(region, "REGION_REGION_COLORED");
|
RegionUtils.message(region, "REGION_REGION_COLORED");
|
||||||
RegionUtils.message(region, "REGION_REGION_COLORED_FAILED");
|
RegionUtils.message(region, "REGION_REGION_COLORED_FAILED");
|
||||||
} catch (IOException e) {
|
} catch (SecurityException e) {
|
||||||
BauSystem.MESSAGE.send("REGION_REGION_FAILED_COLORED", p);
|
BauSystem.MESSAGE.send("REGION_REGION_FAILED_COLORED", p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,7 +85,7 @@ public class ColorCommand extends SWCommand {
|
|||||||
@ClassValidator(value = Player.class, local = true)
|
@ClassValidator(value = Player.class, local = true)
|
||||||
public TypeValidator<Player> validator() {
|
public TypeValidator<Player> validator() {
|
||||||
return (commandSender, player, messageSender) -> {
|
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() {
|
private String getEnableMessage() {
|
||||||
return "REGION_FIRE_ENABLED";
|
return "REGION_FIRE_ENABLED";
|
||||||
}
|
}
|
||||||
@ -69,11 +65,4 @@ public class FireCommand extends SWCommand {
|
|||||||
return false;
|
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(){
|
private String getEnableMessage(){
|
||||||
return "REGION_FREEZE_ENABLED";
|
return "REGION_FREEZE_ENABLED";
|
||||||
}
|
}
|
||||||
@ -69,11 +65,4 @@ public class FreezeCommand extends SWCommand {
|
|||||||
return true;
|
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());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -42,11 +42,6 @@ public class ItemsCommand extends SWCommand {
|
|||||||
@Register(description = "REGION_ITEMS_HELP")
|
@Register(description = "REGION_ITEMS_HELP")
|
||||||
public void toggleCommand(@Validator Player p) {
|
public void toggleCommand(@Validator Player p) {
|
||||||
Region region = Region.getRegion(p.getLocation());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if (region != GlobalRegion.getInstance() && GlobalRegion.getInstance().getPlain(Flag.ITEMS, ItemMode.class) == ItemMode.INACTIVE) {
|
|
||||||
RegionUtils.actionBar(region, "REGION_ITEMS_DISABLED_GLOBAL");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (toggle(region)) {
|
if (toggle(region)) {
|
||||||
RegionUtils.actionBar(region, getEnableMessage());
|
RegionUtils.actionBar(region, getEnableMessage());
|
||||||
} else {
|
} else {
|
||||||
@ -54,10 +49,6 @@ public class ItemsCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getNoPermMessage() {
|
|
||||||
return "REGION_ITEMS_NO_PERMS";
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getEnableMessage(){
|
private String getEnableMessage(){
|
||||||
return "REGION_ITEMS_ENABLED";
|
return "REGION_ITEMS_ENABLED";
|
||||||
}
|
}
|
||||||
@ -77,11 +68,4 @@ public class ItemsCommand extends SWCommand {
|
|||||||
return true;
|
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());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2024 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bausystem.features.region;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.region.Region;
|
||||||
|
import de.steamwar.bausystem.region.RegionUtils;
|
||||||
|
import de.steamwar.bausystem.region.flags.Flag;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.NoGravityMode;
|
||||||
|
import de.steamwar.command.SWCommand;
|
||||||
|
import de.steamwar.linkage.Linked;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
@Linked
|
||||||
|
public class NoGravityCommand extends SWCommand {
|
||||||
|
|
||||||
|
public NoGravityCommand() {
|
||||||
|
super("nogravity");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Register(description = "REGION_NO_GRAVITY_HELP")
|
||||||
|
public void toggleCommand(@Validator Player p) {
|
||||||
|
Region region = Region.getRegion(p.getLocation());
|
||||||
|
if (toggle(region)) {
|
||||||
|
RegionUtils.actionBar(region, getEnableMessage());
|
||||||
|
} else {
|
||||||
|
RegionUtils.actionBar(region, getDisableMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEnableMessage() {
|
||||||
|
return "REGION_NO_GRAVITY_ENABLED";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDisableMessage() {
|
||||||
|
return "REGION_NO_GRAVITY_DISABLED";
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean toggle(Region region) {
|
||||||
|
switch (region.getPlain(Flag.NO_GRAVITY, NoGravityMode.class)) {
|
||||||
|
case ACTIVE:
|
||||||
|
region.set(Flag.NO_GRAVITY, NoGravityMode.INACTIVE);
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
case INACTIVE:
|
||||||
|
region.set(Flag.NO_GRAVITY, NoGravityMode.ACTIVE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2024 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bausystem.features.region;
|
||||||
|
|
||||||
|
import de.steamwar.bausystem.BauSystem;
|
||||||
|
import de.steamwar.bausystem.region.Region;
|
||||||
|
import de.steamwar.bausystem.region.flags.Flag;
|
||||||
|
import de.steamwar.bausystem.region.flags.flagvalues.NoGravityMode;
|
||||||
|
import de.steamwar.bausystem.utils.ScoreboardElement;
|
||||||
|
import de.steamwar.linkage.Linked;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||||
|
|
||||||
|
@Linked
|
||||||
|
public class NoGravityListener implements Listener, ScoreboardElement {
|
||||||
|
|
||||||
|
private static NoGravityMode getMode(Region region) {
|
||||||
|
return region.getPlain(Flag.NO_GRAVITY, NoGravityMode.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onEntitySpawn(EntitySpawnEvent event) {
|
||||||
|
if (event.getEntityType() == EntityType.PLAYER) return;
|
||||||
|
if (getMode(Region.getRegion(event.getLocation())) == NoGravityMode.ACTIVE) {
|
||||||
|
event.getEntity().setGravity(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ScoreboardGroup getGroup() {
|
||||||
|
return ScoreboardGroup.REGION;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int order() {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get(Region region, Player p) {
|
||||||
|
if (region.get(Flag.NO_GRAVITY) == Flag.NO_GRAVITY.getDefaultValue()) return null;
|
||||||
|
return "§e" + BauSystem.MESSAGE.parse(Flag.NO_GRAVITY.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.NO_GRAVITY).getChatValue(), p);
|
||||||
|
}
|
||||||
|
}
|
@ -54,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) {
|
private Region regionCheck(Player player) {
|
||||||
Region region = Region.getRegion(player.getLocation());
|
Region region = Region.getRegion(player.getLocation());
|
||||||
if (region.getFloorLevel() == 0) {
|
if (region.getFloorLevel() == 0) {
|
||||||
|
@ -19,28 +19,39 @@
|
|||||||
|
|
||||||
package de.steamwar.bausystem.features.region;
|
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.BauSystem;
|
||||||
import de.steamwar.bausystem.Permission;
|
|
||||||
import de.steamwar.bausystem.features.util.SelectCommand;
|
import de.steamwar.bausystem.features.util.SelectCommand;
|
||||||
|
import de.steamwar.bausystem.region.Point;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.region.RegionUtils;
|
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.RegionExtensionType;
|
||||||
import de.steamwar.bausystem.region.utils.RegionType;
|
import de.steamwar.bausystem.region.utils.RegionType;
|
||||||
import de.steamwar.bausystem.worlddata.WorldData;
|
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.PreviousArguments;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.command.TypeMapper;
|
import de.steamwar.command.TypeMapper;
|
||||||
import de.steamwar.command.TypeValidator;
|
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
import de.steamwar.linkage.LinkedInstance;
|
import de.steamwar.linkage.LinkedInstance;
|
||||||
import de.steamwar.sql.SchematicNode;
|
import de.steamwar.sql.SchematicNode;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -68,7 +79,7 @@ public class RegionCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "undo", description = "REGION_REGION_HELP_UNDO")
|
@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());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if (checkGlobalRegion(region, p)) return;
|
if (checkGlobalRegion(region, p)) return;
|
||||||
|
|
||||||
@ -80,7 +91,7 @@ public class RegionCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "redo", description = "REGION_REGION_HELP_REDO")
|
@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());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if (checkGlobalRegion(region, p)) {
|
if (checkGlobalRegion(region, p)) {
|
||||||
return;
|
return;
|
||||||
@ -94,21 +105,24 @@ public class RegionCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "restore", description = "REGION_REGION_HELP_RESTORE")
|
@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());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if(checkGlobalRegion(region, p)) return;
|
if(checkGlobalRegion(region, p)) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
region.reset(null, RegionType.NORMAL, RegionExtensionType.NORMAL, true, false);
|
PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getResetFile(RegionType.NORMAL)))
|
||||||
|
.ignoreAir(true)
|
||||||
|
.color(region.getPlain(Flag.COLOR, ColorMode.class).getColor());
|
||||||
|
region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL);
|
||||||
RegionUtils.message(region, "REGION_REGION_RESTORED");
|
RegionUtils.message(region, "REGION_REGION_RESTORED");
|
||||||
} catch (IOException e) {
|
} catch (SecurityException e) {
|
||||||
BauSystem.MESSAGE.send("REGION_REGION_FAILED_RESTORE", p);
|
BauSystem.MESSAGE.send("REGION_REGION_FAILED_RESTORE", p);
|
||||||
Bukkit.getLogger().log(Level.WARNING, "Failed restore", e);
|
Bukkit.getLogger().log(Level.WARNING, "Failed restore", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "restore", description = "REGION_REGION_HELP_RESTORE_SCHEMATIC")
|
@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());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if (checkGlobalRegion(region, p)) return;
|
if (checkGlobalRegion(region, p)) return;
|
||||||
|
|
||||||
@ -118,9 +132,12 @@ public class RegionCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
region.reset(node, RegionType.NORMAL, RegionExtensionType.NORMAL, true);
|
PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.SchematicProvider(node))
|
||||||
|
.ignoreAir(true)
|
||||||
|
.color(region.getPlain(Flag.COLOR, ColorMode.class).getColor());
|
||||||
|
region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL);
|
||||||
RegionUtils.message(region, "REGION_REGION_RESTORED");
|
RegionUtils.message(region, "REGION_REGION_RESTORED");
|
||||||
} catch (IOException e) {
|
} catch (SecurityException e) {
|
||||||
BauSystem.MESSAGE.send("REGION_REGION_FAILED_RESTORE", p);
|
BauSystem.MESSAGE.send("REGION_REGION_FAILED_RESTORE", p);
|
||||||
Bukkit.getLogger().log(Level.WARNING, "Failed restore", e);
|
Bukkit.getLogger().log(Level.WARNING, "Failed restore", e);
|
||||||
}
|
}
|
||||||
@ -163,7 +180,7 @@ public class RegionCommand extends SWCommand {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_INFO", p, region.getSkin());
|
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_INFO", p, region.getSkin());
|
||||||
String creator = region.getPrototype().getSkins().get(region.getSkin()).getCreator();
|
String creator = region.getPrototype().getSkinMap().get(region.getSkin()).getCreator();
|
||||||
if (creator != null) {
|
if (creator != null) {
|
||||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_INFO_CREATOR", p, creator);
|
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_INFO_CREATOR", p, creator);
|
||||||
}
|
}
|
||||||
@ -171,16 +188,15 @@ public class RegionCommand extends SWCommand {
|
|||||||
|
|
||||||
@Register(value = "changeskin", description = "REGION_REGION_HELP_CHANGESKIN")
|
@Register(value = "changeskin", description = "REGION_REGION_HELP_CHANGESKIN")
|
||||||
@Register("skin")
|
@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());
|
Region region = Region.getRegion(p.getLocation());
|
||||||
if (checkGlobalRegion(region, p)) {
|
if (checkGlobalRegion(region, p)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!region.getPrototype().getSkins().containsKey(s)) {
|
if (!region.getPrototype().getSkinMap().containsKey(s)) {
|
||||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_UNKNOWN", p);
|
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_UNKNOWN", p);
|
||||||
} else {
|
} else {
|
||||||
if (region.setSkin(s)) {
|
if (region.setSkin(s)) {
|
||||||
WorldData.getInstance().save();
|
|
||||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_CHANGE", p, s);
|
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_CHANGE", p, s);
|
||||||
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_CHANGE_UPDATE", p, BauSystem.MESSAGE.parse("REGION_REGION_CHANGESKIN_CHANGE_UPDATE_HOVER", p), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/reset"));
|
BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_CHANGE_UPDATE", p, BauSystem.MESSAGE.parse("REGION_REGION_CHANGESKIN_CHANGE_UPDATE_HOVER", p), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/reset"));
|
||||||
} else {
|
} else {
|
||||||
@ -189,6 +205,106 @@ public class RegionCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Register(value = "copy", description = "REGION_REGION_HELP_COPY")
|
||||||
|
public void copyCommand(@Validator Player p, @OptionalValue("") @StaticValue(value = {"", "-e", "-s"}, allowISE = true) int option) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
@Mapper(value = "skinTypeMapper", local = true)
|
||||||
private TypeMapper<String> skinTypeMapper() {
|
private TypeMapper<String> skinTypeMapper() {
|
||||||
return new TypeMapper<String>() {
|
return new TypeMapper<String>() {
|
||||||
@ -199,7 +315,7 @@ public class RegionCommand extends SWCommand {
|
|||||||
if (region.isGlobal()) {
|
if (region.isGlobal()) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
return region.getPrototype().getSkins().keySet().stream().map(c -> c.replace(' ', '_')).collect(Collectors.toList());
|
return region.getPrototype().getSkinMap().keySet().stream().map(c -> c.replace(' ', '_')).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -208,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");
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -21,14 +21,22 @@ package de.steamwar.bausystem.features.region;
|
|||||||
|
|
||||||
import de.steamwar.bausystem.BauSystem;
|
import de.steamwar.bausystem.BauSystem;
|
||||||
import de.steamwar.bausystem.Permission;
|
import de.steamwar.bausystem.Permission;
|
||||||
|
import de.steamwar.bausystem.config.BauServer;
|
||||||
import de.steamwar.bausystem.region.GlobalRegion;
|
import de.steamwar.bausystem.region.GlobalRegion;
|
||||||
import de.steamwar.bausystem.region.Region;
|
import de.steamwar.bausystem.region.Region;
|
||||||
import de.steamwar.bausystem.region.RegionUtils;
|
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.region.utils.RegionType;
|
||||||
|
import de.steamwar.bausystem.utils.PasteBuilder;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.command.SWCommand;
|
||||||
import de.steamwar.command.TypeValidator;
|
import de.steamwar.command.TypeValidator;
|
||||||
import de.steamwar.linkage.Linked;
|
import de.steamwar.linkage.Linked;
|
||||||
|
import de.steamwar.linkage.LinkedInstance;
|
||||||
|
import de.steamwar.sql.Punishment;
|
||||||
import de.steamwar.sql.SchematicNode;
|
import de.steamwar.sql.SchematicNode;
|
||||||
|
import de.steamwar.sql.SteamwarUser;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@ -38,6 +46,9 @@ import java.util.logging.Level;
|
|||||||
@Linked
|
@Linked
|
||||||
public class ResetCommand extends SWCommand {
|
public class ResetCommand extends SWCommand {
|
||||||
|
|
||||||
|
@LinkedInstance
|
||||||
|
public BauServer bauServer;
|
||||||
|
|
||||||
public ResetCommand() {
|
public ResetCommand() {
|
||||||
super("reset");
|
super("reset");
|
||||||
}
|
}
|
||||||
@ -47,9 +58,11 @@ public class ResetCommand extends SWCommand {
|
|||||||
Region region = regionCheck(p);
|
Region region = regionCheck(p);
|
||||||
if (region == null) return;
|
if (region == null) return;
|
||||||
try {
|
try {
|
||||||
region.reset(null, RegionType.NORMAL);
|
PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getResetFile(RegionType.NORMAL)))
|
||||||
|
.color(region.getPlain(Flag.COLOR, ColorMode.class).getColor());
|
||||||
|
region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL);
|
||||||
RegionUtils.message(region, "REGION_RESET_RESETED");
|
RegionUtils.message(region, "REGION_RESET_RESETED");
|
||||||
} catch (IOException e) {
|
} catch (SecurityException e) {
|
||||||
BauSystem.MESSAGE.send("REGION_RESET_ERROR", p);
|
BauSystem.MESSAGE.send("REGION_RESET_ERROR", p);
|
||||||
Bukkit.getLogger().log(Level.WARNING, "Failed testblock", e);
|
Bukkit.getLogger().log(Level.WARNING, "Failed testblock", e);
|
||||||
}
|
}
|
||||||
@ -59,26 +72,31 @@ public class ResetCommand extends SWCommand {
|
|||||||
public void schematicResetCommand(@Validator Player p, SchematicNode node) {
|
public void schematicResetCommand(@Validator Player p, SchematicNode node) {
|
||||||
Region region = regionCheck(p);
|
Region region = regionCheck(p);
|
||||||
if (region == null) return;
|
if (region == null) return;
|
||||||
|
|
||||||
|
if (!p.getUniqueId().equals(bauServer.getOwner())) {
|
||||||
|
if (Punishment.isPunished(SteamwarUser.get(bauServer.getOwner()), Punishment.PunishmentType.NoSchemReceiving, punishment -> BauSystem.MESSAGE.send("REGION_TB_NO_SCHEMRECEIVING", p, punishment.getEndTime()))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Punishment.isPunished(SteamwarUser.get(p.getUniqueId()), Punishment.PunishmentType.NoSchemSharing, punishment -> BauSystem.MESSAGE.send("REGION_TB_NO_SCHEMSHARING", p, punishment.getEndTime()))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (node.isDir()) {
|
if (node.isDir()) {
|
||||||
BauSystem.MESSAGE.send("ONLY_SCHEMS", p);
|
BauSystem.MESSAGE.send("ONLY_SCHEMS", p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
region.reset(node, RegionType.NORMAL);
|
PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.SchematicProvider(node))
|
||||||
|
.color(region.getPlain(Flag.COLOR, ColorMode.class).getColor());
|
||||||
|
region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL);
|
||||||
RegionUtils.message(region, "REGION_RESET_RESETED");
|
RegionUtils.message(region, "REGION_RESET_RESETED");
|
||||||
} catch (IOException e) {
|
} catch (SecurityException e) {
|
||||||
BauSystem.MESSAGE.send("REGION_RESET_ERROR", p);
|
BauSystem.MESSAGE.send("REGION_RESET_ERROR", p);
|
||||||
Bukkit.getLogger().log(Level.WARNING, "Failed reset", e);
|
Bukkit.getLogger().log(Level.WARNING, "Failed reset", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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) {
|
private Region regionCheck(Player player) {
|
||||||
Region region = Region.getRegion(player.getLocation());
|
Region region = Region.getRegion(player.getLocation());
|
||||||
if (region == GlobalRegion.getInstance()) {
|
if (region == GlobalRegion.getInstance()) {
|
||||||
|
Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen
In neuem Issue referenzieren
Einen Benutzer sperren