Вес игрока

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.12.2
516
11
39
Всем привет,решил сделать систему веса для игрока.Написал все через капу,но когда в инвентаре итем значение не прибавляется.

Java:
public interface IWeightHandler {
    float getWeight();
    float getWeightMax();
    void setWeight(float weight);
    void setWeightMax(float weightMax);
    void addWeight(float weight);
    void removeWeight(float weight);

}

Java:
public class WeightEventHandler {
     public static void register(){
            MinecraftForge.EVENT_BUS.register(new WeightEventHandler());
     }
   
     @SubscribeEvent
        public void attachCapabilities(AttachCapabilitiesEvent<Entity> event) {
           
            if (event.getObject() instanceof EntityPlayer)
                event.addCapability(new ResourceLocation("MODID", "NAME"), new WeightProvider());
        }
   
      @SubscribeEvent
        public void clonePlayer(PlayerEvent.Clone event) {
           
            final IWeightHandler original = getHandler(event.getOriginal());
            final IWeightHandler clone = getHandler(event.getEntity());
            clone.setWeight(original.getWeight());
        }
     

    public static IWeightHandler getHandler(Entity entity) {

        if (entity.hasCapability(WeightProvider.CAPABILITY_WEIGHT, EnumFacing.DOWN))
            return entity.getCapability(WeightProvider.CAPABILITY_WEIGHT, EnumFacing.DOWN);
        return null;
    }

}

Java:
public class MessageWeight implements IMessage {

    public float weight;
    public float weight_max;

    public MessageWeight() {}

    public MessageWeight(float weight_max, float weight) {
        this.weight = weight;
        this.weight_max = weight_max;
    }

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeFloat(weight);
        buf.writeFloat(weight_max);
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        weight = buf.readFloat();
        weight_max = buf.readFloat();
    }
    //----------------------------------------------------------------------------------
    public static class Handler implements IMessageHandler<MessageWeight, IMessage> {

        @Override
        public IMessage onMessage(MessageWeight packet, MessageContext context) {
            float weight = packet.weight;
            float weight_max = packet.weight_max;
            EntityPlayer player = Minecraft.getMinecraft().player;
            WeightEventHandler.getHandler(player).setWeightMax(weight_max);
            WeightEventHandler.getHandler(player).setWeight(weight);
            return null;
        }

    }
}
Java:
public class DefaultWeightHandler implements IWeightHandler {

    private float weight = 0;
    private float weightMax= 25;
   
    @Override
    public float getWeight() {
        return this.weight;
    }
   
    @Override
    public float getWeightMax() {
        return this.weightMax;
    }

    @Override
    public void setWeight (float weight) {
        this.weight = weight;
    }
   
    @Override
    public void setWeightMax (float weightMax) {
        this.weightMax = weightMax;
    }

    @Override
    public void addWeight (float weight) {
        this.weight += weight;
       
    }

    @Override
    public void removeWeight(float weight) {
        this.weight -= weight;
       
        if (this.weight < 0)
            this.weight = 0;
    }
}
вот так нахожу вес:
public class WeightSystem {
                 
        public static float checkWeighting(ItemStack slot,EntityPlayer player) {

            float weighting = WeightEventHandler.getHandler(player).getWeight();
            if (slot != null) {
                Item item = slot.getItem();
             if (WeightVanilaItems.getVanilaItem(item, slot.getItemDamage()) != 0.0F) {

                weighting += WeightVanilaItems.getVanilaItem(item, slot.getItemDamage()*slot.getCount());
               
             }
             WeightEventHandler.getHandler(player).addWeight(weighting);  
            }
           
            return weighting;
       
    }
}
 
Последнее редактирование:
Решение
b20cf473f9ee4f1869137bf13445b945.jpg
Блин, я спецом сделал WeightAPI для того рода задач, а он велосипед пишет. Его до 1.12.2 апнуть - как два пальца, ибо там почти нет зависящего от кубача кода. Я тебе даже с интеграцией помогу только плз юзай мой апиТ_Т. Я решил там такие проблемы как отслеживание инвентаря игрока и как уместить на серве несколько систем веса. Я блин полгода с этим трахался + сделал 2 проекта-демонстрации по юзанию апи и доки написал. Короче все шо тебе надо есть. Контакт ми плз.

Eifel

Модератор
1,623
78
608
Не видно, где оно собственно прибавляется. Есть какие-то методы и пакет, но они нигде не вызываются/отправляются, судя по твоему коду

А и да, капу еще надо зарегистрировать, а не только приаттачить(на всякий)
 

Eifel

Модератор
1,623
78
608
При изменениях веса на сервере -> отсылать пакет на клиент, если ему вообще надо знать эту инфу(может там у тебя худ или чет еще). Если клиент этот вес никак не использует, то пакетов соответственно не надо добавлять. Другое дело, не видно где вообще ты этот вес изменяешь(какой-то ивент апдейта игрока, или чет такое)
 
516
11
39
ты этот вес изменяешь

Java:
public class WeightSystem {
                
        public static float checkWeighting(ItemStack slot,EntityPlayer player) {

            float weighting = WeightEventHandler.getHandler(player).getWeight();
            if (slot != null) {
                Item item = slot.getItem();
             if (WeightVanilaItems.getVanilaItem(item, slot.getItemDamage()) != 0.0F) {

                weighting += WeightVanilaItems.getVanilaItem(item, slot.getItemDamage()*slot.getCount());
               //получение значение если в слоте яблоко
             }
             WeightEventHandler.getHandler(player).addWeight(weighting); 
            //добавление значение weighting к первоначальному значению
            }
          
            return weighting;
      
    }
}
Java:
public class WeightVanilaItems {
    public static float getVanilaItem(Item item, int metadata) {
        if (item == Items.APPLE) return 2.0F;
        else return 0.0f;
    }
}
 

Eifel

Модератор
1,623
78
608
Ну к примеру пересчитывать при изменении инвентаря. Я не силен в этих весах и прочем, но как идея, что первая пришла в голову, это хукнуться в слот инвентаря, и при его изменении вызывать пересчет веса (возможно идея мусор)
 
1,159
38
544
b20cf473f9ee4f1869137bf13445b945.jpg
Блин, я спецом сделал WeightAPI для того рода задач, а он велосипед пишет. Его до 1.12.2 апнуть - как два пальца, ибо там почти нет зависящего от кубача кода. Я тебе даже с интеграцией помогу только плз юзай мой апиТ_Т. Я решил там такие проблемы как отслеживание инвентаря игрока и как уместить на серве несколько систем веса. Я блин полгода с этим трахался + сделал 2 проекта-демонстрации по юзанию апи и доки написал. Короче все шо тебе надо есть. Контакт ми плз.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху