From 9b0487688ce3f560c5f0479ff5239214c107a57c Mon Sep 17 00:00:00 2001 From: "yrsegal@gmail.com" Date: Sat, 4 Jun 2022 18:17:10 -0400 Subject: [PATCH] creative unlocker now can show you mana usages --- .../api/spell/casting/CastingHarness.kt | 42 +++++++++------ .../petrak/hexcasting/api/utils/NBTHelper.kt | 6 ++- .../items/magic/ItemCreativeUnlocker.java | 53 +++++++++++++++++++ .../assets/hexcasting/lang/en_us.json | 3 ++ .../hexcasting/fabric/cc/CCManaHolder.java | 7 ++- 5 files changed, 93 insertions(+), 18 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt index f386da90..cc44f303 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/spell/casting/CastingHarness.kt @@ -13,6 +13,7 @@ import at.petrak.hexcasting.api.spell.math.HexDir import at.petrak.hexcasting.api.spell.math.HexPattern import at.petrak.hexcasting.api.spell.mishaps.* import at.petrak.hexcasting.api.utils.* +import at.petrak.hexcasting.common.items.magic.ItemCreativeUnlocker import at.petrak.hexcasting.xplat.IXplatAbstractions import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.Tag @@ -350,10 +351,15 @@ class CastingHarness private constructor( */ fun withdrawMana(manaCost: Int, allowOvercast: Boolean): Int { // prevent poor impls from gaining you mana - if (this.ctx.caster.isCreative || manaCost <= 0) return 0 + if (manaCost <= 0) return 0 var costLeft = manaCost + val fake = this.ctx.caster.isCreative + if (this.ctx.spellCircle != null) { + if (fake) + return 0 + val tile = this.ctx.world.getBlockEntity(this.ctx.spellCircle.impetusPos) if (tile is BlockEntityAbstractImpetus) { val manaAvailable = tile.mana @@ -365,23 +371,23 @@ class CastingHarness private constructor( val casterStack = this.ctx.caster.getItemInHand(this.ctx.castingHand) val casterManaHolder = IXplatAbstractions.INSTANCE.findManaHolder(casterStack) val casterHexHolder = IXplatAbstractions.INSTANCE.findHexHolder(casterStack) - val ipsCanDrawFromInv = if (casterHexHolder != null) { + val hexHolderDrawsFromInventory = if (casterHexHolder != null) { if (casterManaHolder != null) { val manaAvailable = casterManaHolder.mana val manaToTake = min(costLeft, manaAvailable) - casterManaHolder.mana = manaAvailable - manaToTake + if (!fake) casterManaHolder.mana = manaAvailable - manaToTake costLeft -= manaToTake } casterHexHolder.canDrawManaFromInventory() } else { false } - if (casterStack.`is`(HexItemTags.WANDS) || ipsCanDrawFromInv) { + if (casterStack.`is`(HexItemTags.WANDS) || hexHolderDrawsFromInventory) { val manableItems = this.ctx.caster.inventory.items .filter(::isManaItem) .sortedWith(Comparator(::compareManaItem).reversed()) for (stack in manableItems) { - costLeft -= extractMana(stack, costLeft) + costLeft -= extractMana(stack, costLeft, simulate = fake && !ItemCreativeUnlocker.isDebug(stack)) if (costLeft <= 0) break } @@ -393,24 +399,28 @@ class CastingHarness private constructor( val manaAbleToCastFromHP = this.ctx.caster.health * manaToHealth val manaToActuallyPayFor = min(manaAbleToCastFromHP.toInt(), costLeft) - HexAdvancementTriggers.OVERCAST_TRIGGER.trigger(this.ctx.caster, manaToActuallyPayFor) - this.ctx.caster.awardStat(HexStatistics.MANA_OVERCASTED, manaCost - costLeft) + if (!fake) { + HexAdvancementTriggers.OVERCAST_TRIGGER.trigger(this.ctx.caster, manaToActuallyPayFor) + this.ctx.caster.awardStat(HexStatistics.MANA_OVERCASTED, manaCost - costLeft) - Mishap.trulyHurt(this.ctx.caster, HexDamageSources.OVERCAST, healthtoRemove.toFloat()) + Mishap.trulyHurt(this.ctx.caster, HexDamageSources.OVERCAST, healthtoRemove.toFloat()) + } costLeft -= manaToActuallyPayFor } } } - // this might be more than the mana cost! for example if we waste a lot of mana from an item - this.ctx.caster.awardStat(HexStatistics.MANA_USED, manaCost - costLeft) - HexAdvancementTriggers.SPEND_MANA_TRIGGER.trigger( - this.ctx.caster, - manaCost - costLeft, - if (costLeft < 0) -costLeft else 0 - ) + if (!fake) { + // this might be more than the mana cost! for example if we waste a lot of mana from an item + this.ctx.caster.awardStat(HexStatistics.MANA_USED, manaCost - costLeft) + HexAdvancementTriggers.SPEND_MANA_TRIGGER.trigger( + this.ctx.caster, + manaCost - costLeft, + if (costLeft < 0) -costLeft else 0 + ) + } - return costLeft + return if (fake) 0 else costLeft } fun getColorizer(): FrozenColorizer { diff --git a/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt b/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt index e171ded7..ef9a757c 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/utils/NBTHelper.kt @@ -115,7 +115,9 @@ fun CompoundTag.getList(key: String, objType: Byte): ListTag = getList(key, objT // Get-or-create -fun CompoundTag.getOrCreateCompound(key: String) = getCompound(key) ?: CompoundTag().also { putCompound(key, this) } +fun CompoundTag.getOrCreateCompound(key: String): CompoundTag = getCompound(key) ?: CompoundTag().also { putCompound(key, it) } +fun CompoundTag.getOrCreateList(key: String, objType: Byte) = getOrCreateList(key, objType.toInt()) +fun CompoundTag.getOrCreateList(key: String, objType: Int): ListTag = if (hasList(key, objType)) getList(key, objType) else ListTag().also { putList(key, it) } // ================================================================================================================ Tag @@ -267,3 +269,5 @@ fun ItemStack.getTag(key: String) = tag.get(key) // Get-or-create fun ItemStack.getOrCreateCompound(key: String): CompoundTag = getOrCreateTagElement(key) +fun ItemStack.getOrCreateList(key: String, objType: Byte) = orCreateTag.getOrCreateList(key, objType) +fun ItemStack.getOrCreateList(key: String, objType: Int) = orCreateTag.getOrCreateList(key, objType) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java index 36de01c1..e5b16e95 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java @@ -1,13 +1,18 @@ package at.petrak.hexcasting.common.items.magic; import at.petrak.hexcasting.api.item.ManaHolderItem; +import at.petrak.hexcasting.api.misc.ManaConstants; +import at.petrak.hexcasting.api.utils.NBTHelper; +import at.petrak.hexcasting.common.lib.HexItems; import net.minecraft.ChatFormatting; +import net.minecraft.Util; import net.minecraft.advancements.Advancement; import net.minecraft.locale.Language; import net.minecraft.network.chat.*; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -16,11 +21,21 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Locale; import static at.petrak.hexcasting.api.HexAPI.modLoc; public class ItemCreativeUnlocker extends Item implements ManaHolderItem { + + public static boolean isDebug(ItemStack stack) { + return stack.is(HexItems.CREATIVE_UNLOCKER) && + stack.getHoverName().getString().toLowerCase(Locale.ROOT).equals("debug"); + } + + private static final String TAG_EXTRACTIONS = "extractions"; + public ItemCreativeUnlocker(Properties properties) { super(properties); } @@ -52,9 +67,47 @@ public class ItemCreativeUnlocker extends Item implements ManaHolderItem { @Override public int withdrawMana(ItemStack stack, int cost, boolean simulate) { + if (!simulate && isDebug(stack)) { + int[] arr = NBTHelper.getIntArray(stack, TAG_EXTRACTIONS); + if (arr == null) + arr = new int[0]; + int[] newArr = Arrays.copyOf(arr, arr.length + 1); + newArr[newArr.length - 1] = cost; + NBTHelper.putIntArray(stack, TAG_EXTRACTIONS, newArr); + } + return cost < 0 ? 1 : cost; } + @Override + public boolean isFoil(ItemStack stack) { + return super.isFoil(stack) || isDebug(stack); + } + + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { + if (isDebug(stack) && !level.isClientSide) { + int[] arr = NBTHelper.getIntArray(stack, TAG_EXTRACTIONS); + if (arr != null) { + NBTHelper.remove(stack, TAG_EXTRACTIONS); + for (int i : arr) { + if (i < 0) { + entity.sendMessage(new TranslatableComponent("hexcasting.debug.mana_withdrawn", + stack.getDisplayName(), + new TranslatableComponent("hexcasting.debug.all_mana").withStyle(ChatFormatting.GRAY)) + .withStyle(ChatFormatting.LIGHT_PURPLE), Util.NIL_UUID); + } else { + entity.sendMessage(new TranslatableComponent("hexcasting.debug.mana_withdrawn.with_dust", + stack.getDisplayName(), + new TextComponent("" + i).withStyle(ChatFormatting.WHITE), + new TextComponent(String.format("%.2f", i * 1.0 / ManaConstants.DUST_UNIT)).withStyle(ChatFormatting.WHITE)) + .withStyle(ChatFormatting.LIGHT_PURPLE), Util.NIL_UUID); + } + } + } + } + } + @Override public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity consumer) { if (level instanceof ServerLevel slevel && consumer instanceof ServerPlayer player) { diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.json b/Common/src/main/resources/assets/hexcasting/lang/en_us.json index d2fff6e3..fd64b703 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.json +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.json @@ -172,6 +172,9 @@ "command.hexcasting.brainsweep.fail.badtype": "%s is not a villager", "command.hexcasting.brainsweep.fail.already": "%s is already empty", "hexcasting.pattern.unknown": "Unknown pattern resource location %s", + "hexcasting.debug.mana_withdrawn": "%s - Mana withdrawn: %s", + "hexcasting.debug.mana_withdrawn_with_dust": "%s - Mana withdrawn: %s (%s in dust)", + "hexcasting.debug.all_mana": "Entire contents", "hexcasting.message.cant_overcast": "That Hex needed more media than I had... I should double-check my math.", "hexcasting.message.cant_great_spell": "The spell failed, somehow... am I not skilled enough?", diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCManaHolder.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCManaHolder.java index af96afeb..c1096a9b 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCManaHolder.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/cc/CCManaHolder.java @@ -57,6 +57,11 @@ public abstract class CCManaHolder extends ItemComponent implements ManaHolder { public boolean canConstructBattery() { return false; } + + @Override + public int withdrawMana(int cost, boolean simulate) { + return this.manaHolder.withdrawMana(this.stack, cost, simulate); + } } public static class Static extends CCManaHolder { @@ -68,7 +73,7 @@ public abstract class CCManaHolder extends ItemComponent implements ManaHolder { this.baseWorth = baseWorth; this.consumptionPriority = consumptionPriority; } - + @Override public int getMana() { return baseWorth.get() * stack.getCount();