Improve custom knockback API
This commit is contained in:
		| @@ -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. |  * Set a maximum knockback velocity. | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -81,6 +81,7 @@ void KnockbackOnClientDeath(int client) | |||||||
|  |  | ||||||
| void KnockbackSetClientMaxVelocity(int client, float fVelocity) | void KnockbackSetClientMaxVelocity(int client, float fVelocity) | ||||||
| { | { | ||||||
|  |     if(g_fKnockbackVelLimit[client] >= 0.0) | ||||||
|         g_fKnockbackVelLimit[client] = fVelocity; |         g_fKnockbackVelLimit[client] = fVelocity; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -172,8 +173,6 @@ public void KnockbackOnTakeDamageAlivePost(int victim, int attacker, int inflict | |||||||
|     ReplaceString(weaponname, sizeof(weaponname), "weapon_", ""); |     ReplaceString(weaponname, sizeof(weaponname), "weapon_", ""); | ||||||
|     ReplaceString(weaponname, sizeof(weaponname), "_projectile", ""); |     ReplaceString(weaponname, sizeof(weaponname), "_projectile", ""); | ||||||
|  |  | ||||||
|     bool knife = StrEqual(weaponname, "knife"); |  | ||||||
|  |  | ||||||
|     // Check if a grenade was thrown. |     // Check if a grenade was thrown. | ||||||
|     if (StrEqual(weaponname, "hegrenade")) |     if (StrEqual(weaponname, "hegrenade")) | ||||||
|     { |     { | ||||||
| @@ -209,11 +208,15 @@ public void KnockbackOnTakeDamageAlivePost(int victim, int attacker, int inflict | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     bool custom = view_as<bool>(damagecustom & ZR_KNOCKBACK_CUSTOM); | ||||||
|  |     bool scale = custom && view_as<bool>(damagecustom & ZR_KNOCKBACK_SCALE); | ||||||
|  |     bool limitvel = custom && view_as<bool>(damagecustom & ZR_KNOCKBACK_LIMITVEL); | ||||||
|  |  | ||||||
|     int hitgroup = HITGROUP_GENERIC; |     int hitgroup = HITGROUP_GENERIC; | ||||||
|     if (!(damagetype & DMG_BLAST) && !damagecustom) |     if (!(damagetype & DMG_BLAST) && !custom) | ||||||
|         hitgroup = ToolsGetClientLastHitGroup(victim); |         hitgroup = ToolsGetClientLastHitGroup(victim); | ||||||
|  |  | ||||||
|     if (damagecustom) |     if (custom) | ||||||
|         ToolsSetClientLastHitGroup(victim, HITGROUP_GENERIC); |         ToolsSetClientLastHitGroup(victim, HITGROUP_GENERIC); | ||||||
|  |  | ||||||
|     new bool:hitgroups = GetConVarBool(g_hCvarsList[CVAR_HITGROUPS]); |     new bool:hitgroups = GetConVarBool(g_hCvarsList[CVAR_HITGROUPS]); | ||||||
| @@ -231,11 +234,12 @@ public void KnockbackOnTakeDamageAlivePost(int victim, int attacker, int inflict | |||||||
|     knockback *= damage; |     knockback *= damage; | ||||||
|  |  | ||||||
|     // Custom knockback scale. |     // Custom knockback scale. | ||||||
|     if (!knife) |     if (scale) | ||||||
|         knockback *= g_fKnockbackScale[victim]; |         knockback *= g_fKnockbackScale[victim]; | ||||||
|  |  | ||||||
|     // Apply knockback. |     // Apply knockback. | ||||||
|     KnockbackSetVelocity(victim, attackerloc, clientloc, knockback, damagecustom && !knife); |     if (knockback) | ||||||
|  |         KnockbackSetVelocity(victim, attackerloc, clientloc, knockback, limitvel); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -246,7 +250,7 @@ public void KnockbackOnTakeDamageAlivePost(int victim, int attacker, int inflict | |||||||
|  * @param endpoint      The ending coordinate to push towards. |  * @param endpoint      The ending coordinate to push towards. | ||||||
|  * @param magnitude     Magnitude of the push. |  * @param magnitude     Magnitude of the push. | ||||||
|  */ |  */ | ||||||
| KnockbackSetVelocity(client, const Float:startpoint[3], const Float:endpoint[3], Float:magnitude, int custom) | KnockbackSetVelocity(client, const Float:startpoint[3], const Float:endpoint[3], Float:magnitude, int limitvel) | ||||||
| { | { | ||||||
|     // Create vector from the given starting and ending points. |     // Create vector from the given starting and ending points. | ||||||
|     new Float:vector[3]; |     new Float:vector[3]; | ||||||
| @@ -258,7 +262,7 @@ KnockbackSetVelocity(client, const Float:startpoint[3], const Float:endpoint[3], | |||||||
|     // Apply the magnitude by scaling the vector (multiplying each of its components). |     // Apply the magnitude by scaling the vector (multiplying each of its components). | ||||||
|     ScaleVector(vector, magnitude); |     ScaleVector(vector, magnitude); | ||||||
|  |  | ||||||
|     if (custom && g_fKnockbackVelLimit[client]) |     if (limitvel && g_fKnockbackVelLimit[client]) | ||||||
|     { |     { | ||||||
|         AddVectors(g_fKnockbackVectors[client], vector, g_fKnockbackVectors[client]); |         AddVectors(g_fKnockbackVectors[client], vector, g_fKnockbackVectors[client]); | ||||||
|         g_bKnockbackFrame[client] = true; |         g_bKnockbackFrame[client] = true; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user