* added distance calculation to WorldObject
* added script func "GetObjectDist,guid1[,2d/3d] guid2" * removed _onwhisper script call and @thiswhisper macros. it can be done better via the ChatAI scripting interface.
This commit is contained in:
parent
10f0d5962d
commit
45edde53c9
@ -57,6 +57,7 @@ void DefScriptPackage::_InitDefScriptInterface(void)
|
||||
AddFunc("bbputpackedguid",&DefScriptPackage::SCBBPutPackedGuid);
|
||||
AddFunc("gui",&DefScriptPackage::SCGui);
|
||||
AddFunc("sendwho",&DefScriptPackage::SCSendWho);
|
||||
AddFunc("getobjectdist",&DefScriptPackage::SCGetObjectDistance);
|
||||
}
|
||||
|
||||
DefReturnResult DefScriptPackage::SCshdn(CmdSet& Set)
|
||||
@ -1034,7 +1035,34 @@ DefReturnResult DefScriptPackage::SCSendWho(CmdSet &Set)
|
||||
ws->SendWhoListRequest(minlvl,maxlvl,racemask,classmask,name,guildname);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
DefReturnResult DefScriptPackage::SCGetObjectDistance(CmdSet &Set)
|
||||
{
|
||||
WorldSession *ws = ((PseuInstance*)parentMethod)->GetWSession();
|
||||
if(!ws)
|
||||
{
|
||||
logerror("Invalid Script call: SCSendWhoListRequest: WorldSession not valid");
|
||||
DEF_RETURN_ERROR;
|
||||
}
|
||||
uint64 guid1 = DefScriptTools::toUint64(Set.defaultarg);
|
||||
uint64 guid2 = DefScriptTools::toUint64(Set.arg[0]);
|
||||
std::string s = stringToLower(Set.arg[1]);
|
||||
Object *o1, *o2;
|
||||
float dist = 0;
|
||||
o1 = ws->objmgr.GetObj(guid1);
|
||||
o2 = ws->objmgr.GetObj(guid2);
|
||||
if(o1 && o2 && o1->IsWorldObject() && o2->IsWorldObject())
|
||||
{
|
||||
if(s.empty() || s == "2d")
|
||||
dist = ((WorldObject*)o1)->GetDistance2d((WorldObject*)o2);
|
||||
else if(s == "3d")
|
||||
dist = ((WorldObject*)o1)->GetDistance((WorldObject*)o2);
|
||||
|
||||
return toString(ldbl(dist));
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
void DefScriptPackage::My_LoadUserPermissions(VarSet &vs)
|
||||
{
|
||||
|
||||
@ -48,5 +48,6 @@ DefReturnResult SCBBGetPackedGuid(CmdSet&);
|
||||
DefReturnResult SCBBPutPackedGuid(CmdSet&);
|
||||
DefReturnResult SCGui(CmdSet&);
|
||||
DefReturnResult SCSendWho(CmdSet&);
|
||||
DefReturnResult SCGetObjectDistance(CmdSet&);
|
||||
|
||||
#endif
|
||||
|
||||
@ -57,6 +57,54 @@ void WorldObject::SetPosition(float x, float y, float z, float o, uint16 _map)
|
||||
_m = _map;
|
||||
}
|
||||
|
||||
float WorldObject::GetDistance(WorldObject* obj)
|
||||
{
|
||||
float dx = GetX() - obj->GetX();
|
||||
float dy = GetY() - obj->GetY();
|
||||
float dz = GetZ() - obj->GetZ();
|
||||
float sizefactor = GetObjectSize() + obj->GetObjectSize();
|
||||
float dist = sqrt((dx*dx) + (dy*dy) + (dz*dz)) - sizefactor;
|
||||
return ( dist > 0 ? dist : 0);
|
||||
}
|
||||
|
||||
float WorldObject::GetDistance2d(float x, float y)
|
||||
{
|
||||
float dx = GetX() - x;
|
||||
float dy = GetY() - y;
|
||||
float sizefactor = GetObjectSize();
|
||||
float dist = sqrt((dx*dx) + (dy*dy)) - sizefactor;
|
||||
return ( dist > 0 ? dist : 0);
|
||||
}
|
||||
|
||||
float WorldObject::GetDistance(float x, float y, float z)
|
||||
{
|
||||
float dx = GetX() - x;
|
||||
float dy = GetY() - y;
|
||||
float dz = GetZ() - z;
|
||||
float sizefactor = GetObjectSize();
|
||||
float dist = sqrt((dx*dx) + (dy*dy) + (dz*dz)) - sizefactor;
|
||||
return ( dist > 0 ? dist : 0);
|
||||
}
|
||||
|
||||
float WorldObject::GetDistance2d(WorldObject* obj)
|
||||
{
|
||||
float dx = GetX() - obj->GetX();
|
||||
float dy = GetY() - obj->GetY();
|
||||
float sizefactor = GetObjectSize() + obj->GetObjectSize();
|
||||
float dist = sqrt((dx*dx) + (dy*dy)) - sizefactor;
|
||||
return ( dist > 0 ? dist : 0);
|
||||
}
|
||||
|
||||
float WorldObject::GetDistanceZ(WorldObject* obj)
|
||||
{
|
||||
float dz = fabs(GetZ() - obj->GetZ());
|
||||
float sizefactor = GetObjectSize() + obj->GetObjectSize();
|
||||
float dist = dz - sizefactor;
|
||||
return ( dist > 0 ? dist : 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void WorldSession::_HandleDestroyObjectOpcode(WorldPacket& recvPacket)
|
||||
{
|
||||
uint64 guid;
|
||||
|
||||
@ -53,6 +53,7 @@ public:
|
||||
inline bool IsContainer(void) { return _typeid == TYPEID_CONTAINER; } // specific
|
||||
inline bool IsCorpse(void) { return _typeid == TYPEID_CORPSE; } // specific
|
||||
inline bool IsDynObject(void) { return _typeid == TYPEID_DYNAMICOBJECT; } // specific
|
||||
inline bool IsWorldObject(void) { return _type & (TYPE_PLAYER | TYPE_UNIT | TYPE_CORPSE | TYPE_DYNAMICOBJECT | TYPE_GAMEOBJECT); }
|
||||
inline const uint32 GetUInt32Value( uint16 index ) const
|
||||
{
|
||||
return _uint32values[ index ];
|
||||
@ -83,6 +84,11 @@ public:
|
||||
inline void SetName(std::string name) { _name = name; }
|
||||
inline std::string GetName(void) { return _name; }
|
||||
|
||||
inline float GetObjectSize() const
|
||||
{
|
||||
return ( _valuescount > UNIT_FIELD_BOUNDINGRADIUS ) ? _floatvalues[UNIT_FIELD_BOUNDINGRADIUS] : 0.39f;
|
||||
}
|
||||
|
||||
void Create(uint64 guid);
|
||||
|
||||
protected:
|
||||
@ -110,6 +116,11 @@ public:
|
||||
inline float GetY(void) { return _y; }
|
||||
inline float GetZ(void) { return _z; }
|
||||
inline float GetO(void) { return _o; }
|
||||
float GetDistance(WorldObject *obj);
|
||||
float GetDistance2d(float x, float y);
|
||||
float GetDistance(float x, float y, float z);
|
||||
float GetDistance2d(WorldObject *obj);
|
||||
float GetDistanceZ(WorldObject *obj);
|
||||
|
||||
protected:
|
||||
WorldObject();
|
||||
|
||||
@ -699,15 +699,6 @@ void WorldSession::_HandleMessageChatOpcode(WorldPacket& recvPacket)
|
||||
|
||||
}
|
||||
|
||||
// TODO: remove this block soon, its obsoelete and has to be done via scripting!
|
||||
if(type==CHAT_MSG_WHISPER && (!isCmd) && target_guid!=GetGuid())
|
||||
{
|
||||
GetInstance()->GetScripts()->variables.Set("@thiswhisper_name",name);
|
||||
GetInstance()->GetScripts()->variables.Set("@thiswhisper",toString(target_guid));
|
||||
GetInstance()->GetScripts()->variables.Set("@thiswhisper_lang",toString((uint64)lang));
|
||||
GetInstance()->GetScripts()->RunScript("_onwhisper",NULL);
|
||||
}
|
||||
|
||||
// the following block searches for items in chat and queries them if they are unknown
|
||||
if(!isCmd && target_guid!=_myGUID && msg.length()>strlen(CHAT_ITEM_BEGIN_STRING))
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user