2 * Copyright (C) 2005,2006 MaNGOS <http://www.mangosproject.org/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #include "Database/DatabaseEnv.h"
21 #include "WorldPacket.h"
22 #include "WorldSession.h"
26 #include "ObjectMgr.h"
28 #include "UpdateMask.h"
30 #include "MapManager.h"
31 #include "Policies/SingletonImp.h"
33 LanguageDesc lang_description
[LANGUAGES_COUNT
] =
35 { // LANG_GLOBAL/LANG_UNIVERSAL = 0
38 { LANG_ORCISH
, 669, SKILL_LANG_ORCISH
},
39 { LANG_DARNASSIAN
, 671, SKILL_LANG_DARNASSIAN
},
40 { LANG_TAURAHE
, 670, SKILL_LANG_TAURAHE
},
41 { LANG_DWARVISH
, 672, SKILL_LANG_DWARVEN
},
42 { LANG_COMMON
, 668, SKILL_LANG_COMMON
},
43 { LANG_DEMONIC
, 815, SKILL_LANG_DEMON_TONGUE
},
44 { LANG_TITAN
, 816, SKILL_LANG_TITAN
},
45 { LANG_THELASSIAN
, 813, SKILL_LANG_THALASSIAN
},
46 { LANG_DRACONIC
, 814, SKILL_LANG_DRACONIC
},
47 { LANG_KALIMAG
, 817, SKILL_LANG_OLD_TONGUE
},
48 { LANG_GNOMISH
, 7340, SKILL_LANG_GNOMISH
},
49 { LANG_TROLL
, 7341, SKILL_LANG_TROLL
},
50 { LANG_GUTTERSPEAK
, 17737, SKILL_LANG_GUTTERSPEAK
}
53 LanguageDesc
const* GetLanguageDescByID(uint32 lang
)
55 for(int i
= 0; i
< LANGUAGES_COUNT
; ++i
)
57 if(uint32(lang_description
[i
].lang_id
) == lang
)
58 return &lang_description
[i
];
64 LanguageDesc
const* GetLanguageDescBySpell(uint32 spell_id
)
66 for(int i
= 0; i
< LANGUAGES_COUNT
; ++i
)
68 if(lang_description
[i
].spell_id
== spell_id
)
69 return &lang_description
[i
];
75 LanguageDesc
const* GetLanguageDescBySkill(uint32 skill_id
)
77 for(int i
= 0; i
< LANGUAGES_COUNT
; ++i
)
79 if(lang_description
[i
].skill_id
== skill_id
)
80 return &lang_description
[i
];
86 INSTANTIATE_SINGLETON_1( ChatHandler
);
88 ChatHandler::ChatHandler()
93 ChatHandler::~ChatHandler()
98 ChatCommand
* ChatHandler::getCommandTable()
101 static bool first_call
= true;
103 static ChatCommand modifyCommandTable
[] =
105 { "hp", 1, &ChatHandler::HandleModifyHPCommand
, "", NULL
},
106 { "mana", 1, &ChatHandler::HandleModifyManaCommand
, "", NULL
},
107 { "rage", 1, &ChatHandler::HandleModifyRageCommand
, "", NULL
},
108 { "energy", 1, &ChatHandler::HandleModifyEnergyCommand
, "", NULL
},
109 { "money", 1, &ChatHandler::HandleModifyMoneyCommand
, "", NULL
},
110 { "speed", 1, &ChatHandler::HandleModifySpeedCommand
, "", NULL
},
111 { "swim", 1, &ChatHandler::HandleModifySwimCommand
, "", NULL
},
112 { "scale", 1, &ChatHandler::HandleModifyScaleCommand
, "", NULL
},
113 { "bit", 1, &ChatHandler::HandleModifyBitCommand
, "", NULL
},
114 { "bwalk", 1, &ChatHandler::HandleModifyBWalkCommand
, "", NULL
},
115 { "aspeed", 1, &ChatHandler::HandleModifyASpeedCommand
, "", NULL
},
116 { "faction", 1, &ChatHandler::HandleModifyFactionCommand
, "", NULL
},
117 { "spell", 1, &ChatHandler::HandleModifySpellCommand
, "", NULL
},
118 { "tp", 1, &ChatHandler::HandleModifyTalentCommand
, "", NULL
},
120 { NULL
, 0, NULL
, "", NULL
}
123 static ChatCommand debugCommandTable
[] =
125 { "inarc", 3, &ChatHandler::HandleDebugInArcCommand
, "", NULL
},
126 { "spellfail", 3, &ChatHandler::HandleDebugSpellFailCommand
, "", NULL
},
127 { "setpoi", 3, &ChatHandler::HandleSetPoiCommand
, "", NULL
},
128 { "qpartymsg", 3, &ChatHandler::HandleSendQuestPartyMsgCommand
, "", NULL
},
129 { "qinvalidmsg", 3, &ChatHandler::HandleSendQuestInvalidMsgCommand
,"", NULL
},
130 { "itemmsg", 3, &ChatHandler::HandleSendItemErrorMsg
, "", NULL
},
131 { NULL
, 0, NULL
, "", NULL
}
134 static ChatCommand commandTable
[] =
136 { "acct", 0, &ChatHandler::HandleAcctCommand
, "", NULL
},
137 { "addmove", 2, &ChatHandler::HandleAddMoveCommand
, "", NULL
},
138 { "addspirit", 3, &ChatHandler::HandleAddSpiritCommand
, "", NULL
},
139 { "anim", 3, &ChatHandler::HandleAnimCommand
, "", NULL
},
140 { "announce", 1, &ChatHandler::HandleAnnounceCommand
, "", NULL
},
141 { "go", 3, &ChatHandler::HandleGoCommand
, "", NULL
},
142 { "goname", 1, &ChatHandler::HandleGonameCommand
, "", NULL
},
143 { "namego", 1, &ChatHandler::HandleNamegoCommand
, "", NULL
},
144 { "aura", 3, &ChatHandler::HandleAuraCommand
, "", NULL
},
145 { "unaura", 3, &ChatHandler::HandleUnAuraCommand
, "", NULL
},
146 { "changelevel", 2, &ChatHandler::HandleChangeLevelCommand
, "", NULL
},
147 { "commands", 0, &ChatHandler::HandleCommandsCommand
, "", NULL
},
148 { "delete", 2, &ChatHandler::HandleDeleteCommand
, "", NULL
},
149 { "demorph", 2, &ChatHandler::HandleDeMorphCommand
, "", NULL
},
150 { "die", 3, &ChatHandler::HandleDieCommand
, "", NULL
},
151 { "revive", 3, &ChatHandler::HandleReviveCommand
, "", NULL
},
152 { "dismount", 0, &ChatHandler::HandleDismountCommand
, "", NULL
},
153 { "displayid", 2, &ChatHandler::HandleDisplayIdCommand
, "", NULL
},
154 { "factionid", 2, &ChatHandler::HandleFactionIdCommand
, "", NULL
},
155 { "gmlist", 0, &ChatHandler::HandleGMListCommand
, "", NULL
},
156 { "gmoff", 1, &ChatHandler::HandleGMOffCommand
, "", NULL
},
157 { "gmon", 1, &ChatHandler::HandleGMOnCommand
, "", NULL
},
158 { "gps", 1, &ChatHandler::HandleGPSCommand
, "", NULL
},
159 { "guid", 2, &ChatHandler::HandleGUIDCommand
, "", NULL
},
160 { "help", 0, &ChatHandler::HandleHelpCommand
, "", NULL
},
161 { "info", 0, &ChatHandler::HandleInfoCommand
, "", NULL
},
162 { "npcinfo", 3, &ChatHandler::HandleNpcInfoCommand
, "", NULL
},
163 { "npcinfoset", 3, &ChatHandler::HandleNpcInfoSetCommand
, "", NULL
},
164 { "item", 2, &ChatHandler::HandleItemCommand
, "", NULL
},
165 { "itemrmv", 2, &ChatHandler::HandleItemRemoveCommand
, "", NULL
},
166 { "itemmove", 2, &ChatHandler::HandleItemMoveCommand
, "", NULL
},
167 { "kick", 2, &ChatHandler::HandleKickPlayerCommand
, "", NULL
},
168 { "learn", 3, &ChatHandler::HandleLearnCommand
, "", NULL
},
169 { "unlearn", 3, &ChatHandler::HandleUnLearnCommand
, "", NULL
},
170 { "learnsk", 3, &ChatHandler::HandleLearnSkillCommand
, "", NULL
},
171 { "unlearnsk", 3, &ChatHandler::HandleUnLearnSkillCommand
, "", NULL
},
172 { "modify", 1, NULL
, "", modifyCommandTable
},
173 { "debug", 1, NULL
, "", debugCommandTable
},
174 { "morph", 3, &ChatHandler::HandleMorphCommand
, "", NULL
},
175 { "name", 2, &ChatHandler::HandleNameCommand
, "", NULL
},
176 { "subname", 2, &ChatHandler::HandleSubNameCommand
, "", NULL
},
177 { "npcflag", 2, &ChatHandler::HandleNPCFlagCommand
, "", NULL
},
178 { "distance", 3, &ChatHandler::HandleGetDistanceCommand
, "", NULL
},
179 { "object", 3, &ChatHandler::HandleObjectCommand
, "", NULL
},
180 { "gameobject", 3, &ChatHandler::HandleGameObjectCommand
, "", NULL
},
181 { "addgo", 3, &ChatHandler::HandleGameObjectCommand
, "", NULL
},
182 { "prog", 2, &ChatHandler::HandleProgCommand
, "", NULL
},
183 { "random", 2, &ChatHandler::HandleRandomCommand
, "", NULL
},
184 { "recall", 1, &ChatHandler::HandleRecallCommand
, "", NULL
},
185 { "run", 2, &ChatHandler::HandleRunCommand
, "", NULL
},
186 { "save", 0, &ChatHandler::HandleSaveCommand
, "", NULL
},
187 { "saveall", 1, &ChatHandler::HandleSaveAllCommand
, "", NULL
},
188 { "security", 3, &ChatHandler::HandleSecurityCommand
, "", NULL
},
189 { "AddSpawn", 2, &ChatHandler::HandleSpawnCommand
, "", NULL
},
190 { "standstate", 3, &ChatHandler::HandleStandStateCommand
, "", NULL
},
191 { "start", 0, &ChatHandler::HandleStartCommand
, "", NULL
},
192 { "taxicheat", 1, &ChatHandler::HandleTaxiCheatCommand
, "", NULL
},
193 { "goxy", 3, &ChatHandler::HandleGoXYCommand
, "", NULL
},
194 { "worldport", 3, &ChatHandler::HandleWorldPortCommand
, "", NULL
},
195 { "addweapon", 3, &ChatHandler::HandleAddWeaponCommand
, "", NULL
},
196 { "allowmove", 3, &ChatHandler::HandleAllowMovementCommand
, "", NULL
},
197 { "linkgrave", 3, &ChatHandler::HandleLinkGraveCommand
, "", NULL
},
198 { "neargrave", 3, &ChatHandler::HandleNearGraveCommand
, "", NULL
},
199 { "addsh", 3, &ChatHandler::HandleAddSHCommand
, "", NULL
},
200 { "transport", 3, &ChatHandler::HandleSpawnTransportCommand
, "", NULL
},
201 { "explorecheat",3, &ChatHandler::HandleExploreCheatCommand
, "", NULL
},
202 { "hover", 3, &ChatHandler::HandleHoverCommand
, "", NULL
},
203 { "levelup", 3, &ChatHandler::HandleLevelUpCommand
, "", NULL
},
204 { "emote", 3, &ChatHandler::HandleEmoteCommand
, "", NULL
},
205 { "showarea", 3, &ChatHandler::HandleShowAreaCommand
, "", NULL
},
206 { "hidearea", 3, &ChatHandler::HandleHideAreaCommand
, "", NULL
},
207 { "addspw", 2, &ChatHandler::HandleAddSpwCommand
, "", NULL
},
208 { "additem", 3, &ChatHandler::HandleAddItemCommand
, "", NULL
},
209 { "additemset", 3, &ChatHandler::HandleAddItemSetCommand
, "", NULL
},
210 { "createguild", 3, &ChatHandler::HandleCreateGuildCommand
, "", NULL
},
211 { "showhonor", 0, &ChatHandler::HandleShowHonor
, "", NULL
},
212 { "update", 3, &ChatHandler::HandleUpdate
, "", NULL
},
213 { "bank", 3, &ChatHandler::HandleBankCommand
, "", NULL
},
214 { "wchange", 3, &ChatHandler::HandleChangeWeather
, "", NULL
},
215 { "reload", 3, &ChatHandler::HandleReloadCommand
, "", NULL
},
216 { "loadscripts", 3, &ChatHandler::HandleLoadScriptsCommand
, "", NULL
},
217 { "tele", 1, &ChatHandler::HandleTeleCommand
, "", NULL
},
218 { "searchtele", 1, &ChatHandler::HandleSearchTeleCommand
, "", NULL
},
219 { "addtele", 3, &ChatHandler::HandleAddTeleCommand
, "", NULL
},
220 { "deltele", 3, &ChatHandler::HandleDelTeleCommand
, "", NULL
},
221 { "listauras", 3, &ChatHandler::HandleListAurasCommand
, "", NULL
},
222 { "reset", 3, &ChatHandler::HandleResetCommand
, "", NULL
},
223 { "fixunlearn", 3, &ChatHandler::HandleFixUnlearnCommand
, "", NULL
},
224 { "ticket", 2, &ChatHandler::HandleTicketCommand
, "", NULL
},
225 { "delticket", 2, &ChatHandler::HandleDelTicketCommand
, "", NULL
},
226 { "maxskill", 3, &ChatHandler::HandleMaxSkillCommand
, "", NULL
},
227 { "whispers", 1, &ChatHandler::HandleWhispersCommand
, "", NULL
},
228 { "gocreature", 2, &ChatHandler::HandleGoCreatureCommand
, "", NULL
},
229 { "goobject", 2, &ChatHandler::HandleGoObjectCommand
, "", NULL
},
230 { "targetobject",2, &ChatHandler::HandleTargetObjectCommand
, "", NULL
},
231 { "delobject", 2, &ChatHandler::HandleDelObjectCommand
, "", NULL
},
232 { "turnobject", 2, &ChatHandler::HandleTurnObjectCommand
, "", NULL
},
233 { "moveobject", 2, &ChatHandler::HandleMoveObjectCommand
, "", NULL
},
234 { "shutdown", 3, &ChatHandler::HandleShutDownCommand
, "", NULL
},
235 { "pinfo", 2, &ChatHandler::HandlePInfoCommand
, "", NULL
},
236 { "visible", 1, &ChatHandler::HandleVisibleCommand
, "", NULL
},
237 { "playsound", 1, &ChatHandler::HandlePlaySoundCommand
, "", NULL
},
238 { "lookupitem", 3, &ChatHandler::HandleLookupItemCommand
, "", NULL
},
239 { "lookupskill", 3, &ChatHandler::HandleLookupSkillCommand
, "", NULL
},
240 { "lookupcreature",3, &ChatHandler::HandleLookupCreatureCommand
, "", NULL
},
241 { "money", 1, &ChatHandler::HandleModifyMoneyCommand
, "", NULL
},
242 { "speed", 1, &ChatHandler::HandleModifySpeedCommand
, "", NULL
},
244 //! Development Commands
245 { "setvalue", 3, &ChatHandler::HandleSetValue
, "", NULL
},
246 { "getvalue", 3, &ChatHandler::HandleGetValue
, "", NULL
},
247 { "Mod32Value", 3, &ChatHandler::HandleMod32Value
, "", NULL
},
248 { "NewMail", 3, &ChatHandler::HandleSendMailNotice
, "", NULL
},
249 { "QNM", 3, &ChatHandler::HandleQueryNextMailTime
, "", NULL
},
250 { "oor", 3, &ChatHandler::HandleOutOfRange
, "", NULL
},
251 { NULL
, 0, NULL
, "", NULL
}
256 QueryResult
*result
= sDatabase
.Query("SELECT `name`,`security`,`help` FROM `command`");
261 Field
*fields
= result
->Fetch();
262 std::string name
= fields
[0].GetCppString();
263 for(uint32 i
= 0; commandTable
[i
].Name
!= NULL
; i
++)
265 if (name
== commandTable
[i
].Name
)
267 commandTable
[i
].SecurityLevel
= (uint16
)fields
[1].GetUInt16();
268 commandTable
[i
].Help
= fields
[2].GetCppString();
270 if(commandTable
[i
].ChildCommands
!= NULL
)
272 ChatCommand
*ptable
= commandTable
[i
].ChildCommands
;
273 for(uint32 j
= 0; ptable
[j
].Name
!= NULL
; j
++)
275 if (name
== fmtstring("%s %s", commandTable
[i
].Name
, ptable
[j
].Name
))
277 ptable
[j
].SecurityLevel
= (uint16
)fields
[1].GetUInt16();
278 ptable
[j
].Help
= fields
[2].GetCppString();
283 } while(result
->NextRow());
292 bool ChatHandler::hasStringAbbr(const char* s1
, const char* s2
)
300 else if( tolower( *s1
) != tolower( *s2
) )
306 void ChatHandler::SendSysMultilineMessage(WorldSession
* session
, const char *str
)
311 const char* line
= str
;
312 const char* pos
= line
;
313 while((pos
= strchr(line
, '\n')) != NULL
)
315 strncpy(buf
, line
, pos
-line
);
318 FillSystemMessageData(&data
, session
, buf
);
319 session
->SendPacket(&data
);
324 FillSystemMessageData(&data
, session
, line
);
325 session
->SendPacket(&data
);
328 void ChatHandler::SendSysMessage(WorldSession
* session
, const char *str
)
331 FillSystemMessageData(&data
, session
, str
);
332 session
->SendPacket(&data
);
335 void ChatHandler::PSendSysMultilineMessage(WorldSession
* session
, const char *format
, ...)
339 va_start(ap
, format
);
340 vsnprintf(str
,1024,format
, ap
);
342 SendSysMultilineMessage(session
,str
);
345 void ChatHandler::PSendSysMessage(WorldSession
* session
, const char *format
, ...)
349 va_start(ap
, format
);
350 vsnprintf(str
,1024,format
, ap
);
352 SendSysMessage(session
,str
);
355 void ChatHandler::PSendSysMultilineMessage(const char *format
, ...)
359 va_start(ap
, format
);
360 vsnprintf(str
,1024,format
, ap
);
362 SendSysMultilineMessage(m_session
,str
);
365 void ChatHandler::PSendSysMessage(const char *format
, ...)
369 va_start(ap
, format
);
370 vsnprintf(str
,1024,format
, ap
);
372 SendSysMessage(m_session
,str
);
375 bool ChatHandler::ExecuteCommandInTable(ChatCommand
*table
, const char* text
)
377 std::string fullcmd
= text
; // original `text` can't be used. It content destroyed in command code processing.
378 std::string cmd
= "";
380 while (*text
!= ' ' && *text
!= '\0')
386 while (*text
== ' ') text
++;
391 for(uint32 i
= 0; table
[i
].Name
!= NULL
; i
++)
393 if(!hasStringAbbr(table
[i
].Name
, cmd
.c_str()))
396 if(m_session
->GetSecurity() < table
[i
].SecurityLevel
)
399 if(table
[i
].ChildCommands
!= NULL
)
401 if(!ExecuteCommandInTable(table
[i
].ChildCommands
, text
))
403 if(table
[i
].Help
!= "")
404 SendSysMultilineMessage(table
[i
].Help
.c_str());
406 SendSysMessage("There is no such subcommand.");
412 if((this->*(table
[i
].Handler
))(text
))
414 if(table
[i
].SecurityLevel
> 0)
416 Player
* p
= m_session
->GetPlayer();
417 sLog
.outCommand("Command: %s [Player: %s X: %f Y: %f Z: %f Map: %u Selected: %s %u]",
418 fullcmd
.c_str(),p
->GetName(),p
->GetPositionX(),p
->GetPositionY(),p
->GetPositionZ(),p
->GetMapId(),
419 (GUID_HIPART(p
->GetSelection())==HIGHGUID_UNIT
? "creature" : (GUID_HIPART(p
->GetSelection())==HIGHGUID_PLAYER
? "player" : "none")),GUID_LOPART(p
->GetSelection()));
424 if(table
[i
].Help
!= "")
425 SendSysMultilineMessage(table
[i
].Help
.c_str());
427 SendSysMessage("Incorrect syntax.");
436 int ChatHandler::ParseCommands(const char* text
, WorldSession
*session
)
443 //if(m_session->GetSecurity() == 0)
446 if(text
[0] != '!' && text
[0] != '.')
449 // ignore single . and ! in line
453 // ignore messages staring from many dots.
454 if(text
[0] == '.' && text
[1] == '.' || text
[0] == '!' && text
[1] == '!')
459 if(!ExecuteCommandInTable(getCommandTable(), text
))
462 FillSystemMessageData(&data
, m_session
, "There is no such command.");
463 m_session
->SendPacket(&data
);
468 //Note: target_guid used only in CHAT_MSG_WHISPER_INFORM mode (in this case channelName ignored)
469 void ChatHandler::FillMessageData( WorldPacket
*data
, WorldSession
* session
, uint8 type
, uint32 language
, const char *channelName
, uint64 target_guid
, const char *message
, Unit
*speaker
)
471 uint32 messageLength
= (message
? strlen(message
) : 0) + 1;
473 data
->Initialize(SMSG_MESSAGECHAT
);
474 *data
<< (uint8
)type
;
477 if (type
== CHAT_MSG_CHANNEL
)
480 *data
<< channelName
;
483 // in CHAT_MSG_WHISPER_INFORM mode used original target_guid
484 if (type
== CHAT_MSG_SAY
|| type
== CHAT_MSG_CHANNEL
|| type
== CHAT_MSG_WHISPER
||
485 type
== CHAT_MSG_YELL
|| type
== CHAT_MSG_PARTY
|| type
== CHAT_MSG_GUILD
||
486 type
== CHAT_MSG_OFFICER
)
488 target_guid
= session
? session
->GetPlayer()->GetGUID() : 0;
490 else if (type
== CHAT_MSG_MONSTER_SAY
)
492 *data
<< (uint64
)(((Creature
*)speaker
)->GetGUID());
493 *data
<< (uint32
)(strlen(((Creature
*)speaker
)->GetCreatureInfo()->Name
) + 1);
494 *data
<< ((Creature
*)speaker
)->GetCreatureInfo()->Name
;
496 else if (type
!= CHAT_MSG_WHISPER_INFORM
&& type
!= CHAT_MSG_DND
&& type
!= CHAT_MSG_AFK
)
498 target_guid
= 0; // only for CHAT_MSG_WHISPER_INFORM used original value target_guid
501 *data
<< target_guid
;
503 if (type
== CHAT_MSG_SAY
|| type
== CHAT_MSG_YELL
|| type
== CHAT_MSG_PARTY
)
504 *data
<< target_guid
;
506 *data
<< messageLength
;
508 if(session
!= 0 && type
!= CHAT_MSG_WHISPER_INFORM
&& type
!= CHAT_MSG_DND
&& type
!= CHAT_MSG_AFK
)
509 *data
<< session
->GetPlayer()->chatTag();
514 void ChatHandler::SpawnCreature(WorldSession
*session
, const char* name
, uint32 displayId
, uint32 npcFlags
, uint32 factionId
, uint32 level
)
517 //SpawnCreature is invallid, remains for educatial reasons
518 Temp. disabled (c) Phantomas
521 Player *chr = session->GetPlayer();
522 float x = chr->GetPositionX();
523 float y = chr->GetPositionY();
524 float z = chr->GetPositionZ();
525 float o = chr->GetOrientation();
527 Creature* pCreature = new Creature();
529 if(!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), name, chr->GetMapId(), x, y, z, o, objmgr.AddCreatureTemplate(pCreature->GetName(), displayId)))
534 pCreature->SetZoneId(chr->GetZoneId());
535 pCreature->SetUInt32Value(OBJECT_FIELD_ENTRY, objmgr.AddCreatureTemplate(pCreature->GetName(), displayId));
536 pCreature->SetFloatValue(OBJECT_FIELD_SCALE_X, 1.0f);
537 pCreature->SetUInt32Value(UNIT_FIELD_DISPLAYID, displayId);
538 pCreature->SetUInt32Value(UNIT_NPC_FLAGS , npcFlags);
539 pCreature->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE , factionId);
540 pCreature->SetHealth(28 + 30*level);
541 pCreature->SetMaxHealth(28 + 30*level);
542 pCreature->SetLevel(level);
544 pCreature->SetFloatValue(UNIT_FIELD_COMBATREACH , 1.5f);
545 pCreature->SetFloatValue(UNIT_FIELD_MAXDAMAGE , 5.0f);
546 pCreature->SetFloatValue(UNIT_FIELD_MINDAMAGE , 8.0f);
547 pCreature->SetUInt32Value(UNIT_FIELD_BASEATTACKTIME, 1900);
548 pCreature->SetUInt32Value(UNIT_FIELD_RANGEDATTACKTIME, 2000);
549 pCreature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 2.0f);
550 pCreature->AIM_Initialize();
551 sLog.outError("AddObject at Chat.cpp");
553 MapManager::Instance().GetMap(pCreature->GetMapId())->Add(pCreature);
554 pCreature->SaveToDB();
558 Player
* ChatHandler::getSelectedPlayer()
560 uint64 guid
= m_session
->GetPlayer()->GetSelection();
563 return m_session
->GetPlayer();
565 return objmgr
.GetPlayer(guid
);
568 Unit
* ChatHandler::getSelectedUnit()
570 uint64 guid
= m_session
->GetPlayer()->GetSelection();
573 return m_session
->GetPlayer();
575 return ObjectAccessor::Instance().GetUnit(*m_session
->GetPlayer(),guid
);
578 Creature
* ChatHandler::getSelectedCreature()
580 return ObjectAccessor::Instance().GetCreature(*m_session
->GetPlayer(),m_session
->GetPlayer()->GetSelection());
583 char const *fmtstring( char const *format
, ... )
586 #define MAX_FMT_STRING 32000
587 static char temp_buffer
[MAX_FMT_STRING
];
588 static char string
[MAX_FMT_STRING
];
589 static int index
= 0;
593 va_start(argptr
, format
);
594 vsnprintf(temp_buffer
,MAX_FMT_STRING
, format
, argptr
);
597 len
= strlen(temp_buffer
);
599 if( len
>= MAX_FMT_STRING
)
602 if (len
+ index
>= MAX_FMT_STRING
-1)
607 buf
= &string
[index
];
608 memcpy( buf
, temp_buffer
, len
+1 );