creative unlocker now can show you mana usages
This commit is contained in:
parent
31d40b7555
commit
9b0487688c
5 changed files with 93 additions and 18 deletions
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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?",
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue