HexCasting/Common/src/main/java/at/petrak/hexcasting/api/casting/eval/env/PackagedItemCastEnv.java

60 lines
2 KiB
Java

package at.petrak.hexcasting.api.casting.eval.env;
import at.petrak.hexcasting.api.casting.eval.CastResult;
import at.petrak.hexcasting.api.casting.eval.sideeffects.EvalSound;
import at.petrak.hexcasting.api.pigment.FrozenPigment;
import at.petrak.hexcasting.common.lib.hex.HexEvalSounds;
import at.petrak.hexcasting.xplat.IXplatAbstractions;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
public class PackagedItemCastEnv extends PlayerBasedCastEnv {
protected EvalSound sound = HexEvalSounds.NOTHING;
public PackagedItemCastEnv(ServerPlayer caster, InteractionHand castingHand) {
super(caster, castingHand);
}
@Override
public void postExecution(CastResult result) {
super.postExecution(result);
// TODO: how do we know when to actually play this sound?
this.sound = this.sound.greaterOf(result.getSound());
}
@Override
public long extractMedia(long costLeft) {
if (this.caster.isCreative())
return 0;
var casterStack = this.caster.getItemInHand(this.castingHand);
var casterHexHolder = IXplatAbstractions.INSTANCE.findHexHolder(casterStack);
var canCastFromInv = casterHexHolder.canDrawMediaFromInventory();
var casterMediaHolder = IXplatAbstractions.INSTANCE.findMediaHolder(casterStack);
// The contracts on the AD and on this function are different.
// ADs return the amount extracted, this wants the amount left
if (casterMediaHolder != null) {
long extracted = casterMediaHolder.withdrawMedia((int) costLeft, false);
costLeft -= extracted;
}
if (canCastFromInv && costLeft > 0) {
costLeft = this.extractMediaFromInventory(costLeft, this.canOvercast());
}
return costLeft;
}
@Override
public InteractionHand getCastingHand() {
return this.castingHand;
}
@Override
public FrozenPigment getColorizer() {
return null;
}
}