CORE 6xx PNJ choix Camp Panda , Race , Faction & Apparence
#1
[Image: Panda.jpg]
PNJ Changeur de Race , Faction , Look 

Un PNJ qui peut être utile sur son serveur qui propose les options de bases pour changer son personnage de Camp Alliance/Horde , de Race , d'apparence ou n'on inclus d'origine pour choisir le camp des Pandarens .
Dans ce dernier cas les Pandarens commenceront dans l'Alliance et pourront par ce PNJ changer pour la Horde ou tout autre races mais devront avoir fait les quêtes de bases. 
Les autres races pourront aussi changer pour devenir un Pandarens de leur camp par un menu dédié , l'autre camp Pandaren sera masqué .
Il est aussi possible d'adapter cette technique pour la fin des quetes Pandarens afin de remplacer l'option bugué du choix du camp mais je ne la développerais pas ici , je n'ai pas non plus inclus d'option de paiement comme il ce fait dans d'autres script (token), le PNJ est en accès libre et donc gratuit . 

Pour ces opérations j'utiliserais la technique officielle qui permet de changer son personnage de camp en y ajoutant quelques variables : AT_LOGIN_*** et nécessitera donc une déco/reco apres son choix .


1) Dans un premier temps il nous faut le PNJ dans notre DB worlds , le voici . A vous de vous le personnaliser :

Citation :DELETE FROM `creature_template` WHERE (entry = 15000142);
INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `femaleName`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `exp_unk`, `faction`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `dmgschool`, `BaseAttackTime`, `RangeAttackTime`, `BaseVariance`, `RangeVariance`, `unit_class`, `unit_flags`, `unit_flags2`, `dynamicflags`, `family`, `trainer_type`, `trainer_class`, `trainer_race`, `type`, `type_flags`, `type_flags2`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `HoverHeight`, `HealthModifier`, `HealthModifierExtra`, `ManaModifier`, `ManaModifierExtra`, `ArmorModifier`, `DamageModifier`, `ExperienceModifier`, `RacialLeader`, `movementId`, `RegenHealth`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `VerifiedBuild`) VALUES
(
15000142, 0, 0, 0, 0, 0, 27211, 27211, 0, 0, 'Changix', '', 'Faction , Race , Faction Panda', '', 0, 100, 100, 0, 0, 35, 1, 1, 1.1428600549698, 0.75, 0, 0, 2000, 2000, 1, 1, 1, 131074, 2048, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 'npc_changer', 0);


2) Ensuite sont menu gossip dans le core pour proposer les divers choix : Ouvrez le fichier \src\server\scripts\World\npcs_special.cpp
  • Tout a la fin de ce fichier dans les void AddSC_npcs_special() ajoutez :
Citation :new npc_changer(); //STITCH PNJ change race , faction , rename et custom 15000142
  • Juste avant les void AddSC_npcs_special() ajoutez les lignes suivantes qui sont les lignes proposant les divers choix :
Citation :/*##############################################################################################
#  //STITCH PNJ 15000142 : change race , faction , apparence gratuitement - npc_changer
################################################################################################*/

class npc_changer : public CreatureScript
{
public:
npc_changer() : CreatureScript("npc_changer"){}

bool OnGossipHello(Player * pPlayer, Creature * pCreature)
{

TeamId team = pPlayer->GetTeamId();
pPlayer->ADD_GOSSIP_ITEM(4, "Changer de Race ", GOSSIP_SENDER_MAIN, 0);
pPlayer->ADD_GOSSIP_ITEM(4, "Changer de Faction (Avec TP)", GOSSIP_SENDER_MAIN, 1);
if (team == TEAM_ALLIANCE) { pPlayer->ADD_GOSSIP_ITEM(4, "Changer ma Race en Panda", GOSSIP_SENDER_MAIN, 4); }
if (team == TEAM_HORDE) { pPlayer->ADD_GOSSIP_ITEM(4, "Changer ma Race en Panda", GOSSIP_SENDER_MAIN, 4); }
pPlayer->ADD_GOSSIP_ITEM(4, "Changer mon Apparence", GOSSIP_SENDER_MAIN, 9); //sinon crash
pPlayer->ADD_GOSSIP_ITEM(4, " Changer mon nom", GOSSIP_SENDER_MAIN, 10);  

pPlayer->PlayerTalkClass->SendGossipMenu(9425, pCreature->GetGUID());
return true;
}

bool OnGossipSelect(Player * Player, Creature * Creature, uint32 /*uiSender*/, uint32 uiAction)
{
if (!Player)
return true;

switch (uiAction)
{

case 0:
Player->SetAtLoginFlag(AT_LOGIN_CHANGE_RACE);
Player->GetSession()->SendNotification("Vous devez vous reconnecter pour changer votre race!");
Player->PlayerTalkClass->SendCloseGossip();
break;
case 1:
Player->SetAtLoginFlag(AT_LOGIN_CHANGE_FACTION);
Player->GetSession()->SendNotification("Vous devez vous reconnecter pour changer votre faction!");
Player->PlayerTalkClass->SendCloseGossip();
break;
case 4:
if (Player->GetTeamId() == TEAM_ALLIANCE) { Player->SetAtLoginFlag(AT_LOGIN_allianceverspanda); }
if (Player->GetTeamId() == TEAM_HORDE) { Player->SetAtLoginFlag(AT_LOGIN_hordeverspanda); }
Player->GetSession()->SendNotification("Vous devez vous reconnecter pour changer votre race!");
Player->PlayerTalkClass->SendCloseGossip();
Player->CastSpell(Player, 113245, true);
break;
case 9:
Player->SetAtLoginFlag(AT_LOGIN_CUSTOMIZE);
Player->GetSession()->SendNotification("Vous devez vous reconnecter pour changer votre apparence");
Player->PlayerTalkClass->SendCloseGossip();
break;
case 10:
Player->SetAtLoginFlag(AT_LOGIN_RENAME);
Player->GetSession()->SendNotification("Vous devez vous reconnecter pour changer votre nom");
Player->PlayerTalkClass->SendCloseGossip();
break;

}
return true;
}

};

void AddSC_npc_changer()
{
new npc_changer();
}
Pour ce script je l'ai voulu facile d’accès aussi j'ai retiré certaines de mes options active ou en cour de dev . 
Vous remarquerez pour le choix du camp des Pandarens que ce choix propose 2 lignes , une pour l'alliance et une pour la Horde mais je joueur ne ce verra proposé que celle de son camp. Il vous est aussi possible sur le même procédé de limiter a une race ou une classe : if (Player->GetTeamId() == TEAM_ALLIANCE) { .... } ou de lancer un spell par exemple pour un visuel ou lancer une intro Player->CastSpell(Player, 113245, true); . J'aurais pu aussi incorporer le traitement du choix a ces lignes mais je n'ai pas voulu séparer la ligne qui passe automatiquement le panda neutre dans l'alliance par défaut .  A vous d'adapter en fonction de vos humeur .




3) Choix de faction pour les Pandarens

Les parties AT_LOGIN_CHANGE_RACE , AT_LOGIN_CHANGE_FACTION , AT_LOGIN_CUSTOMIZE et AT_LOGIN_RENAME sont incluses d'origines dans le core et il ni a donc rien d'autre a faire . 

Par contre les variables AT_LOGIN_allianceverspanda et AT_LOGIN_hordeverspanda n'existent pas d'origine et sont a rajouter dans \src\server\game\Entities\Player\Player.h , ajoutez la partie en vert :
Citation :enum AtLoginFlags
{
    AT_LOGIN_NONE              = 0x000,
    AT_LOGIN_RENAME            = 0x001,//1
    AT_LOGIN_RESET_SPELLS      = 0x002,//2
    AT_LOGIN_RESET_TALENTS     = 0x004,//4
    AT_LOGIN_CUSTOMIZE         = 0x008,//8
    AT_LOGIN_RESET_PET_TALENTS = 0x010,//16
    AT_LOGIN_FIRST             = 0x020,//32
    AT_LOGIN_CHANGE_FACTION    = 0x040,//64
    AT_LOGIN_CHANGE_RACE       = 0x080,//128
    AT_LOGIN_RESURRECT         = 0x100,//256
AT_LOGIN_allianceverspanda = 0x200, //STITCH : nouvelle valeur : ajouter un 0 binaire puis convertir en hexa - 512
AT_LOGIN_hordeverspanda = 0x400, //STITCH : nouvelle valeur : ajouter un 0 binaire puis convertir en hexa - 1024

Vous remarquerez qu'a chaque option correspond un bit mais la valeur est exprimé en hexa : 1,2,4,8,16, ... et sont donc normalement cumulable . Pour des raisons pratiques j'ai retiré cette option cumulable dans les lignes qui suivront.

Je terminerais par le traitement du choix des pandarens qui n'est rien d'autre qu'une requete SQL du core afin de changer la race dans la DB Character , d'ou le déco/Reco . Pour ceci éditez \src\server\game\Handlers\CharacterHandler.cpp juste avant ces lignes (270 environ) :
Citation :return res;
}

void WorldSession::HandleCharEnum(PreparedQueryResult result)
{

Rajoutez :

Citation :CharacterDatabase.DirectExecute("UPDATE `characters` SET `race` = 25,`at_login`=0 WHERE (`at_login` = 512 AND (`race` = 1 OR `race` = 3 OR `race` = 4 OR `race` = 7 OR `race` = 11 OR `race` = 22) OR `race`=24 )"); //STITCH a la connexion un joueur A2 deviens Panda A2 - AT_LOGIN_allianceverspanda s'il est NEUTRE ou s'il a fait ce choix par le PNJ

CharacterDatabase.DirectExecute("UPDATE `characters` SET `race` = 26,`at_login`=0 WHERE `at_login` = 1024 AND (`race` = 2 OR `race` = 5 OR `race` = 6 OR `race` = 8 OR `race` = 10 OR `race` = 9) "); //STITCH a la connexion un joueur H2 deviens Panda H2 - AT_LOGIN_hordeverspanda s'il a fait ce choix par le PNJ


//
CharacterDatabase.DirectExecute("UPDATE `characters` SET `at_login`=0 WHERE `at_login`!=1 AND `at_login`!=2 AND `at_login`!=4 AND `at_login`!=8 AND `at_login`!=16 AND `at_login`!=32 AND `at_login`!=64 AND `at_login`!=128 AND `at_login`!=256 AND `at_login`!=512 AND `at_login`!=1024 AND `at_login`!=2048 AND `at_login`!=4096"); //STITCH - ici je remet a zero s'il y a des choix cumulés qui risquerait le choix du panda (je n'ai pas voulu m'embeter a faire un test par bit plutot que par entier ).
Faites attention dans ces dernières ligne les valeurs des variables AT_LOGIN_allianceverspanda  et AT_LOGIN_hordeverspanda  sont des entiers alors que dans les lignes précédentes elles ont été défini en hexa .

Bon voila , ces lignes pourrait être mieux ecrites comme de n'agir que sur le joueur plutôt que de passer tout les panda neutre dans l'alliance mais comme je débute sur le core ... merci de votre compréhension :p

Il ne vous reste plus qu'a compiler votre core , bon jeu a vous Smile
Répondre
#2
J'ai oublié de preciser dans les tes sql que je n'avais pas inclus de test de classe pour la simple raison que je l''ai modifié pour qu'il accepte toutes les classes pour toutes les races  Tongue
Répondre
#3
Encore un petit bijou, décidément tu nous gâtes trop. Merci beaucoup
Si tu avances, tu meurs ... si tu recules, tu meurs ... alors dis moi ... pourquoi tu recules?
(Proverbe mongol)
Répondre
#4
bon c est pas top mais sa a l avantage de fonctionner et de pouvoir etre adapté pour faire un tas de choses sans modif client comme l'ajout de race si un jour je debloque mon probleme . de plus on ne trouve nule part comment passer outre le bug du choix de faction des Panda ... donc ... Undecided
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)