set g_vore_regurgitatecolor_digest "0.15 0.25 0" "the color players will have when digested, only works when g_vore_keepdeadprey is disabled"\r
set g_vore_keepdeadprey 1 "If enabled, prey remains in the stomach after dying, else the predator throws up their dead body. 0 = disabled, 1 = enabled, anything between = probability"\r
\r
+set g_healthsize 100 "Players who are low on health shrink and become smaller, value specifies health at which the player has default size"\r
+set g_healthsize_movementfactor 0.5 "Amount by which player size affects jumping and running"\r
+set g_healthsize_exteriorweapon_scalefactor 1 "Amount by which player size resizes the exterior weapon model"\r
+set g_healthsize_weapon_scalefactor 0.5 "Amount by which player size resizes the view weapon model"\r
+set g_healthsize_weapon_scalefactor_pos 4 "Amount by which the view model is moved vertically based on player size"\r
+set g_healthsize_min 50 "Player size may not drop below this amount of health"\r
+set g_healthsize_max 150 "Player size may not grow past this amount of health"\r
+\r
// part of an ugly hack for the menu audio sliders to work with the cutsound feature\r
seta menu_volume 0.5\r
seta menu_bgmvolume 1\r
return vercmp_recursive(v1, v2);\r
}\r
\r
+void ApplyHealthSize()\r
+{\r
+ if not(cvar("g_healthsize"))\r
+ return;\r
+\r
+ if(self.predator.classname == "player" || self.fakeprey)\r
+ {\r
+ self.view_ofs = PL_CROUCH_VIEW_OFS * self.predator.scale;\r
+ self.scale = 0;\r
+ }\r
+ else\r
+ {\r
+ self.scale = bound(cvar("g_healthsize_min"), self.health, cvar("g_healthsize_max")) / cvar("g_healthsize");\r
+\r
+ // The following code sets the bounding box to match the player's size.\r
+ // It is currently disabled because of issues with engine movement prediction (cl_movement).\r
+ // The engine expects the bounding box to be default size, and changing it will cause glitches.\r
+ // This code may be enabled once the engine has the ability to use different bbox sizes for movement prediction.\r
+ if(self.crouch)\r
+ {\r
+ //setsize (self, PL_CROUCH_MIN * self.scale, PL_CROUCH_MAX * self.scale);\r
+ self.view_ofs = PL_CROUCH_VIEW_OFS * self.scale;\r
+ }\r
+ else\r
+ {\r
+ //setsize (self, PL_MIN * self.scale, PL_MAX * self.scale);\r
+ self.view_ofs = PL_VIEW_OFS * self.scale;\r
+ }\r
+ }\r
+}\r
+\r
void ObserverThink()\r
{\r
if (self.flags & FL_JUMPRELEASED) {\r
}\r
}\r
\r
+ // health based player size\r
+ ApplyHealthSize();\r
+\r
FixPlayermodel();\r
\r
GrabberFrame();\r
}\r
\r
mjumpheight = cvar("sv_jumpvelocity");\r
+ if(self.scale) // we are smaller or larger, so we jump lower or higher\r
+ mjumpheight *= (1 - cvar("g_healthsize_movementfactor")) + cvar("g_healthsize_movementfactor") * self.scale; \r
if (self.waterlevel >= WATERLEVEL_SWIMMING)\r
{\r
if (self.watertype == CONTENT_WATER)\r
if(speedclamp)\r
accelqw = -accelqw;\r
\r
+ if(self.scale) // we are smaller or larger, so we run slower or faster\r
+ wishspeed *= (1 - cvar("g_healthsize_movementfactor")) + cvar("g_healthsize_movementfactor") * self.scale; \r
+\r
if(cvar("sv_gameplayfix_q2airaccelerate"))\r
wishspeed0 = wishspeed;\r
\r
self.solid = oldself.solid;\r
self.takedamage = oldself.takedamage;\r
self.think = oldself.think;\r
+ self.scale = oldself.scale;\r
self.customizeentityforclient = oldself.customizeentityforclient;\r
self.uncustomizeentityforclient = oldself.uncustomizeentityforclient;\r
self.uncustomizeentityforclient_set = oldself.uncustomizeentityforclient_set;\r
}\r
\r
// create or update the lasertarget entity\r
+\r
+ // if we are a micro or macro, size the weapon model accordingly\r
+ if(self.owner.scale && cvar("g_healthsize_weapon_scalefactor"))\r
+ {\r
+ self.weaponentity.scale = (1 + cvar("g_healthsize_weapon_scalefactor")) - cvar("g_healthsize_weapon_scalefactor") * self.owner.scale;\r
+ self.weaponentity.origin_z = (1 - self.weaponentity.scale) * cvar("g_healthsize_weapon_scalefactor_pos");\r
+ }\r
};\r
\r
void CL_ExteriorWeaponentity_Think()\r
self.angles = ang;\r
}\r
\r
+ // if we are a micro or macro, size the weapon model accordingly\r
+ if(self.owner.scale && cvar("g_healthsize_exteriorweapon_scalefactor"))\r
+ {\r
+ self.scale = 1 / self.owner.scale; // for some reason, the exterior weapon entity copies the player's scale somewhere else, so undo that first\r
+ self.scale = (1 - cvar("g_healthsize_exteriorweapon_scalefactor")) + cvar("g_healthsize_exteriorweapon_scalefactor") * self.scale;\r
+ }\r
+\r
self.colormap = self.owner.colormap;\r
self.customizeentityforclient = CL_ExteriorWeaponentity_CustomizeEntityForClient;\r
};\r
{\r
// check if we can swallow a player instead of firing our weapon\r
\r
+ float swallow_range;\r
vector vore_w_shotorg, vore_w_shotdir;\r
- vore_w_shotorg = self.origin + self.view_ofs;\r
+\r
+ swallow_range = cvar("g_balance_vore_swallow_range");\r
+ if(self.scale) // we can swallow from further or closer based on our size\r
+ swallow_range *= self.scale;\r
+ vore_w_shotorg = self.origin;\r
vore_w_shotdir = v_forward;\r
\r
- WarpZone_traceline_antilag(self, vore_w_shotorg, vore_w_shotorg + vore_w_shotdir * cvar("g_balance_vore_swallow_range"), FALSE, self, ANTILAG_LATENCY(self));\r
+ WarpZone_traceline_antilag(self, vore_w_shotorg, vore_w_shotorg + vore_w_shotdir * swallow_range, FALSE, self, ANTILAG_LATENCY(self));\r
if(trace_fraction < 1)\r
if(trace_ent.classname == "player")\r
return trace_ent;\r