From a8a47a60f36b605a0910038445e4b23b234bc577 Mon Sep 17 00:00:00 2001 From: beholderface Date: Fri, 10 Jan 2025 10:18:47 -0500 Subject: [PATCH 1/3] some attributes attributes for being allowed to staffcast, media consumption, player ambit radius, and sentinel ambit radius code largely based on justs_js' Hexxy Attributes addon, PR made with his permission --- .../hexcasting/client/gui/GuiSpellcasting.kt | 2 +- .../client/render/HexAdditionalRenderers.java | 2 +- .../hexcasting/common/items/ItemStaff.java | 4 ++++ .../hexcasting/common/lib/HexAttributes.java | 23 +++++++++++++++++-- .../hexcasting/lang/en_us.flatten.json5 | 4 ++++ .../fabric/mixin/FabricPlayerMixin.java | 4 ++++ .../hexcasting/forge/ForgeHexInitializer.java | 4 ++++ 7 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt index 0a9f66cd2b..df0c5acb60 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt +++ b/Common/src/main/java/at/petrak/hexcasting/client/gui/GuiSpellcasting.kt @@ -122,7 +122,7 @@ class GuiSpellcasting constructor( val player = minecraft.player if (player != null) { val heldItem = player.getItemInHand(handOpenedWith) - if (heldItem.isEmpty || !heldItem.`is`(HexTags.Items.STAVES)) + if (heldItem.isEmpty || !heldItem.`is`(HexTags.Items.STAVES) || player.getAttributeValue(HexAttributes.FEEBLE_MIND) > 0) closeForReal() } } diff --git a/Common/src/main/java/at/petrak/hexcasting/client/render/HexAdditionalRenderers.java b/Common/src/main/java/at/petrak/hexcasting/client/render/HexAdditionalRenderers.java index 1861a9b8fb..0e96540a91 100644 --- a/Common/src/main/java/at/petrak/hexcasting/client/render/HexAdditionalRenderers.java +++ b/Common/src/main/java/at/petrak/hexcasting/client/render/HexAdditionalRenderers.java @@ -159,7 +159,7 @@ private static void tryRenderScryingLensOverlay(GuiGraphics graphics, float part return; } - if (player.getAttributeValue(HexAttributes.SCRY_SIGHT) <= 0.0) + if (player.getAttributeValue(HexAttributes.SCRY_SIGHT) <= 0.0 || player.getAttributeValue(HexAttributes.FEEBLE_MIND) > 0) return; var hitRes = mc.hitResult; diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java index 80e84f4a2d..558f716dc5 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/ItemStaff.java @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.items; import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.common.lib.HexAttributes; import at.petrak.hexcasting.common.lib.HexSounds; import at.petrak.hexcasting.common.msgs.MsgClearSpiralPatternsS2C; import at.petrak.hexcasting.common.msgs.MsgOpenSpellGuiS2C; @@ -25,6 +26,9 @@ public ItemStaff(Properties pProperties) { @Override public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { + if (player.getAttributeValue(HexAttributes.FEEBLE_MIND) > 0){ + return InteractionResultHolder.fail(player.getItemInHand(hand)); + } if (player.isShiftKeyDown()) { if (world.isClientSide()) { player.playSound(HexSounds.STAFF_RESET, 1f, 1f); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java index 967f61268f..097c305ad9 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexAttributes.java @@ -1,6 +1,7 @@ package at.petrak.hexcasting.common.lib; import at.petrak.hexcasting.api.HexAPI; +import at.petrak.hexcasting.api.casting.eval.env.PlayerBasedCastEnv; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.RangedAttribute; @@ -24,14 +25,32 @@ public static void register(BiConsumer r) { private static final Map ATTRIBUTES = new LinkedHashMap<>(); + private static final String MOD_ID = HexAPI.MOD_ID; + public static final Attribute GRID_ZOOM = make("grid_zoom", new RangedAttribute( - HexAPI.MOD_ID + ".attributes.grid_zoom", 1.0, 0.5, 4.0)).setSyncable(true); + MOD_ID + ".attributes.grid_zoom", 1.0, 0.5, 4.0)).setSyncable(true); /** * Whether you have the lens overlay when looking at something. 0 = no, > 0 = yes. */ public static final Attribute SCRY_SIGHT = make("scry_sight", new RangedAttribute( - HexAPI.MOD_ID + ".attributes.scry_sight", 0.0, 0.0, 1.0)).setSyncable(true); + MOD_ID + ".attributes.scry_sight", 0.0, 0.0, 1.0)).setSyncable(true); + + //whether the player is allowed to use staffcasting and scrying lenses + public static final Attribute FEEBLE_MIND = make("feeble_mind", new RangedAttribute( + MOD_ID + ".attributes.feeble_mind", 0.0, 0.0, 1.0).setSyncable(true)); + + //a multiplier to adjust media consumption across the board + public static final Attribute MEDIA_CONSUMPTION_MODIFIER = make("media_consumption", new RangedAttribute( + MOD_ID + ".attributes.media_consumption", 1.0, 0.0, Double.MAX_VALUE).setSyncable(true)); + + public static final Attribute AMBIT_RADIUS = make("ambit_radius", new RangedAttribute( + MOD_ID + ".attributes.ambit_radius", PlayerBasedCastEnv.DEFAULT_AMBIT_RADIUS, 0.0, Double.MAX_VALUE).setSyncable(true)); + + public static final Attribute SENTINEL_RADIUS = make("sentinel_radius", new RangedAttribute( + MOD_ID + ".attributes.sentinel_radius", PlayerBasedCastEnv.DEFAULT_SENTINEL_RADIUS, 0.0, Double.MAX_VALUE).setSyncable(true)); + + private static T make(String id, T attr) { var old = ATTRIBUTES.put(modLoc(id), attr); diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 1f578be3a1..9e82f1cfd9 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -615,8 +615,12 @@ attributes: { grid_zoom: "Casting Grid Size", + media_consumption: "Media Consumption", + ambit_radius: "Player Ambit Radius", + sentinel_radius: "Sentinel Ambit Radius", // TODO: the +1 is kind of janky scry_sight: "Scrying Sight", + feeble_mind: "Feeble Mind" }, // Action localizations diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricPlayerMixin.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricPlayerMixin.java index 2c7584663f..45a22117b7 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricPlayerMixin.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/mixin/FabricPlayerMixin.java @@ -22,5 +22,9 @@ protected FabricPlayerMixin(EntityType entityType, Level var out = cir.getReturnValue(); out.add(HexAttributes.GRID_ZOOM); out.add(HexAttributes.SCRY_SIGHT); + out.add(HexAttributes.FEEBLE_MIND); + out.add(HexAttributes.MEDIA_CONSUMPTION_MODIFIER); + out.add(HexAttributes.AMBIT_RADIUS); + out.add(HexAttributes.SENTINEL_RADIUS); } } diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java index 16bc2a0549..39bd896580 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexInitializer.java @@ -277,6 +277,10 @@ private static void initListeners() { modBus.addListener((EntityAttributeModificationEvent e) -> { e.add(EntityType.PLAYER, HexAttributes.GRID_ZOOM); e.add(EntityType.PLAYER, HexAttributes.SCRY_SIGHT); + e.add(EntityType.PLAYER, HexAttributes.FEEBLE_MIND); + e.add(EntityType.PLAYER, HexAttributes.MEDIA_CONSUMPTION_MODIFIER); + e.add(EntityType.PLAYER, HexAttributes.AMBIT_RADIUS); + e.add(EntityType.PLAYER, HexAttributes.SENTINEL_RADIUS); }); if (ModList.get().isLoaded(HexInterop.Forge.CURIOS_API_ID)) { From 77c811c39d476a264d20ad4ccf5dc04fd395bca9 Mon Sep 17 00:00:00 2001 From: beholderface Date: Fri, 10 Jan 2025 10:33:31 -0500 Subject: [PATCH 2/3] put back formerly-conflicting code --- .../api/casting/eval/CastingEnvironment.java | 4 ++++ .../api/casting/eval/env/CircleCastEnv.java | 6 +++--- .../casting/eval/env/PlayerBasedCastEnv.java | 21 +++++++++++++++---- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java index 9157063a97..ebd47a1e65 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/CastingEnvironment.java @@ -10,6 +10,7 @@ import at.petrak.hexcasting.api.mod.HexConfig; import at.petrak.hexcasting.api.pigment.FrozenPigment; import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.common.lib.HexAttributes; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -247,6 +248,9 @@ public boolean isEnlightened() { * positive. */ public long extractMedia(long cost, boolean simulate) { + if (this.getCastingEntity() != null){ + cost = (long) (cost * this.getCastingEntity().getAttributeValue(HexAttributes.MEDIA_CONSUMPTION_MODIFIER)); + } for (var extractMediaComponent : preMediaExtract) cost = extractMediaComponent.onExtractMedia(cost, simulate); cost = extractMediaEnvironment(cost, simulate); diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/CircleCastEnv.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/CircleCastEnv.java index d1d542780d..1fb6698bf7 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/CircleCastEnv.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/CircleCastEnv.java @@ -13,6 +13,7 @@ import at.petrak.hexcasting.api.casting.mishaps.MishapDisallowedSpell; import at.petrak.hexcasting.api.mod.HexConfig; import at.petrak.hexcasting.api.pigment.FrozenPigment; +import at.petrak.hexcasting.common.lib.HexAttributes; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -29,8 +30,6 @@ import java.util.List; import java.util.function.Predicate; -import static at.petrak.hexcasting.api.casting.eval.env.PlayerBasedCastEnv.SENTINEL_RADIUS; - public class CircleCastEnv extends CastingEnvironment { protected final CircleExecutionState execState; @@ -133,6 +132,7 @@ public long extractMediaEnvironment(long cost, boolean simulate) { public boolean isVecInRangeEnvironment(Vec3 vec) { var caster = this.execState.getCaster(this.world); if (caster != null) { + double sentinelRadius = caster.getAttributeValue(HexAttributes.SENTINEL_RADIUS); if (vec.distanceToSqr(caster.position()) <= caster.getBbHeight() * caster.getBbHeight()) { return true; } @@ -141,7 +141,7 @@ public boolean isVecInRangeEnvironment(Vec3 vec) { if (sentinel != null && sentinel.extendsRange() && caster.level().dimension() == sentinel.dimension() - && vec.distanceToSqr(sentinel.position()) <= SENTINEL_RADIUS * SENTINEL_RADIUS + 0.00000000001 + && vec.distanceToSqr(sentinel.position()) <= sentinelRadius * sentinelRadius + 0.00000000001 ) { return true; } diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java index 10ff3b052b..0f6ef77703 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java @@ -14,6 +14,7 @@ import at.petrak.hexcasting.api.pigment.FrozenPigment; import at.petrak.hexcasting.api.utils.HexUtils; import at.petrak.hexcasting.api.utils.MediaHelper; +import at.petrak.hexcasting.common.lib.HexAttributes; import at.petrak.hexcasting.common.lib.HexDamageTypes; import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.core.BlockPos; @@ -35,8 +36,10 @@ import static at.petrak.hexcasting.api.HexAPI.modLoc; public abstract class PlayerBasedCastEnv extends CastingEnvironment { - public static final double AMBIT_RADIUS = 32.0; - public static final double SENTINEL_RADIUS = 16.0; + public static final double DEFAULT_AMBIT_RADIUS = 32.0; + private double ambitRadius; + public static final double DEFAULT_SENTINEL_RADIUS = 16.0; + private double sentinelRadius; protected final ServerPlayer caster; protected final InteractionHand castingHand; @@ -45,6 +48,8 @@ protected PlayerBasedCastEnv(ServerPlayer caster, InteractionHand castingHand) { super(caster.serverLevel()); this.caster = caster; this.castingHand = castingHand; + this.ambitRadius = caster.getAttributeValue(HexAttributes.AMBIT_RADIUS); + this.sentinelRadius = caster.getAttributeValue(HexAttributes.SENTINEL_RADIUS); } @Override @@ -78,6 +83,14 @@ protected List getPrimaryStacks() { return getPrimaryStacksForPlayer(this.castingHand, this.caster); } + public double getAmbitRadius() { + return this.ambitRadius; + } + + public double getSentinelRadius(){ + return this.sentinelRadius; + } + @Override public boolean replaceItem(Predicate stackOk, ItemStack replaceWith, @Nullable InteractionHand hand) { return replaceItemForPlayer(stackOk, replaceWith, hand, this.caster); @@ -90,12 +103,12 @@ public boolean isVecInRangeEnvironment(Vec3 vec) { && sentinel.extendsRange() && this.caster.level().dimension() == sentinel.dimension() // adding 0.00000000001 to avoid machine precision errors at specific angles - && vec.distanceToSqr(sentinel.position()) <= SENTINEL_RADIUS * SENTINEL_RADIUS + 0.00000000001 + && vec.distanceToSqr(sentinel.position()) <= sentinelRadius * sentinelRadius + 0.00000000001 ) { return true; } - return vec.distanceToSqr(this.caster.position()) <= AMBIT_RADIUS * AMBIT_RADIUS + 0.00000000001; + return vec.distanceToSqr(this.caster.position()) <= ambitRadius * ambitRadius + 0.00000000001; } @Override From c5c8f3fd2b32c95f3c1e90888caa45d2147b55ce Mon Sep 17 00:00:00 2001 From: beholderface Date: Fri, 10 Jan 2025 10:38:13 -0500 Subject: [PATCH 3/3] oops forgot to put that code back --- .../api/casting/eval/env/PlayerBasedCastEnv.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java index 0f6ef77703..750a48fa23 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PlayerBasedCastEnv.java @@ -71,6 +71,16 @@ public void postExecution(CastResult result) { this.sendMishapMsgToPlayer(doMishap); } } + if (this.caster != null){ + double ambitAttribute = this.caster.getAttributeValue(HexAttributes.AMBIT_RADIUS); + if (this.ambitRadius != ambitAttribute){ + this.ambitRadius = ambitAttribute; + } + double sentinelAttribute = this.caster.getAttributeValue(HexAttributes.SENTINEL_RADIUS); + if (this.sentinelRadius != sentinelAttribute){ + this.sentinelRadius = sentinelAttribute; + } + } } @Override