Controlar Pickups
Enviado: 04 Mai 2018, 21:23
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
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:
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
}