X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmonsters%2Fmonster%2Fzombie.qc;h=780cf74b381dadb7fc5db70ee4f45bef5fa63e11;hb=5c99ce6fe3050cddf897e9988ff59dd0a7c1ba0a;hp=0f20daceda3d1027265ea0183b4e2718405acec3;hpb=34095b88e7a8d82f83aca8ce1009f9622026d159;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/monsters/monster/zombie.qc b/qcsrc/common/monsters/monster/zombie.qc index 0f20daced..780cf74b3 100644 --- a/qcsrc/common/monsters/monster/zombie.qc +++ b/qcsrc/common/monsters/monster/zombie.qc @@ -1,21 +1,23 @@ #ifndef MENUQC -bool m_zombie(int); +bool M_Zombie(int); #endif REGISTER_MONSTER_SIMPLE( /* MON_##id */ ZOMBIE, -/* spawnflags */ MON_FLAG_MELEE, +/* spawnflags */ MON_FLAG_MELEE | MON_FLAG_RIDE, /* mins,maxs */ '-18 -18 -25', '18 18 47', /* model */ "zombie.dpm", /* netname */ "zombie", /* fullname */ _("Zombie") ) { #ifndef MENUQC - this.monster_func = m_zombie; + this.monster_func = M_Zombie; + this.monster_func(MR_PRECACHE); #endif } #ifdef SVQC float autocvar_g_monster_zombie_health; +float autocvar_g_monster_zombie_damageforcescale = 0.55; float autocvar_g_monster_zombie_attack_melee_damage; float autocvar_g_monster_zombie_attack_melee_delay; float autocvar_g_monster_zombie_attack_leap_damage; @@ -26,6 +28,7 @@ float autocvar_g_monster_zombie_speed_stop; float autocvar_g_monster_zombie_speed_run; float autocvar_g_monster_zombie_speed_walk; +/* const float zombie_anim_attackleap = 0; const float zombie_anim_attackrun1 = 1; const float zombie_anim_attackrun2 = 2; @@ -57,8 +60,9 @@ const float zombie_anim_runforward = 27; const float zombie_anim_runforwardleft = 28; const float zombie_anim_runforwardright = 29; const float zombie_anim_spawn = 30; +*/ -void zombie_attack_leap_touch() +void M_Zombie_Attack_Leap_Touch() { if (self.health <= 0) return; @@ -69,93 +73,128 @@ void zombie_attack_leap_touch() { angles_face = vectoangles(self.moveto - self.origin); angles_face = normalize(angles_face) * (autocvar_g_monster_zombie_attack_leap_force); - Damage(other, self, self, (autocvar_g_monster_zombie_attack_leap_damage) * Monster_SkillModifier(), DEATH_MONSTER_ZOMBIE_JUMP, other.origin, angles_face); - self.touch = MonsterTouch; // instantly turn it off to stop damage spam + Damage(other, self, self, (autocvar_g_monster_zombie_attack_leap_damage) * MONSTER_SKILLMOD(self), DEATH_MONSTER_ZOMBIE_JUMP, other.origin, angles_face); + self.touch = Monster_Touch; // instantly turn it off to stop damage spam + self.state = 0; } if (trace_dphitcontents) - self.touch = MonsterTouch; + { + self.state = 0; + self.touch = Monster_Touch; + } } -void zombie_blockend() +void M_Zombie_Defend_Block_End() { if(self.health <= 0) return; - self.frame = zombie_anim_blockend; - self.armorvalue = 0; - self.m_armor_blockpercent = autocvar_g_monsters_armor_blockpercent; + setanim(self, self.anim_blockend, false, true, true); + self.armorvalue = autocvar_g_monsters_armor_blockpercent; } -float zombie_block() +float M_Zombie_Defend_Block() { - self.frame = zombie_anim_blockstart; - self.armorvalue = 100; - self.m_armor_blockpercent = 0.9; - self.state = MONSTER_STATE_ATTACK_MELEE; // freeze monster + self.armorvalue = 0.9; + self.state = MONSTER_ATTACK_MELEE; // freeze monster self.attack_finished_single = time + 2.1; + self.anim_finished = self.attack_finished_single; + setanim(self, self.anim_blockstart, false, true, true); - defer(2, zombie_blockend); + Monster_Delay(1, 0, 2, M_Zombie_Defend_Block_End); return true; } -float zombie_attack(float attack_type) +float M_Zombie_Attack(float attack_type) { switch(attack_type) { case MONSTER_ATTACK_MELEE: { - float rand = random(), chosen_anim; + if(random() < 0.3 && self.health < 75 && self.enemy.health > 10) + return M_Zombie_Defend_Block(); + + float rand = random(); + vector chosen_anim; if(rand < 0.33) - chosen_anim = zombie_anim_attackstanding1; + chosen_anim = self.anim_melee1; else if(rand < 0.66) - chosen_anim = zombie_anim_attackstanding2; + chosen_anim = self.anim_melee2; else - chosen_anim = zombie_anim_attackstanding3; + chosen_anim = self.anim_melee3; - if(random() < 0.3 && self.health < 75 && self.enemy.health > 10) - return zombie_block(); - - return monster_melee(self.enemy, (autocvar_g_monster_zombie_attack_melee_damage), chosen_anim, self.attack_range, (autocvar_g_monster_zombie_attack_melee_delay), DEATH_MONSTER_ZOMBIE_MELEE, true); + return Monster_Attack_Melee(self.enemy, (autocvar_g_monster_zombie_attack_melee_damage), chosen_anim, self.attack_range, (autocvar_g_monster_zombie_attack_melee_delay), DEATH_MONSTER_ZOMBIE_MELEE, true); } case MONSTER_ATTACK_RANGED: { makevectors(self.angles); - return monster_leap(zombie_anim_attackleap, zombie_attack_leap_touch, v_forward * (autocvar_g_monster_zombie_attack_leap_speed) + '0 0 200', (autocvar_g_monster_zombie_attack_leap_delay)); + return Monster_Attack_Leap(self.anim_shoot, M_Zombie_Attack_Leap_Touch, v_forward * (autocvar_g_monster_zombie_attack_leap_speed) + '0 0 200', (autocvar_g_monster_zombie_attack_leap_delay)); } } return false; } -void spawnfunc_monster_zombie() -{ - self.classname = "monster_zombie"; - - if(!monster_initialize(MON_ZOMBIE.monsterid)) { remove(self); return; } -} +void spawnfunc_monster_zombie() { Monster_Spawn(MON_ZOMBIE.monsterid); } +#endif // SVQC -float m_zombie(float req) +bool M_Zombie(int req) { switch(req) { + #ifdef SVQC case MR_THINK: { - monster_move((autocvar_g_monster_zombie_speed_run), (autocvar_g_monster_zombie_speed_walk), (autocvar_g_monster_zombie_speed_stop), zombie_anim_runforward, zombie_anim_runforward, zombie_anim_idle); + if(time >= self.spawn_time) + self.damageforcescale = autocvar_g_monster_zombie_damageforcescale; + return true; + } + case MR_PAIN: + { + self.pain_finished = time + 0.34; + setanim(self, ((random() > 0.5) ? self.anim_pain1 : self.anim_pain2), true, true, false); return true; } case MR_DEATH: { - self.armorvalue = 0; - self.m_armor_blockpercent = autocvar_g_monsters_armor_blockpercent; - self.frame = ((random() > 0.5) ? zombie_anim_deathback1 : zombie_anim_deathfront1); + self.armorvalue = autocvar_g_monsters_armor_blockpercent; + + setanim(self, ((random() > 0.5) ? self.anim_die1 : self.anim_die2), false, true, true); return true; } + #endif + #ifndef MENUQC + case MR_ANIM: + { + vector none = '0 0 0'; + self.anim_die1 = animfixfps(self, '9 1 0.5', none); // 2 seconds + self.anim_die2 = animfixfps(self, '12 1 0.5', none); // 2 seconds + self.anim_spawn = animfixfps(self, '30 1 3', none); + self.anim_walk = animfixfps(self, '27 1 1', none); + self.anim_idle = animfixfps(self, '19 1 1', none); + self.anim_pain1 = animfixfps(self, '20 1 2', none); // 0.5 seconds + self.anim_pain2 = animfixfps(self, '22 1 2', none); // 0.5 seconds + self.anim_melee1 = animfixfps(self, '4 1 5', none); // analyze models and set framerate + self.anim_melee2 = animfixfps(self, '4 1 5', none); // analyze models and set framerate + self.anim_melee3 = animfixfps(self, '4 1 5', none); // analyze models and set framerate + self.anim_shoot = animfixfps(self, '0 1 5', none); // analyze models and set framerate + self.anim_run = animfixfps(self, '27 1 1', none); + self.anim_blockstart = animfixfps(self, '8 1 1', none); + self.anim_blockend = animfixfps(self, '7 1 1', none); + + return true; + } + #endif + #ifdef SVQC case MR_SETUP: { if(!self.health) self.health = (autocvar_g_monster_zombie_health); + if(!self.speed) { self.speed = (autocvar_g_monster_zombie_speed_walk); } + if(!self.speed2) { self.speed2 = (autocvar_g_monster_zombie_speed_run); } + if(!self.stopspeed) { self.stopspeed = (autocvar_g_monster_zombie_speed_stop); } if(self.spawnflags & MONSTERFLAG_NORESPAWN) self.spawnflags &= ~MONSTERFLAG_NORESPAWN; // zombies always respawn @@ -163,11 +202,13 @@ float m_zombie(float req) self.spawnflags |= MONSTER_RESPAWN_DEATHPOINT; self.monster_loot = spawnfunc_item_health_medium; - self.monster_attackfunc = zombie_attack; - self.frame = zombie_anim_spawn; - self.spawn_time = time + 2.1; + self.monster_attackfunc = M_Zombie_Attack; self.spawnshieldtime = self.spawn_time; self.respawntime = 0.2; + self.damageforcescale = 0.0001; // no push while spawning + + setanim(self, self.anim_spawn, false, true, true); + self.spawn_time = self.animstate_endtime; return true; } @@ -176,24 +217,8 @@ float m_zombie(float req) precache_model("models/monsters/zombie.dpm"); return true; } + #endif } return true; } - -#endif // SVQC -#ifdef CSQC -float m_zombie(float req) -{ - switch(req) - { - case MR_PRECACHE: - { - return true; - } - } - - return true; -} - -#endif // CSQC