]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Attempt to make ladders predicted (currently quite messed up)
authorMario <zacjardine@y7mail.com>
Thu, 11 Dec 2014 22:50:32 +0000 (09:50 +1100)
committerMario <zacjardine@y7mail.com>
Thu, 11 Dec 2014 22:51:04 +0000 (09:51 +1100)
qcsrc/client/Main.qc
qcsrc/client/miscfunctions.qc
qcsrc/client/progs.src
qcsrc/common/constants.qh
qcsrc/common/physics.qc
qcsrc/server/t_halflife.qc
qcsrc/warpzonelib/common.qc
qcsrc/warpzonelib/util_server.qc

index 2a97056a43d21b7568ea143c620e911b6e7d41c5..bfb845c36a7e9a5b843a72dfb0cbcc4d8caac8c0 100644 (file)
@@ -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));
index 8b674e7826c2ccd6529e46a703d55ee00a21a2ae..bcaf209d67e5e9b77b0e9543175ebcdf0f74dce8 100644 (file)
@@ -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
index 3a526dc0c230809f8bd36af86851a340fb9c5ca3..f5606dbd2181d63d9a88ed735f4e95fc44b7f2f4 100644 (file)
@@ -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
index 2be0112d79ea149954224636dfb225c70704392a..7f6eb8da32ba1097b979ede6570e89f1e38621d4 100644 (file)
@@ -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;
 
index 998f0f5fa12a645f4a675a132b4a0eb198ae53ef..a1e2886d328f490c4620fa16dce19fe82745bae4 100644 (file)
@@ -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);
index bb2254c977d91e4cd427b5d3e6c2c3fcfea115a0..2134a037249a812b74d748244c59a595eb27ef51 100644 (file)
@@ -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
index 6db41d133997388bc4ef125ca76b0aac6cd33215..3f98359592383f494cf38f189003b571e936aa22 100644 (file)
@@ -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);
+}
index daa8e6ddc17b4c6d23536066a67d3033141ff103..eafe2d47c0541dfcf7de17baacde6d3e985e408d 100644 (file)
@@ -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;