Синхронизация рендера игрока на сервере

Версия Minecraft
1.7.10
API
Forge
48
2
9
Я хочу отрендерить игрока от третьего лица при кое-каком действии с немного приподнятой рукой (как когда зажимаешь ПКМ с мечём в руках). Как сделать так, чтобы его приподнятую руку увидели все на сервере?
Я понимаю, что клиент должен отправить на сервер пакет, который скажет, что нужно отрендерить себя вот так. После чего сервер разошлет всем близлежайшим игрокам другой пакет, который скажет, что такого-то игрока нужно отрендерить с приподнятой рукой.
Мне тут не понятно только как получить доступ к рендеру конкретного игрока при получении пакета с сервера? Может я все-же думаю не в ту сторону и это реализовываеться по-другому?
И да, player.setItemInUse мне не подойдет из-за того, что там еще замедление игрока и поворот предмета от первого лица.
 
Решение
Убрать статическую переменную ClientStorage.isAiming и доставать этот isAiming из игрока. Юзать для этого IEEP или мапу - дело твоё.
Если так впадлу делать IEEP - записывай данные в EntityPlayer#getEntityData(). В рендере оттуда же и доставай их.

tox1cozZ

aka Agravaine
8,456
598
2,892
Тебе не надо получать рендер из пакета. Тебе нужно записать в игрока данные пакета.
Чтобы как-то идентифицировать игрока (кому надо данные записать), нужно еще передавать его айдишник, а на клиенте уже доставать через World#getEntityById().
Потом уже в рендере относительно данных игрока рисовать то что тебе нужно.
 
48
2
9
на клиенте уже доставать через World#getEntityById()
Ок, а как получить доступ к самому рендеру игрока? Например другая ситуация, когда мне надо, чтобы игрок поставил руки перед собой (как когда натягиваеться тетева у лука), то на клиенте я делаю так
Java:
@SubscribeEvent(priority = EventPriority.NORMAL, receiveCanceled = true)
    public void preRender(RenderPlayerEvent.Pre event) {
        ItemStack itemStack = event.entityPlayer.inventory.getCurrentItem();
        if (ClientStorage.isAiming && itemStack != null && itemStack.getItem() instanceof ItemFirearm) /* мои проверки */ {
            event.renderer.modelBipedMain.aimedBow = true;
            event.renderer.modelArmorChestplate.aimedBow = true;
            event.renderer.modelArmor.aimedBow = true;
        }
    }
Тут я обращяюсь к полям event.renderer, чтобы изменить вид игрока. Как мне сделать это через World#getEntityById()?
 

tox1cozZ

aka Agravaine
8,456
598
2,892
Тебе это в пакете нужно делать, чтобы применить к нужному игроку.
Ты с сервера отсылаешь всем игрокам (в радиусе или во всем мире - неважно). Каждый клиент принимает пакет. Откуда он знает к какому конкретно игроку адресованы эти данные? Ты с сервера передаешь айди игрока, которому они адресованы. В пакете достаешь игрока через World#getEntityById() и устанавливаешь ему данные.
В рендере же менять ничего не надо, просто достать эти данные из event.entityPlayer и относительно них что-то делать. Убрать статическую переменную ClientStorage.isAiming и доставать этот isAiming из игрока. Юзать для этого IEEP или мапу - дело твоё.
 
48
2
9
Тебе это в пакете нужно делать, чтобы применить к нужному игроку.
Ты с сервера отсылаешь всем игрокам (в радиусе или во всем мире - неважно). Каждый клиент принимает пакет. Откуда он знает к какому конкретно игроку адресованы эти данные? Ты с сервера передаешь айди игрока, которому они адресованы. В пакете достаешь игрока через World#getEntityById() и устанавливаешь ему данные. В рендере же менять ничего не надо.
Да, это я понял)
Можешь тогда сказать как мне заставить игрока поднять руку (так же как и при ПКМ с мечем) через класс EntityPlayer, который я получу из World#getEntityById(). Это просто единственное, что я не понимаю
 

tox1cozZ

aka Agravaine
8,456
598
2,892
Убрать статическую переменную ClientStorage.isAiming и доставать этот isAiming из игрока. Юзать для этого IEEP или мапу - дело твоё.
Если так впадлу делать IEEP - записывай данные в EntityPlayer#getEntityData(). В рендере оттуда же и доставай их.
 
  • Like
Реакции: klas
Сверху