]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host_cmd.c
implemented PR_GetString and PR_SetString from QWSV source, these work around the...
[xonotic/darkplaces.git] / host_cmd.c
index 652f1ce93df3691f6b778a5e364e36b3dfd5fdb1..25d861c260d3366328daea7b70a0b5c14e5a1cf0 100644 (file)
@@ -23,7 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 int current_skill;
 char sv_spawnmap[MAX_QPATH];
 char sv_loadgame[MAX_OSPATH];
-int sv_restartmap;
 
 dfunction_t *ED_FindFunction (char *name);
 
@@ -90,7 +89,7 @@ void Host_Status_f (void)
                }
                else
                        hours = 0;
-               print ("#%-2u %-16.16s  %3i  %2i:%02i:%02i\n", j+1, client->name, (int)client->edict->v.frags, hours, minutes, seconds);
+               print ("#%-2u %-16.16s  %3i  %2i:%02i:%02i\n", j+1, client->name, (int)client->edict->v->frags, hours, minutes, seconds);
                print ("   %s\n", client->netconnection->address);
        }
 }
@@ -114,8 +113,8 @@ void Host_God_f (void)
        if (pr_global_struct->deathmatch)
                return;
 
-       sv_player->v.flags = (int)sv_player->v.flags ^ FL_GODMODE;
-       if (!((int)sv_player->v.flags & FL_GODMODE) )
+       sv_player->v->flags = (int)sv_player->v->flags ^ FL_GODMODE;
+       if (!((int)sv_player->v->flags & FL_GODMODE) )
                SV_ClientPrintf ("godmode OFF\n");
        else
                SV_ClientPrintf ("godmode ON\n");
@@ -132,8 +131,8 @@ void Host_Notarget_f (void)
        if (pr_global_struct->deathmatch)
                return;
 
-       sv_player->v.flags = (int)sv_player->v.flags ^ FL_NOTARGET;
-       if (!((int)sv_player->v.flags & FL_NOTARGET) )
+       sv_player->v->flags = (int)sv_player->v->flags ^ FL_NOTARGET;
+       if (!((int)sv_player->v->flags & FL_NOTARGET) )
                SV_ClientPrintf ("notarget OFF\n");
        else
                SV_ClientPrintf ("notarget ON\n");
@@ -152,16 +151,16 @@ void Host_Noclip_f (void)
        if (pr_global_struct->deathmatch)
                return;
 
-       if (sv_player->v.movetype != MOVETYPE_NOCLIP)
+       if (sv_player->v->movetype != MOVETYPE_NOCLIP)
        {
                noclip_anglehack = true;
-               sv_player->v.movetype = MOVETYPE_NOCLIP;
+               sv_player->v->movetype = MOVETYPE_NOCLIP;
                SV_ClientPrintf ("noclip ON\n");
        }
        else
        {
                noclip_anglehack = false;
-               sv_player->v.movetype = MOVETYPE_WALK;
+               sv_player->v->movetype = MOVETYPE_WALK;
                SV_ClientPrintf ("noclip OFF\n");
        }
 }
@@ -184,14 +183,14 @@ void Host_Fly_f (void)
        if (pr_global_struct->deathmatch)
                return;
 
-       if (sv_player->v.movetype != MOVETYPE_FLY)
+       if (sv_player->v->movetype != MOVETYPE_FLY)
        {
-               sv_player->v.movetype = MOVETYPE_FLY;
+               sv_player->v->movetype = MOVETYPE_FLY;
                SV_ClientPrintf ("flymode ON\n");
        }
        else
        {
-               sv_player->v.movetype = MOVETYPE_WALK;
+               sv_player->v->movetype = MOVETYPE_WALK;
                SV_ClientPrintf ("flymode OFF\n");
        }
 }
@@ -208,7 +207,7 @@ void Host_Ping_f (void)
        int             i, j;
        float   total;
        client_t        *client;
-       
+
        if (cmd_source == src_command)
        {
                Cmd_ForwardToServer ();
@@ -300,7 +299,7 @@ void Host_Restart_f (void)
 
        if (cmd_source != src_command)
                return;
-       sv_restartmap = true;
+       strcpy (sv_spawnmap, sv.name);
 }
 
 /*
@@ -419,7 +418,7 @@ void Host_Savegame_f (void)
 
        for (i=0 ; i<svs.maxclients ; i++)
        {
-               if (svs.clients[i].active && (svs.clients[i].edict->v.health <= 0) )
+               if (svs.clients[i].active && (svs.clients[i].edict->v->health <= 0) )
                {
                        Con_Printf ("Can't savegame with a dead player\n");
                        return;
@@ -568,7 +567,7 @@ void Host_PerformLoadGame(char *name)
        entnum = -1;
        while (!Qeof(f))
        {
-               for (i = 0;i < sizeof(buf) - 1;i++)
+               for (i = 0;i < (int)sizeof(buf) - 1;i++)
                {
                        r = Qgetc (f);
                        if (r == EOF || !r)
@@ -601,7 +600,7 @@ void Host_PerformLoadGame(char *name)
                {
                        // parse an edict
                        ent = EDICT_NUM(entnum);
-                       memset (&ent->v, 0, progs->entityfields * 4);
+                       memset (ent->v, 0, progs->entityfields * 4);
                        ent->free = false;
                        ED_ParseEdict (start, ent);
 
@@ -665,7 +664,7 @@ void Host_Name_f (void)
                if (strcmp(host_client->name, newName) != 0)
                        Con_Printf ("%s renamed to %s\n", host_client->name, newName);
        strcpy (host_client->name, newName);
-       host_client->edict->v.netname = host_client->name - pr_strings;
+       host_client->edict->v->netname = PR_SetString(host_client->name);
 
 // send notification to all clients
 
@@ -731,7 +730,7 @@ void Host_Say(qboolean teamonly)
        }
        while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r'))
                p2--;
-       for (j = strlen(text);j < (sizeof(text) - 2) && p1 < p2;)
+       for (j = strlen(text);j < (int)(sizeof(text) - 2) && p1 < p2;)
                text[j++] = *p1++;
        text[j++] = '\n';
        text[j++] = 0;
@@ -740,7 +739,7 @@ void Host_Say(qboolean teamonly)
        {
                if (!client || !client->active || !client->spawned)
                        continue;
-               if (teamplay.integer && teamonly && client->edict->v.team != save->edict->v.team)
+               if (teamplay.integer && teamonly && client->edict->v->team != save->edict->v->team)
                        continue;
                host_client = client;
                SV_ClientPrintf("%s", text);
@@ -812,7 +811,7 @@ void Host_Tell_f(void)
        }
        while (p2 > p1 && (p2[-1] == '\n' || p2[-1] == '\r'))
                p2--;
-       for (j = strlen(text);j < (sizeof(text) - 2) && p1 < p2;)
+       for (j = strlen(text);j < (int)(sizeof(text) - 2) && p1 < p2;)
                text[j++] = *p1++;
        text[j++] = '\n';
        text[j++] = 0;
@@ -889,7 +888,7 @@ void Host_Color_f(void)
        else
        {
                host_client->colors = playercolor;
-               host_client->edict->v.team = bottom + 1;
+               host_client->edict->v->team = bottom + 1;
 
                // send notification to all clients
                MSG_WriteByte (&sv.reliable_datagram, svc_updatecolors);
@@ -911,7 +910,7 @@ void Host_Kill_f (void)
                return;
        }
 
-       if (sv_player->v.health <= 0)
+       if (sv_player->v->health <= 0)
        {
                SV_ClientPrintf ("Can't suicide -- already dead!\n");
                return;
@@ -930,7 +929,7 @@ Host_Pause_f
 */
 void Host_Pause_f (void)
 {
-       
+
        if (cmd_source == src_command)
        {
                Cmd_ForwardToServer ();
@@ -944,11 +943,11 @@ void Host_Pause_f (void)
 
                if (sv.paused)
                {
-                       SV_BroadcastPrintf ("%s paused the game\n", pr_strings + sv_player->v.netname);
+                       SV_BroadcastPrintf ("%s paused the game\n", PR_GetString(sv_player->v->netname));
                }
                else
                {
-                       SV_BroadcastPrintf ("%s unpaused the game\n",pr_strings + sv_player->v.netname);
+                       SV_BroadcastPrintf ("%s unpaused the game\n", PR_GetString(sv_player->v->netname));
                }
 
        // send notification to all clients
@@ -978,7 +977,7 @@ void Host_PreSpawn_f (void)
                Con_Printf ("prespawn not valid -- already spawned\n");
                return;
        }
-       
+
        SZ_Write (&host_client->message, sv.signon.data, sv.signon.cursize);
        MSG_WriteByte (&host_client->message, svc_signonnum);
        MSG_WriteByte (&host_client->message, 2);
@@ -1036,10 +1035,10 @@ void Host_Spawn_f (void)
                // set up the edict
                ent = host_client->edict;
 
-               memset (&ent->v, 0, progs->entityfields * 4);
-               ent->v.colormap = NUM_FOR_EDICT(ent);
-               ent->v.team = (host_client->colors & 15) + 1;
-               ent->v.netname = host_client->name - pr_strings;
+               memset (ent->v, 0, progs->entityfields * 4);
+               ent->v->colormap = NUM_FOR_EDICT(ent);
+               ent->v->team = (host_client->colors & 15) + 1;
+               ent->v->netname = PR_SetString(host_client->name);
                if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_pmodel)))
                        val->_float = host_client->pmodel;
 
@@ -1113,7 +1112,7 @@ void Host_Spawn_f (void)
        ent = EDICT_NUM( 1 + (host_client - svs.clients) );
        MSG_WriteByte (&host_client->message, svc_setangle);
        for (i=0 ; i < 2 ; i++)
-               MSG_WriteAngle (&host_client->message, ent->v.angles[i] );
+               MSG_WriteAngle (&host_client->message, ent->v->angles[i] );
        MSG_WriteAngle (&host_client->message, 0 );
 
        SV_WriteClientdataToMessage (sv_player, &host_client->message);
@@ -1280,21 +1279,21 @@ void Host_Give_f (void)
                        if (t[0] == '6')
                        {
                                if (t[1] == 'a')
-                               sv_player->v.items = (int)sv_player->v.items | HIT_PROXIMITY_GUN;
+                               sv_player->v->items = (int)sv_player->v->items | HIT_PROXIMITY_GUN;
                                else
-                               sv_player->v.items = (int)sv_player->v.items | IT_GRENADE_LAUNCHER;
+                               sv_player->v->items = (int)sv_player->v->items | IT_GRENADE_LAUNCHER;
                        }
                        else if (t[0] == '9')
-                               sv_player->v.items = (int)sv_player->v.items | HIT_LASER_CANNON;
+                               sv_player->v->items = (int)sv_player->v->items | HIT_LASER_CANNON;
                        else if (t[0] == '0')
-                               sv_player->v.items = (int)sv_player->v.items | HIT_MJOLNIR;
+                               sv_player->v->items = (int)sv_player->v->items | HIT_MJOLNIR;
                        else if (t[0] >= '2')
-                               sv_player->v.items = (int)sv_player->v.items | (IT_SHOTGUN << (t[0] - '2'));
+                               sv_player->v->items = (int)sv_player->v->items | (IT_SHOTGUN << (t[0] - '2'));
                }
                else
                {
                        if (t[0] >= '2')
-                               sv_player->v.items = (int)sv_player->v.items | (IT_SHOTGUN << (t[0] - '2'));
+                               sv_player->v->items = (int)sv_player->v->items | (IT_SHOTGUN << (t[0] - '2'));
                }
                break;
 
@@ -1305,7 +1304,7 @@ void Host_Give_f (void)
                                val->_float = v;
                }
 
-               sv_player->v.ammo_shells = v;
+               sv_player->v->ammo_shells = v;
                break;
        case 'n':
                if (gamemode == GAME_ROGUE)
@@ -1313,13 +1312,13 @@ void Host_Give_f (void)
                        if ((val = GETEDICTFIELDVALUE(sv_player, eval_ammo_nails1)))
                        {
                                val->_float = v;
-                               if (sv_player->v.weapon <= IT_LIGHTNING)
-                                       sv_player->v.ammo_nails = v;
+                               if (sv_player->v->weapon <= IT_LIGHTNING)
+                                       sv_player->v->ammo_nails = v;
                        }
                }
                else
                {
-                       sv_player->v.ammo_nails = v;
+                       sv_player->v->ammo_nails = v;
                }
                break;
        case 'l':
@@ -1329,8 +1328,8 @@ void Host_Give_f (void)
                        if (val)
                        {
                                val->_float = v;
-                               if (sv_player->v.weapon > IT_LIGHTNING)
-                                       sv_player->v.ammo_nails = v;
+                               if (sv_player->v->weapon > IT_LIGHTNING)
+                                       sv_player->v->ammo_nails = v;
                        }
                }
                break;
@@ -1341,13 +1340,13 @@ void Host_Give_f (void)
                        if (val)
                        {
                                val->_float = v;
-                               if (sv_player->v.weapon <= IT_LIGHTNING)
-                                       sv_player->v.ammo_rockets = v;
+                               if (sv_player->v->weapon <= IT_LIGHTNING)
+                                       sv_player->v->ammo_rockets = v;
                        }
                }
                else
                {
-                       sv_player->v.ammo_rockets = v;
+                       sv_player->v->ammo_rockets = v;
                }
                break;
        case 'm':
@@ -1357,13 +1356,13 @@ void Host_Give_f (void)
                        if (val)
                        {
                                val->_float = v;
-                               if (sv_player->v.weapon > IT_LIGHTNING)
-                                       sv_player->v.ammo_rockets = v;
+                               if (sv_player->v->weapon > IT_LIGHTNING)
+                                       sv_player->v->ammo_rockets = v;
                        }
                }
                break;
        case 'h':
-               sv_player->v.health = v;
+               sv_player->v->health = v;
                break;
        case 'c':
                if (gamemode == GAME_ROGUE)
@@ -1372,13 +1371,13 @@ void Host_Give_f (void)
                        if (val)
                        {
                                val->_float = v;
-                               if (sv_player->v.weapon <= IT_LIGHTNING)
-                                       sv_player->v.ammo_cells = v;
+                               if (sv_player->v->weapon <= IT_LIGHTNING)
+                                       sv_player->v->ammo_cells = v;
                        }
                }
                else
                {
-                       sv_player->v.ammo_cells = v;
+                       sv_player->v->ammo_cells = v;
                }
                break;
        case 'p':
@@ -1388,8 +1387,8 @@ void Host_Give_f (void)
                        if (val)
                        {
                                val->_float = v;
-                               if (sv_player->v.weapon > IT_LIGHTNING)
-                                       sv_player->v.ammo_cells = v;
+                               if (sv_player->v->weapon > IT_LIGHTNING)
+                                       sv_player->v->ammo_cells = v;
                        }
                }
                break;
@@ -1404,7 +1403,7 @@ edict_t   *FindViewthing (void)
        for (i=0 ; i<sv.num_edicts ; i++)
        {
                e = EDICT_NUM(i);
-               if ( !strcmp (pr_strings + e->v.classname, "viewthing") )
+               if (!strcmp (PR_GetString(e->v->classname), "viewthing"))
                        return e;
        }
        Con_Printf ("No viewthing on map\n");
@@ -1431,9 +1430,9 @@ void Host_Viewmodel_f (void)
                Con_Printf ("Can't load %s\n", Cmd_Argv(1));
                return;
        }
-       
-       e->v.frame = 0;
-       cl.model_precache[(int)e->v.modelindex] = m;
+
+       e->v->frame = 0;
+       cl.model_precache[(int)e->v->modelindex] = m;
 }
 
 /*
@@ -1450,13 +1449,13 @@ void Host_Viewframe_f (void)
        e = FindViewthing ();
        if (!e)
                return;
-       m = cl.model_precache[(int)e->v.modelindex];
+       m = cl.model_precache[(int)e->v->modelindex];
 
        f = atoi(Cmd_Argv(1));
        if (f >= m->numframes)
                f = m->numframes-1;
 
-       e->v.frame = f;         
+       e->v->frame = f;
 }
 
 
@@ -1477,17 +1476,17 @@ void Host_Viewnext_f (void)
 {
        edict_t *e;
        model_t *m;
-       
+
        e = FindViewthing ();
        if (!e)
                return;
-       m = cl.model_precache[(int)e->v.modelindex];
+       m = cl.model_precache[(int)e->v->modelindex];
 
-       e->v.frame = e->v.frame + 1;
-       if (e->v.frame >= m->numframes)
-               e->v.frame = m->numframes - 1;
+       e->v->frame = e->v->frame + 1;
+       if (e->v->frame >= m->numframes)
+               e->v->frame = m->numframes - 1;
 
-       PrintFrameName (m, e->v.frame);         
+       PrintFrameName (m, e->v->frame);
 }
 
 /*
@@ -1504,13 +1503,13 @@ void Host_Viewprev_f (void)
        if (!e)
                return;
 
-       m = cl.model_precache[(int)e->v.modelindex];
+       m = cl.model_precache[(int)e->v->modelindex];
 
-       e->v.frame = e->v.frame - 1;
-       if (e->v.frame < 0)
-               e->v.frame = 0;
+       e->v->frame = e->v->frame - 1;
+       if (e->v->frame < 0)
+               e->v->frame = 0;
 
-       PrintFrameName (m, e->v.frame);         
+       PrintFrameName (m, e->v->frame);
 }
 
 /*
@@ -1533,8 +1532,13 @@ void Host_Startdemos_f (void)
 
        if (cls.state == ca_dedicated)
        {
-               if (!sv.active)
-                       Cbuf_AddText ("map start\n");
+               if (!sv.active && !sv_spawnmap[0])
+               {
+                       if (gamemode == GAME_TRANSFUSION)
+                               Cbuf_AddText ("map bb1\n");
+                       else
+                               Cbuf_AddText ("map start\n");
+               }
                return;
        }
 
@@ -1594,24 +1598,16 @@ void Host_Stopdemo_f (void)
 // we have to delay map and game loads until AFTER video is initialized
 void Host_PerformSpawnServerAndLoadGame(void)
 {
-       if (vid_hidden)
+       if (vid_hidden && cls.state != ca_dedicated)
                return;
        if (sv_loadgame[0])
                Host_PerformLoadGame(sv_loadgame);
        else if (sv_spawnmap[0])
-       {
                SV_SpawnServer(sv_spawnmap);
-               if (sv.active && cls.state != ca_dedicated)
-                       Cmd_ExecuteString ("connect local", src_command);
-       }
-       else if (sv_restartmap)
-       {
-               strcpy(sv_spawnmap, sv.name);
-               SV_SpawnServer(sv_spawnmap);
-       }
+       if (sv.active && cls.state == ca_disconnected)
+               Cmd_ExecuteString ("connect local", src_command);
        sv_loadgame[0] = 0;
        sv_spawnmap[0] = 0;
-       sv_restartmap = 0;
 }
 
 //=============================================================================