[2685] Applied MaNGOS coding style (see trunk/bcpp.cfg).
[mangos-git.git] / src / game / Chat.cpp
blob70a2db820d0ca3f120d0fedf286dfbd72ba466c8
1 /*
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
19 #include "Common.h"
20 #include "Database/DatabaseEnv.h"
21 #include "WorldPacket.h"
22 #include "WorldSession.h"
23 #include "Opcodes.h"
24 #include "Log.h"
25 #include "World.h"
26 #include "ObjectMgr.h"
27 #include "Player.h"
28 #include "UpdateMask.h"
29 #include "Chat.h"
30 #include "MapManager.h"
31 #include "Policies/SingletonImp.h"
33 LanguageDesc lang_description[LANGUAGES_COUNT] =
35 { // LANG_GLOBAL/LANG_UNIVERSAL = 0
36 LANG_UNIVERSAL, 0, 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];
61 return NULL;
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];
72 return NULL;
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];
83 return NULL;
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 }
254 if(first_call)
256 QueryResult *result = sDatabase.Query("SELECT `name`,`security`,`help` FROM `command`");
257 if (result)
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());
284 delete result;
286 first_call = false;
289 return commandTable;
292 bool ChatHandler::hasStringAbbr(const char* s1, const char* s2)
294 for(;;)
296 if( !*s2 )
297 return true;
298 else if( !*s1 )
299 return false;
300 else if( tolower( *s1 ) != tolower( *s2 ) )
301 return false;
302 s1++; s2++;
306 void ChatHandler::SendSysMultilineMessage(WorldSession* session, const char *str)
308 char buf[256];
309 WorldPacket data;
311 const char* line = str;
312 const char* pos = line;
313 while((pos = strchr(line, '\n')) != NULL)
315 strncpy(buf, line, pos-line);
316 buf[pos-line]=0;
318 FillSystemMessageData(&data, session, buf);
319 session->SendPacket(&data);
321 line = pos+1;
324 FillSystemMessageData(&data, session, line);
325 session->SendPacket(&data);
328 void ChatHandler::SendSysMessage(WorldSession* session, const char *str)
330 WorldPacket data;
331 FillSystemMessageData(&data, session, str);
332 session->SendPacket(&data);
335 void ChatHandler::PSendSysMultilineMessage(WorldSession* session, const char *format, ...)
337 va_list ap;
338 char str [1024];
339 va_start(ap, format);
340 vsnprintf(str,1024,format, ap );
341 va_end(ap);
342 SendSysMultilineMessage(session,str);
345 void ChatHandler::PSendSysMessage(WorldSession* session, const char *format, ...)
347 va_list ap;
348 char str [1024];
349 va_start(ap, format);
350 vsnprintf(str,1024,format, ap );
351 va_end(ap);
352 SendSysMessage(session,str);
355 void ChatHandler::PSendSysMultilineMessage(const char *format, ...)
357 va_list ap;
358 char str [1024];
359 va_start(ap, format);
360 vsnprintf(str,1024,format, ap );
361 va_end(ap);
362 SendSysMultilineMessage(m_session,str);
365 void ChatHandler::PSendSysMessage(const char *format, ...)
367 va_list ap;
368 char str [1024];
369 va_start(ap, format);
370 vsnprintf(str,1024,format, ap );
371 va_end(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')
382 cmd += *text;
383 text++;
386 while (*text == ' ') text++;
388 if(!cmd.length())
389 return false;
391 for(uint32 i = 0; table[i].Name != NULL; i++)
393 if(!hasStringAbbr(table[i].Name, cmd.c_str()))
394 continue;
396 if(m_session->GetSecurity() < table[i].SecurityLevel)
397 continue;
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());
405 else
406 SendSysMessage("There is no such subcommand.");
409 return true;
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()));
422 else
424 if(table[i].Help != "")
425 SendSysMultilineMessage(table[i].Help.c_str());
426 else
427 SendSysMessage("Incorrect syntax.");
430 return true;
433 return false;
436 int ChatHandler::ParseCommands(const char* text, WorldSession *session)
438 m_session = session;
440 ASSERT(text);
441 ASSERT(*text);
443 //if(m_session->GetSecurity() == 0)
444 // return 0;
446 if(text[0] != '!' && text[0] != '.')
447 return 0;
449 // ignore single . and ! in line
450 if(strlen(text) < 2)
451 return 0;
453 // ignore messages staring from many dots.
454 if(text[0] == '.' && text[1] == '.' || text[0] == '!' && text[1] == '!')
455 return 0;
457 text++;
459 if(!ExecuteCommandInTable(getCommandTable(), text))
461 WorldPacket data;
462 FillSystemMessageData(&data, m_session, "There is no such command.");
463 m_session->SendPacket(&data);
465 return 1;
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;
475 *data << language;
477 if (type == CHAT_MSG_CHANNEL)
479 ASSERT(channelName);
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;
507 *data << message;
508 if(session != 0 && type != CHAT_MSG_WHISPER_INFORM && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
509 *data << session->GetPlayer()->chatTag();
510 else
511 *data << uint8(0);
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
519 WorldPacket data;
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)))
531 delete pCreature;
532 return false;
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();
562 if (guid == 0)
563 return m_session->GetPlayer();
565 return objmgr.GetPlayer(guid);
568 Unit* ChatHandler::getSelectedUnit()
570 uint64 guid = m_session->GetPlayer()->GetSelection();
572 if (guid == 0)
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, ... )
585 va_list argptr;
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;
590 char *buf;
591 int len;
593 va_start(argptr, format);
594 vsnprintf(temp_buffer,MAX_FMT_STRING, format, argptr);
595 va_end(argptr);
597 len = strlen(temp_buffer);
599 if( len >= MAX_FMT_STRING )
600 return "ERROR";
602 if (len + index >= MAX_FMT_STRING-1)
604 index = 0;
607 buf = &string[index];
608 memcpy( buf, temp_buffer, len+1 );
610 index += len + 1;
612 return buf;