11 mai 2019, 15:04

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 !