X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmonsters%2Fsv_monsters.qc;h=7ee3e3eab72d84228fe2360e7d46a8137ede8fe1;hb=eb9cac8594043ba8a31c25464a388cc1a94d816f;hp=d4e1691f0ce1a1dd5ba73880bb9c709f7bedb7cf;hpb=a240e0309a8ec5837f3ac3d37c168f5262e53d5b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index d4e1691f0..7ee3e3eab 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -1,9 +1,7 @@ #if defined(CSQC) #elif defined(MENUQC) #elif defined(SVQC) - #include "../../dpdefs/progsdefs.qh" - #include "../../dpdefs/dpextensions.qh" - #include "../../warpzonelib/common.qh" + #include "../../lib/warpzone/common.qh" #include "../constants.qh" #include "../teams.qh" #include "../util.qh" @@ -12,8 +10,8 @@ #include "../weapons/all.qh" #include "../../server/autocvars.qh" #include "../../server/defs.qh" - #include "../deathtypes.qh" - #include "../../server/mutators/mutators_include.qh" + #include "../deathtypes/all.qh" + #include "../../server/mutators/all.qh" #include "../../server/steerlib.qh" #include "../turrets/sv_turrets.qh" #include "../turrets/util.qh" @@ -22,7 +20,7 @@ #include "../../server/command/common.qh" #include "../../server/command/cmd.qh" #include "../triggers/triggers.qh" - #include "../../csqcmodellib/sv_model.qh" + #include "../../lib/csqcmodel/sv_model.qh" #include "../../server/round_handler.qh" #endif @@ -38,7 +36,8 @@ void monster_dropitem() return; vector org = self.origin + ((self.mins + self.maxs) * 0.5); - entity e = spawn(); + entity e = new(droppedweapon); // use weapon handling to remove it on touch + e.spawnfunc_checked = true; e.monster_loot = self.monster_loot; @@ -49,14 +48,13 @@ void monster_dropitem() { setself(e); e.noalign = true; - e.monster_loot(); + e.monster_loot(e); e.gravity = 1; e.movetype = MOVETYPE_TOSS; e.reset = SUB_Remove; setorigin(e, org); e.velocity = randomvec() * 175 + '0 0 325'; e.item_spawnshieldtime = time + 0.7; - e.classname = "droppedweapon"; // use weapon handling to remove it on touch SUB_SetFade(e, time + autocvar_g_monsters_drop_time, 1); setself(this); } @@ -118,7 +116,7 @@ bool Monster_ValidTarget(entity mon, entity player) makevectors (mon.angles); dot = normalize (player.origin - mon.origin) * v_forward; - if(dot <= 0.3) { return false; } + if(dot <= autocvar_g_monsters_target_infront_range) { return false; } } return true; // this target is valid! @@ -181,11 +179,11 @@ void monster_setupcolors(entity mon) void monster_changeteam(entity ent, float newteam) { if(!teamplay) { return; } - + ent.team = newteam; ent.monster_attack = true; // new team, activate attacking monster_setupcolors(ent); - + if(ent.sprite) { WaypointSprite_UpdateTeamRadar(ent.sprite, RADARICON_DANGER, ((newteam) ? Team_ColorRGB(newteam) : '1 0 0')); @@ -209,7 +207,7 @@ void Monster_Delay_Action() } else { - oldself.think = SUB_Remove; + oldself.think = SUB_Remove_self; oldself.nextthink = time; } } @@ -267,7 +265,7 @@ void Monster_Sound_Precache(string f) void Monster_Sounds_Precache() {SELFPARAM(); - string m = (get_monsterinfo(self.monsterid)).model; + string m = (get_monsterinfo(self.monsterid)).m_model.model_str(); float globhandle, n, i; string f; @@ -348,7 +346,7 @@ void Monster_Sound(.string samplefield, float sound_delay, float delaytoo, float if(delaytoo) if(time < self.msound_delay) return; // too early - GlobalSound(self.(samplefield), chan, VOICETYPE_PLAYERSOUND); + GlobalSound_string(self.(samplefield), chan, VOICETYPE_PLAYERSOUND); self.msound_delay = time + sound_delay; } @@ -365,9 +363,9 @@ float Monster_Attack_Melee(entity targ, float damg, vector anim, float er, float setanim(self, anim, false, true, false); if(self.animstate_endtime > time && (self.flags & FL_MONSTER)) - self.attack_finished_single = self.anim_finished = self.animstate_endtime; + self.attack_finished_single[0] = self.anim_finished = self.animstate_endtime; else - self.attack_finished_single = self.anim_finished = time + animtime; + self.attack_finished_single[0] = self.anim_finished = time + animtime; monster_makevectors(targ); @@ -387,7 +385,7 @@ float Monster_Attack_Leap_Check(vector vel) return false; // not on the ground if(self.health <= 0) return false; // called when dead? - if(time < self.attack_finished_single) + if(time < self.attack_finished_single[0]) return false; // still attacking vector old = self.velocity; @@ -409,9 +407,9 @@ bool Monster_Attack_Leap(vector anm, void() touchfunc, vector vel, float animtim setanim(self, anm, false, true, false); if(self.animstate_endtime > time && (self.flags & FL_MONSTER)) - self.attack_finished_single = self.anim_finished = self.animstate_endtime; + self.attack_finished_single[0] = self.anim_finished = self.animstate_endtime; else - self.attack_finished_single = self.anim_finished = time + animtime; + self.attack_finished_single[0] = self.anim_finished = time + animtime; if(self.flags & FL_MONSTER) self.state = MONSTER_ATTACK_RANGED; @@ -427,14 +425,14 @@ void Monster_Attack_Check(entity e, entity targ) { if((e == world || targ == world) || (!e.monster_attackfunc) - || (time < e.attack_finished_single) + || (time < e.attack_finished_single[0]) ) { return; } float targ_vlen = vlen(targ.origin - e.origin); if(targ_vlen <= e.attack_range) { - float attack_success = e.monster_attackfunc(MONSTER_ATTACK_MELEE); + float attack_success = e.monster_attackfunc(MONSTER_ATTACK_MELEE, targ); if(attack_success == 1) Monster_Sound(monstersound_melee, 0, false, CH_VOICE); else if(attack_success > 0) @@ -443,7 +441,7 @@ void Monster_Attack_Check(entity e, entity targ) if(targ_vlen > e.attack_range) { - float attack_success = e.monster_attackfunc(MONSTER_ATTACK_RANGED); + float attack_success = e.monster_attackfunc(MONSTER_ATTACK_RANGED, targ); if(attack_success == 1) Monster_Sound(monstersound_melee, 0, false, CH_VOICE); else if(attack_success > 0) @@ -471,7 +469,8 @@ void Monster_UpdateModel() self.anim_die2 = animfixfps(self, '9 1 0.01', '0 0 0');*/ // then get the real values - MON_ACTION(self.monsterid, MR_ANIM); + Monster mon = get_monsterinfo(self.monsterid); + mon.mr_anim(mon); } void Monster_Touch() @@ -538,7 +537,7 @@ void Monster_Dead_Fade() setorigin(self, self.pos1); self.angles = self.pos2; self.health = self.max_health; - setmodel(self, "null"); + setmodel(self, MDL_Null); } else { @@ -571,7 +570,6 @@ vector Monster_Move_Target(entity targ) || (self.enemy.takedamage == DAMAGE_NO) || (vlen(self.origin - targ_origin) > self.target_range) || ((trace_fraction < 1) && (trace_ent != self.enemy))) - //|| (time > self.ctf_droptime + autocvar_g_ctf_pass_timelimit)) // TODO: chase timelimit? { self.enemy = world; self.pass_distance = 0; @@ -742,7 +740,7 @@ void Monster_Move(float runspeed, float walkspeed, float stpspeed) Unfreeze(self); self.health = 0; if(self.event_damage) - self.event_damage(self, self.frozen_by, 1, DEATH_NADE_ICE_FREEZE, self.origin, '0 0 0'); + self.event_damage(self, self.frozen_by, 1, DEATH_NADE_ICE_FREEZE.m_id, self.origin, '0 0 0'); } else if ( self.revive_progress <= 0 ) @@ -759,7 +757,7 @@ void Monster_Move(float runspeed, float walkspeed, float stpspeed) { self.last_trace = time + 0.4; - Damage (self, world, world, 2, DEATH_DROWN, self.origin, '0 0 0'); + Damage (self, world, world, 2, DEATH_DROWN.m_id, self.origin, '0 0 0'); self.angles = '90 90 0'; if(random() < 0.5) { @@ -831,7 +829,7 @@ void Monster_Move(float runspeed, float walkspeed, float stpspeed) self.moveto = WarpZone_RefSys_TransformOrigin(self.enemy, self, (0.5 * (self.enemy.absmin + self.enemy.absmax))); self.monster_moveto = '0 0 0'; self.monster_face = '0 0 0'; - + self.pass_distance = vlen((('1 0 0' * self.enemy.origin_x) + ('0 1 0' * self.enemy.origin_y)) - (('1 0 0' * self.origin_x) + ('0 1 0' * self.origin_y))); Monster_Sound(monstersound_sight, 0, false, CH_VOICE); } @@ -846,7 +844,7 @@ void Monster_Move(float runspeed, float walkspeed, float stpspeed) self.touch = Monster_Touch; } - if(self.state && time >= self.attack_finished_single) + if(self.state && time >= self.attack_finished_single[0]) self.state = 0; // attack is over if(self.state != MONSTER_ATTACK_MELEE) // don't move if set @@ -912,12 +910,13 @@ void Monster_Move(float runspeed, float walkspeed, float stpspeed) void Monster_Remove(entity mon) { + .entity weaponentity = weaponentities[0]; if(!mon) { return; } if(!MUTATOR_CALLHOOK(MonsterRemove, mon)) Send_Effect(EFFECT_ITEM_PICKUP, mon.origin, '0 0 0', 1); - if(mon.weaponentity) { remove(mon.weaponentity); } + if(mon.(weaponentity)) { remove(mon.(weaponentity)); } if(mon.iceblock) { remove(mon.iceblock); } WaypointSprite_Kill(mon.sprite); remove(mon); @@ -956,19 +955,19 @@ float Monster_Appear_Check(entity ent, float monster_id) return true; } -void Monster_Reset() -{SELFPARAM(); - setorigin(self, self.pos1); - self.angles = self.pos2; +void Monster_Reset(entity this) +{ + setorigin(this, this.pos1); + this.angles = this.pos2; - Unfreeze(self); // remove any icy remains + Unfreeze(this); // remove any icy remains - self.health = self.max_health; - self.velocity = '0 0 0'; - self.enemy = world; - self.goalentity = world; - self.attack_finished_single = 0; - self.moveto = self.origin; + this.health = this.max_health; + this.velocity = '0 0 0'; + this.enemy = world; + this.goalentity = world; + this.attack_finished_single[0] = 0; + this.moveto = this.origin; } void Monster_Dead_Damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) @@ -984,7 +983,7 @@ void Monster_Dead_Damage(entity inflictor, entity attacker, float damage, int de // number of monsters spawned with mobspawn command totalspawned -= 1; - self.think = SUB_Remove; + self.think = SUB_Remove_self; self.nextthink = time + 0.1; self.event_damage = func_null; } @@ -1029,15 +1028,16 @@ void Monster_Dead(entity attacker, float gibbed) self.touch = Monster_Touch; // reset incase monster was pouncing self.reset = func_null; self.state = 0; - self.attack_finished_single = 0; + self.attack_finished_single[0] = 0; self.effects = 0; if(!((self.flags & FL_FLY) || (self.flags & FL_SWIM))) self.velocity = '0 0 0'; - CSQCModel_UnlinkEntity(); + CSQCModel_UnlinkEntity(self); - MON_ACTION(self.monsterid, MR_DEATH); + Monster mon = get_monsterinfo(self.monsterid); + mon.mr_death(mon); if(self.candrop && self.weapon) W_ThrowNewWeapon(self, self.weapon, 0, self.origin, randomvec() * 150 + '0 0 325'); @@ -1045,19 +1045,19 @@ void Monster_Dead(entity attacker, float gibbed) void Monster_Damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) {SELFPARAM(); - if((self.spawnflags & MONSTERFLAG_INVINCIBLE) && deathtype != DEATH_KILL) + if((self.spawnflags & MONSTERFLAG_INVINCIBLE) && deathtype != DEATH_KILL.m_id && !ITEM_DAMAGE_NEEDKILL(deathtype)) return; - if(self.frozen && deathtype != DEATH_KILL && deathtype != DEATH_NADE_ICE_FREEZE) + if(self.frozen && deathtype != DEATH_KILL.m_id && deathtype != DEATH_NADE_ICE_FREEZE.m_id) return; - //if(time < self.pain_finished && deathtype != DEATH_KILL) + //if(time < self.pain_finished && deathtype != DEATH_KILL.m_id) //return; - if(time < self.spawnshieldtime && deathtype != DEATH_KILL) + if(time < self.spawnshieldtime && deathtype != DEATH_KILL.m_id) return; - if(deathtype == DEATH_FALL && self.draggedby != world) + if(deathtype == DEATH_FALL.m_id && self.draggedby != world) return; vector v; @@ -1070,7 +1070,8 @@ void Monster_Damage(entity inflictor, entity attacker, float damage, int deathty damage_take = take; frag_attacker = attacker; frag_deathtype = deathtype; - MON_ACTION(self.monsterid, MR_PAIN); + Monster mon = get_monsterinfo(self.monsterid); + mon.mr_pain(mon); take = damage_take; if(take) @@ -1084,12 +1085,12 @@ void Monster_Damage(entity inflictor, entity attacker, float damage, int deathty self.dmg_time = time; - if(sound_allowed(MSG_BROADCAST, attacker) && deathtype != DEATH_DROWN) - spamsound (self, CH_PAIN, "misc/bodyimpact1.wav", VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER + if(sound_allowed(MSG_BROADCAST, attacker) && deathtype != DEATH_DROWN.m_id) + spamsound (self, CH_PAIN, SND(BODYIMPACT1), VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER self.velocity += force * self.damageforcescale; - if(deathtype != DEATH_DROWN && take) + if(deathtype != DEATH_DROWN.m_id && take) { Violence_GibSplash_At(hitloc, force, 2, bound(0, take, 200) / 16, self, attacker); if (take > 50) @@ -1100,7 +1101,7 @@ void Monster_Damage(entity inflictor, entity attacker, float damage, int deathty if(self.health <= 0) { - if(deathtype == DEATH_KILL) + if(deathtype == DEATH_KILL.m_id) self.candrop = false; // killed by mobkill command // TODO: fix this? @@ -1109,18 +1110,18 @@ void Monster_Damage(entity inflictor, entity attacker, float damage, int deathty SUB_UseTargets(); self.target2 = self.oldtarget2; // reset to original target on death, incase we respawn - Monster_Dead(attacker, (self.health <= -100 || deathtype == DEATH_KILL)); + Monster_Dead(attacker, (self.health <= -100 || deathtype == DEATH_KILL.m_id)); WaypointSprite_Kill(self.sprite); frag_target = self; MUTATOR_CALLHOOK(MonsterDies, attacker); - if(self.health <= -100 || deathtype == DEATH_KILL) // check if we're already gibbed + if(self.health <= -100 || deathtype == DEATH_KILL.m_id) // check if we're already gibbed { Violence_GibSplash(self, 1, 0.5, attacker); - self.think = SUB_Remove; + self.think = SUB_Remove_self; self.nextthink = time + 0.1; } } @@ -1140,22 +1141,22 @@ void Monster_Move_2D(float mspeed, float allow_jumpoff) float reverse = FALSE; vector a, b; - + makevectors(self.angles); a = self.origin + '0 0 16'; b = self.origin + '0 0 16' + v_forward * 32; - + traceline(a, b, MOVE_NORMAL, self); - + if(trace_fraction != 1.0) { reverse = TRUE; - + if(trace_ent) if(IS_PLAYER(trace_ent) && !(trace_ent.items & IT_STRENGTH)) reverse = FALSE; } - + // TODO: fix this... tracing is broken if the floor is thin /* if(!allow_jumpoff) @@ -1165,17 +1166,17 @@ void Monster_Move_2D(float mspeed, float allow_jumpoff) if(trace_fraction == 1.0) reverse = TRUE; } */ - + if(reverse) { self.angles_y = anglemods(self.angles_y - 180); makevectors(self.angles); } - + movelib_move_simple_gravity(v_forward, mspeed, 1); if(time > self.pain_finished) - if(time > self.attack_finished_single) + if(time > self.attack_finished_single[0]) if(vlen(self.velocity) > 10) setanim(self, self.anim_walk, true, false, false); else @@ -1227,11 +1228,12 @@ void Monster_Think() if(self.monster_lifetime) if(time >= self.monster_lifetime) { - Damage(self, self, self, self.health + self.max_health, DEATH_KILL, self.origin, self.origin); + Damage(self, self, self, self.health + self.max_health, DEATH_KILL.m_id, self.origin, self.origin); return; } - if(MON_ACTION(self.monsterid, MR_THINK)) + Monster mon = get_monsterinfo(self.monsterid); + if(mon.mr_think(mon)) Monster_Move(self.speed2, self.speed, self.stopspeed); Monster_Anim(); @@ -1241,7 +1243,8 @@ void Monster_Think() float Monster_Spawn_Setup() {SELFPARAM(); - MON_ACTION(self.monsterid, MR_SETUP); + Monster mon = get_monsterinfo(self.monsterid); + mon.mr_setup(mon); // ensure some basic needs are met if(!self.health) { self.health = 100; } @@ -1307,7 +1310,6 @@ bool Monster_Spawn(int mon_id) if(!autocvar_g_monsters) { Monster_Remove(self); return false; } - self.mdl = mon.model; if(Monster_Appear_Check(self, mon_id)) { return true; } // return true so the monster isn't removed if(!self.monster_skill) @@ -1325,7 +1327,7 @@ bool Monster_Spawn(int mon_id) if(!(self.spawnflags & MONSTERFLAG_RESPAWNED)) // don't count re-spawning monsters either monsters_total += 1; - setmodel(self, self.mdl); + setmodel(self, mon.m_model); self.flags = FL_MONSTER; self.classname = "monster"; self.takedamage = DAMAGE_AIM; @@ -1361,7 +1363,7 @@ bool Monster_Spawn(int mon_id) self.monster_moveto = '0 0 0'; self.monster_face = '0 0 0'; self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_BOTCLIP | DPCONTENTS_MONSTERCLIP; - + if(!self.scale) { self.scale = 1; } if(autocvar_g_monsters_edit) { self.grab = 1; } if(autocvar_g_fullbrightplayers) { self.effects |= EF_FULLBRIGHT; } @@ -1374,9 +1376,15 @@ bool Monster_Spawn(int mon_id) self.movetype = MOVETYPE_FLY; } - if(mon.spawnflags & MONSTER_SIZE_BROKEN) if(!(self.spawnflags & MONSTERFLAG_RESPAWNED)) - self.scale *= 1.3; + { + if(mon.spawnflags & MONSTER_SIZE_BROKEN) + self.scale *= 1.3; + + if(mon.spawnflags & MONSTER_SIZE_QUAKE) + if(autocvar_g_monsters_quake_resize) + self.scale *= 1.3; + } setsize(self, mon.mins * self.scale, mon.maxs * self.scale);