This one should be a bit faster:
SCAR Code:
function R_GetTrees(treeTiles:TTileArray;treeIDs:IntegerArray): TTile;
var
Plane, GroundObj, BaseX, BaseY: Integer;
Temp: TRSObject;
begin
BaseX := SmartGetFieldInt(0, hook_static_BaseX);
BaseY := SmartGetFieldInt(0, hook_static_BaseY);
Plane := SmartGetFieldInt(0, hook_static_LoadedPlane);
for i:= 0 to Length(treeTiles) do
begin
GroundObj := SmartGetFieldArray3DObject(0, hook_static_GroundTiles, Plane, treeTiles[i].y - BaseX, treeTiles[i].y - BaseX);
Temp := NULL_RSOBJECT;
Temp := R_GetInteractableObject(GroundObj, BaseX, BaseY);
if (not(Temp = NULL_RSOBJECT) and Temp.ID = treeIDs[i])then
begin
SmartFreeObject(GroundObj);
Result := Temp.Tile;
Exit;
end;
SmartFreeObject(GroundObj)
end;
end;
Edit: Almost forgot, its based on drags work, so credits.
Edit: edit:
And use reflection 2_1 or just include this function:
Simba Code:
(*
R_GetInteractableObject
~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: pascal
function R_GetInteractableObject(GroundObj, BaseX, BaseY: Integer): TRSObject;
Loads the information from the inputed GroundObj and returns a TRSObject. For
use in object searching functions in this include, not in scripts.
.. note::
by Drags111
*)
function R_GetInteractableObject(GroundObj, BaseX, BaseY: Integer): TRSObject;
var
Node, Last, Obj: Integer;
ID, SecondLevel: Integer;
begin
Node := SmartGetFieldObject(GroundObj, hook_ground_AnimableList);
while(Node <> 0)do
begin
Obj := SmartGetFieldObject(Node, hook_AnimableNode_GetAnimable);
if(Obj <> 0)then
Break;
Last := Node;
Node := SmartGetFieldObject(Last, hook_AnimableNode_GetNext);
SmartFreeObject(Last);
end;
SmartFreeObject(Node);
if(Obj <= 0)then
Exit;
ID := SmartGetFieldShort(Obj, hook_InteractiveObject_GetID) and $FFFF;
if(ID = -1) or (ID = 65535)then //65535 is an unsigned -1...
begin
SecondLevel := SmartGetFieldObject(Obj, hook_interactiveobject2_GetObjectData);
ID := SmartGetFieldInt(SecondLevel, hook_secondlevelobject_GetID) and $FFFF;
if(ID = -1) or (ID = 65535)then
begin
SmartFreeObject(SecondLevel);
SmartFreeObject(Obj);
Exit;
end;
end;
if(ID <> -1) and (ID <> 65535)then
begin
Result.ID := ID;
Result.ObjType := OBJ_INTERACTABLE;
Result.Tile.X := BaseX + (SmartGetFieldInt(Obj, hook_animable_PixelX) / 512);
Result.Tile.Y := BaseY + (SmartGetFieldInt(Obj, hook_animable_PixelY) / 512);
Result.TileArea.X1 := (BaseX + SmartGetFieldShort(Obj, hook_animableentity_getAreaX1));
Result.TileArea.Y1 := (BaseY + SmartGetFieldShort(Obj, hook_animableentity_getAreaY1));
Result.TileArea.X2 := (BaseX + SmartGetFieldShort(Obj, hook_animableentity_getAreaX2));
Result.TileArea.Y2 := (BaseY + SmartGetFieldShort(Obj, hook_animableentity_getAreaY2));
end;
SmartFreeObject(SecondLevel);
SmartFreeObject(Obj);
end;