]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Replace spider attacks with a slowness effect
authorMario <mario.mario@y7mail.com>
Sat, 12 Oct 2013 22:49:22 +0000 (09:49 +1100)
committerMario <mario.mario@y7mail.com>
Sat, 12 Oct 2013 22:49:22 +0000 (09:49 +1100)
monsters.cfg
qcsrc/common/deathtypes.qh
qcsrc/common/monsters/monster/spider.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/monsters/sv_monsters.qh
qcsrc/common/notifications.qh
qcsrc/server/cl_physics.qc
qcsrc/server/g_damage.qc

index 2aa5f4dd5b6f63ca956681cd744571962284bead..2b9e515245d1765692117e82b2f5b04d880c12a6 100644 (file)
@@ -13,13 +13,12 @@ set g_monster_zombie_speed_walk 150
 // {{{ #2: Spider
 set g_monster_spider_attack_bite_damage 35
 set g_monster_spider_attack_bite_delay 1.2
-set g_monster_spider_attack_type 0
-set g_monster_spider_attack_web_damagetime 2
+set g_monster_spider_attack_web_damagetime 4
 set g_monster_spider_attack_web_delay 1.5
 set g_monster_spider_attack_web_speed 1000
 set g_monster_spider_attack_web_speed_up 150
 set g_monster_spider_health 160
-set g_monster_spider_speed_run 400
+set g_monster_spider_speed_run 450
 set g_monster_spider_speed_stop 100
 set g_monster_spider_speed_walk 150
 // }}}
index 9e1669774254a633e75467cceb9d490df1ed600e..e4404f94e831b4bdae59a39c9b31549658ecbb81 100644 (file)
@@ -20,7 +20,6 @@
        DEATHTYPE(DEATH_MONSTER_SHAMBLER_SMASH, DEATH_SELF_MON_SHAMBLER_SMASH,          DEATH_MURDER_MONSTER,              NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_SHAMBLER_ZAP,   DEATH_SELF_MON_SHAMBLER_ZAP,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_SPIDER,                 DEATH_SELF_MON_SPIDER,                          DEATH_MURDER_MONSTER,              NORMAL_POS) \
-       DEATHTYPE(DEATH_MONSTER_SPIDER_FIRE,    DEATH_SELF_MON_SPIDER_FIRE,                     DEATH_MURDER_MONSTER,              NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_WYVERN,                 DEATH_SELF_MON_WYVERN,                          DEATH_MURDER_MONSTER,              NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_ZOMBIE_JUMP,    DEATH_SELF_MON_ZOMBIE_JUMP,                     DEATH_MURDER_MONSTER,              NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_ZOMBIE_MELEE,   DEATH_SELF_MON_ZOMBIE_MELEE,            DEATH_MURDER_MONSTER,              DEATH_MONSTER_LAST) \
index ab35a63b8ec63fa86e9f140639114a6bc3c435cb..4c52c07dcf6cc0832c2a295b80ac3cfc48e07929 100644 (file)
@@ -17,7 +17,6 @@ REGISTER_MONSTER(
        MON_ADD_CVAR(monster, attack_web_speed) \
        MON_ADD_CVAR(monster, attack_web_speed_up) \
        MON_ADD_CVAR(monster, attack_web_delay) \
-       MON_ADD_CVAR(monster, attack_type) \
        MON_ADD_CVAR(monster, speed_stop) \
        MON_ADD_CVAR(monster, speed_run) \
        MON_ADD_CVAR(monster, speed_walk) 
@@ -32,44 +31,18 @@ const float spider_anim_walk                = 1;
 const float spider_anim_attack         = 2;
 const float spider_anim_attack2                = 3;
 
-.float spider_type; // used to switch between fire & ice attacks
-const float SPIDER_TYPE_ICE            = 0;
-const float SPIDER_TYPE_FIRE   = 1;
+.float spider_web_delay;
 
 void spider_web_explode()
 {
        entity e;
        if(self)
        {
-               float damg = 0, edamg = 0, rad = 1;
-               switch(self.realowner.spider_type)
-               {
-                       case SPIDER_TYPE_ICE:
-                               rad = 25;
-                               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;
-               }
+               pointparticles(particleeffectnum("electro_impact"), self.origin, '0 0 0', 1);
+               RadiusDamage(self, self.realowner, 0, 0, 25, world, 25, self.projectiledeathtype, world);
                
-               RadiusDamage(self, self.realowner, damg, edamg, rad, world, rad, DEATH_MONSTER_SPIDER_FIRE, world); // ice deals no damage anyway
-               
-               for(e = findradius(self.origin, rad); e; e = e.chain) if(e != self) if(e.takedamage && e.deadflag == DEAD_NO) if(e.health > 0)
-               {
-                       switch(self.realowner.spider_type)
-                       {
-                               case SPIDER_TYPE_ICE:
-                                       Freeze(e, 0.3, 2, FALSE);
-                                       break;
-                               case SPIDER_TYPE_FIRE:
-                                       Fire_AddDamage(e, self.realowner, 5 * Monster_SkillModifier(), MON_CVAR(spider, attack_web_damagetime), DEATH_MONSTER_SPIDER_FIRE);
-                                       break;
-                       }
-               }
+               for(e = findradius(self.origin, 25); e; e = e.chain) if(e != self) if(e.takedamage && e.deadflag == DEAD_NO) if(e.health > 0)
+                       e.spider_slowness = time + MON_CVAR(spider, attack_web_damagetime);
                
                remove(self);
        }
@@ -82,25 +55,11 @@ void spider_web_touch()
        spider_web_explode();
 }
 
-void spider_shootweb(float ptype)
+void spider_shootweb()
 {
-       float p = 0;
-       string snd = "";
-       switch(ptype)
-       {
-               case SPIDER_TYPE_ICE:
-                       p = PROJECTILE_ELECTRO;
-                       snd = "weapons/electro_fire2.wav";
-                       break;
-               case SPIDER_TYPE_FIRE:
-                       p = PROJECTILE_FIREMINE;
-                       snd = "weapons/fireball_fire.wav";
-                       break;
-       }
-       
        monster_makevectors(self.enemy);
        
-       sound(self, CH_SHOTS, snd, VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS, "weapons/electro_fire2.wav", VOL_BASE, ATTEN_NORM);
 
        entity proj = spawn ();
        proj.classname = "plasma";
@@ -111,7 +70,7 @@ void spider_shootweb(float ptype)
        proj.bot_dodgerating = 0;
        proj.nextthink = time + 5;
        PROJECTILE_MAKETRIGGER(proj);
-       proj.projectiledeathtype = DEATH_MONSTER_SPIDER_FIRE;
+       proj.projectiledeathtype = DEATH_MONSTER_SPIDER;
        setorigin(proj, CENTER_OR_VIEWOFS(self));
 
        //proj.glow_size = 50;
@@ -131,7 +90,7 @@ void spider_shootweb(float ptype)
        proj.bouncestop = 0.05;
        proj.missile_flags = MIF_SPLASH | MIF_ARC;
 
-       CSQCProjectile(proj, TRUE, p, TRUE);
+       CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, TRUE);
 }
 
 float spider_attack(float attack_type)
@@ -144,14 +103,16 @@ float spider_attack(float attack_type)
                }
                case MONSTER_ATTACK_RANGED:
                {
-                       if(self.enemy.frozen)
-                               return FALSE;
-                       
-                       self.frame = spider_anim_attack2;
-                       self.attack_finished_single = time + MON_CVAR(spider, attack_web_delay);
-                       spider_shootweb(self.spider_type);
+                       if(time >= self.spider_web_delay)
+                       {
+                               self.frame = spider_anim_attack2;
+                               self.attack_finished_single = time + MON_CVAR(spider, attack_web_delay);
+                               spider_shootweb();
+                               self.spider_web_delay = time + 3;
+                               return TRUE;
+                       }
                        
-                       return TRUE;
+                       return FALSE;
                }
        }
        
@@ -188,7 +149,6 @@ float m_spider(float req)
                case MR_SETUP:
                {
                        if not(self.health) self.health = MON_CVAR(spider, health);
-                       if not(self.spider_type) self.spider_type = MON_CVAR(spider, attack_type);
                        
                        self.monster_loot = spawnfunc_item_health_medium;
                        self.monster_attackfunc = spider_attack;
@@ -199,9 +159,7 @@ float m_spider(float req)
                case MR_PRECACHE:
                {
                        precache_model ("models/monsters/spider.dpm");
-                       precache_model ("models/ice/ice.md3");
                        precache_sound ("weapons/electro_fire2.wav");
-                       precache_sound ("weapons/fireball_fire.wav");
                        return TRUE;
                }
                case MR_CONFIG:
index fb24280badc9aeb5ef033918ccbe54f2fc1d8c98..bad048dcc191c729a9d8766cb7b11f2ea6bb05fc 100644 (file)
@@ -104,7 +104,7 @@ float monster_isvalidtarget (entity targ, entity ent)
        if(SAME_TEAM(targ, ent))
                return FALSE; // enemy is on our team
                
-       if (targ.frozen == 1 || (targ.frozen == 2 && ent.monsterid != MON_SPIDER))
+       if (targ.frozen)
                return FALSE; // ignore frozen
 
        if(autocvar_g_monsters_target_infront || ent.spawnflags & MONSTERFLAG_INFRONT)
index 3ac6c87d326a56aba27046151d6e03cabf157be4..5bdb23b5a41e0ea117b11da52428b7b24d7df3d2 100644 (file)
@@ -11,6 +11,8 @@ float monsters_killed;
 void monsters_setstatus(); // monsters.qc
 .float monster_moveflags; // checks where to move when not attacking
 
+.float spider_slowness; // special spider timer
+
 void monster_remove(entity mon); // removes a monster
 
 .float(float attack_type) monster_attackfunc;
index 7bf58ac95ef7a0c926f98f68155dfe762bc596c3..26c711f37c95f7cd105d89c4101101bfe5554e2c 100644 (file)
@@ -393,7 +393,6 @@ void Send_Notification_WOCOVA(
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_SMASH,  2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was smashed by a Shambler%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_ZAP,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was zapped to death by a Shambler%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SPIDER,              2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was bitten by a Spider%s%s"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SPIDER_FIRE,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was incinerated by a Spider%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_WYVERN,          2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was fireballed by a Wyvern%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_JUMP,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 joins the Zombies%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_MELEE,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was given kung fu lessons by a Zombie%s%s"), "") \
@@ -731,7 +730,6 @@ void Send_Notification_WOCOVA(
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SHAMBLER_SMASH,                NO_MSG,        INFO_DEATH_SELF_MON_SHAMBLER_SMASH,                CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SHAMBLER_ZAP,                  NO_MSG,        INFO_DEATH_SELF_MON_SHAMBLER_ZAP,                  CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER,                                NO_MSG,        INFO_DEATH_SELF_MON_SPIDER,                                CENTER_DEATH_SELF_MONSTER) \
-       MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER_FIRE,                   NO_MSG,        INFO_DEATH_SELF_MON_SPIDER_FIRE,                   CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_WYVERN,                                NO_MSG,        INFO_DEATH_SELF_MON_WYVERN,                                CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_JUMP,                   NO_MSG,        INFO_DEATH_SELF_MON_ZOMBIE_JUMP,                   CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_MELEE,                  NO_MSG,        INFO_DEATH_SELF_MON_ZOMBIE_MELEE,                  CENTER_DEATH_SELF_MONSTER) \
index ea193f148ac71e33018b618876b8390913f7dd91..8a29d14b4a9d0dadc14fa91d55f3d3e119335769 100644 (file)
@@ -788,6 +788,12 @@ void SV_PlayerPhysics()
        if(time < self.ladder_time)
                self.disableclientprediction = 1;
                
+       if(time < self.spider_slowness)
+       {
+               self.stat_sv_maxspeed *= 0.5; // half speed while slow from spider
+               self.stat_sv_airspeedlimit_nonqw *= 0.5;
+       }
+               
        if(self.frozen)
        {
                if(autocvar_sv_dodging_frozen && IS_REAL_CLIENT(self))
index f3516c274145ac3c495fb073f8639d88cf3cf1d4..02450ead176e04277603a61185548a7dc352041d 100644 (file)
@@ -749,7 +749,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        mirrorforce *= g_weaponforcefactor;
                }
                
-               if(((targ.frozen == 2 && attacker.monsterid != MON_SPIDER) || (targ.frozen == 1)) && deathtype != DEATH_HURTTRIGGER)
+               if(targ.frozen && deathtype != DEATH_HURTTRIGGER)
                {
                        damage = 0;
                        force *= 0.2;