diff options
author | megamage <none@none> | 2009-02-01 16:46:57 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-02-01 16:46:57 -0600 |
commit | 05c07aa74a38e73006ba7106574290179942692c (patch) | |
tree | 70cd33698562658805c3643c22890ce23263c3a8 /src | |
parent | cd0071ae620f2634f609df8b83b24687f073733e (diff) |
[7214] Phase system continue development - Commands and fixes.
* Fixed creature/gameobject save from game (used in commands code only)
* Implement .modify phase (for player), .npc setphase (for creature/pet), .gobject phase (for gameobjects) commands
for set phasemask of selected object. In player/pet case temporary until in game phase switch/re-login/GM-mode change.
In creature/gameobject case change saved in DB.
* Add to .gps output phasemask value print. Allow use .gps command with creature/gameobject shift-link
(work for objects loaded in game in command time).
Author: VladimirMangos
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Chat.cpp | 52 | ||||
-rw-r--r-- | src/game/Chat.h | 4 | ||||
-rw-r--r-- | src/game/Creature.cpp | 1 | ||||
-rw-r--r-- | src/game/GameObject.cpp | 1 | ||||
-rw-r--r-- | src/game/Level1.cpp | 11 | ||||
-rw-r--r-- | src/game/Level2.cpp | 91 | ||||
-rw-r--r-- | src/shared/revision_nr.h | 2 |
7 files changed, 159 insertions, 3 deletions
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 6d9da4ac9af..03f78c3938c 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -150,6 +150,7 @@ ChatCommand * ChatHandler::getCommandTable() { "drunk", SEC_MODERATOR, false, &ChatHandler::HandleDrunkCommand, "", NULL }, { "standstate", SEC_GAMEMASTER, false, &ChatHandler::HandleStandStateCommand, "", NULL }, { "morph", SEC_GAMEMASTER, false, &ChatHandler::HandleMorphCommand, "", NULL }, + { "phase", SEC_GAMEMASTER, false, &ChatHandler::HandleModifyPhaseCommand, "", NULL }, { "gender", SEC_ADMINISTRATOR, false, &ChatHandler::HandleModifyGenderCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; @@ -457,6 +458,7 @@ ChatCommand * ChatHandler::getCommandTable() { "info", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcInfoCommand, "", NULL }, { "playemote", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcPlayEmoteCommand, "", NULL }, { "follow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFollowCommand, "", NULL }, + { "setphase", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetPhaseCommand, "", NULL }, { "unfollow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcUnFollowCommand, "", NULL }, { "whisper", SEC_MODERATOR, false, &ChatHandler::HandleNpcWhisperCommand, "", NULL }, { "yell", SEC_MODERATOR, false, &ChatHandler::HandleNpcYellCommand, "", NULL }, @@ -490,12 +492,13 @@ ChatCommand * ChatHandler::getCommandTable() { { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectCommand, "", NULL }, { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleDelObjectCommand, "", NULL }, - { "target", SEC_GAMEMASTER, false, &ChatHandler::HandleTargetObjectCommand, "", NULL }, - { "turn", SEC_GAMEMASTER, false, &ChatHandler::HandleTurnObjectCommand, "", NULL }, { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleMoveObjectCommand, "", NULL }, { "near", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearObjectCommand, "", NULL }, { "activate", SEC_GAMEMASTER, false, &ChatHandler::HandleActivateObjectCommand, "", NULL }, { "addtemp", SEC_GAMEMASTER, false, &ChatHandler::HandleTempGameObjectCommand, "", NULL }, + { "setphase", SEC_GAMEMASTER, false, &ChatHandler::HandleGOPhaseCommand, "", NULL }, + { "target", SEC_GAMEMASTER, false, &ChatHandler::HandleTargetObjectCommand, "", NULL }, + { "turn", SEC_GAMEMASTER, false, &ChatHandler::HandleTurnObjectCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; @@ -1405,6 +1408,51 @@ GameTele const* ChatHandler::extractGameTeleFromLink(char* text) return objmgr.GetGameTele(cId); } +enum GuidLinkType +{ + SPELL_LINK_CREATURE = 0, + SPELL_LINK_GAMEOBJECT = 1 +}; + +static char const* const guidKeys[] = +{ + "Hcreature", + "Hgameobject", + 0 +}; + +uint64 ChatHandler::extractGuidFromLink(char* text) +{ + int type = 0; + + // |color|Hcreature:creature_guid|h[name]|h|r + // |color|Hgameobject:go_guid|h[name]|h|r + char* idS = extractKeyFromLink(text,guidKeys,&type); + if(!idS) + return 0; + + uint32 lowguid = (uint32)atol(idS); + + switch(type) + { + case SPELL_LINK_CREATURE: + { + if(CreatureData const* data = objmgr.GetCreatureData(lowguid) ) + return MAKE_NEW_GUID(lowguid,data->id,HIGHGUID_UNIT); + else + return 0; + } + case SPELL_LINK_GAMEOBJECT: + if(GameObjectData const* data = objmgr.GetGOData(lowguid) ) + return MAKE_NEW_GUID(lowguid,data->id,HIGHGUID_GAMEOBJECT); + else + return 0; + } + + // unknown type? + return 0; +} + const char *ChatHandler::GetName() const { return m_session->GetPlayer()->GetName(); diff --git a/src/game/Chat.h b/src/game/Chat.h index 8faea36e9fc..6ee75789db4 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -185,6 +185,7 @@ class ChatHandler bool HandleModifyHonorCommand (const char* args); bool HandleModifyRepCommand(const char* args); bool HandleModifyArenaCommand(const char* args); + bool HandleModifyPhaseCommand(const char* args); bool HandleModifyGenderCommand(const char* args); bool HandleNpcAddCommand(const char* args); @@ -200,6 +201,7 @@ class ChatHandler bool HandleNpcSayCommand(const char* args); bool HandleNpcSetModelCommand(const char* args); bool HandleNpcSetMoveTypeCommand(const char* args); + bool HandleNpcSetPhaseCommand(const char* args); bool HandleNpcSpawnDistCommand(const char* args); bool HandleNpcSpawnTimeCommand(const char* args); bool HandleNpcTameCommand(const char* args); @@ -326,6 +328,7 @@ class ChatHandler bool HandleTargetObjectCommand(const char* args); bool HandleDelObjectCommand(const char* args); bool HandleMoveObjectCommand(const char* args); + bool HandleGOPhaseCommand(const char* args); bool HandleTurnObjectCommand(const char* args); bool HandleObjectStateCommand(const char* args); bool HandlePInfoCommand(const char* args); @@ -505,6 +508,7 @@ class ChatHandler char* extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1 = NULL); uint32 extractSpellIdFromLink(char* text); + uint64 extractGuidFromLink(char* text); GameTele const* extractGameTeleFromLink(char* text); bool GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline = false); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index d77e053a5e3..8134cd71de5 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1245,6 +1245,7 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) << GetEntry() << "," << mapid <<"," << (uint32)spawnMask << "," + << (uint32)GetPhaseMask() << "," << displayId <<"," << GetEquipmentId() <<"," << GetPositionX() << "," diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index 03b5bdc5644..41dae609b43 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -552,6 +552,7 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask) << GetEntry() << ", " << mapid << ", " << (uint32)spawnMask << ", " + << (uint32)GetPhaseMask() << "," << GetFloatValue(GAMEOBJECT_POS_X) << ", " << GetFloatValue(GAMEOBJECT_POS_Y) << ", " << GetFloatValue(GAMEOBJECT_POS_Z) << ", " diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index e31d6fe6170..60ef0fc98c9 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -653,6 +653,8 @@ bool ChatHandler::HandleVisibleCommand(const char* args) return false; } + + bool ChatHandler::HandleGPSCommand(const char* args) { WorldObject *obj = NULL; @@ -664,6 +666,13 @@ bool ChatHandler::HandleGPSCommand(const char* args) if(!obj) { + uint64 guid = extractGuidFromLink((char*)args); + if(guid) + obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*m_session->GetPlayer(),guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + } + + if(!obj) + { SendSysMessage(LANG_PLAYER_NOT_FOUND); SetSentErrorMessage(true); return false; @@ -711,6 +720,7 @@ bool ChatHandler::HandleGPSCommand(const char* args) obj->GetMapId(), (mapEntry ? mapEntry->name[m_session->GetSessionDbcLocale()] : "<unknown>" ), zone_id, (zoneEntry ? zoneEntry->area_name[m_session->GetSessionDbcLocale()] : "<unknown>" ), area_id, (areaEntry ? areaEntry->area_name[m_session->GetSessionDbcLocale()] : "<unknown>" ), + obj->GetPhaseMask(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation(), cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), obj->GetInstanceId(), zone_x, zone_y, ground_z, floor_z, have_map, have_vmap ); @@ -723,6 +733,7 @@ bool ChatHandler::HandleGPSCommand(const char* args) obj->GetMapId(), (mapEntry ? mapEntry->name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ), zone_id, (zoneEntry ? zoneEntry->area_name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ), area_id, (areaEntry ? areaEntry->area_name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ), + obj->GetPhaseMask(), obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation(), cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), obj->GetInstanceId(), zone_x, zone_y, ground_z, floor_z, have_map, have_vmap ); diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index e1c43c49b93..b43c4a971f5 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -1754,6 +1754,27 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args) return true; } +//set temporary phase mask for player +bool ChatHandler::HandleModifyPhaseCommand(const char* args) +{ + if (!*args) + return false; + + uint32 phasemask = (uint32)atoi((char*)args); + + Unit *target = getSelectedUnit(); + if(!target) + target = m_session->GetPlayer(); + + // check online security + else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0)) + return false; + + target->SetPhaseMask(phasemask,true); + + return true; +} + //show info of player bool ChatHandler::HandlePInfoCommand(const char* args) { @@ -4410,3 +4431,73 @@ bool ChatHandler::HandleNpcAddFormationCommand(const char* args) return true; } + +//change phasemask of creature or pet +bool ChatHandler::HandleNpcSetPhaseCommand(const char* args) +{ + if (!*args) + return false; + + uint32 phasemask = (uint32) atoi((char*)args); + if ( phasemask == 0 ) + { + SendSysMessage(LANG_BAD_VALUE); + SetSentErrorMessage(true); + return false; + } + + Creature* pCreature = getSelectedCreature(); + if(!pCreature) + { + SendSysMessage(LANG_SELECT_CREATURE); + SetSentErrorMessage(true); + return false; + } + + pCreature->SetPhaseMask(phasemask,true); + + if(!pCreature->isPet()) + pCreature->SaveToDB(); + + return true; +} + +//set pahsemask for selected object +bool ChatHandler::HandleGOPhaseCommand(const char* args) +{ + // number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r + char* cId = extractKeyFromLink((char*)args,"Hgameobject"); + if(!cId) + return false; + + uint32 lowguid = atoi(cId); + if(!lowguid) + return false; + + GameObject* obj = NULL; + // by DB guid + if (GameObjectData const* go_data = objmgr.GetGOData(lowguid)) + obj = GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid,go_data->id); + + if(!obj) + { + PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid); + SetSentErrorMessage(true); + return false; + } + + if (!*args) + return false; + + uint32 phasemask = (uint32) atoi((char*)args); + if ( phasemask == 0 ) + { + SendSysMessage(LANG_BAD_VALUE); + SetSentErrorMessage(true); + return false; + } + + obj->SetPhaseMask(phasemask,true); + obj->SaveToDB(); + return true; +} diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 240ed33d8ad..4b3b3fa5d97 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 "7213" + #define REVISION_NR "7214" #endif // __REVISION_NR_H__ |