X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fclient.qc;h=68c19f638a0bfbaa4f578b7f41fde53bab809ad2;hb=3ecb4f377794080b3b216d6be9f131c227e76210;hp=daabb84c9cc9e9ee10bb6a4371cd73d4d39185f6;hpb=010db995cb7428a50fda4bdc9a76cc0dd720863d;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index daabb84c9..68c19f638 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -235,9 +235,10 @@ void setplayermodel(entity e, string modelname) } /** putting a client as observer in the server */ -void PutObserverInServer(entity this, bool is_forced) +void PutObserverInServer(entity this, bool is_forced, bool use_spawnpoint) { bool mutator_returnvalue = MUTATOR_CALLHOOK(MakePlayerObserver, this, is_forced); + bool recount_ready = false; PlayerState_detach(this); if (IS_PLAYER(this)) @@ -252,17 +253,24 @@ void PutObserverInServer(entity this, bool is_forced) if(IS_REAL_CLIENT(this)) { if (vote_called) { VoteCount(false); } - ReadyCount(); + this.ready = false; + recount_ready = true; } entcs_update_players(this); } - entity spot = SelectSpawnPoint(this, true); - if (!spot) LOG_FATAL("No spawnpoints for observers?!?"); - this.angles = vec2(spot.angles); + if (use_spawnpoint) + { + entity spot = SelectSpawnPoint(this, true); + if (!spot) LOG_FATAL("No spawnpoints for observers?!?"); + this.angles = vec2(spot.angles); + // offset it so that the spectator spawns higher off the ground, looks better this way + setorigin(this, spot.origin + STAT(PL_VIEW_OFS, this)); + } + else // change origin to restore previous view origin + setorigin(this, this.origin + STAT(PL_VIEW_OFS, this) - STAT(PL_CROUCH_VIEW_OFS, this)); this.fixangle = true; - // offset it so that the spectator spawns higher off the ground, looks better this way - setorigin(this, spot.origin + STAT(PL_VIEW_OFS, this)); + if (IS_REAL_CLIENT(this)) { msg_entity = this; @@ -295,13 +303,16 @@ void PutObserverInServer(entity this, bool is_forced) if (this.vehicle) vehicles_exit(this.vehicle, VHEF_RELEASE); + TRANSMUTE(Observer, this); + + if(recount_ready) ReadyCount(); + WaypointSprite_PlayerDead(this); + accuracy_resend(this); if (CS(this).killcount != FRAGS_SPECTATOR && !game_stopped && CHAT_NOSPECTATORS()) Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_CHAT_NOSPECTATORS); - accuracy_resend(this); - CS(this).spectatortime = time; if(this.bot_attack) IL_REMOVE(g_bot_targets, this); @@ -310,7 +321,6 @@ void PutObserverInServer(entity this, bool is_forced) IL_REMOVE(g_monster_targets, this); this.monster_attack = false; STAT(HUD, this) = HUD_NORMAL; - TRANSMUTE(Observer, this); this.iscreature = false; this.teleportable = TELEPORT_SIMPLE; if(this.damagedbycontents) @@ -351,6 +361,7 @@ void PutObserverInServer(entity this, bool is_forced) this.revival_time = 0; this.draggable = drag_undraggable; + player_powerups_remove_all(this); this.items = 0; STAT(WEAPONS, this) = '0 0 0'; this.drawonlytoclient = this; @@ -809,6 +820,7 @@ void PutClientInServer(entity this) if (game_stopped) TRANSMUTE(Observer, this); + bool use_spawnpoint = (!this.enemy); // check this.enemy here since SetSpectatee will clear it SetSpectatee(this, NULL); // reset player keys @@ -818,7 +830,7 @@ void PutClientInServer(entity this) MUTATOR_CALLHOOK(PutClientInServer, this); if (IS_OBSERVER(this)) { - PutObserverInServer(this, false); + PutObserverInServer(this, false, use_spawnpoint); } else if (IS_PLAYER(this)) { PutPlayerInServer(this); } @@ -1021,8 +1033,22 @@ string GetClientVersionMessage(entity this) } } -string getwelcomemessage(entity this) +void SendWelcomemessage(entity this, bool force_centerprint) { + msg_entity = this; + WriteHeader(MSG_ONE, TE_CSQC_SERVERWELCOME); + WriteByte(MSG_ONE, boolean(autocvar_g_campaign)); + if (boolean(autocvar_g_campaign)) + { + WriteString(MSG_ONE, Campaign_GetTitle()); + WriteByte(MSG_ONE, Campaign_GetLevelNum()); + WriteString(MSG_ONE, Campaign_GetMessage()); + return; + } + WriteByte(MSG_ONE, force_centerprint); + WriteString(MSG_ONE, autocvar_hostname); + WriteString(MSG_ONE, GetClientVersionMessage(this)); + MUTATOR_CALLHOOK(BuildMutatorsPrettyString, ""); string modifications = M_ARGV(0, string); @@ -1043,13 +1069,7 @@ string getwelcomemessage(entity this) modifications = strcat(modifications, ", Jet pack"); modifications = substring(modifications, 2, strlen(modifications) - 2); - string versionmessage = GetClientVersionMessage(this); - string s = strcat(versionmessage, "^8\n^8\nserver is ^9", autocvar_hostname, "^8\n"); - - s = strcat(s, "^8\nmatch type is ^1", gamemode_name, "^8\n"); - - if(modifications != "") - s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n"); + WriteString(MSG_ONE, modifications); if(cache_lastmutatormsg != autocvar_g_mutatormsg) { @@ -1057,21 +1077,25 @@ string getwelcomemessage(entity this) strcpy(cache_mutatormsg, cache_lastmutatormsg); } - if (cache_mutatormsg != "") { - s = strcat(s, "\n\n^8special gameplay tips: ^7", cache_mutatormsg); - } + WriteString(MSG_ONE, cache_mutatormsg); string mutator_msg = ""; MUTATOR_CALLHOOK(BuildGameplayTipsString, mutator_msg); mutator_msg = M_ARGV(0, string); - s = strcat(s, mutator_msg); // trust that the mutator will do proper formatting + WriteString(MSG_ONE, mutator_msg); // trust that the mutator will do proper formatting + WriteString(MSG_ONE, strreplace("\\n", "\n", autocvar_sv_motd)); +} - string motd = autocvar_sv_motd; - if (motd != "") { - s = strcat(s, "\n\n^8MOTD: ^7", strreplace("\\n", "\n", motd)); - } - return s; +void SendWelcomemessage_onConnection_think(entity this) +{ + SendWelcomemessage(this, false); +} + +void SendWelcomemessage_onConnection(entity this) +{ + // give the client time to sent its version + defer(this, 0.5, SendWelcomemessage_onConnection_think); } /** @@ -1161,7 +1185,11 @@ void ClientConnect(entity this) CS(this).model_randomizer = random(); if (IS_REAL_CLIENT(this)) + { + if (!autocvar_g_campaign) + SendWelcomemessage_onConnection(this); sv_notice_join(this); + } this.move_qcphysics = autocvar_sv_qcphysics; @@ -1176,14 +1204,8 @@ void ClientConnect(entity this) MUTATOR_CALLHOOK(ClientConnect, this); - if (IS_REAL_CLIENT(this)) - { - if (!autocvar_g_campaign && !IS_PLAYER(this)) - { - CS(this).motd_actived_time = -1; - Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_MOTD, getwelcomemessage(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 } /* ============= @@ -1435,21 +1457,25 @@ void respawn(entity this) void play_countdown(entity this, float finished, Sound samp) { TC(Sound, samp); - if(IS_REAL_CLIENT(this)) - if(floor(finished - time - frametime) != floor(finished - time)) - if(finished - time < 6) - sound (this, CH_INFO, samp, VOL_BASE, ATTEN_NORM); + float time_left = finished - time; + if(IS_REAL_CLIENT(this) && time_left < 6 && floor(time_left - frametime) != floor(time_left)) + sound(this, CH_INFO, samp, VOL_BASE, ATTEN_NORM); } +// it removes special powerups not handled by StatusEffects void player_powerups_remove_all(entity this) { - if (this.items & IT_SUPERWEAPON) + if (this.items & (IT_SUPERWEAPON | IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS)) { // don't play the poweroff sound when the game restarts or the player disconnects - if (time > game_starttime + 1 && IS_CLIENT(this)) + if (time > game_starttime + 1 && IS_CLIENT(this) + && !(start_items & (IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS))) + { sound(this, CH_INFO, SND_POWEROFF, VOL_BASE, ATTEN_NORM); - stopsound(this, CH_TRIGGER_SINGLE); // get rid of the pickup sound - this.items -= (this.items & IT_SUPERWEAPON); + } + if (this.items & (IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS)) + stopsound(this, CH_TRIGGER_SINGLE); // get rid of the pickup sound + this.items -= (this.items & (IT_SUPERWEAPON | IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS)); } } @@ -1797,7 +1823,7 @@ bool SpectateSet(entity this) accuracy_resend(this); if(!SpectateUpdate(this)) - PutObserverInServer(this, false); + PutObserverInServer(this, false, true); return true; } @@ -2039,12 +2065,12 @@ void PrintWelcomeMessage(entity this) if (autocvar_g_campaign) { if ((IS_PLAYER(this) && PHYS_INPUT_BUTTON_INFO(this)) || (!IS_PLAYER(this))) { CS(this).motd_actived_time = time; - Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_CAMPAIGN_MESSAGE, Campaign_GetMessage(), Campaign_GetLevelNum()); + SendWelcomemessage(this, false); } } else { if (PHYS_INPUT_BUTTON_INFO(this)) { CS(this).motd_actived_time = time; - Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_MOTD, getwelcomemessage(this)); + SendWelcomemessage(this, true); } } } @@ -2055,7 +2081,7 @@ void PrintWelcomeMessage(entity 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_CAMPAIGN_MESSAGE); + Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); } } else { if (PHYS_INPUT_BUTTON_INFO(this)) @@ -2074,10 +2100,7 @@ void PrintWelcomeMessage(entity this) { // instantly hide MOTD CS(this).motd_actived_time = 0; - if (autocvar_g_campaign) - Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_CAMPAIGN_MESSAGE); - else - Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); + Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); } else if (IS_PLAYER(this) || IS_SPEC(this)) { @@ -2300,7 +2323,7 @@ void ObserverOrSpectatorThink(entity this) TRANSMUTE(Observer, this); PutClientInServer(this); } else if(!SpectateUpdate(this) && !SpectateNext(this)) { - PutObserverInServer(this, false); + PutObserverInServer(this, false, true); this.would_spectate = true; } } @@ -2326,7 +2349,7 @@ void ObserverOrSpectatorThink(entity this) } } if(is_spec && !SpectateUpdate(this)) - PutObserverInServer(this, false); + PutObserverInServer(this, false, true); } if (is_spec) this.flags |= FL_CLIENT | FL_NOTARGET; @@ -2697,7 +2720,7 @@ void PlayerPostThink (entity this) if (IS_PLAYER(this) && autocvar_sv_maxidle_playertospectator > 0) { Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_MOVETOSPEC_IDLING, this.netname, maxidle_time); - PutObserverInServer(this, true); + PutObserverInServer(this, true, true); } else {