Skip to content

Commit 420cb64

Browse files
Add Material API support and fix edge cases for CoreProtect
1 parent 47d7ba2 commit 420cb64

4 files changed

Lines changed: 45 additions & 1 deletion

File tree

parallelworlds/src/main/java/parallelmc/parallelworlds/ReflectionHelper.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@ public static <T, U> U getPrivateField(String fieldName, Class<T> clazz, T objec
3030
}
3131
}
3232

33+
public static <T> void setPrivateField(String fieldName, Class<T> clazz, T object, Object fieldVal) throws ClassCastException{
34+
Field field;
35+
36+
try {
37+
field = clazz.getDeclaredField(fieldName);
38+
39+
field.setAccessible(true);
40+
41+
field.set(object, fieldVal);
42+
} catch (NoSuchFieldException | IllegalAccessException e) {
43+
e.printStackTrace();
44+
}
45+
}
46+
3347
/*
3448
Jank Enum code from https://notes.highlysuspect.agency/blog/enum_reflection/
3549
*/

parallelworlds/src/main/java/parallelmc/parallelworlds/events/BlockBreakPlaceListener.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.minecraft.world.level.block.Blocks;
88
import net.minecraft.world.level.block.state.BlockState;
99
import org.bukkit.GameMode;
10+
import org.bukkit.Material;
1011
import org.bukkit.block.data.BlockData;
1112
import org.bukkit.craftbukkit.block.CraftBlock;
1213
import org.bukkit.craftbukkit.inventory.CraftItemStack;

parallelworlds/src/main/java/parallelmc/parallelworlds/events/BlockPacketListener.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import net.minecraft.world.level.block.Block;
2121
import net.minecraft.world.level.block.Blocks;
2222
import net.minecraft.world.level.block.state.BlockState;
23+
import org.bukkit.Server;
2324
import org.bukkit.craftbukkit.entity.CraftPlayer;
2425
import parallelmc.parallelworlds.ParallelWorldsBootstrapper;
2526
import parallelmc.parallelworlds.registry.ParallelBlockRegistry;
@@ -179,6 +180,29 @@ public void onPacketSend(PacketSendEvent event) {
179180
event.markForReEncode(true);
180181

181182
//Logger.getGlobal().log(Level.WARNING, String.valueOf(packet.getBlockId()));
183+
} else if (type == PacketType.Play.Server.MULTI_BLOCK_CHANGE) {
184+
WrapperPlayServerMultiBlockChange packet = new WrapperPlayServerMultiBlockChange(event);
185+
186+
for (WrapperPlayServerMultiBlockChange.EncodedBlock block : packet.getBlocks()) {
187+
int id = block.getBlockId();
188+
189+
Integer replace_state;
190+
if (id >= firstCustomId) {
191+
replace_state = registry.getMappedState(id);
192+
if (replace_state == null) {
193+
replace_state = defaultReplaceState;
194+
Logger.getGlobal().log(Level.WARNING, "Could not find mapping for id" + id);
195+
}
196+
} else if (id >= noteblockStart && id <= noteblockEnd) {
197+
replace_state = noteblockStart;
198+
} else {
199+
continue;
200+
}
201+
202+
block.setBlockId(replace_state);
203+
event.markForReEncode(true);
204+
}
205+
182206
} else if (type == PacketType.Play.Server.BLOCK_ACTION) {
183207
WrapperPlayServerBlockAction packet = new WrapperPlayServerBlockAction(event);
184208

@@ -192,6 +216,7 @@ public void onPacketSend(PacketSendEvent event) {
192216
return;
193217
}
194218

219+
195220
if (replace_state == null) {
196221
replace_state = defaultReplaceState;
197222
Logger.getGlobal().log(Level.WARNING, "Could not find mapping for id" + id);
@@ -203,7 +228,7 @@ public void onPacketSend(PacketSendEvent event) {
203228
WrapperPlayServerDeclareCommands packet = new WrapperPlayServerDeclareCommands(event);
204229

205230
packet.getNodes();
206-
231+
207232
} else if (type != PacketType.Play.Server.ENTITY_HEAD_LOOK &&
208233
type != PacketType.Play.Server.ENTITY_RELATIVE_MOVE &&
209234
type != PacketType.Play.Server.ENTITY_RELATIVE_MOVE_AND_ROTATION &&

parallelworlds/src/main/java/parallelmc/parallelworlds/registry/ParallelBlockRegistry.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import net.minecraft.world.level.block.state.BlockState;
2020
import net.minecraft.world.level.storage.loot.functions.*;
2121
import org.bukkit.Material;
22+
import org.bukkit.NamespacedKey;
2223
import org.bukkit.craftbukkit.block.CraftBlock;
2324
import org.jetbrains.annotations.NotNull;
2425
import org.jetbrains.annotations.Nullable;
@@ -30,6 +31,7 @@
3031
import java.util.logging.Logger;
3132

3233
import static parallelmc.parallelworlds.ReflectionHelper.getPrivateField;
34+
import static parallelmc.parallelworlds.ReflectionHelper.setPrivateField;
3335

3436
public class ParallelBlockRegistry {
3537

@@ -146,6 +148,8 @@ public boolean registerBlock(ResourceKey<@NotNull Block> key, Block block, Block
146148
Material newMat = ReflectionHelper.makeEnum(Material.class,
147149
key.identifier().getPath().toUpperCase(Locale.ROOT), nextMaterialIndex++, new Class[]{int.class}, -1);
148150

151+
setPrivateField("key", Material.class, newMat, new NamespacedKey(key.identifier().getNamespace(), key.identifier().getPath()));
152+
149153
BY_NAME.put(newMat.name(), newMat);
150154

151155
} catch (Throwable t) {

0 commit comments

Comments
 (0)