ExtendedPlayer не работает

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.7.10
1,470
19
189
Вот код класса, который не работает. Что можно сделать?
При попытки использовать метод getTemp в gui, крашит
ExtendedPlayer
Код:
public final static String EXT_PROP_NAME = "ExtendedPlayer";
 
 public final EntityPlayer player;
 
 private double currentTemp, normalTemp, highTemp, lowTemp;
 
 public ExtendedPlayer(EntityPlayer player) {
 this.player = player;
 this.currentTemp = this.normalTemp = 36.6;
 }
 
 public static final void register(EntityPlayer player)
 {
 player.registerExtendedProperties(ExtendedPlayer.EXT_PROP_NAME, new ExtendedPlayer(player));
 }
 
 public static final ExtendedPlayer get(EntityPlayer player)
 {
 return (ExtendedPlayer) player.getExtendedProperties(EXT_PROP_NAME);
 }
 
 @Override
 public void saveNBTData(NBTTagCompound compound) {
 NBTTagCompound properties = new NBTTagCompound();
 
 properties.setDouble("CurrentTemp", this.currentTemp);
 properties.setDouble("LowTemp", this.lowTemp);
 properties.setDouble("HighTemp", this.highTemp);
 properties.setDouble("NormalTemp", this.normalTemp);
 
 compound.setTag(EXT_PROP_NAME, properties); 
 }

 @Override
 public void loadNBTData(NBTTagCompound compound) {
 NBTTagCompound properties = new NBTTagCompound();
 
 properties.getDouble("CurrentTemp");
 properties.getDouble("LowTemp");
 properties.getDouble("HighTemp");
 properties.getDouble("NormalTemp");
 
 if(RCC.DEBUG) {
 Log.info("Temp from NBT:" + this.currentTemp);
 }
 }

 @Override
 public void init(Entity entity, World world) {
 
 }
 
 public boolean consumeTemp(double amount) {
 boolean sufficient = amount <= this.currentTemp;
 
 this.currentTemp -= (amount < this.currentTemp ? amount : this.currentTemp);

 return sufficient;
 }
 
 public boolean addTemp(double amount) {
 boolean sufficient = amount <= this.currentTemp;
 
 this.currentTemp += (amount < this.currentTemp ? amount : this.currentTemp);

 return sufficient;
 }
 
 public double getTemp() {
 return this.currentTemp;
 }
 
Решение
Миллион туторов есть и по IEEP, и по пакетом. Не можешь исправить синтаксическую ошибку в коде - иди учи java. За время существования темы уже мог бы не просто перебрать все туторы и сделать, что нужно, но и досконально изучить, как все работает внутри.

Icosider

Kotliner
Администратор
3,603
99
664
Thunder написал(а):
private double temp; и  ExtendedPlayer temp = (ExtendedPlayer) ctx.getServerHandler().playerEntity.getExtendedProperties("temp"); - конфликт

getTemp() наверное надо вызвать из IEEP, у тебя же этого метода в пакете нету, ну
Не будет конфликта, если указывать this при вызове приват переменной.
 

Icosider

Kotliner
Администратор
3,603
99
664
Переписал пакет:
Код:
public class ManaSync implements IMessage, IMessageHandler
{
    /* Почему байт? Да потому что "микрооптимизация" */
    private byte mana;

    public ManaSync(){}
    //Можно в принципе сразу передавать ману, тут уже роли не играет.
    public ManaSync(PlayerData data)
    {
        this.mana = data.getMana();
    }

    @Override
    /* Получаем данные с сервера */
    public void fromBytes(ByteBuf buf)
    {
        mana = buf.readByte();
    }

    @Override
    /* Записываем данные в пакет для клиента */
    public void toBytes(ByteBuf buf)
    {
        buf.writeByte(mana);
    }

    @Override
    public IMessage onMessage(IMessage message, MessageContext ctx)
    {
        // На клиенте устанавливаем ману из серверных данных
        if (ctx.side.isClient())
        {
            PlayerData data = Minecraft.getMinecraft().thePlayer.getExtendedProperties("mana");
            data.setMana(mana);
        }
        return null;
    }
}

И вот тебе уже готовый IEEP:
Код:
public class PlayerData implements IExtendedEntityProperties
{
   /* Опять же, если у тебя byte, то твоё число не должно превышать более 127 или менее -127 */
   private byte mana;

   @Override
   public void saveNBTData(NBTTagCompound compound)
   {
       NBTTagCompound tag = new NBTTagCompound();
       tag.setByte("mana", mana);
       compound.setTag("customAbilities", tag);
   }

   @Override
   public void loadNBTData(NBTTagCompound compound)
   {
       NBTTagCompound tag = (NBTTagCompound) compound.getTag("customAbilities");
       mana = tag.getByte("mana");
   }

   @Override
   public void init(Entity entity, World world)
   {
       this.mana = 0;
   }

   public void syncMana(EntityPlayerMP player)
   {
       NetworkHandler.NETWORK.sendTo(new ManaSync(this), player);
   }

   public void setMana(byte count)
   {
       this.mana = count;
   }

   public byte getMana()
   {
       return mana;
   }
}

Осталось лишь изменить переменную, зарегать пакет и делать sync при PlayerLoggedInEvent.
 
1,470
19
189
Код:
@SubscribeEvent
 public void PlayerLoggedIn(PlayerLoggedInEvent event) {
 ExtendedPlayer props = new ExtendedPlayer();
 props.syncTemp((EntityPlayerMP)event.player);
 }
Так?
P.S. как регать этот пакет? Добавил 
Код:
extends AbstractPacket<TempSync>

После добавления отсутствующих методов, ругается на onMessage
 

Icosider

Kotliner
Администратор
3,603
99
664
Nix13Chanel написал(а):
Код:
@SubscribeEvent
 public void PlayerLoggedIn(PlayerLoggedInEvent event) {
 ExtendedPlayer props = new ExtendedPlayer();
 props.syncTemp((EntityPlayerMP)event.player);
 }
Так?
P.S. как регать этот пакет? Добавил 
Код:
extends AbstractPacket<TempSync>

После добавления отсутствующих методов, ругается на onMessage
Не надо ничего добавлять, просто в нетворкХандлере NETWORK.registerMessage(TempSync.class, TempSync.class, 0, Side.CLIENT);
 
1,470
19
189
Ivasik написал(а):
Nix13Chanel написал(а):
Код:
@SubscribeEvent
 public void PlayerLoggedIn(PlayerLoggedInEvent event) {
 ExtendedPlayer props = new ExtendedPlayer();
 props.syncTemp((EntityPlayerMP)event.player);
 }
Так?
P.S. как регать этот пакет? Добавил 
Код:
extends AbstractPacket<TempSync>

После добавления отсутствующих методов, ругается на onMessage
Не надо ничего добавлять, просто в нетворкХандлере NETWORK.registerMessage(TempSync.class, TempSync.class, 0, Side.CLIENT);
Код:
Метод registerMessage(Class<? extends IMessageHandler<REQ,REPLY>>, Class<REQ>, int, Side) в типе SimpleNetworkWrapper неприменим для аргументов (Class<TempSync>, Class<TempSync>, int, Side)
 
1,470
19
189
Ivasik написал(а):
Сделай просто как я сказал, зарегай как обычно пакет и всё.

Так и регаю
Код:
NETWORK.registerMessage(TempSync.class, TempSync.class, 0, Side.CLIENT);
 

Icosider

Kotliner
Администратор
3,603
99
664
Nix13Chanel написал(а):
Ivasik написал(а):
Сделай просто как я сказал, зарегай как обычно пакет и всё.

Так и регаю
Код:
NETWORK.registerMessage(TempSync.class, TempSync.class, 0, Side.CLIENT);

Ну всё, теперь синхронизируй при изменении темпа.
 
1,470
19
189
Ivasik написал(а):
Nix13Chanel написал(а):
Ivasik написал(а):
Сделай просто как я сказал, зарегай как обычно пакет и всё.

Так и регаю
Код:
NETWORK.registerMessage(TempSync.class, TempSync.class, 0, Side.CLIENT);

Ну всё, теперь синхронизируй при изменении темпа.

Ошибка-то светится
 
1,470
19
189
1,470
19
189
Для сохранения вашего мозга последую совету Ивасика
Ты только до 1.9-1.12 не обновляйся, а то с капой вынесешь всем мозг 
wink.png
 
2,505
81
397
Миллион туторов есть и по IEEP, и по пакетом. Не можешь исправить синтаксическую ошибку в коде - иди учи java. За время существования темы уже мог бы не просто перебрать все туторы и сделать, что нужно, но и досконально изучить, как все работает внутри.
 
1,470
19
189
Dahaka написал(а):
Миллион туторов есть и по IEEP, и по пакетом. Не можешь исправить синтаксическую ошибку в коде - иди учи java. За время существования темы уже мог бы не просто перебрать все туторы и сделать, что нужно, но и досконально изучить, как все работает внутри.

 Действительно. Минута гугла, 30-60 минут в Eclipse и все работает прекрасно. Спасибо Dahaka
 

Icosider

Kotliner
Администратор
3,603
99
664
Nix13Chanel написал(а):
Dahaka написал(а):
Миллион туторов есть и по IEEP, и по пакетом. Не можешь исправить синтаксическую ошибку в коде - иди учи java. За время существования темы уже мог бы не просто перебрать все туторы и сделать, что нужно, но и досконально изучить, как все работает внутри.

 Действительно. Минута гугла, 30-60 минут в Eclipse и все работает прекрасно. Спасибо Dahaka

Я тебе с самого начала написал готовый код, тебе лишь нужно было сделать малую часть, в общем :facepalm:
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху