Restructure and add class name callbacks

This commit is contained in:
Dinorush
2023-08-18 05:58:42 -04:00
parent 8611986afb
commit ca008d8e86
3 changed files with 1354 additions and 167 deletions
+5 -1
View File
@@ -7,7 +7,11 @@
"Scripts": [
{
"Path": "weaponFireCallbacks.gnut",
"RunOn": "SERVER"
"RunOn": "CLIENT || SERVER"
},
{
"Path": "weaponFireReroutes.gnut",
"RunOn": "CLIENT || SERVER"
}
]
}
+111 -154
View File
@@ -3,194 +3,151 @@ untyped
globalize_all_functions
struct {
table < entity, array< void functionref(WeaponPrimaryAttackParams attackParams) > > weaponCallbacks
table < entity, array< void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) > > weaponCallbacks
table < string, array< void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) > > weaponClassCallbacks
table < string, array< void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) > > ownerClassCallbacks
bool clearThreadRunning = false // Only used on client
} file
void function AddCallback_OnWeaponFired(entity weapon, void functionref(WeaponPrimaryAttackParams attackParams) callback){
if(weapon in file.weaponCallbacks){
void function WeaponFireCallbacks_AddCallbackOnWeaponFired( entity weapon, void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) callback )
{
if ( !IsValid( weapon ) )
return
if ( weapon in file.weaponCallbacks )
file.weaponCallbacks[weapon].append( callback )
}else{
else
file.weaponCallbacks[weapon] <- [callback]
}
AddEntityDestroyedCallback(weapon, HandleWeaponDestroyed)
#if SERVER
AddEntityDestroyedCallback( weapon, WeaponFireCallbacks_HandleWeaponDestroyed )
#else
// Per-entity destroyed callbacks don't exist on client. Client needs to clear invalid keys periodically.
if ( !file.clearThreadRunning )
thread ClearInvalidWeaponsThread()
#endif
}
function HandleWeaponDestroyed(weapon){
void function WeaponFireCallbacks_AddCallbackOnWeaponClassFired( string weaponClass, void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) callback )
{
if ( weaponClass in file.weaponClassCallbacks )
file.weaponClassCallbacks[weaponClass].append( callback )
else
file.weaponClassCallbacks[weaponClass] <- [callback]
}
void function WeaponFireCallbacks_RemoveCallbackOnWeaponClassFired( string weaponClass, void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) callback )
{
if ( weaponClass in file.weaponClassCallbacks )
{
file.weaponClassCallbacks[weaponClass].fastremovebyvalue( callback )
if ( file.weaponClassCallbacks[weaponClass].len() == 0 )
delete file.weaponClassCallbacks[weaponClass]
}
}
void function WeaponFireCallbacks_AddCallbackOnOwnerClassFired( string ownerClass, void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) callback )
{
if ( ownerClass in file.ownerClassCallbacks )
file.ownerClassCallbacks[ownerClass].append( callback )
else
file.ownerClassCallbacks[ownerClass] <- [callback]
}
void function WeaponFireCallbacks_RemoveCallbackOnOwnerClassFired( string ownerClass, void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) callback )
{
if ( ownerClass in file.ownerClassCallbacks )
{
file.ownerClassCallbacks[ownerClass].fastremovebyvalue( callback )
if ( file.ownerClassCallbacks[ownerClass].len() == 0 )
delete file.ownerClassCallbacks[ownerClass]
}
}
function WeaponFireCallbacks_HandleWeaponDestroyed( weapon )
{
entity w = expect entity( weapon )
if(w in file.weaponCallbacks){
if ( w in file.weaponCallbacks )
delete file.weaponCallbacks[w]
}
}
void function OnWeaponFired(entity weapon, WeaponPrimaryAttackParams attackParams){
if(weapon in file.weaponCallbacks){
array< void functionref(WeaponPrimaryAttackParams attackParams) > callbacks = file.weaponCallbacks[weapon]
foreach(callback in callbacks){
callback(attackParams)
}
}
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_alternator_smg( entity weapon, WeaponPrimaryAttackParams attackParams )
#if CLIENT
void function ClearInvalidWeaponsThread()
{
var result = OnWeaponPrimaryAttack_alternator_smg(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
file.clearThreadRunning = true
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_defender( entity weapon, WeaponPrimaryAttackParams attackParams )
while( file.weaponCallbacks.len() > 0 )
{
var result = OnWeaponPrimaryAttack_weapon_defender(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
array< entity > invalidList = []
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_doubletake( entity weapon, WeaponPrimaryAttackParams attackParams )
foreach( key, callback in file.weaponCallbacks )
{
var result = OnWeaponPrimaryAttack_weapon_doubletake(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
if ( !IsValid( key ) )
invalidList.append( key )
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_lmg( entity weapon, WeaponPrimaryAttackParams attackParams )
foreach( w in invalidList )
delete file.weaponCallbacks[w]
wait 1.0 // Some arbitrary number that isn't WaitFrame(), don't need to run this very often
}
file.clearThreadRunning = false
}
#endif
void function WeaponFireCallbacks_OnWeaponFired( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed )
{
var result = OnWeaponPrimaryAttack_lmg(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_lstar( entity weapon, WeaponPrimaryAttackParams attackParams )
if ( weapon in file.weaponCallbacks )
{
var result = OnWeaponPrimaryAttack_weapon_lstar(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
#if CLIENT
ClearInvalidWeapons()
#endif
array< void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) > callbacks = file.weaponCallbacks[weapon]
foreach ( callback in callbacks )
callback( weapon, attackParams, ammoUsed )
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_mastiff( entity weapon, WeaponPrimaryAttackParams attackParams )
string weaponClass = weapon.GetWeaponClassName()
if ( weaponClass in file.weaponClassCallbacks )
{
var result = OnWeaponPrimaryAttack_weapon_mastiff(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
array< void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) > callbacks = file.weaponClassCallbacks[weaponClass]
foreach ( callback in callbacks )
callback( weapon, attackParams, ammoUsed )
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_mgl( entity weapon, WeaponPrimaryAttackParams attackParams )
entity owner = weapon.GetWeaponOwner()
if ( !IsValid( owner ) )
return
string ownerClass = owner.GetClassName()
if ( ownerClass in file.ownerClassCallbacks )
{
var result = OnWeaponPrimaryAttack_weapon_mgl(weapon, attackParams)
if(result == 0){
return 0
array< void functionref( entity weapon, WeaponPrimaryAttackParams attackParams, var ammoUsed ) > callbacks = file.ownerClassCallbacks[ownerClass]
foreach ( callback in callbacks )
callback( weapon, attackParams, ammoUsed )
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_rocket_launcher( entity weapon, WeaponPrimaryAttackParams attackParams )
var function WeaponFireCallbacks_OnWeaponPrimaryAttack( entity weapon, WeaponPrimaryAttackParams attackParams )
{
var result = OnWeaponPrimaryAttack_weapon_rocket_launcher(weapon, attackParams)
if(result == 0){
weapon.EmitWeaponNpcSound( LOUD_WEAPON_AI_SOUND_RADIUS_MP, 0.2 )
var result = weapon.FireWeaponBullet( attackParams.pos, attackParams.dir, 1, weapon.GetWeaponDamageFlags() )
if ( result == 0 )
return 0
}
OnWeaponFired(weapon, attackParams)
WeaponFireCallbacks_OnWeaponFired( weapon, attackParams, result )
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_shotgun( entity weapon, WeaponPrimaryAttackParams attackParams )
#if SERVER
var function WeaponFireCallbacks_OnWeaponNpcPrimaryAttack( entity weapon, WeaponPrimaryAttackParams attackParams )
{
var result = OnWeaponPrimaryAttack_weapon_shotgun(weapon, attackParams)
if(result == 0){
weapon.EmitWeaponNpcSound( LOUD_WEAPON_AI_SOUND_RADIUS_MP, 0.2 )
var result = weapon.FireWeaponBullet( attackParams.pos, attackParams.dir, 1, weapon.GetWeaponDamageFlags() )
if ( result == 0 )
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_shotgun_doublebarrel( entity weapon, WeaponPrimaryAttackParams attackParams )
{
var result = OnWeaponPrimaryAttack_shotgun_doublebarrel(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_shotgun_pistol( entity weapon, WeaponPrimaryAttackParams attackParams )
{
var result = OnWeaponPrimaryAttack_weapon_shotgun_pistol(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_smart_pistol( entity weapon, WeaponPrimaryAttackParams attackParams )
{
var result = OnWeaponPrimaryAttack_weapon_smart_pistol(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_smr( entity weapon, WeaponPrimaryAttackParams attackParams )
{
var result = OnWeaponPrimaryAttack_weapon_smr(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_sniper( entity weapon, WeaponPrimaryAttackParams attackParams )
{
var result = OnWeaponPrimaryAttack_weapon_sniper(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_softball( entity weapon, WeaponPrimaryAttackParams attackParams )
{
var result = OnWeaponPrimaryAttack_weapon_softball(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
return result
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_weapon_generic( entity weapon, WeaponPrimaryAttackParams attackParams ){
OnWeaponFired(weapon, attackParams)
}
var function WeaponFireCallbacks_OnWeaponPrimaryAttack_GenericBoltWithDrop_Player( entity weapon, WeaponPrimaryAttackParams attackParams ){
var result = OnWeaponPrimaryAttack_GenericBoltWithDrop_Player(weapon, attackParams)
if(result == 0){
return 0
}
OnWeaponFired(weapon, attackParams)
WeaponFireCallbacks_OnWeaponFired( weapon, attackParams, result )
return result
}
#endif
File diff suppressed because it is too large Load Diff