Envoie de packets non fonctionnel



  • Bonjour à vous,

    Je viens à votre rencontre pour une demande d'aide, qui me bloque dans l'avancée de mon projet.

    Contexte

    Je souhaite modifier le comportement de Minecraft, pour ce faire, j'ajoute des phases au gameplay actuel, en récupérant le temps du monde world.getWorldInfo().getGameTime() en le transformant en jours

    Ces jours une fois calculés je les enregistre grâce à WorldSavedData.

    Jusque là tout va bien. C'est après que c'est plus compliqué.

    Afin de rajouter un peu de réalisme au jeu, je lui modifie quelques attributs cosmétique. le ciel en l'occurrence.

    Pour ce faire j'ai une classe qui implémente IRenderHandler que j'appelle au chagement du monde grâce à l'évènement WorldEvent.Load

    Seulement, pour l'exemple, je cherche à modifier la couleur de soleil en fonction des phases précédemment crées.
    Mais la fonction qui me permet de récupérer les journées qui se sont écoulées dans le jeu DayCounterWorldSavedData.get(world).getAgeInDays() ne fonctionne pas dans ma méthode de rendu

    @Override
    public void render(float partialTicks, WorldClient world, Minecraft mc) {
     
    [...]
    
           switch(DayCounterWorldSavedData.get(world).getAgeInDays()) {
                case 0:
                    //RED
                    GlStateManager.color4f(1.0F, 0.0F, 0.0F, 1.0F);
                    break;
                case 1:
                    //BLUE
                    GlStateManager.color4f(0.0F, 1.0F, 0.0F, 1.0F);
                    break;
                case 2:
                    //GREEN
                    GlStateManager.color4f(0.0F, 0.0F, 1.0F, 1.0F);
                    break;
                case 3:
                    //WHITE
                    GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
                    break;
            }
    
    [...]
    
    }
    

    Afin que vous puissiez jeter un coup d’œil à ce problème je vous fournis les classe ci-dessous.

    Les classes

    DayCounterWorldSavedData.java

    package fr.zeamateis.solar_apocalypse.common.world;
    
    import fr.zeamateis.solar_apocalypse.common.IceAgeMod;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.world.World;
    import net.minecraft.world.storage.WorldSavedData;
    import net.minecraft.world.storage.WorldSavedDataStorage;
    
    public class DayCounterWorldSavedData extends WorldSavedData {
    	private static final String DATA_NAME = IceAgeMod.MODID;
    
    	private int ageInDays = 0;
    	private long lastTime=0;
    
    
    	private DayCounterWorldSavedData(String s) {
    		super(s);
    	}
    
    
    	/**
    	 * reads in data from the NBTTagCompound into this MapDataBase
    	 *
    	 * @param nbt
    	 */
    	@Override
    	public void read(NBTTagCompound nbt) {
    		ageInDays = nbt.getInt("ageInDays");
    		lastTime = nbt.getLong("lastTime");
    	}
    
    	@Override
    	public NBTTagCompound write(NBTTagCompound compound) {
    		NBTTagCompound nbt = new NBTTagCompound();
    
    		nbt.putInt("ageInDays", ageInDays);
    		nbt.putLong("lastTime", lastTime);
    
    		return nbt;
    	}
    
    
    
    	public static DayCounterWorldSavedData get(World world) {
    		WorldSavedDataStorage storage = world.getSavedDataStorage();
    		DayCounterWorldSavedData instance = storage.get(world.dimension.getType(), DayCounterWorldSavedData::new, DATA_NAME);
    
    		if (instance == null) {
    		    instance = new DayCounterWorldSavedData(DATA_NAME);
    		    storage.set(world.dimension.getType(), DATA_NAME, instance);
    		}
    
    		return instance;
    	}
    	
    	public int getAgeInDays() {
    		return ageInDays;
    	}
    	
    	public void updateCurrentTime(long currentTime) {
    		
    		System.out.println("last time: " + lastTime);
    		System.out.println("current time: " + currentTime);
    		
    		currentTime=currentTime%24000;
    		
    		if(currentTime< lastTime) {
    			addDay();
    		}
    
    		lastTime =currentTime;
    		markDirty();
    	}
    	
    	private void addDay() {
    		addDays(1);
    	}
    
    	private void addDays(int i) {
    		ageInDays +=1;
    		markDirty();
    		System.out.println("The worlds age is "+ getAgeInDays() +" day(s).");
    	}
    }
    

    PacketDayCounter.java

    package fr.zeamateis.solar_apocalypse.network.packet;
    
    import fr.zeamateis.solar_apocalypse.common.world.DayCounterWorldSavedData;
    import net.minecraft.network.PacketBuffer;
    import net.minecraftforge.fml.network.NetworkEvent;
    
    import java.util.function.Supplier;
    
    public class PacketDayCounter {
    
    	private long worldTime;
    
    	public PacketDayCounter() {}
    
    	public PacketDayCounter(long worldTimeIn) {
    		worldTime = worldTimeIn;
    	}
    
    	public static void encode(PacketDayCounter packet, PacketBuffer buffer) {
    		buffer.writeLong(packet.worldTime);
    	}
    
    	public static PacketDayCounter decode(PacketBuffer buffer) {
    		return new PacketDayCounter(buffer.readLong());
    	}
    
    	public static void handle(PacketDayCounter packet, Supplier<NetworkEvent.Context> ctxProvider) {
    		if (ctxProvider.get().getSender() != null) {
    			if(DayCounterWorldSavedData.get(ctxProvider.get().getSender().world).getAgeInDays() <= 4) {
    				DayCounterWorldSavedData.get(ctxProvider.get().getSender().world).updateCurrentTime(packet.worldTime);
    			}
    		}
    
    		ctxProvider.get().setPacketHandled(true);
    	}
    
    }
    

    Mes events

    @SubscribeEvent
    	public static void onTickWorld(TickEvent.WorldTickEvent event)
    	{
    		World world = event.world;
    
    		if(world != null) {
                if(!world.isRemote) {
                    if(world.getDimension().isSurfaceWorld()) {
    
                        if (event.phase == TickEvent.Phase.END) {
                            return;
                        }
    
                        AmyNetwork.getNetworkChannel().sendToServer(new PacketDayCounter(world.getWorldInfo().getGameTime()));
    
                    }
                }
            }
    	}
    
    	@SubscribeEvent
    	public static void onWorldLoad(WorldEvent.Load e) {
    
    		IRenderHandler renderer = e.getWorld().getDimension().getSkyRenderer();
    		if(e.getWorld().getDimension().isSurfaceWorld()) {
    			if (renderer == null) {
    				IceAgeMod.getLogger().info("Setting sky renderer for dimension {}", e.getWorld().getDimension().getType());
    				e.getWorld().getDimension().setSkyRenderer(new IceAgeSkyRenderer());
    			} else {
    				IceAgeMod.getLogger().info("Not hooking sky renderer for dimension {} {}", e.getWorld().getDimension().getType(), renderer.getClass());
    			}
    		}
    	}
    

    Conclusion

    Je vous remercie par avance si vous m'aider à résoudre ce problème !


  • Rédacteurs

    Salut,
    Déjà le premier truc que je ne comprend pas trop c'est que tu sembles avoir souscrit à l'event de tick du monde du côte client puis tu envoies un paquet au serveur ? Pourquoi ? Le serveur est capable de souscrire à l'event lui même



  • Bon !

    Après plusieurs heures de bataille acharnées, j'ai réussi, du moins ça fonctionne.

    J'ai procédé comme tel.

    @SubscribeEvent
    	public static void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) {
    		System.out.println("PLAYER LOGGED");
    		AmyNetwork.sendPacketToDimension(DimensionType.OVERWORLD, new PacketDayCounter(DayCounterWorldSavedData.get(event.getPlayer().world).getAgeInDays()));
    		System.out.println("PACKET SEND");
    	}
    
    @Override
    	public void handle(PacketDayCounter packet, Supplier<NetworkEvent.Context> ctxProvider) {
    		System.out.println("CHECK SENDER");
    		ctxProvider.get().enqueueWork(() -> handleClient(packet));
    		ctxProvider.get().setPacketHandled(true);
    	}
    
    	@OnlyIn(Dist.CLIENT)
    	private static void handleClient(PacketDayCounter packet) {
    		EntityPlayerSP player = Minecraft.getInstance().player;
    		World world = player.world;
    
    		System.out.println("WORLD TIME AGE "+packet.worldTime);
    		DayCounterWorldSavedData.get(world).setAgeInDays(packet.worldTime);
    
    		IRenderHandler renderer = world.getDimension().getSkyRenderer();
    		if(world != null) {
    			if(world.getDimension().isSurfaceWorld()) {
    				if (renderer == null) {
    					IceAgeMod.getLogger().info("Setting sky renderer for dimension {}", world.getDimension().getType());
    					world.getDimension().setSkyRenderer(new IceAgeSkyRenderer());
    				} else {
    					IceAgeMod.getLogger().info("Not hooking sky renderer for dimension {} {}", world.getDimension().getType(), renderer.getClass());
    				}
    			}
    		}
    
    	}
    

Log in to reply