Página 1 de 1

Controlar Pickups

Enviado: 04 Mai 2018, 21:23
por Junior_Djjr
Atenção: CLEO+ agora já inclui comandos para controlar pickups.
GET_PICKUP_THIS_COORD
GET_PICKUP_MODEL
GET_PICKUP_POINTER
GET_PICKUP_TYPE


Descrição:
Infelizmente a atual versão da CLEO e MoonLoader não nos possibilita pegar e ter o controle dos pickups do mapa, impossibilitando mods como este.

Nesta solução, além de pegar o handle dos pickups do mapa (para comandos que pedem um PICKUP), você também pode pegar o ponteiro pra struct dele (CPickup), e o pickup como objeto para ser usado em comandos que pedem um OBJECT.

Ou seja, um controle total, tudo o que você precisa.

No exemplo irá iluminar (efeito de corona) todos os pickups existentes.
Esse loop do início irá rodar por todos os pickups existentes (pode ser meio pesado para o jogo, só use em loop se realmente necessário).


GTA3script

Exemplo completo:

Código: Selecionar tudo

SCRIPT_START
{
    NOP
    LVAR_INT i j k pStartPickups pEndPickups iSizeOfPickup
    LVAR_INT hPickup pPickup hObjectPickup
    LVAR_FLOAT x y z

    WHILE TRUE
        WAIT 0

        // Interate to all pickups
        // Get array start, end and size to make it compatible with limit adjusters
        READ_MEMORY 0x48ADC3 4 TRUE (pStartPickups)
        READ_MEMORY 0x4590E4 4 TRUE (pEndPickups)
        READ_MEMORY 0x4590E1 1 TRUE (iSizeOfPickup)
        pPickup = pStartPickups
        pEndPickups -= iSizeOfPickup
        WHILE pPickup < pEndPickups
            // pPickup now is pointer to a CPickup
            j = pPickup + 0x1A
            READ_MEMORY j 2 FALSE (j)
            j *= 0x10000
            k = pPickup - pStartPickups
            k /= iSizeOfPickup
            hPickup = j + k
            // hPickup now is ref to a script pickup

            IF DOES_PICKUP_EXIST hPickup // Looks like it doesn't work, but keeping here if some other mod fixes
            AND NOT HAS_PICKUP_BEEN_COLLECTED hPickup
                IF CLEO_CALL GetPickupObject 0 (pPickup)(hObjectPickup)
                    GET_OBJECT_COORDINATES hObjectPickup (x y z)
                    DRAW_CORONA (x y z) 0.7 CORONATYPE_TORUS 0 (255 255 255)
                ENDIF
            ENDIF

            pPickup += iSizeOfPickup
        ENDWHILE

    ENDWHILE
}
SCRIPT_END

{
    LVAR_INT pPickup // In
    LVAR_INT pObject hObject
    LVAR_INT i j k

    GetPickupObject:
    pPickup += 4
    READ_MEMORY pPickup 4 FALSE (pObject)
    IF pObject > 0
        GET_OBJECT_REF pObject (hObject)
        CLEO_RETURN 0 (hObject)
    ELSE
        CLEO_RETURN 0 (-1)
    ENDIF
}

// Not used in this example, but useful:
{
    LVAR_INT hPickup // In
    LVAR_INT pPickup
    LVAR_INT i j k pStartPickups iSizeOfPickup

    GetPickupPointer:
    i = hPickup
    j = i / 65536
    k = j * 65536
    i -= k
    READ_MEMORY 0x48ADC3 4 TRUE (iSizeOfPickup)
    i *= iSizeOfPickup
    READ_MEMORY 0x48ADC3 4 TRUE (pStartPickups)
    i += pStartPickups
    k = i + 0x1A
    READ_MEMORY k 2 FALSE (k)
    IF j = k
        RETURN_TRUE
        CLEO_RETURN 0 (i)
    ELSE
        RETURN_FALSE
        CLEO_RETURN 0 (-1)
    ENDIF
}

Re: Controlar Pickups

Enviado: 09 Jul 2020, 08:59
por Junior_Djjr
Eu refiz tudo, agora não precisa mais usar o GetPickupPointer e é compatível com limit adjuster.