Отправка пакета об изменении модели

Версия Minecraft
1.7.10
API
Forge
56
1
Всем снова здравствуйте!
---
В прошлой своей теме я задал ещё один вопрос про пакеты, но видимо из-за того, что уже пометил там решение, ни кто не заметил моего вопроса.
Вот суть моей проблемы:
У меня есть IEEP:
IEEP и Расы:
public class WFMPlayerRaceInfo implements IExtendedEntityProperties {

    public final static String PLAYER_RACE = "PlayerRace";
    private final EntityPlayer player;
    private String playerRace;


    @Override
    public void init(Entity entity, World world) {
    }

    public WFMPlayerRaceInfo(EntityPlayer player)
    {
        this.player = player;
        this.playerRace = WFMRace.HUMAN.name();
    }

    public static void register(EntityPlayer player)
    {
        player.registerExtendedProperties(WFMPlayerRaceInfo.PLAYER_RACE, new WFMPlayerRaceInfo(player));
    }

    public static WFMPlayerRaceInfo get(EntityPlayer player)
    {
        return (WFMPlayerRaceInfo) player.getExtendedProperties(PLAYER_RACE);
    }


    @Override
    public void saveNBTData(NBTTagCompound compound)
    {
        NBTTagCompound properties = new NBTTagCompound();
        properties.setString("CurrentRace", this.playerRace);
        compound.setTag(PLAYER_RACE, properties);

    }

    public String getPlayerRace() {
        return this.playerRace;
    }

    public void setPlayerRace(String playerRace) {
        this.playerRace = playerRace;
    }

    @Override
    public void loadNBTData(NBTTagCompound compound)
    {
        NBTTagCompound properties = (NBTTagCompound) compound.getTag(PLAYER_RACE);
        this.playerRace = properties.getString("CurrentRace");
        System.out.println("[TUT PROPS] Faction from NBT: " + this.playerRace);
    }
}
Расы:
public enum WFMRace {

    HUMAN,
    ORC,
    OGRE,
    SAURUS,
    SKAVEN,
    NORTHMAN,
    NEHEKHARIAN,
    SKELETON,
    BEASTMAN_GOR;

    public static WFMRace forPlayerFaction(LOTRFaction faction) {
        if (faction == null) {
            return HUMAN;
        }
        if (faction == LOTRFaction.OGRE_KINGDOMS) {
            return OGRE;
        } else  if (faction == LOTRFaction.ORCS_AND_GOBLINS) {
            return BEASTMAN_GOR;
        } else  if (faction == LOTRFaction.LIZARDMEN) {
            return SAURUS;
        } else  if (faction == LOTRFaction.SKAVEN) {
            return SKAVEN;
        } else  {
            return HUMAN;
        }
    }

    public static WFMRace forID(int ID) {
        for(WFMRace f : WFMRace.values()) {
            if(f.ordinal() != ID) continue;
            return f;
        }
        return null;
    }
}
При определенном действии игрока, я отправляю с клиента на сервер пакет о том, что игрок выбрал расу, и устанавливаю ему расу на сервере. После чего, отправляю пакет с сервера на клиент, аналогично устанавливая расу.
В чем собственно дело. В одиночной игре всё работает замечательно. Игрок видит измененную модель, все хорошо. С мультиплеером у меня проблемы. Другие игроки не видят модель. Я пытался делать все тоже самое, только отправлять пакет на клиент не через sendTo, а через sendToAll, но тогда все другие игроки получают модель того игрока, который выбрал расу, но всё ещё не могут видеть измененную модель у игрока, который её выбирал. Надеюсь, понятно сумел рассказать.
Может ли кто-нибудь подсказать, как правильно отправить пакет с сервера к клиентам, что бы у них оставалась такой же модель, но сами они могли видеть измененную модель выбравшего расу игрока?
P.s могу так же скинуть свои пакеты, которые я пересылаю
 
Решение
В тот пакет который ты отсылаешь всем игрокам добавь поле с айди игрока, которому нужно обновить данные. В обработке пакета доставай его по World#getEntityById и используй его, а не локального.
56
1
А, и ещё. Почему-то, когда в поле зрения сменившего расу игрока попадает другой игрок, то все действия(Удар, приседание при нажатии на шифт и т.п) переносятся именно на игрока в поле зрения, а не исполняются их побудителем. Когда никого из игроков нет в поле зрения - всё работает корректно.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
В тот пакет который ты отсылаешь всем игрокам добавь поле с айди игрока, которому нужно обновить данные. В обработке пакета доставай его по World#getEntityById и используй его, а не локального.
 
56
1
В тот пакет который ты отсылаешь всем игрокам добавь поле с айди игрока, которому нужно обновить данные. В обработке пакета доставай его по World#getEntityById и используй его, а не локального.
Да, помогло, спасибо большое! Но только ещё один момент, я писал в этой теме ещё одну проблему, не знаешь в чем тут дело?
 
56
1
В тот пакет который ты отсылаешь всем игрокам добавь поле с айди игрока, которому нужно обновить данные. В обработке пакета доставай его по World#getEntityById и используй его, а не локального.
Тут ещё одна проблема появилась, когда игрок выходит с сервера, а потом заходит обратно, он перестает видеть все нестандартные модели игроков, как это можно исправить?
 
56
1
И я все же скину класс рендера, потому что видимо сам не пойму в чем дело
Рендер::
public class WFMRenderPlayerRace extends RenderPlayer
{
    private Minecraft mc = Minecraft.getMinecraft();
    private final LOTRModelBiped modelBiped = new LOTRModelBiped();
    private final WFMModelSkaven modelSkaven = new WFMModelSkaven();
    private final WFMModelSkeleton modelSkeleton = new WFMModelSkeleton();
    private final WFMModelDwarf modelDwarf = new WFMModelDwarf();
    private final WFMModelOrc modelOrc = new WFMModelOrc();
    private final WFMModelOgre modelOgre = new WFMModelOgre();
    private final WFMModelBeastmanGor modelBeastmen = new WFMModelBeastmanGor();
    private final WFMModelLizardmenSaurus modelSaurus = new WFMModelLizardmenSaurus();
    private String playerRace;


    public WFMRenderPlayerRace()
    {
        super();
    }
    @Override
    public void doRender(AbstractClientPlayer p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_)
    {
        super.doRender(p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_);
    }

    @Override
    protected void preRenderCallback(AbstractClientPlayer player, float f)
    {
        this.playerRace = WFMPlayerRaceInfo.get(player).getPlayerRace();
        if (player.ticksExisted % 20 == 0) {
            LOTRLog.logger.info("Race in render:" + this.playerRace);
            player.addChatMessage(new ChatComponentText(this.playerRace));
        }

        if (this.playerRace.equals(WFMRace.SKAVEN.name())) {
            this.mainModel = this.modelSkaven;
            this.modelBipedMain = (WFMModelSkaven)this.mainModel;
            this.modelArmorChestplate = new WFMModelSkaven(1.0F);
            this.modelArmor = new WFMModelSkaven(0.5F);
            GL11.glScalef(0.5F, 0.5F, 0.5F);
        } else if (this.playerRace.equals(WFMRace.OGRE.name())) {
            this.mainModel = this.modelOgre;
            this.modelBipedMain = (WFMModelOgre)this.mainModel;
            this.modelArmorChestplate = new WFMModelOgre(1.0F);
            this.modelArmor = new WFMModelOgre(0.5F);
            GL11.glScalef(0.85F, 0.85F, 0.85F);
        } else if (this.playerRace.equals(WFMRace.ORC.name())) {
            this.mainModel = this.modelOrc;
            this.modelBipedMain = (WFMModelOrc)this.mainModel;
            this.modelArmorChestplate = new WFMModelOrc(1.0F);
            this.modelArmor = new WFMModelOrc(0.5F);
            GL11.glScalef(0.8F, 0.8F, 0.8F);
        } else if (this.playerRace.equals(WFMRace.BEASTMAN_GOR.name())) {
            this.mainModel = this.modelBeastmen;
            this.modelBipedMain = (WFMModelBeastmanGor)this.mainModel;
            this.modelArmorChestplate = new WFMModelBeastmanGor();
            this.modelArmor = new WFMModelBeastmanGor();
            GL11.glScalef(1.2F, 1.2F, 1.2F);
        } else if (this.playerRace.equals(WFMRace.SAURUS.name())) {
            this.mainModel = this.modelSaurus;
            this.modelBipedMain = (WFMModelLizardmenSaurus)this.mainModel;
            this.modelArmorChestplate = new WFMModelLizardmenSaurus(1.0F);
            this.modelArmor = new WFMModelLizardmenSaurus(0.5F);
            GL11.glScalef(0.65F, 0.65F, 0.65F);
        } else {
            super.preRenderCallback(player, f);
            this.mainModel = this.modelBiped;
            this.modelBipedMain = (LOTRModelBiped)this.mainModel;
            this.modelArmorChestplate = new LOTRModelBiped(1.0F);
            this.modelArmor = new LOTRModelBiped(0.5F);
        }
    }
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Какого хрена ты в глобальную переменную засунул рассу в рендере????? Блин плиз иди язык подучи, ну вообще ж не понимаешь что происходит.
У тебя рендер - это общий объект для всех игроков. Эта переменная общая для всех. Сделай ее локальной.

ещё одна проблема появилась, когда игрок выходит с сервера, а потом заходит обратно, он перестает видеть все нестандартные модели игроков, как это можно исправить?
PlayerEvent.StartTracking вызывается когда игрок попадает в поле видимости другого. Там отсылай пакет синхронизации.
 
56
1
Понял, игроки теперь отображаются корректно! А глобальные переменные моделей тоже стоит сделать локальными? Я просто почему их в глобальные вынес - когда каждый раз создавал новую модель, лагать начинало, а когда сделал глобальными - лаги прекратились
 

tox1cozZ

aka Agravaine
8,455
598
2,892
56
1
Нет. Ты же их состояние меняешь в зависимости от данных текущего игрока.
Понял. А вот так с ходу не можешь сказать, почему возникают проблемы с движением руки ?(Сообщение ниже). Кстати с шифтом проблемы пропали, судя по всему.
А, и ещё. Почему-то, когда в поле зрения сменившего расу игрока попадает другой игрок, то все действия(Удар, приседание при нажатии на шифт и т.п) переносятся именно на игрока в поле зрения, а не исполняются их побудителем. Когда никого из игроков нет в поле зрения - всё работает корректно.
 
Сверху