Niveau de lumière



  • Bonjours à tous !

    Voila, question bête mais simple (sa fait deux heures que je traîne dessus :-/)

    Sachant que je n'est pas accès au coté serveur, vu que je suis dans une classe GuiScreen, comment je peux avoir le niveau de lumière d'un bloc dans le jeu ?

    Alors j'ai essayer diverse méthode, rien de marche …

    Merci pour toute votre aide ❤

    Mugiwaxar



  • euh LightValue[Block.BlockqueTuVeux.BlockId] ?

    Enfin si j'ai bien compris ce que tu veux, tu veux pouvoir utiliser le Lightlevel d'un bloc?



  • Ce que je veux, c'est le niveau de lumière à l'endroit où est le bloc (lumière du soleil ou des torches à proximité)



  • Edit.J'ai rien dit

    Regarde au niveau de la condition pour ploanter des graineS?



  • Tu mets une instance du TileEntity dans le gui et tu crée une variable dans le TileEntity qui donne la lumière au niveau du bloc.
    Donc:
    Dans le gui:

    
    protected TonTileEntity tileentity;
    
    public NomDeLaClasse(InventoryPlayer playerInventory, TonTE te, World world)
    {
    super(new TonContainer(te, playerInventory, world));
    invPlayer = playerInventory;
    tileEntity = te;
    this.world = world;
    }
    
    

    et dans le GuiHandler, dans le getClientGuiElement(…):

    
    return new ClasseDeTonGui(player.inventory, (TonTileEntity)tileentity, world);
    
    

    (ce code est juste pour l'instance)



  • Je veux bien, mais a part les packetHandler (qui m'arange pas trop), jvois pas de moyen de passer le niveau de lumière du coté serveur vers le côté client …

    Il faut savoir que la variable "world.skylightSubtracted" côté client retourne 0 dans tout les cas (nuit inclut), donc impossible de calculer le niveau de lumière venant du soleil


  • Administrateurs

    Le niveau de lumière est déjà géré sur le WorldClient pour le rendu. Donc pas besoin de paquet, c'est déjà fait par ceux de mc.

    Tu peux utiliser world.getFullBlockLightValue(x, y, z);



  • Même problème, cette fonction ne tiens pas compte si il fait jour ou nuit 😞

    Merci de votre aide en tout cas !


  • Administrateurs

    Sinon il faudrait regarder quel code est utilisé dans le code qui rend ce qui voit dans F3.



  • Ha oui, ça c'est pas bête, jvai voir tout de suite

    Edit: Mauvaise nouvelle, la nuit n'est pas pris en compte ici non plus

    Edit²: Dailleur je viens de tester dans le minecraft officiel 1.7.4, c'est pas le cas non plus 😕



  • Alors ça fait un ptit moment que je suis en train de chercher, et je remarque le la partie client n'a aucune notion de l'heure qu'il est, et ne fait (pratiquement) aucun calcule pour ce qui est de la lumière (voir aucun pour la lumière du soleil)
    Dailleur, à l'époque de Minecraft Beta, toutes les lumières était géré par le serveur, le client ne faisait aucun calcule et récupérait toutes les données venant du serveur, se qui est resté le cas pour la lumière du soleil

    Jvai devoir me résumer à utiliser les PacketsHandler 😞 😞 😞



  • Bah, y'a le temps du world non ?

    Enfin, moi je me sers de ça pour détecter jour/nuit

    
    if(this.mc.thePlayer.worldObj.getWorldTime() > 13000){
    //C'est la nuit o/
    } else {
    //C'est pas la nuit o/
    }
    
    


  • Exactement ^^

    Mais je vais dans un peut plus complexe (si possible)
    Le soir, la lumière diminue peut à peut, et le niveau de lumière passe de 15 à 0 progressivement, et j'ai besoin de sa
    (J'ai regarder dans le code du détecteur de lumière, sa aide pas vraiment)

    Ps: Sinon, j'avais utiliser à peut de chose près la même fonction:

    
    if(this.mc.TheWorld.getWorldTime() > 12000){
    // –- NUIT ! --- //
    } else {
    // --- JOUR! --- //
    }
    
    


  • Bon, j'ai tester nos deux fonctions, et malheureusement, aucune des deux ne fonctionne correctement 😞
    Pourquoi ? Réponse sur le wiki:

    time add <number>:
    Sets the world time. number is an integer between 0 and 24000, inclusive, where 0 is dawn, 6000 midday, 12000 dusk and 18000 midnight. Number can be greater than 24000; in this case, the time of day wraps around, but the moon's phase is advanced. However, Setting the time "backward" (earlier than the current time) does not change the moon. "time set day" sets the time to 1000, and "time set night" sets the time to 13000.</number>

    En gros, une fois que le WorldTime arrive a 24000, il ne revient pas à zero mais continue indéfiniment pour pouvoir calculer la phase de la lune

    De plus, le WorldTime du serveur et du client peuvent être désynchronisé (coup de lag, ralentissement, etc …), c'est pour ça que c'est le serveur qui envoi l'heure de la journée aux clients, pour qu'il fasse jour ou nuit chez tout le monde en même temps, et pour que la phase de la lune soit partout la même

    Donc pour moi, c'est hard, il me faut une autre fonction :dodgy:

    Edit:
    Solution de secours de type B:

    
    int dayNumber = (int) (world.getWorldTime() / 24000) + 1;
    
    if( world.getWorldTime() / dayNumber > 13000) {
    // --- NUIT ! --- //
    } else {
    // --- JOUR! --- //
    }
    
    

    Mais c'est du bricolage et j'aime pas, et j'ai toujours mon problème de synchronisation :s



  • Rooh fait confiance au client. La synchro est automatique.

    final boolean isDay = world.getWorldTime() % 24000 < 13000;
    

    Pour un niveau de luminosité du soleil de 0 à 15:

    final int light = !isDay ? 0 : 15 - Math.abs(6500 - world.getWorldTime() % 24000) * 14 / 6500
    

    light == 0 toute la nuit
    light == 15 au zénith
    light == 1 à l'aube et au crépuscule



  • La solution:

    
    int dayNumber = (int) (world.getWorldTime() / 24000) + 1;
    
    if( world.getWorldTime() / dayNumber > 13000) {
    // –- NUIT ! --- //
    } else {
    // --- JOUR! --- //
    }
    
    

    est pas mal, en plus j'ai le nombre de jours !

    Merci à tous !


Log in to reply