Nox Triggers code

패닉 2020. 2. 21. 09:26



유닛 구조오프셋에서 유닛의 충돌, 사용, 파괴를 제어하는 함수를 다룹니다


원리는 각 이벤트에 기본적으로 셋팅된 함수에서 동작원리를 모방하여 새로운 함수를 생성 후,

기본 셋팅 함수포인터 주소를 새로 생성한 함수 쪽으로 돌려서 새로운 함수가 호출되도록 하는 것입니다


타겟 유닛의 구조오프셋 주소를 본문에서는 ptr 으로 칭합니다


::유닛의 충돌:: --0x2F0


int ImportUnitCollideFunc()
{
    int arr[10], link;

    if (!link)
    {
        arr[0] = 0x50731068; arr[1] = 0x50565500; arr[2] = 0x14246C8B; arr[3] = 0x1824748B;
        arr[4] = 0x02F0858B; arr[5] = 0x56550000; arr[6] = 0x2454FF50; arr[7] = 0x0CC48318;
        arr[8] = 0x835D5E58; arr[9] = 0x90C304C4;
        CancelTimer(FrameTimerWithArg(10, ImportUnitCollideFunc, ImportUnitCollideFunc));
        link = GetMemory(GetMemory(0x75ae28) + (0x30 * GetMemory(GetMemory(0x83395c) + 8) + 0x1c));
    }
    return link;
}


이 유닛이 다른 대상과 충돌 시 특정 스크립트가 호출되며 내부정의는 하기에 나와있습니다


-사용방법

ptr+0x2f0 주소에는 충돌 시 호출될 스크립트 함수의 번호가 들어갑니다

ptr+0x2b8 주소에 위 함수가 return 하는 값을 넣으면 됩니다


self- 충돌 주체

other- 충돌 상대방


::유닛의 사용:: --0x2FC


int ImportUseItemFunc()
{
    int arr[10], link;
    if (!link)
    {
        arr[0] = 0x50731068; arr[1] = 0x50565500; arr[2] = 0x1424748B; arr[3] = 0x18246C8B;
        arr[4] = 0x02FC858B; arr[5] = 0x56550000; arr[6] = 0x2454FF50; arr[7] = 0x0CC48318;
        arr[8] = 0x835D5E58; arr[9] = 0x90C304C4;
        CancelTimer(FrameTimerWithArg(10, ImportUseItemFunc, ImportUseItemFunc));
        link = GetMemory(GetMemory(0x75ae28) + (0x30 * GetMemory(GetMemory(0x83395c) + 8) + 0x1c));
    }
    return link;
}


플레이어가 인벤토리에 들어있는 이 유닛을 사용(클릭)할 때마다 특정 스크립트가 호출됩니다


-사용방법

ptr+0x2fc 주소에는 사용 시 호출될 스크립트 함수의 번호가 들어갑니다

ptr+0x2dc 주소에 위 함수가 return 하는 값을 넣으면 됩니다


self- 사용(클릭)된 아이템

other- 아이템을 사용한 유닛


::유닛의 파괴:: --0x2F4


int ImportUnitDieFunc()
{
    int arr[9], link;

    if (!link)
    {
        arr[0] = 0x50731068; arr[1] = 0x8B565000; arr[2] = 0x8B102474; arr[3] = 0x0002F486;
        arr[4] = 0x006A5600; arr[5] = 0x2454FF50; arr[6] = 0x0CC48314; arr[7] = 0xC483585E;
        arr[8] = 0x9090C304;
        CancelTimer(FrameTimerWithArg(10, ImportUnitDieFunc, ImportUnitDieFunc));
        link = GetMemory(GetMemory(0x75ae28) + (0x30 * GetMemory(GetMemory(0x83395c) + 8) + 0x1c));
    }
    return link;
}


유닛이 파괴될 때 특정 스크립트가 호출됩니다


-사용방법

ptr+0x2f4 주소에는 파괴 시 호출될 스크립트 함수의 번호가 들어갑니다

ptr+0x2d4 주소에 위 함수가 return 하는 값을 넣으면 됩니다


self- 파괴된 주체


::유닛의 드롭:: --0x2F8


int ImportUnitDropFunc()
{
    int arr[10], link;

    if (!link)
    {
        arr[0] = 0x50731068; arr[1] = 0x55565300; arr[2] = 0x14245C8B; arr[3] = 0x1824748B;
        arr[4] = 0x02F8AE8B; arr[5] = 0x53560000; arr[6] = 0x2454FF55; arr[7] = 0x0CC48318;
        arr[8] = 0x835B5E5D; arr[9] = 0x90C304C4;
        CancelTimer(FrameTimerWithArg(10, ImportUnitDropFunc, ImportUnitDropFunc));
        link = GetMemory(GetMemory(0x75ae28) + (0x30 * GetMemory(GetMemory(0x83395c) + 8) + 0x1c));
    }
    return link;
}


유닛이 버려질 때 특정 스크립트가 호출됩니다


-사용방법

ptr+0x2f8 주소에는 드롭 시 호출될 스크립트 함수의 번호가 들어갑니다

ptr+0x2c8 주소에 위 함수가 return 하는 값을 넣으면 됩니다

아이템 드롭을 사용자가 직접 처리해줘야 합니다

그렇지 않으면 아이템이 버려지지 않습니다(그때마다 스크립트 함수 호출은 됨)


self- 드롭된 아이템

other- 아이템을 드롭한 대상



::유닛의 픽업:: --0x2E4


int ImportUnitPickupFunc()
{
    int arr[10], link;

    if (!link)
    {
        arr[0] = 0x50731068; arr[1] = 0x55565300; arr[2] = 0x14245C8B; arr[3] = 0x1824748B;
        arr[4] = 0x02E4AE8B; arr[5] = 0x53560000; arr[6] = 0x2454FF55; arr[7] = 0x0CC48318;
        arr[8] = 0x835B5E5D; arr[9] = 0x90C304C4;
        CancelTimer(FrameTimerWithArg(10, ImportUnitPickupFunc, ImportUnitPickupFunc));
        link = GetMemory(GetMemory(0x75ae28) + (0x30 * GetMemory(GetMemory(0x83395c) + 8) + 0x1c));
    }
    return link;
}



유닛을 주울 때 특정 스크립트가 호출됩니다


-사용방법

ptr+0x2e4 주소에는 드롭 시 호출될 스크립트 함수의 번호가 들어갑니다

ptr+0x2c4 주소에 위 함수가 return 하는 값을 넣으면 됩니다

아이템 픽업을 사용자가 직접 처리해 주지 않으면 아이템이 클릭만 될 뿐 주워지지가 않습니다


self- 픽업된 아이템

other- 아이템을 픽업한 대상



:: PlaySoundAround 함수 ::

웨이포인트가 아닌 유닛에 효과음을 내는 함수입니다


void PlaySoundAround(int sUnit, int sNumber)
{
    int unitPtr = UnitToPtr(sUnit), temp = GetMemory(0x5c325c);

    if (unitPtr)
    {
        SetMemory(0x5c325c, ImportPlaySoundAround());
        Unused74(unitPtr, sNumber);
        SetMemory(0x5c325c, temp);
    }
}

int ImportPlaySoundAround()
{
    int arr[17], link;

    if (!link)
    {
        arr[0] = 0x50196068; arr[1] = 0x72506800; arr[2] = 0x50560050; arr[3] = 0x082454FF;
        arr[4] = 0x54FFF08B; arr[5] = 0x006A0824; arr[6] = 0x5650006A; arr[7] = 0x1C2454FF;
        arr[8] = 0x5810C483; arr[9] = 0x08C4835E; arr[10] = 0x909090C3;
        CancelTimer(FrameTimerWithArg(10, ImportPlaySoundAround, ImportPlaySoundAround));
        link = GetMemory(GetMemory(0x75ae28) + (0x30 * GetMemory(GetMemory(0x83395c) + 8) + 0x1c));
    }
    return link;
}



sUnit -- 효과음을 낼 유닛입니다

sNumber --효과음 번호입니다