Résolu 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 joursCes 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ènementWorldEvent.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 jeuDayCounterWorldSavedData.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 !
-
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()); } } } }