- Баллы
- 66
- Имя в Minecraft
- HogeltBellai
Добрый день форумчане!
3 дней шёл моей битвы с исправлением энтити и их отгрузкой в прострацию.
Суть проблемы в том что пока есть проверка
, из за него не работает 2 часть кода
.
Изначальной идеей было пересоздавать пета если овенр далеко тепается от питомца, то питомец удаляется путём пакетов и пересоздаётся, но видимо из за этого не работает 2-ая часть кода, а она отвечает за подгрузку питомцев у всех кто подходит близко к любому владельцу питомца, без неё у других просто будет пропадать питомец после телепортаций (Не для овнера).
Мне нужно что бы обе части работали и у овнера нормально пересоздавался питомец(иначе он не будет виден ему) и соответственно у других ребят в близи он прогружался.
Код подгрузки питомцев
Код крафта питомца
3 дней шёл моей битвы с исправлением энтити и их отгрузкой в прострацию.
Суть проблемы в том что пока есть проверка
Код:
if (distance >= 20) {
Код:
} else if (distance < 20) {
Изначальной идеей было пересоздавать пета если овенр далеко тепается от питомца, то питомец удаляется путём пакетов и пересоздаётся, но видимо из за этого не работает 2-ая часть кода, а она отвечает за подгрузку питомцев у всех кто подходит близко к любому владельцу питомца, без неё у других просто будет пропадать питомец после телепортаций (Не для овнера).
Мне нужно что бы обе части работали и у овнера нормально пересоздавался питомец(иначе он не будет виден ему) и соответственно у других ребят в близи он прогружался.
Код:
private void movePet(Location location) {
try {
double distance = previousLocation.distance(location);
if (distance >= 20) {
//тут ещё должен быть ремов
//Важная тема, тут питомец для владельца пересоздаётся когда он далеко тепается
PetAPI petAPI = Prison.getInstance().getPet().loadPetData(new PlayerAPI().getPet(owner));
Prison.getInstance().getPet().spawnPet(owner, petAPI);
} else if (distance < 20) {
//Тут у других людей прогружается энтити
for (Player player : Bukkit.getOnlinePlayers()) {
CustomPet pet = playerPets.get(owner);
if (location.distance(player.getLocation()) <= 20) {
if (!this.playerNear.contains(player)) {
this.playerNear.add(player);
removePetForPlayer(player, pet);
loadPetsForOnlinePlayer(player, pet);
}
} else {
if (this.playerNear.contains(player)) {
this.playerNear.remove(player);
removePetForPlayer(player, pet);
}
}
}
} else {
PacketContainer teleportPacket = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_TELEPORT);
move(teleportPacket, owner.getLocation());
for(Player player : Bukkit.getOnlinePlayers()) {
ProtocolLibrary.getProtocolManager().sendServerPacket(player, teleportPacket);
}
}
previousLocation = location;
} catch (Exception ex) {
Bukkit.broadcastMessage("" + ex.getMessage());
ex.printStackTrace();
}
}
Код подгрузки питомцев
Код:
public static void loadPetsForOnlinePlayer(Player player, CustomPet pet) {
ProtocolLibrary.getProtocolManager().sendServerPacket(player, pet.spawnPacket);
ProtocolLibrary.getProtocolManager().sendServerPacket(player, pet.equipmentPacket);
ProtocolLibrary.getProtocolManager().sendServerPacket(player, pet.metadataPacket);
}
Код крафта питомца
Код:
public static void loadPetsForOnlinePlayer(Player player, CustomPet pet) {
private final Player owner;
private Location previousLocation;
private final PetAPI petAPI;
private int entityId;
private BukkitTask task;
private PacketContainer spawnPacket;
private PacketContainer equipmentPacket;
private PacketContainer metadataPacket;
private PacketContainer destroyPacket;
private UUID uuid;
public static final Map<Player, CustomPet> playerPets = new HashMap<>();
private List<Player> playerNear = null;
public CustomPet(Player owner, Location location, PetAPI petAPI) {
previousLocation = location;
this.owner = owner;
this.petAPI = petAPI;
this.playerNear = new ArrayList<>();
this.uuid = UUID.randomUUID();
this.spawnPacket = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SPAWN_ENTITY);
this.equipmentPacket = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_EQUIPMENT);
this.metadataPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA);
this.destroyPacket = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_DESTROY);
createPet(location);
startPetUpdate();
playerPets.put(owner, this);
}
public void createPet(Location location) {
try {
entityId = (int) (Math.random() * Integer.MAX_VALUE);
spawnPacket.getIntegers().write(0, entityId);
spawnPacket.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND);
spawnPacket.getUUIDs().write(0, uuid);
Bukkit.broadcastMessage(owner + " " + uuid + "");
spawnPacket.getDoubles().write(0, location.getX());
spawnPacket.getDoubles().write(1, location.getY());
spawnPacket.getDoubles().write(2, location.getZ());
equipmentPacket.getIntegers().write(0, entityId);
List<Pair<EnumWrappers.ItemSlot, ItemStack>> list = new ArrayList<>();
list.add(new Pair<>(EnumWrappers.ItemSlot.HEAD, petAPI.getHeadItem()));
equipmentPacket.getSlotStackPairLists().write(0, list);
metadataPacket.getModifier().writeDefaults();
metadataPacket.getIntegers().write(0, entityId);
WrappedDataWatcher dataWatcher = new WrappedDataWatcher();
WrappedChatComponent displayName = WrappedChatComponent.fromText(ChatColor.translateAlternateColorCodes('&', petAPI.getName().replace("%player%", owner.getName())));
dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.getChatComponentSerializer(true)), Optional.of(displayName));
dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, WrappedDataWatcher.Registry.get(Boolean.class)), true);
dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(14, WrappedDataWatcher.Registry.get(Byte.class)), (byte) 0x01);
dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class)), (byte) 0x20);
metadataPacket.getWatchableCollectionModifier().write(0, dataWatcher.getWatchableObjects());
for(Player player : Bukkit.getOnlinePlayers()) {
ProtocolLibrary.getProtocolManager().sendServerPacket(player, spawnPacket);
ProtocolLibrary.getProtocolManager().sendServerPacket(player, equipmentPacket);
ProtocolLibrary.getProtocolManager().sendServerPacket(player, metadataPacket);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}