Fix phantom bugs

This commit is contained in:
fullwall 2023-02-05 15:25:29 +08:00
parent 2a64529bb1
commit ba04e4b05f
11 changed files with 46 additions and 102 deletions

View File

@ -34,7 +34,7 @@ public class CitizensPlaceholders extends PlaceholderExpansion {
return null;
if (params.equalsIgnoreCase("citizens_selected_npc_name")) {
return selector.getSelected((CommandSender) player).getName();
return selector.getSelected((CommandSender) player).getFullName();
}
if (params.equalsIgnoreCase("citizens_selected_npc_id")) {

View File

@ -446,7 +446,7 @@ public class CitizensNPC extends AbstractNPC {
@Override
public String toString() {
EntityType mobType = hasTrait(MobType.class) ? getTraitNullable(MobType.class).getType() : null;
return getId() + "{" + getName() + ", " + mobType + "}";
return getId() + "{" + getFullName() + ", " + mobType + "}";
}
@Override

View File

@ -39,9 +39,9 @@ public class Chat implements VocalChord {
String text = Setting.CHAT_FORMAT_TO_TARGET.asString().replace("<text>", context.getMessage());
String targetName = "";
// For each recipient
for (Talkable entity : context) {
entity.talkTo(context, text, this);
targetName = entity.getName();
for (Talkable talkable : context) {
talkable.talkTo(context, text, this);
targetName = talkable.getName();
}
// Check if bystanders hear targeted chat
if (!Setting.CHAT_BYSTANDERS_HEAR_TARGETED_CHAT.asBoolean())
@ -57,9 +57,9 @@ public class Chat implements VocalChord {
String text = Setting.CHAT_FORMAT_TO_TARGET.asString().replace("<text>", context.getMessage());
List<String> targetNames = new ArrayList<String>();
// Talk to each recipient
for (Talkable entity : context) {
entity.talkTo(context, text, this);
targetNames.add(entity.getName());
for (Talkable talkable : context) {
talkable.talkTo(context, text, this);
targetNames.add(talkable.getName());
}
if (!Setting.CHAT_BYSTANDERS_HEAR_TARGETED_CHAT.asBoolean())

View File

@ -158,19 +158,23 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab
return true;
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR)
private void onPlayerInteract(PlayerInteractEvent event) {
if (!npc.isSpawned() || !enabled)
return;
Action performed = event.getAction();
if (NMS.getPassengers(npc.getEntity()).contains(npc.getEntity()))
if (!NMS.getPassengers(npc.getEntity()).contains(event.getPlayer()))
return;
switch (performed) {
case RIGHT_CLICK_BLOCK:
if (event.isCancelled())
return;
case RIGHT_CLICK_AIR:
controller.rightClick(event);
break;
case LEFT_CLICK_BLOCK:
if (event.isCancelled())
return;
case LEFT_CLICK_AIR:
controller.leftClick(event);
break;
@ -393,7 +397,7 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab
@Override
public void rightClick(PlayerInteractEvent event) {
npc.getEntity().setVelocity(npc.getEntity().getVelocity().setY(-0.3F));
npc.getEntity().setVelocity(npc.getEntity().getVelocity().setY(-0.25F));
}
@Override
@ -411,9 +415,10 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab
speed = updateHorizontalSpeed(npc.getEntity(), rider, speed, 1F);
boolean shouldJump = NMS.shouldJump(rider);
if (shouldJump) {
npc.getEntity().setVelocity(npc.getEntity().getVelocity().setY(0.3F));
npc.getEntity().setVelocity(npc.getEntity().getVelocity().setY(0.25F));
}
npc.getEntity().setVelocity(npc.getEntity().getVelocity().multiply(new Vector(1, 0.98, 1)));
setMountedYaw(npc.getEntity());
}
}
@ -458,6 +463,10 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab
registerControllerType(EntityType.valueOf("PARROT"), PlayerInputAirController.class);
} catch (IllegalArgumentException ex) {
}
try {
registerControllerType(EntityType.valueOf("PHANTOM"), PlayerInputAirController.class);
} catch (IllegalArgumentException ex) {
}
registerControllerType(EntityType.UNKNOWN, LookAirController.class);
}
}

View File

@ -73,6 +73,7 @@ public class EntityMarkers<T> {
*/
public Entity spawnMarker(World world, Location at) {
NPC npc = registry.createNPC(type, "");
npc.data().set(NPC.Metadata.NAMEPLATE_VISIBLE, false);
npc.spawn(at.clone().add(0.5, 0, 0.5), SpawnReason.CREATE);
return npc.getEntity();
}

View File

@ -53,7 +53,6 @@ public class PhantomController extends MobEntityController {
super(types, world);
this.npc = (CitizensNPC) npc;
if (npc != null) {
setNoAI(true);
this.moveController = new ControllerMove(this);
this.lookController = new ControllerLook(this);
// TODO: phantom pitch reversed

View File

@ -25,7 +25,6 @@ import net.minecraft.server.v1_15_R1.EntityBoat;
import net.minecraft.server.v1_15_R1.EntityMinecartAbstract;
import net.minecraft.server.v1_15_R1.EntityPhantom;
import net.minecraft.server.v1_15_R1.EntityTypes;
import net.minecraft.server.v1_15_R1.EnumDifficulty;
import net.minecraft.server.v1_15_R1.FluidType;
import net.minecraft.server.v1_15_R1.IBlockData;
import net.minecraft.server.v1_15_R1.NBTTagCompound;
@ -59,7 +58,6 @@ public class PhantomController extends MobEntityController {
super(types, world);
this.npc = (CitizensNPC) npc;
if (npc != null) {
setNoAI(true);
this.oldMoveController = this.moveController;
this.oldLookController = this.lookController;
this.moveController = new ControllerMove(this);
@ -211,6 +209,11 @@ public class PhantomController extends MobEntityController {
return false; // shouldLeash
}
@Override
protected boolean J() {
return npc != null ? false : super.J();
}
@Override
public void movementTick() {
super.movementTick();
@ -219,12 +222,10 @@ public class PhantomController extends MobEntityController {
if (npc.useMinecraftAI() && this.moveController != this.oldMoveController) {
this.moveController = this.oldMoveController;
this.lookController = this.oldLookController;
setNoAI(false);
}
if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) {
this.moveController = new PlayerControllerMove(this);
this.lookController = new ControllerLook(this);
setNoAI(true);
}
if (npc.isProtected()) {
this.setOnFire(0);
@ -240,19 +241,6 @@ public class PhantomController extends MobEntityController {
}
return super.n(entity);
}
@Override
public void tick() {
// avoid suicide
boolean resetDifficulty = this.world.getDifficulty() == EnumDifficulty.PEACEFUL;
if (npc != null && resetDifficulty) {
this.world.getWorldData().setDifficulty(EnumDifficulty.NORMAL);
}
super.tick();
if (npc != null && resetDifficulty) {
this.world.getWorldData().setDifficulty(EnumDifficulty.PEACEFUL);
}
}
}
public static class PhantomNPC extends CraftPhantom implements ForwardingNPCHolder {

View File

@ -26,7 +26,6 @@ import net.minecraft.server.v1_16_R3.EntityBoat;
import net.minecraft.server.v1_16_R3.EntityMinecartAbstract;
import net.minecraft.server.v1_16_R3.EntityPhantom;
import net.minecraft.server.v1_16_R3.EntityTypes;
import net.minecraft.server.v1_16_R3.EnumDifficulty;
import net.minecraft.server.v1_16_R3.FluidType;
import net.minecraft.server.v1_16_R3.IBlockData;
import net.minecraft.server.v1_16_R3.NBTTagCompound;
@ -34,7 +33,6 @@ import net.minecraft.server.v1_16_R3.SoundEffect;
import net.minecraft.server.v1_16_R3.Tag;
import net.minecraft.server.v1_16_R3.Vec3D;
import net.minecraft.server.v1_16_R3.World;
import net.minecraft.server.v1_16_R3.WorldDataServer;
public class PhantomController extends MobEntityController {
public PhantomController() {
@ -63,7 +61,6 @@ public class PhantomController extends MobEntityController {
super(types, world);
this.npc = (CitizensNPC) npc;
if (npc != null) {
setNoAI(true);
this.oldMoveController = this.moveController;
this.oldLookController = this.lookController;
this.moveController = new ControllerMove(this);
@ -226,6 +223,11 @@ public class PhantomController extends MobEntityController {
return false; // shouldLeash
}
@Override
protected boolean L() {
return npc != null ? false : super.L();
}
@Override
public void movementTick() {
super.movementTick();
@ -234,15 +236,13 @@ public class PhantomController extends MobEntityController {
if (npc.useMinecraftAI() && this.moveController != this.oldMoveController) {
this.moveController = this.oldMoveController;
this.lookController = this.oldLookController;
setNoAI(false);
}
if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) {
this.moveController = new PlayerControllerMove(this);
this.lookController = new ControllerLook(this);
setNoAI(true);
}
if (npc.isProtected()) {
this.setOnFire(0);
setOnFire(0);
}
npc.update();
}
@ -255,19 +255,6 @@ public class PhantomController extends MobEntityController {
}
return super.n(entity);
}
@Override
public void tick() {
// avoid suicide
boolean resetDifficulty = this.world.getDifficulty() == EnumDifficulty.PEACEFUL;
if (npc != null && resetDifficulty) {
((WorldDataServer) this.world.getWorldData()).setDifficulty(EnumDifficulty.NORMAL);
}
super.tick();
if (npc != null && resetDifficulty) {
((WorldDataServer) this.world.getWorldData()).setDifficulty(EnumDifficulty.PEACEFUL);
}
}
}
public static class PhantomNPC extends CraftPhantom implements ForwardingNPCHolder {

View File

@ -20,7 +20,6 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.tags.Tag;
import net.minecraft.world.Difficulty;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
@ -32,7 +31,6 @@ import net.minecraft.world.entity.vehicle.Boat;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.storage.WorldData;
import net.minecraft.world.phys.Vec3;
public class PhantomController extends MobEntityController {
@ -61,7 +59,6 @@ public class PhantomController extends MobEntityController {
super(types, level);
this.npc = (CitizensNPC) npc;
if (npc != null) {
setNoAi(true);
this.oldMoveController = this.moveControl;
this.oldLookController = this.lookControl;
this.moveControl = new MoveControl(this);
@ -78,12 +75,10 @@ public class PhantomController extends MobEntityController {
if (npc.useMinecraftAI() && this.moveControl != this.oldMoveController) {
this.moveControl = this.oldMoveController;
this.lookControl = this.oldLookController;
setNoAi(false);
}
if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) {
this.moveControl = new PlayerMoveControl(this);
this.lookControl = new LookControl(this);
setNoAi(true);
}
if (npc.isProtected()) {
this.setSecondsOnFire(0);
@ -237,16 +232,8 @@ public class PhantomController extends MobEntityController {
}
@Override
public void tick() {
// avoid suicide
boolean resetDifficulty = npc != null && this.level.getDifficulty() == Difficulty.PEACEFUL;
if (resetDifficulty) {
((WorldData) this.level.getLevelData()).setDifficulty(Difficulty.NORMAL);
}
super.tick();
if (resetDifficulty) {
((WorldData) this.level.getLevelData()).setDifficulty(Difficulty.PEACEFUL);
}
protected boolean shouldDespawnInPeaceful() {
return npc != null ? false : super.shouldDespawnInPeaceful();
}
@Override

View File

@ -21,7 +21,6 @@ import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.tags.TagKey;
import net.minecraft.world.Difficulty;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
@ -33,7 +32,6 @@ import net.minecraft.world.entity.vehicle.Boat;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.storage.WorldData;
import net.minecraft.world.phys.Vec3;
public class PhantomController extends MobEntityController {
@ -62,7 +60,6 @@ public class PhantomController extends MobEntityController {
super(types, level);
this.npc = (CitizensNPC) npc;
if (npc != null) {
setNoAi(true);
this.oldMoveController = this.moveControl;
this.oldLookController = this.lookControl;
this.moveControl = new MoveControl(this);
@ -79,12 +76,10 @@ public class PhantomController extends MobEntityController {
if (npc.useMinecraftAI() && this.moveControl != this.oldMoveController) {
this.moveControl = this.oldMoveController;
this.lookControl = this.oldLookController;
setNoAi(false);
}
if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) {
this.moveControl = new PlayerMoveControl(this);
this.lookControl = new LookControl(this);
setNoAi(true);
}
if (npc.isProtected()) {
this.setSecondsOnFire(0);
@ -237,6 +232,11 @@ public class PhantomController extends MobEntityController {
return npc == null ? super.save(save) : false;
}
@Override
protected boolean shouldDespawnInPeaceful() {
return npc != null ? false : super.shouldDespawnInPeaceful();
}
@Override
public Entity teleportTo(ServerLevel worldserver, BlockPos location) {
if (npc == null)
@ -244,19 +244,6 @@ public class PhantomController extends MobEntityController {
return NMSImpl.teleportAcrossWorld(this, worldserver, location);
}
@Override
public void tick() {
// avoid suicide
boolean resetDifficulty = npc != null && this.level.getDifficulty() == Difficulty.PEACEFUL;
if (resetDifficulty) {
((WorldData) this.level.getLevelData()).setDifficulty(Difficulty.NORMAL);
}
super.tick();
if (resetDifficulty) {
((WorldData) this.level.getLevelData()).setDifficulty(Difficulty.PEACEFUL);
}
}
@Override
public void travel(Vec3 vec3d) {
if (npc == null || !npc.isFlyable()) {

View File

@ -22,7 +22,6 @@ import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.tags.TagKey;
import net.minecraft.world.Difficulty;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
@ -34,7 +33,6 @@ import net.minecraft.world.entity.vehicle.Boat;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.storage.WorldData;
import net.minecraft.world.phys.Vec3;
public class PhantomController extends MobEntityController {
@ -49,7 +47,6 @@ public class PhantomController extends MobEntityController {
public static class EntityPhantomNPC extends Phantom implements NPCHolder {
boolean calledNMSHeight = false;
private final CitizensNPC npc;
private LookControl oldLookController;
private MoveControl oldMoveController;
@ -62,7 +59,6 @@ public class PhantomController extends MobEntityController {
super(types, level);
this.npc = (CitizensNPC) npc;
if (npc != null) {
setNoAi(true);
this.oldMoveController = this.moveControl;
this.oldLookController = this.lookControl;
this.moveControl = new MoveControl(this);
@ -79,15 +75,13 @@ public class PhantomController extends MobEntityController {
if (npc.useMinecraftAI() && this.moveControl != this.oldMoveController) {
this.moveControl = this.oldMoveController;
this.lookControl = this.oldLookController;
setNoAi(false);
}
if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) {
this.moveControl = new PlayerMoveControl(this);
this.lookControl = new LookControl(this);
setNoAi(true);
}
if (npc.isProtected()) {
this.setSecondsOnFire(0);
setSecondsOnFire(0);
}
npc.update();
}
@ -229,6 +223,11 @@ public class PhantomController extends MobEntityController {
return npc == null ? super.save(save) : false;
}
@Override
protected boolean shouldDespawnInPeaceful() {
return npc != null ? false : super.shouldDespawnInPeaceful();
}
@Override
public Entity teleportTo(ServerLevel worldserver, PositionImpl location) {
if (npc == null)
@ -236,19 +235,6 @@ public class PhantomController extends MobEntityController {
return NMSImpl.teleportAcrossWorld(this, worldserver, location);
}
@Override
public void tick() {
// avoid suicide
boolean resetDifficulty = npc != null && this.level.getDifficulty() == Difficulty.PEACEFUL;
if (resetDifficulty) {
((WorldData) this.level.getLevelData()).setDifficulty(Difficulty.NORMAL);
}
super.tick();
if (resetDifficulty) {
((WorldData) this.level.getLevelData()).setDifficulty(Difficulty.PEACEFUL);
}
}
@Override
public void travel(Vec3 vec3d) {
if (npc == null || !npc.isFlyable()) {