SRL Archive - Reflection Development

FindNPCsNull is needed


Cstrike

2010-10-13 18:03:20

{*******************************************************************************
function GetNPCsNull: TNPCArray;
By: Drags111
Description: Stores all the loaded NPCs into an array of TNPC including nulls;
One line was taken out of the original.
*******************************************************************************}
function GetNPCsNull : array of TNPC;
var
i, c, NumNPCs, Index, TheNPC, TheNPCDef, TheBytes, TheNPCNode: integer;
begin
NumNPCs := SmartGetFieldInt(0,hook_static_NPCCount);
if (NumNPCs < 1) then Exit;
SetArrayLength(Result,NumNPCs);
for i := 0 to (NumNPCs-1) do
try
Index := SmartGetFieldArrayInt(0, hook_static_NPCIndexArray, i);
TheNPCNode := SmartGetFieldArrayObject(0, hook_static_NPCNodes, i);
TheNPC := SmartGetFieldObject(TheNPCNode, hook_npcnode_GetNPC);
TheNPCDef := SmartGetFieldObject(TheNPC, hook_npc_NPCDef);
TheBytes := SmartGetFieldObject(TheNPCDef, hook_npcdef_GetName);

//if (lowercase(trim(GetJavaString(TheBytes, 255))) = 'null') then continue;
Result[c].Index := Index;
Result[c].ID := SmartGetFieldInt(TheNPCDef, hook_npcdef_GetID);
Result[c].Name := GetJavaString(TheBytes, 255);
Result[c].Actions := _GetNPCActionArray(TheNPCDef);
Result[c].Tile.X := (SmartGetFieldInt(0, hook_static_BaseX) + (SmartGetFieldInt(TheNPC, hook_animable_PixelX) / 512));
Result[c].Tile.Y := (SmartGetFieldInt(0, hook_static_BaseY) + (SmartGetFieldInt(TheNPC, hook_animable_PixelY) / 512));
Result[c].Pixel.X := SmartGetFieldInt(TheNPC, hook_animable_PixelX) mod 512;
Result[c].Pixel.Y := SmartGetFieldInt(TheNPC, hook_animable_PixelY) mod 512;
Result[c].Moving := (SmartGetFieldInt(TheNPC, hook_character_Motion)>0);
Result[c].Animation := SmartGetFieldInt(TheNPC, hook_character_Animation);
Result[c].Height := iabs(SmartGetFieldInt(TheNPC, hook_character_GetHeight));
Result[c].HPRatio := SmartGetFieldInt(TheNPC, hook_character_HPRatio) * 100 / $FF;
Result[c].Fighting := (SmartGetFieldInt(TheNPC, hook_character_LoopCycleStatus) >
SmartGetFieldInt(0, hook_static_LoopCycle));
Result[c].Orientation := Round(FixD(180 + (SmartGetFieldInt(TheNPC, hook_character_Orientation)* 45) / 2048));
Result[c].Level := SmartGetFieldInt(TheNPCDef, hook_npcdef_GetLevel);
Result[c].Interacting := SmartGetFieldInt(TheNPC, hook_character_GetInteracting);
Inc(c);

finally
SmartFreeObject(TheNPCNode);
SmartFreeObject(TheNPC);
SmartFreeObject(TheNPCDef);
SmartFreeObject(TheBytes);
end;
SetLength(Result, c);
end;

That is the new code that would have to be added.
I commented one line out.

I'm doing the frog princess random and the princess + all the other frogs return as name: "null", but the original one doesn't put forward the information if the name is null.

Is there any way to shrink it or inherit code so the entire procedure doesn't have to be made again?


If anyone wants to test/commit after testing it, then I can post the Frog thing :)

Naike

2010-10-14 08:30:34

Is there anything else, except the randoms which results this way?

If not, then we could easily add it to the anti randoms core..

Cstrike

2010-10-14 10:50:33

Actually thats a good point, I haven't come across anything in RS yet [if at all] that is null. Is that an option?

Naike

2010-10-14 15:06:18

I'm going to think about it..

Trying to get a random @ Main and see..
I might write a tutorial/core thingy for randoms, as they need to look somewhat alike.

If all randoms are null, then we add it ofc.