]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/cl_client.qc
Merge branch 'master' of git://de.git.xonotic.org/xonotic/xonotic-data.pk3dir
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / cl_client.qc
index 299df0d082ef84ee9d06d001f4d3b7f29fc77046..40039ead81f107743a38a78b3a58be2ea38ba6cd 100644 (file)
@@ -155,34 +155,33 @@ vector Spawn_Score(entity spot, entity playerlist, float teamcheck, float anypoi
        if(spot.target != "") {
                entity ent;
                float good, found;
-               ent = find(world, targetname, spot.target);
 
-               while(ent) {
+               found = 0;
+               good = 0;
+               for(ent = world; (ent = find(ent, targetname, spot.target)); )
+               {
+                       ++found;
                        if(ent.classname == "target_objective")
                        {
-                               found = 1;
                                if(ent.health < 0 || ent.health >= ASSAULT_VALUE_INACTIVE)
-                                       return '-1 0 0';
-                               good = 1;
+                                       continue;
                        }
                        else if(ent.classname == "trigger_race_checkpoint")
                        {
-                               found = 1;
                                if(!anypoint) // spectators may spawn everywhere
-
                                {
                                        if(g_race_qualifying)
                                        {
                                                // spawn at first
                                                if(ent.race_checkpoint != 0)
-                                                       return '-1 0 0';
+                                                       continue;
                                                if(spot.race_place != race_lowest_place_spawn)
-                                                       return '-1 0 0';
+                                                       continue;
                                        }
                                        else
                                        {
                                                if(ent.race_checkpoint != self.race_respawn_checkpoint)
-                                                       return '-1 0 0';
+                                                       continue;
                                                // try reusing the previous spawn
                                                if(ent == self.race_respawn_spotref || spot == self.race_respawn_spotref)
                                                        prio += 1;
@@ -195,16 +194,21 @@ vector Spawn_Score(entity spot, entity playerlist, float teamcheck, float anypoi
                                                        if(pl == 0 && !self.race_started)
                                                                pl = race_highest_place_spawn; // use last place if he has not even touched finish yet
                                                        if(spot.race_place != pl)
-                                                               return '-1 0 0';
+                                                               continue;
                                                }
                                        }
                                }
-                               good = 1;
                        }
-                       ent = find(ent, targetname, spot.target);
+                       ++good;
+               }
+
+               if(!found)
+               {
+                       dprint("WARNING: spawnpoint at ", vtos(spot.origin), " could not find its target ", spot.target, "\n");
+                       return '-1 0 0';
                }
 
-               if(found && !good)
+               if(good < found) // at least one was bad
                        return '-1 0 0';
        }
 
@@ -325,7 +329,7 @@ entity SelectSpawnPoint (float anypoint)
        if (spot)
                return spot;
 
-       if(anypoint)
+       if(anypoint || autocvar_g_spawn_useallspawns)
                teamcheck = -1;
        else if(have_team_spawns > 0)
        {
@@ -753,15 +757,17 @@ void PutObserverInServer (void)
                self.frags = FRAGS_SPECTATOR;
 }
 
+.float model_randomizer;
 void FixPlayermodel()
 {
        string defaultmodel;
-       float defaultskin, chmdl, oldskin;
+       float defaultskin, chmdl, oldskin, n, i;
        vector m1, m2;
 
        defaultmodel = "";
 
-       if(autocvar_sv_defaultcharacter == 1) {
+       if(autocvar_sv_defaultcharacter == 1)
+       {
                defaultskin = 0;
 
                if(teamplay)
@@ -780,6 +786,17 @@ void FixPlayermodel()
                        defaultmodel = autocvar_sv_defaultplayermodel;
                        defaultskin = autocvar_sv_defaultplayerskin;
                }
+
+               n = tokenize_console(defaultmodel);
+               if(n > 0)
+                       defaultmodel = argv(floor(n * self.model_randomizer));
+
+               i = strstrofs(defaultmodel, ":", 0);
+               if(i >= 0)
+               {
+                       defaultskin = stof(substring(defaultmodel, i+1, -1));
+                       defaultmodel = substring(defaultmodel, 0, i);
+               }
        }
 
        if(self.modelindex == 0 && self.deadflag == DEAD_NO)
@@ -861,6 +878,9 @@ void PutClientInServer (void)
                WriteByte(MSG_ONE, SVC_SETVIEW);
                WriteEntity(MSG_ONE, self);
        }
+       
+       // reset player keys
+       self.itemkeys = 0;
 
        // player is dead and becomes observer
        // FIXME fix LMS scoring for new system
@@ -912,6 +932,8 @@ void PutClientInServer (void)
                if(INDEPENDENT_PLAYERS)
                        MAKE_INDEPENDENT_PLAYER(self);
                self.flags = FL_CLIENT;
+               if(autocvar__notarget)
+                       self.flags |= FL_NOTARGET;
                self.takedamage = DAMAGE_AIM;
                if(g_minstagib)
                        self.effects = EF_FULLBRIGHT;
@@ -1030,7 +1052,8 @@ void PutClientInServer (void)
                self.prevorigin = self.origin;
                self.lastrocket = world; // stop rocket guiding, no revenge from the grave!
                self.lastteleporttime = time; // prevent insane speeds due to changing origin
-
+        self.hud = HUD_NORMAL;
+        
                if(g_arena)
                {
                        Spawnqueue_Remove(self);
@@ -1685,9 +1708,6 @@ void ClientConnect (void)
        // Wazat's grappling hook
        SetGrappleHookBindings();
 
-       // get autoswitch state from player when he toggles it
-       stuffcmd(self, "alias autoswitch \"set cl_autoswitch $1 ; cmd autoswitch $1\"\n"); // default.cfg-ed in 2.4.1
-
        // get version info from player
        stuffcmd(self, "cmd clientversion $gameversion\n");
 
@@ -1789,6 +1809,8 @@ void ClientConnect (void)
 
        if(!autocvar_g_campaign)
                Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), autocvar_welcome_message_time, 0);
+
+       self.model_randomizer = random();
 }
 
 /*
@@ -1964,7 +1986,7 @@ void respawn(void)
                self.avelocity = randomvec() * autocvar_g_respawn_ghosts_speed * 3 - randomvec() * autocvar_g_respawn_ghosts_speed * 3;
                self.effects |= EF_ADDITIVE;
                self.oldcolormap = self.colormap;
-               self.colormap = 512;
+               self.colormap = 0; // this originally was 512, but raises a warning in the engine, so get rid of it
                pointparticles(particleeffectnum("respawn_ghost"), self.origin, '0 0 0', 1);
                if(autocvar_g_respawn_ghosts_maxtime)
                        SUB_SetFade (self, time + autocvar_g_respawn_ghosts_maxtime / 2 + random () * (autocvar_g_respawn_ghosts_maxtime - autocvar_g_respawn_ghosts_maxtime / 2), 1.5);
@@ -3015,7 +3037,10 @@ void PlayerPreThink (void)
 
                if(g_nexball)
                        nexball_setstatus();
-
+               
+               // secret status
+               secrets_setstatus();
+               
                self.dmg_team = max(0, self.dmg_team - autocvar_g_teamdamage_resetspeed * frametime);
 
                //self.angles_y=self.v_angle_y + 90;   // temp
@@ -3243,7 +3268,7 @@ void PlayerPostThink (void)
                        self.stored_netname = strzone(uid2name(self.crypto_idfp));
                if(self.stored_netname != self.netname)
                {
-                       db_put(ServerProgsDB, strcat("uid2name", self.crypto_idfp), self.netname);
+                       db_put(ServerProgsDB, strcat("/uid2name/", self.crypto_idfp), self.netname);
                        strunzone(self.stored_netname);
                        self.stored_netname = strzone(self.netname);
                }