From: Samual Lenks Date: Fri, 21 Dec 2012 08:45:43 +0000 (-0500) Subject: Merge remote-tracking branch 'origin/master' into samual/notification_rewrite X-Git-Tag: xonotic-v0.7.0~62^2~23^2~320 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=3b4538464212cdef7e377e6e203e820178a76fe6 Merge remote-tracking branch 'origin/master' into samual/notification_rewrite Conflicts: qcsrc/server/g_damage.qc qcsrc/server/mutators/gamemode_ctf.qc qcsrc/server/mutators/gamemode_nexball.qc --- 3b4538464212cdef7e377e6e203e820178a76fe6 diff --cc qcsrc/client/hud.qc index 2289017ef4,607130ea20..77292f85f1 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@@ -2762,8 -2942,9 +2768,9 @@@ void HUD_Score(void float max_fragcount; max_fragcount = -99; draw_beginBoldFont(); + row = column = 0; for(tm = teams.sort_next; tm; tm = tm.sort_next) { - if(tm.team == COLOR_SPECTATOR) + if(tm.team == FL_SPECTATOR) continue; score = tm.(teamscores[ts_primary]); if(autocvar__hud_configure) @@@ -3723,9 -3913,9 +3739,9 @@@ void HUD_Mod_Dom(vector myPos, vector m { mod_active = 1; // required in each mod function that always shows something entity tm; - float teams_count; + float teams_count = 0; for(tm = teams.sort_next; tm; tm = tm.sort_next) - if(tm.team != COLOR_SPECTATOR) + if(tm.team != FL_SPECTATOR) ++teams_count; float layout = autocvar_hud_panel_modicons_dom_layout; diff --cc qcsrc/server/g_damage.qc index ccc3e8144a,189cd9b056..761585b2ca --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@@ -379,215 -341,192 +379,216 @@@ void Obituary(entity attacker, entity i string s, a, msg; float w, type; - if (targ.classname == "player") - { - s = targ.netname; - a = attacker.netname; + string s1 = NO_STR_ARG, s2 = NO_STR_ARG; + float f1 = NO_FL_ARG, f2 = NO_FL_ARG, f3 = NO_FL_ARG; + float notif_firstblood; - if (targ == attacker) // suicides - { - if (deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE) - msg = ColoredTeamName(targ.team); // TODO: check if needed? - else - msg = ""; - if(!g_cts) // no "killed your own dumb self" message in CTS - Send_CSQC_KillCenterprint(targ, msg, "", deathtype, MSG_SUICIDE); + //dprint(sprintf("Obituary(): Deathtype = %s (%d), Attacker = %s, Inflictor = %s, Target = %s...\n", Deathtype_Name(deathtype), deathtype, attacker.netname, inflictor.netname, targ.netname)); - if(deathtype != DEATH_TEAMCHANGE && deathtype != DEATH_QUIET) + // ======= + // SUICIDE + // ======= + if(targ == attacker) + { + if(DEATH_ISSPECIAL(deathtype)) + { + if(deathtype == DEATH_TEAMCHANGE || deathtype == DEATH_AUTOTEAMCHANGE) { - LogDeath("suicide", deathtype, targ, targ); - GiveFrags(attacker, targ, -1, deathtype); + s1 = targ.netname; + f1 = targ.team; } - - if (targ.killcount > 2) - msg = ftos(targ.killcount); else - msg = ""; - if(teamplay && deathtype == DEATH_MIRRORDAMAGE) { - if(attacker.team == COLOR_TEAM1) - deathtype = KILL_TEAM_RED; - else - deathtype = KILL_TEAM_BLUE; + switch(deathtype) + { + case DEATH_MIRRORDAMAGE: + { + s1 = targ.netname; + f1 = targ.killcount; + break; + } + + default: + { + s1 = targ.netname; + f1 = targ.killcount; + s2 = NO_STR_ARG; + f2 = f3 = NO_FL_ARG; + break; + } + } + LogDeath("suicide", deathtype, targ, targ); + GiveFrags(attacker, targ, -1, deathtype); } - - Send_KillNotification(s, msg, "", deathtype, MSG_SUICIDE); ++ + Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, NO_FL_ARG); } - else if (attacker.classname == "player") + else if not(Obituary_WeaponDeath(FALSE, deathtype, targ.netname, NO_STR_ARG)) { - if(!IsDifferentTeam(attacker, targ)) - { - if(attacker.team == COLOR_TEAM1) - type = KILL_TEAM_RED; - else - type = KILL_TEAM_BLUE; + backtrace("SUICIDE: what the hell happened here?\n"); + } + } - GiveFrags(attacker, targ, -1, deathtype); + // ====== + // MURDER + // ====== + else if(attacker.classname == "player") + { + s1 = attacker.netname; + s2 = targ.netname; - Send_CSQC_KillCenterprint(attacker, s, "", type, MSG_KILL); + // TODO: ADD REAL CHECK HERE! + attacker.FRAG_VERBOSE = TRUE; + targ.FRAG_VERBOSE = TRUE; + + if(!IsDifferentTeam(attacker, targ)) + { + LogDeath("tk", deathtype, attacker, targ); + GiveFrags(attacker, targ, -1, deathtype); - if (targ.killcount > 2) - msg = ftos(targ.killcount); - else - msg = ""; + attacker.killcount = 0; + + Send_Notification(attacker, MSG_ONE, MSG_DEATH, DEATH_TEAMKILL_FRAG, s2, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG); + Send_Notification(targ, MSG_ONE, MSG_DEATH, DEATH_TEAMKILL_FRAGGED, s1, NO_STR_ARG, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG); + Send_Notification(world, MSG_ALL, MSG_INFO, APP_TEAM_NUM_4(targ.team, INFO_DEATH_TEAMKILL_), s2, s1, targ.killcount, NO_FL_ARG, NO_FL_ARG); - if (attacker.killcount > 2) { - msg = ftos(attacker.killcount); - type = KILL_TEAM_SPREE; - } - Send_KillNotification(a, s, msg, type, MSG_KILL); + // In this case, the death message will ALWAYS be "foo was betrayed by bar" + // No need for specific death/weapon messages... + } + else + { + LogDeath("frag", deathtype, attacker, targ); + GiveFrags(attacker, targ, 1, deathtype); - attacker.killcount = 0; + attacker.taunt_soundtime = time + 1; + attacker.killcount = attacker.killcount + 1; + + #define ADD_ACHIEVEMENT_CASE(numa,numb) \ + case numa: \ + { \ + AnnounceTo(attacker, strcat(#numb, "kills")); \ + PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_##numa, 1); \ + break; \ + } + switch(attacker.killcount) + { + ADD_ACHIEVEMENT_CASE(3, 03) + ADD_ACHIEVEMENT_CASE(5, 05) + ADD_ACHIEVEMENT_CASE(10, 10) + ADD_ACHIEVEMENT_CASE(15, 15) + ADD_ACHIEVEMENT_CASE(20, 20) + ADD_ACHIEVEMENT_CASE(25, 25) + ADD_ACHIEVEMENT_CASE(30, 30) + default: break; + } + #undef ADD_ACHIEVEMENT_CASE - LogDeath("tk", deathtype, attacker, targ); + if(!checkrules_firstblood) + { + checkrules_firstblood = TRUE; + notif_firstblood = TRUE; // modify the current messages so that they too show firstblood information + PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1); + PlayerStats_Event(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1); } - else + + if(notif_firstblood) // first blood, no kill sprees yet { - if (!checkrules_firstblood) + if(targ.istypefrag) { - checkrules_firstblood = TRUE; - Send_KillNotification(a, "", "", KILL_FIRST_BLOOD, MSG_KILL); - // TODO: make these print a newline if they dont - Send_CSQC_KillCenterprint(attacker, "", "", KILL_FIRST_BLOOD, MSG_KILL); - Send_CSQC_KillCenterprint(targ, "", "", KILL_FIRST_VICTIM, MSG_KILL); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD, 1); - PlayerStats_Event(targ, PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM, 1); - } - - if(targ.istypefrag) { - Send_CSQC_KillCenterprint(attacker, s, Obituary_ExtraFragInfo(targ), KILL_TYPEFRAG, MSG_KILL); - Send_CSQC_KillCenterprint(targ, a, Obituary_ExtraFragInfo(attacker), KILL_TYPEFRAGGED, MSG_KILL); - } else { - Send_CSQC_KillCenterprint(attacker, s, Obituary_ExtraFragInfo(targ), KILL_FRAG, MSG_KILL); - Send_CSQC_KillCenterprint(targ, a, Obituary_ExtraFragInfo(attacker), KILL_FRAGGED, MSG_KILL); + Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_FIRST_VERBOSE : DEATH_MURDER_TYPEFRAG_FIRST), + s2, s1, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG, NO_FL_ARG); + + Send_Notification(targ, MSG_ONE, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAGGED_FIRST_VERBOSE : DEATH_MURDER_TYPEFRAGGED_FIRST), + s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG)); } - - attacker.taunt_soundtime = time + 1; - - if (deathtype == DEATH_HURTTRIGGER && inflictor.message2 != "") - msg = inflictor.message2; - else if (deathtype == DEATH_CUSTOM) - msg = deathmessage; else - msg = ""; - - if(strstrofs(msg, "%", 0) < 0) - msg = strcat("%s ", msg, " by %s"); - - Send_KillNotification(a, s, msg, deathtype, MSG_KILL); - - GiveFrags(attacker, targ, 1, deathtype); - - if (targ.killcount > 2) { - Send_KillNotification(s, ftos(targ.killcount), a, KILL_END_SPREE, MSG_SPREE); - } - - attacker.killcount = attacker.killcount + 1; - - if (attacker.killcount == 3) - { - Send_KillNotification(a, "", "", KILL_SPREE_3, MSG_SPREE); - AnnounceTo(attacker, "03kills"); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3, 1); - } - else if (attacker.killcount == 5) - { - Send_KillNotification(a, "", "", KILL_SPREE_5, MSG_SPREE); - AnnounceTo(attacker, "05kills"); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5, 1); - } - else if (attacker.killcount == 10) - { - Send_KillNotification(a, "", "", KILL_SPREE_10, MSG_SPREE); - AnnounceTo(attacker, "10kills"); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10, 1); - } - else if (attacker.killcount == 15) - { - Send_KillNotification(a, "", "", KILL_SPREE_15, MSG_SPREE); - AnnounceTo(attacker, "15kills"); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15, 1); - } - else if (attacker.killcount == 20) { - Send_KillNotification(a, "", "", KILL_SPREE_20, MSG_SPREE); - AnnounceTo(attacker, "20kills"); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20, 1); + Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_FIRST_VERBOSE : DEATH_MURDER_FRAG_FIRST), + s2, s1, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG, NO_FL_ARG); + + Send_Notification(targ, MSG_ONE, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_FRAGGED_FIRST_VERBOSE : DEATH_MURDER_FRAGGED_FIRST), + s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG)); } - else if (attacker.killcount == 25) + } + else // normal frags, kill sprees listed + { + if(targ.istypefrag) { - Send_KillNotification(a, "", "", KILL_SPREE_25, MSG_SPREE); - AnnounceTo(attacker, "25kills"); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25, 1); + Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAG_VERBOSE : DEATH_MURDER_TYPEFRAG), + s2, NO_STR_ARG, attacker.killcount, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG); + + Send_Notification(targ, MSG_ONE, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_TYPEFRAGGED_VERBOSE : DEATH_MURDER_TYPEFRAGGED), + s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG)); } - else if (attacker.killcount == 30) + else { - Send_KillNotification(a, "", "", KILL_SPREE_30, MSG_SPREE); - AnnounceTo(attacker, "30kills"); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30, 1); - } - else if (attacker.killcount > 2) { - Send_KillNotification(a, ftos(attacker.killcount), "", KILL_SPREE, MSG_SPREE); + Send_Notification(attacker, MSG_ONE, MSG_DEATH, (attacker.FRAG_VERBOSE ? DEATH_MURDER_FRAG_VERBOSE : DEATH_MURDER_FRAG), + s2, NO_STR_ARG, attacker.killcount, (attacker.FRAG_VERBOSE ? ((clienttype(targ) == CLIENTTYPE_BOT) ? BOT_PING : targ.ping) : NO_FL_ARG), NO_FL_ARG); + + Send_Notification(targ, MSG_ONE, MSG_DEATH, (targ.FRAG_VERBOSE ? DEATH_MURDER_FRAGGED_VERBOSE : DEATH_MURDER_FRAGGED), + s1, NO_STR_ARG, (targ.FRAG_VERBOSE ? attacker.health : NO_FL_ARG), (targ.FRAG_VERBOSE ? attacker.armorvalue : NO_FL_ARG), (targ.FRAG_VERBOSE ? ((clienttype(attacker) == CLIENTTYPE_BOT) ? BOT_PING : attacker.ping) : NO_FL_ARG)); } - LogDeath("frag", deathtype, attacker, targ); } + + if not(Obituary_WeaponDeath(TRUE, deathtype, targ.netname, attacker.netname)) + Obituary_SpecialDeath(targ, TRUE, deathtype, s2, s1, targ.killcount, NO_FL_ARG, NO_FL_ARG); } - else + } + + // ============= + // ACCIDENT/TRAP + // ============= + else + { + switch(deathtype) { - Send_CSQC_KillCenterprint(targ, "", "", deathtype, MSG_KILL_ACTION); - if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "") - msg = inflictor.message; - else if (deathtype == DEATH_CUSTOM) - msg = deathmessage; - else - msg = ""; - if(strstrofs(msg, "%", 0) < 0) - msg = strcat("%s ", msg); - - GiveFrags(targ, targ, -1, deathtype); - if(PlayerScore_Add(targ, SP_SCORE, 0) == -5) { - AnnounceTo(targ, "botlike"); - PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1); + // For now, we're just forcing HURTTRIGGER to behave as "DEATH_VOID" and giving it no special options... + // Later on you will only be able to make custom messages using DEATH_CUSTOM, + // and there will be a REAL DEATH_VOID implementation which mappers will use. + /*case DEATH_HURTTRIGGER: + { + s1 = targ.netname; + s2 = inflictor.message; + if(strstrofs(s2, "%", 0) < 0) { s2 = strcat("%s ", s2); } + break; + }*/ + + case DEATH_CUSTOM: + { + s1 = targ.netname; + s2 = deathmessage; + f1 = targ.killcount; + if(strstrofs(s2, "%", 0) < 0) { s2 = strcat("%s ", s2); } + f2 = f3 = NO_FL_ARG; + break; } - Send_KillNotification(s, msg, "", deathtype, MSG_KILL_ACTION); + + default: + { + s1 = targ.netname; + f1 = targ.killcount; + s2 = NO_STR_ARG; + f2 = f3 = NO_FL_ARG; + break; + } + } - if (targ.killcount > 2) - Send_KillNotification(s, ftos(targ.killcount), "", 0, MSG_KILL_ACTION_SPREE); + LogDeath("accident", deathtype, targ, targ); + GiveFrags(targ, targ, -1, deathtype); - LogDeath("accident", deathtype, targ, targ); + if(PlayerScore_Add(targ, SP_SCORE, 0) == -5) + { + AnnounceTo(targ, "botlike"); + PlayerStats_Event(attacker, PLAYERSTATS_ACHIEVEMENT_BOTLIKE, 1); } - targ.death_origin = targ.origin; - if(targ != attacker) - targ.killer_origin = attacker.origin; - - // FIXME: this should go in PutClientInServer - if (targ.killcount) - targ.killcount = 0; + Obituary_SpecialDeath(targ, FALSE, deathtype, s1, s2, f1, f2, f3); } + + // Set final information for the death + targ.death_origin = targ.origin; + if(targ != attacker) { targ.killer_origin = attacker.origin; } + if(targ.killcount) { targ.killcount = 0; } } // these are updated by each Damage call for use in button triggering and such diff --cc qcsrc/server/mutators/gamemode_ctf.qh index 195b2434d7,1c5898bd1a..ae3ce4ade6 --- a/qcsrc/server/mutators/gamemode_ctf.qh +++ b/qcsrc/server/mutators/gamemode_ctf.qh @@@ -1,8 -1,7 +1,8 @@@ // these are needed since mutators are compiled last +#ifdef SVQC // used in cheats.qc - void ctf_RespawnFlag(entity flag) + void ctf_RespawnFlag(entity flag); // score rule declarations #define ST_CTF_CAPS 1 diff --cc qcsrc/server/mutators/gamemode_nexball.qc index f5b92a4808,f328162ff3..c115dca36c --- a/qcsrc/server/mutators/gamemode_nexball.qc +++ b/qcsrc/server/mutators/gamemode_nexball.qc @@@ -204,8 -204,8 +204,9 @@@ void ResetBall(void if(self.cnt < 2) // step 1 { if(time == self.teamtime) - bprint("The ", ColoredTeamName(self.team), " held the ball for too long.\n"); + bprint("The ", Team_ColoredFullName(self.team), " held the ball for too long.\n"); - self.touch = SUB_Null; ++ + self.touch = func_null; self.movetype = MOVETYPE_NOCLIP; self.velocity = '0 0 0'; // just in case? if(!self.cnt)