Je Galère avec les packets je comprend pas des masse comment ça marche j’ trois classe pour le système d’eau
| public class Water implements IWater{ |
| |
| private float maxWaterLevel = 600F; |
| private float waterLevel = 600.0F; |
| |
| @Override |
| public void consume(float amount) { |
| this.waterLevel -= amount; |
| if (this.waterLevel < 0.0F) this.waterLevel = 0.0F; |
| } |
| |
| @Override |
| public void fill(float amount) { |
| this.waterLevel += amount; |
| if(this.waterLevel > maxWaterLevel) this.waterLevel = maxWaterLevel; |
| } |
| |
| @Override |
| public void set(float amount) { |
| this.waterLevel = amount; |
| } |
| |
| @Override |
| public float getWater() { |
| return this.waterLevel; |
| } |
| |
| @Override |
| public float getMaxWater() { |
| return this.maxWaterLevel; |
| } |
| |
| } |
| |
public class WaterProvider implements ICapabilitySerializable<NBTBase>{
@CapabilityInject(IWater.class)
public static final Capability<IWater> WATER_CAP = null;
private IWater instance = WATER_CAP.getDefaultInstance();
@Override
public boolean hasCapability(Capability<?> capability, EnumFacing facing){
return capability == WATER_CAP;
}
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing){
return capability == WATER_CAP ? WATER_CAP.<T> cast(this.instance) : null;
}
@Override
public NBTBase serializeNBT(){
return WATER_CAP.getStorage().writeNBT(WATER_CAP, this.instance, null);
}
@Override
public void deserializeNBT(NBTBase nbt){
WATER_CAP.getStorage().readNBT(WATER_CAP, this.instance, null, nbt);
}
}
public class WaterStorage implements IStorage<IWater>{
@Override
public NBTBase writeNBT(Capability<IWater> capability, IWater instance, EnumFacing side) {
return new NBTTagFloat(instance.getWater());
}
@Override
public void readNBT(Capability<IWater> capability, IWater instance, EnumFacing side, NBTBase nbt) {
instance.set(((NBTPrimitive) nbt).getFloat());
}
}
J’ai une Interface
| public interface IWater { |
| public void consume(float points); |
| public void fill(float points); |
| public void set(float points); |
| |
| public float getWater(); |
| public float getMaxWater(); |
| } |
| |
et je l’enregistre comme ça dans mon commonProxy
| public void load() |
| { |
| MinecraftForge.EVENT_BUS.register(new CapabilityHandler()); |
| CapabilityManager.INSTANCE.register(IWater.class, new WaterStorage(), Water.class); |
| } |
Ha et j’ai oublier
| public class CapabilityHandler |
| { |
| public static final ResourceLocation WATER_CAP = new ResourceLocation(Reference.MOD_ID, "water"); |
| |
| @SubscribeEvent |
| public void attachCapability(AttachCapabilitiesEvent<Entity> event){ |
| |
| if (!(event.getObject() instanceof EntityPlayer)) return; |
| event.addCapability(WATER_CAP, new WaterProvider()); |
| } |
| } |
J’ai essayer de créé un packet :
public class SyncWaterData implements IMessage{
private float water;
public SyncWaterData(IWater water) {
this.water = water.getWater();
}
@Override
public void fromBytes(ByteBuf buf)
{
water = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf)
{
buf.writeFloat(water);
}
public static class Handler implements IMessageHandler<SyncWaterData, IMessage>
{
@Override
public IMessage onMessage(SyncWaterData message, MessageContext ctx)
{
VirusZMod.proxy.addScheduledTaskClient(() -> handle(message, ctx));
return null;
}
private void handle(SyncWaterData message, MessageContext ctx)
{
EntityPlayer player = VirusZMod.proxy.getClientPlayer();
if (player instanceof EntityPlayer)
{
((IWater) player.getCapability(WaterProvider.WATER_CAP, null)).getWater();
}
}
}
}
que j’ai enregistrer avec network manager tout ca et j’ai le meme paquet a quelque modif pret qui sert de Requester coter serveur la partie que je trouve pas c’est Comment utiliser ce paquet pour recuperer les donnée dans mon gui
Il y aurait des exemple concret existant parce je suis paumer le la doc a part me donner un migraine ca ma pas vraiment aider j’avoue que les packet et tout ce qui est serveur / HUD / interface graphique c’est pas vraiment mon fort 