Index: src/game/Chat.cpp =================================================================== --- src/game/Chat.cpp (revision 5740) +++ src/game/Chat.cpp (working copy) @@ -388,6 +388,7 @@ { "castback", SEC_ADMINISTRATOR, &ChatHandler::HandleCastBackCommand, "", NULL }, { "casttarget", SEC_ADMINISTRATOR, &ChatHandler::HandleCastTargetCommand, "", NULL }, { "cometome", SEC_ADMINISTRATOR, &ChatHandler::HandleComeToMeCommand, "", NULL }, + { "addrandomwalk", SEC_ADMINISTRATOR, &ChatHandler::HandleAddRandomWalkCommand, "", NULL }, //! Development Commands { "setvalue", SEC_ADMINISTRATOR, &ChatHandler::HandleSetValue, "", NULL }, Index: src/game/Chat.h =================================================================== --- src/game/Chat.h (revision 5740) +++ src/game/Chat.h (working copy) @@ -337,6 +337,7 @@ bool HandleCastBackCommand(const char *args); bool HandleCastTargetCommand(const char *args); bool HandleComeToMeCommand(const char *args); + bool HandleAddRandomWalkCommand(const char *args); //! Development Commands bool HandleSetValue(const char* args); Index: src/game/Language.h =================================================================== --- src/game/Language.h (revision 5740) +++ src/game/Language.h (working copy) @@ -557,6 +557,8 @@ LANG_PLAYER_AFK = 708, LANG_PLAYER_DND_DEFAULT = 709, LANG_PLAYER_AFK_DEFAULT = 710, + + LANG_ADD_RANDOM_WALK = 711, }; /* NOT USED VALUES Index: src/game/Level2.cpp =================================================================== --- src/game/Level2.cpp (revision 5740) +++ src/game/Level2.cpp (working copy) @@ -3408,3 +3408,68 @@ target->UpdateHonorFields(true); return true; } + +/** + * Implementation of AddRandomWalk command, which does the following: + * Sets creature movement type to "waypoint" + * Adds current position as a waypoint + * Adds random wait time from defined range for the waypoint + * + * Purpose: ease the hand fixing of the creature random movements :) + */ +bool ChatHandler::HandleAddRandomWalkCommand(const char *args) +{ + Creature* target = getSelectedCreature(); + + if(!target) + { + SendSysMessage(LANG_SELECT_CREATURE); + return true; + } + + if (!*args) + return false; + + char* minTime = strtok((char*)args, " "); + char* maxTime = strtok((char*)NULL, " "); + + if(!minTime) + return false; + + if(!maxTime) + return false; + + uint32 i_minTime = (uint32)atoi(minTime); + uint32 i_maxTime = (uint32)atoi(maxTime); + + uint32 time = urand(i_minTime, i_maxTime); + + uint32 point; + + QueryResult *result = WorldDatabase.PQuery( "SELECT MAX(point) FROM creature_movement WHERE id = '%u'",target->GetDBTableGUIDLow()); + if( result ) + { + point = (*result)[0].GetUInt32()+1; + + delete result; + } + else + point = 0; + + Player* player = m_session->GetPlayer(); + + WorldDatabase.PExecuteLog("INSERT INTO creature_movement (id,point,position_x,position_y,position_z,waittime) VALUES ('%u','%u','%f', '%f', '%f','%u')", + target->GetDBTableGUIDLow(), point, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), time); + WorldDatabase.PExecuteLog("UPDATE creature SET MovementType = '%u' WHERE guid = '%u'", WAYPOINT_MOTION_TYPE,target->GetDBTableGUIDLow()); + + target->SetDefaultMovementType(WAYPOINT_MOTION_TYPE); + target->GetMotionMaster()->Initialize(); + if(target->isAlive()) // dead creature will reset movement generator at respawn + { + target->setDeathState(JUST_DIED); + target->RemoveCorpse(); + target->Respawn(); + } + + PSendSysMessage(LANG_ADD_RANDOM_WALK, target->GetDBTableGUIDLow(), i_minTime, i_maxTime, time); +} \ No newline at end of file