mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-27 15:17:59 +01:00
Fix the displacement spell. Fixes #456
This commit is contained in:
parent
aa7c4511e9
commit
956dbd26b9
3 changed files with 62 additions and 36 deletions
|
@ -77,39 +77,38 @@ public class PlacementControlSpell extends AbstractSpell implements OrientedSpel
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Caster<?> caster) {
|
public boolean apply(Caster<?> caster) {
|
||||||
if (delegate == null) {
|
return delegate != null && super.apply(caster);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
boolean result = super.apply(caster);
|
|
||||||
if (result) {
|
|
||||||
if (dimension.isEmpty()) {
|
|
||||||
setDimension(caster.asWorld().getRegistryKey());
|
|
||||||
}
|
|
||||||
if (position.isEmpty()) {
|
|
||||||
setPosition(caster.asEntity().getPos());
|
|
||||||
}
|
|
||||||
if (delegate instanceof PlacementDelegate) {
|
|
||||||
((PlacementDelegate)delegate).onPlaced(caster, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
CastSpellEntity entity = new CastSpellEntity(caster.asWorld(), caster, this);
|
|
||||||
|
|
||||||
Vec3d pos = position.get();
|
|
||||||
Vec3d rot = orientation.orElse(Vec3d.ZERO);
|
|
||||||
|
|
||||||
entity.updatePositionAndAngles(pos.x, pos.y, pos.z, (float)rot.y, (float)rot.x);
|
|
||||||
entity.getWorld().spawnEntity(entity);
|
|
||||||
|
|
||||||
placedEntityId = entity.getUuid();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean tick(Caster<?> source, Situation situation) {
|
public boolean tick(Caster<?> source, Situation situation) {
|
||||||
if (!source.isClient() && getConnection(source) == null) {
|
if (!source.isClient()) {
|
||||||
setDead();
|
|
||||||
|
if (placedEntityId == null) {
|
||||||
|
if (dimension.isEmpty()) {
|
||||||
|
setDimension(source.asWorld().getRegistryKey());
|
||||||
|
}
|
||||||
|
if (position.isEmpty()) {
|
||||||
|
setPosition(source.asEntity().getPos());
|
||||||
|
}
|
||||||
|
System.out.println("Creating placed spell");
|
||||||
|
CastSpellEntity entity = new CastSpellEntity(source.asWorld(), source, this);
|
||||||
|
|
||||||
|
Vec3d pos = position.get();
|
||||||
|
Vec3d rot = orientation.orElse(Vec3d.ZERO);
|
||||||
|
|
||||||
|
entity.updatePositionAndAngles(pos.x, pos.y, pos.z, (float)rot.y, (float)rot.x);
|
||||||
|
entity.getWorld().spawnEntity(entity);
|
||||||
|
|
||||||
|
placedEntityId = entity.getUuid();
|
||||||
|
setDirty();
|
||||||
|
} else {
|
||||||
|
if (getConnection(source) == null) {
|
||||||
|
setDead();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return !isDead();
|
return !isDead();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,13 @@ import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.util.hit.EntityHitResult;
|
import net.minecraft.util.hit.EntityHitResult;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
public class DisplacementSpell extends AbstractSpell implements HomingSpell, ProjectileDelegate.EntityHitListener {
|
public class DisplacementSpell extends AbstractSpell implements HomingSpell, ProjectileDelegate.HitListener {
|
||||||
|
|
||||||
private static final SpellAttribute<Float> DAMAGE_TO_TARGET = SpellAttribute.create(SpellAttributeType.DAMAGE_TO_TARGET, AttributeFormat.REGULAR, AttributeFormat.PERCENTAGE, Trait.BLOOD, blood -> blood);
|
private static final SpellAttribute<Float> DAMAGE_TO_TARGET = SpellAttribute.create(SpellAttributeType.DAMAGE_TO_TARGET, AttributeFormat.REGULAR, AttributeFormat.PERCENTAGE, Trait.BLOOD, blood -> blood);
|
||||||
|
|
||||||
static final TooltipFactory TOOLTIP = DAMAGE_TO_TARGET;
|
static final TooltipFactory TOOLTIP = DAMAGE_TO_TARGET;
|
||||||
|
|
||||||
private final EntityReference<Entity> target = new EntityReference<>();
|
private final EntityReference<Entity> target = dataTracker.startTracking(new EntityReference<>());
|
||||||
|
|
||||||
private int ticks = 10;
|
private int ticks = 10;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ public class DisplacementSpell extends AbstractSpell implements HomingSpell, Pro
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Spell prepareForCast(Caster<?> caster, CastingMethod method) {
|
public Spell prepareForCast(Caster<?> caster, CastingMethod method) {
|
||||||
return toPlaceable();
|
return method.isIndirectCause() ? this : toPlaceable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -43,14 +43,23 @@ public class DisplacementSpell extends AbstractSpell implements HomingSpell, Pro
|
||||||
|
|
||||||
originator.asEntity().setGlowing(true);
|
originator.asEntity().setGlowing(true);
|
||||||
|
|
||||||
|
if (situation == Situation.PROJECTILE) {
|
||||||
|
return !isDead();
|
||||||
|
}
|
||||||
|
|
||||||
ticks--;
|
ticks--;
|
||||||
|
|
||||||
if (originator.isClient()) {
|
if (originator.isClient()) {
|
||||||
return !isDead() || ticks >= -10;
|
return !isDead() || ticks >= -10;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ticks == 0) {
|
if (!originator.isClient()) {
|
||||||
target.ifPresent(originator.asWorld(), target -> apply(originator, target));
|
target.ifPresent(originator.asWorld(), target -> {
|
||||||
|
target.setGlowing(true);
|
||||||
|
if (ticks == 0) {
|
||||||
|
apply(originator, target);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return ticks >= -10;
|
return ticks >= -10;
|
||||||
|
@ -58,7 +67,18 @@ public class DisplacementSpell extends AbstractSpell implements HomingSpell, Pro
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onImpact(MagicProjectileEntity projectile, EntityHitResult hit) {
|
public void onImpact(MagicProjectileEntity projectile, EntityHitResult hit) {
|
||||||
Caster.of(projectile.getMaster()).ifPresent(originator -> apply(originator, hit.getEntity()));
|
HitListener.super.onImpact(projectile, hit);
|
||||||
|
Caster.of(projectile.getMaster()).ifPresent(originator -> {
|
||||||
|
apply(originator, hit.getEntity());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onImpact(MagicProjectileEntity projectile) {
|
||||||
|
if (projectile.getMaster() instanceof Entity owner) {
|
||||||
|
owner.setGlowing(false);
|
||||||
|
}
|
||||||
|
target.ifPresent(projectile.asWorld(), e -> e.setGlowing(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void apply(Caster<?> originator, Entity target) {
|
private void apply(Caster<?> originator, Entity target) {
|
||||||
|
@ -107,11 +127,13 @@ public class DisplacementSpell extends AbstractSpell implements HomingSpell, Pro
|
||||||
public void toNBT(NbtCompound compound) {
|
public void toNBT(NbtCompound compound) {
|
||||||
super.toNBT(compound);
|
super.toNBT(compound);
|
||||||
compound.putInt("ticks", ticks);
|
compound.putInt("ticks", ticks);
|
||||||
|
compound.put("target", target.toNBT());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fromNBT(NbtCompound compound) {
|
public void fromNBT(NbtCompound compound) {
|
||||||
super.fromNBT(compound);
|
super.fromNBT(compound);
|
||||||
ticks = compound.getInt("ticks");
|
ticks = compound.getInt("ticks");
|
||||||
|
target.fromNBT(compound.getCompound("target"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.ability.magic.SpellSlots;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.PlacementControlSpell;
|
import com.minelittlepony.unicopia.ability.magic.spell.PlacementControlSpell;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.Situation;
|
import com.minelittlepony.unicopia.ability.magic.spell.Situation;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.Spell;
|
import com.minelittlepony.unicopia.ability.magic.spell.Spell;
|
||||||
|
import com.minelittlepony.unicopia.ability.magic.spell.PlacementControlSpell.PlacementDelegate;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
|
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
|
||||||
import com.minelittlepony.unicopia.entity.EntityPhysics;
|
import com.minelittlepony.unicopia.entity.EntityPhysics;
|
||||||
import com.minelittlepony.unicopia.entity.EntityReference;
|
import com.minelittlepony.unicopia.entity.EntityReference;
|
||||||
|
@ -70,8 +71,12 @@ public class CastSpellEntity extends LightEmittingEntity implements Caster<CastS
|
||||||
this.controllingEntityUuid = caster.asEntity().getUuid();
|
this.controllingEntityUuid = caster.asEntity().getUuid();
|
||||||
this.controllingSpellUuid = control.getUuid();
|
this.controllingSpellUuid = control.getUuid();
|
||||||
setCaster(caster);
|
setCaster(caster);
|
||||||
Spell spell = Spell.copy(control.getDelegate());
|
|
||||||
spells.getSlots().put(spell);
|
if (control.getDelegate() instanceof PlacementDelegate delegate) {
|
||||||
|
delegate.onPlaced(caster, control);
|
||||||
|
}
|
||||||
|
|
||||||
|
spells.getSlots().put(Spell.copy(control.getDelegate()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public CastSpellEntity(EntityType<?> type, World world) {
|
public CastSpellEntity(EntityType<?> type, World world) {
|
||||||
|
|
Loading…
Reference in a new issue