Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@

import at.petrak.hexcasting.api.casting.eval.CastResult;
import at.petrak.hexcasting.api.casting.eval.sideeffects.EvalSound;
import at.petrak.hexcasting.api.casting.iota.PatternIota;
import at.petrak.hexcasting.api.pigment.FrozenPigment;
import at.petrak.hexcasting.common.lib.hex.HexEvalSounds;
import at.petrak.hexcasting.common.msgs.MsgNewSpiralPatternsS2C;
import at.petrak.hexcasting.xplat.IXplatAbstractions;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;

import java.util.List;

public class PackagedItemCastEnv extends PlayerBasedCastEnv {
public class PackagedItemCastEnv extends PlayerBasedSpiralPatternCastEnv {

protected EvalSound sound = HexEvalSounds.NOTHING;

Expand All @@ -24,18 +21,15 @@ public PackagedItemCastEnv(ServerPlayer caster, InteractionHand castingHand) {
public void postExecution(CastResult result) {
super.postExecution(result);

if (result.component1() instanceof PatternIota patternIota) {
var packet = new MsgNewSpiralPatternsS2C(
this.caster.getUUID(), List.of(patternIota.getPattern()), 140
);
IXplatAbstractions.INSTANCE.sendPacketToPlayer(this.caster, packet);
IXplatAbstractions.INSTANCE.sendPacketTracking(this.caster, packet);
}

// TODO: how do we know when to actually play this sound?
this.sound = this.sound.greaterOf(result.getSound());
}

@Override
public int getSpiralPatternDuration() {
return 140;
}

@Override
public long extractMediaEnvironment(long costLeft, boolean simulate) {
if (this.caster.isCreative())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@
import static at.petrak.hexcasting.api.HexAPI.modLoc;
import static at.petrak.hexcasting.api.utils.HexUtils.isOfTag;

/**
* Player-based casting environment. Consider using {@link PlayerBasedSpiralPatternCastEnv} instead
* if executed patterns should be displayed in a spiral around the caster.
*/
public abstract class PlayerBasedCastEnv extends CastingEnvironment {
public static final double DEFAULT_AMBIT_RADIUS = 32.0;
private double ambitRadius;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package at.petrak.hexcasting.api.casting.eval.env;

import at.petrak.hexcasting.api.casting.eval.CastResult;
import at.petrak.hexcasting.api.casting.eval.vm.CastingImage;
import at.petrak.hexcasting.api.casting.iota.PatternIota;
import at.petrak.hexcasting.api.casting.math.HexPattern;
import at.petrak.hexcasting.common.msgs.MsgNewSpiralPatternsS2C;
import at.petrak.hexcasting.xplat.IXplatAbstractions;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;

import java.util.HashSet;
import java.util.Set;

/**
* Variant of {@link PlayerBasedCastEnv} that tracks executed patterns and displays them in a spiral around the player
*/
public abstract class PlayerBasedSpiralPatternCastEnv extends PlayerBasedCastEnv {
private final Set<HexPattern> castPatterns = new HashSet<>();

public PlayerBasedSpiralPatternCastEnv(ServerPlayer caster, InteractionHand castingHand) {
super(caster, castingHand);
}
Comment thread
pythonmcpi marked this conversation as resolved.

/**
* Returns the duration (in ticks) that patterns should remain visible after being executed by the env.
*/
public abstract int getSpiralPatternDuration();
Comment thread
pythonmcpi marked this conversation as resolved.

@Override
public void postExecution(CastResult result) {
super.postExecution(result);

if (result.component1() instanceof PatternIota patternIota) {
castPatterns.add(patternIota.getPattern());
}
}

@Override
public void postCast(CastingImage image) {
super.postCast(image);

var packet = new MsgNewSpiralPatternsS2C(
this.caster.getUUID(), castPatterns.stream().toList(), getSpiralPatternDuration()
);
IXplatAbstractions.INSTANCE.sendPacketToPlayer(this.caster, packet);
IXplatAbstractions.INSTANCE.sendPacketTracking(this.caster, packet);

castPatterns.clear();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import at.petrak.hexcasting.api.casting.eval.vm.CastingImage;
import at.petrak.hexcasting.api.casting.iota.PatternIota;
import at.petrak.hexcasting.api.casting.math.HexCoord;
import at.petrak.hexcasting.api.casting.math.HexPattern;
import at.petrak.hexcasting.api.mod.HexStatistics;
import at.petrak.hexcasting.api.pigment.FrozenPigment;
import at.petrak.hexcasting.common.msgs.*;
Expand All @@ -21,15 +20,12 @@

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class StaffCastEnv extends PlayerBasedCastEnv {
public class StaffCastEnv extends PlayerBasedSpiralPatternCastEnv {
private final InteractionHand castingHand;

private final Set<HexPattern> castPatterns = new HashSet<>();
private int soundsPlayed = 0;


public StaffCastEnv(ServerPlayer caster, InteractionHand castingHand) {
super(caster, castingHand);

Expand All @@ -40,10 +36,6 @@ public StaffCastEnv(ServerPlayer caster, InteractionHand castingHand) {
public void postExecution(CastResult result) {
super.postExecution(result);

if (result.component1() instanceof PatternIota patternIota) {
castPatterns.add(patternIota.getPattern());
}

// we always want to play this sound one at a time
var sound = result.getSound().sound();
if (soundsPlayed < 100 && sound != null) { // TODO: Make configurable
Expand All @@ -58,16 +50,14 @@ public void postExecution(CastResult result) {
public void postCast(CastingImage image) {
super.postCast(image);

var packet = new MsgNewSpiralPatternsS2C(
this.caster.getUUID(), castPatterns.stream().toList(), Integer.MAX_VALUE
);
IXplatAbstractions.INSTANCE.sendPacketToPlayer(this.caster, packet);
IXplatAbstractions.INSTANCE.sendPacketTracking(this.caster, packet);

castPatterns.clear();
soundsPlayed = 0;
}

@Override
public int getSpiralPatternDuration() {
return Integer.MAX_VALUE;
}

@Override
public long extractMediaEnvironment(long cost, boolean simulate) {
if (this.caster.isCreative())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,14 +131,6 @@ public InteractionResultHolder<ItemStack> use(Level world, Player player, Intera
var vm = CastingVM.empty(ctx);
var clientView = vm.queueExecuteAndWrapIotas(instrs, sPlayer.serverLevel());

var patterns = instrs.stream()
.filter(i -> i instanceof PatternIota)
.map(i -> ((PatternIota) i).getPattern())
.toList();
var packet = new MsgNewSpiralPatternsS2C(sPlayer.getUUID(), patterns, 140);
IXplatAbstractions.INSTANCE.sendPacketToPlayer(sPlayer, packet);
IXplatAbstractions.INSTANCE.sendPacketTracking(sPlayer, packet);

boolean broken = breakAfterDepletion() && getMedia(stack) == 0;

Stat<?> stat;
Expand Down
Loading