Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@
### Configuration File:
[config.yml](https://github.com/TWME-TW/DebugStickPro/blob/main/src/main/resources/config.yml)

`BlockDataFilter.AllowUnsafeBisectedData` is disabled by default to prevent invalid
double-block structures and duplicate drops. Enable it only when multi-block
`Bisected` properties are intentionally needed.

### Language File:
[lang](https://github.com/TWME-TW/DebugStickPro/tree/main/src/main/resources/lang)
### Permissions:
Expand Down
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,12 @@
<version>3.3.3+119e9e1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>

<distributionManagement>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/dev/twme/debugstickpro/DebugStickPro.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public final class DebugStickPro extends JavaPlugin {
/**
* This is the version of the plugin
*/
public static final int CONFIG_VERSION = 7;
public static final int CONFIG_VERSION = 8;

/**
* This is the version of the language file
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@
blockDataList.add(bigDripleafData);
}

if (blockData instanceof Bisected) {
if (isBisectedHalfSafeToModify(blockData)) {
SubBlockData bisectedData = new BisectedData(blockData);
blockDataList.add(bisectedData);
}
Expand Down Expand Up @@ -640,7 +640,7 @@

}
*/
if (blockData instanceof PointedDripstone) {

Check warning on line 643 in src/main/java/dev/twme/debugstickpro/blockdatautil/BlockDataSeparater.java

View workflow job for this annotation

GitHub Actions / build

org.bukkit.block.data.type.PointedDripstone in org.bukkit.block.data.type has been deprecated and marked for removal
SubBlockData pointedDripstoneThickness = new PointedDripstoneThicknessData(blockData);
blockDataList.add(pointedDripstoneThickness);
SubBlockData pointedDripstoneVerticalDirection = new PointedDripstoneVerticalDirectionData(blockData);
Expand Down Expand Up @@ -881,4 +881,16 @@

return cloneForBlockData(blockDataList, blockData);
}

static boolean isBisectedHalfSafeToModify(BlockData blockData) {
if (ConfigFile.BlockDataFilter.AllowUnsafeBisectedData) {
return blockData instanceof Bisected;
}

// Stairs and trapdoors use half as a single-block placement property. Other
// Bisected blocks depend on a matching block above or below; exposing half
// lets one side become a second bottom half and duplicate its drops.
return blockData instanceof Bisected
&& (blockData instanceof Stairs || blockData instanceof TrapDoor);
}
}
2 changes: 2 additions & 0 deletions src/main/java/dev/twme/debugstickpro/config/ConfigFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ public static class Blacklist {
}

public static class BlockDataFilter {
public static boolean AllowUnsafeBisectedData;

public static class Whitelist {
public static boolean Enabled;
public static HashSet<String> Whitelist;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ private void loadValues() {
ConfigFile.BlockDataFilter.Whitelist.Whitelist = new HashSet<>(config.getStringList("BlockDataFilter.Whitelist.Whitelist"));
ConfigFile.BlockDataFilter.Blacklist.Enabled = config.getBoolean("BlockDataFilter.Blacklist.Enabled");
ConfigFile.BlockDataFilter.Blacklist.Blacklist = new HashSet<>(config.getStringList("BlockDataFilter.Blacklist.Blacklist"));
ConfigFile.BlockDataFilter.AllowUnsafeBisectedData = config.getBoolean("BlockDataFilter.AllowUnsafeBisectedData");

ConfigFile.ModeSetting.ClassicMode.ClearSelectedDataTypeWhenModeChange = config.getBoolean("ModeSetting.ClassicMode.ClearSelectedDataTypeWhenModeChange");
ConfigFile.ModeSetting.CopyMode.ClearStoredDataWhenModeChange = config.getBoolean("ModeSetting.CopyMode.ClearStoredDataWhenModeChange");
Expand Down
6 changes: 5 additions & 1 deletion src/main/resources/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Don't touch this value
ConfigVersion: 7
ConfigVersion: 8

Language:
# Language files are located in the "lang" folder.
Expand Down Expand Up @@ -67,6 +67,10 @@ AutoRegionProtection:
Enabled: true

BlockDataFilter:
# If enabled, exposes the half property of multi-block structures such as doors
# and double plants. This can create invalid block pairs and duplicate drops.
# Default: false
AllowUnsafeBisectedData: false
Whitelist:
# If enabled, only the specified block data will be displayed.
Enabled: false
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package dev.twme.debugstickpro.blockdatautil;

import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Door;
import org.bukkit.block.data.type.PitcherCrop;
import org.bukkit.block.data.type.SmallDripleaf;
import org.bukkit.block.data.type.Stairs;
import org.bukkit.block.data.type.TrapDoor;
import org.junit.Test;

import dev.twme.debugstickpro.config.ConfigFile;

import java.lang.reflect.Proxy;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class BlockDataSeparaterTest {

@Test
public void allowsSingleBlockBisectedProperties() {
assertTrue(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(Stairs.class)));
assertTrue(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(TrapDoor.class)));
}

@Test
public void rejectsMultiBlockBisectedProperties() {
assertFalse(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(Bisected.class)));
assertFalse(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(Door.class)));
assertFalse(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(SmallDripleaf.class)));
assertFalse(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(PitcherCrop.class)));
}

@Test
public void allowsUnsafeBisectedPropertiesWhenConfigured() {
ConfigFile.BlockDataFilter.AllowUnsafeBisectedData = true;
try {
assertTrue(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(Bisected.class)));
assertTrue(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(Door.class)));
} finally {
ConfigFile.BlockDataFilter.AllowUnsafeBisectedData = false;
}
}

@Test
public void rejectsNonBisectedProperties() {
assertFalse(BlockDataSeparater.isBisectedHalfSafeToModify(blockData(BlockData.class)));
}

private static BlockData blockData(Class<? extends BlockData> type) {
return (BlockData) Proxy.newProxyInstance(
type.getClassLoader(),
new Class<?>[]{type},
(proxy, method, args) -> {
throw new AssertionError("Unexpected BlockData method call: " + method.getName());
}
);
}
}
Loading