mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-27 15:17:59 +01:00
Fixed placed spells not using the location specified when casting them with /cast
This commit is contained in:
parent
c8524a3024
commit
b372620a04
2 changed files with 24 additions and 13 deletions
|
@ -14,6 +14,7 @@ import com.minelittlepony.unicopia.particle.ParticleHandle;
|
||||||
import com.minelittlepony.unicopia.particle.UParticles;
|
import com.minelittlepony.unicopia.particle.UParticles;
|
||||||
import com.minelittlepony.unicopia.particle.ParticleHandle.Attachment;
|
import com.minelittlepony.unicopia.particle.ParticleHandle.Attachment;
|
||||||
import com.minelittlepony.unicopia.server.world.Ether;
|
import com.minelittlepony.unicopia.server.world.Ether;
|
||||||
|
import com.minelittlepony.unicopia.util.NbtSerialisable;
|
||||||
|
|
||||||
import net.minecraft.nbt.*;
|
import net.minecraft.nbt.*;
|
||||||
import net.minecraft.registry.*;
|
import net.minecraft.registry.*;
|
||||||
|
@ -52,6 +53,8 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
|
||||||
public float pitch;
|
public float pitch;
|
||||||
public float yaw;
|
public float yaw;
|
||||||
|
|
||||||
|
private Optional<Vec3d> position = Optional.empty();
|
||||||
|
|
||||||
public PlaceableSpell(CustomisedSpellType<?> type) {
|
public PlaceableSpell(CustomisedSpellType<?> type) {
|
||||||
super(type);
|
super(type);
|
||||||
}
|
}
|
||||||
|
@ -120,7 +123,7 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
|
||||||
|
|
||||||
private void spawnPlacedEntity(Caster<?> source) {
|
private void spawnPlacedEntity(Caster<?> source) {
|
||||||
CastSpellEntity entity = UEntities.CAST_SPELL.create(source.asWorld());
|
CastSpellEntity entity = UEntities.CAST_SPELL.create(source.asWorld());
|
||||||
Vec3d pos = castEntity.getPosition().orElse(source.getOriginVector());
|
Vec3d pos = castEntity.getPosition().orElse(position.orElse(source.getOriginVector()));
|
||||||
entity.updatePositionAndAngles(pos.x, pos.y, pos.z, source.asEntity().getYaw(), source.asEntity().getPitch());
|
entity.updatePositionAndAngles(pos.x, pos.y, pos.z, source.asEntity().getYaw(), source.asEntity().getPitch());
|
||||||
PlaceableSpell copy = spell.toPlaceable();
|
PlaceableSpell copy = spell.toPlaceable();
|
||||||
if (spell instanceof PlacementDelegate delegate) {
|
if (spell instanceof PlacementDelegate delegate) {
|
||||||
|
@ -140,7 +143,19 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
|
||||||
this.pitch = -90 - pitch;
|
this.pitch = -90 - pitch;
|
||||||
this.yaw = -yaw;
|
this.yaw = -yaw;
|
||||||
getDelegates(spell -> spell instanceof OrientedSpell o ? o : null)
|
getDelegates(spell -> spell instanceof OrientedSpell o ? o : null)
|
||||||
.forEach(oriented -> oriented.setOrientation(pitch, yaw));
|
.forEach(spell -> spell.setOrientation(pitch, yaw));
|
||||||
|
setDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPosition(Caster<?> source, Vec3d position) {
|
||||||
|
this.position = Optional.of(position);
|
||||||
|
getWorld(source).ifPresent(world -> {
|
||||||
|
castEntity.ifPresent(world, entity -> {
|
||||||
|
entity.updatePositionAndAngles(position.x, position.y, position.z, entity.getYaw(), entity.getPitch());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
getDelegates(spell -> spell instanceof PlaceableSpell o ? o : null)
|
||||||
|
.forEach(spell -> spell.setPosition(source ,position));
|
||||||
setDirty();
|
setDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,6 +203,9 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
|
||||||
super.toNBT(compound);
|
super.toNBT(compound);
|
||||||
compound.putFloat("pitch", pitch);
|
compound.putFloat("pitch", pitch);
|
||||||
compound.putFloat("yaw", yaw);
|
compound.putFloat("yaw", yaw);
|
||||||
|
position.ifPresent(pos -> {
|
||||||
|
compound.put("position", NbtSerialisable.writeVector(pos));
|
||||||
|
});
|
||||||
if (dimension != null) {
|
if (dimension != null) {
|
||||||
compound.putString("dimension", dimension.getValue().toString());
|
compound.putString("dimension", dimension.getValue().toString());
|
||||||
}
|
}
|
||||||
|
@ -200,6 +218,7 @@ public class PlaceableSpell extends AbstractDelegatingSpell implements OrientedS
|
||||||
super.fromNBT(compound);
|
super.fromNBT(compound);
|
||||||
pitch = compound.getFloat("pitch");
|
pitch = compound.getFloat("pitch");
|
||||||
yaw = compound.getFloat("yaw");
|
yaw = compound.getFloat("yaw");
|
||||||
|
position = compound.contains("position") ? Optional.of(NbtSerialisable.readVector(compound.getList("position", NbtElement.FLOAT_TYPE))) : Optional.empty();
|
||||||
if (compound.contains("dimension", NbtElement.STRING_TYPE)) {
|
if (compound.contains("dimension", NbtElement.STRING_TYPE)) {
|
||||||
Identifier id = Identifier.tryParse(compound.getString("dimension"));
|
Identifier id = Identifier.tryParse(compound.getString("dimension"));
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
|
|
|
@ -4,11 +4,9 @@ import java.util.Optional;
|
||||||
|
|
||||||
import com.minelittlepony.unicopia.ability.magic.Caster;
|
import com.minelittlepony.unicopia.ability.magic.Caster;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.PlaceableSpell;
|
import com.minelittlepony.unicopia.ability.magic.spell.PlaceableSpell;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.Situation;
|
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellType;
|
import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellType;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
|
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
|
||||||
import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
|
import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits;
|
||||||
import com.minelittlepony.unicopia.entity.CastSpellEntity;
|
|
||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import com.mojang.brigadier.arguments.FloatArgumentType;
|
import com.mojang.brigadier.arguments.FloatArgumentType;
|
||||||
import com.mojang.brigadier.builder.ArgumentBuilder;
|
import com.mojang.brigadier.builder.ArgumentBuilder;
|
||||||
|
@ -62,12 +60,12 @@ public class CastCommand {
|
||||||
CommandManager.literal("place").executes(c -> placed(c, traitsFunc, Optional.empty(), c.getSource().getRotation())).then(
|
CommandManager.literal("place").executes(c -> placed(c, traitsFunc, Optional.empty(), c.getSource().getRotation())).then(
|
||||||
CommandManager.argument("loc", BlockPosArgumentType.blockPos()).executes(c -> placed(c,
|
CommandManager.argument("loc", BlockPosArgumentType.blockPos()).executes(c -> placed(c,
|
||||||
traitsFunc,
|
traitsFunc,
|
||||||
Optional.of(BlockPosArgumentType.getBlockPos(c, "location").toCenterPos()),
|
Optional.of(BlockPosArgumentType.getBlockPos(c, "loc").toCenterPos()),
|
||||||
c.getSource().getRotation()
|
c.getSource().getRotation()
|
||||||
)).then(
|
)).then(
|
||||||
CommandManager.argument("rot", RotationArgumentType.rotation()).executes(c -> placed(c,
|
CommandManager.argument("rot", RotationArgumentType.rotation()).executes(c -> placed(c,
|
||||||
traitsFunc,
|
traitsFunc,
|
||||||
Optional.of(BlockPosArgumentType.getBlockPos(c, "location").toCenterPos()),
|
Optional.of(BlockPosArgumentType.getBlockPos(c, "loc").toCenterPos()),
|
||||||
RotationArgumentType.getRotation(c, "rot").toAbsoluteRotation(c.getSource())
|
RotationArgumentType.getRotation(c, "rot").toAbsoluteRotation(c.getSource())
|
||||||
))
|
))
|
||||||
)
|
)
|
||||||
|
@ -105,15 +103,9 @@ public class CastCommand {
|
||||||
Caster<?> caster = Caster.of(player).orElseThrow();
|
Caster<?> caster = Caster.of(player).orElseThrow();
|
||||||
|
|
||||||
spell.setOrientation(rotation.x, rotation.y);
|
spell.setOrientation(rotation.x, rotation.y);
|
||||||
|
position.ifPresent(pos -> spell.setPosition(caster, pos));
|
||||||
spell.apply(caster);
|
spell.apply(caster);
|
||||||
|
|
||||||
position.ifPresent(pos -> {
|
|
||||||
spell.tick(caster, Situation.BODY);
|
|
||||||
CastSpellEntity entity = spell.getSpellEntity(caster).orElseThrow();
|
|
||||||
entity.setPosition(pos);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue