#Résolu Script c++ de limite spell !
Bonjour voilà j'ai un script c++ d'un mr spell spell, et j'ai regarder dedans qu'il y avait des lignes de codes pour ajouter une limite, la fonction GetSpellsMember, donc j'ai de ce pas essayer de recompiler avec ce script et voilà qu'une erreur me sort, j'ai donc essayer de trouver pour voir si la ligne a été mis à jour ( je veux dire que la fonction a pu être changer selon les mise à jours) Voici l'erreur !

3>------ Début de la génération : Projet : scripts, Configuration : Release Win32 ------
3> mr_spell_limite.cpp
3>........srcserverscriptsCustommr_spell_limite.cpp(13): error C2039: 'GetSpellsMember' : n'est pas membre de 'Player'
3> C:TestTransmoTrinityCoresrcservergameEntitiesPlayerPlayer.h(1060) : voir la déclaration de 'Player'
3>........srcserverscriptsCustommr_spell_limite.cpp(32): error C2039: 'GetSpellsMember' : n'est pas membre de 'Player'
3> C:TestTransmoTrinityCoresrcservergameEntitiesPlayerPlayer.h(1060) : voir la déclaration de 'Player'
3>........srcserverscriptsCustommr_spell_limite.cpp(59): error C2039: 'GetSpellsMember' : n'est pas membre de 'Player'
3> C:TestTransmoTrinityCoresrcservergameEntitiesPlayerPlayer.h(1060) : voir la déclaration de 'Player'
3>........srcserverscriptsCustommr_spell_limite.cpp(61): error C2039: 'ModifySpellsMember' : n'est pas membre de 'Player'
3> C:TestTransmoTrinityCoresrcservergameEntitiesPlayerPlayer.h(1060) : voir la déclaration de 'Player'
3>........srcserverscriptsCustommr_spell_limite.cpp(88): error C2039: 'GetSpellsMember' : n'est pas membre de 'Player'
3> C:TestTransmoTrinityCoresrcservergameEntitiesPlayerPlayer.h(1060) : voir la déclaration de 'Player'
3>........srcserverscriptsCustommr_spell_limite.cpp(90): error C2039: 'ModifySpellsMember' : n'est pas membre de 'Player'
3> C:TestTransmoTrinityCoresrcservergameEntitiesPlayerPlayer.h(1060) : voir la déclaration de 'Player'
4>------ Début de la génération : Projet : ALL_BUILD, Configuration : Release Win32 ------
4> Build all projects
========== Génération : 3 a réussi, 1 a échoué, 12 mis à jour, 0 a été ignoré ==========
La fonction doit avoir changer de nom, essaye de voir dans les commits de trinitycore.
(ou alors le script Mr Spells, ajoute des fonctions a la classe Player)
Comment puis-je aller dans les commits ?
Merci
Se serait peut être plus simple de naviguer dans le code (plus particulièrement dans la classe Player) pour trouver les nouveaux noms.

Naviguer dans les commits sa risque d'être beaucoup plus long ^^
Le mieux serait d'ajouté une requête SQL pour update à chaque achat de spell. ex:
CharacterDatabase.DirectPExecute("UPDATE characters SET total_spell_combat = total_spell_combat + 1 WHERE name = '%s'", player->GetName().c_str());

faire un ALTER à ta table characters:
ALTER TABLE characters ADD `total_spell_combat` int(11) NOT NULL;

Il faudrait penser à définir GetSpellsCombat dans Player.cpp et Player.h:

Player.cpp -> Ajoute:

int32 Player::GetSpellsCombat()
{
QueryResult result = CharacterDatabase.PQuery("SELECT `total_spell_combat` FROM `characters` WHERE `name` = '%s'", GetSession()->GetPlayerName().c_str());
if(!result)
return false;
Field *fields = result->Fetch();
int32 nbr_spells_combat = fields->GetInt32();
return nbr_spells_combat;
}

Player.h -> Ajoute:
int32 GetSpellsCombat();

Et pour ce qui est de la fonction qui vérifie le nombre de spell, on introduit ça dans le menu principal de mr.spell:

player->PlayerTalkClass->ClearMenus();
             
            if(player->GetSpellsCombat() >= 25)
			{
				ChatHandler(player->GetSession()).PSendSysMessage("Vous avez actuellement %u spell(s), ce qui est la limite autorisé sur le serveur.", player->GetSpellsCombat());
			}
D'accord Sleazy, je vais essayer de faire tout sa, je te tiens au courant !

Vraiment, merci beaucoup !
De rien Wink
J'ai essayer de faire ce que tu as dis j'ai alter table, ajouter l'update et ajouter les fonctions dans player mais sa ne marche toujours pas si y'en a qui sont intéresser pour regarder le script, je le met

EDIT
if(player->GetSpellsCombat() < 30)

{
player->ADD_GOSSIP_ITEM(5, "Spells Chevaliers de la mort", GOSSIP_SENDER_MAIN, 5001);
player->ADD_GOSSIP_ITEM(0, "Fermer", GOSSIP_SENDER_MAIN, 50020);
player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
}
else
{
player->ADD_GOSSIP_ITEM(5, "Vous avez atteint la limite de spells.", GOSSIP_SENDER_MAIN, 50020);
player->ADD_GOSSIP_ITEM(0, "Fermer", GOSSIP_SENDER_MAIN, 50020);
player->PlayerTalkClass->SendGossipMenu(907, creature->GetGUID());
}

return true;
}

if (player->HasItemCount(60000, 10 , true))
{
if(player->HasSpell(51271))
{
creature->MonsterWhisper("Vous avez deja le sort Armure incassable", player->GetGUID());
player->CLOSE_GOSSIP_MENU();
}
else
{
CharacterDatabase.DirectPExecute("UPDATE characters SET total_spell_combat = total_spell_combat + 1 WHERE name = '%s'", player->GetName().c_str());
player->learnSpell(51271, false);
player->DestroyItemCount(60000, 10, true); player->SaveToDB();
player->SaveToDB();
creature->MonsterWhisper("Vous avez obtenu le sort : Armure incassable", player->GetGUID());
player->CLOSE_GOSSIP_MENU();
}
}
else
{
creature->MonsterWhisper("Vous n'avez pas assez de jetons", player->GetGUID());
player->CLOSE_GOSSIP_MENU();
}
break;

Ca devrait être mieux là Wink

Script total:

3> mr_spell_limite.cpp
3>........srcserverscriptsCustommr_spell_limite.cpp(13): error C2039: 'GetSpellsCombat' : n'est pas membre de 'Player'
3> C:TestTransmoTrinityCoresrcservergameEntitiesPlayerPlayer.h(1062) : voir la déclaration de 'Player'
4>........srcservergameEntitiesPlayerPlayer.cpp(26470): error C2039: 'GetSpellsCombat' : n'est pas membre de 'Player'
4> c:testtransmotrinitycoresrcservergameentitiesplayerPlayer.h(1062) : voir la déclaration de 'Player'
4>........srcservergameEntitiesPlayerPlayer.cpp(26472): error C2227: la partie gauche de '->GetPlayerName' doit pointer vers un type class/struct/union/générique
4> le type est ''unknown-type''
4>........srcservergameEntitiesPlayerPlayer.cpp(26472): error C2228: la partie gauche de '.c_str' doit avoir un class/struct/union
4>........srcservergameEntitiesPlayerPlayer.cpp(26472): error C3861: 'GetSession' : identificateur introuvable
5>------ Début de la génération : Projet : ALL_BUILD, Configuration : Release Win32 ------
5> Build all projects
========== Génération : 3 a réussi, 2 a échoué, 11 mis à jour, 0 a été ignoré ==========


A mon avis j'ai mal insérer les fonctions dans player pourtant, je penses que c'est sa ..
A la fin de player.cpp j'ai rajouter
int32 Player::GetSpellsCombat()
{
QueryResult result = CharacterDatabase.PQuery("SELECT `total_spell_combat` FROM `characters` WHERE `name` = '%s'", GetSession()->GetPlayerName().c_str());
if(!result)
return false;
Field *fields = result->Fetch();
int32 nbr_spells_combat = fields->GetInt32();
return nbr_spells_combat;
}

et dans player.h

public: // constructors
TradeData(Player* player, Player* trader) :
m_player(player), m_trader(trader), m_accepted(false), m_acceptProccess(false),
m_money(0), m_spell(0), m_spellCastItem(0) { memset(m_items, 0, TRADE_SLOT_COUNT * sizeof(uint64)); }

Player* GetTrader() const { return m_trader; }
TradeData* GetTraderData() const;

Item* GetItem(TradeSlots slot) const;
bool HasItem(uint64 itemGuid) const;
TradeSlots GetTradeSlotForItem(uint64 itemGuid) const;
void SetItem(TradeSlots slot, Item* item);

int32 GetSpellsCombat();

uint32 GetSpell() const { return m_spell; }
void SetSpell(uint32 spell_id, Item* castItem = NULL);

J'ai bien rajouter int32 GetSpellsCombat(); c'est bizarre peut-être que c'est moi aussi je débute dans ce language ^^
Insère le code dans player.cpp après la fonction:

void Player::SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast)
{
    if (!item)                                               // prevent crash
        return;

                                                            // last check 2.0.10
    WorldPacket data(SMSG_ITEM_PUSH_RESULT, (8+4+4+4+1+4+4+4+4+4));
    data << uint64(GetGUID());                              // player GUID
    data << uint32(received);                               // 0=looted, 1=from npc
    data << uint32(created);                                // 0=received, 1=created
    data << uint32(1);                                      // bool print error to chat
    data << uint8(item->GetBagSlot());                      // bagslot
                                                            // item slot, but when added to stack: 0xFFFFFFFF
    data << uint32((item->GetCount() == count) ? item->GetSlot() : -1);
    data << uint32(item->GetEntry());                       // item id
    data << uint32(item->GetItemSuffixFactor());            // SuffixFactor
    data << int32(item->GetItemRandomPropertyId());         // random item property id
    data << uint32(count);                                  // count of items
    data << uint32(GetItemCount(item->GetEntry()));         // count of items in inventory

    if (broadcast && GetGroup())
        GetGroup()->BroadcastPacket(&data, true);
    else
        GetSession()->SendPacket(&data);
}

On voit aussi que ma version de Trinity est trop obselète comparé à la tienne, ".c_str();" erreur GetSession erreur...
J'ai bien ajouter le bou de script après la fonction que tu m'a donné et sa me marque encore une erreur j'essaye de voir de me côter je me renseigne sur le trinitycore mais y'a rien qui m'indique c'est assez tordue :/

3> mr_spell_limite.cpp
3>........srcserverscriptsCustommr_spell_limite.cpp(13): error C2039: 'GetSpellsCombat' : n'est pas membre de 'Player'
3> C:TestTransmoTrinityCoresrcservergameEntitiesPlayerPlayer.h(1062) : voir la déclaration de 'Player'
4>........srcservergameEntitiesPlayerPlayer.cpp(14310): error C2039: 'GetSpellsCombat' : n'est pas membre de 'Player'
4> c:testtransmotrinitycoresrcservergameentitiesplayerPlayer.h(1062) : voir la déclaration de 'Player'
4>........srcservergameEntitiesPlayerPlayer.cpp(14312): error C2227: la partie gauche de '->GetPlayerName' doit pointer vers un type class/struct/union/générique
4> le type est ''unknown-type''
4>........srcservergameEntitiesPlayerPlayer.cpp(14312): error C2228: la partie gauche de '.c_str' doit avoir un class/struct/union
4>........srcservergameEntitiesPlayerPlayer.cpp(14312): error C3861: 'GetSession' : identificateur introuvable
5>------ Début de la génération : Projet : ALL_BUILD, Configuration : Release Win32 ------
5> Build all projects
========== Génération : 3 a réussi, 2 a échoué, 11 mis à jour, 0 a été ignoré ==========
La fonction ne peut pas fonctionner car elle contient une erreur les parties de gauches de mes fonctions ne sont pas fonctionnelle, tu peux m'upload ton TrinityCore (avec source) stp? Je test une compilation ?
D'accord je vais faire sa je t'envoie par mp sur le forum !
Merci Smile

dans mr_spell_limite.cpp

Tu remplaces:

player->GetPlayerName().c_str());

par:

player->GetName().c_str());

Et dans player.cpp pareil!

Tu remplaces:

player->GetPlayerName().c_str());

par:

player->GetName().c_str());

Retourner en haut WoW-Emu