X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=1dcd95ff952a13f127a6beb26628ba2993e72645;hp=be5138c92d41af91bc93571431ac9f6df2757582;hb=fc0e4c6f26156858a71e0ec62eb974fa11eec2f9;hpb=d7570d4e86980dbcb2fe2d8fbe2ae18fdd382e86 diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index be5138c92..1dcd95ff9 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -6,22 +6,6 @@ void send_CSQC_teamnagger() { WriteByte(MSG_BROADCAST, TE_CSQC_TEAMNAGGER); } -void Announce(string snd) { - WriteByte(MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte(MSG_BROADCAST, TE_CSQC_ANNOUNCE); - WriteString(MSG_BROADCAST, snd); -} - -void AnnounceTo(entity e, string snd) { - if (clienttype(e) == CLIENTTYPE_REAL) - { - msg_entity = e; - WriteByte(MSG_ONE, SVC_TEMPENTITY); - WriteByte(MSG_ONE, TE_CSQC_ANNOUNCE); - WriteString(MSG_ONE, snd); - } -} - float ClientData_Send(entity to, float sf) { if(to != self.owner) @@ -90,240 +74,8 @@ void ClientData_Touch(entity e) } } - -.vector spawnpoint_score; .string netname_previous; -void spawnfunc_info_player_survivor (void) -{ - spawnfunc_info_player_deathmatch(); -} - -void spawnfunc_info_player_start (void) -{ - spawnfunc_info_player_deathmatch(); -} - -void spawnfunc_info_player_deathmatch (void) -{ - self.classname = "info_player_deathmatch"; - relocate_spawnpoint(); -} - -void spawnpoint_use() -{ - if(teamplay) - if(have_team_spawns > 0) - { - self.team = activator.team; - some_spawn_has_been_used = 1; - } -} - -// Returns: -// _x: prio (-1 if unusable) -// _y: weight -vector Spawn_Score(entity spot, float mindist, float teamcheck) -{ - float shortest, thisdist; - float prio; - entity player; - - prio = 0; - - // filter out spots for the wrong team - if(teamcheck >= 0) - if(spot.team != teamcheck) - return '-1 0 0'; - - if(race_spawns) - if(spot.target == "") - return '-1 0 0'; - - if(clienttype(self) == CLIENTTYPE_REAL) - { - if(spot.restriction == 1) - return '-1 0 0'; - } - else - { - if(spot.restriction == 2) - return '-1 0 0'; - } - - shortest = vlen(world.maxs - world.mins); - FOR_EACH_PLAYER(player) if (player != self) - { - thisdist = vlen(player.origin - spot.origin); - if (thisdist < shortest) - shortest = thisdist; - } - if(shortest > mindist) - prio += SPAWN_PRIO_GOOD_DISTANCE; - - spawn_score = prio * '1 0 0' + shortest * '0 1 0'; - spawn_spot = spot; - - // filter out spots for assault - if(spot.target != "") { - entity ent; - float found; - - found = 0; - for(ent = world; (ent = find(ent, targetname, spot.target)); ) - { - ++found; - if(ent.spawn_evalfunc) - { - entity oldself = self; - self = ent; - spawn_score = ent.spawn_evalfunc(oldself, spot, spawn_score); - self = oldself; - if(spawn_score_x < 0) - return spawn_score; - } - } - - if(!found) - { - dprint("WARNING: spawnpoint at ", vtos(spot.origin), " could not find its target ", spot.target, "\n"); - return '-1 0 0'; - } - } - - MUTATOR_CALLHOOK(Spawn_Score); - return spawn_score; -} - -void Spawn_ScoreAll(entity firstspot, float mindist, float teamcheck) -{ - entity spot; - for(spot = firstspot; spot; spot = spot.chain) - spot.spawnpoint_score = Spawn_Score(spot, mindist, teamcheck); -} - -entity Spawn_FilterOutBadSpots(entity firstspot, float mindist, float teamcheck) -{ - entity spot, spotlist, spotlistend; - - spotlist = world; - spotlistend = world; - - Spawn_ScoreAll(firstspot, mindist, teamcheck); - - for(spot = firstspot; spot; spot = spot.chain) - { - if(spot.spawnpoint_score_x >= 0) // spawning allowed here - { - if(spotlistend) - spotlistend.chain = spot; - spotlistend = spot; - if(!spotlist) - spotlist = spot; - } - } - if(spotlistend) - spotlistend.chain = world; - - return spotlist; -} - -entity Spawn_WeightedPoint(entity firstspot, float lower, float upper, float exponent) -{ - // weight of a point: bound(lower, mindisttoplayer, upper)^exponent - // multiplied by spot.cnt (useful if you distribute many spawnpoints in a small area) - entity spot; - - RandomSelection_Init(); - for(spot = firstspot; spot; spot = spot.chain) - RandomSelection_Add(spot, 0, string_null, pow(bound(lower, spot.spawnpoint_score_y, upper), exponent) * spot.cnt, (spot.spawnpoint_score_y >= lower) * 0.5 + spot.spawnpoint_score_x); - - return RandomSelection_chosen_ent; -} - -/* -============= -SelectSpawnPoint - -Finds a point to respawn -============= -*/ -entity SelectSpawnPoint (float anypoint) -{ - float teamcheck; - entity spot, firstspot; - - spot = find (world, classname, "testplayerstart"); - if (spot) - return spot; - - if(anypoint || autocvar_g_spawn_useallspawns) - teamcheck = -1; - else if(have_team_spawns > 0) - { - if(have_team_spawns_forteam[self.team] == 0) - { - // we request a spawn for a team, and we have team - // spawns, but that team has no spawns? - if(have_team_spawns_forteam[0]) - // try noteam spawns - teamcheck = 0; - else - // if not, any spawn has to do - teamcheck = -1; - } - else - teamcheck = self.team; // MUST be team - } - else if(have_team_spawns == 0 && have_team_spawns_forteam[0]) - teamcheck = 0; // MUST be noteam - else - teamcheck = -1; - // if we get here, we either require team spawns but have none, or we require non-team spawns and have none; use any spawn then - - - // get the entire list of spots - firstspot = findchain(classname, "info_player_deathmatch"); - // filter out the bad ones - // (note this returns the original list if none survived) - if(anypoint) - { - spot = Spawn_WeightedPoint(firstspot, 1, 1, 1); - } - else - { - float mindist; - if (arena_roundbased && !g_ca) - mindist = 800; - else - mindist = 100; - firstspot = Spawn_FilterOutBadSpots(firstspot, mindist, teamcheck); - - // there is 50/50 chance of choosing a random spot or the furthest spot - // (this means that roughly every other spawn will be furthest, so you - // usually won't get fragged at spawn twice in a row) - if (random() > autocvar_g_spawn_furthest) - spot = Spawn_WeightedPoint(firstspot, 1, 1, 1); - else - spot = Spawn_WeightedPoint(firstspot, 1, 5000, 5); // chooses a far far away spawnpoint - } - - if (!spot) - { - if(autocvar_spawn_debug) - GotoNextMap(0); - else - { - if(some_spawn_has_been_used) - return world; // team can't spawn any more, because of actions of other team - else - error("Cannot find a spawn point - please fix the map!"); - } - } - - return spot; -} - /* ============= CheckPlayerModel @@ -401,7 +153,6 @@ void PutObserverInServer (void) WriteEntity(MSG_ONE, self); } - DropAllRunes(self); MUTATOR_CALLHOOK(MakePlayerObserver); minstagib_stop_countdown(self); @@ -425,12 +176,11 @@ void PutObserverInServer (void) if(self.killcount != -666) { if(g_lms) { - if(PlayerScore_Add(self, SP_LMS_RANK, 0) > 0) - bprint ("^4", self.netname, "^4 has no more lives left\n"); + if(PlayerScore_Add(self, SP_LMS_RANK, 0) > 0 && self.lms_spectate_warning != 2) + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_LMS_NOLIVES, self.netname); else - bprint ("^4", self.netname, "^4 is spectating now\n"); // TODO turn this into a proper forfeit? - } else - bprint ("^4", self.netname, "^4 is spectating now\n"); + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_LMS_FORFEIT, self.netname); + } else { Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_QUIT_SPECTATE, self.netname); } if(self.just_joined == FALSE) { LogTeamchange(self.playerid, -1, 4); @@ -475,7 +225,6 @@ void PutObserverInServer (void) self.think = func_null; self.nextthink = 0; self.hook_time = 0; - self.runes = 0; self.deadflag = DEAD_NO; self.angles = spot.angles; self.angles_z = 0; @@ -564,7 +313,7 @@ void FixPlayermodel() if(teamplay) { string s; - s = Team_ColorNameLowerCase(self.team); + s = Team_ColorName_Lower(self.team); if(s != "neutral") { defaultmodel = cvar_string(strcat("sv_defaultplayermodel_", s)); @@ -630,21 +379,6 @@ void FixPlayermodel() setcolor(self, stof(autocvar_sv_defaultplayercolors)); } -void PlayerTouchExplode(entity p1, entity p2) -{ - vector org; - org = (p1.origin + p2.origin) * 0.5; - org_z += (p1.mins_z + p2.mins_z) * 0.5; - - te_explosion(org); - - entity e; - e = spawn(); - setorigin(e, org); - RadiusDamage(e, world, g_touchexplode_damage, g_touchexplode_edgedamage, g_touchexplode_radius, world, g_touchexplode_force, DEATH_TOUCHEXPLODE, world); - remove(e); -} - /* ============= PutClientInServer @@ -699,7 +433,7 @@ void PutClientInServer (void) spot = SelectSpawnPoint (FALSE); if(!spot) { - centerprint(self, "Sorry, no spawnpoints available!\nHope your team can fix it..."); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_JOIN_NOSPAWNS); return; // spawn failed } @@ -808,8 +542,6 @@ void PutClientInServer (void) self.metertime = 0; - self.runes = 0; - self.deadflag = DEAD_NO; self.angles = spot.angles; @@ -881,9 +613,9 @@ void PutClientInServer (void) if(g_assault) { if(self.team == assault_attacker_team) - centerprint(self, "You are attacking!"); + Send_Notification(NOTIF_TEAM, self, MSG_CENTER, CENTER_ASSAULT_ATTACKING); else - centerprint(self, "You are defending!"); + Send_Notification(NOTIF_TEAM, self, MSG_CENTER, CENTER_ASSAULT_DEFENDING); } target_voicescript_clear(self); @@ -1086,7 +818,7 @@ void ClientKill_Now_TeamChange() if(g_ca) self.caplayer = 0; if(blockSpectators) - sprint(self, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n")); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime); PutObserverInServer(); } else @@ -1152,7 +884,7 @@ void KillIndicator_Think() if(clienttype(self.owner) == CLIENTTYPE_REAL) { if(self.cnt <= 10) - AnnounceTo(self.owner, strcat(ftos(self.cnt), "")); + { Send_Notification(NOTIF_ONE, self.owner, MSG_ANNCE, Announcer_PickNumber(self.cnt)); } } self.nextthink = time + 1; self.cnt -= 1; @@ -1237,28 +969,28 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2 self.killindicator.colormod = '0 0 0'; if(clienttype(self) == CLIENTTYPE_REAL) if(self.killindicator.cnt > 0) - Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "^1Suicide in %d seconds", 1, self.killindicator.cnt); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_SUICIDE, self.killindicator.cnt); } else if(targetteam == -1) // auto { self.killindicator.colormod = '0 1 0'; if(clienttype(self) == CLIENTTYPE_REAL) if(self.killindicator.cnt > 0) - Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "Changing team in %d seconds", 1, self.killindicator.cnt); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_AUTO, self.killindicator.cnt); } else if(targetteam == -2) // spectate { self.killindicator.colormod = '0.5 0.5 0.5'; if(clienttype(self) == CLIENTTYPE_REAL) if(self.killindicator.cnt > 0) - Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "Spectating in %d seconds", 1, self.killindicator.cnt); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_TEAMCHANGE_SPECTATE, self.killindicator.cnt); } else { - self.killindicator.colormod = TeamColor(targetteam); + self.killindicator.colormod = Team_ColorRGB(targetteam); if(clienttype(self) == CLIENTTYPE_REAL) if(self.killindicator.cnt > 0) - Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, strcat("Changing to ", ColoredTeamName(targetteam), " in %d seconds"), 1, self.killindicator.cnt); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, APP_TEAM_NUM_4(targetteam, CENTER_TEAMCHANGE_), self.killindicator.cnt); } } @@ -1300,7 +1032,7 @@ void FixClientCvars(entity e) stuffcmd(e, "cl_cmd settemp cl_movecliptokeyboard 2\n"); if(autocvar_g_antilag == 3) // client side hitscan stuffcmd(e, "cl_cmd settemp cl_prydoncursor_notrace 0\n"); - if(sv_gentle) + if(autocvar_sv_gentle) stuffcmd(e, "cl_cmd settemp cl_gentle 1\n"); /* * we no longer need to stuff this. Remove this comment block if you feel @@ -1349,7 +1081,6 @@ ClientConnect Called when a client connects to the server ============= */ -string ColoredTeamName(float t); void DecodeLevelParms (void); //void dom_player_join_team(entity pl); void set_dom_state(entity e); @@ -1369,7 +1100,7 @@ void ClientConnect (void) DecodeLevelParms(); #ifdef WATERMARK - sprint(self, strcat("^4SVQC Build information: ^1", WATERMARK, "\n")); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_WATERMARK, WATERMARK); #endif self.classname = "player_joining"; @@ -1402,30 +1133,30 @@ void ClientConnect (void) { switch(autocvar_g_campaign_forceteam) { - case 1: self.team_forced = COLOR_TEAM1; break; - case 2: self.team_forced = COLOR_TEAM2; break; - case 3: self.team_forced = COLOR_TEAM3; break; - case 4: self.team_forced = COLOR_TEAM4; break; + case 1: self.team_forced = NUM_TEAM_1; break; + case 2: self.team_forced = NUM_TEAM_2; break; + case 3: self.team_forced = NUM_TEAM_3; break; + case 4: self.team_forced = NUM_TEAM_4; break; default: self.team_forced = 0; } } } else if(PlayerInIDList(self, autocvar_g_forced_team_red)) - self.team_forced = COLOR_TEAM1; + self.team_forced = NUM_TEAM_1; else if(PlayerInIDList(self, autocvar_g_forced_team_blue)) - self.team_forced = COLOR_TEAM2; + self.team_forced = NUM_TEAM_2; else if(PlayerInIDList(self, autocvar_g_forced_team_yellow)) - self.team_forced = COLOR_TEAM3; + self.team_forced = NUM_TEAM_3; else if(PlayerInIDList(self, autocvar_g_forced_team_pink)) - self.team_forced = COLOR_TEAM4; + self.team_forced = NUM_TEAM_4; else if(autocvar_g_forced_team_otherwise == "red") - self.team_forced = COLOR_TEAM1; + self.team_forced = NUM_TEAM_1; else if(autocvar_g_forced_team_otherwise == "blue") - self.team_forced = COLOR_TEAM2; + self.team_forced = NUM_TEAM_2; else if(autocvar_g_forced_team_otherwise == "yellow") - self.team_forced = COLOR_TEAM3; + self.team_forced = NUM_TEAM_3; else if(autocvar_g_forced_team_otherwise == "pink") - self.team_forced = COLOR_TEAM4; + self.team_forced = NUM_TEAM_4; else if(autocvar_g_forced_team_otherwise == "spectate") self.team_forced = -1; else if(autocvar_g_forced_team_otherwise == "spectator") @@ -1477,12 +1208,10 @@ void ClientConnect (void) self.netname_previous = strzone(self.netname); - bprint("^4", self.netname, "^4 connected"); - - if(self.classname != "observer" && (g_domination || g_ctf)) - bprint(" and joined the ", ColoredTeamName(self.team)); - - bprint("\n"); + if((self.classname == STR_PLAYER && teamplay)) + Send_Notification(NOTIF_ALL, world, MSG_INFO, APP_TEAM_ENT_4(self, INFO_JOIN_CONNECT_TEAM_), self.netname); + else + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_JOIN_CONNECT, self.netname); stuffcmd(self, strcat(clientstuff, "\n")); stuffcmd(self, "cl_particles_reloadeffects\n"); // TODO do we still need this? @@ -1525,7 +1254,7 @@ void ClientConnect (void) self.spectatortime = time; if(blockSpectators) { - sprint(self, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n")); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime); } self.jointime = time; @@ -1533,6 +1262,12 @@ void ClientConnect (void) if(clienttype(self) == CLIENTTYPE_REAL) { + if(!autocvar_g_campaign) + { + self.motd_actived_time = -1; + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MOTD, getwelcomemessage()); + } + if(autocvar_g_bugrigs || WEPSET_EQ_AW(g_weaponarena_weapons, WEP_TUBA)) stuffcmd(self, "cl_cmd settemp chase_active 1\n"); } @@ -1582,9 +1317,6 @@ void ClientConnect (void) CheatInitClient(); - if(!autocvar_g_campaign) - Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), autocvar_welcome_message_time, 0); - CSQCMODEL_AUTOINIT(); self.model_randomizer = random(); @@ -1638,10 +1370,9 @@ void ClientDisconnect (void) if(autocvar_sv_eventlog) GameLogEcho(strcat(":part:", ftos(self.playerid))); - bprint ("^4",self.netname); - bprint ("^4 disconnected\n"); + + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_QUIT_DISCONNECT, self.netname); - DropAllRunes(self); MUTATOR_CALLHOOK(ClientDisconnect); Portal_ClearAll(self); @@ -1810,7 +1541,8 @@ void player_powerups (void) self.alpha = default_player_alpha; self.exteriorweaponentity.alpha = default_weapon_alpha; self.items &~= IT_STRENGTH; - sprint(self, "^3Invisibility has worn off\n"); + //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_INVISIBILITY, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_INVISIBILITY); } } else @@ -1820,7 +1552,8 @@ void player_powerups (void) self.alpha = g_minstagib_invis_alpha; self.exteriorweaponentity.alpha = g_minstagib_invis_alpha; self.items |= IT_STRENGTH; - sprint(self, "^3You are invisible\n"); + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_INVISIBILITY, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_INVISIBILITY); } } @@ -1830,7 +1563,8 @@ void player_powerups (void) if (time > self.invincible_finished) { self.items = self.items - (self.items & IT_INVINCIBLE); - sprint(self, "^3Speed has worn off\n"); + //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_SPEED, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SPEED); } } else @@ -1838,7 +1572,8 @@ void player_powerups (void) if (time < self.invincible_finished) { self.items = self.items | IT_INVINCIBLE; - sprint(self, "^3You are on speed\n"); + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_SPEED, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_SPEED); } } } @@ -1851,7 +1586,8 @@ void player_powerups (void) if (time > self.strength_finished) { self.items = self.items - (self.items & IT_STRENGTH); - sprint(self, "^3Strength has worn off\n"); + //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_STRENGTH, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_STRENGTH); } } else @@ -1859,7 +1595,8 @@ void player_powerups (void) if (time < self.strength_finished) { self.items = self.items | IT_STRENGTH; - sprint(self, "^3Strength infuses your weapons with devastating power\n"); + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_STRENGTH, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_STRENGTH); } } if (self.items & IT_INVINCIBLE) @@ -1869,7 +1606,8 @@ void player_powerups (void) if (time > self.invincible_finished) { self.items = self.items - (self.items & IT_INVINCIBLE); - sprint(self, "^3Shield has worn off\n"); + //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERDOWN_SHIELD, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERDOWN_SHIELD); } } else @@ -1877,7 +1615,8 @@ void player_powerups (void) if (time < self.invincible_finished) { self.items = self.items | IT_INVINCIBLE; - sprint(self, "^3Shield surrounds you\n"); + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_POWERUP_SHIELD, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_POWERUP_SHIELD); } } if (self.items & IT_SUPERWEAPON) @@ -1886,7 +1625,8 @@ void player_powerups (void) { self.superweapons_finished = 0; self.items = self.items - (self.items & IT_SUPERWEAPON); - sprint(self, "^3Superweapons have been lost\n"); + //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_SUPERWEAPON_LOST, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_SUPERWEAPON_LOST); } else if (self.items & IT_UNLIMITED_SUPERWEAPONS) { @@ -1899,7 +1639,8 @@ void player_powerups (void) { self.items = self.items - (self.items & IT_SUPERWEAPON); WEPSET_ANDNOT_EA(self, WEPBIT_SUPERWEAPONS); - sprint(self, "^3Superweapons have broken down\n"); + //Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_SUPERWEAPON_BROKEN, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_SUPERWEAPON_BROKEN); } } } @@ -1908,7 +1649,8 @@ void player_powerups (void) if (time < self.superweapons_finished || (self.items & IT_UNLIMITED_SUPERWEAPONS)) { self.items = self.items | IT_SUPERWEAPON; - sprint(self, "^3You now have a superweapon\n"); + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_SUPERWEAPON_PICKUP, self.netname); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_SUPERWEAPON_PICKUP); } else { @@ -2004,32 +1746,6 @@ void player_regen (void) max_mod = regen_mod = rot_mod = limit_mod = 1; - if (self.runes & RUNE_REGEN) - { - if (self.runes & CURSE_VENOM) // do we have both rune/curse? - { - regen_mod = autocvar_g_balance_rune_regen_combo_regenrate; - max_mod = autocvar_g_balance_rune_regen_combo_hpmod; - limit_mod = autocvar_g_balance_rune_regen_combo_limitmod; - } - else - { - regen_mod = autocvar_g_balance_rune_regen_regenrate; - max_mod = autocvar_g_balance_rune_regen_hpmod; - limit_mod = autocvar_g_balance_rune_regen_limitmod; - } - } - else if (self.runes & CURSE_VENOM) - { - max_mod = autocvar_g_balance_curse_venom_hpmod; - if (self.runes & RUNE_REGEN) // do we have both rune/curse? - rot_mod = autocvar_g_balance_rune_regen_combo_rotrate; - else - rot_mod = autocvar_g_balance_curse_venom_rotrate; - limit_mod = autocvar_g_balance_curse_venom_limitmod; - //if (!self.runes & RUNE_REGEN) - // rot_mod = autocvar_g_balance_curse_venom_rotrate; - } maxh = maxh * max_mod; //maxa = maxa * max_mod; //maxf = maxf * max_mod; @@ -2309,55 +2025,37 @@ void ShowRespawnCountdown() { self.respawn_countdown = number - 1; if(ceil(self.respawn_time - (time + 0.5)) == number) // only say it if it is the same number even in 0.5s; to prevent overlapping sounds - AnnounceTo(self, strcat(ftos(number), "")); + Send_Notification(NOTIF_ONE, self, MSG_ANNCE, Announcer_PickNumber(number)); } } } -.float prevent_join_msgtime; void LeaveSpectatorMode() { - if(nJoinAllowed(self)) { - if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) { + if(nJoinAllowed(self)) + { + if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) + { self.classname = "player"; if(autocvar_g_campaign || autocvar_g_balance_teams) - JoinBestTeam(self, FALSE, TRUE); + { JoinBestTeam(self, FALSE, TRUE); } if(autocvar_g_campaign) - campaign_bots_may_start = 1; + { campaign_bots_may_start = 1; } - PutClientInServer(); - - if(self.classname == "player") - bprint ("^4", self.netname, "^4 is playing now\n"); - - if(!autocvar_g_campaign) - if (time < self.jointime + autocvar_welcome_message_time) - Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); // clear MOTD + Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_PREVENT_JOIN); - if (self.prevent_join_msgtime) - { - Send_CSQC_Centerprint_Generic_Expire(self, CPID_PREVENT_JOIN); - self.prevent_join_msgtime = 0; - } + PutClientInServer(); - return; - } else { - if (g_ca && self.caplayer) { - } // do nothing - else - stuffcmd(self,"menu_showteamselect\n"); - return; + if(IS_PLAYER(self)) { Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_JOIN_PLAY, self.netname); } } + else if not(g_ca && self.caplayer) { stuffcmd(self, "menu_showteamselect\n"); } } - else { - //player may not join because of g_maxplayers is set - if (time - self.prevent_join_msgtime > 2) - { - Send_CSQC_Centerprint_Generic(self, CPID_PREVENT_JOIN, PREVENT_JOIN_TEXT, 0, 0); - self.prevent_join_msgtime = time; - } + else + { + // Player may not join because g_maxplayers is set + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_JOIN_PREVENT); } } @@ -2408,46 +2106,57 @@ float nJoinAllowed(entity ignore) { void checkSpectatorBlock() { if(self.classname == "spectator" || self.classname == "observer") { if( time > (self.spectatortime + autocvar_g_maxplayers_spectator_blocktime) ) { - sprint(self, "^7You were kicked from the server because you are spectator and spectators aren't allowed at the moment.\n"); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_QUIT_KICK_SPECTATING); dropclient(self); } } } -.float motd_actived_time; // used for both motd and campaign_message void PrintWelcomeMessage() { - if (self.motd_actived_time == 0) { // is there already a message showing? + if(self.motd_actived_time == 0) + { if (autocvar_g_campaign) { if ((self.classname == "player" && self.BUTTON_INFO) || (self.classname != "player")) { self.motd_actived_time = time; - Send_CSQC_Centerprint_Generic(self, CPID_MOTD, campaign_message, -1, 0); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MOTD, campaign_message); } } else { - if ((time - self.jointime > autocvar_welcome_message_time) && self.BUTTON_INFO) { + if (self.BUTTON_INFO) { self.motd_actived_time = time; - Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), -1, 0); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_MOTD, getwelcomemessage()); } } - } else { // showing MOTD or campaign message + } + else if(self.motd_actived_time > 0) // showing MOTD or campaign message + { if (autocvar_g_campaign) { if (self.BUTTON_INFO) self.motd_actived_time = time; else if ((time - self.motd_actived_time > 2) && self.classname == "player") { // hide it some seconds after BUTTON_INFO has been released self.motd_actived_time = 0; - Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); + Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_MOTD); } } else { - if ((time - self.jointime) > autocvar_welcome_message_time) { - if (self.BUTTON_INFO) - self.motd_actived_time = time; - else if (time - self.motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released - self.motd_actived_time = 0; - Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); - } + if (self.BUTTON_INFO) + self.motd_actived_time = time; + else if (time - self.motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released + self.motd_actived_time = 0; + Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_MOTD); } } } + else //if(self.motd_actived_time < 0) // just connected, motd is active + { + if(self.BUTTON_INFO) // BUTTON_INFO hides initial MOTD + self.motd_actived_time = -2; // wait until BUTTON_INFO gets released + else if(self.motd_actived_time == -2 || IS_PLAYER(self) || time - self.jointime > autocvar_welcome_message_time) + { + // instanctly hide MOTD + self.motd_actived_time = 0; + Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_MOTD); + } + } } void ObserverThink() @@ -2478,8 +2187,6 @@ void ObserverThink() } } } - - PrintWelcomeMessage(); } void SpectatorThink() @@ -2518,7 +2225,6 @@ void SpectatorThink() PutObserverInServer(); } - PrintWelcomeMessage(); self.flags |= FL_CLIENT | FL_NOTARGET; } @@ -2537,8 +2243,6 @@ void PlayerUseKey() MUTATOR_CALLHOOK(PlayerUseKey); } -.float touchexplode_time; - /* ============= PlayerPreThink @@ -2595,7 +2299,7 @@ void PlayerPreThink (void) { // notify release users if connecting to git dprint("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"); - sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", autocvar_g_xonoticversion, " (beta)^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n")); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_VERSION_BETA, autocvar_g_xonoticversion, self.cvar_g_xonoticversion); } else { @@ -2605,13 +2309,13 @@ void PlayerPreThink (void) { // give users new version dprint("^1NOTE^7 to ", self.netname, "^7 - ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.org/^1!\n"); - sprint(self, strcat("\{1}^1NOTE: ^3Xonotic ", autocvar_g_xonoticversion, "^7 is out, and you still have ^3Xonotic ", self.cvar_g_xonoticversion, "^1 - get the update from ^4http://www.xonotic.org/^1!\n")); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_VERSION_OUTDATED, autocvar_g_xonoticversion, self.cvar_g_xonoticversion); } else if(r > 0) { // notify users about old server version print("^1NOTE^7 to ", self.netname, "^7 - the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n"); - sprint(self, strcat("\{1}^1NOTE: ^7the server is running ^3Xonotic ", autocvar_g_xonoticversion, "^7, you have ^3Xonotic ", self.cvar_g_xonoticversion, "^1\n")); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_VERSION_OLD, autocvar_g_xonoticversion, self.cvar_g_xonoticversion); } } } @@ -2621,7 +2325,7 @@ void PlayerPreThink (void) // GOD MODE info if(!(self.flags & FL_GODMODE)) if(self.max_armorvalue) { - sprint(self, strcat("godmode saved you ", ftos(self.max_armorvalue), " units of damage, cheater!\n")); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_INFO, INFO_GODMODE_OFF, self.max_armorvalue); self.max_armorvalue = 0; } @@ -2639,11 +2343,10 @@ void PlayerPreThink (void) self.usekeypressed = self.BUTTON_USE; } - PrintWelcomeMessage(); + if(clienttype(self) == CLIENTTYPE_REAL) + PrintWelcomeMessage(); if(self.classname == "player") { -// if(self.netname == "Wazat") -// bprint(self.classname, "\n"); CheckRules_Player(); @@ -2737,25 +2440,6 @@ void PlayerPreThink (void) return; } - // FIXME from now on self.deadflag is always 0 (and self.health is never < 1) - // so (self.deadflag == DEAD_NO) is always true in the code below - - if(g_touchexplode) - if(time > self.touchexplode_time) - if(self.classname == "player") - if(self.deadflag == DEAD_NO) - if not(IS_INDEPENDENT_PLAYER(self)) - FOR_EACH_PLAYER(other) if(self != other) - { - if(time > other.touchexplode_time) - if(other.deadflag == DEAD_NO) - if not(IS_INDEPENDENT_PLAYER(other)) - if(boxesoverlap(self.absmin, self.absmax, other.absmin, other.absmax)) - { - PlayerTouchExplode(self, other); - self.touchexplode_time = other.touchexplode_time = time + 0.2; - } - } if(g_lms && !self.deadflag && autocvar_g_lms_campcheck_interval) { @@ -2777,10 +2461,13 @@ void PlayerPreThink (void) //sprint(self, "distance: ", ftos(self.lms_traveled_distance), "\n"); if(self.lms_traveled_distance < autocvar_g_lms_campcheck_distance) { - centerprint(self, autocvar_g_lms_campcheck_message); + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_LMS_CAMPCHECK); // FIXME KadaverJack: gibbing player here causes playermodel to bounce around, instead of eye.md3 // I wasn't able to find out WHY that happens, so I put a workaround in place that shall prevent players from being gibbed :( - Damage(self, self, self, bound(0, autocvar_g_lms_campcheck_damage, self.health + self.armorvalue * autocvar_g_balance_armor_blockpercent + 5), DEATH_CAMP, self.origin, '0 0 0'); + if(self.vehicle) + Damage(self.vehicle, self, self, autocvar_g_lms_campcheck_damage * 2, DEATH_CAMP, self.vehicle.origin, '0 0 0'); + else + Damage(self, self, self, bound(0, autocvar_g_lms_campcheck_damage, self.health + self.armorvalue * autocvar_g_balance_armor_blockpercent + 5), DEATH_CAMP, self.origin, '0 0 0'); } self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval; self.lms_traveled_distance = 0; @@ -2976,11 +2663,7 @@ void PlayerPostThink (void) { if (time - self.parm_idlesince < 1) // instead of (time == self.parm_idlesince) to support sv_maxidle <= 10 { - if(self.idlekick_lasttimeleft) - { - Send_CSQC_Centerprint_Generic_Expire(self, CPID_DISCONNECT_IDLING); - self.idlekick_lasttimeleft = 0; - } + if(self.idlekick_lasttimeleft) { self.idlekick_lasttimeleft = 0; } } else { @@ -2989,19 +2672,18 @@ void PlayerPostThink (void) if(timeleft == min(10, sv_maxidle - 1)) // - 1 to support sv_maxidle <= 10 { if(!self.idlekick_lasttimeleft) - Send_CSQC_Centerprint_Generic(self, CPID_DISCONNECT_IDLING, "^3Stop idling!\n^3Disconnecting in %d seconds...", 1, timeleft); + Send_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER, CENTER_DISCONNECT_IDLING, timeleft); } if(timeleft <= 0) { - bprint("^3", self.netname, "^3 was kicked for idling.\n"); - AnnounceTo(self, "terminated"); + Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_QUIT_KICK_IDLING, self.netname); dropclient(self); return; } else if(timeleft <= 10) { if(timeleft != self.idlekick_lasttimeleft) - AnnounceTo(self, ftos(timeleft)); + Send_Notification(NOTIF_ONE, self, MSG_ANNCE, Announcer_PickNumber(timeleft)); self.idlekick_lasttimeleft = timeleft; } }