]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/master' into samual/notification_rewrite
authorSamual Lenks <samual@xonotic.org>
Tue, 1 Jan 2013 19:29:35 +0000 (14:29 -0500)
committerSamual Lenks <samual@xonotic.org>
Tue, 1 Jan 2013 19:29:35 +0000 (14:29 -0500)
21 files changed:
1  2 
commands.cfg
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/csqcmodel_hooks.qc
qcsrc/client/hud.qc
qcsrc/client/main.qh
qcsrc/client/miscfunctions.qc
qcsrc/common/util.qh
qcsrc/menu/progs.src
qcsrc/server/autocvars.qh
qcsrc/server/bot/bot.qc
qcsrc/server/cl_client.qc
qcsrc/server/command/sv_cmd.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/gamemode_ctf.qc
qcsrc/server/mutators/gamemode_nexball.qc
qcsrc/server/w_hagar.qc
qcsrc/server/w_seeker.qc

diff --cc commands.cfg
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index d7fb5e7b052ab604763a3b0b2c40a64eb61ea016,a3eeefb73033ce71cfa2532ce575378af314904e..3807e7ed9dbe97ee17a9172d4313f79fd046a4cc
@@@ -308,287 -308,225 +308,287 @@@ void LogDeath(string mode, float deatht
        GameLogEcho(s);
  }
  
 -void Send_KillNotification (string s1, string s2, string s3, float msg, float type)
 +void Obituary_SpecialDeath(entity notif_target, float murder, float deathtype, string s1, string s2, float f1, float f2, float f3)
  {
 -      WriteByte(MSG_BROADCAST, SVC_TEMPENTITY);
 -      WriteByte(MSG_BROADCAST, TE_CSQC_KILLNOTIFY);
 -      WriteString(MSG_BROADCAST, s1);
 -      WriteString(MSG_BROADCAST, s2);
 -      WriteString(MSG_BROADCAST, s3);
 -      WriteShort(MSG_BROADCAST, msg);
 -      WriteByte(MSG_BROADCAST, type);
 +      float handled, hits;
 +      if(DEATH_ISSPECIAL(deathtype))
 +      {
 +              #define DEATHTYPE(name,msg_death,msg_death_by,position) \
 +                      { if(deathtype == max(0, name)) \
 +                      { \
 +                              #if msg_death != NO_MSG \
 +                                      if not(murder) \
 +                                      { \
 +                                              Send_Notification(notif_target, MSG_ONE, MSG_DEATH, msg_death, s1, s2, f1, f2, f3); \
 +                                              Send_Notification_ToAll(notif_target, TRUE, MSG_INFO, INFO_##msg_death, s1, s2, f1, f2, f3); \
 +                                              ++handled; \
 +                                      } \
 +                              #endif \
 +                              #if msg_death_by != NO_MSG \
 +                                      if(murder) \
 +                                      { \
 +                                              Send_Notification(notif_target, MSG_ONE, MSG_DEATH, msg_death_by, s1, s2, f1, f2, f3); \
 +                                              Send_Notification_ToAll(notif_target, TRUE, MSG_INFO, INFO_##msg_death_by, s1, s2, f1, f2, f3); \
 +                                              ++handled; \
 +                                      } \
 +                              #endif \
 +                              ++hits; \
 +                      } }
 +
 +              DEATHTYPES
 +              #undef DEATHTYPE
 +              
 +              if not(hits)
 +              {
 +                      backtrace("Obituary_SpecialDeath(): Unhandled deathtype- Please notify Samual!\n");
 +              }
 +              if not(handled)
 +              {
 +                      dprint(sprintf("Obituary_SpecialDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification!\n", Deathtype_Name(deathtype), deathtype));
 +                      return;
 +              }
 +      }
  }
  
 -// Function is used to send a generic centerprint whose content CSQC gets to decide (gentle version or not in the below cases)
 -void Send_CSQC_KillCenterprint(entity e, string s1, string s2, float msg, float type)
 +float w_deathtype;
 +float Obituary_WeaponDeath(float murder, float deathtype, string s1, string s2)
  {
 -      if (clienttype(e) == CLIENTTYPE_REAL)
 +      float death_weapon = DEATH_WEAPONOF(deathtype);
 +
 +      if(death_weapon)
        {
 -              msg_entity = e;
 -              WRITESPECTATABLE_MSG_ONE({
 -                      WriteByte(MSG_ONE, SVC_TEMPENTITY);
 -                      WriteByte(MSG_ONE, TE_CSQC_KILLCENTERPRINT);
 -                      WriteString(MSG_ONE, s1);
 -                      WriteString(MSG_ONE, s2);
 -                      WriteShort(MSG_ONE, msg);
 -                      WriteByte(MSG_ONE, type);
 -              });
 +              w_deathtype = deathtype;
 +              float death_message = weapon_action(death_weapon, ((murder) ? WR_KILLMESSAGE : WR_SUICIDEMESSAGE));
 +              w_deathtype = FALSE;
 +
 +              if(death_message) { Send_Notification(world, MSG_BROADCAST, MSG_WEAPON, death_message, s1, s2, NO_FL_ARG, NO_FL_ARG, NO_FL_ARG); }
 +              else { dprint(sprintf("Obituary_WeaponDeath(): ^1Deathtype ^7(%s-%d)^1 has no notification for weapon %d!\n", Deathtype_Name(deathtype), deathtype, death_weapon)); }
 +
 +              return TRUE;
        }
 +      return FALSE;
  }
  
 -void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
 +.float FRAG_VERBOSE;
 +void Obituary(entity attacker, entity inflictor, entity targ, float deathtype)
  {
 +      // Sanity check
 +      if not(targ.classname == STR_PLAYER) { backtrace("Obituary called on non-player?!\n"); return; }
 +
 +      // Declarations
        string  s, a, msg;
-       float w, type;
+       float 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_BROADCAST, 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
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge