]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into LegendaryGuard/bai_mod
authorLegendaryGuard <rootuser999@gmail.com>
Thu, 15 Apr 2021 00:33:22 +0000 (02:33 +0200)
committerLegendaryGuard <rootuser999@gmail.com>
Thu, 15 Apr 2021 00:33:22 +0000 (02:33 +0200)
41 files changed:
1  2 
bal-wep-xonotic.cfg
qcsrc/client/hud/panel/chat.qc
qcsrc/client/hud/panel/scoreboard.qc
qcsrc/client/main.qc
qcsrc/common/ent_cs.qc
qcsrc/common/ent_cs.qh
qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qc
qcsrc/common/gamemodes/gamemode/ctf/sv_ctf.qh
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/mutators/mutator/buffs/sv_buffs.qc
qcsrc/common/mutators/mutator/instagib/sv_instagib.qc
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/overkill/oknex.qc
qcsrc/common/notifications/all.qh
qcsrc/common/replicate.qh
qcsrc/common/scores.qh
qcsrc/common/sounds/all.inc
qcsrc/common/stats.qh
qcsrc/common/util.qc
qcsrc/common/weapons/weapon/electro.qc
qcsrc/common/weapons/weapon/vaporizer.qc
qcsrc/common/weapons/weapon/vortex.qc
qcsrc/ecs/systems/sv_physics.qc
qcsrc/server/client.qc
qcsrc/server/command/cmd.qc
qcsrc/server/command/common.qc
qcsrc/server/command/sv_cmd.qc
qcsrc/server/command/vote.qc
qcsrc/server/damage.qc
qcsrc/server/damage.qh
qcsrc/server/round_handler.qc
qcsrc/server/scores.qc
qcsrc/server/teamplay.qc
qcsrc/server/teamplay.qh
qcsrc/server/weapons/accuracy.qc
qcsrc/server/weapons/accuracy.qh
qcsrc/server/weapons/weaponsystem.qc
qcsrc/server/world.qc
qcsrc/server/world.qh

Simple merge
index cee949f30166abf109e10ba1aaa4a20c9d7bfb6c,972848260dcc94ab74d4c5fafa735517782d2625..6f3e78b3866f23fc77a2119539f0f814a78e8236
@@@ -77,15 -74,23 +77,23 @@@ void HUD_Chat(
        if (!autocvar_con_chatrect)
                cvar_set("con_chatrect", "1");
  
-       cvar_set("con_chatrect_x", ftos(pos.x/vid_conwidth));
-       cvar_set("con_chatrect_y", ftos(pos.y/vid_conheight));
-       cvar_set("con_chatwidth", ftos(mySize.x/vid_conwidth));
-       cvar_set("con_chat", ftos(floor(mySize.y/autocvar_con_chatsize - 0.5)));
+       // can't use a name ending with _x, _y and _z for a float autocvar as for autocvar specs
+       // it prevents ambiguity with component names of vector autocvars
+       if (cvar_string("con_chatrect_x") != ftos(pos.x / vid_conwidth))
+               cvar_set("con_chatrect_x", ftos(pos.x / vid_conwidth));
+       if (cvar_string("con_chatrect_y") != ftos(pos.y / vid_conheight))
+               cvar_set("con_chatrect_y", ftos(pos.y / vid_conheight));
+       // can't use direct comparison here, it would always returns true even if
+       // both arguments are equal because con_chatwidth is saved with cvar_set
+       //if (autocvar_con_chatwidth != mySize.x / vid_conwidth)
+       if (fabs(autocvar_con_chatwidth - mySize.x / vid_conwidth) > 0.00001)
+               cvar_set("con_chatwidth", ftos(mySize.x / vid_conwidth));
+       if (autocvar_con_chat != floor(mySize.y / autocvar_con_chatsize - 0.5))
+               cvar_set("con_chat", ftos(floor(mySize.y / autocvar_con_chatsize - 0.5)));
  
 +      vector chatsize = '1 1 0' * autocvar_con_chatsize;
        if(autocvar__hud_configure)
        {
 -              vector chatsize = '1 1 0' * autocvar_con_chatsize;
                cvar_set("con_chatrect_x", "9001"); // over 9000, we'll fake it instead for more control over alpha and such
                string str = textShortenToWidth(_("^3Player^7: This is the chat area."), mySize.x, chatsize, stringwidth_colors);
                for(int i = 0; i < autocvar_con_chat; ++i)
index a836450970f7d55b34cd144ae427fddf56a13b77,24b6efe6ca582733cfc9303ae980756a08052d1c..54d2d3ba9877be7d36b06e56f890f36cf824fa42
@@@ -490,18 -484,20 +503,21 @@@ void Cmd_Scoreboard_SetFields(int argc
                PlayerScoreField j;
                switch(str)
                {
+                       // fields without a label (not networked via the score system)
                        case "ping": sbt_field[sbt_num_fields] = SP_PING; break;
                        case "pl": sbt_field[sbt_num_fields] = SP_PL; break;
-                       case "kd": case "kdr": case "kdratio": sbt_field[sbt_num_fields] = SP_KDRATIO; break;
-                       case "sum": case "diff": case "k-d": sbt_field[sbt_num_fields] = SP_SUM; break;
 +                      case "cn": sbt_field[sbt_num_fields] = SP_COUNTRY; break; //LegendGuard adds cn label for Country column 05-04-2021
                        case "name": case "nick": sbt_field[sbt_num_fields] = SP_NAME; have_name = true; break;
                        case "|": sbt_field[sbt_num_fields] = SP_SEPARATOR; have_separator = true; break;
-                       case "elo": sbt_field[sbt_num_fields] = SP_ELO; break;
-                       case "dmg": case "damage": sbt_field[sbt_num_fields] = SP_DMG; break;
-                       case "dmgtaken": case "damagetaken": sbt_field[sbt_num_fields] = SP_DMGTAKEN; break;
-                       default:
+                       case "kd": case "kdr": case "kdratio": sbt_field[sbt_num_fields] = SP_KDRATIO; break;
+                       case "sum": case "diff": case "k-d": sbt_field[sbt_num_fields] = SP_SUM; break;
+                       case "frags": sbt_field[sbt_num_fields] = SP_FRAGS; break;
+                       default: // fields with a label
                        {
+                               // map alternative labels
+                               if (str == "damage") str = "dmg";
+                               if (str == "damagetaken") str = "dmgtaken";
                                FOREACH(Scores, true, {
                                        if (str == strtolower(scores_label(it))) {
                                                j = it;
Simple merge
index 0f91e23ffda50c739da4275fa12608c12a439b53,a3691386be379296ae2b494025666e320a13de18..3c780890123f00d1da5794e352b7ab43ac0979df
@@@ -161,26 -157,25 +161,37 @@@ ENTCS_PROP(SOLID, true, sv_solid, solid
        { WriteByte(chan, ent.sv_solid); },
        { ent.sv_solid = ReadByte(); })
  
 +// z411 weapon
 +ENTCS_PROP(ACTIVEWEPID, false, activewepid, activewepid, ENTCS_SET_NORMAL,
 +      { WriteByte(chan, ent.activewepid); },
 +      { ent.activewepid = ReadByte(); })
 +
 +//LegendGuard adds ENTCS_PROP from Mario/survival 15-02-2021
 +// gamemode specific player survival status (independent of score and frags)
 +ENTCS_PROP(SURVIVAL_STATUS, true, survival_status, survival_status, ENTCS_SET_NORMAL,
 +      { WriteShort(chan, ent.survival_status); },
 +      { ent.survival_status = ReadShort(); })
 +
 +
  #ifdef SVQC
  
-       int ENTCS_PUBLICMASK = 0;
+       int ENTCS_PUBLICMASK = 0, ENTCS_PRIVATEMASK = 0;
        STATIC_INIT(ENTCS_PUBLICMASK)
        {
-               FOREACH(EntCSProps, it.m_public,
+               FOREACH(EntCSProps, true,
                {
-                       ENTCS_PUBLICMASK |= BIT(it.m_id);
+                       if (it.m_public)
+                               ENTCS_PUBLICMASK |= BIT(it.m_id);
+                       else
+                               ENTCS_PRIVATEMASK |= BIT(it.m_id);
+               });
+       }
+       void entcs_update_players(entity player)
+       {
+               FOREACH_CLIENT(it != player && IS_PLAYER(it),
+               {
+                       CS(it).entcs.SendFlags |= ENTCS_PRIVATEMASK;
                });
        }
  
Simple merge
index 5eb256320336d994e0d99c9ac7908141ee5ed472,54fac9a5ab0a70a8eb5d4ea57082b3a6719e0015..460a1c300e35bc1a6ecdc51f8f674f6583e2a160
@@@ -625,14 -606,20 +645,21 @@@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink
                                nades_GiveBonus(it, autocvar_g_nades_bonus_score_low);
                        }
  
-                       entity first = reviving_players_first;
-                       Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_FREEZETAG_REVIVED, first.netname);
-                       Send_Notification(NOTIF_ONE, first, MSG_CENTER, CENTER_FREEZETAG_REVIVE, player.netname);
-                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_FREEZETAG_REVIVED, player.netname, first.netname);
-                       Give_Medal(first, ASSIST);
+                       Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_FREEZETAG_REVIVED, revivers_first.netname);
+                       Send_Notification(NOTIF_ONE, revivers_first, MSG_CENTER, CENTER_FREEZETAG_REVIVE, player.netname);
+                       Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_FREEZETAG_REVIVED, player.netname, revivers_first.netname);
++                      Give_Medal(revivers_first, ASSIST);
+                       if(autocvar_sv_eventlog)
+                       {
+                               string revivers = "";
+                               for(entity it = revivers_first; it; it = it.chain)
+                                       revivers = strcat(revivers, ftos(it.playerid), ",");
+                               revivers = substring(revivers, 0, strlen(revivers) - 1);
+                               GameLogEcho(strcat(":ft:revival:", ftos(player.playerid), ":", revivers));
+                       }
                }
  
-               for(entity it = reviving_players_first; it; it = it.chain)
+               for(entity it = revivers_first; it; it = it.chain)
                        STAT(REVIVE_PROGRESS, it) = STAT(REVIVE_PROGRESS, player);
        }
  
Simple merge
index 4cab4fe2957e75a9fc27a4ae10a35d048e607156,e71c61855fc7f749692e7af12cfed3052590f8fd..6f9e8912810388d188c7e15f049229ed4d2b814e
@@@ -1835,57 -1339,64 +1841,73 @@@ MUTATOR_HOOKFUNCTION(nades, PlayerPreTh
                        else
                                player.alpha = player.nade_veil_prevalpha;
                }
 +              //LegendGuard adds nade if STAT DARK_ORB 08-02-2021
 +              if(STAT(DARK_ORB, player) && STAT(DARK_ORB, player) <= time)
 +              {
 +                      STAT(DARK_ORB, player) = 0;
 +                      if(player.vehicle)
 +                              player.vehicle.alpha = player.vehicle.nade_dark_prevalpha;
 +                      else
 +                              player.alpha = player.nade_dark_prevalpha;
 +              }
        }
  
-       if (frametime && IS_PLAYER(player))
-       {
-               int n = 0;
+       if (!(frametime && IS_PLAYER(player)))
+               return true;
  
-               IntrusiveList reviving_players = NULL;
+       entity revivers_last = NULL;
+       entity revivers_first = NULL;
  
-               if(player.freezetag_frozen_timeout > 0 && time >= player.freezetag_frozen_timeout)
-                       n = -1;
-               else if (STAT(FROZEN, player) == FROZEN_TEMP_DYING)
+       bool player_is_reviving = false;
+       int n = 0;
+       vector revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size;
+       FOREACH_CLIENT(IS_PLAYER(it) && IN_REVIVING_RANGE(player, it, revive_extra_size), {
+               // check if player is reviving anyone
+               if (STAT(FROZEN, it) == FROZEN_TEMP_DYING)
                {
-                       vector revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size;
-                       n = 0;
-                       FOREACH_CLIENT(IS_PLAYER(it) && IS_REVIVING(player, it, revive_extra_size), {
-                               if (!reviving_players)
-                                       reviving_players = IL_NEW();
-                               IL_PUSH(reviving_players, it);
-                               ++n;
-                       });
+                       if ((STAT(FROZEN, player) == FROZEN_TEMP_DYING))
+                               continue;
+                       if (!IN_REVIVING_RANGE(player, it, revive_extra_size))
+                               continue;
+                       player_is_reviving = true;
+                       break;
                }
  
-               if (n > 0 && STAT(FROZEN, player) == FROZEN_TEMP_DYING) // OK, there is at least one teammate reviving us
-               {
-                       STAT(REVIVE_PROGRESS, player) = bound(0, STAT(REVIVE_PROGRESS, player) + frametime * max(1/60, autocvar_g_freezetag_revive_speed), 1);
-                       SetResource(player, RES_HEALTH, max(1, STAT(REVIVE_PROGRESS, player) * start_health));
+               if (!(STAT(FROZEN, player) == FROZEN_TEMP_DYING))
+                       continue; // both player and it are NOT frozen
+               if (revivers_last)
+                       revivers_last.chain = it;
+               revivers_last = it;
+               if (!revivers_first)
+                       revivers_first = it;
+               ++n;
+       });
+       if (revivers_last)
+               revivers_last.chain = NULL;
  
-                       if(STAT(REVIVE_PROGRESS, player) >= 1)
-                       {
-                               Unfreeze(player, false);
+       if (!n) // no teammate nearby
+       {
+               // freezetag already resets revive progress
+               if (!g_freezetag && !STAT(FROZEN, player) && !player_is_reviving)
+                       STAT(REVIVE_PROGRESS, player) = 0; // thawing nobody
+       }
+       else if (n > 0 && STAT(FROZEN, player) == FROZEN_TEMP_DYING) // OK, there is at least one teammate reviving us
+       {
+               STAT(REVIVE_PROGRESS, player) = bound(0, STAT(REVIVE_PROGRESS, player) + frametime * max(1/60, autocvar_g_freezetag_revive_speed), 1);
+               // undo what PlayerPreThink did
+               STAT(REVIVE_PROGRESS, player) = bound(0, STAT(REVIVE_PROGRESS, player) + frametime * player.revive_speed, 1);
+               SetResource(player, RES_HEALTH, max(1, STAT(REVIVE_PROGRESS, player) * start_health));
  
-                               entity first = IL_FIRST(reviving_players);
-                               Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_FREEZETAG_REVIVED, first.netname);
-                               Send_Notification(NOTIF_ONE, first, MSG_CENTER, CENTER_FREEZETAG_REVIVE, player.netname);
-                       }
+               if(STAT(REVIVE_PROGRESS, player) >= 1)
+               {
+                       Unfreeze(player, false);
  
-                       IL_EACH(reviving_players, true, {
-                               STAT(REVIVE_PROGRESS, it) = STAT(REVIVE_PROGRESS, player);
-                       });
+                       Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_FREEZETAG_REVIVED, revivers_first.netname);
+                       Send_Notification(NOTIF_ONE, revivers_first, MSG_CENTER, CENTER_FREEZETAG_REVIVE, player.netname);
                }
-               if (reviving_players)
-                       IL_DELETE(reviving_players);
+               for(entity it = revivers_first; it; it = it.chain)
+                       STAT(REVIVE_PROGRESS, it) = STAT(REVIVE_PROGRESS, player);
        }
  }
  
index a4e55983ff208a9d6521ca3506de93bb89d837f4,aefc7234692f4e606075d2493dd785ea492dff30..c6918c5f0a26cae0ebcfa5f695f5a3d0ddb057ca
@@@ -94,20 -94,18 +94,22 @@@ void W_OverkillNex_Attack(Weapon thiswe
        }
  
        yoda = 0;
-       damage_goodhits = 0;
+       impressive_hits = 0;
        FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, mydmg, true, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, thiswep.m_id);
  
-       if(yoda && flying) {
+       if(yoda && flying)
++      {
 +              Give_Medal(actor, YODA);
+               Send_Notification(NOTIF_ONE, actor, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
 +      }
-               
-       if(damage_goodhits && actor.oknex_lasthit)
+       if(impressive_hits && actor.oknex_lasthit)
        {
-               damage_goodhits = 0; // only every second time
 +              Give_Medal(actor, IMPRESSIVE);
+               Send_Notification(NOTIF_ONE, actor, MSG_ANNCE, ANNCE_ACHIEVEMENT_IMPRESSIVE);
+               impressive_hits = 0; // only every second time
        }
  
-       actor.oknex_lasthit = damage_goodhits;
+       actor.oknex_lasthit = impressive_hits;
  
        //beam and muzzle flash done on client
        SendCSQCVortexBeamParticle(charge);
index 354a0166f65e085178f79b53f48dc7996ea32ed6,5a7b0af0f3f76c356c8ae37a5ce94e113f771497..85d96f9179599bb4b72929d35fe37be5f4798875
@@@ -164,16 -158,11 +164,18 @@@ void Create_Notification_Entity_Choice(
                                                                                Notification optiona,
                                                                                Notification optionb);
  
 +void Create_Notification_Entity_Medal(entity notif,
 +                                                                              float var_cvar,
 +                                                                              string namestring,
 +                                                                              /* MSG_MEDAL */
 +                                                                              string icon,
 +                                                                              Notification anncename);
 +
  void Dump_Notifications(int fh, bool alsoprint);
  
- GENERIC_COMMAND(dumpnotifs, "Dump all notifications into notifications_dump.txt", false)
+ #define DEFAULT_FILENAME "notifications_dump.cfg"
+ // NOTE: dumpeffectinfo, dumpnotifs, dumpturrets and dumpweapons use similar code
+ GENERIC_COMMAND(dumpnotifs, "Dump all notifications into " DEFAULT_FILENAME, false)
  {
        switch (request)
        {
index ad79d2cc7ac5461dd7ed310b45002efc677036e1,f9cb040fa8a2542141db235d56ffbec5b4d31caa..7c10cce3245ec2c7a62b8c544b5d640b552dbd83
@@@ -8,9 -8,8 +8,9 @@@
        bool cvar_cl_allow_uidranking;
        float cvar_cl_autoscreenshot;
        float cvar_cl_autotaunt;
-       float cvar_cl_clippedspectating;
+       bool cvar_cl_clippedspectating;
        int cvar_cl_gunalign;
 +      bool cvar_cl_chat_sounds;
        float cvar_cl_handicap;
        float cvar_cl_jetpack_jump;
        float cvar_cl_movement_track_canjump;
@@@ -29,8 -28,7 +29,8 @@@
  #elif defined(SVQC)
        .float cvar_cl_handicap;
        .int cvar_cl_gunalign;
-       .float cvar_cl_clippedspectating;
 +      .bool cvar_cl_chat_sounds;
+       .bool cvar_cl_clippedspectating;
        .float cvar_cl_autoscreenshot;
        .float cvar_cl_jetpack_jump;
        .float cvar_cl_movement_track_canjump;
index 418bd44b87e5ed88056677ae01b517e89f7dfe3a,cf50a7fd12ee0ebadbe177ecdea804d84e518a40..78a7053d3d5468aa54c3b253a220d2e4babc7d12
@@@ -21,13 -22,15 +22,16 @@@ REGISTER_SP(END)
  
  REGISTER_SP(PING);
  REGISTER_SP(PL);
 +REGISTER_SP(COUNTRY); //LegendGuard adds new column for country label 05-04-2021
  REGISTER_SP(NAME);
- REGISTER_SP(KDRATIO);
- REGISTER_SP(SUM);
  REGISTER_SP(SEPARATOR);
  
+ REGISTER_SP(KDRATIO); // kills / deaths
+ REGISTER_SP(SUM); // kills - deaths
+ REGISTER_SP(FRAGS); // kills - suicides
+ // networked fields
  REGISTER_SP(SCORE);
  
  REGISTER_SP(DMG);
Simple merge
index a488a7f58b73db8802ff7ab3aa54d54460db171d,e5621c29ec97ecc80a2ef740ba4061aaec48aa77..4ee4211623527097d93361891e466a2508c79124
@@@ -154,16 -138,9 +154,16 @@@ REGISTER_STAT(ITEMSTIME, int, autocvar_
  REGISTER_STAT(KILL_TIME, float)
  REGISTER_STAT(VEIL_ORB, float)
  REGISTER_STAT(VEIL_ORB_ALPHA, float)
 +REGISTER_STAT(ARMORIZING_ORB, float) //LegendGuard registers new STAT 11-02-2021
 +REGISTER_STAT(ARMORIZING_ORB_ALPHA, float)
 +REGISTER_STAT(AMMUNITIONING_ORB, float) //LegendGuard registers new STAT 11-02-2021
 +REGISTER_STAT(AMMUNITIONING_ORB_ALPHA, float)
 +REGISTER_STAT(DARK_ORB, float) //LegendGuard registers new STAT 08-02-2021
 +REGISTER_STAT(DARK_ORB_ALPHA, float)
 +REGISTER_STAT(TKA_BALLSTATUS, int) //LegendGuard adds STAT from Mario/team_keepaway 15-02-2021
  
  #ifdef SVQC
- float autocvar_sv_showfps = 5;
+ float autocvar_sv_showfps = 0;
  #endif
  REGISTER_STAT(SHOWFPS, float, autocvar_sv_showfps)
  
Simple merge
index 310d6959990b109b0996d8e0ef528f2945ec5854,9409819e9c15b8569fa5623ede91e841984224dc..9e7213057be91734376f0561f6ee2d2f17c5a621
@@@ -79,13 -74,12 +74,14 @@@ void W_Electro_Explode(entity this, ent
                if(IS_PLAYER(directhitentity))
                        if(DIFF_TEAM(this.realowner, directhitentity))
                                if(!IS_DEAD(directhitentity))
 -                                      if(IsFlying(directhitentity))
 -                                              Send_Notification(NOTIF_ONE, this.realowner, MSG_ANNCE, ANNCE_ACHIEVEMENT_ELECTROBITCH);
 -
 +                                      if(IsFlying(directhitentity)) {
 +                                              Give_Medal(this.realowner, ELECTROBITCH);
 +                                      }
 +      */
 +      
        this.event_damage = func_null;
        this.takedamage = DAMAGE_NO;
+       this.velocity = this.movedir; // particle fx and decals need .velocity
  
        if(this.move_movetype == MOVETYPE_BOUNCE || this.classname == "electro_orb") // TODO: classname is more reliable anyway?
        {
index a7b0533ee621e7e2c111138063e33fd686c6c494,6f4d4aebf282b6a9a596c9a0d51819543d10b678..8690bcfd9f3227fb9821e81ee3fdff769fbc3903
@@@ -129,19 -129,17 +129,21 @@@ void W_Vaporizer_Attack(Weapon thiswep
        // do this now, as goodhits is disabled below
        vector v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
        W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, normalize(v - w_shotorg));
-       SendCSQCVaporizerBeamParticle(actor, damage_goodhits);
+       SendCSQCVaporizerBeamParticle(actor, impressive_hits);
  
-       if(yoda && flying) {
-               Give_Medal(actor, YODA);
-       }
-               
-       if(damage_goodhits && actor.vaporizer_lasthit)
+       if(yoda && flying)
++    {
++        Give_Medal(actor, YODA);
+               Send_Notification(NOTIF_ONE, actor, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
 -      if(impressive_hits && actor.vaporizer_lasthit)
++    }
++    if(impressive_hits && actor.vaporizer_lasthit)
        {
-               Give_Medal(actor, IMPRESSIVE);
-               damage_goodhits = 0; // only every second time
++        Give_Medal(actor, IMPRESSIVE);
+               Send_Notification(NOTIF_ONE, actor, MSG_ANNCE, ANNCE_ACHIEVEMENT_IMPRESSIVE);
+               impressive_hits = 0; // only every second time
        }
  
-       actor.vaporizer_lasthit = damage_goodhits;
+       actor.vaporizer_lasthit = impressive_hits;
  
        if(autocvar_g_rm)
        if(!(trace_dphitq3surfaceflags & (Q3SURFACEFLAG_SKY | Q3SURFACEFLAG_NOIMPACT)))
index e78a1be08ab174e9ba514bf86a26807b9d3c8578,7372fe8e1eb4b8183d925aaa45c46055b394feb9..18a6d69fdb05c9a5cc4aa116d5caf7a9c2b0b5d2
@@@ -138,20 -138,18 +138,22 @@@ void W_Vortex_Attack(Weapon thiswep, en
        }
  
        yoda = 0;
-       damage_goodhits = 0;
+       impressive_hits = 0;
        FireRailgunBullet(actor, weaponentity, w_shotorg, w_shotorg + w_shotdir * max_shot_distance, mydmg, false, myforce, mymindist, mymaxdist, myhalflife, myforcehalflife, dtype);
  
-       if(yoda && flying) {
-               Give_Medal(actor, YODA);
-       }
-       
-       if(damage_goodhits && actor.vortex_lasthit)
+       if(yoda && flying)
++    {
++        Give_Medal(actor, YODA);
+               Send_Notification(NOTIF_ONE, actor, MSG_ANNCE, ANNCE_ACHIEVEMENT_YODA);
 -      if(impressive_hits && actor.vortex_lasthit)
++    }
++    if(impressive_hits && actor.vortex_lasthit)
        {
-               Give_Medal(actor, IMPRESSIVE);
-               damage_goodhits = 0; // only every second time
++        Give_Medal(actor, IMPRESSIVE);
+               Send_Notification(NOTIF_ONE, actor, MSG_ANNCE, ANNCE_ACHIEVEMENT_IMPRESSIVE);
+               impressive_hits = 0; // only every second time
        }
  
-       actor.vortex_lasthit = damage_goodhits;
+       actor.vortex_lasthit = impressive_hits;
  
        //beam done on client
        vector v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index ef64667473bad9dd487873dbeea576c2ff1e954a,93c3835271a049b796eaab6a2ff4911ebfe7b6fd..d8163cd0e3d6326f280cef4d86905322caa91aea
@@@ -96,9 -93,9 +96,9 @@@ void round_handler_Spawn(bool() canRoun
                backtrace("Can't spawn round_handler again!");
                return;
        }
-       entity this = round_handler = new(round_handler);
+       entity this = round_handler = new_pure(round_handler);
  
 -      setthink(this, round_handler_FirstThink);
 +      
        this.canRoundStart = canRoundStart_func;
        this.canRoundEnd = canRoundEnd_func;
        this.roundStart = roundStart_func;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge