XC_Engine by Higor hooktestvX aka v19 is able to bring the most wanted Voodoo Magic by replacing bad function from a common actor into another one - changed. As result we can replace original Engine stuff for a more sanitized game-server. We have "a few" errors to solve which I'm gonna quote right from source-code.
This list >>
- log (Self.Name@found XC_Engine Version@NXC$". Proceed tweaks...");
class 'BigBioGel'.Default.RemoteRole = ROLE_SimulatedProxy;
ReplaceFunction( class 'GameInfo', Class 'XC_GameInfo', 'ScoreKill', 'ScoreKill' );
ReplaceFunction( class 'GameInfo', Class 'XC_GameInfo', 'Killed', 'Killed' );
ReplaceFunction( class 'Decoration', Class 'XC_Decoration', 'ZoneChange', 'ZoneChange' );
ReplaceFunction( class 'Decoration', Class 'XC_Decoration', 'Destroyed', 'Tw_Destroyed' );
ReplaceFunction( class 'Decoration', Class 'XC_Decoration', 'skinnedFrag', 'Tw_skinnedFrag' );
ReplaceFunction( class 'Decoration', Class 'XC_Decoration', 'Frag', 'Tw_Frag' );
ReplaceFunction( class 'Weapon', Class 'XC_Weapon', 'CheckVisibility', 'CheckVisibility' );
ReplaceFunction( class 'TranslocStart', Class 'XC_TranslocStart', 'SpecialHandling', 'SpecialHandling' );
ReplaceFunction( class 'JumpSpot', Class 'XC_JumpSpot', 'SpecialCost', 'SpecialCost' );
ReplaceFunction( class 'JumpSpot', Class 'XC_JumpSpot', 'SpecialHandling', 'SpecialHandling' );
ReplaceFunction( class 'Pickup', Class 'XC_Pickup', 'UsedUp', 'Tw_UsedUp' );
ReplaceFunction( class 'Flashlight', Class 'XC_FlashLight', 'Tick', 'Tw_Tick','Activated' );
ReplaceFunction( class 'Eightball', Class 'XC_Eightball', 'Tick', 'Tw_AltFireTick', 'AltFiring' );
ReplaceFunction( class 'Eightball', Class 'XC_Eightball', 'Tick', 'Tw_FireTick', 'NormalFire' );
ReplaceFunction( class 'Eightball', Class 'XC_Eightball', 'BeginState', 'Tw_BeginState', 'FireRockets' );
ReplaceFunction( class 'UT_Eightball', Class 'XC_UT_Eightball', 'BeginState', 'FireRockets_BeginState', 'FireRockets' );
ReplaceFunction( class 'ShockProj', Class 'XC_ShockProj', 'SuperExplosion', 'Tw_SuperExplosion' );
ReplaceFunction( class 'RazorBladeAlt', Class 'XC_RazorBladeAlt', 'Tick', 'Flying_Tick', 'Flying' );
ReplaceFunction( class 'BruteProjectile', Class 'XC_BruteProjectile', 'BlowUp', 'Tw_BlowUp', 'Flying' );
ReplaceFunction( class 'Pawn', Class 'XC_Pawn', 'AdjustHitLocation', 'Tw_AdjustHitLocation' );
ReplaceFunction( class 'NaliRabbit', Class 'XC_NaliRabbit', 'PickDestination', 'Tw_PickDestination', 'Evade' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'AttitudeTo', 'AttitudeTo' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'SeePlayer', 'SeePlayer' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'FireProjectile', 'Tw_FireProjectile' );
// ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'ChooseAttackMode', 'ChooseAttackMode', 'Attacking' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'ChooseTeamAttackFor', 'ChooseTeamAttackFor' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'Killed', 'Killed' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'SetHome', 'StartUp_SetHome', 'Startup' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'MeleeDamageTarget', 'Tw_MeleeDamageTarget' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'StartRoaming', 'Tw_StartRoaming' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'TakeDamage', 'Patroling_TakeDamage', 'Patroling' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'TakeDamage', 'Guarding_TakeDamage', 'Guarding' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'TakeDamage', 'Threatening_TakeDamage', 'Threatening' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'Timer', 'Charging_Timer', 'Charging' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'Timer', 'TacticalMove_Timer', 'TacticalMove' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'PlayCombatMove', 'XC_PlayCombatMove' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'PickDestination', 'TacticalMove_PickDestination', 'TacticalMove' );
ReplaceFunction( class 'ScriptedPawn', Class 'XC_ScriptedPawn', 'BeginState', 'TacticalMove_BeginState', 'TacticalMove' );
ReplaceFunction( class 'BabyCow', Class 'XC_BabyCow', 'TakeDamage', 'Grazing_TakeDamage', 'Grazing' );
ReplaceFunction( class 'BabyCow', Class 'XC_BabyCow', 'PickDestination', 'Grazing_PickDestination', 'Grazing' );
ReplaceFunction( class 'SkaarjTrooper', Class 'XC_SkaarjTrooper', 'BeginState', 'StartUp_BeginState', 'StartUp' );
ReplaceFunction( class 'SkaarjTrooper', Class 'XC_SkaarjTrooper', 'SetHome', 'ST_SetHome', 'StartUp' );
ReplaceFunction( class 'SkaarjTrooper', Class 'XC_SkaarjTrooper', 'PlayMovingAttack', 'Tw_PlayMovingAttack' );
ReplaceFunction( class 'SkaarjTrooper', Class 'XC_SkaarjTrooper', 'PlayFiring', 'Tw_PlayFiring' );
ReplaceFunction( class 'Pupae', Class 'XC_Pupae', 'PlayMeleeAttack', 'Tw_PlayMeleeAttack' );
ReplaceFunction( class 'Nali', Class 'XC_Nali', 'Killed', 'Tw_Killed' );
ReplaceFunction( class 'Nali', Class 'XC_Nali', 'AdjustHitLocation', 'Tw_AdjustHitLocation' );
ReplaceFunction( class 'Titan', Class 'XC_Titan', 'SpawnRock', 'Tw_SpawnRock' );
ReplaceFunction( class 'Titan', Class 'XC_Titan', 'PunchDamageTarget', 'Tw_PunchDamageTarget' );
ReplaceFunction( class 'Titan', Class 'XC_Titan', 'SlapDamageTarget', 'Tw_SlapDamageTarget' );
ReplaceFunction( class 'Warlord', Class 'XC_Warlord', 'PlayRangedAttack', 'Tw_WPlayRangedAttack' );
ReplaceFunction( class 'Warlord', Class 'XC_Warlord', 'PlayMovingAttack', 'Tw_WPlayMovingAttack' );
ReplaceFunction( class 'Mercenary', Class 'XC_Mercenary', 'SprayTarget', 'Tw_SprayTarget');
ReplaceFunction( class 'Brute', Class 'XC_Brute', 'PlayRangedAttack', 'Tw_PlayRangedAttack');
ReplaceFunction( class 'Gasbag', Class 'XC_Gasbag', 'PlayRangedAttack', 'Tw_PlayRangedAttack');
ReplaceFunction( class 'Gasbag', Class 'XC_Gasbag', 'SpawnBelch', 'SpawnBelch');
ReplaceFunction( class 'GiantGasbag', Class 'XC_GiantGasbag', 'SpawnBelch', 'SpawnBelch');
ReplaceFunction( class 'Queen', Class 'XC_Queen', 'SpawnShot', 'SpawnShot');
ReplaceFunction( class 'SkaarjWarrior', Class 'XC_SkaarjWarrior', 'SpawnTwoShots', 'SpawnTwoShots');
ReplaceFunction( class 'Tentacle', Class 'XC_Tentacle', 'PlayRangedAttack', 'PlayRangedAttack');
ReplaceFunction( class 'SkaarjBerserker', Class 'XC_SkaarjBerserker', 'WhatToDoNext', 'Tw_WhatToDoNext');
log (Self.Name@ - Tweaks Done!);
As long as I don't see all the time functions from projectiles tweaked well due to Net codes involved I was heading to ruin some hard-coded projectiles which looks ugly in Net games. As example is old Eightball with SeekingRocket - you cannot define AltProjectileClass because weapon refers to a class declared not at "defaultproperties" - stupid move. In this case function firing bad class will be attacked for firing another class (a hybrid projectile looking better On-Line). Aside firing function is wrapped in case of a projectile swallowed by some BSP or other thing causing a null access to a NON fired projectile - the same is UT_Eightball.
Thoughts:
Due to my job and the rest of things taking my brain space I think I forgot some stuff and I want to listen at some proposals toward these fixes. We don't have to forget that some Monsters are using modified functions for firing projectiles, so Net Stuff will involve a bit of work for each subclass abstract eg: SkaarjWarrior.uc - function "SpawnTwoShots" - in case of bad projectile will fire better ones. As you can see I'm trying to address General bad stock stuff and not a single target (game-type).
If we can debate other custom stuff without causing dependencies I listen proposals... I won't nominate examples of errors to not initialize some storm as long as some coders think are OK but they are not, and neither interested to finish their work.
Edit: Releasing something: XC_MonsterHunt >> https://goo.gl/wuCQFo
Edit2 May 28 2018: A conformed update in package XC_MonsterHunt_1_02.zip is available.