diff --git a/DamageProxy/configs/damageproxy/ze_lotr_minas_tirith_v3_3.cfg b/DamageProxy/configs/damageproxy/ze_lotr_minas_tirith_v3_3.cfg index 4c78fd7c..81047b35 100644 --- a/DamageProxy/configs/damageproxy/ze_lotr_minas_tirith_v3_3.cfg +++ b/DamageProxy/configs/damageproxy/ze_lotr_minas_tirith_v3_3.cfg @@ -9,13 +9,13 @@ "z1397647" // Troll { "KnockbackMaxVel" "400" - "KnockbackScale" "0.40" + "KnockbackScale" "0.25" + "FullKnife" "1" } "z2420963" // Balrog { - "KnockbackMaxVel" "50" - "KnockbackScale" "0.05" + "KnockbackScale" "0.0" } diff --git a/DamageProxy/configs/damageproxy/ze_lotr_mount_doom_v4_2.cfg b/DamageProxy/configs/damageproxy/ze_lotr_mount_doom_v4_2.cfg new file mode 100644 index 00000000..0c62f08d --- /dev/null +++ b/DamageProxy/configs/damageproxy/ze_lotr_mount_doom_v4_2.cfg @@ -0,0 +1,8 @@ +"items" +{ + "z1385" // Nazgul + { + "KnockbackMaxVel" "500" + "KnockbackScale" "1.0" + } +} diff --git a/DamageProxy/configs/damageproxy/ze_mountain_escape_v5_zy.cfg b/DamageProxy/configs/damageproxy/ze_mountain_escape_v5_zy.cfg new file mode 100644 index 00000000..57c91199 --- /dev/null +++ b/DamageProxy/configs/damageproxy/ze_mountain_escape_v5_zy.cfg @@ -0,0 +1,23 @@ +"items" +{ + "z1783" // Nazgul + { + "KnockbackMaxVel" "500" + "KnockbackScale" "1.0" + } + + "z2530359" // Balrog + { + "KillPush" "0" + } + + "z11197" // Titan + { + "KillPush" "0" + } + + "z1910977" // Pyramid Head + { + "KillPush" "0" + } +} diff --git a/DamageProxy/configs/damageproxy/ze_paranoid_rezurrection_v11_9.cfg b/DamageProxy/configs/damageproxy/ze_paranoid_rezurrection_v11_9.cfg index 7ac3c527..0a3f29c6 100644 --- a/DamageProxy/configs/damageproxy/ze_paranoid_rezurrection_v11_9.cfg +++ b/DamageProxy/configs/damageproxy/ze_paranoid_rezurrection_v11_9.cfg @@ -2,37 +2,21 @@ { "z145960" // T-Rex { - "KnockbackMaxVel" "50" - "KnockbackScale" "0.01" + "KnockbackScale" "0.0" "KillPush" "0" } "z147102" // Balrog { - "KnockbackMaxVel" "50" - "KnockbackScale" "0.01" + "KnockbackScale" "0.0" "KillPush" "0" } "z144572" // Titan { - "KnockbackMaxVel" "50" - "KnockbackScale" "0.01" - "KillPush" "0" - } - - "z144536" // Pyramid Head - { - "KnockbackMaxVel" "50" - "KnockbackScale" "0.01" - "KillPush" "0" - } - - "z146285" // Zombie Dog - { - "KnockbackMaxVel" "50" - "KnockbackScale" "0.01" + "KnockbackScale" "0.0" "KillPush" "0" + "FullKnife" "1" } diff --git a/DamageProxy/configs/damageproxy/ze_pirates_port_royal_v3_6.cfg b/DamageProxy/configs/damageproxy/ze_pirates_port_royal_v3_6.cfg index b89cdb45..7428c0f7 100644 --- a/DamageProxy/configs/damageproxy/ze_pirates_port_royal_v3_6.cfg +++ b/DamageProxy/configs/damageproxy/ze_pirates_port_royal_v3_6.cfg @@ -2,7 +2,8 @@ { "z7560944" // Barbossa { - "KnockbackMaxVel" "250" + "KnockbackMaxVel" "350" "KnockbackScale" "0.50" + "FullKnife" "1" } } diff --git a/DamageProxy/configs/damageproxy/ze_tesv_skyrim_v4fix.cfg b/DamageProxy/configs/damageproxy/ze_tesv_skyrim_v4fix.cfg index 576c7443..e3afb8bf 100644 --- a/DamageProxy/configs/damageproxy/ze_tesv_skyrim_v4fix.cfg +++ b/DamageProxy/configs/damageproxy/ze_tesv_skyrim_v4fix.cfg @@ -4,12 +4,14 @@ { "KnockbackMaxVel" "150" "KnockbackScale" "0.25" + "FullKnife" "1" } "z1551093" // Troll { "KnockbackMaxVel" "150" "KnockbackScale" "0.25" + "FullKnife" "1" } "z1551122" // Giant diff --git a/DamageProxy/scripting/DamageProxy.sp b/DamageProxy/scripting/DamageProxy.sp index 0417b06b..5b6f0234 100644 --- a/DamageProxy/scripting/DamageProxy.sp +++ b/DamageProxy/scripting/DamageProxy.sp @@ -21,6 +21,7 @@ bool g_bLateLoad = false; Handle g_hFireBulletDetour; int g_hVelocityModifier; +int g_hActiveWeapon; int g_LastAttacker = 0; int g_LastVictim = 0; @@ -29,6 +30,7 @@ char g_iPhysboxToClient[2048]; int g_iSpecialKnife[MAXPLAYERS + 1]; bool g_bNoSlowdown[MAXPLAYERS + 1]; +bool g_bFullKnife[MAXPLAYERS + 1]; KeyValues g_Config; @@ -41,6 +43,7 @@ public void OnPluginStart() g_hFireBulletDetour = DHookCreateFromConf(hGameData, "CCSPlayer__FireBullet"); if(!g_hFireBulletDetour) SetFailState("Failed to setup detour for CCSPlayer__FireBullet"); + delete hGameData; if(!DHookEnableDetour(g_hFireBulletDetour, false, Detour_OnFireBullet)) @@ -49,6 +52,10 @@ public void OnPluginStart() g_hVelocityModifier = FindSendPropInfo("CCSPlayer", "m_flVelocityModifier"); if(g_hVelocityModifier == -1) SetFailState("Couldn't find CCSPlayer::m_flVelocityModifier"); + + g_hActiveWeapon = FindSendPropInfo("CBaseCombatCharacter", "m_hActiveWeapon"); + if(g_hActiveWeapon == -1) + SetFailState("Couldn't find CBaseCombatCharacter::m_hActiveWeapon"); } public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) @@ -107,6 +114,7 @@ public void OnClientPutInServer(int client) { g_iSpecialKnife[client] = 0; g_bNoSlowdown[client] = false; + g_bFullKnife[client] = false; if(g_Config) { @@ -141,16 +149,17 @@ public void OnWeaponEquipped(int client, int entity) if(!g_Config.JumpToKey(sHammerID)) return; - float fKnockbackMaxVel = g_Config.GetFloat("KnockbackMaxVel", -1.0); - if(fKnockbackMaxVel > 0.0) + float fKnockbackMaxVel = g_Config.GetFloat("KnockbackMaxVel", 0.0); + if(fKnockbackMaxVel >= 0.0) ZR_SetClientKnockbackMaxVelocity(client, fKnockbackMaxVel); - float fKnockbackScale = g_Config.GetFloat("KnockbackScale", -1.0); - if(fKnockbackScale > 0.0) - ZR_SetClientKnockbackScale(client, fKnockbackScale); + float fKnockbackScale = g_Config.GetFloat("KnockbackScale", 1.0); + ZR_SetClientKnockbackScale(client, fKnockbackScale); g_bNoSlowdown[client] = view_as(g_Config.GetNum("NoSlowDown", 0)); + g_bFullKnife[client] = view_as(g_Config.GetNum("FullKnife", 0)); + g_iSpecialKnife[client] = entity; CheckChildren(client, entity); @@ -164,6 +173,7 @@ public void OnWeaponDropped(int client, int entity) ZR_SetClientKnockbackScale(client, 1.0); g_iSpecialKnife[client] = 0; g_bNoSlowdown[client] = false; + g_bFullKnife[client] = false; } } @@ -267,15 +277,38 @@ public Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &dam g_LastAttacker = attacker; g_LastVictim = victim; + int flags = ZR_KNOCKBACK_CUSTOM | ZR_KNOCKBACK_SCALE | ZR_KNOCKBACK_LIMITVEL; + + if(g_bFullKnife[victim]) + { + char sWeaponClassname[64]; + if(inflictor == attacker) + { + int iWeapon = GetClientActiveWeapon(attacker); + if(iWeapon > 0) + GetEdictClassname(iWeapon, sWeaponClassname, sizeof(sWeaponClassname)); + } + else + GetEdictClassname(inflictor, sWeaponClassname, sizeof(sWeaponClassname)); + + if(StrEqual(sWeaponClassname, "weapon_knife")) + flags &= ~(ZR_KNOCKBACK_SCALE | ZR_KNOCKBACK_LIMITVEL); + } + float flVelocityModifier = 1.0; if(g_bNoSlowdown[client]) flVelocityModifier = GetEntDataFloat(client, g_hVelocityModifier); damagetype |= DMG_DROWN; - SDKHooks_TakeDamage(victim, inflictor, attacker, damage, damagetype, weapon, damageForce, damagePosition, 1); + SDKHooks_TakeDamage(victim, inflictor, attacker, damage, damagetype, weapon, damageForce, damagePosition, flags); if(g_bNoSlowdown[client] && flVelocityModifier >= 0.99) SetEntDataFloat(client, g_hVelocityModifier, 1.0, true); return Plugin_Handled; } + +stock int GetClientActiveWeapon(int client) +{ + return GetEntDataEnt2(client, g_hActiveWeapon); +} diff --git a/includes/zr/knockback.zr.inc b/includes/zr/knockback.zr.inc index 929ff7f5..1cd74cc8 100644 --- a/includes/zr/knockback.zr.inc +++ b/includes/zr/knockback.zr.inc @@ -25,6 +25,10 @@ * ============================================================================ */ +#define ZR_KNOCKBACK_CUSTOM (1<<31) +#define ZR_KNOCKBACK_SCALE (1<<1) +#define ZR_KNOCKBACK_LIMITVEL (1<<2) + /** * Set a maximum knockback velocity. *