- Баллы
- 76
- Имя в Minecraft
- Stamorey
Spigot 1.8
В общем, при спавне Entity ему дается уникальный id. Следующему заспавненном мобу id+1 и так далее, даже если моб умирает, этот id навсегда остается за ним(до рестарта), и другой моб с тем же id уже не заспавнится...
Нужно как-то вручную увеличить этот итератор, чтобы одно или несколько его значений были пропущены.
То есть, например есть id последнего заспавненного Entity - 30. Нужно пропустить одно или несколько следующих id , не давая серверу зарегистрировать моба c несколькими следующими id (31 32...).
(эти id нужны мне для отправки пакетов о спавне мобов, которых на самом деле нет)
Пока вижу два способа решения:
1. Сделать свой итератор, и начать его не с нуля, а например с 100 000, но все может быть, вдруг entity на сервере окажется больше 100 000 и тогда все будет очень плохо.
2. Спавнить entity, сразу же его убивать setHealth(0) например, использовать этот id для своих нужд, но в таком случае появится лишняя нагрузка на сервер, + игроку будет отправлять сразу два пакета спавна - от сервера и мой. (Пробовал спавнить моба под игроком в 1к блоков, все равно пакет отсылается, можно еще попробовать по X или У на 1к от игрока спавнить его, но если не ошибаюсь так будут грузиться чанки.)
Можно ли решить проблему без этих костылей? Заранее спасибо за ответ.)
Решение:
В общем, при спавне Entity ему дается уникальный id. Следующему заспавненном мобу id+1 и так далее, даже если моб умирает, этот id навсегда остается за ним(до рестарта), и другой моб с тем же id уже не заспавнится...
Нужно как-то вручную увеличить этот итератор, чтобы одно или несколько его значений были пропущены.
То есть, например есть id последнего заспавненного Entity - 30. Нужно пропустить одно или несколько следующих id , не давая серверу зарегистрировать моба c несколькими следующими id (31 32...).
(эти id нужны мне для отправки пакетов о спавне мобов, которых на самом деле нет)
Пока вижу два способа решения:
1. Сделать свой итератор, и начать его не с нуля, а например с 100 000, но все может быть, вдруг entity на сервере окажется больше 100 000 и тогда все будет очень плохо.
2. Спавнить entity, сразу же его убивать setHealth(0) например, использовать этот id для своих нужд, но в таком случае появится лишняя нагрузка на сервер, + игроку будет отправлять сразу два пакета спавна - от сервера и мой. (Пробовал спавнить моба под игроком в 1к блоков, все равно пакет отсылается, можно еще попробовать по X или У на 1к от игрока спавнить его, но если не ошибаюсь так будут грузиться чанки.)
Можно ли решить проблему без этих костылей? Заранее спасибо за ответ.)
Решение:
С помощью рефлексии достаем нужную переменную и увеличиваем её(в данном примере на 1)
JavaScript:
Field fieldZ = Entity.class.getDeclaredField("entityCount");
fieldZ.setAccessible(true);
fieldZ.setInt((CraftPlayer)p, fieldZ.getInt((CraftPlayer)p)+1);
int z = fieldZ.getInt((CraftPlayer)p);
p.sendMessage("ID: "+z);
//Последние две строки для проверки.
// Вместо (CraftPlayer)p можно было брать любой
// другой экземпляр наследника Entity, но мне было
//удобнее так.
Создаем ентити, который не спавнится в мире, но счетчик увеличится, возможно этого ентити как-то придется удалить, да и вообще лучше пользоваться первым способом.
JavaScript:
EntityArrow entityA = new EntityArrow(((CraftWorld) p.getWorld()).getHandle());
Последнее редактирование: