diff --git a/src/Client/DefScriptInterface.cpp b/src/Client/DefScriptInterface.cpp index 2869910..1683212 100644 --- a/src/Client/DefScriptInterface.cpp +++ b/src/Client/DefScriptInterface.cpp @@ -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) { diff --git a/src/Client/DefScriptInterfaceInclude.h b/src/Client/DefScriptInterfaceInclude.h index 461fdef..c18da95 100644 --- a/src/Client/DefScriptInterfaceInclude.h +++ b/src/Client/DefScriptInterfaceInclude.h @@ -48,5 +48,6 @@ DefReturnResult SCBBGetPackedGuid(CmdSet&); DefReturnResult SCBBPutPackedGuid(CmdSet&); DefReturnResult SCGui(CmdSet&); DefReturnResult SCSendWho(CmdSet&); +DefReturnResult SCGetObjectDistance(CmdSet&); #endif diff --git a/src/Client/World/Object.cpp b/src/Client/World/Object.cpp index f3248e9..55d0c30 100644 --- a/src/Client/World/Object.cpp +++ b/src/Client/World/Object.cpp @@ -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; diff --git a/src/Client/World/Object.h b/src/Client/World/Object.h index 22af8fb..195855c 100644 --- a/src/Client/World/Object.h +++ b/src/Client/World/Object.h @@ -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(); diff --git a/src/Client/World/WorldSession.cpp b/src/Client/World/WorldSession.cpp index 2a37f53..1565b89 100644 --- a/src/Client/World/WorldSession.cpp +++ b/src/Client/World/WorldSession.cpp @@ -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)) {