diff options
Diffstat (limited to 'src/game/Level2.cpp')
-rw-r--r-- | src/game/Level2.cpp | 537 |
1 files changed, 448 insertions, 89 deletions
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index d926c153e65..b16d45dd0ab 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -10,12 +10,12 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "Common.h" @@ -36,6 +36,7 @@ #include "GameEvent.h" #include "SpellMgr.h" #include "AccountMgr.h" +//#include "GMTicketMgr.h" #include "WaypointManager.h" #include "Util.h" #include <cctype> @@ -87,27 +88,11 @@ bool ChatHandler::HandleMuteCommand(const char* args) Player *chr = objmgr.GetPlayer(guid); - // check security - uint32 account_id = 0; - uint32 security = 0; - - if (chr) - { - account_id = chr->GetSession()->GetAccountId(); - security = chr->GetSession()->GetSecurity(); - } - else - { - account_id = objmgr.GetPlayerAccountIdByGUID(guid); - security = accmgr.GetSecurity(account_id); - } - - if(m_session && security >= m_session->GetSecurity()) - { - SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); - SetSentErrorMessage(true); + // must have strong lesser security level + if(HasLowerSecurity (chr,guid,true)) return false; - } + + uint32 account_id = chr ? chr->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(guid); time_t mutetime = time(NULL) + notspeaktime*60; @@ -153,27 +138,11 @@ bool ChatHandler::HandleUnmuteCommand(const char* args) Player *chr = objmgr.GetPlayer(guid); - // check security - uint32 account_id = 0; - uint32 security = 0; - - if (chr) - { - account_id = chr->GetSession()->GetAccountId(); - security = chr->GetSession()->GetSecurity(); - } - else - { - account_id = objmgr.GetPlayerAccountIdByGUID(guid); - security = accmgr.GetSecurity(account_id); - } - - if(m_session && security >= m_session->GetSecurity()) - { - SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); - SetSentErrorMessage(true); + // must have strong lesser security level + if(HasLowerSecurity (chr,guid,true)) return false; - } + + uint32 account_id = chr ? chr->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(guid); if (chr) { @@ -562,7 +531,7 @@ bool ChatHandler::HandleLookupFactionCommand(const char* args) return false; // Can be NULL at console call - Player *target = getSelectedPlayer (); + Player *target = getSelectedPlayer (); std::string namepart = args; std::wstring wnamepart; @@ -581,12 +550,13 @@ bool ChatHandler::HandleLookupFactionCommand(const char* args) if (factionEntry) { FactionState const* repState = NULL; - if(target) - { - FactionStateList::const_iterator repItr = target->m_factions.find (factionEntry->reputationListID); - if(repItr != target->m_factions.end()) - repState = &repItr->second; - } + if(target) + { + FactionStateList::const_iterator repItr = target->m_factions.find (factionEntry->reputationListID); + if(repItr != target->m_factions.end()) + repState = &repItr->second; + } + int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale(); std::string name = factionEntry->name[loc]; @@ -616,9 +586,9 @@ bool ChatHandler::HandleLookupFactionCommand(const char* args) // or "id - [faction] [no reputation]" format std::ostringstream ss; if (m_session) - ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << " " << localeNames[loc] << "]|h|r"; - else - ss << id << " - " << name << " " << localeNames[loc]; + ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << " " << localeNames[loc] << "]|h|r"; + else + ss << id << " - " << name << " " << localeNames[loc]; if (repState) // and then target!=NULL also { @@ -668,6 +638,10 @@ bool ChatHandler::HandleModifyRepCommand(const char * args) return false; } + // check online security + if (HasLowerSecurity(target, 0)) + return false; + char* factionTxt = extractKeyFromLink((char*)args,"Hfaction"); if(!factionTxt) return false; @@ -749,7 +723,7 @@ bool ChatHandler::HandleModifyRepCommand(const char * args) return true; } -bool ChatHandler::HandleNameCommand(const char* args) +bool ChatHandler::HandleNameCommand(const char* /*args*/) { /* Temp. disabled if(!*args) @@ -949,7 +923,7 @@ bool ChatHandler::HandleNpcDeleteCommand(const char* args) else unit = getSelectedCreature(); - if(!unit || unit->isPet() || unit->isTotem()) + if(!unit || unit->isPet() || unit->isTotem() || unit->isVehicle()) { SendSysMessage(LANG_SELECT_CREATURE); SetSentErrorMessage(true); @@ -1056,14 +1030,14 @@ bool ChatHandler::HandleTurnObjectCommand(const char* args) float rot2 = sin(o/2); float rot3 = cos(o/2); - Map* map = MapManager::Instance().GetMap(obj->GetMapId(),obj); + Map* map = obj->GetMap(); map->Remove(obj,false); obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o); obj->SetFloatValue(GAMEOBJECT_FACING, o); - obj->SetFloatValue(GAMEOBJECT_ROTATION+2, rot2); - obj->SetFloatValue(GAMEOBJECT_ROTATION+3, rot3); + obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rot2); + obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rot3); map->Add(obj); @@ -1140,7 +1114,7 @@ bool ChatHandler::HandleNpcMoveCommand(const char* args) const_cast<CreatureData*>(data)->posZ = z; const_cast<CreatureData*>(data)->orientation = o; } - MapManager::Instance().GetMap(pCreature->GetMapId(),pCreature)->CreatureRelocation(pCreature,x, y, z,o); + pCreature->GetMap()->CreatureRelocation(pCreature,x, y, z,o); pCreature->GetMotionMaster()->Initialize(); if(pCreature->isAlive()) // dead creature will reset movement generator at respawn { @@ -1187,7 +1161,7 @@ bool ChatHandler::HandleMoveObjectCommand(const char* args) { Player *chr = m_session->GetPlayer(); - Map* map = MapManager::Instance().GetMap(obj->GetMapId(),obj); + Map* map = obj->GetMap(); map->Remove(obj,false); obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation()); @@ -1213,7 +1187,7 @@ bool ChatHandler::HandleMoveObjectCommand(const char* args) return false; } - Map* map = MapManager::Instance().GetMap(obj->GetMapId(),obj); + Map* map = obj->GetMap(); map->Remove(obj,false); obj->Relocate(x, y, z, obj->GetOrientation()); @@ -1239,6 +1213,11 @@ bool ChatHandler::HandleDeMorphCommand(const char* /*args*/) if(!target) target = m_session->GetPlayer(); + + // check online security + else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0)) + return false; + target->DeMorph(); return true; @@ -1314,7 +1293,6 @@ bool ChatHandler::HandleDelVendorItemCommand(const char* args) } uint32 itemId = atol(pitem); - if(!objmgr.RemoveVendorItem(vendor->GetEntry(),itemId)) { PSendSysMessage(LANG_ITEM_NOT_IN_LIST,itemId); @@ -1629,6 +1607,10 @@ bool ChatHandler::HandleMorphCommand(const char* args) if(!target) target = m_session->GetPlayer(); + // check online security + else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0)) + return false; + target->SetDisplayId(display_id); return true; @@ -1703,7 +1685,11 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args) SetSentErrorMessage(true); return false; } - + + // check online security + if (HasLowerSecurity(player, 0)) + return false; + if(sWorld.getConfig(CONFIG_SHOW_KICK_IN_WORLD) == 1) { @@ -1829,6 +1815,10 @@ bool ChatHandler::HandlePInfoCommand(const char* args) // get additional information from Player object if(target) { + // check online security + if (HasLowerSecurity(target, 0)) + return false; + targetGUID = target->GetGUID(); name = target->GetName(); // re-read for case getSelectedPlayer() target accId = target->GetSession()->GetAccountId(); @@ -1840,6 +1830,11 @@ bool ChatHandler::HandlePInfoCommand(const char* args) // get additional information from DB else { + // check offline security + if (HasLowerSecurity(NULL, targetGUID)) + return false; + + // 0 QueryResult *result = CharacterDatabase.PQuery("SELECT totaltime FROM characters WHERE guid = '%u'", GUID_LOPART(targetGUID)); if (!result) { @@ -1850,7 +1845,7 @@ bool ChatHandler::HandlePInfoCommand(const char* args) Field *fields = result->Fetch(); total_player_time = fields[0].GetUInt32(); delete result; - + Tokens data; if (!Player::LoadValuesArrayFromDB(data,targetGUID)) { @@ -1858,7 +1853,7 @@ bool ChatHandler::HandlePInfoCommand(const char* args) SetSentErrorMessage(true); return false; } - + money = Player::GetUInt32ValueFromArray(data, PLAYER_FIELD_COINAGE); level = Player::GetUInt32ValueFromArray(data, UNIT_FIELD_LEVEL); accId = objmgr.GetPlayerAccountIdByGUID(targetGUID); @@ -1875,8 +1870,8 @@ bool ChatHandler::HandlePInfoCommand(const char* args) Field* fields = result->Fetch(); username = fields[0].GetCppString(); security = fields[1].GetUInt32(); - - if(!m_session || m_session->GetSecurity() >= security) + + if(!m_session || m_session->GetSecurity() >= security) { last_ip = fields[2].GetCppString(); last_login = fields[3].GetCppString(); @@ -1940,6 +1935,189 @@ bool ChatHandler::HandlePInfoCommand(const char* args) return true; } +/*//show tickets +void ChatHandler::ShowTicket(uint64 guid, char const* text, char const* time) +{ + std::string name; + if(!objmgr.GetPlayerNameByGUID(guid,name)) + name = GetTrinityString(LANG_UNKNOWN); + + PSendSysMessage(LANG_COMMAND_TICKETVIEW, name.c_str(),time,text); +} + +//ticket commands +bool ChatHandler::HandleTicketCommand(const char* args) +{ + char* px = strtok((char*)args, " "); + + // ticket<end> + if (!px) + { + if(!m_session) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + size_t count = ticketmgr.GetTicketCount(); + + bool accept = m_session->GetPlayer()->isAcceptTickets(); + + PSendSysMessage(LANG_COMMAND_TICKETCOUNT, count, accept ? GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF)); + return true; + } + + // ticket on + if(strncmp(px,"on",3) == 0) + { + if(!m_session) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + m_session->GetPlayer()->SetAcceptTicket(true); + SendSysMessage(LANG_COMMAND_TICKETON); + return true; + } + + // ticket off + if(strncmp(px,"off",4) == 0) + { + if(!m_session) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + m_session->GetPlayer()->SetAcceptTicket(false); + SendSysMessage(LANG_COMMAND_TICKETOFF); + return true; + } + + // ticket #num + int num = atoi(px); + if(num > 0) + { + QueryResult *result = CharacterDatabase.PQuery("SELECT guid,ticket_text,ticket_lastchange FROM character_ticket ORDER BY ticket_id ASC "_OFFSET_, num-1); + + if(!result) + { + PSendSysMessage(LANG_COMMAND_TICKENOTEXIST, num); + SetSentErrorMessage(true); + return false; + } + + Field* fields = result->Fetch(); + + uint32 guid = fields[0].GetUInt32(); + char const* text = fields[1].GetString(); + char const* time = fields[2].GetString(); + + ShowTicket(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER),text,time); + delete result; + return true; + } + + std::string name = px; + + if(!normalizePlayerName(name)) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + uint64 guid = objmgr.GetPlayerGUIDByName(name); + + if(!guid) + return false; + + // ticket $char_name + GMTicket* ticket = ticketmgr.GetGMTicket(GUID_LOPART(guid)); + if(!ticket) + return false; + + std::string time = TimeToTimestampStr(ticket->GetLastUpdate()); + + ShowTicket(guid, ticket->GetText(), time.c_str()); + + return true; +} + +//dell all tickets +bool ChatHandler::HandleDelTicketCommand(const char *args) +{ + char* px = strtok((char*)args, " "); + if (!px) + return false; + + // delticket all + if(strncmp(px,"all",4) == 0) + { + ticketmgr.DeleteAll(); + SendSysMessage(LANG_COMMAND_ALLTICKETDELETED); + return true; + } + + int num = (uint32)atoi(px); + + // delticket #num + if(num > 0) + { + QueryResult* result = CharacterDatabase.PQuery("SELECT guid FROM character_ticket ORDER BY ticket_id ASC "_OFFSET_,num-1); + if(!result) + { + PSendSysMessage(LANG_COMMAND_TICKENOTEXIST, num); + SetSentErrorMessage(true); + return false; + } + Field* fields = result->Fetch(); + uint32 guid = fields[0].GetUInt32(); + delete result; + + ticketmgr.Delete(guid); + + //notify player + if(Player* pl = objmgr.GetPlayer(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER))) + { + pl->GetSession()->SendGMTicketGetTicket(0x0A, 0); + PSendSysMessage(LANG_COMMAND_TICKETPLAYERDEL, pl->GetName()); + } + else + PSendSysMessage(LANG_COMMAND_TICKETDEL); + + return true; + } + + std::string name = px; + + if(!normalizePlayerName(name)) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + uint64 guid = objmgr.GetPlayerGUIDByName(name); + + if(!guid) + return false; + + // delticket $char_name + ticketmgr.Delete(GUID_LOPART(guid)); + + // notify players about ticket deleting + if(Player* sender = objmgr.GetPlayer(guid)) + sender->GetSession()->SendGMTicketGetTicket(0x0A,0); + + PSendSysMessage(LANG_COMMAND_TICKETPLAYERDEL,px); + return true; +}*/ + //set spawn dist of creature bool ChatHandler::HandleNpcSpawnDistCommand(const char* args) { @@ -2945,8 +3123,8 @@ bool ChatHandler::HandleWpShowCommand(const char* args) delete result; return false; } - - pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode())); + + pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode())); pCreature->LoadFromDB(pCreature->GetDBTableGUIDLow(), map); map->Add(pCreature); @@ -3057,12 +3235,20 @@ bool ChatHandler::HandleRenameCommand(const char* args) if(target) { + // check online security + if (HasLowerSecurity(target, 0)) + return false; + PSendSysMessage(LANG_RENAME_PLAYER, target->GetName()); target->SetAtLoginFlag(AT_LOGIN_RENAME); CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '1' WHERE guid = '%u'", target->GetGUIDLow()); } else { + // check offline security + if (HasLowerSecurity(NULL, targetGUID)) + return false; + PSendSysMessage(LANG_RENAME_PLAYER_GUID, oldname.c_str(), GUID_LOPART(targetGUID)); CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '1' WHERE guid = '%u'", GUID_LOPART(targetGUID)); } @@ -3070,6 +3256,59 @@ bool ChatHandler::HandleRenameCommand(const char* args) return true; } +// customize characters +bool ChatHandler::HandleCustomizeCommand(const char* args) +{ + Player* target = NULL; + uint64 targetGUID = 0; + std::string oldname; + + char* px = strtok((char*)args, " "); + + if(px) + { + oldname = px; + + if(!normalizePlayerName(oldname)) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + target = objmgr.GetPlayer(oldname.c_str()); + + if (!target) + targetGUID = objmgr.GetPlayerGUIDByName(oldname); + } + + if(!target && !targetGUID) + { + target = getSelectedPlayer(); + } + + if(!target && !targetGUID) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + if(target) + { + PSendSysMessage(LANG_CUSTOMIZE_PLAYER, target->GetName()); + target->SetAtLoginFlag(AT_LOGIN_CUSTOMIZE); + CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", target->GetGUIDLow()); + } + else + { + PSendSysMessage(LANG_CUSTOMIZE_PLAYER_GUID, oldname.c_str(), GUID_LOPART(targetGUID)); + CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", GUID_LOPART(targetGUID)); + } + + return true; +} + //spawn go bool ChatHandler::HandleGameObjectCommand(const char* args) { @@ -3178,6 +3417,10 @@ bool ChatHandler::HandleAddHonorCommand(const char* args) return false; } + // check online security + if (HasLowerSecurity(target, 0)) + return false; + uint32 amount = (uint32)atoi(args); target->RewardHonor(NULL, 1, amount); return true; @@ -3193,6 +3436,10 @@ bool ChatHandler::HandleHonorAddKillCommand(const char* /*args*/) return false; } + // check online security + if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0)) + return false; + m_session->GetPlayer()->RewardHonor(target, 1); return true; } @@ -3207,6 +3454,10 @@ bool ChatHandler::HandleUpdateHonorFieldsCommand(const char* /*args*/) return false; } + // check online security + if (HasLowerSecurity(target, 0)) + return false; + target->UpdateHonorFields(); return true; } @@ -3241,11 +3492,11 @@ bool ChatHandler::HandleLookupEventCommand(const char* args) if (Utf8FitTo(descr, wnamepart)) { char const* active = activeEvents.find(id) != activeEvents.end() ? GetTrinityString(LANG_ACTIVE) : ""; - - if(m_session) - PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,id,id,eventData.description.c_str(),active ); - else - PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,id,eventData.description.c_str(),active ); + + if(m_session) + PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,id,id,eventData.description.c_str(),active ); + else + PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,id,eventData.description.c_str(),active ); ++counter; } @@ -3272,9 +3523,9 @@ bool ChatHandler::HandleEventActiveListCommand(const char* args) GameEventData const& eventData = events[event_id]; if(m_session) - PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,event_id,event_id,eventData.description.c_str(),active ); - else - PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,event_id,eventData.description.c_str(),active ); + PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,event_id,event_id,eventData.description.c_str(),active ); + else + PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,event_id,eventData.description.c_str(),active ); ++counter; } @@ -3449,6 +3700,10 @@ bool ChatHandler::HandleCombatStopCommand(const char* args) player = m_session->GetPlayer(); } + // check online security + if (HasLowerSecurity(player, 0)) + return false; + player->CombatStop(); player->getHostilRefManager().deleteReferences(); return true; @@ -3575,13 +3830,13 @@ bool ChatHandler::HandleLearnAllRecipesCommand(const char* args) bool ChatHandler::HandleLookupPlayerIpCommand(const char* args) { - + if (!*args) return false; std::string ip = strtok ((char*)args, " "); - char* limit_str = strtok (NULL, " "); - int32 limit = limit_str ? atoi (limit_str) : -1; + char* limit_str = strtok (NULL, " "); + int32 limit = limit_str ? atoi (limit_str) : -1; LoginDatabase.escape_string (ip); @@ -3596,8 +3851,8 @@ bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args) return false; std::string account = strtok ((char*)args, " "); - char* limit_str = strtok (NULL, " "); - int32 limit = limit_str ? atoi (limit_str) : -1; + char* limit_str = strtok (NULL, " "); + int32 limit = limit_str ? atoi (limit_str) : -1; if (!AccountMgr::normilizeString (account)) return false; @@ -3611,13 +3866,13 @@ bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args) bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args) { - + if (!*args) return false; std::string email = strtok ((char*)args, " "); - char* limit_str = strtok (NULL, " "); - int32 limit = limit_str ? atoi (limit_str) : -1; + char* limit_str = strtok (NULL, " "); + int32 limit = limit_str ? atoi (limit_str) : -1; LoginDatabase.escape_string (email); @@ -3641,7 +3896,7 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit) Field* fields = result->Fetch(); uint32 acc_id = fields[0].GetUInt32(); std::string acc_name = fields[1].GetCppString(); - + QueryResult* chars = CharacterDatabase.PQuery("SELECT guid,name FROM characters WHERE account = '%u'", acc_id); if(chars) { @@ -3673,8 +3928,8 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit) /// Triggering corpses expire check in world bool ChatHandler::HandleServerCorpsesCommand(const char* /*args*/) { - CorpsesErase(); - return true; + CorpsesErase(); + return true; } bool ChatHandler::HandleRepairitemsCommand(const char* /*args*/) @@ -3686,7 +3941,11 @@ bool ChatHandler::HandleRepairitemsCommand(const char* /*args*/) PSendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; - } + } + + // check online security + if (HasLowerSecurity(target, 0)) + return false; // Repair items target->DurabilityRepairAll(false, 0, false); @@ -3697,6 +3956,40 @@ bool ChatHandler::HandleRepairitemsCommand(const char* /*args*/) return true; } +bool ChatHandler::HandleWaterwalkCommand(const char* args) +{ + if(!*args) + return false; + + Player *player = getSelectedPlayer(); + + if(!player) + { + PSendSysMessage(LANG_NO_CHAR_SELECTED); + SetSentErrorMessage(true); + return false; + } + + // check online security + if (HasLowerSecurity(player, 0)) + return false; + + if (strncmp(args, "on", 3) == 0) + player->SetMovement(MOVE_WATER_WALK); // ON + else if (strncmp(args, "off", 4) == 0) + player->SetMovement(MOVE_LAND_WALK); // OFF + else + { + SendSysMessage(LANG_USE_BOL); + return false; + } + + PSendSysMessage(LANG_YOU_SET_WATERWALK, args, player->GetName()); + if(needReportToTarget(player)) + ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, GetName()); + return true; +} + bool ChatHandler::HandleNpcFollowCommand(const char* /*args*/) { Player *player = m_session->GetPlayer(); @@ -3753,6 +4046,72 @@ bool ChatHandler::HandleNpcUnFollowCommand(const char* /*args*/) return true; } +bool ChatHandler::HandleNpcTameCommand(const char* /*args*/) +{ + Creature *creatureTarget = getSelectedCreature (); + if (!creatureTarget || creatureTarget->isPet ()) + { + PSendSysMessage (LANG_SELECT_CREATURE); + SetSentErrorMessage (true); + return false; + } + + Player *player = m_session->GetPlayer (); + + if(player->GetPetGUID ()) + { + SendSysMessage (LANG_YOU_ALREADY_HAVE_PET); + SetSentErrorMessage (true); + return false; + } + + CreatureInfo const* cInfo = creatureTarget->GetCreatureInfo(); + + if (!cInfo->isTameable ()) + { + PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry); + SetSentErrorMessage (true); + return false; + } + + // Everything looks OK, create new pet + Pet* pet = player->CreateTamedPetFrom (creatureTarget); + if (!pet) + { + PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry); + SetSentErrorMessage (true); + return false; + } + + // place pet before player + float x,y,z; + player->GetClosePoint (x,y,z,creatureTarget->GetObjectSize (),CONTACT_DISTANCE); + pet->Relocate (x,y,z,M_PI-player->GetOrientation ()); + + // set pet to defensive mode by default (some classes can't control controlled pets in fact). + pet->GetCharmInfo()->SetReactState(REACT_DEFENSIVE); + + // calculate proper level + uint32 level = (creatureTarget->getLevel() < (player->getLevel() - 5)) ? (player->getLevel() - 5) : creatureTarget->getLevel(); + + // prepare visual effect for levelup + pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1); + + // add to world + pet->GetMap()->Add((Creature*)pet); + + // visual effect for levelup + pet->SetUInt32Value(UNIT_FIELD_LEVEL, level); + + // caster have pet now + player->SetPet(pet); + + pet->SavePetToDB(PET_SAVE_AS_CURRENT); + player->PetSpellInitialize(); + + return true; +} + bool ChatHandler::HandleCreatePetCommand(const char* args) { Player *player = m_session->GetPlayer(); @@ -3912,7 +4271,7 @@ bool ChatHandler::HandlePetTpCommand(const char *args) uint32 tp = atol(args); - pet->SetTP(tp); + //pet->SetTP(tp); PSendSysMessage("Pet's tp changed to %u", tp); return true; |