X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fclient.qc;h=1e07dc03faa4bb8e2afa0960c0c4c063db4a2bdf;hb=bba2475e3a8b84e359ffae9b530d651f4d63e99a;hp=bacb82e071429c219127ce07e5cc15888d39ff57;hpb=d2b0f12cb08fe3d1e59d3c9514546c4858cf9012;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index bacb82e07..1e07dc03f 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -137,7 +137,8 @@ bool ClientData_Send(entity this, entity to, int sf) if (CS(e).race_completed) sf |= BIT(0); // forced scoreboard if (CS(to).spectatee_status) sf |= BIT(1); // spectator ent number follows if (CS(e).zoomstate) sf |= BIT(2); // zoomed - if (autocvar_sv_showspectators) sf |= BIT(4); // show spectators + if (autocvar_sv_showspectators == 1 || (autocvar_sv_showspectators && IS_SPEC(to))) + sf |= BIT(4); // show spectators WriteHeader(MSG_ENTITY, ENT_CLIENT_CLIENTDATA); WriteByte(MSG_ENTITY, sf); @@ -400,7 +401,7 @@ void PutObserverInServer(entity this, bool is_forced, bool use_spawnpoint) } else { - SetPlayerTeam(this, -1, TEAM_CHANGE_SPECTATOR); + SetPlayerTeam(this, -1, TEAM_CHANGE_SPECTATOR); // clears scores too in game modes without teams this.frags = FRAGS_SPECTATOR; } @@ -539,6 +540,9 @@ void PutPlayerInServer(entity this) PlayerState_attach(this); accuracy_resend(this); + if (teamplay && this.bot_forced_team) + SetPlayerTeam(this, this.bot_forced_team, TEAM_CHANGE_MANUAL); + if (this.team < 0) TeamBalance_JoinBestTeam(this); @@ -760,7 +764,6 @@ void PutPlayerInServer(entity this) Unfreeze(this, false); MUTATOR_CALLHOOK(PlayerSpawn, this, spot); - { string s = spot.target; if(g_assault || g_race) // TODO: make targeting work in assault & race without this hack @@ -810,9 +813,7 @@ void PutPlayerInServer(entity this) /** Called when a client spawns in the server */ void PutClientInServer(entity this) { - if (IS_BOT_CLIENT(this)) { - TRANSMUTE(Player, this); - } else if (IS_REAL_CLIENT(this)) { + if (IS_REAL_CLIENT(this)) { msg_entity = this; WriteByte(MSG_ONE, SVC_SETVIEW); WriteEntity(MSG_ONE, this); @@ -1018,17 +1019,10 @@ void ClientPreConnect(entity this) } #endif -void SendWelcomemessage(entity this, bool force_centerprint) -{ - msg_entity = this; - WriteHeader(MSG_ONE, TE_CSQC_SERVERWELCOME); - SendWelcomemessage_msg_type(this, force_centerprint, MSG_ONE); -} - // NOTE csqc uses the active mutators list sent by this function // to understand which mutators are enabled // also note that they aren't all registered mutators, e.g. jetpack, low gravity -void SendWelcomemessage_msg_type(entity this, bool force_centerprint, int msg_type) +void SendWelcomeMessage(entity this, int msg_type) { WriteByte(msg_type, boolean(autocvar_g_campaign)); if (boolean(autocvar_g_campaign)) @@ -1038,7 +1032,6 @@ void SendWelcomemessage_msg_type(entity this, bool force_centerprint, int msg_ty WriteString(msg_type, Campaign_GetMessage()); return; } - WriteByte(msg_type, force_centerprint); WriteString(msg_type, autocvar_hostname); WriteString(msg_type, autocvar_g_xonoticversion); WriteByte(msg_type, CS(this).version_mismatch); @@ -1176,9 +1169,6 @@ void ClientConnect(entity this) if (player_count == 1) localcmd("\nsv_hook_firstjoin\n"); - - if (IS_REAL_CLIENT(this) && !IS_PLAYER(this) && !autocvar_g_campaign) - CS(this).motd_actived_time = -1; // the welcome message is shown by the client } /* ============= @@ -1953,6 +1943,9 @@ bool ShowTeamSelection(entity this) } void Join(entity this) { + if (autocvar_g_campaign && !campaign_bots_may_start && !game_stopped && time >= game_starttime) + ReadyRestart(true); + TRANSMUTE(Player, this); if(!this.team_selected) @@ -2034,62 +2027,6 @@ int nJoinAllowed(entity this, entity ignore) return free_slots; } -void PrintWelcomeMessage(entity this) -{ - if(CS(this).motd_actived_time == 0) - { - if (autocvar_g_campaign) { - if ((IS_PLAYER(this) && PHYS_INPUT_BUTTON_INFO(this)) || (!IS_PLAYER(this))) { - CS(this).motd_actived_time = time; - SendWelcomemessage(this, false); - } - } else { - if (PHYS_INPUT_BUTTON_INFO(this)) { - CS(this).motd_actived_time = time; - SendWelcomemessage(this, true); - } - } - } - else if(CS(this).motd_actived_time > 0) // showing MOTD or campaign message - { - if (autocvar_g_campaign) { - if (PHYS_INPUT_BUTTON_INFO(this)) - CS(this).motd_actived_time = time; - else if ((time - CS(this).motd_actived_time > 2) && IS_PLAYER(this)) { // hide it some seconds after BUTTON_INFO has been released - CS(this).motd_actived_time = 0; - Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); - } - } else { - if (PHYS_INPUT_BUTTON_INFO(this)) - CS(this).motd_actived_time = time; - else if (time - CS(this).motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released - CS(this).motd_actived_time = 0; - Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); - } - } - } - else //if(CS(this).motd_actived_time < 0) // just connected, motd is active - { - if(PHYS_INPUT_BUTTON_INFO(this)) // BUTTON_INFO hides initial MOTD - CS(this).motd_actived_time = -2; // wait until BUTTON_INFO gets released - else if (CS(this).motd_actived_time == -2) - { - // instantly hide MOTD - CS(this).motd_actived_time = 0; - Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); - } - else if (IS_PLAYER(this) || IS_SPEC(this)) - { - // FIXME occasionally for some reason MOTD never goes away - // delay MOTD removal a little bit in the hope it fixes this bug - if (CS(this).motd_actived_time == -1) // MOTD marked to fade away as soon as client becomes player or spectator - CS(this).motd_actived_time = -(5 + floor(random() * 10)); // add small delay - else //if (CS(this).motd_actived_time < -2) - CS(this).motd_actived_time++; - } - } -} - bool joinAllowed(entity this) { if (CS(this).version_mismatch) return false; @@ -2266,6 +2203,14 @@ void ObserverOrSpectatorThink(entity this) } } + if (IS_BOT_CLIENT(this) && !CS(this).autojoin_checked) + { + CS(this).autojoin_checked = true; + TRANSMUTE(Player, this); + PutClientInServer(this); + return; + } + if (this.flags & FL_JUMPRELEASED) { if (PHYS_INPUT_BUTTON_JUMP(this) && (joinAllowed(this) || time < CS(this).jointime + MIN_SPEC_TIME)) { this.flags &= ~FL_JUMPRELEASED; @@ -2513,9 +2458,6 @@ void PlayerPreThink (entity this) PlayerUseKey(this); CS(this).usekeypressed = PHYS_INPUT_BUTTON_USE(this); - if (IS_REAL_CLIENT(this)) - PrintWelcomeMessage(this); - if (IS_PLAYER(this)) { if (IS_REAL_CLIENT(this) && time < CS(this).jointime + MIN_SPEC_TIME) error("Client can't be spawned as player on connection!"); @@ -2537,7 +2479,6 @@ void PlayerPreThink (entity this) || (!(autocvar_sv_spectate || autocvar_g_campaign || (Player_GetForcedTeamIndex(this) == TEAM_FORCE_SPECTATOR)) && (!teamplay || autocvar_g_balance_teams))) { - campaign_bots_may_start = true; if(joinAllowed(this)) Join(this); return;