-
-
Save SandeMC/4c6d52a05f71af24702eaa28f6b692cf to your computer and use it in GitHub Desktop.
// Originally made by Junior_Djjr - https://www.mixmods.com.br/2019/07/reload-mod.html | |
// Fixed by GillianMC - https://gist.github.com/SandeMC/4c6d52a05f71af24702eaa28f6b692cf | |
// You need: https://forum.mixmods.com.br/f16-utilidades/t179-gta3script-while-true-return_true-e-return_false | |
SCRIPT_START | |
{ | |
LVAR_INT scplayer playerId pPed i j iCmds[2] pLib bDontReloadIfFull bDisableWeaponsWithoutAnim bRealisticReload bDisabledOnSAMP bKeepNoAmmo bDisableScrollReload iCurWeapon iSkill iMaxAmmo iCurAmmo pWeapon pWeaponInfo iState iTimeInMilliseconds iReloadTime iLastCurAmmo iTotalAmmo | |
IF NOT READ_INT_FROM_INI_FILE "CLEO/Reload Mod.ini" "Controls" "CMD_Player1" (iCmds[0]) | |
OR NOT READ_INT_FROM_INI_FILE "CLEO/Reload Mod.ini" "Controls" "CMD_Player2" (iCmds[1]) | |
OR NOT READ_INT_FROM_INI_FILE "CLEO/Reload Mod.ini" "Settings" "DontReloadIfFull" (bDontReloadIfFull) | |
OR NOT READ_INT_FROM_INI_FILE "CLEO/Reload Mod.ini" "Settings" "DisableWeaponsWithoutAnim" (bDisableWeaponsWithoutAnim) | |
OR NOT READ_INT_FROM_INI_FILE "CLEO/Reload Mod.ini" "Settings" "RealisticReload" (bRealisticReload) | |
OR NOT READ_INT_FROM_INI_FILE "CLEO/Reload Mod.ini" "Settings" "DisabledOnSAMP" (bDisabledOnSAMP) | |
OR NOT READ_INT_FROM_INI_FILE "CLEO/Reload Mod.ini" "Settings" "KeepNoAmmo" (bKeepNoAmmo) | |
OR NOT READ_INT_FROM_INI_FILE "CLEO/Reload Mod.ini" "Settings" "DisableScrollReload" (bDisableScrollReload) | |
timera = 0 | |
WHILE timera < 3000 | |
WAIT 0 | |
PRINT_STRING_NOW "Error: Fail to read 'Reload Mod.ini'" 1000 | |
ENDWHILE | |
TERMINATE_THIS_CUSTOM_SCRIPT | |
ENDIF | |
IF bDisabledOnSAMP = TRUE | |
LOAD_DYNAMIC_LIBRARY "kernel32" (pLib) | |
GET_DYNAMIC_LIBRARY_PROCEDURE "GetModuleHandleA" pLib (i) | |
CALL_FUNCTION_RETURN i 1 0 ("SAMP.dll")(i) | |
FREE_DYNAMIC_LIBRARY pLib | |
IF i > 0 | |
TERMINATE_THIS_CUSTOM_SCRIPT | |
ENDIF | |
ENDIF | |
IF bKeepNoAmmo = TRUE | |
IF LOAD_DYNAMIC_LIBRARY "KeepNoAmmo.SA.asi" (i) | |
IF GET_DYNAMIC_LIBRARY_PROCEDURE "PatchNoReload" i (j) | |
CALL_FUNCTION j 0 0 | |
ENDIF | |
FREE_DYNAMIC_LIBRARY i | |
ENDIF | |
// Disabled scroll reload - credit for the code: https://libertycity.net/files/gta-san-andreas/35306-realistichnost-v-prokrutke-oruzhija.html | |
WRITE_MEMORY 0x60B4FA 4 (-1869574000) TRUE | |
WRITE_MEMORY 0x60B4FE 2 (37008) TRUE | |
ELSE | |
IF bDisableScrollReload = TRUE | |
WRITE_MEMORY 0x60B4FA 4 (-1869574000) TRUE | |
WRITE_MEMORY 0x60B4FE 2 (37008) TRUE | |
ENDIF | |
ENDIF | |
///////////////////////////////////////////// | |
WHILE TRUE | |
WAIT 0 | |
playerId = 0 | |
GOSUB Activate | |
IF IS_2PLAYER_GAME_GOING_ON | |
playerId = 1 | |
GOSUB Activate | |
ENDIF | |
ENDWHILE | |
Activate: | |
IF IS_PLAYER_CONTROL_ON playerId | |
IF GOSUB IsPressingCMD | |
GET_PLAYER_CHAR playerId (scplayer) | |
GET_PED_POINTER scplayer (pPed) | |
i = pPed + 0x718 //m_nActiveWeaponSlot | |
READ_MEMORY i 1 FALSE (i) | |
IF NOT i = 0 | |
AND NOT IS_CHAR_DEAD scplayer | |
i *= 0x1C //sizeof CWeapon | |
i += pPed | |
pWeapon = i + 0x5A0 //CWeapon | |
GET_CURRENT_CHAR_WEAPON scplayer (iCurWeapon) | |
// disabled weapons | |
IF bDisableWeaponsWithoutAnim = TRUE | |
IF iCurWeapon = WEAPONTYPE_FLAMETHROWER | |
OR iCurWeapon = WEAPONTYPE_MINIGUN | |
OR iCurWeapon = WEAPONTYPE_EXTINGUISHER | |
OR iCurWeapon = WEAPONTYPE_SPRAYCAN | |
OR iCurWeapon = WEAPONTYPE_CAMERA | |
RETURN | |
ENDIF | |
ENDIF | |
//char __thiscall CPed::GetWeaponSkill(CPed *this, eWeaponType weaponType) | |
CALL_METHOD_RETURN 0x5E3B60 pPed 1 0 (iCurWeapon)(iSkill) | |
//CWeaponInfo *__cdecl CWeaponInfo::GetWeaponInfo(eWeaponType weaponID, char skill) | |
CALL_FUNCTION_RETURN 0x743C60 2 2 (iSkill iCurWeapon)(pWeaponInfo) | |
iMaxAmmo = pWeaponInfo + 0x20 //ammoClip | |
READ_MEMORY iMaxAmmo 2 FALSE (iMaxAmmo) | |
IF iMaxAmmo > 1 // only activate on weapons with clips | |
iCurAmmo = pWeapon + 0x8 //m_nAmmoInClip | |
READ_MEMORY iCurAmmo 4 FALSE (iCurAmmo) | |
IF bDontReloadIfFull = TRUE | |
IF iCurAmmo = iMaxAmmo | |
RETURN | |
ENDIF | |
ENDIF | |
iState = pWeapon + 0x4 // m_nState | |
READ_MEMORY iState 4 FALSE (iState) | |
IF iState = 2 // reloading state | |
RETURN | |
ENDIF | |
// Don't reload if there's no spare ammo | |
iTotalAmmo = pWeapon + 0xC //m_nTotalAmmo | |
READ_MEMORY iTotalAmmo 4 FALSE (iTotalAmmo) | |
IF iTotalAmmo = iCurAmmo | |
RETURN | |
ENDIF | |
//signed int __thiscall CWeaponInfo::GetWeaponReloadTime(CWeaponInfo *this) | |
CALL_METHOD_RETURN 0x743D70 pWeaponInfo 0 0 ()(iReloadTime) | |
// Fast reload tweak | |
j = playerId * 0x190 //sizeof CPlayerInfo | |
j += 0xB7CB84 | |
READ_MEMORY j 1 FALSE (j) //CWorld::Players[playerId].fastReload | |
IF j = TRUE | |
iReloadTime /= 4 | |
ENDIF | |
// Set shot timer limit | |
READ_MEMORY 0xB7CB84 4 FALSE (iTimeInMilliseconds) | |
j = iReloadTime + iTimeInMilliseconds | |
i = pWeapon + 0x10 //m_nShotTimer | |
WRITE_MEMORY i 4 (j) FALSE | |
// Remove the clip if realistic reloading is enabled | |
IF bRealisticReload = TRUE | |
j = pWeapon + 0xC //m_nTotalAmmo | |
i = pWeapon + 0x8 //m_nAmmoInClip | |
WRITE_MEMORY i 4 (0) FALSE | |
i = iTotalAmmo-iCurAmmo | |
WRITE_MEMORY j 4 (i) FALSE | |
ENDIF | |
// Set reload state | |
i = pWeapon + 0x4 //m_nState | |
WRITE_MEMORY i 4 (2) FALSE | |
// Wait reload end | |
timera = 0 | |
i = pWeapon + 0x8 //m_nAmmoInClip | |
READ_MEMORY i 4 FALSE (iLastCurAmmo) | |
WHILE iLastCurAmmo = iCurAmmo | |
AND timera < 3000 // anti-bug | |
WAIT 0 | |
READ_MEMORY i 4 FALSE (iLastCurAmmo) | |
ENDWHILE | |
ENDIF | |
ENDIF | |
ENDIF | |
ENDIF | |
RETURN | |
IsPressingCMD: | |
i = iCmds[playerId] | |
IF i <= 19 | |
IF IS_BUTTON_PRESSED playerId i | |
RETURN_TRUE | |
RETURN | |
ENDIF | |
ELSE | |
IF IS_KEY_PRESSED i | |
RETURN_TRUE | |
RETURN | |
ENDIF | |
ENDIF | |
RETURN_FALSE | |
RETURN | |
} | |
SCRIPT_END |
@The-Haxor Hey, try the updated version, I've found some code I could put
I was only able to test it briefly but it looks like the new functionality and the bug fix both work! The mod is like 200% better now! For me, at least.
I didn't know MixSets let you disable switch reloading. I have MixSets on the backlog of mods that I wanted to check out, it just had such a long list of changes that I had been putting it off because just thinking about fully configuring it gave me a headache.
Now there's only one small thing left that's bugging me. Although I think this is technically a problem with the vanilla game, it becomes more apparent when using the mod. If you reload and, while the animation is going, you see something you wanna shoot at and you aim at it, the reload gets cancelled and then plays a second time, which wastes times and throws me off. I did a quick search and I believe MixSets doesn't fix this.
Edit: actually, it looks like more things can cancel the reload animation. If you're crouched and not moving when you start reloading then moving or standing up can cancel it too. This game is kinda annoying.
I also noticed a thing that could be a bit more relevant. In vanilla, when you walk over a weapon on the ground, doing so still puts bullets in your mag so it removes the need for reloading in some cases.
Now there's only one small thing left that's bugging me. Although I think this is technically a problem with the vanilla game, it becomes more apparent when using the mod. If you reload and, while the animation is going, you see something you wanna shoot at and you aim at it, the reload gets cancelled and then plays a second time, which wastes times and throws me off. I did a quick search and I believe MixSets doesn't fix this.
Edit: actually, it looks like more things can cancel the reload animation. If you're crouched and not moving when you start reloading then moving or standing up can cancel it too. This game is kinda annoying.
I also noticed a thing that could be a bit more relevant. In vanilla, when you walk over a weapon on the ground, doing so still puts bullets in your mag so it removes the need for reloading in some cases.
I'm afraid I can't fix either of these, sadly
I think I found an actual bug now. When using the country rifle only the first shot works. This is the config I'm using:
DisabledOnSAMP = 1
DontReloadIfFull = 1
RealisticReload = 0
DisableScrollReload = 1
KeepNoAmmo = 1
Doesn't seem to happen without KeepNoAmmo.
I think I found an actual bug now. When using the country rifle only the first shot works. This is the config I'm using: DisabledOnSAMP = 1 DontReloadIfFull = 1 RealisticReload = 0 DisableScrollReload = 1 KeepNoAmmo = 1
Doesn't seem to happen without KeepNoAmmo.
This seems to be a bug with KeepNoAmmo itself - in particular, the asi file, which has no source code, so I can't tackle on it.
At least I think that's the case.
Unlucky. I guess I can just uninstall KeepNoAmmo then. Only wanted it for being able to empty the mag and switch quickly but I guess I'll live without it. Vanilla game animation cancels are more annoying
Ah, is another additional issue, because refilling by scroll wheel is a native issue, so we now also have a new issue besides of that.
But is fixed if use MixSets, right?