* 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:
false_genesis 2008-02-18 22:57:00 +00:00
parent 10f0d5962d
commit 45edde53c9
5 changed files with 89 additions and 10 deletions

View File

@ -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)
{

View File

@ -48,5 +48,6 @@ DefReturnResult SCBBGetPackedGuid(CmdSet&);
DefReturnResult SCBBPutPackedGuid(CmdSet&);
DefReturnResult SCGui(CmdSet&);
DefReturnResult SCSendWho(CmdSet&);
DefReturnResult SCGetObjectDistance(CmdSet&);
#endif

View File

@ -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;

View File

@ -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();

View File

@ -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))
{