]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Add a very basic poison effect for stingray
authorMario <mario.mario@y7mail.com>
Wed, 5 Jun 2013 02:01:55 +0000 (12:01 +1000)
committerMario <mario.mario@y7mail.com>
Wed, 5 Jun 2013 02:01:55 +0000 (12:01 +1000)
14 files changed:
effectinfo.txt
qcsrc/client/View.qc
qcsrc/client/csqcmodel_hooks.qc
qcsrc/common/constants.qh
qcsrc/server/cl_client.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/monsters/lib/monsters.qc
qcsrc/server/monsters/monster/knight.qc
qcsrc/server/monsters/monster/spider.qc
qcsrc/server/monsters/monster/stingray.qc
qcsrc/server/monsters/monster/wyvern.qc
qcsrc/server/w_fireball.qc

index 05e881c5da6b5e9d9adc122128fe586d0d0dc681..e24defbc322664544f8cc65a0efe47ec338f67a0 100644 (file)
@@ -8017,3 +8017,39 @@ size 1 1
 alpha 256 256 64
 color 0xFF0FFF 0xFF0FFF
 sizeincrease 1
+
+//EF_POISON
+//poison
+// used nowhere in code
+effect EF_POISON
+count 100
+type smoke
+tex 48 55
+size 5 21
+alpha 200 356 512
+gravity -0.5
+color 0x00ff00 0x00ff00
+bounce 2
+sizeincrease -1
+originoffset 0 0 10
+originjitter 12 12 34
+velocityjitter 22 22 50
+// smoke
+effect EF_POISON
+type alphastatic
+count 50
+tex 0 8
+size 11 15
+sizeincrease 6
+alpha 200 256 200
+color 0x00ff00 0x00ff00
+gravity -0.3
+originoffset 0 0 10
+originjitter 12 12 34
+velocityjitter 11 11 50
+bounce 2
+effect EF_POISON
+count 0.5
+lightradius 200
+lightradiusfade 10000
+lightcolor 0.9 0.9 0.2
index f295c893b4cdd811b8903bfb6a5f7aeb175c4ac1..c08883b108dbcfb75a9e95ed949d457b9d417a7a 100644 (file)
@@ -387,6 +387,8 @@ float checkfail[16];
 float rainbow_last_flicker;
 vector rainbow_prev_color;
 
+float old_v_idlescale;
+
 #define BUTTON_3 4
 #define BUTTON_4 8
 float cl_notice_run();
@@ -902,7 +904,7 @@ void CSQC_UpdateView(float w, float h)
                }
        }
 
-       if(autocvar_hud_damage && !getstati(STAT_FROZEN))
+       if(autocvar_hud_damage && !getstati(STAT_FROZEN) && !getstati(STAT_POISONED))
        {
                splash_size_x = max(vid_conwidth, vid_conheight);
                splash_size_y = max(vid_conwidth, vid_conheight);
@@ -987,6 +989,21 @@ void CSQC_UpdateView(float w, float h)
                        }
                }
        }
+       
+       if(getstati(STAT_POISONED))
+       {
+               if(cvar("v_idlescale") != 50)
+               {
+                       old_v_idlescale = cvar("v_idlescale");
+                       cvar_set("v_idlescale", "50");
+               }
+       }
+       else
+       {
+               if(cvar("v_idlescale") == 50)
+                       cvar_set("v_idlescale", ftos(old_v_idlescale));
+       }
+               
 
        float e1 = (autocvar_hud_postprocessing_maxbluralpha != 0);
        float e2 = (autocvar_hud_powerup != 0);
@@ -1086,6 +1103,9 @@ void CSQC_UpdateView(float w, float h)
                        DrawCircleClippedPic(eX * 0.5 * vid_conwidth + eY * 0.6 * vid_conheight, 0.1 * vid_conheight, "gfx/crosshair_ring.tga", getstatf(STAT_REVIVE_PROGRESS), '0.25 0.90 1', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
                        drawstring_aspect(eY * 0.64 * vid_conheight, _("Revival progress"), eX * vid_conwidth + eY * 0.025 * vid_conheight, '1 1 1', 1, DRAWFLAG_NORMAL);
                }
+               
+               if(getstati(STAT_POISONED))
+                       drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, '0.25 0.90 0.25', autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE);
 
                if(autocvar_r_letterbox == 0)
                        if(autocvar_viewsize < 120)
index 264f4797e58915db809e3154ddfbf73a97305c83..17f7f1224ce20cd20634850db76c2010194327af 100644 (file)
@@ -513,7 +513,12 @@ void CSQCModel_Effects_Apply(void)
        if(eff & EF_FULLBRIGHT)
                self.renderflags |= RF_FULLBRIGHT;
        if(eff & EF_FLAME)
-               pointparticles(particleeffectnum("EF_FLAME"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+       {
+               if(getstati(STAT_POISONED))
+                       pointparticles(particleeffectnum("EF_POISON"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+               else
+                       pointparticles(particleeffectnum("EF_FLAME"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+       }
        if(eff & EF_STARDUST)
                pointparticles(particleeffectnum("EF_STARDUST"), self.origin, '0 0 0', bound(0, frametime, 0.1));
        if(eff & EF_NOSHADOW)
index 7b403ddd107609a9ec804e324e837776e38d3c9e..8bc7a20f14335cd229330b7788d236d98af54d42 100644 (file)
@@ -188,6 +188,8 @@ const float STAT_TOTALWAVES = 74;
 const float STAT_MONSTERS_TOTAL = 75;
 const float STAT_MONSTERS_KILLED = 76;
 
+const float STAT_POISONED = 77;
+
 // mod stats (1xx)
 const float STAT_REDALIVE = 100;
 const float STAT_BLUEALIVE = 101;
index a1206c58363b3618339c9fd4ad5d343d3721b50c..99d24d674836f1e6cf3d894d7045da68e2473599 100644 (file)
@@ -2256,6 +2256,9 @@ void PlayerPreThink (void)
                if(self.revive_progress >= 1)
                        Unfreeze(self);
        }
+       
+       if(!Fire_IsBurning(self))
+               self.poisoned = FALSE;
 
        MUTATOR_CALLHOOK(PlayerPreThink);
 
index 43755d94238cce6c936127f4a2e27e066d868f8c..b46b4a1b248e60f28f81f1bd0464d340ff3f0505 100644 (file)
@@ -587,6 +587,8 @@ float serverflags;
 .float revive_speed; // NOTE: multiplier (anything above 1 is instaheal)
 .entity iceblock;
 
+.float poisoned;
+
 .entity muzzle_flash;
 .float misc_bulletcounter;     // replaces uzi & hlac bullet counter.
 
index 7ca31cecbb91adc8f24e61dc755bff041fc985ba..5a1403f4849d9c3ce773212f3fdc6ea31e9af130 100644 (file)
@@ -1127,10 +1127,12 @@ float Fire_IsBurning(entity e)
        return (time < e.fire_endtime);
 }
 
-float Fire_AddDamage(entity e, entity o, float d, float t, float dt)
+float Fire_AddDamage(entity e, entity o, float d, float t, float dt, float ispoison)
 {
        float dps;
        float maxtime, mintime, maxdamage, mindamage, maxdps, mindps, totaldamage, totaltime;
+       
+       e.poisoned = ispoison;
 
        if(IS_PLAYER(e))
        {
@@ -1260,6 +1262,7 @@ void Fire_ApplyDamage(entity e)
                o = e.fire_owner;
 
        // water and slime stop fire
+       if(!e.poisoned)
        if(e.waterlevel)
        if(e.watertype != CONTENT_LAVA)
                e.fire_endtime = 0;
@@ -1291,7 +1294,7 @@ void Fire_ApplyDamage(entity e)
                {
                        t = autocvar_g_balance_firetransfer_time * (e.fire_endtime - time);
                        d = autocvar_g_balance_firetransfer_damage * e.fire_damagepersec * t;
-                       Fire_AddDamage(other, o, d, t, DEATH_FIRE);
+                       Fire_AddDamage(other, o, d, t, DEATH_FIRE, FALSE);
                }
        }
 }
@@ -1315,6 +1318,7 @@ void fireburner_think()
        Fire_ApplyEffect(self.owner);
        if(!Fire_IsBurning(self.owner))
        {
+               self.owner.poisoned = FALSE;
                self.owner.fire_burner = world;
                remove(self);
                return;
index cf2d12612e27e0a648de1d32fcd1df620a618ee9..d28ef613c1be22c7458601f5fb324bed9a952dd7 100644 (file)
@@ -821,6 +821,7 @@ void spawnfunc_worldspawn (void)
 
        // misc
        addstat(STAT_RESPAWN_TIME, AS_FLOAT, stat_respawn_time);
+       addstat(STAT_POISONED, AS_INT, poisoned);
 
        next_pingtime = time + 5;
 
index 1734b9f16d21754e49c1980e99c9955c4803bc4d..d0e71df27efe1efb411cf16282eee84fcc0353af 100644 (file)
@@ -204,14 +204,14 @@ void monster_setupsounds(string mon)
        if(self.msound_sight == "") self.msound_sight = strzone(strcat("monsters/", mon, "_sight.wav"));
 }
 
-void monster_melee (entity targ, float damg, float er, float deathtype, float dostop)
+float monster_melee (entity targ, float damg, float er, float deathtype, float dostop)
 {
        float dot, rdmg = damg * random();
 
        if (self.health <= 0)
-               return;
+               return FALSE;
        if (targ == world)
-               return;
+               return FALSE;
                
        if(dostop)
        {
@@ -226,6 +226,8 @@ void monster_melee (entity targ, float damg, float er, float deathtype, float do
        
        if(dot > er)
                Damage(targ, self, self, rdmg * monster_skill, deathtype, targ.origin, normalize(targ.origin - self.origin));
+               
+       return TRUE;
 }
 
 void Monster_CheckDropCvars (string mon)
index 0b8f29b73e276f904ab5ae2f896666a52ab21733..cbdc1193576777700932b6d9ad1fa04fa7cf2cc5 100644 (file)
@@ -66,7 +66,7 @@ void knight_inferno()
        sound(self.enemy, CHAN_AUTO, "player/lava.wav", 1, ATTN_NORM);
        
        if(vlen(self.enemy.origin - self.origin) <= 2000)
-               Fire_AddDamage(self.enemy, self, autocvar_g_monster_knight_inferno_damage * monster_skill, autocvar_g_monster_knight_inferno_damagetime, DEATH_MONSTER_KNIGHT_INFERNO);
+               Fire_AddDamage(self.enemy, self, autocvar_g_monster_knight_inferno_damage * monster_skill, autocvar_g_monster_knight_inferno_damagetime, DEATH_MONSTER_KNIGHT_INFERNO, FALSE);
 }
 
 void knight_fireball_explode()
@@ -79,7 +79,7 @@ void knight_fireball_explode()
                RadiusDamage(self, self.realowner, autocvar_g_monster_knight_fireball_damage, autocvar_g_monster_knight_fireball_edgedamage, autocvar_g_monster_knight_fireball_force, world, autocvar_g_monster_knight_fireball_radius, self.projectiledeathtype, world);
                
                for(e = world; (e = findfloat(e, takedamage, DAMAGE_AIM)); ) if(vlen(e.origin - self.origin) <= autocvar_g_monster_knight_fireball_radius)
-                       Fire_AddDamage(e, self, 5 * monster_skill, autocvar_g_monster_knight_inferno_damagetime, self.projectiledeathtype);
+                       Fire_AddDamage(e, self, 5 * monster_skill, autocvar_g_monster_knight_inferno_damagetime, self.projectiledeathtype, FALSE);
                
                remove(self);
        }
index 1356eba6a4416092c5754fd65894c6458063ab3c..2441188551e776c39a1fbc6d6deb9687f49cfb77 100644 (file)
@@ -34,56 +34,62 @@ void spider_think()
 
 void spider_web_explode()
 {
-       float damg = 0, edamg = 0, rad = 1;
-       switch(self.realowner.spider_type)
+       entity e;
+       if(self)
        {
-               case SPIDER_TYPE_ICE:
-                       break; // no change
-               case SPIDER_TYPE_FIRE:
-                       damg = 15;
-                       rad = 25;
-                       edamg = 6;
-                       break;
+               float damg = 0, edamg = 0, rad = 1;
+               switch(self.realowner.spider_type)
+               {
+                       case SPIDER_TYPE_ICE:
+                               pointparticles(particleeffectnum("electro_impact"), self.origin, '0 0 0', 1);
+                               break;
+                       case SPIDER_TYPE_FIRE:
+                               pointparticles(particleeffectnum("fireball_explode"), self.origin, '0 0 0', 1);
+                               damg = 15;
+                               rad = 25;
+                               edamg = 6;
+                               break;
+               }
+               
+               RadiusDamage(self, self.realowner, damg, edamg, 0, world, rad, DEATH_MONSTER_SPIDER_FIRE, world); // ice deals no damage anyway
+               
+               if(self.realowner.spider_type == SPIDER_TYPE_FIRE)
+               for(e = findradius(self.origin, rad); e; e = e.chain) if(e.takedamage && e.deadflag == DEAD_NO)
+               {
+                       switch(self.realowner.spider_type)
+                       {
+                               case SPIDER_TYPE_ICE:
+                                       Freeze(other, 0.3, 2, FALSE);
+                                       break;
+                               case SPIDER_TYPE_FIRE:
+                                       Fire_AddDamage(e, self.realowner, 5 * monster_skill, autocvar_g_monster_spider_attack_fire_time, DEATH_MONSTER_SPIDER_FIRE, FALSE);
+                                       break;
+                       }
+               }
+               
+               remove(self);
        }
-       
-       RadiusDamage (self, self.realowner, damg, edamg, rad, world, 0, self.projectiledeathtype, other);
-       
-       remove (self);
 }
 
 void spider_web_touch()
 {
        PROJECTILE_TOUCH;
        
-       if(other.takedamage == DAMAGE_AIM)
-       if(other.health > 0)
-       switch(self.realowner.spider_type)
-       {
-               case SPIDER_TYPE_ICE:
-                       Freeze(other, 0.3, 2, FALSE);
-                       break;
-               case SPIDER_TYPE_FIRE:
-                       Fire_AddDamage(other, self.realowner, 5 * monster_skill, autocvar_g_monster_spider_attack_fire_time, DEATH_MONSTER_SPIDER_FIRE);
-                       break;
-       }
-               
        spider_web_explode();
 }
 
 void spider_shootweb(float ptype)
 {
-       float p = 0, dt = 0;
+       float p = 0;
        string snd = "";
        switch(ptype)
        {
                case SPIDER_TYPE_ICE:
                        p = PROJECTILE_ELECTRO;
-                       dt = WEP_ELECTRO;
                        snd = "weapons/electro_fire2.wav";
                        break;
                case SPIDER_TYPE_FIRE:
                        p = PROJECTILE_FIREMINE;
-                       dt = WEP_FIREBALL;
                        snd = "weapons/fireball_fire.wav";
                        break;
        }
@@ -103,7 +109,7 @@ void spider_shootweb(float ptype)
        proj.bot_dodgerating = 0;
        proj.nextthink = time + 5;
        PROJECTILE_MAKETRIGGER(proj);
-       proj.projectiledeathtype = dt | HITTYPE_SECONDARY;
+       proj.projectiledeathtype = DEATH_MONSTER_SPIDER_FIRE;
        setorigin(proj, w_shotorg);
 
        //proj.glow_size = 50;
index 61dccfbd6af3f80e4231cd7fead87b006a2170ba..7408fa8971292ce83930d556508f7e346d2c5052 100644 (file)
@@ -31,7 +31,9 @@ float stingray_attack(float attack_type)
                {
                        monsters_setframe(stingray_anim_attack);
                        self.attack_finished_single = time + 0.5;
-                       monster_melee(self.enemy, autocvar_g_monster_stingray_damage, 0.1, DEATH_MONSTER_STINGRAY, FALSE);
+                       if(monster_melee(self.enemy, autocvar_g_monster_stingray_damage, 0.1, DEATH_MONSTER_STINGRAY, FALSE))
+                       if(random() < 0.2)
+                               Fire_AddDamage(self.enemy, self, 30, 10, DEATH_MONSTER_STINGRAY, TRUE);
                        
                        return TRUE;
                }
index e9eda6d6aa2b5fc37cbe94b2ff7e693211aa00f5..40128660b69da6b7a80334b9f34c10adaf15448f 100644 (file)
@@ -39,7 +39,7 @@ void wyvern_fireball_explode()
                RadiusDamage(self, self.realowner, autocvar_g_monster_wyvern_fireball_damage, autocvar_g_monster_wyvern_fireball_edgedamage, autocvar_g_monster_wyvern_fireball_force, world, autocvar_g_monster_wyvern_fireball_radius, self.projectiledeathtype, world);
                
                for(e = world; (e = findfloat(e, takedamage, DAMAGE_AIM)); ) if(vlen(e.origin - self.origin) <= autocvar_g_monster_wyvern_fireball_radius)
-                       Fire_AddDamage(e, self, 5 * monster_skill, autocvar_g_monster_wyvern_fireball_damagetime, self.projectiledeathtype);
+                       Fire_AddDamage(e, self, 5 * monster_skill, autocvar_g_monster_wyvern_fireball_damagetime, self.projectiledeathtype, FALSE);
                
                remove(self);
        }
index 7bccac949414513b6f2aa50cb21ab896fdb3bdc2..520a53e4e5b2a6fd5d80417c98c6da76e87cfbf4 100644 (file)
@@ -100,7 +100,7 @@ void W_Fireball_LaserPlay(float dt, float dist, float damage, float edgedamage,
        {
                d = vlen(WarpZone_UnTransformOrigin(RandomSelection_chosen_ent, self.origin) - RandomSelection_chosen_ent.fireball_impactvec);
                d = damage + (edgedamage - damage) * (d / dist);
-               Fire_AddDamage(RandomSelection_chosen_ent, self.realowner, d * burntime, burntime, self.projectiledeathtype | HITTYPE_BOUNCE);
+               Fire_AddDamage(RandomSelection_chosen_ent, self.realowner, d * burntime, burntime, self.projectiledeathtype | HITTYPE_BOUNCE, FALSE);
                //trailparticles(self, particleeffectnum("fireball_laser"), self.origin, RandomSelection_chosen_ent.fireball_impactvec);
                pointparticles(particleeffectnum("fireball_laser"), self.origin, RandomSelection_chosen_ent.fireball_impactvec - self.origin, 1);
        }
@@ -244,7 +244,7 @@ void W_Firemine_Touch (void)
 {
        PROJECTILE_TOUCH;
        if (other.takedamage == DAMAGE_AIM)
-       if(Fire_AddDamage(other, self.realowner, autocvar_g_balance_fireball_secondary_damage, autocvar_g_balance_fireball_secondary_damagetime, self.projectiledeathtype) >= 0)
+       if(Fire_AddDamage(other, self.realowner, autocvar_g_balance_fireball_secondary_damage, autocvar_g_balance_fireball_secondary_damagetime, self.projectiledeathtype, FALSE) >= 0)
        {
                remove(self);
                return;