diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 01ee3d7..524b957 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -28,4 +28,9 @@ jobs:
distribution: 'temurin'
cache: maven
- name: Build with Maven
- run: mvn -B package --file pom.xml
\ No newline at end of file
+ run: mvn -B package --file pom.xml
+ - name: Upload JAR
+ uses: actions/upload-artifact@v4
+ with:
+ name: DebugStickPro
+ path: target/*.jar
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 5173ef8..2771dee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,23 +83,23 @@
codemc-snapshots
https://repo.codemc.io/repository/maven-snapshots/
-
- evoke-snapshots
- EvokeGames Maven
- https://maven.evokegames.gg/snapshots
-
twme-repo-releases
TWME Repository
https://repo.twme.dev/releases
+
+ twme-repo-snapshots
+ TWME Repository
+ https://repo.twme.dev/snapshots
+
io.papermc.paper
paper-api
- 1.21.8-R0.1-SNAPSHOT
+ 1.21.10-R0.1-SNAPSHOT
provided
@@ -121,9 +121,9 @@
compile
- me.tofaa.entitylib
+ io.github.tofaa2
spigot
- +598d71f-SNAPSHOT
+ +eba7ada-SNAPSHOT
dev.twme
diff --git a/src/main/java/dev/twme/debugstickpro/blockdatautil/BlockDataSeparater.java b/src/main/java/dev/twme/debugstickpro/blockdatautil/BlockDataSeparater.java
index fb778e8..d37e40b 100644
--- a/src/main/java/dev/twme/debugstickpro/blockdatautil/BlockDataSeparater.java
+++ b/src/main/java/dev/twme/debugstickpro/blockdatautil/BlockDataSeparater.java
@@ -771,6 +771,37 @@ public static ArrayList separate(BlockData blockData) {
blockDataList.add(waterlogged);
}
+ // 1.21.9
+ if (isValidMaterial("copper_chain")) {
+ if (blockData instanceof CopperGolemStatue) {
+ SubBlockData copperGolemStatuePose = new CopperGolemStatuePoseData(blockData);
+ blockDataList.add(copperGolemStatuePose);
+ }
+ if (blockData instanceof SideChaining) {
+ SubBlockData sideChaining = new SideChainingData(blockData);
+ blockDataList.add(sideChaining);
+ }
+ }
+
+ if (isValidMaterial("leaf_litter")) {
+ if (blockData instanceof Segmentable) {
+ SubBlockData segmentable = new SegmentableData(blockData);
+ blockDataList.add(segmentable);
+ }
+
+ if (blockData instanceof TestBlock) {
+ SubBlockData testBlock = new TestBlockData(blockData);
+ blockDataList.add(testBlock);
+ }
+ }
+
+ if (isValidMaterial("dried_ghast")) {
+ if (blockData instanceof DriedGhast) {
+ SubBlockData driedGhastState = new DriedGhastHydrationData(blockData);
+ blockDataList.add(driedGhastState);
+ }
+ }
+
blockDataList = filterSubBlockData(blockDataList);
cache.put(blockData.getMaterial(), blockDataList);
diff --git a/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/CopperGolemStatuePoseData.java b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/CopperGolemStatuePoseData.java
new file mode 100644
index 0000000..bf4506e
--- /dev/null
+++ b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/CopperGolemStatuePoseData.java
@@ -0,0 +1,66 @@
+package dev.twme.debugstickpro.blockdatautil.subdata;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.type.CopperGolemStatue;
+
+import dev.twme.debugstickpro.blockdatautil.SubBlockData;
+import dev.twme.debugstickpro.localization.Lang;
+
+public class CopperGolemStatuePoseData extends SubBlockData {
+ private CopperGolemStatue.Pose pose;
+
+ public CopperGolemStatuePoseData(BlockData blockData) {
+ this.blockData = blockData;
+ this.pose = ((CopperGolemStatue) blockData).getCopperGolemPose();
+ }
+
+ @Override
+ public String dataName() {
+ return Lang.DataKeyName.CopperGolemStatuePoseDataName;
+ }
+
+ @Override
+ public String getDataAsString() {
+ return pose.name();
+ }
+
+ @Override
+ public SubBlockData nextData() {
+ CopperGolemStatue copperGolemStatue = ((CopperGolemStatue) blockData);
+ List poses = Arrays.stream(CopperGolemStatue.Pose.values()).toList();
+ if (poses.indexOf(pose) == poses.size() - 1) {
+ pose = poses.getFirst();
+ } else {
+ pose = poses.get(poses.indexOf(pose) + 1);
+ }
+ copperGolemStatue.setCopperGolemPose(pose);
+ return this;
+ }
+
+ @Override
+ public SubBlockData previousData() {
+ CopperGolemStatue copperGolemStatue = ((CopperGolemStatue) blockData);
+ List poses = Arrays.stream(CopperGolemStatue.Pose.values()).toList();
+ if (poses.indexOf(pose) == 0) {
+ pose = poses.getLast();
+ } else {
+ pose = poses.get(poses.indexOf(pose) - 1);
+ }
+ copperGolemStatue.setCopperGolemPose(pose);
+ return this;
+ }
+
+ @Override
+ public BlockData copyTo(BlockData blockData) {
+ ((CopperGolemStatue) blockData).setCopperGolemPose(pose);
+ return blockData;
+ }
+
+ @Override
+ public SubBlockData fromBlockData(BlockData blockData) {
+ return new CopperGolemStatuePoseData(blockData);
+ }
+}
diff --git a/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/DriedGhastHydrationData.java b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/DriedGhastHydrationData.java
new file mode 100644
index 0000000..007cc3f
--- /dev/null
+++ b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/DriedGhastHydrationData.java
@@ -0,0 +1,61 @@
+package dev.twme.debugstickpro.blockdatautil.subdata;
+
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.type.DriedGhast;
+
+import dev.twme.debugstickpro.blockdatautil.SubBlockData;
+import dev.twme.debugstickpro.localization.Lang;
+
+public class DriedGhastHydrationData extends SubBlockData {
+ private int hydration;
+
+ public DriedGhastHydrationData(BlockData blockData) {
+ this.blockData = blockData;
+ this.hydration = ((DriedGhast) blockData).getHydration();
+ }
+
+ @Override
+ public String dataName() {
+ return Lang.DataKeyName.DriedGhastHydrationDataName;
+ }
+
+ @Override
+ public String getDataAsString() {
+ return String.valueOf(hydration);
+ }
+
+ @Override
+ public SubBlockData nextData() {
+ DriedGhast driedGhast = ((DriedGhast) blockData);
+ if (hydration >= driedGhast.getMaximumHydration()) {
+ hydration = 0;
+ } else {
+ hydration++;
+ }
+ driedGhast.setHydration(hydration);
+ return this;
+ }
+
+ @Override
+ public SubBlockData previousData() {
+ DriedGhast driedGhast = ((DriedGhast) blockData);
+ if (hydration <= 0) {
+ hydration = driedGhast.getMaximumHydration();
+ } else {
+ hydration--;
+ }
+ driedGhast.setHydration(hydration);
+ return this;
+ }
+
+ @Override
+ public BlockData copyTo(BlockData blockData) {
+ ((DriedGhast) blockData).setHydration(hydration);
+ return blockData;
+ }
+
+ @Override
+ public SubBlockData fromBlockData(BlockData blockData) {
+ return new DriedGhastHydrationData(blockData);
+ }
+}
diff --git a/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/SegmentableData.java b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/SegmentableData.java
new file mode 100644
index 0000000..cf4a6e7
--- /dev/null
+++ b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/SegmentableData.java
@@ -0,0 +1,61 @@
+package dev.twme.debugstickpro.blockdatautil.subdata;
+
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.Segmentable;
+
+import dev.twme.debugstickpro.blockdatautil.SubBlockData;
+import dev.twme.debugstickpro.localization.Lang;
+
+public class SegmentableData extends SubBlockData {
+ private int segmentAmount;
+
+ public SegmentableData(BlockData blockData) {
+ this.blockData = blockData;
+ this.segmentAmount = ((Segmentable) blockData).getSegmentAmount();
+ }
+
+ @Override
+ public String dataName() {
+ return Lang.DataKeyName.SegmentableDataName;
+ }
+
+ @Override
+ public String getDataAsString() {
+ return String.valueOf(segmentAmount);
+ }
+
+ @Override
+ public SubBlockData nextData() {
+ Segmentable segmentable = ((Segmentable) blockData);
+ if (segmentAmount >= segmentable.getMaximumSegmentAmount()) {
+ segmentAmount = segmentable.getMinimumSegmentAmount();
+ } else {
+ segmentAmount++;
+ }
+ segmentable.setSegmentAmount(segmentAmount);
+ return this;
+ }
+
+ @Override
+ public SubBlockData previousData() {
+ Segmentable segmentable = ((Segmentable) blockData);
+ if (segmentAmount <= segmentable.getMinimumSegmentAmount()) {
+ segmentAmount = segmentable.getMaximumSegmentAmount();
+ } else {
+ segmentAmount--;
+ }
+ segmentable.setSegmentAmount(segmentAmount);
+ return this;
+ }
+
+ @Override
+ public BlockData copyTo(BlockData blockData) {
+ ((Segmentable) blockData).setSegmentAmount(segmentAmount);
+ return blockData;
+ }
+
+ @Override
+ public SubBlockData fromBlockData(BlockData blockData) {
+ return new SegmentableData(blockData);
+ }
+}
diff --git a/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/SideChainingData.java b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/SideChainingData.java
new file mode 100644
index 0000000..1d69914
--- /dev/null
+++ b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/SideChainingData.java
@@ -0,0 +1,66 @@
+package dev.twme.debugstickpro.blockdatautil.subdata;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.SideChaining;
+
+import dev.twme.debugstickpro.blockdatautil.SubBlockData;
+import dev.twme.debugstickpro.localization.Lang;
+
+public class SideChainingData extends SubBlockData {
+ private SideChaining.ChainPart chainPart;
+
+ public SideChainingData(BlockData blockData) {
+ this.blockData = blockData;
+ this.chainPart = ((SideChaining) blockData).getSideChain();
+ }
+
+ @Override
+ public String dataName() {
+ return Lang.DataKeyName.SideChainingDataName;
+ }
+
+ @Override
+ public String getDataAsString() {
+ return chainPart.name();
+ }
+
+ @Override
+ public SubBlockData nextData() {
+ List chainParts = Arrays.asList(SideChaining.ChainPart.values());
+ int index = chainParts.indexOf(chainPart);
+ if (index >= chainParts.size() - 1) {
+ ((SideChaining) blockData).setSideChain(chainParts.getFirst());
+ } else {
+ ((SideChaining) blockData).setSideChain(chainParts.get(index + 1));
+ }
+ this.chainPart = ((SideChaining) blockData).getSideChain();
+ return this;
+ }
+
+ @Override
+ public SubBlockData previousData() {
+ List chainParts = Arrays.asList(SideChaining.ChainPart.values());
+ int index = chainParts.indexOf(chainPart);
+ if (index <= 0) {
+ ((SideChaining) blockData).setSideChain(chainParts.getLast());
+ } else {
+ ((SideChaining) blockData).setSideChain(chainParts.get(index - 1));
+ }
+ this.chainPart = ((SideChaining) blockData).getSideChain();
+ return this;
+ }
+
+ @Override
+ public BlockData copyTo(BlockData blockData) {
+ ((SideChaining) blockData).setSideChain(chainPart);
+ return blockData;
+ }
+
+ @Override
+ public SubBlockData fromBlockData(BlockData blockData) {
+ return new SideChainingData(blockData);
+ }
+}
diff --git a/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/TestBlockData.java b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/TestBlockData.java
new file mode 100644
index 0000000..7c2c9f0
--- /dev/null
+++ b/src/main/java/dev/twme/debugstickpro/blockdatautil/subdata/TestBlockData.java
@@ -0,0 +1,63 @@
+package dev.twme.debugstickpro.blockdatautil.subdata;
+
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.type.TestBlock;
+
+import dev.twme.debugstickpro.blockdatautil.SubBlockData;
+import dev.twme.debugstickpro.localization.Lang;
+
+public class TestBlockData extends SubBlockData {
+ private TestBlock.Mode mode;
+
+ public TestBlockData(BlockData blockData) {
+ this.blockData = blockData;
+ this.mode = ((TestBlock) blockData).getMode();
+ }
+
+ @Override
+ public String dataName() {
+ return Lang.DataKeyName.TestBlockDataName;
+ }
+
+ @Override
+ public String getDataAsString() {
+ return mode.name();
+ }
+
+ @Override
+ public SubBlockData nextData() {
+ TestBlock testBlock = ((TestBlock) blockData);
+ switch (mode) {
+ case START -> mode = TestBlock.Mode.LOG;
+ case LOG -> mode = TestBlock.Mode.FAIL;
+ case FAIL -> mode = TestBlock.Mode.ACCEPT;
+ case ACCEPT -> mode = TestBlock.Mode.START;
+ }
+ testBlock.setMode(mode);
+ return this;
+ }
+
+ @Override
+ public SubBlockData previousData() {
+ TestBlock testBlock = ((TestBlock) blockData);
+ switch (mode) {
+ case LOG -> mode = TestBlock.Mode.START;
+ case FAIL -> mode = TestBlock.Mode.LOG;
+ case ACCEPT -> mode = TestBlock.Mode.FAIL;
+ case START -> mode = TestBlock.Mode.ACCEPT;
+ }
+ testBlock.setMode(mode);
+ return this;
+ }
+
+ @Override
+ public BlockData copyTo(BlockData blockData) {
+ ((TestBlock) blockData).setMode(mode);
+ return blockData;
+ }
+
+ @Override
+ public SubBlockData fromBlockData(BlockData blockData) {
+ return new TestBlockData(blockData);
+ }
+}
diff --git a/src/main/java/dev/twme/debugstickpro/localization/Lang.java b/src/main/java/dev/twme/debugstickpro/localization/Lang.java
index 92d01fc..fa83dc3 100644
--- a/src/main/java/dev/twme/debugstickpro/localization/Lang.java
+++ b/src/main/java/dev/twme/debugstickpro/localization/Lang.java
@@ -89,6 +89,7 @@ public final static class DataKeyName {
public final static String ChiseledBookshelfSlot_5DataName = "DataKeyName.ChiseledBookshelfSlot_5DataName";
public final static String CommandBlockDataName = "DataKeyName.CommandBlockDataName";
public final static String ComparatorDataName = "DataKeyName.ComparatorDataName";
+ public final static String CopperGolemStatuePoseDataName = "DataKeyName.CopperGolemStatuePoseDataName";
public final static String CrafterCraftingDataName = "DataKeyName.CrafterCraftingDataName";
public final static String CrafterOrientationDataName = "DataKeyName.CrafterOrientationDataName";
public final static String CrafterTriggerDataName = "DataKeyName.CrafterTriggerDataName";
@@ -97,6 +98,7 @@ public final static class DataKeyName {
public final static String DaylightDetectorDataName = "DataKeyName.DaylightDetectorDataName";
public final static String DirectionalDataName = "DataKeyName.DirectionalDataName";
public final static String DispenserDataName = "DataKeyName.DispenserDataName";
+ public final static String DriedGhastHydrationDataName = "DataKeyName.DriedGhastHydrationDataName";
public final static String DoorDataName = "DataKeyName.DoorDataName";
public final static String EndPortalFrameDataName = "DataKeyName.EndPortalFrameDataName";
public final static String FaceAttachableDataName = "DataKeyName.FaceAttachableDataName";
@@ -159,12 +161,15 @@ public final static class DataKeyName {
public final static String SculkShriekerCanSummonDataName = "DataKeyName.SculkShriekerCanSummonDataName";
public final static String SculkShriekerShriekingDataName = "DataKeyName.SculkShriekerShriekingDataName";
public final static String SeaPickleDataName = "DataKeyName.SeaPickleDataName";
+ public final static String SegmentableDataName = "DataKeyName.SegmentableDataName";
+ public final static String SideChainingDataName = "DataKeyName.SideChainingDataName";
public final static String SlabDataName = "DataKeyName.SlabDataName";
public final static String SnowableDataName = "DataKeyName.SnowableDataName";
public final static String SnowDataName = "DataKeyName.SnowDataName";
public final static String StairsDataName = "DataKeyName.StairsDataName";
public final static String StructureBlockDataName = "DataKeyName.StructureBlockDataName";
public final static String TechnicalPistonDataName = "DataKeyName.TechnicalPistonDataName";
+ public final static String TestBlockDataName = "DataKeyName.TestBlockDataName";
public final static String TNTDataName = "DataKeyName.TNTDataName";
public final static String TrialSpawnerDataName = "DataKeyName.TrialSpawnerDataName";
public final static String TripwireDataName = "DataKeyName.TripwireDataName";
diff --git a/src/main/resources/lang/en_US.yml b/src/main/resources/lang/en_US.yml
index a020c85..bcd1b4a 100644
--- a/src/main/resources/lang/en_US.yml
+++ b/src/main/resources/lang/en_US.yml
@@ -60,6 +60,7 @@ DataKeyName:
ChiseledBookshelfSlot_5DataName: "Slot 5"
CommandBlockDataName: "Conditional"
ComparatorDataName: "Mode"
+ CopperGolemStatuePoseDataName: "Pose"
CrafterCraftingDataName: "Type"
CrafterOrientationDataName: "Crafter Orientation"
CrafterTriggerDataName: "Triggered"
@@ -69,6 +70,7 @@ DataKeyName:
DirectionalDataName: "Direction"
DispenserDataName: "Triggered"
DoorDataName: "Door Hinge"
+ DriedGhastHydrationDataName: "Hydration"
EndPortalFrameDataName: "Eye"
FaceAttachableDataName: "Attached Face"
FarmlandDataName: "Moisture"
@@ -129,12 +131,15 @@ DataKeyName:
SculkShriekerCanSummonDataName: "Summoning"
SculkShriekerShriekingDataName: "Shrieking"
SeaPickleDataName: "Pickles"
+ SegmentableDataName: "Segment Amount"
+ SideChainingDataName: "Side Chain"
SlabDataName: "Type"
SnowableDataName: "Snowy"
SnowDataName: "Layers"
StairsDataName: "Shape"
StructureBlockDataName: "Mode"
TechnicalPistonDataName: "Type"
+ TestBlockDataName: "Mode"
TNTDataName: "Unstable"
TrialSpawnerDataName: "State"
TripwireDataName: "Disarmed"
diff --git a/src/main/resources/lang/zh_TW.yml b/src/main/resources/lang/zh_TW.yml
index 51924ab..3391166 100644
--- a/src/main/resources/lang/zh_TW.yml
+++ b/src/main/resources/lang/zh_TW.yml
@@ -61,6 +61,7 @@ DataKeyName:
ChiseledBookshelfSlot_5DataName: "Slot 5"
CommandBlockDataName: "Conditional"
ComparatorDataName: "Mode"
+ CopperGolemStatuePoseDataName: "Pose"
CrafterCraftingDataName: "Type"
CrafterOrientationDataName: "Crafter Orientation"
CrafterTriggerDataName: "Triggered"
@@ -70,6 +71,7 @@ DataKeyName:
DirectionalDataName: "Direction"
DispenserDataName: "Triggered"
DoorDataName: "Door Hinge"
+ DriedGhastHydrationDataName: "Hydration"
EndPortalFrameDataName: "Eye"
FaceAttachableDataName: "Attached Face"
FarmlandDataName: "Moisture"
@@ -130,12 +132,15 @@ DataKeyName:
SculkShriekerCanSummonDataName: "Summoning"
SculkShriekerShriekingDataName: "Shrieking"
SeaPickleDataName: "Pickles"
+ SegmentableDataName: "Segment Amount"
+ SideChainingDataName: "Side Chain"
SlabDataName: "Type"
SnowableDataName: "Snowy"
SnowDataName: "Layers"
StairsDataName: "Shape"
StructureBlockDataName: "Mode"
TechnicalPistonDataName: "Type"
+ TestBlockDataName: "Mode"
TNTDataName: "Unstable"
TrialSpawnerDataName: "State"
TripwireDataName: "Disarmed"