[Traité] Tous les Talents à la création
Salut salut, bon j'ai un petit script que j'ai un peu bricolé qui est censé donné tous les talents à la création du personnage. Anormalement le script marche très bien pour les rang GM, mais pour les rang joueur il marche à moitié.. A la création les talents sont bien appris, mais quand on déco/reco, les sorts de talents mis dans les barres d'action disparaissent et les talents sont probablement réappris (puisque je les vois dans mon grimoire quand je me reco)

Code :
#include "ScriptPCH.h"

class login_script : public PlayerScript
{
public:
    login_script() : PlayerScript("login_script") { }
    uint64 playerGUID;
    void OnCreate(Player* player)
    {
        playerGUID = player->GetGUID();
    }
    void OnLogin(Player* player)
    {
        if (playerGUID == player->GetGUID())
        {
        uint32 classMask = player->getClassMask();

        for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i)
        {
            TalentEntry const* talentInfo = sTalentStore.LookupEntry(i);
            if (!talentInfo)
                continue;

            TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
            if (!talentTabInfo)
                continue;

            if ((classMask & talentTabInfo->ClassMask) == 0)
                continue;

            // On cherche le rang maximum.
            uint32 spellId = 0;
            for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
            {
                if (talentInfo->RankID[rank] != 0)
                {
                    spellId = talentInfo->RankID[rank];
                    break;
                }
            }

            if (!spellId)                                      
                continue;

            SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
            if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, player->GetSession()->GetPlayer(), false))
                continue;

            // On lui ajoute les sorts de rang maximum.
            player->learnSpellHighRank(spellId);
            player->AddTalent(spellId, player->GetActiveSpec(), true);
        }

        player->SetFreeTalentPoints(0);

        }
    }
        
};

void AddSC_login_script()
{
    new login_script();
}
A tester Smile

Bon partage Big Grin
héhé, je le met ici surtout pour qu'on m'aide à le perfectionner, après tous le monde est libre de le prendre, mais ça serait cool de m'aider quand même :/
Ah je vois peut-être ton problème ? Il ré-apprend les talents à tous les joueurs à la connexion mais là tu aurais besoin que ton script apprenne à un seul joueur donc il faut mettre une boucle de condition associée à une table genre :

{
If `Idplayer` n'existe pas dans la table
Then
Donner les talent et inscrire `Idplayer` dans la table
Else
Ne pas donner les talents.
}

Enfin je vois ça comme ça après peut-être que je me goure..
non le problème n'a rien à voir avec ça Smile
le script apprend les talents qu'à un joueur.. j'ai tout ce dont je recherche excepté le fait qu'à la déco/reco, le joueur oublie et réapprend les talents, ou du moins je constate que l'arbre se vide, puis je dois recliquer sur un talent pour qu'il se remplisse (en GM, tu fais cette manip une fois à la création puis tu gardes tes talents, meme apres des déco/reco)
Utilise cette condition aussi:
if(player->GetTotalPlayedTime() >= X) // X = temps en seconde

player->GetTotalPlayedTime() récupère le temps de jeu total du joueur

Ton code pourrait devenir alors:
#include "ScriptPCH.h"

class login_script : public PlayerScript
{
public:
    login_script() : PlayerScript("login_script") { }

    uint64 playerGUID;

    void OnCreate(Player* player)
    {
        playerGUID = player->GetGUID();
    }

    void OnLogin(Player* player)
    {
        // Si le temps de jeu total du joueur est inférieur ou égale à 1
        if(player->GetTotalPlayedTime() <= 1) // X = temps en seconde || 1 = 1 seconde
        {
            if (playerGUID == player->GetGUID())
            {
            uint32 classMask = player->getClassMask();

            for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i)
            {
                TalentEntry const* talentInfo = sTalentStore.LookupEntry(i);
                if (!talentInfo)
                    continue;

                TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
                if (!talentTabInfo)
                    continue;

                if ((classMask & talentTabInfo->ClassMask) == 0)
                    continue;

                // On cherche le rang maximum.
                uint32 spellId = 0;
                for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
                {
                    if (talentInfo->RankID[rank] != 0)
                    {
                        spellId = talentInfo->RankID[rank];
                        break;
                    }
                }

                if (!spellId)                                       
                    continue;

                SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
                if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, player->GetSession()->GetPlayer(), false))
                    continue;

                // On lui ajoute les sorts de rang maximum.
                player->learnSpellHighRank(spellId);
                player->AddTalent(spellId, player->GetActiveSpec(), true);
            }

            player->SetFreeTalentPoints(0);

            }
        }
    }
        
};

void AddSC_login_script()
{
    new login_script();
}

Après je n'ai pas testé encore cette fonction


PS: Utilise les balises [ shcode=cpp] (pour du C++)[/ shcode] etc sans les espaces bien sûr ^^
je viens de vérifier celà, ça re-apprend pas les talents, mais le joueur oublie les talent... WTF
Problème résolu : http://wow-emu.fr/showthread.php?tid=520

Retourner en haut WoW-Emu