]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/mutators/mutator/nades/nades.qc
Merge branch 'master' into 'terencehill/nades_stuff'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / mutators / mutator / nades / nades.qc
index e32cd20d8ab87eeb54f7fd1fff678886a9b6682b..3d3849f628d04ba2d315126c3b20359f862c59c8 100644 (file)
@@ -38,22 +38,18 @@ entity Nade_TrailEffect(int proj, int nade_team)
     return EFFECT_Null;
 }
 
-REGISTER_NET_TEMP(TE_CSQC_DARKBLINKING);
-
 #endif
 
 #ifdef CSQC
 #include <client/draw.qh>
 #include <client/hud/hud.qh>
 
-float dark_appeartime;
-float dark_fadetime;
-bool darkblink;
+bool darkness_fadealpha;
 
 void HUD_DarkBlinking()
 {
        vector bottomright = vec2(vid_conwidth, vid_conheight);
-       drawfill('0 0 0', bottomright, NADE_TYPE_DARKNESS.m_color, 0.986, DRAWFLAG_NORMAL);
+       drawfill('0 0 0', bottomright, NADE_TYPE_DARKNESS.m_color, darkness_fadealpha, DRAWFLAG_NORMAL);
 }
 
 REGISTER_MUTATOR(cl_nades, true);
@@ -61,25 +57,22 @@ MUTATOR_HOOKFUNCTION(cl_nades, HUD_Draw_overlay)
 {
        if (STAT(NADE_DARKNESS_TIME) > time)
        {
-               M_ARGV(0, vector) = NADE_TYPE_DARKNESS.m_color;
+               if (!darkness_fadealpha)
+                       sound(csqcplayer, CH_PAIN, SND_BLIND, VOL_BASE, ATTEN_NORM);
+               darkness_fadealpha = min(0.986, darkness_fadealpha + frametime * 7);
+       }
+       else if (darkness_fadealpha > 0)
+               darkness_fadealpha = max(0, darkness_fadealpha - frametime * 7);
+
+       if (darkness_fadealpha > 0)
+       {
                HUD_DarkBlinking();
+               M_ARGV(1, float) = 0; // alpha_multipl 0, don't draw normal overlay
                return true;
        }
        return false;
 }
 
-NET_HANDLE(TE_CSQC_DARKBLINKING, bool isNew)
-{
-       return = true;
-
-       if(darkblink) return;
-
-       localcmd("play2 sound/misc/blind\n");
-       darkblink = true;
-       dark_appeartime = time;
-       dark_fadetime = STAT(NADE_DARKNESS_TIME);
-}
-
 MUTATOR_HOOKFUNCTION(cl_nades, Ent_Projectile)
 {
        entity proj = M_ARGV(0, entity);
@@ -100,6 +93,8 @@ MUTATOR_HOOKFUNCTION(cl_nades, Ent_Projectile)
 }
 MUTATOR_HOOKFUNCTION(cl_nades, EditProjectile)
 {
+       if (!mut_is_active(MUT_NADES)) return;
+
        entity proj = M_ARGV(0, entity);
 
        if (proj.cnt == PROJECTILE_NAPALM_FOUNTAIN)
@@ -111,6 +106,7 @@ MUTATOR_HOOKFUNCTION(cl_nades, EditProjectile)
 
        entity nade_type = Nade_FromProjectile(proj.cnt);
        if (nade_type == NADE_TYPE_Null) return;
+
        if(STAT(NADES_SMALL))
        {
                proj.mins = '-8 -8 -8';
@@ -473,24 +469,20 @@ void nade_ice_think(entity this)
 
        float current_freeze_time = this.ltime - time - 0.1;
 
-#define ICE_NADE_RADIUS_TEAMCHECK(checked) \
-       if (checked) \
-       if (!it.revival_time || ((time - it.revival_time) >= 1.5)) \
-       if (!STAT(FROZEN, it)) \
-               nade_ice_freeze(this, it, current_freeze_time); \
-       break;
-
-       FOREACH_ENTITY_RADIUS(this.origin, autocvar_g_nades_nade_radius, it != this && it.takedamage && !IS_DEAD(it) && GetResource(it, RES_HEALTH) > 0 && current_freeze_time > 0,
+       FOREACH_ENTITY_RADIUS(this.origin, autocvar_g_nades_nade_radius, it != this && it.takedamage
+               && !IS_DEAD(it) && GetResource(it, RES_HEALTH) > 0 && current_freeze_time > 0
+               && (!it.revival_time || ((time - it.revival_time) >= 1.5)) && !STAT(FROZEN, it),
        {
                switch (autocvar_g_nades_ice_teamcheck)
                {
-                       // 1: nade owner isn't affected; 2: no teammate is affected; any other number than 1 and 2: friendly fire
-                       case 1:  ICE_NADE_RADIUS_TEAMCHECK(it != this.realowner);
-                       case 2:  ICE_NADE_RADIUS_TEAMCHECK(DIFF_TEAM(it, this.realowner) && it != this.realowner);
-                       default: ICE_NADE_RADIUS_TEAMCHECK(!autocvar_g_nades_ice_teamcheck || (DIFF_TEAM(it, this.realowner) || it == this.realowner));
+                       case 0:  break; // affect everyone
+                       default: 
+                       case 2:  if(SAME_TEAM(it, this.realowner)) continue; // don't affect teammates
+                                // fall through (check case 1 condition too)
+                       case 1:  if(it == this.realowner) continue; // don't affect the player who threw the nade
                }
+               nade_ice_freeze(this, it, current_freeze_time);
        });
-#undef ICE_NADE_RADIUS_TEAMCHECK
 }
 
 void nade_ice_boom(entity this)
@@ -804,19 +796,6 @@ void nade_ammo_boom(entity this)
        orb.colormod = '0.66 0.33 0';
 }
 
-void DarkBlinking(entity e)
-{
-       if(e == NULL) return;
-
-       int accepted = VerifyClientEntity(e, true, false);
-
-       if(accepted > 0)
-       {
-               msg_entity = e;
-               WriteHeader(MSG_ONE, TE_CSQC_DARKBLINKING);
-       }
-}
-
 void nade_darkness_think(entity this)
 {
        if(round_handler_IsActive())
@@ -863,28 +842,22 @@ void nade_darkness_think(entity this)
                Send_Effect(EFFECT_DARKFIELD, this.origin, '0 0 0', 1);
        }
 
-       float current_dark_time = this.ltime - time - 0.1;
 
-#define DARK_NADE_RADIUS_TEAMCHECK(checked) \
-       if (checked) \
-       if ( IS_REAL_CLIENT(it) ) \
-       { \
-               STAT(NADE_DARKNESS_TIME, it) = time + 0.1; \
-               DarkBlinking(it); \
-       } \
-       break;
+       float current_dark_time = this.ltime - time - 0.1;
 
-       FOREACH_ENTITY_RADIUS(this.origin, autocvar_g_nades_nade_radius, it != this && it.takedamage && !IS_DEAD(it) && GetResource(it, RES_HEALTH) > 0 && current_dark_time > 0,
+       FOREACH_ENTITY_RADIUS(this.origin, autocvar_g_nades_nade_radius, it != this && it.takedamage
+               && !IS_DEAD(it) && GetResource(it, RES_HEALTH) > 0 && current_dark_time > 0 && IS_REAL_CLIENT(it),
        {
                switch (autocvar_g_nades_darkness_teamcheck)
                {
-                       // 1: nade owner isn't affected; 2: no teammate is affected; any other number than 1 and 2: friendly fire
-                       case 1:  DARK_NADE_RADIUS_TEAMCHECK(it != this.realowner);
-                       case 2:  DARK_NADE_RADIUS_TEAMCHECK(DIFF_TEAM(it, this.realowner) && it != this.realowner);
-                       default: DARK_NADE_RADIUS_TEAMCHECK(!autocvar_g_nades_darkness_teamcheck || (DIFF_TEAM(it, this.realowner) && it != this.realowner));
+                       case 0:  break; // affect everyone
+                       default:
+                       case 2:  if(SAME_TEAM(it, this.realowner)) continue; // don't affect teammates
+                                // fall through (check case 1 condition too)
+                       case 1:  if(it == this.realowner) continue; // don't affect the player who threw the nade
                }
+               STAT(NADE_DARKNESS_TIME, it) = time + 0.1;
        });
-#undef DARK_NADE_RADIUS_TEAMCHECK
 }
 
 void nade_darkness_boom(entity this)
@@ -1426,10 +1399,9 @@ void nades_Clear(entity player)
 
 int nades_CheckTypes(entity player, int cl_ntype)
 {
-#define CL_NADE_TYPE_CHECK(cl_ntype, cvar) \
-       case cl_ntype.m_id: \
-               if (!cvar) return NADE_TYPE_NORMAL.m_id; \
-               break
+       // TODO check what happens without this patch
+#define CL_NADE_TYPE_CHECK(nade_ent, nade_cvar) \
+       case nade_ent.m_id: if (nade_cvar) return cl_ntype
 
        switch (cl_ntype)
        {
@@ -1444,7 +1416,7 @@ int nades_CheckTypes(entity player, int cl_ntype)
                CL_NADE_TYPE_CHECK(NADE_TYPE_AMMO,        autocvar_g_nades_ammo);
                CL_NADE_TYPE_CHECK(NADE_TYPE_DARKNESS,    autocvar_g_nades_darkness);
        }
-       return cl_ntype;
+       return NADE_TYPE_NORMAL.m_id; // default to NADE_TYPE_NORMAL for unknown nade types
 #undef CL_NADE_TYPE_CHECK
 }