[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
This commit is contained in:
megamage
2009-02-01 16:46:57 -06:00
parent cd0071ae62
commit 05c07aa74a
8 changed files with 165 additions and 5 deletions
+50 -2
View File
@@ -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();
+4
View File
@@ -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);
+1
View File
@@ -1245,6 +1245,7 @@ void Creature::SaveToDB(uint32 mapid, uint8 spawnMask, uint32 phaseMask)
<< GetEntry() << ","
<< mapid <<","
<< (uint32)spawnMask << ","
<< (uint32)GetPhaseMask() << ","
<< displayId <<","
<< GetEquipmentId() <<","
<< GetPositionX() << ","
+1
View File
@@ -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) << ", "
+11
View File
@@ -653,6 +653,8 @@ bool ChatHandler::HandleVisibleCommand(const char* args)
return false;
}
bool ChatHandler::HandleGPSCommand(const char* args)
{
WorldObject *obj = NULL;
@@ -662,6 +664,13 @@ bool ChatHandler::HandleGPSCommand(const char* args)
if(normalizePlayerName(name))
obj = objmgr.GetPlayer(name.c_str());
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);
@@ -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 );
+91
View File
@@ -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;
}