From: Mario Date: Wed, 5 Jun 2013 02:01:55 +0000 (+1000) Subject: Add a very basic poison effect for stingray X-Git-Tag: xonotic-v0.8.0~241^2^2~200 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0e105c64d1947373c29cd28efbf877883809973d;p=xonotic%2Fxonotic-data.pk3dir.git Add a very basic poison effect for stingray --- diff --git a/effectinfo.txt b/effectinfo.txt index 05e881c5d..e24defbc3 100644 --- a/effectinfo.txt +++ b/effectinfo.txt @@ -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 diff --git a/qcsrc/client/View.qc b/qcsrc/client/View.qc index f295c893b..c08883b10 100644 --- a/qcsrc/client/View.qc +++ b/qcsrc/client/View.qc @@ -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) diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index 264f4797e..17f7f1224 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -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) diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 7b403ddd1..8bc7a20f1 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -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; diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index a1206c583..99d24d674 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -2256,6 +2256,9 @@ void PlayerPreThink (void) if(self.revive_progress >= 1) Unfreeze(self); } + + if(!Fire_IsBurning(self)) + self.poisoned = FALSE; MUTATOR_CALLHOOK(PlayerPreThink); diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 43755d942..b46b4a1b2 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -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. diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 7ca31cecb..5a1403f48 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -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; diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index cf2d12612..d28ef613c 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -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; diff --git a/qcsrc/server/monsters/lib/monsters.qc b/qcsrc/server/monsters/lib/monsters.qc index 1734b9f16..d0e71df27 100644 --- a/qcsrc/server/monsters/lib/monsters.qc +++ b/qcsrc/server/monsters/lib/monsters.qc @@ -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) diff --git a/qcsrc/server/monsters/monster/knight.qc b/qcsrc/server/monsters/monster/knight.qc index 0b8f29b73..cbdc11935 100644 --- a/qcsrc/server/monsters/monster/knight.qc +++ b/qcsrc/server/monsters/monster/knight.qc @@ -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); } diff --git a/qcsrc/server/monsters/monster/spider.qc b/qcsrc/server/monsters/monster/spider.qc index 1356eba6a..244118855 100644 --- a/qcsrc/server/monsters/monster/spider.qc +++ b/qcsrc/server/monsters/monster/spider.qc @@ -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; diff --git a/qcsrc/server/monsters/monster/stingray.qc b/qcsrc/server/monsters/monster/stingray.qc index 61dccfbd6..7408fa897 100644 --- a/qcsrc/server/monsters/monster/stingray.qc +++ b/qcsrc/server/monsters/monster/stingray.qc @@ -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; } diff --git a/qcsrc/server/monsters/monster/wyvern.qc b/qcsrc/server/monsters/monster/wyvern.qc index e9eda6d6a..40128660b 100644 --- a/qcsrc/server/monsters/monster/wyvern.qc +++ b/qcsrc/server/monsters/monster/wyvern.qc @@ -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); } diff --git a/qcsrc/server/w_fireball.qc b/qcsrc/server/w_fireball.qc index 7bccac949..520a53e4e 100644 --- a/qcsrc/server/w_fireball.qc +++ b/qcsrc/server/w_fireball.qc @@ -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;