Improved knockback, renamed ZTele function, changed ZStuck to reset velocity, modified velocity changing function, removed unneeded offset (basevelocity)

This commit is contained in:
Greyscale 2009-03-30 21:40:56 +02:00
parent 965de0e697
commit 1dc1f5cefe
6 changed files with 72 additions and 23 deletions

View File

@ -26,6 +26,7 @@ enum ZRSettings
Handle:CVAR_ZOMBIE_JUMP_DISTANCE, Handle:CVAR_ZOMBIE_JUMP_DISTANCE,
Handle:CVAR_ZOMBIE_JUMP_HEIGHT, Handle:CVAR_ZOMBIE_JUMP_HEIGHT,
Handle:CVAR_ZOMBIE_KNOCKBACK, Handle:CVAR_ZOMBIE_KNOCKBACK,
Handle:CVAR_ZOMBIE_KNOCKBACK_GRENADE,
Handle:CVAR_ZOMBIE_NVGS, Handle:CVAR_ZOMBIE_NVGS,
Handle:CVAR_ZOMBIE_FOV, Handle:CVAR_ZOMBIE_FOV,
Handle:CVAR_ZOMBIE_REGEN, Handle:CVAR_ZOMBIE_REGEN,
@ -111,6 +112,7 @@ CreateCvars()
gCvars[CVAR_ZOMBIE_JUMP_DISTANCE] = CreateConVar("zr_zombie_jump_distance", "0.1", "How far the zombie jumps, (0: Regular jump distance)"); gCvars[CVAR_ZOMBIE_JUMP_DISTANCE] = CreateConVar("zr_zombie_jump_distance", "0.1", "How far the zombie jumps, (0: Regular jump distance)");
gCvars[CVAR_ZOMBIE_JUMP_HEIGHT] = CreateConVar("zr_zombie_jump_height", "10.0", "How high a zombie jumps (0: Regular jump height)"); gCvars[CVAR_ZOMBIE_JUMP_HEIGHT] = CreateConVar("zr_zombie_jump_height", "10.0", "How high a zombie jumps (0: Regular jump height)");
gCvars[CVAR_ZOMBIE_KNOCKBACK] = CreateConVar("zr_zombie_knockback", "1", "How far zombies are pushed back when shot. If classes are enabled: This one is a multiplier for class knockback values (1: Default)"); gCvars[CVAR_ZOMBIE_KNOCKBACK] = CreateConVar("zr_zombie_knockback", "1", "How far zombies are pushed back when shot. If classes are enabled: This one is a multiplier for class knockback values (1: Default)");
gCvars[CVAR_ZOMBIE_KNOCKBACK_GRENADE] = CreateConVar("zr_zombie_knockback_grenade", "4.0", "Knockback multiplier when a grenade inflicts damage on a zombie. (4.0: Default)");
gCvars[CVAR_ZOMBIE_NVGS] = CreateConVar("zr_zombie_nvgs", "-1", "Zombies will be equipped with nightvision. Also used to override class nvgs if non-negative. (-1: No override, uses class setting, 0: No nvgs, 1: Nvgs on)"); gCvars[CVAR_ZOMBIE_NVGS] = CreateConVar("zr_zombie_nvgs", "-1", "Zombies will be equipped with nightvision. Also used to override class nvgs if non-negative. (-1: No override, uses class setting, 0: No nvgs, 1: Nvgs on)");
gCvars[CVAR_ZOMBIE_FOV] = CreateConVar("zr_zombie_fov", "110", "The field of vision of zombies (90: Default vision)"); gCvars[CVAR_ZOMBIE_FOV] = CreateConVar("zr_zombie_fov", "110", "The field of vision of zombies (90: Default vision)");
gCvars[CVAR_ZOMBIE_REGEN] = CreateConVar("zr_zombie_regen", "0", "Zombies will regenerate health"); gCvars[CVAR_ZOMBIE_REGEN] = CreateConVar("zr_zombie_regen", "0", "Zombies will regenerate health");

View File

@ -304,18 +304,21 @@ public Action:PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
if (!StrEqual(weapon, "hegrenade")) if (!StrEqual(weapon, "hegrenade"))
{ {
GetClientAbsOrigin(attacker, attackerloc); GetPlayerEyePosition(attacker, attackerloc);
new bool:shotgun = (StrEqual(weapon, "m3") || StrEqual(weapon, "xm1014")); new Float:attackerang[3];
GetPlayerEyeAngles(attacker, attackerang);
KnockBack(index, clientloc, attackerloc, knockback, dmg, shotgun); TR_TraceRayFilter(attackerloc, attackerang, MASK_ALL, RayType_Infinite, TraceRayFilter);
TR_GetEndPosition(clientloc);
KnockBack(index, clientloc, attackerloc, knockback, dmg, false);
} }
else else
{ {
new Float:heLoc[3]; FindExplodingGrenade(attackerloc);
FindExplodingGrenade(heLoc);
KnockBack(index, clientloc, heLoc, knockback, dmg, true); KnockBack(index, clientloc, attackerloc, knockback, dmg, true);
} }
} }
} }
@ -360,6 +363,16 @@ public Action:PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
UpdateAlphaDamaged(index); UpdateAlphaDamaged(index);
} }
public bool:TraceRayFilter(entity, contentsMask)
{
if (entity > 0 && entity < MAXPLAYERS)
{
return false;
}
return true;
}
FindExplodingGrenade(Float:heLoc[3]) FindExplodingGrenade(Float:heLoc[3])
{ {
decl String:classname[64]; decl String:classname[64];

View File

@ -6,7 +6,6 @@
* ==================== * ====================
*/ */
new offsBaseVelocity;
new offsGetVelocity0; new offsGetVelocity0;
new offsGetVelocity1; new offsGetVelocity1;
new offsGetVelocity2; new offsGetVelocity2;
@ -23,15 +22,11 @@ new offsRender;
new Handle:g_hGameConf = INVALID_HANDLE; new Handle:g_hGameConf = INVALID_HANDLE;
new Handle:g_hRemoveAllItems = INVALID_HANDLE; new Handle:g_hRemoveAllItems = INVALID_HANDLE;
new Handle:g_hTerminateRound = INVALID_HANDLE; new Handle:g_hTerminateRound = INVALID_HANDLE;
new Handle:g_hEyePosition = INVALID_HANDLE;
new Handle:g_hEyeAngles = INVALID_HANDLE;
FindOffsets() FindOffsets()
{ {
offsBaseVelocity = FindSendPropInfo("CBasePlayer", "m_vecBaseVelocity");
if (offsBaseVelocity == -1)
{
SetFailState("Couldn't find \"m_vecBaseVelocity\"!");
}
offsGetVelocity0 = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]"); offsGetVelocity0 = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]");
if (offsGetVelocity0 == -1) if (offsGetVelocity0 == -1)
{ {
@ -111,6 +106,16 @@ SetupGameData()
PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Virtual, "RemoveAllItems"); PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Virtual, "RemoveAllItems");
g_hRemoveAllItems = EndPrepSDKCall(); g_hRemoveAllItems = EndPrepSDKCall();
StartPrepSDKCall(SDKCall_Player);
PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Virtual, "EyePosition");
PrepSDKCall_SetReturnInfo(SDKType_QAngle, SDKPass_ByValue);
g_hEyePosition = EndPrepSDKCall();
StartPrepSDKCall(SDKCall_Player);
PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Virtual, "EyeAngles");
PrepSDKCall_SetReturnInfo(SDKType_QAngle, SDKPass_ByValue);
g_hEyeAngles = EndPrepSDKCall();
StartPrepSDKCall(SDKCall_GameRules); StartPrepSDKCall(SDKCall_GameRules);
PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Signature, "TerminateRound"); PrepSDKCall_SetFromConf(g_hGameConf, SDKConf_Signature, "TerminateRound");
PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain); PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
@ -118,9 +123,21 @@ SetupGameData()
g_hTerminateRound = EndPrepSDKCall(); g_hTerminateRound = EndPrepSDKCall();
} }
SetPlayerVelocity(client, const Float:vec[3]) SetPlayerVelocity(client, const Float:vec[3], bool:reset)
{ {
SetEntDataVector(client, offsBaseVelocity, vec, true); if (reset)
{
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, vec);
}
else
{
new Float:fVelocity[3];
GetPlayerVelocity(client, fVelocity);
AddVectors(vec, fVelocity, fVelocity);
TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, fVelocity);
}
} }
GetPlayerVelocity(client, Float:vel[3]) GetPlayerVelocity(client, Float:vel[3])
@ -190,6 +207,16 @@ RemoveAllPlayersWeapons(client)
SDKCall(g_hRemoveAllItems, client); SDKCall(g_hRemoveAllItems, client);
} }
GetPlayerEyePosition(client, Float:vec[3])
{
SDKCall(g_hEyePosition, client, vec);
}
GetPlayerEyeAngles(client, Float:ang[3])
{
SDKCall(g_hEyeAngles, client, ang);
}
TerminateRound(Float:delay, reason) TerminateRound(Float:delay, reason)
{ {
if (g_hTerminateRound == INVALID_HANDLE) return; if (g_hTerminateRound == INVALID_HANDLE) return;

View File

@ -30,6 +30,11 @@ public Action:SayCommand(client, argc)
MainMenu(client); MainMenu(client);
} }
if (StrEqual(args, "!zadmin", false))
{
ZRAdminMenu(client);
}
else if (StrEqual(args, "!zclass", false)) else if (StrEqual(args, "!zclass", false))
{ {
ZClass(client); ZClass(client);
@ -50,7 +55,7 @@ public Action:SayCommand(client, argc)
StrEqual(args, "!tele", false) || StrEqual(args, "!tele", false) ||
StrEqual(args, "!teleport", false)) StrEqual(args, "!teleport", false))
{ {
ZTeleClientCheck(client); ZTele(client);
} }
else if (StrEqual(args, "!teleabort", false)) else if (StrEqual(args, "!teleabort", false))
@ -268,7 +273,7 @@ ZStuck(client)
nudge[0] = x; nudge[0] = x;
nudge[1] = y; nudge[1] = y;
SetPlayerVelocity(client, nudge); SetPlayerVelocity(client, nudge, true);
} }
public Action:CollisionOn(Handle:timer, any:index) public Action:CollisionOn(Handle:timer, any:index)

View File

@ -333,7 +333,7 @@ public Action:Command_TeleportAbort(client, argc)
return Plugin_Handled; return Plugin_Handled;
} }
bool:ZTeleClientCheck(client) bool:ZTele(client)
{ {
// Check if the teleporter is disabled. // Check if the teleporter is disabled.
new bool:tele = GetConVarBool(gCvars[CVAR_ZTELE]); new bool:tele = GetConVarBool(gCvars[CVAR_ZTELE]);

View File

@ -428,7 +428,7 @@ ApplyZombieAlpha(client)
SetPlayerAlpha(client, alpha); SetPlayerAlpha(client, alpha);
} }
KnockBack(client, const Float:clientloc[3], const Float:attackerloc[3], Float:power, dmg, bool:boost) KnockBack(client, const Float:clientloc[3], const Float:attackerloc[3], Float:power, dmg, bool:grenade)
{ {
if (!IsPlayerZombie(client)) if (!IsPlayerZombie(client))
{ {
@ -438,18 +438,20 @@ KnockBack(client, const Float:clientloc[3], const Float:attackerloc[3], Float:po
new Float:vector[3]; new Float:vector[3];
MakeVectorFromPoints(attackerloc, clientloc, vector); MakeVectorFromPoints(attackerloc, clientloc, vector);
NormalizeVector(vector, vector); NormalizeVector(vector, vector);
vector[0] *= power * (float(dmg) * 1.5); vector[0] *= power * (float(dmg) * 1.5);
vector[1] *= power * (float(dmg) * 1.5); vector[1] *= power * (float(dmg) * 1.5);
vector[2] *= power * (float(dmg) * 1.5); vector[2] *= power * (float(dmg) * 1.5);
if (boost) if (grenade)
{ {
ScaleVector(vector, 4.0); new Float:knockback_grenade = GetConVarFloat(gCvars[CVAR_ZOMBIE_KNOCKBACK_GRENADE]);
ScaleVector(vector, knockback_grenade);
} }
SetPlayerVelocity(client, vector); SetPlayerVelocity(client, vector, false);
} }
JumpBoost(client, Float:distance, Float:height) JumpBoost(client, Float:distance, Float:height)
@ -462,7 +464,7 @@ JumpBoost(client, Float:distance, Float:height)
vel[1] *= distance; vel[1] *= distance;
vel[2] = height; vel[2] = height;
SetPlayerVelocity(client, vel); SetPlayerVelocity(client, vel, false);
} }
PlayerLeft(client) PlayerLeft(client)