|
|
|
@ -19,6 +19,7 @@ import net.minecraft.entity.data.DataTracker;
|
|
|
|
|
import net.minecraft.entity.data.TrackedData;
|
|
|
|
|
import net.minecraft.entity.data.TrackedDataHandler;
|
|
|
|
|
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
|
|
|
|
|
import net.minecraft.entity.mob.Monster;
|
|
|
|
|
import net.minecraft.entity.player.PlayerEntity;
|
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
|
import net.minecraft.item.Items;
|
|
|
|
@ -47,7 +48,7 @@ import java.util.List;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("EntityConstructor")
|
|
|
|
|
public class HerobrineEntity extends LivingEntity {
|
|
|
|
|
public class HerobrineEntity extends LivingEntity implements Monster {
|
|
|
|
|
private static final TrackedDataHandler<Pose> POSE_HANDLER = new TrackedDataHandler<Pose>() {
|
|
|
|
|
@Override
|
|
|
|
|
public void write(PacketByteBuf data, Pose object) {
|
|
|
|
@ -196,9 +197,9 @@ public class HerobrineEntity extends LivingEntity {
|
|
|
|
|
} else if (noPlayerTeleportCountdown == 0) {
|
|
|
|
|
reset = true;
|
|
|
|
|
List<? extends PlayerEntity> players = getEntityWorld().getPlayers();
|
|
|
|
|
Collections.shuffle(players);
|
|
|
|
|
if (players.size() > 0 || getNearestPlayer().distanceTo(this) >= HardcodedConfig.HEROBRINE_MAX_DISTANCE) {
|
|
|
|
|
while (true) {
|
|
|
|
|
PlayerEntity player = players.get(getEntityWorld().random.nextInt(players.size()));
|
|
|
|
|
for (PlayerEntity player : players) {
|
|
|
|
|
if (player.isAlive()) {
|
|
|
|
|
getAI().setStage(new TeleportStage(this, player.getUuid()));
|
|
|
|
|
break;
|
|
|
|
@ -230,18 +231,12 @@ public class HerobrineEntity extends LivingEntity {
|
|
|
|
|
|
|
|
|
|
public ServerPlayerEntity getNearestPlayer() {
|
|
|
|
|
tracking.sort((player1, player2) -> Float.compare(distanceTo(player1), distanceTo(player2)));
|
|
|
|
|
if (tracking.size() > 0) {
|
|
|
|
|
int i = 0;
|
|
|
|
|
while (true) {
|
|
|
|
|
if (tracking.get(i).isAlive()) {
|
|
|
|
|
return tracking.get(i);
|
|
|
|
|
} else {
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
for (ServerPlayerEntity player : tracking) {
|
|
|
|
|
if (player.isAlive()) {
|
|
|
|
|
return player;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void summon(PlayerEntity player) {
|
|
|
|
@ -250,12 +245,13 @@ public class HerobrineEntity extends LivingEntity {
|
|
|
|
|
if (entity == null) {
|
|
|
|
|
ServerWorld world = Objects.requireNonNull(player.getEntityWorld().getServer()).getWorld(World.OVERWORLD);
|
|
|
|
|
entity = new HerobrineEntity(HerobrineRewoven.HEROBRINE_ENTITY_TYPE, world);
|
|
|
|
|
entity.updatePosition(0d, 51200d, 0d);
|
|
|
|
|
assert world != null;
|
|
|
|
|
Objects.requireNonNull(world.getServer().getWorld(World.OVERWORLD)).spawnEntity(entity);
|
|
|
|
|
ServerWorld serverWorld = Objects.requireNonNull(world.getServer().getWorld(World.OVERWORLD));
|
|
|
|
|
BlockPos spawn = serverWorld.getSpawnPos();
|
|
|
|
|
entity.updatePosition(spawn.getX() + 0.5d, spawn.getY(), spawn.getZ() + 0.5d);
|
|
|
|
|
serverWorld.spawnEntity(entity);
|
|
|
|
|
data.set(entity.getUuid());
|
|
|
|
|
world.getServer().getPlayerManager().sendToAll(new GameMessageS2CPacket(new TranslatableText("multiplayer.player.joined", entity.getDisplayName()).formatted(Formatting.YELLOW), MessageType.CHAT, Util.NIL_UUID));
|
|
|
|
|
entity.getAI().setStage(new TeleportStage(entity, world.getSpawnPos()));
|
|
|
|
|
world.getServer().getPlayerManager().sendToAll(new GameMessageS2CPacket(new TranslatableText(entity.getMessageKey("spawn"), entity.getDisplayName()), MessageType.CHAT, Util.NIL_UUID));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|