• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Envoie de packets non fonctionnel

    1.13.x
    1.13.2
    2
    3
    255
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Ama
      Ama dernière édition par

      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 !

      Si je t'ai filé un coup de main n'oublie pas le + / -
      Par contre évite les demandes d'aides en MP, tu sera sympa'

      La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

      Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

      1 réponse Dernière réponse Répondre Citer 0
      • BrokenSwing
        BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par

        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

        1 réponse Dernière réponse Répondre Citer 0
        • Ama
          Ama dernière édition par

          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());
          				}
          			}
          		}
          
          	}
          

          Si je t'ai filé un coup de main n'oublie pas le + / -
          Par contre évite les demandes d'aides en MP, tu sera sympa'

          La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

          Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

          1 réponse Dernière réponse Répondre Citer 0
          • 1 / 1
          • Premier message
            Dernier message
          Design by Woryk
          Contact / Mentions Légales

          MINECRAFT FORGE FRANCE © 2018

          Powered by NodeBB