2 const vector SPIDER_MIN = '-18 -18 -25';
3 const vector SPIDER_MAX = '18 18 30';
6 string SPIDER_MODEL = "models/monsters/spider.dpm";
10 float autocvar_g_monster_spider;
11 float autocvar_g_monster_spider_stopspeed;
12 float autocvar_g_monster_spider_attack_leap_delay;
13 float autocvar_g_monster_spider_attack_stand_damage;
14 float autocvar_g_monster_spider_attack_stand_delay;
15 float autocvar_g_monster_spider_attack_fire_time;
16 float autocvar_g_monster_spider_health;
17 float autocvar_g_monster_spider_speed_walk;
18 float autocvar_g_monster_spider_speed_run;
19 float autocvar_g_monster_spider_attack_type;
22 const float spider_anim_idle = 0;
23 const float spider_anim_walk = 1;
24 const float spider_anim_attack = 2;
25 const float spider_anim_attack2 = 3;
27 .float spider_type; // used to switch between fire & ice attacks
28 const float SPIDER_TYPE_ICE = 0;
29 const float SPIDER_TYPE_FIRE = 1;
31 float spider_attack_standing()
33 monster_melee(self.enemy, autocvar_g_monster_spider_attack_stand_damage, 0.3, DEATH_MONSTER_SPIDER, TRUE);
35 monsters_setframe((random() > 0.5) ? spider_anim_attack : spider_anim_attack2);
37 self.attack_finished_single = time + autocvar_g_monster_spider_attack_stand_delay;
42 void spider_web_explode ()
44 float damg = 0, edamg = 0, rad = 1;
45 switch(self.realowner.spider_type)
49 case SPIDER_TYPE_FIRE:
56 RadiusDamage (self, self.realowner, damg, edamg, rad, world, 0, self.projectiledeathtype, other);
61 void spider_web_touch ()
65 if(other.takedamage == DAMAGE_AIM)
67 switch(self.realowner.spider_type)
70 Freeze(other, 0.3, 2);
72 case SPIDER_TYPE_FIRE:
73 Fire_AddDamage(other, self.realowner, 5 * monster_skill, autocvar_g_monster_spider_attack_fire_time, DEATH_MONSTER_SPIDER_FIRE);
80 void spider_shootweb(float ptype)
87 p = PROJECTILE_ELECTRO;
89 snd = "weapons/electro_fire2.wav";
91 case SPIDER_TYPE_FIRE:
92 p = PROJECTILE_FIREMINE;
94 snd = "weapons/fireball_fire.wav";
98 vector fmins = '-4 -4 -4', fmaxs = '4 4 4';
100 W_SetupShot_ProjectileSize(self, fmins, fmaxs, FALSE, 2, snd, CH_WEAPON_A, 0);
102 w_shotdir = v_forward; // no TrueAim for grenades please
104 entity proj = spawn ();
105 proj.classname = "plasma";
106 proj.owner = proj.realowner = self;
107 proj.use = spider_web_touch;
108 proj.think = adaptor_think2use_hittype_splash;
109 proj.bot_dodge = TRUE;
110 proj.bot_dodgerating = 0;
111 proj.nextthink = time + 5;
112 PROJECTILE_MAKETRIGGER(proj);
113 proj.projectiledeathtype = dt | HITTYPE_SECONDARY;
114 setorigin(proj, w_shotorg);
116 //proj.glow_size = 50;
117 //proj.glow_color = 45;
118 proj.movetype = MOVETYPE_BOUNCE;
119 W_SETUPPROJECTILEVELOCITY_UP(proj, g_monster_spider_attack_web);
120 proj.touch = spider_web_touch;
121 setsize(proj, fmins, fmaxs);
122 proj.takedamage = DAMAGE_NO;
123 proj.damageforcescale = 0;
125 proj.event_damage = func_null;
126 proj.flags = FL_PROJECTILE;
127 proj.damagedbycontents = TRUE;
129 proj.bouncefactor = 0.3;
130 proj.bouncestop = 0.05;
131 proj.missile_flags = MIF_SPLASH | MIF_ARC;
133 CSQCProjectile(proj, TRUE, p, FALSE); // no culling, it has sound
136 void spider_attack_leap()
138 vector angles_face = vectoangles(self.enemy.origin - self.origin);
141 monsters_setframe(spider_anim_attack2);
142 self.angles_y = angles_face_y ;
143 self.attack_finished_single = time + autocvar_g_monster_spider_attack_leap_delay;
145 monster_makevectors(self.enemy);
147 spider_shootweb(self.spider_type);
150 float spider_attack_ranged()
152 if(self.enemy.frozen)
155 spider_attack_leap();
161 self.think = spider_think;
162 self.nextthink = time + self.ticrate;
164 monster_move(autocvar_g_monster_spider_speed_run, autocvar_g_monster_spider_speed_walk, autocvar_g_monster_spider_stopspeed, spider_anim_walk, spider_anim_walk, spider_anim_idle);
169 Monster_CheckDropCvars ("spider");
171 self.think = monster_dead_think;
172 self.nextthink = time + self.ticrate;
173 self.ltime = time + 5;
174 monsters_setframe(spider_anim_attack);
175 self.angles += '180 0 0';
177 monster_hook_death(); // for post-death mods
183 self.health = autocvar_g_monster_spider_health;
185 self.classname = "monster_spider";
186 self.nextthink = time + random() * 0.5 + 0.1;
187 self.checkattack = GenericCheckAttack;
188 self.attack_melee = spider_attack_standing;
189 self.attack_ranged = spider_attack_ranged;
190 self.think = spider_think;
192 monsters_setframe(spider_anim_idle);
194 monster_setupsounds("spider");
196 if not(self.spider_type)
197 self.spider_type = autocvar_g_monster_spider_attack_type;
199 monster_hook_spawn(); // for post-spawn mods
202 void spawnfunc_monster_spider()
204 if not(autocvar_g_monster_spider) { remove(self); return; }
206 self.monster_spawnfunc = spawnfunc_monster_spider;
208 if(Monster_CheckAppearFlags(self))
211 if not (monster_initialize(
212 "Spider", MONSTER_SPIDER,
213 SPIDER_MIN, SPIDER_MAX,
215 spider_die, spider_spawn))