From 6d8839d5ab12d68a25b467438279907c387e04f5 Mon Sep 17 00:00:00 2001 From: pietru Date: Thu, 10 Oct 2024 13:45:56 +0200 Subject: [PATCH] add region and area basics --- .../net/pietru/cookie_utils/api/Area.java | 20 +++++++++++ .../net/pietru/cookie_utils/api/Region.java | 26 ++++++++++++++ .../cookie_utils/mixins/BlockBreakMixin.java | 4 ++- .../cookie_utils/mixins/BlockPlaceMixin.java | 36 +++++++++++++++++++ src/main/resources/cookie_utils.mixins.json | 3 +- 5 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/pietru/cookie_utils/api/Area.java create mode 100644 src/main/java/net/pietru/cookie_utils/api/Region.java create mode 100644 src/main/java/net/pietru/cookie_utils/mixins/BlockPlaceMixin.java diff --git a/src/main/java/net/pietru/cookie_utils/api/Area.java b/src/main/java/net/pietru/cookie_utils/api/Area.java new file mode 100644 index 0000000..9e98759 --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/api/Area.java @@ -0,0 +1,20 @@ +package net.pietru.cookie_utils.api; + +import com.badlogic.gdx.math.Vector3; +import com.badlogic.gdx.math.collision.BoundingBox; + +public class Area { + BoundingBox space = new BoundingBox(); + + public BoundingBox getBox() { + return space; + } + + public void setCorners(Vector3 a, Vector3 b){ + space.set(a,b); + } + + public boolean does_intersect(Vector3 c){ + return space.contains(c); + } +} diff --git a/src/main/java/net/pietru/cookie_utils/api/Region.java b/src/main/java/net/pietru/cookie_utils/api/Region.java new file mode 100644 index 0000000..b7bd39f --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/api/Region.java @@ -0,0 +1,26 @@ +package net.pietru.cookie_utils.api; + +import com.badlogic.gdx.math.Vector3; +import com.badlogic.gdx.utils.Array; +import finalforeach.cosmicreach.blocks.BlockPosition; +import finalforeach.cosmicreach.world.Zone; + +public class Region { + + public static Array areas = new Array<>(); + + public static boolean can_edit_block(BlockPosition position){ + Zone z = position.getZone(); + Vector3 g_position = new Vector3(position.getGlobalX(),position.getGlobalY(),position.getGlobalZ()); + boolean can = true; + + for (Area a : areas){ + if (a.does_intersect(g_position)){ + can=false; + break; + } + } + + return can; + } +} diff --git a/src/main/java/net/pietru/cookie_utils/mixins/BlockBreakMixin.java b/src/main/java/net/pietru/cookie_utils/mixins/BlockBreakMixin.java index 0e26b89..ba34513 100644 --- a/src/main/java/net/pietru/cookie_utils/mixins/BlockBreakMixin.java +++ b/src/main/java/net/pietru/cookie_utils/mixins/BlockBreakMixin.java @@ -14,6 +14,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import static net.pietru.cookie_utils.api.Region.can_edit_block; + @Mixin(BreakBlockPacket.class) public class BlockBreakMixin { @Shadow @@ -26,7 +28,7 @@ public class BlockBreakMixin { @Inject(method = "handle", at = @At("HEAD"), cancellable = true) private void event_block_break(@Local NetworkIdentity identity, @Local ChannelHandlerContext ctx, CallbackInfo ci){ if (identity.getSide() != NetworkSide.CLIENT) { - if (this.blockPos.getBlockState() == this.brokenBlockState) { + if (!can_edit_block(blockPos)) { ci.cancel(); } } diff --git a/src/main/java/net/pietru/cookie_utils/mixins/BlockPlaceMixin.java b/src/main/java/net/pietru/cookie_utils/mixins/BlockPlaceMixin.java new file mode 100644 index 0000000..fd3b7e2 --- /dev/null +++ b/src/main/java/net/pietru/cookie_utils/mixins/BlockPlaceMixin.java @@ -0,0 +1,36 @@ +package net.pietru.cookie_utils.mixins; + +import com.llamalad7.mixinextras.sugar.Local; +import finalforeach.cosmicreach.blocks.BlockPosition; +import finalforeach.cosmicreach.blocks.BlockState; +import finalforeach.cosmicreach.networking.common.NetworkIdentity; +import finalforeach.cosmicreach.networking.common.NetworkSide; +import finalforeach.cosmicreach.networking.netty.packets.blocks.PlaceBlockPacket; +import finalforeach.cosmicreach.world.Zone; +import io.netty.channel.ChannelHandlerContext; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static net.pietru.cookie_utils.api.Region.can_edit_block; + +@Mixin(PlaceBlockPacket.class) +public class BlockPlaceMixin { + @Shadow + Zone zone; + @Shadow + BlockPosition blockPos; + @Shadow + BlockState targetBlockState; + + @Inject(method = "handle", at = @At("HEAD"), cancellable = true) + private void event_block_place(@Local NetworkIdentity identity, @Local ChannelHandlerContext ctx, CallbackInfo ci){ + if (identity.getSide() != NetworkSide.CLIENT) { + if (!can_edit_block(blockPos)) { + ci.cancel(); + } + } + } +} diff --git a/src/main/resources/cookie_utils.mixins.json b/src/main/resources/cookie_utils.mixins.json index 797b910..53a608b 100644 --- a/src/main/resources/cookie_utils.mixins.json +++ b/src/main/resources/cookie_utils.mixins.json @@ -4,7 +4,8 @@ "package": "net.pietru.cookie_utils.mixins", "compatibilityLevel": "JAVA_17", "mixins": [ - "BlockBreakMixin" + "BlockBreakMixin", + "BlockPlaceMixin" ], "client": [], "injectors": {