Schedule_t struct needs contiguous array of
Task structures. What you are doing is, you are making a "cell" array of "OrpheuStructure" handles and trying to pass it to Schedule_t struct. tlHCRangeAttack1 is a mere array of OrpheuStructure Handles (in fact, they are pointers to the allocated structs in memory pool) which reference to random memory segments (non contiguous).
Orpheu deals with structures good enough but lacks control for arrays of structures. So to pack these non contiguous stucts, i added a native
OrpheuPackStructures to latest version of Orpheu. Use that to get pointer to packed structure array and pass it to Schedule struct, like,
PHP Code:
static OrpheuStruct:tlHCRangeAttack1[6]
static OrpheuStruct:slHCRangeAttack1
tlHCRangeAttack1[0] = OrpheuCreateStruct(OrpheuStructTask)
OrpheuSetStructMember(tlHCRangeAttack1[0], "iTask", TASK_STOP_MOVING)
OrpheuSetStructMember(tlHCRangeAttack1[0], "flData", 0.0)
tlHCRangeAttack1[1] = OrpheuCreateStruct(OrpheuStructTask)
OrpheuSetStructMember(tlHCRangeAttack1[1], "iTask", TASK_FACE_IDEAL)
OrpheuSetStructMember(tlHCRangeAttack1[1], "flData", 0.0)
tlHCRangeAttack1[2] = OrpheuCreateStruct(OrpheuStructTask)
OrpheuSetStructMember(tlHCRangeAttack1[2], "iTask", TASK_RANGE_ATTACK1)
OrpheuSetStructMember(tlHCRangeAttack1[2], "flData", 0.0)
tlHCRangeAttack1[3] = OrpheuCreateStruct(OrpheuStructTask)
OrpheuSetStructMember(tlHCRangeAttack1[3], "iTask", TASK_SET_ACTIVITY)
OrpheuSetStructMember(tlHCRangeAttack1[3], "flData", 1.0)
tlHCRangeAttack1[4] = OrpheuCreateStruct(OrpheuStructTask)
OrpheuSetStructMember(tlHCRangeAttack1[4], "iTask", TASK_FACE_IDEAL)
OrpheuSetStructMember(tlHCRangeAttack1[4], "flData", 0.0)
tlHCRangeAttack1[5] = OrpheuCreateStruct(OrpheuStructTask)
OrpheuSetStructMember(tlHCRangeAttack1[5], "iTask", TASK_WAIT_RANDOM)
OrpheuSetStructMember(tlHCRangeAttack1[5], "flData", 0.5)
new OrpheuStruct:iHCPackPointer = OrpheuPackStructures( tlHCRangeAttack1, 6 );
slHCRangeAttack1 = OrpheuCreateStruct(OrpheuStructSchedule)
OrpheuSetStructMember(slHCRangeAttack1, "pTasklist", iHCPackPointer)
OrpheuSetStructMember(slHCRangeAttack1, "cTasks", sizeof(tlHCRangeAttack1))
OrpheuSetStructMember(slHCRangeAttack1, "iInterruptMask", bits_COND_ENEMY_OCCLUDED | bits_COND_NO_AMMO_LOADED)
OrpheuSetStructMember(slHCRangeAttack1, "iSoundMask", 0)
OrpheuSetStructMember(slHCRangeAttack1, "pName", "HCRangeAttack1")
public OrpheuHookReturn:GetScheduleOfType(iMonster, iType)
{
switch ( iType )
{
case SCHED_RANGE_ATTACK1:
{
OrpheuSetReturn(slHCRangeAttack1)
return OrpheuOverride
}
}
return OrpheuIgnored
}
In brief, OrpheuPackStructures will transform all the structs into a single contiguous Structure Array.
TIP: HACKY,
Now if you want to test whether all the structs passed are aligned correctly, use the handle returned with incremented offset of sizeof(tlHCRangeAttack1[1]) means sizeof(
TaskStruct) = 8, like,
PHP Code:
new OrpheuStruct:taskStruct;
for( new i=0; i < 6*8; i+=8 )
{
taskStruct = OrpheuGetStructFromAddress(OrpheuStructTask, _:iHCPackPointer+i)
log_amx( "%d. iHCPackPointer: %x", i, _:iHCPackPointer+i )
log_amx( "iTask: %i", OrpheuGetStructMember(taskStruct, "iTask") )
}
__________________