From 6857827169cc387c534216b251d048f5b98cae21 Mon Sep 17 00:00:00 2001 From: "False.Genesis" Date: Thu, 25 Oct 2007 15:12:05 +0000 Subject: [PATCH] * added script funcs: getobjectvalue, getclass, getrace as requested by thetourist. getobjectvalue syntax: "getobjectvalue,index[,type]" works exactly like Object::GetUInt32Value(). default type treatment is uint32, set type to "f" to return floatvalue, or "i64", to return uint64value. --- src/Client/DefScriptInterface.cpp | 71 ++++++++++++++++++++++++++ src/Client/DefScriptInterfaceInclude.h | 5 +- src/Client/World/Unit.h | 2 + 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/Client/DefScriptInterface.cpp b/src/Client/DefScriptInterface.cpp index a8dfd6d..40c44bb 100644 --- a/src/Client/DefScriptInterface.cpp +++ b/src/Client/DefScriptInterface.cpp @@ -47,6 +47,9 @@ void DefScriptPackage::_InitDefScriptInterface(void) AddFunc("getscriptperm",&DefScriptPackage::SCGetScriptPerm); AddFunc("lgetfiles",&DefScriptPackage::SCGetFileList); AddFunc("printscript",&DefScriptPackage::SCPrintScript); + AddFunc("getobjectvalue",&DefScriptPackage::SCGetObjectValue); + AddFunc("getrace",&DefScriptPackage::SCGetRace); + AddFunc("getclass",&DefScriptPackage::SCGetClass); } DefReturnResult DefScriptPackage::SCshdn(CmdSet& Set) @@ -786,6 +789,74 @@ DefReturnResult DefScriptPackage::SCPrintScript(CmdSet &Set) return ""; } +DefReturnResult DefScriptPackage::SCGetObjectValue(CmdSet &Set) +{ + WorldSession *ws = ((PseuInstance*)parentMethod)->GetWSession(); + if(!ws) + { + logerror("Invalid Script call: SCGetObjectValue: WorldSession not valid"); + DEF_RETURN_ERROR; + } + + uint64 guid = DefScriptTools::toNumber(Set.defaultarg); + Object *o = ws->objmgr.GetObj(guid); + if(o) + { + uint32 v = (uint32)DefScriptTools::toNumber(Set.arg[0]); + if(v > o->GetValuesCount()) + { + logerror("SCGetObjectValue ["I64FMTD", type %u]: invalid value index: %u",guid,o->GetTypeId(),v); + return ""; + } + else + { + if(DefScriptTools::stringToLower(Set.arg[1]) == "f") + return toString((ldbl)o->GetFloatValue(v)); + else if(DefScriptTools::stringToLower(Set.arg[1]) == "i64") + return toString(o->GetUInt64Value(v)); + else + return toString((uint64)o->GetUInt32Value(v)); + } + } + return ""; +} + +DefReturnResult DefScriptPackage::SCGetRace(CmdSet &Set) +{ + WorldSession *ws = ((PseuInstance*)parentMethod)->GetWSession(); + if(!ws) + { + logerror("Invalid Script call: SCGetObjectValue: WorldSession not valid"); + DEF_RETURN_ERROR; + } + + uint64 guid = DefScriptTools::toNumber(Set.defaultarg); + Object *o = ws->objmgr.GetObj(guid); + if(o && (o->GetTypeId() == TYPEID_UNIT || o->GetTypeId() == TYPEID_PLAYER)) + { + return DefScriptTools::toString((uint64)((Unit*)o)->GetRace()); + } + return ""; +} + +DefReturnResult DefScriptPackage::SCGetClass(CmdSet &Set) +{ + WorldSession *ws = ((PseuInstance*)parentMethod)->GetWSession(); + if(!ws) + { + logerror("Invalid Script call: SCGetObjectValue: WorldSession not valid"); + DEF_RETURN_ERROR; + } + + uint64 guid = DefScriptTools::toNumber(Set.defaultarg); + Object *o = ws->objmgr.GetObj(guid); + if(o && (o->GetTypeId() == TYPEID_UNIT || o->GetTypeId() == TYPEID_PLAYER)) + { + return DefScriptTools::toString((uint64)((Unit*)o)->GetClass()); + } + return ""; +} + diff --git a/src/Client/DefScriptInterfaceInclude.h b/src/Client/DefScriptInterfaceInclude.h index 71a8a0f..fc591f6 100644 --- a/src/Client/DefScriptInterfaceInclude.h +++ b/src/Client/DefScriptInterfaceInclude.h @@ -37,6 +37,9 @@ DefReturnResult SCObjectKnown(CmdSet&); DefReturnResult SCGetPlayerPerm(CmdSet&); DefReturnResult SCGetScriptPerm(CmdSet&); DefReturnResult SCGetFileList(CmdSet&); -DefReturnResult SCPrintScript(CmdSet &Set); +DefReturnResult SCPrintScript(CmdSet&); +DefReturnResult SCGetObjectValue(CmdSet&); +DefReturnResult SCGetRace(CmdSet&); +DefReturnResult SCGetClass(CmdSet&); #endif \ No newline at end of file diff --git a/src/Client/World/Unit.h b/src/Client/World/Unit.h index c228e87..1a0dc2b 100644 --- a/src/Client/World/Unit.h +++ b/src/Client/World/Unit.h @@ -51,6 +51,8 @@ public: uint8 GetGender(void); void SetSpeed(uint8 speednr, float speed) { _speed[speednr] = speed; } float GetSpeed(uint8 speednr) { return _speed[speednr]; } + uint8 GetRace() const { return (uint8)(GetUInt32Value(UNIT_FIELD_BYTES_0) & 0xFF); }; + uint8 GetClass() const { return (uint8)((GetUInt32Value(UNIT_FIELD_BYTES_0) >> 8) & 0xFF); }; protected: float _speed[MAX_MOVE_TYPE];