SHOW:
|
|
- or go back to the newest paste.
1 | - | #include "StdAfx.h" |
1 | + | // Race change |
2 | - | #include "Setup.h" |
2 | + | // By Eatos |
3 | - | #define NPC_ID 56099 |
3 | + | // Convert to trinitycore by Rochet2 |
4 | // Original release thread: http://www.ac-web.org/forums/showthread.php?t=151878 | |
5 | - | class RaceChanger : public GossipScript |
5 | + | |
6 | #include "ScriptPCH.h" | |
7 | #include "GuildMgr.h" | |
8 | #include "Chat.h" | |
9 | - | void GossipHello(Object* pObject, Player * Plr, bool AutoSend) |
9 | + | |
10 | - | { |
10 | + | class RaceChanger : public CreatureScript |
11 | - | GossipMenu *Menu; |
11 | + | |
12 | - | objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 40002, Plr); |
12 | + | |
13 | - | if(Plr->GetSession()->CanUseCommand('z')) |
13 | + | RaceChanger() : CreatureScript("RaceChanger") { } |
14 | - | { |
14 | + | |
15 | - | Menu->AddItem( 0, "Change my Race", 1 ); |
15 | + | bool OnGossipHello(Player* Plr, Creature* pObject) |
16 | - | } |
16 | + | |
17 | - | else |
17 | + | if(Plr->GetSession()->GetSecurity() != SEC_PLAYER) |
18 | - | { |
18 | + | { |
19 | - | Menu->AddItem(0, "You can not use this right now!", 3); |
19 | + | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into Human", 0, 1 ); |
20 | - | } |
20 | + | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into NightElf", 0, 4 ); |
21 | - | |
21 | + | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into Dwarf", 0, 3 ); |
22 | - | if(AutoSend) |
22 | + | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into Gnome", 0, 7 ); |
23 | - | Menu->SendTo(Plr); |
23 | + | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into Draenei", 0, 11 ); |
24 | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into Orc", 0, 2 ); | |
25 | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into Undead", 0, 5 ); | |
26 | - | void GossipSelectOption(Object* pObject, Player * Plr, uint32 Id, uint32 IntId, const char * Code) |
26 | + | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into Tauren", 0, 6 ); |
27 | - | { |
27 | + | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into Troll", 0, 8 ); |
28 | - | Creature * pCreature = (pObject->GetTypeId()==TYPEID_UNIT)?((Creature*)pObject):NULL; |
28 | + | Plr->ADD_GOSSIP_ITEM( 0, "Change me Into BloodElf", 0, 10 ); |
29 | - | if(pCreature==NULL) |
29 | + | } |
30 | - | return; |
30 | + | else |
31 | { | |
32 | - | GossipMenu *Menu; |
32 | + | Plr->GetSession()->SendNotification("You can not use this right now"); |
33 | - | switch(IntId) |
33 | + | return false; |
34 | - | { |
34 | + | } |
35 | - | case 1: |
35 | + | Plr->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pObject->GetGUID()); |
36 | - | { |
36 | + | return true; |
37 | - | objmgr.CreateGossipMenuForPlayer(&Menu, pObject->GetGUID(), 1, Plr); |
37 | + | |
38 | - | Menu->AddItem( 0, "Change me Into Human", 4 ); |
38 | + | |
39 | - | Menu->AddItem( 0, "Change me Into NightElf", 5 ); |
39 | + | bool OnGossipSelect(Player* Plr, Creature* pObject, uint32 Id, uint32 IntId) |
40 | - | Menu->AddItem( 0, "Change me Into Dwarf", 6 ); |
40 | + | |
41 | - | Menu->AddItem( 0, "Change me Into Gnome", 7 ); |
41 | + | // ChatHandler(Plr).PSendSysMessage("MUHAHAHA ..."); |
42 | - | Menu->AddItem( 0, "Change me Into Draenei", 8 ); |
42 | + | |
43 | - | Menu->AddItem( 0, "Change me Into Orc", 10 ); |
43 | + | uint8 race, race_old, class_, gender; |
44 | - | Menu->AddItem( 0, "Change me Into Undead", 11 ); |
44 | + | Powers powertype; |
45 | - | Menu->AddItem( 0, "Change me Into Tauren", 12 ); |
45 | + | // TeamId team; |
46 | - | Menu->AddItem( 0, "Change me Into Troll", 13 ); |
46 | + | race_old = race = IntId; // what are these for? Shouldnt they be different? |
47 | - | Menu->AddItem( 0, "Change me Into BloodElf", 14 ); |
47 | + | |
48 | - | Menu->SendTo(Plr); |
48 | + | Plr->setFactionForRace(race); |
49 | - | }break; |
49 | + | class_ = Plr->getClass(); |
50 | - | |
50 | + | gender = Plr->getGender(); |
51 | - | case 4: // Human |
51 | + | powertype = Plr->getPowerType(); |
52 | - | { |
52 | + | // team = Plr->GetTeamId(); |
53 | - | sChatHandler.SystemMessage(Plr->GetSession(), "MUHAHAHA ..."); |
53 | + | |
54 | - | uint32 team = Plr->GetTeam(); |
54 | + | const PlayerInfo* info = sObjectMgr->GetPlayerInfo(race, class_); |
55 | if (!info) | |
56 | - | race_old = race = 1; |
56 | + | return true; |
57 | - | class_ = Plr->getClass(); |
57 | + | |
58 | - | gender = Plr->getGender(); |
58 | + | Plr->SetFloatValue(OBJECT_FIELD_SCALE_X, ((race==RACE_TAUREN)?1.3f:1.0f)); |
59 | - | powertype = Plr->GetPowerType(); |
59 | + | // Plr->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, info->factiontemplate ); // handled by setFactionForRace |
60 | - | |
60 | + | Plr->SetUInt32Value(UNIT_FIELD_BYTES_0, ( ( race ) | ( class_ << 8 ) | ( gender << 16 ) | ( powertype << 24 ) ) ); |
61 | - | Plr->SetTeam( team ? 0 : 1 ); |
61 | + | Plr->SetUInt32Value(UNIT_FIELD_DISPLAYID, gender ? info->displayId_f : info->displayId_f ); |
62 | - | PlayerCreateInfo *info = objmgr.GetPlayerCreateInfo(race, class_); |
62 | + | Plr->SetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID, gender ? info->displayId_f : info->displayId_f ); |
63 | - | if (!info) |
63 | + | |
64 | - | break; |
64 | + | // Different races have different number of visuals |
65 | Plr->SetUInt32Value(PLAYER_BYTES, ((urand(0,5))|(urand(0,5)<<8)|(urand(0,5)<<16)|(urand(0,5)<<24))); // urand were RandomUInt. Might not exist in Trinitycore. Not sure what it does either. | |
66 | - | Plr->SetFloatValue(OBJECT_FIELD_SCALE_X, ((race==RACE_TAUREN)?1.3f:1.0f)); |
66 | + | Plr->SetUInt32Value(PLAYER_BYTES_2, (( !gender ? 0 : urand(0,3) ) | (0x02 << 24))); // gender right? |
67 | - | Plr->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, info->factiontemplate ); |
67 | + | //Plr->SetUInt32Value(PLAYER_BYTES, ((skin) | (face << 8) | (hairStyle << 16) | (hairColor << 24))); |
68 | - | Plr->SetUInt32Value(UNIT_FIELD_BYTES_0, ( ( race ) | ( class_ << 8 ) | ( gender << 16 ) | ( powertype << 24 ) ) ); |
68 | + | //Plr->SetUInt32Value(PLAYER_BYTES_2, (facialHair | (0x02 << 24))); |
69 | - | if(race != RACE_BLOODELF) |
69 | + | |
70 | - | { |
70 | + | Plr->SetUInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, 0xEEEEEEEE); |
71 | - | Plr->SetUInt32Value(UNIT_FIELD_DISPLAYID, info->displayId + gender ); |
71 | + | //dump reputation data |
72 | - | Plr->SetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID, info->displayId + gender ); |
72 | + | FactionStateList m_tempRepMap; |
73 | - | } |
73 | + | //store neutral |
74 | - | else |
74 | + | for(uint32 i = 0; i < sFactionStore.GetNumRows(); ++i) |
75 | - | { |
75 | + | { |
76 | - | Plr->SetUInt32Value(UNIT_FIELD_DISPLAYID, info->displayId - gender ); |
76 | + | const FactionEntry * f = sFactionStore.LookupEntry(i); |
77 | - | Plr->SetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID, info->displayId - gender ); |
77 | + | if(f == 0) continue; |
78 | - | } |
78 | + | if( Plr->GetReputation(f->ID) && |
79 | - | // Different races have different number of visuals |
79 | + | f->team != 67 && f->team != 469 && // ream = parentFaction ? |
80 | - | Plr->SetUInt32Value(PLAYER_BYTES, ((RandomUInt(5))|(RandomUInt(5)<<8)|(RandomUInt(5)<<16)|(RandomUInt(5)<<24))); |
80 | + | f->team != 892 && f->team != 891 && |
81 | - | Plr->SetUInt32Value(PLAYER_BYTES_2, (( !gender ? 0 : RandomUInt(3) ) | (0x02 << 24))); |
81 | + | f->ID != 947 && f->ID != 946 && |
82 | - | //Plr->SetUInt32Value(PLAYER_BYTES, ((skin) | (face << 8) | (hairStyle << 16) | (hairColor << 24))); |
82 | + | f->ID != 892 && f->ID != 891 && |
83 | - | //Plr->SetUInt32Value(PLAYER_BYTES_2, (facialHair | (0x02 << 24))); |
83 | + | f->ID != 941 && f->ID != 978 && |
84 | - | |
84 | + | f->ID != 922 |
85 | - | Plr->SetUInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, 0xEEEEEEEE); |
85 | + | ) |
86 | - | //dump reputation data |
86 | + | { |
87 | - | ReputationMap m_tempRepMap; |
87 | + | const ReputationMgr & repMgr = Plr->GetReputationMgr(); |
88 | - | //store neutral |
88 | + | FactionState * rep = new FactionState; |
89 | - | for(uint32 i = 0; i < dbcFaction.GetNumRows(); ++i) |
89 | + | /* |
90 | - | { |
90 | + | rep->Flags = 0; |
91 | - | FactionDBC * f = dbcFaction.LookupRow(i); |
91 | + | rep->Standing = repMgr.GetReputation(f->ID); |
92 | - | if(f == 0) continue; |
92 | + | rep->base = repMgr.GetBaseReputation(f->ID); |
93 | - | if( Plr->GetStanding(f->ID) && |
93 | + | */ |
94 | - | f->parentFaction != 67 && f->parentFaction != 469 && |
94 | + | FactionState newFaction; |
95 | - | f->parentFaction != 892 && f->parentFaction != 891 && |
95 | + | newFaction.ID = f->ID; |
96 | - | f->ID != 947 && f->ID != 946 && |
96 | + | newFaction.ReputationListID = f->reputationListID; |
97 | - | f->ID != 892 && f->ID != 891 && |
97 | + | newFaction.Standing = repMgr.GetReputation(f->ID); |
98 | - | f->ID != 941 && f->ID != 978 && |
98 | + | newFaction.Flags = 0; |
99 | - | f->ID != 922 |
99 | + | newFaction.needSend = true; |
100 | - | ) |
100 | + | newFaction.needSave = true; |
101 | - | { |
101 | + | |
102 | - | FactionReputation * rep = new FactionReputation; |
102 | + | m_tempRepMap[f->ID] = newFaction; // newFaction.ReputationListID or f->ID? |
103 | - | rep->flag = 0; |
103 | + | } |
104 | - | rep->standing = Plr->GetStanding(f->ID); |
104 | + | } |
105 | - | rep->baseStanding = Plr->GetBaseStanding(f->ID); |
105 | + | |
106 | Plr->GetReputationMgr().SendInitialReputations(); // does this initialize the rep values? | |
107 | - | m_tempRepMap[f->ID] = rep; |
107 | + | |
108 | - | } |
108 | + | for(FactionStateList::iterator itr = m_tempRepMap.begin(); itr != m_tempRepMap.end(); ++itr) |
109 | - | } |
109 | + | { |
110 | - | |
110 | + | Plr->SetReputation(itr->first, itr->second.Standing ); |
111 | - | |
111 | + | //delete itr->second; |
112 | - | Plr->_InitialReputation(); |
112 | + | } |
113 | - | |
113 | + | |
114 | - | for(ReputationMap::iterator itr = m_tempRepMap.begin(); itr != m_tempRepMap.end(); ++itr) |
114 | + | // Plr->(); // _RemoveLanguages See CharacterHandler.cpp 1736 line ? |
115 | - | { |
115 | + | // Seems like languages are handled automatically. |
116 | - | Plr->SetStanding(itr->first, itr->second->standing ); |
116 | + | |
117 | - | //delete itr->second; |
117 | + | //remove racial spells along with all starting spells then add them for new race |
118 | - | } |
118 | + | const PlayerInfo* old_info = sObjectMgr->GetPlayerInfo(race_old, class_); |
119 | if (!old_info) | |
120 | - | Plr->_RemoveLanguages(); |
120 | + | return true; |
121 | - | |
121 | + | |
122 | - | //remove racial spells along with all starting spells then add them for new race |
122 | + | for(PlayerCreateInfoSpells::const_iterator sp = old_info->spell.begin(); sp != old_info->spell.end(); sp++) // spell_list |
123 | - | PlayerCreateInfo * old_info = objmgr.GetPlayerCreateInfo(race_old, class_); |
123 | + | if (Plr->HasSpell(*sp)) Plr->removeSpell((*sp), false, false); |
124 | - | if (!old_info) break; |
124 | + | |
125 | for(PlayerCreateInfoSpells::const_iterator sp = info->spell.begin(); sp != info->spell.end(); sp++) | |
126 | - | for(std::set<uint32>::iterator sp = old_info->spell_list.begin(); sp!=old_info->spell_list.end(); sp++) |
126 | + | Plr->addSpell((*sp), true, true, true, false); |
127 | - | if (Plr->HasSpell(*sp)) Plr->removeSpell((*sp), false, false, 0); |
127 | + | |
128 | // Shouldnt we also take into account if the faction changes? | |
129 | - | for(std::set<uint32>::iterator sp = info->spell_list.begin(); sp!=info->spell_list.end(); sp++) |
129 | + | if (Plr->GetGuildId()) |
130 | - | Plr->addSpell(*sp); |
130 | + | { |
131 | Guild *pGuild = sGuildMgr->GetGuildById( Plr->GetGuildId() ); | |
132 | - | |
132 | + | |
133 | - | if (Plr->GetGuildId()) |
133 | + | if(pGuild && pGuild->GetLeaderGUID() != Plr->GetGUID() ) |
134 | - | { |
134 | + | { |
135 | - | Guild *pGuild = objmgr.GetGuild( Plr->GetGuildId() ); |
135 | + | pGuild->DeleteMember(Plr->GetGUID()); |
136 | /*Plr->L SetGuildId(0); | |
137 | - | if(pGuild && pGuild->GetGuildLeader() != Plr->GetGUID() ) |
137 | + | Plr->SetGuildRank(0); |
138 | - | { |
138 | + | pGuild->RemoveGuildMember(Plr->m_playerInfo, NULL); |
139 | - | Plr->SetGuildId(0); |
139 | + | |
140 | - | Plr->SetGuildRank(0); |
140 | + | WorldPacket data(100); |
141 | - | pGuild->RemoveGuildMember(Plr->m_playerInfo, NULL); |
141 | + | data.Initialize(SMSG_GUILD_EVENT); |
142 | data << uint8(GUILD_EVENT_LEFT); | |
143 | - | WorldPacket data(100); |
143 | + | data << uint8(1); |
144 | - | data.Initialize(SMSG_GUILD_EVENT); |
144 | + | data << Plr->GetName(); |
145 | - | data << uint8(GUILD_EVENT_LEFT); |
145 | + | pGuild->SendPacket(&data); |
146 | - | data << uint8(1); |
146 | + | */ |
147 | - | data << Plr->GetName(); |
147 | + | } |
148 | - | pGuild->SendPacket(&data); |
148 | + | } |
149 | - | } |
149 | + | |
150 | - | } |
150 | + | Plr->SaveToDB(false); |
151 | // ChatHandler(Plr).PSendSysMessage("Signed in blood. There is no going back now ..."); | |
152 | - | |
152 | + | // ChatHandler(Plr).PSendSysMessage("Relog ..."); |
153 | //force relog | |
154 | - | Plr->SaveToDB(false); |
154 | + | Plr->GetSession()->KickPlayer(); // instant kick, cant be bothered to make it delayed. |
155 | - | sChatHandler.SystemMessage(Plr->GetSession(), "Signed in blood. There is no going back now ..."); |
155 | + | Plr->CLOSE_GOSSIP_MENU(); |
156 | - | sChatHandler.SystemMessage(Plr->GetSession(), "Relog ..."); |
156 | + | return true; |
157 | - | //force relog |
157 | + | |
158 | - | Plr->Kick(5000); |
158 | + | |
159 | - | Plr->Gossip_Complete(); |
159 | + | |
160 | - | |
160 | + | void AddSC_RaceChanger() |
161 | - | }break; |
161 | + | |
162 | - | |
162 | + | new RaceChanger(); |
163 | - | case 5: // Nightelf |
163 | + |