]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/cl_client.qc
New vehicle system based on weapons system
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / cl_client.qc
index 1ab2b7ab512ea82d0b7368fdec781a2124d97a73..08a0f027b0ba6c86ef865d89ab5c4ec498c8d8a0 100644 (file)
@@ -1610,7 +1610,11 @@ void player_regen (void)
 
                // if player rotted to death...  die!
                if(self.health < 1)
+               {
+                       if(self.vehicle)
+                               vehicles_exit(VHEF_RELESE);
                        self.event_damage(self, self, 1, DEATH_ROT, self.origin, '0 0 0');
+               }
        }
 
        if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
@@ -2133,6 +2137,7 @@ void SpectatorThink()
        self.flags |= FL_CLIENT | FL_NOTARGET;
 }
 
+void vehicles_enter (entity pl, entity veh);
 void PlayerUseKey()
 {
        if not(IS_PLAYER(self))
@@ -2143,6 +2148,34 @@ void PlayerUseKey()
         vehicles_exit(VHEF_NORMAL);
         return;
        }
+       else if(autocvar_g_vehicles_enter)
+       {
+               if not(self.freezetag_frozen)
+               if(self.deadflag == DEAD_NO)
+               {
+                       entity head, closest_target = world;
+                       head = WarpZone_FindRadius(self.origin, autocvar_g_vehicles_enter_radius, TRUE);
+                               
+                       while(head) // find the closest acceptable target to enter
+                       {
+                               if(head.vehicle_flags & VHF_ISVEHICLE)
+                               if(head.deadflag == DEAD_NO)
+                               if not(head.owner)
+                               {
+                                       if(closest_target)
+                                       {
+                                               if(vlen(self.origin - head.origin) < vlen(self.origin - closest_target.origin))
+                                               { closest_target = head; }
+                                       }
+                                       else { closest_target = head; }
+                               }
+                               
+                               head = head.chain;
+                       }
+                               
+                       if(closest_target) { vehicles_enter(self, closest_target); return; }
+               }
+       }
        
        // a use key was pressed; call handlers
        MUTATOR_CALLHOOK(PlayerUseKey);
@@ -2158,6 +2191,7 @@ Called every frame for each client before the physics are run
 .float usekeypressed;
 void() nexball_setstatus;
 .float items_added;
+.float last_vehiclecheck;
 void PlayerPreThink (void)
 {
        WarpZone_PlayerPhysics_FixVAngle();
@@ -2236,6 +2270,26 @@ void PlayerPreThink (void)
 #endif
 
        MUTATOR_CALLHOOK(PlayerPreThink);
+       
+       if(autocvar_g_vehicles_enter)
+       if(time > self.last_vehiclecheck)
+       if(IS_PLAYER(self))
+       if not(self.freezetag_frozen)
+       if not(self.vehicle)
+       if(self.deadflag == DEAD_NO)
+       {
+               entity veh;
+               for(veh = world; (veh = findflags(veh, vehicle_flags, VHF_ISVEHICLE)); )
+               if(vlen(veh.origin - self.origin) < autocvar_g_vehicles_enter_radius)
+               if(veh.deadflag == DEAD_NO)
+               if not(veh.owner)
+               if(!veh.team || SAME_TEAM(self, veh))
+                       Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_VEHICLE_ENTER);
+               else if(autocvar_g_vehicles_steal)
+                       Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_VEHICLE_ENTER_STEAL);
+                       
+               self.last_vehiclecheck = time + 1;
+       }
 
        if(!self.cvar_cl_newusekeysupported) // FIXME remove this - it was a stupid idea to begin with, we can JUST use the button
        {