From eab2ef67b7c256a9073d5c14d793bafbed0426a5 Mon Sep 17 00:00:00 2001 From: Tschipp <11649893+Tschipp@users.noreply.github.com> Date: Mon, 29 Dec 2025 16:25:14 +0100 Subject: [PATCH] Added possibility for scripts to override certain pickup checks. Closes #853 --- .../carryon/common/carry/PickupHandler.java | 18 +++++++++++------- .../common/scripting/CarryOnScript.java | 8 +++++--- .../common/scripting/ScriptReloadListener.java | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Common/src/main/java/tschipp/carryon/common/carry/PickupHandler.java b/Common/src/main/java/tschipp/carryon/common/carry/PickupHandler.java index 30668f7..895778a 100644 --- a/Common/src/main/java/tschipp/carryon/common/carry/PickupHandler.java +++ b/Common/src/main/java/tschipp/carryon/common/carry/PickupHandler.java @@ -89,7 +89,7 @@ public class PickupHandler { public static boolean tryPickUpBlock(ServerPlayer player, BlockPos pos, Level level, @Nullable BiFunction pickupCallback) { - if(!canCarryGeneral(player, Vec3.atCenterOf(pos))) + if(!canCarryGeneral(player, Vec3.atCenterOf(pos))) //Necessary return false; CarryOnData carry = CarryOnDataManager.getCarryData(player); @@ -99,13 +99,16 @@ public class PickupHandler { if(blockEntity != null) nbt = blockEntity.saveWithId(level.registryAccess()); + Optional result = ScriptManager.inspectBlock(state, level, pos, nbt); + boolean overrideChecks = result.map(CarryOnScript::overrideChecks).orElse(false); + if(!ListHandler.isPermitted(state.getBlock())) return false; - if(state.getDestroySpeed(level, pos) == -1 && !player.isCreative() && !Constants.COMMON_CONFIG.settings.pickupUnbreakableBlocks) + if(!overrideChecks && (state.getDestroySpeed(level, pos) == -1 && !player.isCreative() && !Constants.COMMON_CONFIG.settings.pickupUnbreakableBlocks)) return false; - if(blockEntity == null && !Constants.COMMON_CONFIG.settings.pickupAllBlocks) + if(!overrideChecks && (blockEntity == null && !Constants.COMMON_CONFIG.settings.pickupAllBlocks)) return false; //Check if TE is locked @@ -126,7 +129,6 @@ public class PickupHandler { if(!doPickup) return false; - Optional result = ScriptManager.inspectBlock(state, level, pos, nbt); if(result.isPresent()) { CarryOnScript script = result.get(); @@ -174,17 +176,20 @@ public class PickupHandler { return false; } + Optional result = ScriptManager.inspectEntity(entity); + boolean overrideChecks = result.map(CarryOnScript::overrideChecks).orElse(false); + if(!ListHandler.isPermitted(entity)) { //We can pick up baby animals even if the grown up animal is blacklisted. - if(!(entity instanceof AgeableMob ageableMob && Constants.COMMON_CONFIG.settings.allowBabies && (ageableMob.getAge() < 0 || ageableMob.isBaby()))) + if(!overrideChecks && (!(entity instanceof AgeableMob ageableMob && Constants.COMMON_CONFIG.settings.allowBabies && (ageableMob.getAge() < 0 || ageableMob.isBaby())))) return false; } //Non-Creative only guards if(!player.isCreative()) { - if(!Constants.COMMON_CONFIG.settings.pickupHostileMobs && entity.getType().getCategory() == MobCategory.MONSTER) + if(!overrideChecks && (!Constants.COMMON_CONFIG.settings.pickupHostileMobs && entity.getType().getCategory() == MobCategory.MONSTER)) return false; if(Constants.COMMON_CONFIG.settings.maxEntityHeight < entity.getBbHeight() || Constants.COMMON_CONFIG.settings.maxEntityWidth < entity.getBbWidth()) @@ -204,7 +209,6 @@ public class PickupHandler { CarryOnData carry = CarryOnDataManager.getCarryData(player); - Optional result = ScriptManager.inspectEntity(entity); if(result.isPresent()) { CarryOnScript script = result.get(); diff --git a/Common/src/main/java/tschipp/carryon/common/scripting/CarryOnScript.java b/Common/src/main/java/tschipp/carryon/common/scripting/CarryOnScript.java index ed1d5c6..fa320e5 100644 --- a/Common/src/main/java/tschipp/carryon/common/scripting/CarryOnScript.java +++ b/Common/src/main/java/tschipp/carryon/common/scripting/CarryOnScript.java @@ -39,12 +39,13 @@ public record CarryOnScript( ScriptObject scriptObject, ScriptConditions scriptConditions, ScriptRender scriptRender, - ScriptEffects scriptEffects) + ScriptEffects scriptEffects, + boolean overrideChecks) { public boolean isValid() { - return (isBlock() ^ isEntity()) && (scriptConditions != ScriptConditions.EMPTY || scriptRender != ScriptRender.EMPTY || scriptEffects != ScriptEffects.EMPTY); + return (isBlock() ^ isEntity()) && (scriptConditions != ScriptConditions.EMPTY || scriptRender != ScriptRender.EMPTY || scriptEffects != ScriptEffects.EMPTY || overrideChecks); } public boolean isBlock() @@ -63,7 +64,8 @@ public record CarryOnScript( ScriptObject.CODEC.fieldOf("object").forGetter(CarryOnScript::scriptObject), ScriptConditions.CODEC.optionalFieldOf("conditions", ScriptConditions.EMPTY).forGetter(CarryOnScript::scriptConditions), ScriptRender.CODEC.optionalFieldOf("render", ScriptRender.EMPTY).forGetter(CarryOnScript::scriptRender), - ScriptEffects.CODEC.optionalFieldOf("effects", ScriptEffects.EMPTY).forGetter(CarryOnScript::scriptEffects) + ScriptEffects.CODEC.optionalFieldOf("effects", ScriptEffects.EMPTY).forGetter(CarryOnScript::scriptEffects), + Codec.BOOL.optionalFieldOf("override_checks", false).forGetter(CarryOnScript::overrideChecks) ).apply(instance, CarryOnScript::new) ); diff --git a/Common/src/main/java/tschipp/carryon/common/scripting/ScriptReloadListener.java b/Common/src/main/java/tschipp/carryon/common/scripting/ScriptReloadListener.java index 42695a9..37fe5a8 100644 --- a/Common/src/main/java/tschipp/carryon/common/scripting/ScriptReloadListener.java +++ b/Common/src/main/java/tschipp/carryon/common/scripting/ScriptReloadListener.java @@ -72,7 +72,7 @@ public class ScriptReloadListener extends SimpleJsonResourceReloadListener e.printStackTrace(); } - Collections.sort(ScriptManager.SCRIPTS, (s1, s2) -> Long.compare(s2.priority(), s1.priority())); + ScriptManager.SCRIPTS.sort((s1, s2) -> Long.compare(s2.priority(), s1.priority())); } public static void syncScriptsWithClient(ServerPlayer player)