From 9c086b32f381d18eddf8f081504b026cf16fa412 Mon Sep 17 00:00:00 2001 From: divverent Date: Sat, 13 Jun 2009 18:36:58 +0000 Subject: [PATCH] DP_SV_BOUNCEFACTOR git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9019 d7cf8633-e32d-0410-b094-e92efae38249 --- progsvm.h | 2 ++ prvm_edict.c | 2 ++ sv_phys.c | 17 ++++++++++++++--- svvm_cmds.c | 1 + 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/progsvm.h b/progsvm.h index c6676386..b14c99fa 100644 --- a/progsvm.h +++ b/progsvm.h @@ -226,6 +226,8 @@ typedef struct prvm_prog_fieldoffsets_s int viewmodelforclient; // ssqc int viewzoom; // ssqc int yaw_speed; // ssqc / csqc + int bouncefactor; // ssqc + int bouncestop; // ssqc } prvm_prog_fieldoffsets_t; diff --git a/prvm_edict.c b/prvm_edict.c index c7ecc92e..e0f37732 100644 --- a/prvm_edict.c +++ b/prvm_edict.c @@ -1529,6 +1529,8 @@ void PRVM_FindOffsets(void) prog->fieldoffsets.viewmodelforclient = PRVM_ED_FindFieldOffset("viewmodelforclient"); prog->fieldoffsets.viewzoom = PRVM_ED_FindFieldOffset("viewzoom"); prog->fieldoffsets.yaw_speed = PRVM_ED_FindFieldOffset("yaw_speed"); + prog->fieldoffsets.bouncefactor = PRVM_ED_FindFieldOffset("bouncefactor"); + prog->fieldoffsets.bouncestop = PRVM_ED_FindFieldOffset("bouncestop"); prog->funcoffsets.CSQC_ConsoleCommand = PRVM_ED_FindFunctionOffset("CSQC_ConsoleCommand"); prog->funcoffsets.CSQC_Ent_Remove = PRVM_ED_FindFunctionOffset("CSQC_Ent_Remove"); prog->funcoffsets.CSQC_Ent_Spawn = PRVM_ED_FindFunctionOffset("CSQC_Ent_Spawn"); diff --git a/sv_phys.c b/sv_phys.c index 434d0834..bc4d42f1 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -1985,7 +1985,18 @@ void SV_Physics_Toss (prvm_edict_t *ent) { float d, ent_gravity; prvm_eval_t *val; - ClipVelocity (ent->fields.server->velocity, trace.plane.normal, ent->fields.server->velocity, 1.5); + float bouncefactor = 0.5f; + float bouncestop = 60.0f / 800.0f; + + val = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.bouncefactor); + if (val!=0 && val->_float) + bouncefactor = val->_float; + + val = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.bouncestop); + if (val!=0 && val->_float) + bouncestop = val->_float; + + ClipVelocity (ent->fields.server->velocity, trace.plane.normal, ent->fields.server->velocity, 1 + bouncefactor); // LordHavoc: fixed grenades not bouncing when fired down a slope val = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.gravity); if (val!=0 && val->_float) @@ -1995,7 +2006,7 @@ void SV_Physics_Toss (prvm_edict_t *ent) if (sv_gameplayfix_grenadebouncedownslopes.integer) { d = DotProduct(trace.plane.normal, ent->fields.server->velocity); - if (trace.plane.normal[2] > 0.7 && fabs(d) < sv_gravity.value * (60.0 / 800.0) * ent_gravity) + if (trace.plane.normal[2] > 0.7 && fabs(d) < sv_gravity.value * bouncestop * ent_gravity) { ent->fields.server->flags = (int)ent->fields.server->flags | FL_ONGROUND; ent->fields.server->groundentity = PRVM_EDICT_TO_PROG(trace.ent); @@ -2007,7 +2018,7 @@ void SV_Physics_Toss (prvm_edict_t *ent) } else { - if (trace.plane.normal[2] > 0.7 && ent->fields.server->velocity[2] < sv_gravity.value * (60.0 / 800.0) * ent_gravity) + if (trace.plane.normal[2] > 0.7 && ent->fields.server->velocity[2] < sv_gravity.value * bouncestop * ent_gravity) { ent->fields.server->flags = (int)ent->fields.server->flags | FL_ONGROUND; ent->fields.server->groundentity = PRVM_EDICT_TO_PROG(trace.ent); diff --git a/svvm_cmds.c b/svvm_cmds.c index 05979415..8bd628f5 100644 --- a/svvm_cmds.c +++ b/svvm_cmds.c @@ -121,6 +121,7 @@ char *vm_sv_extensions = "DP_SOLIDCORPSE " "DP_SPRITE32 " "DP_SV_BOTCLIENT " +"DP_SV_BOUNCEFACTOR " "DP_SV_CLIENTCOLORS " "DP_SV_CLIENTNAME " "DP_SV_CMD " -- 2.39.2