Afficher une capabilitie



  • Bonjour. J'aimerais afficher une capabilitie d'un joueur au dessus da la barre d'xp (dans le rectangle):
    0_1529424651213_screen.png

    Mais j'aimerais que cette valeur ne s'affiche que si le joueur possède dans son inventaire un certain item. Et je ne sais pas vraiment comment faire.
    J'espère que vous pourrez m'aider.



  • Il y a une méthode pour ça dans la classe de l'inventaire de joueur. Je te laisse la chercher, le nom est plutôt explicite.



  • Merci pour votre réponse, mais je n'ai pas trouvé ce dont vous parlez. Mais j'ai trouvé RenderGameOverlayEvent, est-ce que je peut l'utiliser ?


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    RenderGameOverlayEvent va te permettre, comme son nom l'indique, de modifier le rendu du GameOverlay, du coup, est-ce que tu as besoin de l'utiliser ?



  • Merci, j'ai réussi à afficher ce que je voulais avec le RenderGameOverlayEvent, mais j'ai deux nouveaux problèmes.

    • Je n'arrive pas à placer comme il le faut la valeur. Enfin, là, ce ne sont que des tests le vrai problème et surtout que lorsque je change la taille de la fenêtre, la valeur ne se trouve plus au bon endroit. 0_1529843521416_2018-06-24_14.22.47.png
      Voici le code :
    @SubscribeEvent(priority = EventPriority.NORMAL)
    	public void drawTesth(RenderGameOverlayEvent.Text event) {
    		ScaledResolution resolution = event.getResolution();
    		EntityPlayer player = FMLClientHandler.instance().getClient().player;
    		ITesth testh = player.getCapability(TesthProvider.TESTH_CAP, null);
    		String value = Integer.toString((int)(testh.getTesth()));
    		
    		float x = (resolution.getScaledWidth())/2;
    		float y = 35*(resolution.getScaledHeight())/40; //Ce sont juste des tests, je n'arrive juste pas à "immobiliser" la valeur sur l'écran
    
    		
    		Minecraft.getMinecraft().fontRendererObj.drawStringWithShadow(value, x, y, 0xffffff);
    	}
    

    Le seul moment ou elle est parfaitement "immobiliser" est quand je met :

                    float x = (resolution.getScaledWidth())/2;
    		float y = (resolution.getScaledHeight())/2;
    
    • Deuxièmement, la valeur affiché n'est pas la bonne. A chaque fois que je ferme le monde et que j'y revient, la valeur affiché redevient 0, alors que la véritable valeur et différente de zéro. Mais si en jeu, je modifie cette valeur en lui ajoutant ou en lui enlevant de la valeur, la modification afficher se fait mais par apport à zéro. (Par exemple : La valeur normal est 5, la valeur afficher est 0. J'ajoute 1. La valeur normal est 6, la valeur afficher est 1)

    J'espère que vous pourrez m'aider.


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    Pour la position, tu es sûr d'avoir pris les bon getter ?



  • Oui, je suis sur. Mais je pense que le problème vient du fait que la hotbar change de taille automatiquement quand on modifie la taille de la fenêtre, du coup il faudrait que je fasse la même chose avec ma valeur afficher ?

    Finalement, j'ai réussi à faire en sorte que la valeur soit "immobile". Mais, j'ai encore un problème, la valeur qui s'affiche se remet à zéro à chaque fois que je reviens sur un monde, mais la valeur original ne change pas.



  • Salut. J'ai beaucoup chercher d'ou venait le problème de valeur différente entre celle affiché et celle réelle. Et je pense que cela vient d'un problème de synchronisation entre le serveur et le client. Si c'est possible, pourriez-vous me donner un endroit ou voir comment réparer ce problème de synchronistation ou directement me l'expliquer ici, si oui avez-vous besoin de la classe de ma capabilities ?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Il faut utiliser des paquets pour synchroniser les valeurs des capabilities.



  • Bonsoir, et merci pour vos réponses. En effet, le problème venait bien d'un problème de synchronisation. Mais, il me reste un dernier problème que j'ai rencontrer en faisant des tests. Quand je change de dimension par exemple overworld -> end ou overworld -> nether ou même encore nether -> overworld, je n'ai aucun problème mais quand je quitte l'end pour revenir dans l'overworld toute mes capabilities se réinitialisent, et je ne sais pas comment régler ce problème. J'espère que vous pourrez m'aider.



  • Bonjour, es-ce que tu utilise l'envent PlayerRespawnEvent ? Il y a un booléen dedans qui indique si le joueur sort de l'end (Car l'event est appelé à se moment là pour faire spawn le joueur à son point de spawn). Il ne faut donc pas réinitialiser les capabilities quand ce booléen est à true.



  • Bonsoir. Merci pour ta réponse. En effet j'utilise l'event PlayerRespawnEvent mais je ne réinitialise aucune capabilities avec l'événement voici le code :

    @SubscribeEvent
    public void onPlayerRespawn(PlayerRespawnEvent event) {
         if(!event.player.world.isRemote) {
               event.player.getCapability(TestProvider.TEST_CAP, null).sync(event.player);
    	    }
    	}
    

    Mais j'ai quand même essayer en réalisant l'event que lorsque la condition !event.isEndConquered() est réalisé mais même là les capabilities se réinitialise quand même quand je quitte l'end. J'ai aussi essayé d'enlever l'event pour voir si quelque chose changer mais rien.

    J'espère que vous pourrez m'aider.



  • Tu utilise PlayerEvent.Clone ? Pour cloner les capabilities ?



  • Oui voilà le code (je l'avais mis sur le précédents messages mais je l'ai enlevé après je pensais que c'étais pas très utile ^^) :

    @SubscribeEvent
        public void onPlayerCloned(PlayerEvent.Clone event) {
            if(event.isWasDeath()) {
                if(event.getOriginal().hasCapability(TestProvider.TEST_CAP, null)) {
                    ITest test = event.getOriginal().getCapability(TestProvider.TEST_CAP, null);
                    ITest newTest = event.getEntityPlayer().getCapability(TestProvider.TEST_CAP, null);
                    newTest.set(test.getTest());
                }
            }
        }
    


  • Je ne suis pas sûr, mais essaye d'enlever la condition if(event.isWasDeath()). Peut-être que ça clone le joueur quand il sort de l'end, donc il faudrait aussi cloner les capabilities.



  • Merci pour vos réponses. Oui c'était bien du au fait que lorsque l'on quitte l'end le joueur est cloné maintenant je clone aussi les capabilities en même temps. Je passe le sujet en résolu.


Log in to reply