From: Mario Date: Thu, 11 Dec 2014 22:50:32 +0000 (+1100) Subject: Attempt to make ladders predicted (currently quite messed up) X-Git-Tag: xonotic-v0.8.1~38^2~74 X-Git-Url: http://de.git.xonotic.org/?a=commitdiff_plain;h=10578c1b280338e143467168bee2de4f76934c8d;p=xonotic%2Fxonotic-data.pk3dir.git Attempt to make ladders predicted (currently quite messed up) --- diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index 2a97056a4..bfb845c36 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -772,6 +772,7 @@ void Ent_ReadSpawnEvent(float is_new) void Ent_RadarLink(); void Ent_Init(); void Ent_ScoresInfo(); +void ent_func_ladder(); void CSQC_Ent_Update(float bIsNewEntity) { float t; @@ -857,6 +858,7 @@ void CSQC_Ent_Update(float bIsNewEntity) case ENT_CLIENT_SPAWNEVENT: Ent_ReadSpawnEvent(bIsNewEntity); break; case ENT_CLIENT_NOTIFICATION: Read_Notification(bIsNewEntity); break; case ENT_CLIENT_HEALING_ORB: ent_healer(); break; + case ENT_CLIENT_LADDER: ent_func_ladder(); break; default: //error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype)); diff --git a/qcsrc/client/miscfunctions.qc b/qcsrc/client/miscfunctions.qc index 8b674e782..bcaf209d6 100644 --- a/qcsrc/client/miscfunctions.qc +++ b/qcsrc/client/miscfunctions.qc @@ -1,3 +1,7 @@ +// WARNING: this kills the trace globals +float WarpZoneLib_ExactTrigger_Touch(); +#define EXACTTRIGGER_TOUCH if(WarpZoneLib_ExactTrigger_Touch()) return + entity players; entity teams; var float team_count; // real teams diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 3a526dc0c..f5606dbd2 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -122,6 +122,7 @@ command/cl_cmd.qc ../common/physics.qh ../server/mutators/mutator_dodging.qc +../server/t_halflife.qc ../common/nades.qc ../common/buffs.qc diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 2be0112d7..7f6eb8da3 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -100,6 +100,7 @@ const float ENT_CLIENT_ELIMINATEDPLAYERS = 39; const float ENT_CLIENT_TURRET = 40; const float ENT_CLIENT_AUXILIARYXHAIR = 50; const float ENT_CLIENT_VEHICLE = 60; +const float ENT_CLIENT_LADDER = 61; const float ENT_CLIENT_HEALING_ORB = 80; diff --git a/qcsrc/common/physics.qc b/qcsrc/common/physics.qc index 998f0f5fa..a1e2886d3 100644 --- a/qcsrc/common/physics.qc +++ b/qcsrc/common/physics.qc @@ -1,8 +1,6 @@ .float race_penalty; .float restart_jump; -.float ladder_time; -.entity ladder_entity; .float gravity; .float swamp_slowdown; .float lastflags; @@ -458,7 +456,7 @@ void PlayerJump (void) if (self.waterlevel >= WATERLEVEL_SWIMMING) { - self.velocity_z = self.stat_sv_maxspeed * 0.7; + self.velocity_z = PHYS_MAXSPEED(self) * 0.7; return; } @@ -593,8 +591,8 @@ void RaceCarPhysics() vector rigvel; vector angles_save = self.angles; - float accel = bound(-1, PHYS_INPUT_MOVEVALUES(self).x / self.stat_sv_maxspeed, 1); - float steer = bound(-1, PHYS_INPUT_MOVEVALUES(self).y / self.stat_sv_maxspeed, 1); + float accel = bound(-1, PHYS_INPUT_MOVEVALUES(self).x / PHYS_MAXSPEED(self), 1); + float steer = bound(-1, PHYS_INPUT_MOVEVALUES(self).y / PHYS_MAXSPEED(self), 1); if (g_bugrigs_reverse_speeding) { @@ -945,7 +943,7 @@ void PM_check_spider(void) #ifdef SVQC if (time >= self.spider_slowness) return; - self.stat_sv_maxspeed *= 0.5; // half speed while slow from spider + PHYS_MAXSPEED(self) *= 0.5; // half speed while slow from spider self.stat_sv_airspeedlimit_nonqw *= 0.5; #endif } @@ -1141,7 +1139,6 @@ void PM_swim(float maxspd_mod) void PM_ladder(float maxspd_mod) { -#ifdef SVQC // on a spawnfunc_func_ladder or swimming in spawnfunc_func_water UNSET_ONGROUND(self); @@ -1158,9 +1155,9 @@ void PM_ladder(float maxspd_mod) self.velocity = self.velocity * (1 - PHYS_INPUT_TIMELENGTH * PHYS_FRICTION); makevectors(PHYS_INPUT_ANGLES(self)); //wishvel = v_forward * PHYS_INPUT_MOVEVALUES(self).x + v_right * PHYS_INPUT_MOVEVALUES(self).y + v_up * PHYS_INPUT_MOVEVALUES(self).z; - vector wishvel = v_forward * PHYS_INPUT_MOVEVALUES(self).x - + v_right * PHYS_INPUT_MOVEVALUES(self).y - + '0 0 1' * PHYS_INPUT_MOVEVALUES(self).z; + vector wishvel = v_forward * PHYS_INPUT_MOVEVALUES(self)_x + + v_right * PHYS_INPUT_MOVEVALUES(self)_y + + '0 0 1' * PHYS_INPUT_MOVEVALUES(self)_z; self.velocity_z += g; if (self.ladder_entity.classname == "func_water") { @@ -1184,11 +1181,13 @@ void PM_ladder(float maxspd_mod) } // acceleration vector wishdir = normalize(wishvel); - float wishspeed = min(vlen(wishvel), self.stat_sv_maxspeed * maxspd_mod); + float wishspeed = min(vlen(wishvel), PHYS_MAXSPEED(self) * maxspd_mod); + PM_ClientMovement_Move(); +#ifdef SVQC if (time >= self.teleport_time) +#endif // water acceleration PM_Accelerate(wishdir, wishspeed, wishspeed, PHYS_ACCELERATE*maxspd_mod, 1, 0, 0, 0); -#endif } void PM_jetpack(float maxspd_mod) @@ -1572,13 +1571,9 @@ void PM_Main() #ifdef SVQC if (self.movetype == MOVETYPE_NONE) return; -#endif -#ifdef SVQC // when we get here, disableclientprediction cannot be 2 self.disableclientprediction = 0; - if (time < self.ladder_time) - self.disableclientprediction = 1; #endif PM_check_spider(); @@ -1706,10 +1701,8 @@ void PM_Main() else if (self.waterlevel >= WATERLEVEL_SWIMMING) PM_swim(maxspeed_mod); -#ifdef SVQC else if (time < self.ladder_time) PM_ladder(maxspeed_mod); -#endif else if ((ITEMS(self) & IT_JETPACK) && PHYS_INPUT_BUTTON_HOOK(self) && (!PHYS_JETPACK_FUEL || PHYS_AMMO_FUEL(self) > 0 || (ITEMS(self) & IT_UNLIMITED_WEAPON_AMMO)) && !PHYS_FROZEN(self)) PM_jetpack(maxspeed_mod); diff --git a/qcsrc/server/t_halflife.qc b/qcsrc/server/t_halflife.qc index bb2254c97..2134a0372 100644 --- a/qcsrc/server/t_halflife.qc +++ b/qcsrc/server/t_halflife.qc @@ -1,4 +1,7 @@ +.float ladder_time; +.entity ladder_entity; +#ifdef SVQC .float roomtype; .float radius; .float pitch; @@ -33,30 +36,128 @@ void spawnfunc_info_node() {} void spawnfunc_env_sound() {} void spawnfunc_light_spot() {} void spawnfunc_func_healthcharger() {} - +#endif void func_ladder_touch() { +#ifdef SVQC if (!other.iscreature) return; if (other.vehicle_flags & VHF_ISVEHICLE) return; +#endif +#ifdef CSQC + if(other.classname != "csqcmodel") + return; +#endif EXACTTRIGGER_TOUCH; +#ifdef CSQC + print("Setting ladder time on ", other.classname, "\n"); +#endif + other.ladder_time = time + 0.1; other.ladder_entity = self; } +#ifdef SVQC +float func_ladder_send(entity to, float sf) +{ + WriteByte(MSG_ENTITY, ENT_CLIENT_LADDER); + + WriteString(MSG_ENTITY, self.classname); + WriteByte(MSG_ENTITY, self.warpzone_isboxy); + WriteByte(MSG_ENTITY, self.skin); + WriteByte(MSG_ENTITY, self.speed); + WriteByte(MSG_ENTITY, self.scale); + WriteCoord(MSG_ENTITY, self.origin_x); + WriteCoord(MSG_ENTITY, self.origin_y); + WriteCoord(MSG_ENTITY, self.origin_z); + + WriteCoord(MSG_ENTITY, self.mins_x); + WriteCoord(MSG_ENTITY, self.mins_y); + WriteCoord(MSG_ENTITY, self.mins_z); + WriteCoord(MSG_ENTITY, self.maxs_x); + WriteCoord(MSG_ENTITY, self.maxs_y); + WriteCoord(MSG_ENTITY, self.maxs_z); + + WriteCoord(MSG_ENTITY, self.movedir_x); + WriteCoord(MSG_ENTITY, self.movedir_y); + WriteCoord(MSG_ENTITY, self.movedir_z); + + WriteCoord(MSG_ENTITY, self.angles_x); + WriteCoord(MSG_ENTITY, self.angles_y); + WriteCoord(MSG_ENTITY, self.angles_z); + + return TRUE; +} + +void func_ladder_link() +{ + self.nextthink = time; + Net_LinkEntity(self, FALSE, 0, func_ladder_send); + self.nextthink = 0; +} + void spawnfunc_func_ladder() { EXACTTRIGGER_INIT; self.touch = func_ladder_touch; + + func_ladder_link(); } void spawnfunc_func_water() { EXACTTRIGGER_INIT; self.touch = func_ladder_touch; + + func_ladder_link(); +} + +#elif defined(CSQC) +.float speed; + +void func_ladder_draw() +{ + tracebox(self.origin, self.mins, self.maxs, self.origin, MOVE_NORMAL, self); + + if(trace_fraction < 1) + if(trace_ent) + { + other = trace_ent; + func_ladder_touch(); + } } +void ent_func_ladder() +{ + self.classname = strzone(ReadString()); + self.warpzone_isboxy = ReadByte(); + self.skin = ReadByte(); + self.speed = ReadByte(); + self.scale = ReadByte(); + self.origin_x = ReadCoord(); + self.origin_y = ReadCoord(); + self.origin_z = ReadCoord(); + setorigin(self, self.origin); + self.mins_x = ReadCoord(); + self.mins_y = ReadCoord(); + self.mins_z = ReadCoord(); + self.maxs_x = ReadCoord(); + self.maxs_y = ReadCoord(); + self.maxs_z = ReadCoord(); + setsize(self, self.mins, self.maxs); + self.movedir_x = ReadCoord(); + self.movedir_y = ReadCoord(); + self.movedir_z = ReadCoord(); + self.angles_x = ReadCoord(); + self.angles_y = ReadCoord(); + self.angles_z = ReadCoord(); + + self.solid = SOLID_TRIGGER; + self.draw = func_ladder_draw; + self.drawmask = MASK_NORMAL; +} +#endif diff --git a/qcsrc/warpzonelib/common.qc b/qcsrc/warpzonelib/common.qc index 6db41d133..3f9835959 100644 --- a/qcsrc/warpzonelib/common.qc +++ b/qcsrc/warpzonelib/common.qc @@ -763,3 +763,8 @@ entity WarpZone_RefSys_SpawnSameRefSys(entity me) WarpZone_RefSys_Copy(e, me); return e; } + +float WarpZoneLib_ExactTrigger_Touch() +{ + return !WarpZoneLib_BoxTouchesBrush(other.absmin, other.absmax, self, other); +} diff --git a/qcsrc/warpzonelib/util_server.qc b/qcsrc/warpzonelib/util_server.qc index daa8e6ddc..eafe2d47c 100644 --- a/qcsrc/warpzonelib/util_server.qc +++ b/qcsrc/warpzonelib/util_server.qc @@ -53,11 +53,6 @@ float WarpZoneLib_MoveOutOfSolid(entity e) return TRUE; } -float WarpZoneLib_ExactTrigger_Touch() -{ - return !WarpZoneLib_BoxTouchesBrush(other.absmin, other.absmax, self, other); -} - void WarpZoneLib_ExactTrigger_Init() { vector mi, ma;