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);
}
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;
}
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);
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
/** 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);
MUTATOR_CALLHOOK(ClientConnect, this);
- 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
+ if (player_count == 1)
+ localcmd("\nsv_hook_firstjoin\n");
}
/*
=============
player_powerups_remove_all(this); // stop powerup sound
ONREMOVE(this);
+
+ if (player_count == 0)
+ localcmd("\nsv_hook_lastleave\n");
}
void ChatBubbleThink(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)
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;
}
}
+ 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;
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!");
|| (!(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;