Commande .boutique
Voila cette commande permet de récupérer ses achats sur une boutique en ligne en lançant la commande .boutique
[code=cpp]
bool HandleBoutiqueCommand(const char* args)
{
Player *pPlayer = m_session->GetPlayer();
QueryResult result = CharacterDatabase.PQuery("SELECT type, value, count FROM boutique_commande WHERE acc_id = %u AND sended = 0",pPlayer->GetSession()->GetAccountId());
if (!result)
{
SendSysMessage("Aucune commande en attente !");
return false;
}
Field *fields = result->Fetch();
SendSysMessage("Livraison en cours ...");
SendSysMessage("-------------------");
do
{
switch(fields[0]->GetUint32())
{
case 0: // PO
{
pPlayer->SetMoney(pPlayer->GetMoney() + (fields[1]->GetUInt32()*100*100);
PSendSysMessage("-> %s Pièces d'Or", fields[1]->GetUInt32());
break;
}
case 1: // PH
{
pPlayer->SetHonorPoints(pPlayer->GetHonorPoints() + (fields[1]->GetUInt32());
PSendSysMessage("-> %s Points d'Honneur", fields[1]->GetUInt32());
break;
}
case 2: // PA
{
pPlayer->SetArenaPoints(pPlayer->GetArenePoints() + (fields[1]->GetUInt32());
PSendSysMessage("-> %s Points d'Arene", fields[1]->GetUInt32());
break;
}
case 3: // ITEM
{
pPlayer->AddItem(fields[1]->GetUInt32(), fields[2]->GetUInt32());
break;
}
}
}while(result->NextRow());
CharacterDatabase.PExecute("UPDATE boutique_commande SET sended = 1 WHERE acc_id = %u", pPlayer->GetSession()->GetAccountId());
SendSysMessage("-------------------");
SendSysMessage("Commande livrée !");
return true;
}
[/code]

Pour un bon fonctionnement ce patch est a couplé a celui ci : http://www.zone-emu.fr/thread-12079.html

Voici la structure SQL
[code=sql]
DB NAME:
world
DB TABLE:
boutique_commande
DB FIELD:
type int(11) unsigned (0 = po, 1 = point d'honneur, 2 = point d'arene, 3 = item)
value int(11) unsigned ( qté de po, ph, pa, si type = item correspond a l'id de l'item)
count int (11) unsigned (qté de lots)
acc_id int(11) unsigned (id du compte receveur)
sended bool (indique si envoyé ou non)
[/code]
Tester et sa marche, merci a toi Smile
Désactive les smileys dans ton poste
Nota : l'éxécution de ce genre de commande est tellement rapide que le "livraison en cours ne sert à rien."

La fonction est basique et est sensé fonctionner.

Cependant tu oublie pas mal de vérifications :

- Si le mec n'a plus de place : renvoi d'un message spécifique (ERROR : videz vos sacs et rééssayez la commande)

Fonctionnalité à ajouter :
Possibilité de mettre des niveaux (SetLevel)
Prise en compte des quantités d'objets (généralement c'est 1 mais pour les consommables en boutique on peux les buy par 10 ou 20... en général), cela évite les redondances dans la base pour plusieurs items identiques et accélère le traitement par le core.

Cordialement,
Correction du script :

[code=cpp]

bool ChatHandler::HandleBoutiqueCommand(const char* args)
{
Player *pPlayer = m_session->GetPlayer();
QueryResult result = CharacterDatabase.PQuery("SELECT type, value, count FROM boutique_commande WHERE acc_id = %u AND sended = 0",pPlayer->GetSession()->GetAccountId());
if (!result)
{
SendSysMessage("Aucune commande en attente !");
return false;
}
Field *fields = result->Fetch();
SendSysMessage("Livraison en cours ...");
SendSysMessage("-------------------");
do
{
switch(fields[0].GetUInt32())
{
case 0: // PO
{
pPlayer->SetMoney(pPlayer->GetMoney() + (fields[1].GetUInt32()*100*100));
PSendSysMessage("-> %s Pièces d'Or", fields[1].GetUInt32());
break;
}
case 1: // PH
{
pPlayer->SetHonorPoints(pPlayer->GetHonorPoints() + (fields[1].GetUInt32()));
PSendSysMessage("-> %s Points d'Honneur", fields[1].GetUInt32());
break;
}
case 2: // PA
{
pPlayer->SetArenaPoints(pPlayer->GetArenaPoints() + (fields[1].GetUInt32()));
PSendSysMessage("-> %s Points d'Arene", fields[1].GetUInt32());
break;
}
case 3: // ITEM
{
pPlayer->AddItem(fields[1].GetUInt32(), fields[2].GetUInt32());
break;
}
}
}while(result->NextRow());
CharacterDatabase.PExecute("UPDATE boutique_commande SET sended = 1 WHERE acc_id = %u", pPlayer->GetSession()->GetAccountId());
SendSysMessage("-------------------");
SendSysMessage("Commande livrée !");
return true;
}[/code]
Faut le mettre dans quelle fichier ?
Dans level0.cpp si tu veux pas te prendre la tête mais je te conseille de l'adapter en script pour que ce soit plus propre. Dans script/commands/ tu as des exemples.
Ok Merci bien Heureux.
Je tiens à ajouter aussi qu' il peu y'avoir une faille pour recevoir l'objet plusieurs fois en une simple macro en jeu ! à tester je ne sais pas.
NON, pas de faille à un double envoi d'item ici car dés que la livraison est faite la db est update donc au prochains tours il n'y aura pas de livraison ...

Retourner en haut Accueil