diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index a0d56c186..e4c34bc09 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -56,7 +56,7 @@ // |color|Hquest:quest_id:quest_level|h[name]|h|r - client, quest list name shift-click // |color|Hskill:skill_id|h[name]|h|r // |color|Hspell:spell_id|h[name]|h|r - client, spellbook spell icon shift-click -// |color|Htalent:talent_id,rank|h[name]|h|r - client, talent icon shift-click +// |color|Htalent:talent_id,rank|h[name]|h|r - client, talent icon shift-click rank==-1 if shift-copy unlearned talent // |color|Htaxinode:id|h[name]|h|r // |color|Htele:id|h[name]|h|r // |color|Htitle:id|h[name]|h|r @@ -2096,6 +2096,8 @@ bool ChatHandler::ExtractUInt32Base(char** args, uint32& val, uint32 base) // value successfully extracted val = uint32(valRaw); *args = tail; + + SkipWhiteSpaces(args); return true; } @@ -2142,6 +2144,8 @@ bool ChatHandler::ExtractFloat(char** args, float& val) // value successfully extracted val = float(valRaw); *args = tail; + + SkipWhiteSpaces(args); return true; } @@ -2218,6 +2222,7 @@ char* ChatHandler::ExtractLiteralArg(char** args, char const* lit /*= NULL*/) else *args = NULL; + SkipWhiteSpaces(args); return arg; } @@ -2297,41 +2302,142 @@ bool ChatHandler::ExtractOnOff(char** args, bool& value) * Function extract shift-link-like string (any characters guarded by | and |h|r with some additional internal structure check) * * @param args variable pointer to non parsed args string, updated at function call to new position (with skipped white spaces) + * + * @param linkTypes optional NULL-terminated array of link types, shift-link must fit one from link type from array if provided or extraction fail + * + * @param found_idx if not NULL then at return index in linkTypes that fit shift-link type, if extraction fail then non modified + * + * @param keyPair if not NULL then pointer to 2-elements array for return start and end pointer for found key + * if extraction fail then non modified + * + * @param somethingPair then pointer to 2-elements array for return start and end pointer if found. + * if not NULL then shift-link must have data field, if extraction fail then non modified + * * @return shift-link-like string, or NULL if args empty or not appropriate content. */ -char* ChatHandler::ExtractLinkArg( char** args ) +char* ChatHandler::ExtractLinkArg(char** args, char const* const* linkTypes /*= NULL*/, int* foundIdx /*= NULL*/, char** keyPair /*= NULL*/, char** somethingPair /*= NULL*/) { if (!*args || !**args) return NULL; - if (**args != '|') + // skip if not linked started or encoded single | (doubled by client) + if ((*args)[0] != '|' || (*args)[1] == '|') return NULL; - // |color|Hkey:data|h[name]|h|r + // |color|Hlinktype:key:data...|h[name]|h|r char* head = *args; + + // [name] Shift-click form |color|linkType:key|h[name]|h|r + // or + // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r + // or + // [name] Shift-click form |linkType:key|h[name]|h|r + + // |color|Hlinktype:key:data...|h[name]|h|r + char* tail = (*args)+1; // skip | - while (*tail && *tail != '|') // skip color part - ++tail; + if (*tail != 'H') // skip color part, some links can not have color part + { + while (*tail && *tail != '|') + ++tail; - if (!*tail) - return NULL; + if (!*tail) + return NULL; - // |Hkey:data|h[name]|h|r + // |Hlinktype:key:data...|h[name]|h|r - ++tail; // skip | + ++tail; // skip | + } + + // Hlinktype:key:data...|h[name]|h|r if (*tail != 'H') return NULL; - while (*tail && (*tail != '|' || *(tail+1) != 'h')) // skip key/data part + int linktype_idx = 0; + + if (linkTypes) // check link type if provided + { + // check linktypes (its include H in name) + for (; linkTypes[linktype_idx]; ++linktype_idx) + { + // exactly string with follow : or | + int l = strlen(linkTypes[linktype_idx]); + if (strncmp(tail, linkTypes[linktype_idx], l) == 0 && + (tail[l] == ':' || tail[l] == '|')) + break; + } + + // is search fail? + if (!linkTypes[linktype_idx]) // NULL terminator in last element + return NULL; + + tail += strlen(linkTypes[linktype_idx]); // skip linktype string + + // :key:data...|h[name]|h|r + + if (*tail != ':') + return NULL; + } + else + { + while (*tail && *tail != ':') // skip linktype string + ++tail; + + if (!*tail) + return NULL; + } + + ++tail; + + // key:data...|h[name]|h|r + char* keyStart = tail; // remember key start for return + char* keyEnd = tail; // key end for truncate, will updated + + while (*tail && *tail != '|' && *tail != ':') ++tail; if (!*tail) return NULL; - tail += 2; + keyEnd = tail; // remember key end for truncate + + // |h[name]|h|r or :something...|h[name]|h|r + + char* somethingStart = tail+1; + char* somethingEnd = tail+1; // will updated later if need + + if (*tail == ':' && somethingPair) // optional data extraction + { + // :something...|h[name]|h|r + + if (*tail == ':') + ++tail; + + // something|h[name]|h|r or something:something2...|h[name]|h|r + + while (*tail && *tail != '|' && *tail != ':') + ++tail; + + if (!*tail) + return NULL; + + somethingEnd = tail; // remember data end for truncate + } + + // |h[name]|h|r or :something2...|h[name]|h|r + + while (*tail && (*tail != '|' || *(tail+1) != 'h')) // skip ... part if exist + ++tail; + + if (!*tail) + return NULL; + + // |h[name]|h|r + + tail += 2; // skip |h // [name]|h|r if (!*tail || *tail != '[') @@ -2340,26 +2446,41 @@ char* ChatHandler::ExtractLinkArg( char** args ) while (*tail && (*tail != ']' || *(tail+1) != '|')) // skip name part ++tail; - tail += 2; + tail += 2; // skip ]| // h|r if (!*tail || *tail != 'h' || *(tail+1) != '|') return NULL; - tail += 2; + tail += 2; // skip h| // r if (!*tail || *tail != 'r' || *(tail+1) && !isWhiteSpace(*(tail+1))) return NULL; - ++tail; + ++tail; // skip r - if (*tail) - { + // success + + if (*tail) // truncate all link string *(tail++) = '\0'; + + if (foundIdx) + *foundIdx = linktype_idx; + + if (keyPair) + { + keyPair[0] = keyStart; + keyPair[1] = keyEnd; } - *args = tail; + if (somethingPair) + { + somethingPair[0] = somethingStart; + somethingPair[1] = somethingEnd; + } + + *args = tail; SkipWhiteSpaces(args); @@ -2377,21 +2498,11 @@ char* ChatHandler::ExtractArg( char** args ) if (!*args || !**args) return NULL; - switch (**args) - { - case '|' : - return ExtractLinkArg(args); - case '\'' : case '"' : case '[' : - return ExtractQuotedArg(args); - default: - { - char* name = strtok(*args, " "); + char* arg = ExtractQuotedOrLiteralArg(args); + if (!arg) + arg = ExtractLinkArg(args); - *args = strtok(NULL, ""); - - return name; - } - } + return arg; } /** @@ -2415,116 +2526,102 @@ char* ChatHandler::ExtractOptNotLastArg(char** args) return NULL; } -char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** something1) +/** + * Function extract data from shift-link "|color|LINKTYPE:RETURN:SOMETHING1|h[name]|h|r if linkType == LINKTYPE + * It also extract literal/quote if not shift-link in args + * + * @param args variable pointer to non parsed args string, updated at function call to new position (with skipped white spaces) + * if args have sift link with linkType != LINKTYPE then args still pointing to this arg (unmodified pointer) + * + * @param linkType shift-link must fit by link type to this arg value or extraction fail + * + * @param something1 if not NULL then shift-link must have data field and it returned into this arg + * if extraction fail then non modified + * + * @return extracted key, or NULL if args empty or not appropriate content or not fit to linkType. + */ +char* ChatHandler::ExtractKeyFromLink(char** text, char const* linkType, char** something1 /*= NULL*/) { - // skip empty - if(!text) - return NULL; + char const* linkTypes[2]; + linkTypes[0] = linkType; + linkTypes[1] = NULL; - // skip speces - while(*text==' '||*text=='\t'||*text=='\b') - ++text; + int foundIdx; - if(!*text) - return NULL; - - // return non link case - if(text[0]!='|') - return strtok(text, " "); - - // [name] Shift-click form |color|linkType:key|h[name]|h|r - // or - // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r - - char* check = strtok(text, "|"); // skip color - if(!check) - return NULL; // end of data - - char* cLinkType = strtok(NULL, ":"); // linktype - if(!cLinkType) - return NULL; // end of data - - if(strcmp(cLinkType,linkType) != 0) - { - strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after retturn from function - SendSysMessage(LANG_WRONG_LINK_TYPE); - return NULL; - } - - char* cKeys = strtok(NULL, "|"); // extract keys and values - char* cKeysTail = strtok(NULL, ""); - - char* cKey = strtok(cKeys, ":|"); // extract key - if(something1) - *something1 = strtok(NULL, ":|"); // extract something - - strtok(cKeysTail, "]"); // restart scan tail and skip name with possible spaces - strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function - return cKey; + return ExtractKeyFromLink(text, linkTypes, &foundIdx, something1); } -char* ChatHandler::extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1) +/** + * Function extract data from shift-link "|color|LINKTYPE:RETURN:SOMETHING1|h[name]|h|r if LINKTYPE in linkTypes array + * It also extract literal/quote if not shift-link in args + * + * @param args variable pointer to non parsed args string, updated at function call to new position (with skipped white spaces) + * if args have sift link with linkType != LINKTYPE then args still pointing to this arg (unmodified pointer) + * + * @param linkTypes NULL-terminated array of link types, shift-link must fit one from link type from array or extraction fail + * + * @param found_idx if not NULL then at return index in linkTypes that fit shift-link type, for non-link case return -1 + * if extraction fail then non modified + * + * @param something1 if not NULL then shift-link must have data field and it returned into this arg + * if extraction fail then non modified + * + * @return extracted key, or NULL if args empty or not appropriate content or not fit to linkType. + */ +char* ChatHandler::ExtractKeyFromLink(char** text, char const* const* linkTypes, int* found_idx, char** something1 /*= NULL*/) { // skip empty - if(!text) - return NULL; - - // skip speces - while(*text==' '||*text=='\t'||*text=='\b') - ++text; - - if(!*text) + if (!*text || !**text) return NULL; // return non link case - if(text[0]!='|') - return strtok(text, " "); - - // [name] Shift-click form |color|linkType:key|h[name]|h|r - // or - // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r - // or - // [name] Shift-click form |linkType:key|h[name]|h|r - - char* tail; - - if(text[1]=='c') + char* arg = ExtractQuotedOrLiteralArg(text); + if (arg) { - char* check = strtok(text, "|"); // skip color - if(!check) - return NULL; // end of data + if (found_idx) + *found_idx = -1; // special index case - tail = strtok(NULL, ""); // tail - } - else - tail = text+1; // skip first | - - char* cLinkType = strtok(tail, ":"); // linktype - if(!cLinkType) - return NULL; // end of data - - for(int i = 0; linkTypes[i]; ++i) - { - if(strcmp(cLinkType,linkTypes[i]) == 0) - { - char* cKeys = strtok(NULL, "|"); // extract keys and values - char* cKeysTail = strtok(NULL, ""); - - char* cKey = strtok(cKeys, ":|"); // extract key - if(something1) - *something1 = strtok(NULL, ":|"); // extract something - - strtok(cKeysTail, "]"); // restart scan tail and skip name with possible spaces - strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function - if(found_idx) - *found_idx = i; - return cKey; - } + return arg; } - strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function - SendSysMessage(LANG_WRONG_LINK_TYPE); - return NULL; + char* keyPair[2]; + char* somethingPair[2]; + + arg = ExtractLinkArg(text, linkTypes, found_idx, keyPair, something1 ? somethingPair : NULL); + if (!arg) + return NULL; + + *keyPair[1] = '\0'; // truncate key string + + if (something1) + { + *somethingPair[1] = '\0'; // truncate data string + *something1 = somethingPair[0]; + } + + return keyPair[0]; +} + +/** + * Function extract uint32 key from shift-link "|color|LINKTYPE:RETURN|h[name]|h|r if linkType == LINKTYPE + * It also extract direct number if not shift-link in args + * + * @param args variable pointer to non parsed args string, updated at function call to new position (with skipped white spaces) + * if args have sift link with linkType != LINKTYPE then args still pointing to this arg (unmodified pointer) + * + * @param linkType shift-link must fit by link type to this arg value or extraction fail + * + * @param value store result value at success return, not modified at fail + * + * @return true if extraction succesful + */ +bool ChatHandler::ExtractUint32KeyFromLink(char** text, char const* linkType, uint32& value) +{ + char* arg = ExtractKeyFromLink(text, linkType); + if (!arg) + return false; + + return ExtractUInt32(&arg, value); } GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry) @@ -2548,11 +2645,12 @@ GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid enum SpellLinkType { + SPELL_LINK_RAW =-1, // non-link case SPELL_LINK_SPELL = 0, SPELL_LINK_TALENT = 1, SPELL_LINK_ENCHANT = 2, SPELL_LINK_TRADE = 3, - SPELL_LINK_GLYPH = 4 + SPELL_LINK_GLYPH = 4, }; static char const* const spellKeys[] = @@ -2562,27 +2660,32 @@ static char const* const spellKeys[] = "Henchant", // enchanting recipe spell "Htrade", // profession/skill spell "Hglyph", // glyph - 0 + NULL }; -uint32 ChatHandler::extractSpellIdFromLink(char* text) +uint32 ChatHandler::ExtractSpellIdFromLink(char** text) { // number or [name] Shift-click form |color|Henchant:recipe_spell_id|h[prof_name: recipe_name]|h|r // number or [name] Shift-click form |color|Hglyph:glyph_slot_id:glyph_prop_id|h[%s]|h|r // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r // number or [name] Shift-click form |color|Htalent:talent_id,rank|h[name]|h|r // number or [name] Shift-click form |color|Htrade:spell_id,skill_id,max_value,cur_value|h[name]|h|r - int type = 0; + int type; char* param1_str = NULL; - char* idS = extractKeyFromLink(text,spellKeys,&type,¶m1_str); - if(!idS) + char* idS = ExtractKeyFromLink(text, spellKeys, &type, ¶m1_str); + if (!idS) return 0; - uint32 id = (uint32)atol(idS); + uint32 id; + if (!ExtractUInt32(&idS, id)) + return 0; switch(type) { + case SPELL_LINK_RAW: case SPELL_LINK_SPELL: + case SPELL_LINK_ENCHANT: + case SPELL_LINK_TRADE: return id; case SPELL_LINK_TALENT: { @@ -2591,27 +2694,21 @@ uint32 ChatHandler::extractSpellIdFromLink(char* text) if(!talentEntry) return 0; - int32 rank = param1_str ? (uint32)atol(param1_str) : 0; - if(rank >= MAX_TALENT_RANK) + uint32 rank; + if (!ExtractUInt32(¶m1_str, rank)) return 0; - if(rank < 0) - rank = 0; - - return talentEntry->RankID[rank]; + return rank < MAX_TALENT_RANK ? talentEntry->RankID[rank] : 0; } - case SPELL_LINK_ENCHANT: - case SPELL_LINK_TRADE: - return id; case SPELL_LINK_GLYPH: { - uint32 glyph_prop_id = param1_str ? (uint32)atol(param1_str) : 0; + uint32 glyph_prop_id; - GlyphPropertiesEntry const* glyphPropEntry = sGlyphPropertiesStore.LookupEntry(glyph_prop_id); - if(!glyphPropEntry) + if (!ExtractUInt32(¶m1_str, glyph_prop_id)) return 0; - return glyphPropEntry->SpellId; + GlyphPropertiesEntry const* glyphPropEntry = sGlyphPropertiesStore.LookupEntry(glyph_prop_id); + return glyphPropEntry ? glyphPropEntry->SpellId : 0; } } @@ -2619,26 +2716,27 @@ uint32 ChatHandler::extractSpellIdFromLink(char* text) return 0; } -GameTele const* ChatHandler::extractGameTeleFromLink(char* text) +GameTele const* ChatHandler::ExtractGameTeleFromLink(char** text) { // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r - char* cId = extractKeyFromLink(text,"Htele"); - if(!cId) + char* cId = ExtractKeyFromLink(text,"Htele"); + if (!cId) return NULL; // id case (explicit or from shift link) - if(cId[0] >= '0' || cId[0] >= '9') - if(uint32 id = atoi(cId)) - return sObjectMgr.GetGameTele(id); - - return sObjectMgr.GetGameTele(cId); + uint32 id; + if (ExtractUInt32(&cId, id)) + return sObjectMgr.GetGameTele(id); + else + return sObjectMgr.GetGameTele(cId); } enum GuidLinkType { - SPELL_LINK_PLAYER = 0, // must be first for selection in not link case - SPELL_LINK_CREATURE = 1, - SPELL_LINK_GAMEOBJECT = 2 + GUID_LINK_RAW =-1, // non-link case + GUID_LINK_PLAYER = 0, + GUID_LINK_CREATURE = 1, + GUID_LINK_GAMEOBJECT = 2, }; static char const* const guidKeys[] = @@ -2649,60 +2747,66 @@ static char const* const guidKeys[] = NULL }; -uint64 ChatHandler::extractGuidFromLink(char* text) +ObjectGuid ChatHandler::ExtractGuidFromLink(char** text) { int type = 0; // |color|Hcreature:creature_guid|h[name]|h|r // |color|Hgameobject:go_guid|h[name]|h|r // |color|Hplayer:name|h[name]|h|r - char* idS = extractKeyFromLink(text,guidKeys,&type); - if(!idS) - return 0; + char* idS = ExtractKeyFromLink(text, guidKeys, &type); + if (!idS) + return ObjectGuid(); switch(type) { - case SPELL_LINK_PLAYER: + case GUID_LINK_RAW: + case GUID_LINK_PLAYER: { std::string name = idS; - if(!normalizePlayerName(name)) - return 0; + if (!normalizePlayerName(name)) + return ObjectGuid(); - if(Player* player = sObjectMgr.GetPlayer(name.c_str())) - return player->GetGUID(); + if (Player* player = sObjectMgr.GetPlayer(name.c_str())) + return player->GetObjectGuid(); - if(uint64 guid = sObjectMgr.GetPlayerGUIDByName(name)) - return guid; + if (uint64 guid = sObjectMgr.GetPlayerGUIDByName(name)) + return ObjectGuid(guid); - return 0; + return ObjectGuid(); } - case SPELL_LINK_CREATURE: + case GUID_LINK_CREATURE: { - uint32 lowguid = (uint32)atol(idS); + uint32 lowguid; + if (!ExtractUInt32(&idS, lowguid)) + return ObjectGuid(); - if(CreatureData const* data = sObjectMgr.GetCreatureData(lowguid) ) - return MAKE_NEW_GUID(lowguid,data->id,HIGHGUID_UNIT); + if (CreatureData const* data = sObjectMgr.GetCreatureData(lowguid)) + return ObjectGuid(HIGHGUID_UNIT, data->id, lowguid); else - return 0; + return ObjectGuid(); } - case SPELL_LINK_GAMEOBJECT: + case GUID_LINK_GAMEOBJECT: { - uint32 lowguid = (uint32)atol(idS); + uint32 lowguid; + if (!ExtractUInt32(&idS, lowguid)) + return ObjectGuid(); if(GameObjectData const* data = sObjectMgr.GetGOData(lowguid) ) - return MAKE_NEW_GUID(lowguid,data->id,HIGHGUID_GAMEOBJECT); + return ObjectGuid(HIGHGUID_GAMEOBJECT, data->id, lowguid); else - return 0; + return ObjectGuid(); } } // unknown type? - return 0; + return ObjectGuid(); } enum LocationLinkType { - LOCATION_LINK_PLAYER = 0, // must be first for selection in not link case + LOCATION_LINK_RAW =-1, // non-link case + LOCATION_LINK_PLAYER = 0, LOCATION_LINK_TELE = 1, LOCATION_LINK_TAXINODE = 2, LOCATION_LINK_CREATURE = 3, @@ -2727,7 +2831,7 @@ static char const* const locationKeys[] = NULL }; -bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, float& y, float& z) +bool ChatHandler::ExtractLocationFromLink(char** text, uint32& mapid, float& x, float& y, float& z) { int type = 0; @@ -2740,24 +2844,20 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f // |color|Hgameobject_entry:go_id|h[name]|h|r // |color|Hareatrigger:id|h[name]|h|r // |color|Hareatrigger_target:id|h[name]|h|r - char* idS = extractKeyFromLink(text,locationKeys,&type); - if(!idS) + char* idS = ExtractKeyFromLink(text, locationKeys, &type); + if (!idS) return false; switch(type) { - // it also fail case + case LOCATION_LINK_RAW: case LOCATION_LINK_PLAYER: { - // not link and not name, possible coordinates/etc - if (isNumeric(idS[0])) - return false; - std::string name = idS; - if(!normalizePlayerName(name)) + if (!normalizePlayerName(name)) return false; - if(Player* player = sObjectMgr.GetPlayer(name.c_str())) + if (Player* player = sObjectMgr.GetPlayer(name.c_str())) { mapid = player->GetMapId(); x = player->GetPositionX(); @@ -2766,7 +2866,7 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f return true; } - if(uint64 guid = sObjectMgr.GetPlayerGUIDByName(name)) + if (uint64 guid = sObjectMgr.GetPlayerGUIDByName(name)) { // to point where player stay (if loaded) float o; @@ -2778,7 +2878,10 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f } case LOCATION_LINK_TELE: { - uint32 id = (uint32)atol(idS); + uint32 id; + if (!ExtractUInt32(&idS, id)) + return false; + GameTele const* tele = sObjectMgr.GetGameTele(id); if (!tele) return false; @@ -2790,7 +2893,10 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f } case LOCATION_LINK_TAXINODE: { - uint32 id = (uint32)atol(idS); + uint32 id; + if (!ExtractUInt32(&idS, id)) + return false; + TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id); if (!node) return false; @@ -2802,7 +2908,9 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f } case LOCATION_LINK_CREATURE: { - uint32 lowguid = (uint32)atol(idS); + uint32 lowguid; + if (!ExtractUInt32(&idS, lowguid)) + return false; if(CreatureData const* data = sObjectMgr.GetCreatureData(lowguid) ) { @@ -2817,7 +2925,9 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f } case LOCATION_LINK_GAMEOBJECT: { - uint32 lowguid = (uint32)atol(idS); + uint32 lowguid; + if (!ExtractUInt32(&idS, lowguid)) + return false; if(GameObjectData const* data = sObjectMgr.GetGOData(lowguid) ) { @@ -2832,7 +2942,9 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f } case LOCATION_LINK_CREATURE_ENTRY: { - uint32 id = (uint32)atol(idS); + uint32 id; + if (!ExtractUInt32(&idS, id)) + return false; if (sObjectMgr.GetCreatureTemplate(id)) { @@ -2856,7 +2968,9 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f } case LOCATION_LINK_GAMEOBJECT_ENTRY: { - uint32 id = (uint32)atol(idS); + uint32 id; + if (!ExtractUInt32(&idS, id)) + return false; if (sObjectMgr.GetGameObjectInfo(id)) { @@ -2880,7 +2994,9 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f } case LOCATION_LINK_AREATRIGGER: { - uint32 id = (uint32)atol(idS); + uint32 id; + if (!ExtractUInt32(&idS, id)) + return false; AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(id); if (!atEntry) @@ -2898,7 +3014,9 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f } case LOCATION_LINK_AREATRIGGER_TARGET: { - uint32 id = (uint32)atol(idS); + uint32 id; + if (!ExtractUInt32(&idS, id)) + return false; if (!sAreaTriggerStore.LookupEntry(id)) { @@ -2927,10 +3045,10 @@ bool ChatHandler::extractLocationFromLink(char* text, uint32& mapid, float& x, f return false; } -std::string ChatHandler::extractPlayerNameFromLink(char* text) +std::string ChatHandler::ExtractPlayerNameFromLink(char** text) { // |color|Hplayer:name|h[name]|h|r - char* name_str = extractKeyFromLink(text,"Hplayer"); + char* name_str = ExtractKeyFromLink(text, "Hplayer"); if(!name_str) return ""; @@ -2941,11 +3059,24 @@ std::string ChatHandler::extractPlayerNameFromLink(char* text) return name; } -bool ChatHandler::extractPlayerTarget(char* args, Player** player, uint64* player_guid /*=NULL*/,std::string* player_name /*= NULL*/) +/** + * Function extract at least one from request player data (pointer/guid/name) from args name/shift-link or selected player if no args + * + * @param args variable pointer to non parsed args string, updated at function call to new position (with skipped white spaces) + * + * @param player optional arg One from 3 optional args must be provided at least (or more). + * @param player_guid optional arg For function success only one from provided args need get result + * @param player_name optional arg But if early arg get value then all later args will have its (if requested) + * if player_guid requested and not found then name also will not found + * So at success can be returned 2 cases: (player/guid/name) or (guid/name) + * + * @return true if extraction successful + */ +bool ChatHandler::ExtractPlayerTarget(char** args, Player** player /*= NULL*/, uint64* player_guid /*= NULL*/,std::string* player_name /*= NULL*/) { - if (args && *args) + if (*args && **args) { - std::string name = extractPlayerNameFromLink(args); + std::string name = ExtractPlayerNameFromLink(args); if (name.empty()) { SendSysMessage(LANG_PLAYER_NOT_FOUND); @@ -2994,12 +3125,12 @@ bool ChatHandler::extractPlayerTarget(char* args, Player** player, uint64* playe return true; } -uint32 ChatHandler::extractAccountId(char* args, std::string* accountName /*= NULL*/, Player** targetIfNullArg /*= NULL*/) +uint32 ChatHandler::ExtractAccountId(char** args, std::string* accountName /*= NULL*/, Player** targetIfNullArg /*= NULL*/) { uint32 account_id = 0; ///- Get the account name from the command line - char* account_str = args ? strtok (args," ") : NULL; + char* account_str = ExtractLiteralArg(args); if (!account_str) { @@ -3024,18 +3155,8 @@ uint32 ChatHandler::extractAccountId(char* args, std::string* accountName /*= NU std::string account_name; - if (isNumeric(account_str)) + if (ExtractUInt32(&account_str, account_id)) { - long id = atol(account_str); - if (id <= 0 || ((unsigned long)id) >= std::numeric_limits::max()) - { - PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_str); - SetSentErrorMessage(true); - return 0; - } - - account_id = uint32(id); - if (!sAccountMgr.GetName(account_id, account_name)) { PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_str); diff --git a/src/game/Chat.h b/src/game/Chat.h index c2e4412d7..c08888cba 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -19,7 +19,9 @@ #ifndef MANGOSSERVER_CHAT_H #define MANGOSSERVER_CHAT_H +#include "Common.h" #include "SharedDefines.h" +#include "ObjectGuid.h" struct AchievementEntry; struct AreaTrigger; @@ -563,30 +565,31 @@ class ChatHandler bool ExtractFloat(char** args, float& val); bool ExtractOptFloat(char** args, float& val, float defVal); char* ExtractQuotedArg(char** args); // string with " or [] or ' around - char* ExtractLinkArg(char** args); // shift-link like arg char* ExtractLiteralArg(char** args, char const* lit = NULL); // literal string (until whitespace and not started from "['|), any or 'lit' if provided char* ExtractQuotedOrLiteralArg(char** args); bool ExtractOnOff(char** args, bool& value); + char* ExtractLinkArg(char** args, char const* const* linkTypes = NULL, int* foundIdx = NULL, char** keyPair = NULL, char** somethingPair = NULL); + // shift-link like arg (with aditional info if need) char* ExtractArg(char** args); // any name/number/quote/shift-link strings - char* ExtractOptNotLastArg(char** args); // extract name/number/quote/shift-link arg only if more data in args for parse + char* ExtractOptNotLastArg(char** args); // extract name/number/quote/shift-link arg only if more data in args for parse - char* extractKeyFromLink(char* text, char const* linkType, char** something1 = NULL); - char* extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1 = NULL); + char* ExtractKeyFromLink(char** text, char const* linkType, char** something1 = NULL); + char* ExtractKeyFromLink(char** text, char const* const* linkTypes, int* found_idx = NULL, char** something1 = NULL); + bool ExtractUint32KeyFromLink(char** text, char const* linkType, uint32& value); - uint32 extractSpellIdFromLink(char* text); - uint64 extractGuidFromLink(char* text); - GameTele const* extractGameTeleFromLink(char* text); - bool extractLocationFromLink(char* text, uint32& mapid, float& x, float& y, float& z); - std::string extractPlayerNameFromLink(char* text); - // select by arg (name/link) or in-game selection online/offline player - bool extractPlayerTarget(char* args, Player** player, uint64* player_guid = NULL, std::string* player_name = NULL); + uint32 ExtractAccountId(char** args, std::string* accountName = NULL, Player** targetIfNullArg = NULL); + uint32 ExtractSpellIdFromLink(char** text); + ObjectGuid ExtractGuidFromLink(char** text); + GameTele const* ExtractGameTeleFromLink(char** text); + bool ExtractLocationFromLink(char** text, uint32& mapid, float& x, float& y, float& z); + std::string ExtractPlayerNameFromLink(char** text); + bool ExtractPlayerTarget(char** args, Player** player, uint64* player_guid = NULL, std::string* player_name = NULL); + // select by arg (name/link) or in-game selection online/offline player std::string playerLink(std::string const& name) const { return m_session ? "|cffffffff|Hplayer:"+name+"|h["+name+"]|h|r" : name; } std::string GetNameLink(Player* chr) const { return playerLink(chr->GetName()); } - uint32 extractAccountId(char* args, std::string* accountName = NULL, Player** targetIfNullArg = NULL); - GameObject* GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry); // Utility methods for commands diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 455f160a2..03dd02664 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -97,27 +97,24 @@ bool ChatHandler::HandleNpcTextEmoteCommand(char* args) // make npc whisper to player bool ChatHandler::HandleNpcWhisperCommand(char* args) { - if(!*args) + Player* target; + if (!ExtractPlayerTarget(&args, &target)) return false; - char* receiver_str = strtok(args, " "); - char* text = strtok(NULL, ""); - uint64 guid = m_session->GetPlayer()->GetSelection(); + if (!guid) + return false; + Creature* pCreature = m_session->GetPlayer()->GetMap()->GetCreature(guid); - if(!pCreature || !receiver_str || !text) - { + if(!pCreature || !target || !*args) return false; - } - - uint64 receiver_guid= atol(receiver_str); // check online security - if (HasLowerSecurity(sObjectMgr.GetPlayer(receiver_guid), 0)) + if (HasLowerSecurity(target, 0)) return false; - pCreature->MonsterWhisper(text,receiver_guid); + pCreature->MonsterWhisper(args, target->GetGUID()); return true; } @@ -255,8 +252,8 @@ bool ChatHandler::HandleGPSCommand(char* args) WorldObject *obj = NULL; if (*args) { - uint64 guid = extractGuidFromLink(args); - if(guid) + ObjectGuid guid = ExtractGuidFromLink(&args); + if (!guid.IsEmpty()) obj = (WorldObject*)m_session->GetPlayer()->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT); if(!obj) @@ -355,7 +352,7 @@ bool ChatHandler::HandleNamegoCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args,&target,&target_guid,&target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; Player* _player = m_session->GetPlayer(); @@ -476,7 +473,7 @@ bool ChatHandler::HandleGonameCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args,&target,&target_guid,&target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; Player* _player = m_session->GetPlayer(); @@ -613,7 +610,7 @@ bool ChatHandler::HandleGonameCommand(char* args) bool ChatHandler::HandleRecallCommand(char* args) { Player* target; - if(!extractPlayerTarget(args,&target)) + if (!ExtractPlayerTarget(&args, &target)) return false; // check online security @@ -821,11 +818,6 @@ bool ChatHandler::HandleModifyRunicPowerCommand(char* args) //Edit Player Faction bool ChatHandler::HandleModifyFactionCommand(char* args) { - if(!*args) - return false; - - char* pfactionid = extractKeyFromLink(args,"Hfaction"); - Creature* chr = getSelectedCreature(); if(!chr) { @@ -834,7 +826,7 @@ bool ChatHandler::HandleModifyFactionCommand(char* args) return false; } - if(!pfactionid) + if (!*args) { if(chr) { @@ -854,30 +846,9 @@ bool ChatHandler::HandleModifyFactionCommand(char* args) return false; } - uint32 factionid = atoi(pfactionid); - uint32 flag; - - char *pflag = strtok(NULL, " "); - if (!pflag) - flag = chr->GetUInt32Value(UNIT_FIELD_FLAGS); - else - flag = atoi(pflag); - - char* pnpcflag = strtok(NULL, " "); - - uint32 npcflag; - if(!pnpcflag) - npcflag = chr->GetUInt32Value(UNIT_NPC_FLAGS); - else - npcflag = atoi(pnpcflag); - - char* pdyflag = strtok(NULL, " "); - - uint32 dyflag; - if(!pdyflag) - dyflag = chr->GetUInt32Value(UNIT_DYNAMIC_FLAGS); - else - dyflag = atoi(pdyflag); + uint32 factionid; + if (!ExtractUint32KeyFromLink(&args, "Hfaction", factionid)) + return false; if(!sFactionTemplateStore.LookupEntry(factionid)) { @@ -886,7 +857,19 @@ bool ChatHandler::HandleModifyFactionCommand(char* args) return false; } - PSendSysMessage(LANG_YOU_CHANGE_FACTION, chr->GetGUIDLow(),factionid,flag,npcflag,dyflag); + uint32 flag; + if (!ExtractOptUInt32(&args, flag, chr->GetUInt32Value(UNIT_FIELD_FLAGS))) + return false; + + uint32 npcflag; + if (!ExtractOptUInt32(&args, npcflag, chr->GetUInt32Value(UNIT_NPC_FLAGS))) + return false; + + uint32 dyflag; + if (!ExtractOptUInt32(&args, dyflag, chr->GetUInt32Value(UNIT_DYNAMIC_FLAGS))) + return false; + + PSendSysMessage(LANG_YOU_CHANGE_FACTION, chr->GetGUIDLow(), factionid, flag, npcflag, dyflag); chr->setFaction(factionid); chr->SetUInt32Value(UNIT_FIELD_FLAGS,flag); @@ -1593,7 +1576,7 @@ bool ChatHandler::HandleTeleCommand(char* args) Player* _player = m_session->GetPlayer(); // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r - GameTele const* tele = extractGameTeleFromLink(args); + GameTele const* tele = ExtractGameTeleFromLink(&args); if (!tele) { @@ -1762,18 +1745,14 @@ bool ChatHandler::HandleSendMailCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; - char* tail = strtok(NULL, ""); - if(!tail) - return false; - - char* msgSubject = ExtractQuotedArg(&tail); + char* msgSubject = ExtractQuotedArg(&args); if (!msgSubject) return false; - char* msgText = ExtractQuotedArg(&tail); + char* msgText = ExtractQuotedArg(&args); if (!msgText) return false; @@ -1800,11 +1779,11 @@ bool ChatHandler::HandleTeleNameCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(nameStr,&target,&target_guid,&target_name)) + if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) return false; // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r - GameTele const* tele = extractGameTeleFromLink(args); + GameTele const* tele = ExtractGameTeleFromLink(&args); if (!tele) { SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); @@ -1868,7 +1847,7 @@ bool ChatHandler::HandleTeleGroupCommand(char * args) return false; // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r - GameTele const* tele = extractGameTeleFromLink(args); + GameTele const* tele = ExtractGameTeleFromLink(&args); if(!tele) { SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); @@ -1929,7 +1908,7 @@ bool ChatHandler::HandleTeleGroupCommand(char * args) bool ChatHandler::HandleGroupgoCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; // check online security @@ -2070,21 +2049,14 @@ bool ChatHandler::HandleGoTaxinodeCommand(char* args) { Player* _player = m_session->GetPlayer(); - if (!*args) + uint32 nodeId; + if (!ExtractUint32KeyFromLink(&args, "Htaxinode", nodeId)) return false; - char* cNodeId = extractKeyFromLink(args, "Htaxinode"); - if (!cNodeId) - return false; - - int32 i_nodeId = atoi(cNodeId); - if (!i_nodeId) - return false; - - TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i_nodeId); + TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(nodeId); if (!node) { - PSendSysMessage(LANG_COMMAND_GOTAXINODENOTFOUND,i_nodeId); + PSendSysMessage(LANG_COMMAND_GOTAXINODENOTFOUND, nodeId); SetSentErrorMessage(true); return false; } @@ -2110,27 +2082,19 @@ bool ChatHandler::HandleGoCommand(char* args) float x, y, z; // raw coordinates case - if (isNumeric(args[0]) || args[0] == '-') + if (ExtractFloat(&args, x)) { - char* px = strtok(args, " "); - char* py = strtok(NULL, " "); - char* pz = strtok(NULL, " "); - char* pmapid = strtok(NULL, " "); - - if (!px || !py || !pz) + if (!ExtractFloat(&args, y)) return false; - x = (float)atof(px); - y = (float)atof(py); - z = (float)atof(pz); - if (pmapid) - mapid = (uint32)atoi(pmapid); - else - mapid = _player->GetMapId(); + if (!ExtractFloat(&args, z)) + return false; + if (!ExtractOptUInt32(&args, mapid, _player->GetMapId())) + return false; } // link case - else if (!extractLocationFromLink(args, mapid, x, y, z)) + else if (!ExtractLocationFromLink(&args, mapid, x, y, z)) return false; return HandleGoHelper(_player, mapid, x, y, &z); @@ -2185,34 +2149,30 @@ bool ChatHandler::HandleGoXYZCommand(char* args) //teleport at coordinates bool ChatHandler::HandleGoZoneXYCommand(char* args) { - if (!*args) - return false; - Player* _player = m_session->GetPlayer(); - char* px = strtok(args, " "); - char* py = strtok(NULL, " "); - char* tail = strtok(NULL,""); - - char* cAreaId = extractKeyFromLink(tail, "Harea"); // string or [name] Shift-click form |color|Harea:area_id|h[name]|h|r - - if (!px || !py) + float x; + if (!ExtractFloat(&args, x)) return false; - float x = (float)atof(px); - float y = (float)atof(py); - - // prevent accept wrong numeric args - if ((x==0.0f && *px!='0') || (y==0.0f && *py!='0')) + float y; + if (!ExtractFloat(&args, y)) return false; - uint32 areaid = cAreaId ? (uint32)atoi(cAreaId) : _player->GetZoneId(); + uint32 areaid; + if (*args) + { + if (!ExtractUint32KeyFromLink(&args, "Harea", areaid)) + return false; + } + else + areaid = _player->GetZoneId(); AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaid); - if( x<0 || x>100 || y<0 || y>100 || !areaEntry ) + if (x < 0 || x > 100 || y < 0 || y > 100 || !areaEntry) { - PSendSysMessage(LANG_INVALID_ZONE_COORD,x,y,areaid); + PSendSysMessage(LANG_INVALID_ZONE_COORD, x, y, areaid); SetSentErrorMessage(true); return false; } diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 7b1d34e77..042103fa2 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -58,7 +58,7 @@ bool ChatHandler::HandleMuteCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) return false; uint32 notspeaktime; @@ -100,7 +100,7 @@ bool ChatHandler::HandleUnmuteCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; uint32 account_id = target ? target->GetSession()->GetAccountId() : sObjectMgr.GetPlayerAccountIdByGUID(target_guid); @@ -192,20 +192,18 @@ bool ChatHandler::HandleTriggerCommand(char* args) // select by args if (*args) { - char *atId = extractKeyFromLink(args, "Hareatrigger"); + uint32 atId; + if (!ExtractUint32KeyFromLink(&args, "Hareatrigger", atId)) + return false; + if (!atId) return false; - int32 i_atId = atoi(atId); - - if (!i_atId) - return false; - - atEntry = sAreaTriggerStore.LookupEntry(i_atId); + atEntry = sAreaTriggerStore.LookupEntry(atId); if (!atEntry) { - PSendSysMessage(LANG_COMMAND_GOAREATRNOTFOUND, i_atId); + PSendSysMessage(LANG_COMMAND_GOAREATRNOTFOUND, atId); SetSentErrorMessage(true); return false; } @@ -403,39 +401,35 @@ bool ChatHandler::HandleGoTriggerCommand(char* args) if (!*args) return false; - int keyIdx; // not index + char *atIdStr = ExtractKeyFromLink(&args, areatriggerKeys); + if (!atIdStr) + return false; + + uint32 atId; + if (!ExtractUInt32(&atIdStr, atId)) + return false; - char *atId = extractKeyFromLink(args, areatriggerKeys, &keyIdx); if (!atId) return false; - int32 i_atId = atoi(atId); - - if (!i_atId) - return false; - - AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(i_atId); + AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(atId); if (!atEntry) { - PSendSysMessage(LANG_COMMAND_GOAREATRNOTFOUND, i_atId); + PSendSysMessage(LANG_COMMAND_GOAREATRNOTFOUND, atId); SetSentErrorMessage(true); return false; } - char* target_str = strtok(NULL, " "); - if (target_str) - { - int l = strlen(target_str); - if (strncmp(target_str, "target", l) != 0) - return false; - } + bool to_target = ExtractLiteralArg(&args, "target"); + if (!to_target && *args) // can be fail also at syntax error + return false; - if (target_str != NULL) + if (to_target) { - AreaTrigger const* at = sObjectMgr.GetAreaTrigger(i_atId); + AreaTrigger const* at = sObjectMgr.GetAreaTrigger(atId); if (!at) { - PSendSysMessage(LANG_AREATRIGER_NOT_HAS_TARGET, i_atId); + PSendSysMessage(LANG_AREATRIGER_NOT_HAS_TARGET, atId); SetSentErrorMessage(true); return false; } @@ -465,6 +459,20 @@ bool ChatHandler::HandleGoGraveyardCommand(char* args) return HandleGoHelper(_player, gy->map_id, gy->x, gy->y, &gy->z); } +enum CreatureLinkType +{ + CREATURE_LINK_RAW =-1, // non-link case + CREATURE_LINK_GUID = 0, + CREATURE_LINK_ENTRY = 1, +}; + +static char const* const creatureKeys[] = +{ + "Hcreature", + "Hcreature_entry", + NULL +}; + /** \brief Teleport the GM to the specified creature * * .go creature --> TP using creature.guid @@ -484,91 +492,45 @@ bool ChatHandler::HandleGoCreatureCommand(char* args) Player* _player = m_session->GetPlayer(); // "id" or number or [name] Shift-click form |color|Hcreature:creature_id|h[name]|h|r - char* pParam1 = extractKeyFromLink(args, "Hcreature"); + int crType; + char* pParam1 = ExtractKeyFromLink(&args, creatureKeys, &crType); if (!pParam1) return false; - CreatureData const* data = NULL; - - // User wants to teleport to the NPC's template entry - if (strcmp(pParam1, "id") == 0) + if (crType == CREATURE_LINK_RAW && strcmp(pParam1, "id") == 0) { // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r - char* tail = strtok(NULL,""); - if (!tail) - return false; - char* cId = extractKeyFromLink(tail,"Hcreature_entry"); - if (!cId) + pParam1 = ExtractKeyFromLink(&args, "Hcreature_entry"); + if (!pParam1) return false; - int32 tEntry = atoi(cId); - if (!tEntry) - return false; - - if (!sObjectMgr.GetCreatureTemplate(tEntry)) - { - SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); - SetSentErrorMessage(true); - return false; - } - - FindCreatureData worker(tEntry, m_session ? m_session->GetPlayer() : NULL); - - sObjectMgr.DoCreatureData(worker); - - CreatureDataPair const* dataPair = worker.GetResult(); - if (!dataPair) - { - SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); - SetSentErrorMessage(true); - return false; - } - - data = &dataPair->second; + crType = CREATURE_LINK_ENTRY; } - else + + CreatureData const* data = NULL; + + switch(crType) { - int32 lowguid = atoi(pParam1); - - // Number is invalid - maybe the user specified the mob's name - if (lowguid) + case CREATURE_LINK_ENTRY: { - data = sObjectMgr.GetCreatureData(lowguid); - if (!data) - { - SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); - SetSentErrorMessage(true); + uint32 tEntry; + if (!ExtractUInt32(&pParam1, tEntry)) return false; - } - } - else - { - std::string name = pParam1; - WorldDatabase.escape_string(name); - QueryResult *result = WorldDatabase.PQuery("SELECT guid FROM creature, creature_template WHERE creature.id = creature_template.entry AND creature_template.name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), name.c_str()); - if (!result) + + if (!tEntry) + return false; + + if (!sObjectMgr.GetCreatureTemplate(tEntry)) { SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); SetSentErrorMessage(true); return false; } - FindCreatureData worker(0, m_session ? m_session->GetPlayer() : NULL); + FindCreatureData worker(tEntry, m_session ? m_session->GetPlayer() : NULL); - do { - Field *fields = result->Fetch(); - uint32 guid = fields[0].GetUInt32(); - - CreatureDataPair const* cr_data = sObjectMgr.GetCreatureDataPair(guid); - if (!cr_data) - continue; - - worker(*cr_data); - - } while (result->NextRow()); - - delete result; + sObjectMgr.DoCreatureData(worker); CreatureDataPair const* dataPair = worker.GetResult(); if (!dataPair) @@ -579,108 +541,144 @@ bool ChatHandler::HandleGoCreatureCommand(char* args) } data = &dataPair->second; + break; + } + case CREATURE_LINK_GUID: + { + uint32 lowguid; + if (!ExtractUInt32(&pParam1, lowguid)) + return false; + + data = sObjectMgr.GetCreatureData(lowguid); + if (!data) + { + SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); + SetSentErrorMessage(true); + return false; + } + break; + } + case CREATURE_LINK_RAW: + { + uint32 lowguid; + if (ExtractUInt32(&pParam1, lowguid)) + { + data = sObjectMgr.GetCreatureData(lowguid); + if (!data) + { + SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); + SetSentErrorMessage(true); + return false; + } + } + // Number is invalid - maybe the user specified the mob's name + else + { + std::string name = pParam1; + WorldDatabase.escape_string(name); + QueryResult *result = WorldDatabase.PQuery("SELECT guid FROM creature, creature_template WHERE creature.id = creature_template.entry AND creature_template.name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), name.c_str()); + if (!result) + { + SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); + SetSentErrorMessage(true); + return false; + } + + FindCreatureData worker(0, m_session ? m_session->GetPlayer() : NULL); + + do { + Field *fields = result->Fetch(); + uint32 guid = fields[0].GetUInt32(); + + CreatureDataPair const* cr_data = sObjectMgr.GetCreatureDataPair(guid); + if (!cr_data) + continue; + + worker(*cr_data); + + } while (result->NextRow()); + + delete result; + + CreatureDataPair const* dataPair = worker.GetResult(); + if (!dataPair) + { + SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); + SetSentErrorMessage(true); + return false; + } + + data = &dataPair->second; + } + break; } } return HandleGoHelper(_player, data->mapid, data->posX, data->posY, &data->posZ); } +enum GameobjectLinkType +{ + GAMEOBJECT_LINK_RAW =-1, // non-link case + GAMEOBJECT_LINK_GUID = 0, + GAMEOBJECT_LINK_ENTRY = 1, +}; + +static char const* const gameobjectKeys[] = +{ + "Hgameobject", + "Hgameobject_entry", + NULL +}; + //teleport to gameobject bool ChatHandler::HandleGoObjectCommand(char* args) { - if (!*args) - return false; - Player* _player = m_session->GetPlayer(); // number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r - char* pParam1 = extractKeyFromLink(args, "Hgameobject"); + int goType; + char* pParam1 = ExtractKeyFromLink(&args, gameobjectKeys, &goType); if (!pParam1) return false; - GameObjectData const* data = NULL; - - // User wants to teleport to the NPC's template entry - if (strcmp(pParam1, "id") == 0) + // User wants to teleport to the GO's template entry + if (goType == GAMEOBJECT_LINK_RAW && strcmp(pParam1, "id") == 0) { // number or [name] Shift-click form |color|Hgameobject_entry:creature_id|h[name]|h|r - char* tail = strtok(NULL,""); - if (!tail) - return false; - char* cId = extractKeyFromLink(tail,"Hgameobject_entry"); - if (!cId) + pParam1 = ExtractKeyFromLink(&args, "Hgameobject_entry"); + if (!pParam1) return false; - int32 tEntry = atoi(cId); - if (!tEntry) - return false; - - if (!sObjectMgr.GetGameObjectInfo(tEntry)) - { - SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); - SetSentErrorMessage(true); - return false; - } - - FindGOData worker(tEntry, m_session ? m_session->GetPlayer() : NULL); - - sObjectMgr.DoGOData(worker); - - GameObjectDataPair const* dataPair = worker.GetResult(); - - if (!dataPair) - { - SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); - SetSentErrorMessage(true); - return false; - } - - data = &dataPair->second; + goType = GAMEOBJECT_LINK_ENTRY; } - else + + GameObjectData const* data = NULL; + + switch(goType) { - int32 guid = atoi(pParam1); - - if (guid) + case CREATURE_LINK_ENTRY: { - // by DB guid - data = sObjectMgr.GetGOData(guid); - if (!data) - { - SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); - SetSentErrorMessage(true); + uint32 tEntry; + if (!ExtractUInt32(&pParam1, tEntry)) return false; - } - } - else - { - std::string name = pParam1; - WorldDatabase.escape_string(name); - QueryResult *result = WorldDatabase.PQuery("SELECT guid FROM gameobject, gameobject_template WHERE gameobject.id = gameobject_template.entry AND gameobject_template.name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), name.c_str()); - if (!result) + + if (!tEntry) + return false; + + if (!sObjectMgr.GetGameObjectInfo(tEntry)) { SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); SetSentErrorMessage(true); return false; } - FindGOData worker(0, m_session ? m_session->GetPlayer() : NULL); + FindGOData worker(tEntry, m_session ? m_session->GetPlayer() : NULL); - do { - Field *fields = result->Fetch(); - uint32 guid = fields[0].GetUInt32(); - - GameObjectDataPair const* go_data = sObjectMgr.GetGODataPair(guid); - if (!go_data) - continue; - - worker(*go_data); - - } while (result->NextRow()); - - delete result; + sObjectMgr.DoGOData(worker); GameObjectDataPair const* dataPair = worker.GetResult(); + if (!dataPair) { SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); @@ -689,6 +687,77 @@ bool ChatHandler::HandleGoObjectCommand(char* args) } data = &dataPair->second; + break; + } + case GAMEOBJECT_LINK_GUID: + { + uint32 lowguid; + if (!ExtractUInt32(&pParam1, lowguid)) + return false; + + // by DB guid + data = sObjectMgr.GetGOData(lowguid); + if (!data) + { + SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); + SetSentErrorMessage(true); + return false; + } + break; + } + case GAMEOBJECT_LINK_RAW: + { + uint32 lowguid; + if (ExtractUInt32(&pParam1, lowguid)) + { + // by DB guid + data = sObjectMgr.GetGOData(lowguid); + if (!data) + { + SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); + SetSentErrorMessage(true); + return false; + } + } + else + { + std::string name = pParam1; + WorldDatabase.escape_string(name); + QueryResult *result = WorldDatabase.PQuery("SELECT guid FROM gameobject, gameobject_template WHERE gameobject.id = gameobject_template.entry AND gameobject_template.name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), name.c_str()); + if (!result) + { + SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); + SetSentErrorMessage(true); + return false; + } + + FindGOData worker(0, m_session ? m_session->GetPlayer() : NULL); + + do { + Field *fields = result->Fetch(); + uint32 guid = fields[0].GetUInt32(); + + GameObjectDataPair const* go_data = sObjectMgr.GetGODataPair(guid); + if (!go_data) + continue; + + worker(*go_data); + + } while (result->NextRow()); + + delete result; + + GameObjectDataPair const* dataPair = worker.GetResult(); + if (!dataPair) + { + SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); + SetSentErrorMessage(true); + return false; + } + + data = &dataPair->second; + } + break; } } @@ -703,15 +772,16 @@ bool ChatHandler::HandleGameObjectTargetCommand(char* args) if (*args) { // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameobject_entry"); + char* cId = ExtractKeyFromLink(&args, "Hgameobject_entry"); if (!cId) return false; - uint32 id = atol(cId); - - if (id) + uint32 id; + if (ExtractUInt32(&cId, id)) + { result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, orientation, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE map = '%i' AND id = '%u' ORDER BY order_ ASC LIMIT 1", pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), pl->GetMapId(),id); + } else { std::string name = cId; @@ -816,11 +886,10 @@ bool ChatHandler::HandleGameObjectTargetCommand(char* args) bool ChatHandler::HandleGameObjectDeleteCommand(char* args) { // number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameobject"); - if (!cId) + uint32 lowguid; + if (!ExtractUint32KeyFromLink(&args, "Hgameobject", lowguid)) return false; - uint32 lowguid = atoi(cId); if (!lowguid) return false; @@ -864,11 +933,10 @@ bool ChatHandler::HandleGameObjectDeleteCommand(char* args) bool ChatHandler::HandleGameObjectTurnCommand(char* args) { // number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameobject"); - if (!cId) + uint32 lowguid; + if (!ExtractUint32KeyFromLink(&args, "Hgameobject", lowguid)) return false; - uint32 lowguid = atoi(cId); if (!lowguid) return false; @@ -885,18 +953,9 @@ bool ChatHandler::HandleGameObjectTurnCommand(char* args) return false; } - char* po = strtok(NULL, " "); float o; - - if (po) - { - o = (float)atof(po); - } - else - { - Player *chr = m_session->GetPlayer(); - o = chr->GetOrientation(); - } + if (!ExtractOptFloat(&args, o, m_session->GetPlayer()->GetOrientation())) + return false; Map* map = obj->GetMap(); map->Remove(obj,false); @@ -918,11 +977,10 @@ bool ChatHandler::HandleGameObjectTurnCommand(char* args) bool ChatHandler::HandleGameObjectMoveCommand(char* args) { // number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r - char* cId = extractKeyFromLink(args,"Hgameobject"); - if (!cId) + uint32 lowguid; + if (!ExtractUint32KeyFromLink(&args, "Hgameobject", lowguid)) return false; - uint32 lowguid = atoi(cId); if (!lowguid) return false; @@ -939,11 +997,7 @@ bool ChatHandler::HandleGameObjectMoveCommand(char* args) return false; } - char* px = strtok(NULL, " "); - char* py = strtok(NULL, " "); - char* pz = strtok(NULL, " "); - - if (!px) + if (!args) { Player *chr = m_session->GetPlayer(); @@ -956,16 +1010,21 @@ bool ChatHandler::HandleGameObjectMoveCommand(char* args) } else { - if (!py || !pz) + float x; + if (!ExtractFloat(&args, x)) return false; - float x = (float)atof(px); - float y = (float)atof(py); - float z = (float)atof(pz); + float y; + if (!ExtractFloat(&args, y)) + return false; - if (!MapManager::IsValidMapCoord(obj->GetMapId(),x,y,z)) + float z; + if (!ExtractFloat(&args, z)) + return false; + + if (!MapManager::IsValidMapCoord(obj->GetMapId(), x, y, z)) { - PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,obj->GetMapId()); + PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, obj->GetMapId()); SetSentErrorMessage(true); return false; } @@ -989,19 +1048,17 @@ bool ChatHandler::HandleGameObjectMoveCommand(char* args) //spawn go bool ChatHandler::HandleGameObjectAddCommand(char* args) { - if (!*args) - return false; - // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameobject_entry"); - if (!cId) + uint32 id; + if (!ExtractUint32KeyFromLink(&args, "Hgameobject_entry", id)) return false; - uint32 id = atol(cId); if (!id) return false; - char* spawntimeSecs = strtok(NULL, " "); + int32 spawntimeSecs; + if (!ExtractInt32(&args, spawntimeSecs)) + return false; const GameObjectInfo *gInfo = ObjectMgr::GetGameObjectInfo(id); @@ -1038,11 +1095,7 @@ bool ChatHandler::HandleGameObjectAddCommand(char* args) } if (spawntimeSecs) - { - uint32 value = atoi((char*)spawntimeSecs); - pGameObj->SetRespawnTime(value); - //DEBUG_LOG("*** spawntimeSecs: %d", value); - } + pGameObj->SetRespawnTime(spawntimeSecs); // fill the gameobject data and save to the db pGameObj->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()),chr->GetPhaseMaskForSpawn()); @@ -1069,11 +1122,10 @@ bool ChatHandler::HandleGameObjectAddCommand(char* args) bool ChatHandler::HandleGameObjectPhaseCommand(char* args) { // number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameobject"); - if (!cId) + uint32 lowguid; + if (!ExtractUint32KeyFromLink(&args, "Hgameobject", lowguid)) return false; - uint32 lowguid = atoi(cId); if (!lowguid) return false; @@ -1090,9 +1142,8 @@ bool ChatHandler::HandleGameObjectPhaseCommand(char* args) return false; } - char* phaseStr = strtok (NULL, " "); - uint32 phasemask = phaseStr? atoi(phaseStr) : 0; - if (phasemask == 0) + uint32 phasemask; + if (!ExtractUInt32(&args, phasemask) || !phasemask) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); @@ -1280,7 +1331,7 @@ bool ChatHandler::HandleLookupAchievementCommand(char* args) bool ChatHandler::HandleCharacterAchievementsCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; LocaleConstant loc = GetSessionDbcLocale(); @@ -1411,20 +1462,20 @@ bool ChatHandler::HandleModifyRepCommand(char* args) if (HasLowerSecurity(target, 0)) return false; - char* factionTxt = extractKeyFromLink(args, "Hfaction"); - if (!factionTxt) + uint32 factionId; + if (!ExtractUint32KeyFromLink(&args, "Hfaction", factionId)) return false; - uint32 factionId = atoi(factionTxt); + if (!factionId) + return false; int32 amount = 0; - char *rankTxt = strtok(NULL, " "); - if (!factionTxt || !rankTxt) - return false; - - amount = atoi(rankTxt); - if ((amount == 0) && (rankTxt[0] != '-') && !isdigit(rankTxt[0])) + if (!ExtractInt32(&args, amount)) { + char *rankTxt = ExtractLiteralArg(&args); + if (!rankTxt) + return false; + std::string rankStr = rankTxt; std::wstring wrankStr; if (!Utf8toWStr(rankStr, wrankStr)) @@ -1447,18 +1498,14 @@ bool ChatHandler::HandleModifyRepCommand(char* args) if (wrank.substr(0, wrankStr.size()) == wrankStr) { - char *deltaTxt = strtok(NULL, " "); - if (deltaTxt) + int32 delta; + if (!ExtractInt32(&args, delta) || (delta < 0) || (delta > ReputationMgr::PointsInRank[r] -1)) { - int32 delta = atoi(deltaTxt); - if ((delta < 0) || (delta > ReputationMgr::PointsInRank[r] -1)) - { - PSendSysMessage(LANG_COMMAND_FACTION_DELTA, (ReputationMgr::PointsInRank[r]-1)); - SetSentErrorMessage(true); - return false; - } - amount += delta; + PSendSysMessage(LANG_COMMAND_FACTION_DELTA, (ReputationMgr::PointsInRank[r]-1)); + SetSentErrorMessage(true); + return false; } + amount += delta; break; } amount += ReputationMgr::PointsInRank[r]; @@ -1499,16 +1546,14 @@ bool ChatHandler::HandleNpcAddCommand(char* args) { if (!*args) return false; - char* charID = extractKeyFromLink(args, "Hcreature_entry"); - if (!charID) + + uint32 id; + if (!ExtractUint32KeyFromLink(&args, "Hcreature_entry", id)) return false; - char* team = strtok(NULL, " "); - int32 teamval = 0; - if (team) { teamval = atoi(team); } - if (teamval < 0) { teamval = 0; } - - uint32 id = atoi(charID); + uint32 team; + if (!ExtractOptUInt32(&args, team, 0)) + return false; Player *chr = m_session->GetPlayer(); float x = chr->GetPositionX(); @@ -1518,7 +1563,7 @@ bool ChatHandler::HandleNpcAddCommand(char* args) Map *map = chr->GetMap(); Creature* pCreature = new Creature; - if (!pCreature->Create(sObjectMgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, (uint32)teamval)) + if (!pCreature->Create(sObjectMgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, team)) { delete pCreature; return false; @@ -1548,31 +1593,25 @@ bool ChatHandler::HandleNpcAddCommand(char* args) //add item in vendorlist bool ChatHandler::HandleNpcAddVendorItemCommand(char* args) { - if (!*args) - return false; - - char* pitem = extractKeyFromLink(args, "Hitem"); - if (!pitem) + uint32 itemId; + if (!ExtractUint32KeyFromLink(&args, "Hitem", itemId)) { SendSysMessage(LANG_COMMAND_NEEDITEMSEND); SetSentErrorMessage(true); return false; } - uint32 itemId = atol(pitem); + uint32 maxcount; + if (!ExtractOptUInt32(&args, maxcount, 0)) + return false; - char* fmaxcount = strtok(NULL, " "); //add maxcount, default: 0 - uint32 maxcount = 0; - if (fmaxcount) - maxcount = atol(fmaxcount); + uint32 incrtime; + if (!ExtractOptUInt32(&args, incrtime, 0)) + return false; - char* fincrtime = strtok(NULL, " "); //add incrtime, default: 0 - uint32 incrtime = 0; - if (fincrtime) - incrtime = atol(fincrtime); - - char* fextendedcost = strtok(NULL, " "); //add ExtendedCost, default: 0 - uint32 extendedcost = fextendedcost ? atol(fextendedcost) : 0; + uint32 extendedcost; + if (!ExtractOptUInt32(&args, extendedcost, 0)) + return false; Creature* vendor = getSelectedCreature(); @@ -1606,14 +1645,13 @@ bool ChatHandler::HandleNpcDelVendorItemCommand(char* args) return false; } - char* pitem = extractKeyFromLink(args, "Hitem"); - if (!pitem) + uint32 itemId; + if (!ExtractUint32KeyFromLink(&args, "Hitem", itemId)) { SendSysMessage(LANG_COMMAND_NEEDITEMSEND); SetSentErrorMessage(true); return false; } - uint32 itemId = atol(pitem); if (!sObjectMgr.RemoveVendorItem(vendor->GetEntry(), itemId)) { @@ -1631,45 +1669,33 @@ bool ChatHandler::HandleNpcDelVendorItemCommand(char* args) //add move for creature bool ChatHandler::HandleNpcAddMoveCommand(char* args) { - if (!*args) + uint32 lowguid; + if (!ExtractUint32KeyFromLink(&args, "Hcreature", lowguid)) return false; - char* guid_str = strtok(args, " "); - char* wait_str = strtok(NULL, " "); + uint32 wait; + if (!ExtractOptUInt32(&args, wait, 0)) + return false; - uint32 lowguid = atoi(guid_str); - - Creature* pCreature = NULL; - - /* FIXME: impossible without entry - if (lowguid) - pCreature = ObjectAccessor::GetCreature(*m_session->GetPlayer(),MAKE_GUID(lowguid,HIGHGUID_UNIT)); - */ - - // attempt check creature existence by DB data - if (!pCreature) + CreatureData const* data = sObjectMgr.GetCreatureData(lowguid); + if (!data) { - CreatureData const* data = sObjectMgr.GetCreatureData(lowguid); - if (!data) - { - PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid); - SetSentErrorMessage(true); - return false; - } + PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid); + SetSentErrorMessage(true); + return false; } - else - { - // obtain real GUID for DB operations - lowguid = pCreature->GetDBTableGUIDLow(); - } - - int wait = wait_str ? atoi(wait_str) : 0; - - if (wait < 0) - wait = 0; Player* player = m_session->GetPlayer(); + if (player->GetMapId() != data->mapid) + { + PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid); + SetSentErrorMessage(true); + return false; + } + + Creature* pCreature = player->GetMap()->GetCreature(ObjectGuid(HIGHGUID_UNIT, data->id, lowguid)); + sWaypointMgr.AddLastNode(lowguid, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), wait, 0); // update movement type @@ -1766,11 +1792,10 @@ bool ChatHandler::HandleNpcDeleteCommand(char* args) if (*args) { // number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hcreature"); - if (!cId) + uint32 lowguid; + if (!ExtractUint32KeyFromLink(&args, "Hcreature", lowguid)) return false; - uint32 lowguid = atoi(cId); if (!lowguid) return false; @@ -1807,46 +1832,30 @@ bool ChatHandler::HandleNpcMoveCommand(char* args) if (!pCreature) { // number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hcreature"); - if (!cId) + if (!ExtractUint32KeyFromLink(&args, "Hcreature", lowguid)) return false; - lowguid = atoi(cId); - - /* FIXME: impossibel without entry - if (lowguid) - pCreature = ObjectAccessor::GetCreature(*m_session->GetPlayer(),MAKE_GUID(lowguid,HIGHGUID_UNIT)); - */ - - // Attempting creature load from DB data - if (!pCreature) + CreatureData const* data = sObjectMgr.GetCreatureData(lowguid); + if (!data) { - CreatureData const* data = sObjectMgr.GetCreatureData(lowguid); - if (!data) - { - PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid); - SetSentErrorMessage(true); - return false; - } - - uint32 map_id = data->mapid; - - if (m_session->GetPlayer()->GetMapId() != map_id) - { - PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid); - SetSentErrorMessage(true); - return false; - } + PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid); + SetSentErrorMessage(true); + return false; } - else + + Player* player = m_session->GetPlayer(); + + if (player->GetMapId() != data->mapid) { - lowguid = pCreature->GetDBTableGUIDLow(); + PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid); + SetSentErrorMessage(true); + return false; } + + pCreature = player->GetMap()->GetCreature(ObjectGuid(HIGHGUID_UNIT, data->id, lowguid)); } else - { lowguid = pCreature->GetDBTableGUIDLow(); - } float x = m_session->GetPlayer()->GetPositionX(); float y = m_session->GetPlayer()->GetPositionY(); @@ -2451,7 +2460,7 @@ bool ChatHandler::HandleModifyMorphCommand(char* args) bool ChatHandler::HandleKickPlayerCommand(char *args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; if (m_session && target == m_session->GetPlayer()) @@ -2498,7 +2507,7 @@ bool ChatHandler::HandlePInfoCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args, &target, &target_guid,& target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; uint32 accId = 0; @@ -2594,7 +2603,7 @@ void ChatHandler::ShowTicket(uint64 guid, char const* text, char const* time) //ticket commands bool ChatHandler::HandleTicketCommand(char* args) { - char* px = strtok(args, " "); + char* px = ExtractLiteralArg(&args); // ticket if (!px) @@ -2647,16 +2656,14 @@ bool ChatHandler::HandleTicketCommand(char* args) // ticket respond if (strncmp(px, "respond", 8) == 0) { - char *name = strtok(NULL, " "); - - if (!name) + std::string plName = ExtractPlayerNameFromLink(&args); + if (plName.empty()) { SendSysMessage(LANG_CMD_SYNTAX); SetSentErrorMessage(true); return false; } - std::string plName = name; uint64 guid = sObjectMgr.GetPlayerGUIDByName(plName); if (!guid) @@ -2675,16 +2682,14 @@ bool ChatHandler::HandleTicketCommand(char* args) return false; } - char* response = strtok(NULL, ""); - - if (!response) + if (!*args) { SendSysMessage(LANG_CMD_SYNTAX); SetSentErrorMessage(true); return false; } - ticket->SetResponseText(response); + ticket->SetResponseText(args); if (Player* pl = sObjectMgr.GetPlayer(guid)) pl->GetSession()->SendGMResponse(ticket); @@ -2693,9 +2698,12 @@ bool ChatHandler::HandleTicketCommand(char* args) } // ticket #num - int num = atoi(px); - if (num > 0) + uint32 num; + if (!ExtractUInt32(&px, num)) { + if (num == 0) + return false; + QueryResult *result = CharacterDatabase.PQuery("SELECT guid,ticket_text,ticket_lastchange FROM character_ticket ORDER BY ticket_id ASC "_OFFSET_, num-1); if (!result) @@ -2717,7 +2725,7 @@ bool ChatHandler::HandleTicketCommand(char* args) } uint64 target_guid; - if (!extractPlayerTarget(px, NULL, &target_guid)) + if (!ExtractPlayerTarget(&px, NULL, &target_guid)) return false; // ticket $char_name @@ -2735,7 +2743,7 @@ bool ChatHandler::HandleTicketCommand(char* args) //dell all tickets bool ChatHandler::HandleDelTicketCommand(char *args) { - char* px = strtok(args, " "); + char* px = ExtractLiteralArg(&args); if (!px) return false; @@ -2747,11 +2755,14 @@ bool ChatHandler::HandleDelTicketCommand(char *args) return true; } - int num = (uint32)atoi(px); + uint32 num; // delticket #num - if (num > 0) + if (ExtractUInt32(&px, num)) { + if (num ==0) + return false; + QueryResult* result = CharacterDatabase.PQuery("SELECT guid FROM character_ticket ORDER BY ticket_id ASC "_OFFSET_,num-1); if (!result) { @@ -2780,7 +2791,7 @@ bool ChatHandler::HandleDelTicketCommand(char *args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(px, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&px, &target, &target_guid, &target_name)) return false; // delticket $char_name @@ -3940,7 +3951,7 @@ bool ChatHandler::HandleCharacterRenameCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; if (target) @@ -3974,7 +3985,7 @@ bool ChatHandler::HandleCharacterCustomizeCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; if (target) @@ -3997,7 +4008,7 @@ bool ChatHandler::HandleCharacterCustomizeCommand(char* args) bool ChatHandler::HandleCharacterReputationCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; LocaleConstant loc = GetSessionDbcLocale(); @@ -4179,12 +4190,10 @@ bool ChatHandler::HandleEventInfoCommand(char* args) return false; // id or [name] Shift-click form |color|Hgameevent:id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameevent"); - if (!cId) + uint32 event_id; + if (!ExtractUint32KeyFromLink(&args, "Hgameevent", event_id)) return false; - uint32 event_id = atoi(cId); - GameEventMgr::GameEventDataMap const& events = sGameEventMgr.GetEventMap(); if (event_id >=events.size()) @@ -4228,12 +4237,10 @@ bool ChatHandler::HandleEventStartCommand(char* args) return false; // id or [name] Shift-click form |color|Hgameevent:id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameevent"); - if (!cId) + uint32 event_id; + if (!ExtractUint32KeyFromLink(&args, "Hgameevent", event_id)) return false; - int32 event_id = atoi(cId); - GameEventMgr::GameEventDataMap const& events = sGameEventMgr.GetEventMap(); if (event_id < 1 || event_id >=(int32)events.size()) @@ -4270,12 +4277,10 @@ bool ChatHandler::HandleEventStopCommand(char* args) return false; // id or [name] Shift-click form |color|Hgameevent:id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameevent"); - if (!cId) + uint32 event_id; + if (!ExtractUint32KeyFromLink(&args, "Hgameevent", event_id)) return false; - int32 event_id = atoi(cId); - GameEventMgr::GameEventDataMap const& events = sGameEventMgr.GetEventMap(); if (event_id < 1 || event_id >=(int32)events.size()) @@ -4310,7 +4315,7 @@ bool ChatHandler::HandleEventStopCommand(char* args) bool ChatHandler::HandleCombatStopCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; // check online security @@ -4669,7 +4674,7 @@ bool ChatHandler::HandleServerCorpsesCommand(char* /*args*/) bool ChatHandler::HandleRepairitemsCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; // check online security @@ -4798,11 +4803,10 @@ bool ChatHandler::HandleLookupTitleCommand(char* args) bool ChatHandler::HandleTitlesAddCommand(char* args) { // number or [name] Shift-click form |color|Htitle:title_id|h[name]|h|r - char* id_p = extractKeyFromLink(args, "Htitle"); - if (!id_p) + uint32 id; + if (!ExtractUint32KeyFromLink(&args, "Htitle", id)) return false; - int32 id = atoi(id_p); if (id <= 0) { PSendSysMessage(LANG_INVALID_TITLE_ID, id); @@ -4845,11 +4849,10 @@ bool ChatHandler::HandleTitlesAddCommand(char* args) bool ChatHandler::HandleTitlesRemoveCommand(char* args) { // number or [name] Shift-click form |color|Htitle:title_id|h[name]|h|r - char* id_p = extractKeyFromLink(args, "Htitle"); - if (!id_p) + uint32 id; + if (!ExtractUint32KeyFromLink(&args, "Htitle", id)) return false; - int32 id = atoi(id_p); if (id <= 0) { PSendSysMessage(LANG_INVALID_TITLE_ID, id); @@ -4941,7 +4944,7 @@ bool ChatHandler::HandleTitlesSetMaskCommand(char* args) bool ChatHandler::HandleCharacterTitlesCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; LocaleConstant loc = GetSessionDbcLocale(); @@ -4978,11 +4981,10 @@ bool ChatHandler::HandleCharacterTitlesCommand(char* args) bool ChatHandler::HandleTitlesCurrentCommand(char* args) { // number or [name] Shift-click form |color|Htitle:title_id|h[name]|h|r - char* id_p = extractKeyFromLink(args, "Htitle"); - if (!id_p) + uint32 id; + if (!ExtractUint32KeyFromLink(&args, "Htitle", id)) return false; - int32 id = atoi(id_p); if (id <= 0) { PSendSysMessage(LANG_INVALID_TITLE_ID, id); diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index edb21be5a..19467b458 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -922,7 +922,7 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(char* args) std::string targetAccountName; Player* targetPlayer = NULL; - uint32 targetAccountId = extractAccountId(accountStr, &targetAccountName, &targetPlayer); + uint32 targetAccountId = ExtractAccountId(&accountStr, &targetAccountName, &targetPlayer); if (!targetAccountId) return false; @@ -970,18 +970,12 @@ bool ChatHandler::HandleAccountSetGmLevelCommand(char* args) /// Set password for account bool ChatHandler::HandleAccountSetPasswordCommand(char* args) { - if(!*args) - return false; - ///- Get the command line arguments std::string account_name; - uint32 targetAccountId = extractAccountId(args, &account_name); + uint32 targetAccountId = ExtractAccountId(&args, &account_name); if (!targetAccountId) return false; - // FIXME: temporary added until extractAccountId convertion to char** way - args = strtok (NULL,""); - // allow or quoted string with possible spaces or literal without spaces char *szPassword1 = ExtractQuotedOrLiteralArg(&args); char *szPassword2 = ExtractQuotedOrLiteralArg(&args); @@ -1041,19 +1035,31 @@ bool ChatHandler::HandleMaxSkillCommand(char* /*args*/) bool ChatHandler::HandleSetSkillCommand(char* args) { + Player * target = getSelectedPlayer(); + if (!target) + { + SendSysMessage(LANG_NO_CHAR_SELECTED); + SetSentErrorMessage(true); + return false; + } + // number or [name] Shift-click form |color|Hskill:skill_id|h[name]|h|r - char* skill_p = extractKeyFromLink(args, "Hskill"); + char* skill_p = ExtractKeyFromLink(&args, "Hskill"); if (!skill_p) return false; - char *level_p = strtok (NULL, " "); - - if (!level_p) + int32 skill; + if (!ExtractInt32(&skill_p, skill)) return false; - char *max_p = strtok (NULL, " "); + int32 level; + if (!ExtractInt32(&args, level)) + return false; + + int32 maxskill; + if (!ExtractOptInt32(&args, maxskill, target->GetPureMaxSkillValue(skill))) + return false; - int32 skill = atoi(skill_p); if (skill <= 0) { PSendSysMessage(LANG_INVALID_SKILL_ID, skill); @@ -1061,18 +1067,8 @@ bool ChatHandler::HandleSetSkillCommand(char* args) return false; } - int32 level = atol (level_p); - - Player * target = getSelectedPlayer(); - if(!target) - { - SendSysMessage(LANG_NO_CHAR_SELECTED); - SetSentErrorMessage(true); - return false; - } - SkillLineEntry const* sl = sSkillLineStore.LookupEntry(skill); - if(!sl) + if (!sl) { PSendSysMessage(LANG_INVALID_SKILL_ID, skill); SetSentErrorMessage(true); @@ -1081,20 +1077,18 @@ bool ChatHandler::HandleSetSkillCommand(char* args) std::string tNameLink = GetNameLink(target); - if(!target->GetSkillValue(skill)) + if (!target->GetSkillValue(skill)) { PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, sl->name[GetSessionDbcLocale()]); SetSentErrorMessage(true); return false; } - int32 max = max_p ? atol (max_p) : target->GetPureMaxSkillValue(skill); - - if( level <= 0 || level > max || max <= 0 ) + if (level <= 0 || level > maxskill || maxskill <= 0) return false; - target->SetSkill(skill, level, max); - PSendSysMessage(LANG_SET_SKILL, skill, sl->name[GetSessionDbcLocale()], tNameLink.c_str(), level, max); + target->SetSkill(skill, level, maxskill); + PSendSysMessage(LANG_SET_SKILL, skill, sl->name[GetSessionDbcLocale()], tNameLink.c_str(), level, maxskill); return true; } @@ -1105,12 +1099,13 @@ bool ChatHandler::HandleUnLearnCommand(char* args) return false; // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r - uint32 spell_id = extractSpellIdFromLink(args); + uint32 spell_id = ExtractSpellIdFromLink(&args); if (!spell_id) return false; - char const* allStr = strtok(NULL," "); - bool allRanks = allStr ? (strncmp(allStr, "all", strlen(allStr)) == 0) : false; + bool allRanks = ExtractLiteralArg(&args, "all") != NULL; + if (!allRanks && *args) // can be fail also at syntax error + return false; Player* target = getSelectedPlayer(); if(!target) @@ -1154,7 +1149,7 @@ bool ChatHandler::HandleCooldownCommand(char* args) else { // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell_id = extractSpellIdFromLink(args); + uint32 spell_id = ExtractSpellIdFromLink(&args); if (!spell_id) return false; @@ -2029,7 +2024,7 @@ bool ChatHandler::HandleLearnAllLangCommand(char* /*args*/) bool ChatHandler::HandleLearnAllDefaultCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; target->learnDefaultSpells(); @@ -2051,12 +2046,13 @@ bool ChatHandler::HandleLearnCommand(char* args) } // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell = extractSpellIdFromLink(args); + uint32 spell = ExtractSpellIdFromLink(&args); if (!spell || !sSpellStore.LookupEntry(spell)) return false; - char const* allStr = strtok(NULL," "); - bool allRanks = allStr ? (strncmp(allStr, "all", strlen(allStr)) == 0) : false; + bool allRanks = ExtractLiteralArg(&args, "all") != NULL; + if (!allRanks && *args) // can be fail also at syntax error + return false; SpellEntry const* spellInfo = sSpellStore.LookupEntry(spell); if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo,m_session->GetPlayer())) @@ -2090,49 +2086,29 @@ bool ChatHandler::HandleLearnCommand(char* args) bool ChatHandler::HandleAddItemCommand(char* args) { - if (!*args) + char* cId = ExtractKeyFromLink(&args, "Hitem"); + if(!cId) return false; uint32 itemId = 0; - - if(args[0]=='[') // [name] manual form + if (!ExtractUInt32(&cId, itemId)) // [name] manual form { - char* citemName = strtok(args, "]"); - - if (citemName && citemName[0]) + std::string itemName = cId; + WorldDatabase.escape_string(itemName); + QueryResult *result = WorldDatabase.PQuery("SELECT entry FROM item_template WHERE name = '%s'", itemName.c_str()); + if (!result) { - std::string itemName = citemName+1; - WorldDatabase.escape_string(itemName); - QueryResult *result = WorldDatabase.PQuery("SELECT entry FROM item_template WHERE name = '%s'", itemName.c_str()); - if (!result) - { - PSendSysMessage(LANG_COMMAND_COULDNOTFIND, citemName+1); - SetSentErrorMessage(true); - return false; - } - itemId = result->Fetch()->GetUInt16(); - delete result; + PSendSysMessage(LANG_COMMAND_COULDNOTFIND, cId); + SetSentErrorMessage(true); + return false; } - else - return false; - } - else // item_id or [name] Shift-click form |color|Hitem:item_id:0:0:0|h[name]|h|r - { - char* cId = extractKeyFromLink(args, "Hitem"); - if(!cId) - return false; - itemId = atol(cId); + itemId = result->Fetch()->GetUInt16(); + delete result; } - char* ccount = strtok(NULL, " "); - - int32 count = 1; - - if (ccount) - count = strtol(ccount, NULL, 10); - - if (count == 0) - count = 1; + int32 count; + if (!ExtractOptInt32(&args, count, 1)) + return false; Player* pl = m_session->GetPlayer(); Player* plTarget = getSelectedPlayer(); @@ -2196,15 +2172,10 @@ bool ChatHandler::HandleAddItemCommand(char* args) bool ChatHandler::HandleAddItemSetCommand(char* args) { - if (!*args) + uint32 itemsetId; + if (!ExtractUint32KeyFromLink(&args, "Hitemset", itemsetId)) return false; - char* cId = extractKeyFromLink(args, "Hitemset"); // number or [name] Shift-click form |color|Hitemset:itemset_id|h[name]|h|r - if (!cId) - return false; - - uint32 itemsetId = atol(cId); - // prevent generation all items with itemset field value '0' if (itemsetId == 0) { @@ -2265,15 +2236,11 @@ bool ChatHandler::HandleAddItemSetCommand(char* args) bool ChatHandler::HandleListItemCommand(char* args) { - if (!*args) + uint32 item_id; + if (!ExtractUint32KeyFromLink(&args, "Hitem", item_id)) return false; - char* cId = extractKeyFromLink(args, "Hitem"); - if(!cId) - return false; - - uint32 item_id = atol(cId); - if(!item_id) + if (!item_id) { PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id); SetSentErrorMessage(true); @@ -2288,10 +2255,8 @@ bool ChatHandler::HandleListItemCommand(char* args) return false; } - char* c_count = strtok(NULL, " "); - int count = c_count ? atol(c_count) : 10; - - if(count < 0) + uint32 count; + if (!ExtractOptUInt32(&args, count, 10)) return false; QueryResult *result; @@ -2338,7 +2303,7 @@ bool ChatHandler::HandleListItemCommand(char* args) item_guid,owner_name.c_str(),owner_guid,owner_acc,item_pos); } while (result->NextRow()); - int res_count = (int)result->GetRowCount(); + uint32 res_count = uint32(result->GetRowCount()); delete result; @@ -2388,7 +2353,7 @@ bool ChatHandler::HandleListItemCommand(char* args) item_guid,item_s_name.c_str(),item_s,item_s_acc,item_r_name.c_str(),item_r,item_r_acc,item_pos); } while (result->NextRow()); - int res_count = (int)result->GetRowCount(); + uint32 res_count = uint32(result->GetRowCount()); delete result; @@ -2465,7 +2430,7 @@ bool ChatHandler::HandleListItemCommand(char* args) PSendSysMessage(LANG_ITEMLIST_GUILD,item_guid,guild_name.c_str(),guild_guid,item_pos); } while (result->NextRow()); - int res_count = (int)result->GetRowCount(); + uint32 res_count = uint32(result->GetRowCount()); delete result; @@ -2489,15 +2454,11 @@ bool ChatHandler::HandleListItemCommand(char* args) bool ChatHandler::HandleListObjectCommand(char* args) { - if (!*args) - return false; - // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hgameobject_entry"); - if (!cId) + uint32 go_id; + if (!ExtractUint32KeyFromLink(&args, "Hgameobject_entry", go_id)) return false; - uint32 go_id = atol(cId); if (!go_id) { PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, go_id); @@ -2513,10 +2474,8 @@ bool ChatHandler::HandleListObjectCommand(char* args) return false; } - char* c_count = strtok(NULL, " "); - int count = c_count ? atol(c_count) : 10; - - if (count < 0) + uint32 count; + if (!ExtractOptUInt32(&args, count, 10)) return false; QueryResult *result; @@ -2565,15 +2524,11 @@ bool ChatHandler::HandleListObjectCommand(char* args) bool ChatHandler::HandleListCreatureCommand(char* args) { - if (!*args) - return false; - // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hcreature_entry"); - if (!cId) + uint32 cr_id; + if (!ExtractUint32KeyFromLink(&args, "Hcreature_entry", cr_id)) return false; - uint32 cr_id = atol(cId); if (!cr_id) { PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, cr_id); @@ -2589,10 +2544,8 @@ bool ChatHandler::HandleListCreatureCommand(char* args) return false; } - char* c_count = strtok(NULL, " "); - int count = c_count ? atol(c_count) : 10; - - if (count < 0) + uint32 count; + if (!ExtractOptUInt32(&args, count, 10)) return false; QueryResult *result; @@ -3275,19 +3228,14 @@ bool ChatHandler::HandleLookupTaxiNodeCommand(char * args) */ bool ChatHandler::HandleGuildCreateCommand(char* args) { - if(!*args) - return false; + // guildmaster name optional + char* guildMasterStr = ExtractOptNotLastArg(&args); - // if not guild name only (in "") then player name Player* target; - if(!extractPlayerTarget(*args!='"' ? args : NULL, &target)) + if (!ExtractPlayerTarget(&guildMasterStr, &target)) return false; - char* tail = *args!='"' ? strtok(NULL, "") : args; - if(!tail) - return false; - - char* guildStr = ExtractQuotedArg(&tail); + char* guildStr = ExtractQuotedArg(&args); if(!guildStr) return false; @@ -3314,19 +3262,15 @@ bool ChatHandler::HandleGuildCreateCommand(char* args) bool ChatHandler::HandleGuildInviteCommand(char *args) { - if (!*args) - return false; + // player name optional + char* nameStr = ExtractOptNotLastArg(&args); // if not guild name only (in "") then player name uint64 target_guid; - if(!extractPlayerTarget(*args!='"' ? args : NULL, NULL, &target_guid)) + if (!ExtractPlayerTarget(&nameStr, NULL, &target_guid)) return false; - char* tail = *args!='"' ? strtok(NULL, "") : args; - if(!tail) - return false; - - char* guildStr = ExtractQuotedArg(&tail); + char* guildStr = ExtractQuotedArg(&args); if(!guildStr) return false; @@ -3346,7 +3290,7 @@ bool ChatHandler::HandleGuildUninviteCommand(char *args) { Player* target; uint64 target_guid; - if (!extractPlayerTarget(args, &target, &target_guid)) + if (!ExtractPlayerTarget(&args, &target, &target_guid)) return false; uint32 glId = target ? target->GetGuildId () : Player::GetGuildIdFromDB (target_guid); @@ -3368,7 +3312,7 @@ bool ChatHandler::HandleGuildRankCommand(char *args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) return false; uint32 glId = target ? target->GetGuildId () : Player::GetGuildIdFromDB (target_guid); @@ -3416,7 +3360,8 @@ bool ChatHandler::HandleGetDistanceCommand(char* args) if (*args) { - if (uint64 guid = extractGuidFromLink(args)) + ObjectGuid guid = ExtractGuidFromLink(&args); + if (!guid.IsEmpty()) obj = (WorldObject*)m_session->GetPlayer()->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT); if(!obj) @@ -3485,20 +3430,17 @@ bool ChatHandler::HandleDamageCommand(char* args) if (!target->isAlive()) return true; - char* damageStr = strtok(args, " "); - if (!damageStr) + int32 damage_int; + if (!ExtractInt32(&args, damage_int)) return false; - int32 damage_int = atoi(damageStr); if(damage_int <=0) return true; uint32 damage = damage_int; - char* schoolStr = strtok(NULL, " "); - // flat melee damage without resistence/etc reduction - if (!schoolStr) + if (!*args) { m_session->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); if (target != m_session->GetPlayer()) @@ -3506,7 +3448,10 @@ bool ChatHandler::HandleDamageCommand(char* args) return true; } - uint32 school = schoolStr ? atoi(schoolStr) : SPELL_SCHOOL_NORMAL; + uint32 school; + if (!ExtractUInt32(&args, school)) + return false; + if(school >= MAX_SPELL_SCHOOL) return false; @@ -3515,10 +3460,8 @@ bool ChatHandler::HandleDamageCommand(char* args) if ( schoolmask & SPELL_SCHOOL_MASK_NORMAL ) damage = m_session->GetPlayer()->CalcArmorReducedDamage(target, damage); - char* spellStr = strtok(NULL, " "); - // melee damage by specific school - if (!spellStr) + if (!*args) { uint32 absorb = 0; uint32 resist = 0; @@ -3539,7 +3482,7 @@ bool ChatHandler::HandleDamageCommand(char* args) // non-melee damage // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellid = extractSpellIdFromLink((char*)args); + uint32 spellid = ExtractSpellIdFromLink(&args); if (!spellid || !sSpellStore.LookupEntry(spellid)) return false; @@ -3573,7 +3516,7 @@ bool ChatHandler::HandleReviveCommand(char* args) { Player* target; uint64 target_guid; - if (!extractPlayerTarget(args, &target, &target_guid)) + if (!ExtractPlayerTarget(&args, &target, &target_guid)) return false; if (target) @@ -3599,7 +3542,7 @@ bool ChatHandler::HandleAuraCommand(char* args) } // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellID = extractSpellIdFromLink(args); + uint32 spellID = ExtractSpellIdFromLink(&args); if (SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellID)) { @@ -3644,8 +3587,8 @@ bool ChatHandler::HandleUnAuraCommand(char* args) } // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spellID = extractSpellIdFromLink(args); - if(!spellID) + uint32 spellID = ExtractSpellIdFromLink(&args); + if (!spellID) return false; target->RemoveAurasDueToSpell(spellID); @@ -4049,7 +3992,7 @@ bool ChatHandler::HandleCharacterLevelCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) return false; int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid); @@ -4095,7 +4038,7 @@ bool ChatHandler::HandleLevelUpCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) return false; int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid); @@ -4444,7 +4387,7 @@ bool ChatHandler::HandleResetAchievementsCommand(char* args) { Player* target; uint64 target_guid; - if (!extractPlayerTarget(args, &target, &target_guid)) + if (!ExtractPlayerTarget(&args, &target, &target_guid)) return false; if(target) @@ -4458,7 +4401,7 @@ bool ChatHandler::HandleResetAchievementsCommand(char* args) bool ChatHandler::HandleResetHonorCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; target->SetUInt32Value(PLAYER_FIELD_KILLS, 0); @@ -4512,7 +4455,7 @@ static bool HandleResetStatsOrLevelHelper(Player* player) bool ChatHandler::HandleResetLevelCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; if (!HandleResetStatsOrLevelHelper(target)) @@ -4545,7 +4488,7 @@ bool ChatHandler::HandleResetLevelCommand(char* args) bool ChatHandler::HandleResetStatsCommand(char* args) { Player* target; - if (!extractPlayerTarget(args, &target)) + if (!ExtractPlayerTarget(&args, &target)) return false; if (!HandleResetStatsOrLevelHelper(target)) @@ -4565,7 +4508,7 @@ bool ChatHandler::HandleResetSpellsCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; if (target) @@ -4590,7 +4533,7 @@ bool ChatHandler::HandleResetSpecsCommand(char* args) Player* target; uint64 target_guid; std::string target_name; - if (!extractPlayerTarget(args, &target, &target_guid, &target_name)) + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; if (target) @@ -4625,7 +4568,7 @@ bool ChatHandler::HandleResetTalentsCommand(char* args) { Player* target; std::string target_name; - if (!extractPlayerTarget(args, &target, NULL, &target_name)) + if (!ExtractPlayerTarget(&args, &target, NULL, &target_name)) { // Try reset talents as Hunter Pet Creature* creature = getSelectedCreature(); @@ -4866,14 +4809,11 @@ bool ChatHandler::HandleQuestAddCommand(char* args) // .addquest #entry' // number or [name] Shift-click form |color|Hquest:quest_id:quest_level|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hquest"); - if (!cId) + uint32 entry; + if (!ExtractUint32KeyFromLink(&args, "Hquest", entry)) return false; - uint32 entry = atol(cId); - Quest const* pQuest = sObjectMgr.GetQuestTemplate(entry); - if(!pQuest) { PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND,entry); @@ -4882,7 +4822,7 @@ bool ChatHandler::HandleQuestAddCommand(char* args) } // check item starting quest (it can work incorrectly if added without item in inventory) - for (uint32 id = 0; id < sItemStorage.MaxEntry; id++) + for (uint32 id = 0; id < sItemStorage.MaxEntry; ++id) { ItemPrototype const *pProto = sItemStorage.LookupEntry(id); if (!pProto) @@ -4897,12 +4837,12 @@ bool ChatHandler::HandleQuestAddCommand(char* args) } // ok, normal (creature/GO starting) quest - if( player->CanAddQuest( pQuest, true ) ) + if (player->CanAddQuest(pQuest, true)) { - player->AddQuest( pQuest, NULL ); + player->AddQuest(pQuest, NULL); - if ( player->CanCompleteQuest( entry ) ) - player->CompleteQuest( entry ); + if (player->CanCompleteQuest(entry)) + player->CompleteQuest(entry); } return true; @@ -4920,12 +4860,10 @@ bool ChatHandler::HandleQuestRemoveCommand(char* args) // .removequest #entry' // number or [name] Shift-click form |color|Hquest:quest_id:quest_level|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hquest"); - if (!cId) + uint32 entry; + if (!ExtractUint32KeyFromLink(&args, "Hquest", entry)) return false; - uint32 entry = atol(cId); - Quest const* pQuest = sObjectMgr.GetQuestTemplate(entry); if (!pQuest) @@ -4970,12 +4908,10 @@ bool ChatHandler::HandleQuestCompleteCommand(char* args) // .quest complete #entry // number or [name] Shift-click form |color|Hquest:quest_id:quest_level|h[name]|h|r - char* cId = extractKeyFromLink(args, "Hquest"); - if (!cId) + uint32 entry; + if (!ExtractUint32KeyFromLink(&args, "Hquest", entry)) return false; - uint32 entry = atol(cId); - Quest const* pQuest = sObjectMgr.GetQuestTemplate(entry); // If player doesn't have the quest @@ -5202,7 +5138,7 @@ bool ChatHandler::HandleBanInfoAccountCommand(char* args) return false; std::string account_name; - uint32 accountid = extractAccountId(args, &account_name); + uint32 accountid = ExtractAccountId(&args, &account_name); if (!accountid) return false; @@ -5213,7 +5149,7 @@ bool ChatHandler::HandleBanInfoCharacterCommand(char* args) { Player* target; uint64 target_guid; - if (!extractPlayerTarget(args, &target, &target_guid)) + if (!ExtractPlayerTarget(&args, &target, &target_guid)) return false; uint32 accountid = target ? target->GetSession()->GetAccountId() : sObjectMgr.GetPlayerAccountIdByGUID(target_guid); @@ -5541,27 +5477,20 @@ bool ChatHandler::HandleGMFlyCommand(char* args) bool ChatHandler::HandlePDumpLoadCommand(char *args) { - if (!*args) - return false; - - char* file = strtok(args, " "); + char* file = ExtractQuotedOrLiteralArg(&args); if (!file) return false; - char* account = strtok(NULL, " "); - if (!account) - return false; - - char* name_str = strtok(NULL, " "); - std::string account_name; - uint32 account_id = extractAccountId(account, &account_name); + uint32 account_id = ExtractAccountId(&args, &account_name); if (!account_id) return false; - char* guid_str = NULL; + char* name_str = ExtractLiteralArg(&args); + uint32 guid = 0; std::string name; + if (name_str) { name = name_str; @@ -5580,26 +5509,24 @@ bool ChatHandler::HandlePDumpLoadCommand(char *args) return false; } - guid_str = strtok(NULL, " "); - } - - uint32 guid = 0; - - if (guid_str) - { - guid = atoi(guid_str); - if (!guid) + if (*args) { - PSendSysMessage(LANG_INVALID_CHARACTER_GUID); - SetSentErrorMessage(true); - return false; - } + if (!ExtractUInt32(&args, guid)) + return false; - if (sObjectMgr.GetPlayerAccountIdByGUID(guid)) - { - PSendSysMessage(LANG_CHARACTER_GUID_IN_USE,guid); - SetSentErrorMessage(true); - return false; + if (!guid) + { + PSendSysMessage(LANG_INVALID_CHARACTER_GUID); + SetSentErrorMessage(true); + return false; + } + + if (sObjectMgr.GetPlayerAccountIdByGUID(guid)) + { + PSendSysMessage(LANG_CHARACTER_GUID_IN_USE,guid); + SetSentErrorMessage(true); + return false; + } } } @@ -5634,19 +5561,17 @@ bool ChatHandler::HandlePDumpWriteCommand(char *args) if (!*args) return false; - char* file = strtok(args, " "); - char* p2 = strtok(NULL, " "); - - if(!file || !p2) + char* file = ExtractQuotedOrLiteralArg(&args); + if(!file) return false; + char* p2 = ExtractLiteralArg(&args); + uint32 guid; // character name can't start from number - if (isNumeric(p2)) - guid = atoi(p2); - else + if (!ExtractUInt32(&args, guid)) { - std::string name = extractPlayerNameFromLink(p2); + std::string name = ExtractPlayerNameFromLink(&p2); if(name.empty()) { SendSysMessage(LANG_PLAYER_NOT_FOUND); @@ -5767,12 +5692,13 @@ bool ChatHandler::HandleServerPLimitCommand(char *args) { if (*args) { - char* param = strtok(args, " "); + char* param = ExtractLiteralArg(&args); if (!param) return false; int l = strlen(param); + int val; if( strncmp(param,"player",l) == 0 ) sWorld.SetPlayerLimit(-SEC_PLAYER); else if(strncmp(param,"moderator",l) == 0 ) @@ -5783,13 +5709,15 @@ bool ChatHandler::HandleServerPLimitCommand(char *args) sWorld.SetPlayerLimit(-SEC_ADMINISTRATOR); else if(strncmp(param,"reset",l) == 0 ) sWorld.SetPlayerLimit( sConfig.GetIntDefault("PlayerLimit", DEFAULT_PLAYER_LIMIT) ); - else + else if(ExtractInt32(¶m, val)) { - int val = atoi(param); - if(val < -SEC_ADMINISTRATOR) val = -SEC_ADMINISTRATOR; + if(val < -SEC_ADMINISTRATOR) + val = -SEC_ADMINISTRATOR; sWorld.SetPlayerLimit(val); } + else + return false; // kick all low security level players if(sWorld.GetPlayerAmountLimit() > SEC_PLAYER) @@ -5828,7 +5756,7 @@ bool ChatHandler::HandleCastCommand(char* args) } // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell = extractSpellIdFromLink(args); + uint32 spell = ExtractSpellIdFromLink(&args); if (!spell) return false; @@ -5843,15 +5771,9 @@ bool ChatHandler::HandleCastCommand(char* args) return false; } - char* trig_str = strtok(NULL, " "); - if(trig_str) - { - int l = strlen(trig_str); - if(strncmp(trig_str,"triggered",l) != 0 ) - return false; - } - - bool triggered = (trig_str != NULL); + bool triggered = ExtractLiteralArg(&args, "triggered") != NULL; + if (!triggered && *args) // can be fail also at syntax error + return false; m_session->GetPlayer()->CastSpell(target,spell,triggered); @@ -5871,19 +5793,13 @@ bool ChatHandler::HandleCastBackCommand(char* args) // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell = extractSpellIdFromLink(args); + uint32 spell = ExtractSpellIdFromLink(&args); if (!spell || !sSpellStore.LookupEntry(spell)) return false; - char* trig_str = strtok(NULL, " "); - if(trig_str) - { - int l = strlen(trig_str); - if(strncmp(trig_str,"triggered",l) != 0 ) - return false; - } - - bool triggered = (trig_str != NULL); + bool triggered = ExtractLiteralArg(&args, "triggered") != NULL; + if (!triggered && *args) // can be fail also at syntax error + return false; caster->SetFacingToObject(m_session->GetPlayer()); @@ -5898,7 +5814,7 @@ bool ChatHandler::HandleCastDistCommand(char* args) return false; // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell = extractSpellIdFromLink(args); + uint32 spell = ExtractSpellIdFromLink(&args); if (!spell) return false; @@ -5913,22 +5829,13 @@ bool ChatHandler::HandleCastDistCommand(char* args) return false; } - char *distStr = strtok(NULL, " "); + float dist; + if (!ExtractFloat(&args, dist)) + return false; - float dist = 0; - - if(distStr) - sscanf(distStr, "%f", &dist); - - char* trig_str = strtok(NULL, " "); - if(trig_str) - { - int l = strlen(trig_str); - if(strncmp(trig_str,"triggered",l) != 0 ) - return false; - } - - bool triggered = (trig_str != NULL); + bool triggered = ExtractLiteralArg(&args, "triggered") != NULL; + if (!triggered && *args) // can be fail also at syntax error + return false; float x,y,z; m_session->GetPlayer()->GetClosePoint(x,y,z,dist); @@ -5956,19 +5863,13 @@ bool ChatHandler::HandleCastTargetCommand(char* args) } // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell = extractSpellIdFromLink(args); + uint32 spell = ExtractSpellIdFromLink(&args); if (!spell || !sSpellStore.LookupEntry(spell)) return false; - char* trig_str = strtok(NULL, " "); - if (trig_str) - { - int l = strlen(trig_str); - if (strncmp(trig_str,"triggered",l) != 0 ) - return false; - } - - bool triggered = (trig_str != NULL); + bool triggered = ExtractLiteralArg(&args, "triggered") != NULL; + if (!triggered && *args) // can be fail also at syntax error + return false; caster->SetFacingToObject(m_session->GetPlayer()); @@ -5993,13 +5894,10 @@ bool ChatHandler::HandleComeToMeCommand(char *args) return false; } - char* newFlagStr = strtok(args, " "); - - if (!newFlagStr) + uint32 newFlags; + if (!ExtractUInt32(&args, newFlags)) return false; - uint32 newFlags = atoi(newFlagStr); - caster->SetSplineFlags(SplineFlags(newFlags)); Player* pl = m_session->GetPlayer(); @@ -6023,7 +5921,7 @@ bool ChatHandler::HandleCastSelfCommand(char* args) } // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint32 spell = extractSpellIdFromLink(args); + uint32 spell = ExtractSpellIdFromLink(&args); if (!spell) return false; @@ -6038,7 +5936,11 @@ bool ChatHandler::HandleCastSelfCommand(char* args) return false; } - target->CastSpell(target,spell,false); + bool triggered = ExtractLiteralArg(&args, "triggered") != NULL; + if (!triggered && *args) // can be fail also at syntax error + return false; + + target->CastSpell(target, spell, triggered); return true; } @@ -6286,7 +6188,7 @@ bool ChatHandler::HandleAccountCharactersCommand(char* args) ///- Get the command line arguments std::string account_name; Player* target = NULL; // only for triggering use targeted player account - uint32 account_id = extractAccountId(args, &account_name, &target); + uint32 account_id = ExtractAccountId(&args, &account_name, &target); if (!account_id ) return false; @@ -6303,7 +6205,7 @@ bool ChatHandler::HandleAccountSetAddonCommand(char* args) char* accountStr = ExtractOptNotLastArg(&args); std::string account_name; - uint32 account_id = extractAccountId(accountStr, &account_name); + uint32 account_id = ExtractAccountId(&accountStr, &account_name); if (!account_id ) return false; @@ -6330,18 +6232,14 @@ bool ChatHandler::HandleSendItemsCommand(char* args) Player* receiver; uint64 receiver_guid; std::string receiver_name; - if (!extractPlayerTarget(args, &receiver, &receiver_guid, &receiver_name)) + if (!ExtractPlayerTarget(&args, &receiver, &receiver_guid, &receiver_name)) return false; - char* tail = strtok(NULL, ""); - if (!tail) - return false; - - char* msgSubject = ExtractQuotedArg(&tail); + char* msgSubject = ExtractQuotedArg(&args); if (!msgSubject) return false; - char* msgText = ExtractQuotedArg(&tail); + char* msgText = ExtractQuotedArg(&args); if (!msgText) return false; @@ -6355,18 +6253,21 @@ bool ChatHandler::HandleSendItemsCommand(char* args) ItemPairs items; // get from tail next item str - while(char* itemStr = strtok(tail, " ")) + while(char* itemStr = ExtractArg(&args)) { - // and get new tail - tail = strtok(NULL, ""); - // parse item str - char* itemIdStr = strtok(itemStr, ":"); - char* itemCountStr = strtok(NULL, " "); + uint32 item_id = 0; + uint32 item_count = 1; + if (sscanf(itemStr, "%u:%u", item_id, item_count) != 2) + if (sscanf(itemStr, "%u", item_id) != 1) + return false; - uint32 item_id = atoi(itemIdStr); if(!item_id) + { + PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id); + SetSentErrorMessage(true); return false; + } ItemPrototype const* item_proto = ObjectMgr::GetItemPrototype(item_id); if(!item_proto) @@ -6376,10 +6277,9 @@ bool ChatHandler::HandleSendItemsCommand(char* args) return false; } - uint32 item_count = itemCountStr ? atoi(itemCountStr) : 1; if (item_count < 1 || (item_proto->MaxCount > 0 && item_count > uint32(item_proto->MaxCount))) { - PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, item_count,item_id); + PSendSysMessage(LANG_COMMAND_INVALID_ITEM_COUNT, item_count, item_id); SetSentErrorMessage(true); return false; } @@ -6430,22 +6330,21 @@ bool ChatHandler::HandleSendMoneyCommand(char* args) Player* receiver; uint64 receiver_guid; std::string receiver_name; - if (!extractPlayerTarget(args, &receiver, &receiver_guid, &receiver_name)) + if (!ExtractPlayerTarget(&args, &receiver, &receiver_guid, &receiver_name)) return false; - char* tail = strtok(NULL, ""); - if (!tail) - return false; - - char* msgSubject = ExtractQuotedArg(&tail); + char* msgSubject = ExtractQuotedArg(&args); if (!msgSubject) return false; - char* msgText = ExtractQuotedArg(&tail); + char* msgText = ExtractQuotedArg(&args); if (!msgText) return false; - int32 money = tail ? atoi(tail) : 0; + uint32 money; + if (!ExtractUInt32(&args, money)) + return false; + if (money <= 0) return false; @@ -6470,11 +6369,11 @@ bool ChatHandler::HandleSendMessageCommand(char* args) { ///- Find the player Player *rPlayer; - if (!extractPlayerTarget(args, &rPlayer)) + if (!ExtractPlayerTarget(&args, &rPlayer)) return false; - char* msg_str = strtok(NULL, ""); - if (!msg_str) + ///- message + if (!*args) return false; ///- Check that he is not logging out. @@ -6487,12 +6386,12 @@ bool ChatHandler::HandleSendMessageCommand(char* args) ///- Send the message //Use SendAreaTriggerMessage for fastest delivery. - rPlayer->GetSession()->SendAreaTriggerMessage("%s", msg_str); + rPlayer->GetSession()->SendAreaTriggerMessage("%s", args); rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r"); //Confirmation message std::string nameLink = GetNameLink(rPlayer); - PSendSysMessage(LANG_SENDMESSAGE,nameLink.c_str(),msg_str); + PSendSysMessage(LANG_SENDMESSAGE, nameLink.c_str(), args); return true; } diff --git a/src/mangosd/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp index 76d549d83..ef08cac59 100644 --- a/src/mangosd/CliRunnable.cpp +++ b/src/mangosd/CliRunnable.cpp @@ -65,7 +65,7 @@ bool ChatHandler::HandleAccountDeleteCommand(char* args) return false; std::string account_name; - uint32 account_id = extractAccountId(args, &account_name); + uint32 account_id = ExtractAccountId(&args, &account_name); if (!account_id) return false; @@ -409,44 +409,31 @@ bool ChatHandler::HandleCharacterDeletedOldCommand(char* args) bool ChatHandler::HandleCharacterEraseCommand(char* args) { - if (!*args) + char* nameStr = ExtractLiteralArg(&args); + if (!*nameStr) return false; - char *character_name_str = strtok(args," "); - if(!character_name_str) + Player* target; + uint64 target_guid; + std::string target_name; + if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) return false; - std::string character_name = character_name_str; - if(!normalizePlayerName(character_name)) - return false; - - uint64 character_guid; uint32 account_id; - if (Player *player = sObjectMgr.GetPlayer(character_name.c_str())) + if (target) { - character_guid = player->GetGUID(); - account_id = player->GetSession()->GetAccountId(); - player->GetSession()->KickPlayer(); + account_id = target->GetSession()->GetAccountId(); + target->GetSession()->KickPlayer(); } else - { - character_guid = sObjectMgr.GetPlayerGUIDByName(character_name); - if(!character_guid) - { - PSendSysMessage(LANG_NO_PLAYER,character_name.c_str()); - SetSentErrorMessage(true); - return false; - } - - account_id = sObjectMgr.GetPlayerAccountIdByGUID(character_guid); - } + account_id = sObjectMgr.GetPlayerAccountIdByGUID(target_guid); std::string account_name; sAccountMgr.GetName (account_id,account_name); - Player::DeleteFromDB(character_guid, account_id, true, true); - PSendSysMessage(LANG_CHARACTER_DELETED,character_name.c_str(),GUID_LOPART(character_guid),account_name.c_str(), account_id); + Player::DeleteFromDB(target_guid, account_id, true, true); + PSendSysMessage(LANG_CHARACTER_DELETED, target_name.c_str(), GUID_LOPART(target_guid), account_name.c_str(), account_id); return true; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3d30fd14c..9f2d60cec 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10333" + #define REVISION_NR "10334" #endif // __REVISION_NR_H__