X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmonsters%2Fsv_monsters.qc;h=a89e55b1ce0b6644ddde27b59bacb7b30dbefa03;hb=646e82672a7a8b8db0be0caf5dbd062b0d04da96;hp=ea46be5f12e7343152b8920cc2f7089d9f6253bf;hpb=3e21073f2bd7f282947bc1f214b3ec25d69ccae0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index ea46be5f1..a89e55b1c 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -1,29 +1,27 @@ -#if defined(CSQC) -#elif defined(MENUQC) -#elif defined(SVQC) - #include - #include "../constants.qh" - #include "../teams.qh" - #include "../util.qh" - #include "all.qh" - #include "sv_monsters.qh" - #include "../physics/movelib.qh" - #include "../weapons/all.qh" - #include - #include - #include "../deathtypes/all.qh" - #include - #include - #include "../turrets/sv_turrets.qh" - #include "../turrets/util.qh" - #include "../vehicles/all.qh" - #include - #include - #include - #include "../triggers/triggers.qh" - #include - #include -#endif +#include "sv_monsters.qh" + +#include +#include +#include "../constants.qh" +#include "../teams.qh" +#include "../util.qh" +#include "all.qh" +#include "../physics/movelib.qh" +#include "../weapons/_mod.qh" +#include +#include +#include "../deathtypes/all.qh" +#include +#include +#include "../turrets/sv_turrets.qh" +#include "../turrets/util.qh" +#include "../vehicles/all.qh" +#include +#include +#include "../triggers/triggers.qh" +#include +#include +#include void monsters_setstatus(entity this) { @@ -94,16 +92,17 @@ bool Monster_ValidTarget(entity this, entity targ) || (SAME_TEAM(targ, this)) || (STAT(FROZEN, targ)) || (targ.alpha != 0 && targ.alpha < 0.5) + || (MUTATOR_CALLHOOK(MonsterValidTarget, this, targ)) ) { // if any of the above checks fail, target is not valid return false; } - traceline(this.origin + this.view_ofs, targ.origin, 0, this); + traceline(this.origin + this.view_ofs, targ.origin, MOVE_NOMONSTERS, this); - if((trace_fraction < 1) && (trace_ent != targ)) - return false; + if(trace_fraction < 1) + return false; // solid if(autocvar_g_monsters_target_infront || (this.spawnflags & MONSTERFLAG_INFRONT)) if(this.enemy != targ) @@ -413,16 +412,18 @@ bool Monster_Attack_Leap(entity this, vector anm, void(entity this, entity touch return true; } -void Monster_Attack_Check(entity this, entity targ) +void Monster_Attack_Check(entity this, entity targ, .entity weaponentity) { + int slot = weaponslot(weaponentity); + if((this == NULL || targ == NULL) || (!this.monster_attackfunc) - || (time < this.attack_finished_single[0]) + || (time < this.attack_finished_single[slot]) ) { return; } if(vdist(targ.origin - this.origin, <=, this.attack_range)) { - bool attack_success = this.monster_attackfunc(MONSTER_ATTACK_MELEE, this, targ); + bool attack_success = this.monster_attackfunc(MONSTER_ATTACK_MELEE, this, targ, weaponentity); if(attack_success == 1) Monster_Sound(this, monstersound_melee, 0, false, CH_VOICE); else if(attack_success > 0) @@ -431,7 +432,7 @@ void Monster_Attack_Check(entity this, entity targ) if(vdist(targ.origin - this.origin, >, this.attack_range)) { - float attack_success = this.monster_attackfunc(MONSTER_ATTACK_RANGED, this, targ); + float attack_success = this.monster_attackfunc(MONSTER_ATTACK_RANGED, this, targ, weaponentity); if(attack_success == 1) Monster_Sound(this, monstersound_melee, 0, false, CH_VOICE); else if(attack_success > 0) @@ -506,7 +507,9 @@ bool Monster_Respawn_Check(entity this) return true; } -void Monster_Respawn(entity this) { Monster_Spawn(this, this.monsterid); } +void Monster_Respawn(entity this) { Monster_Spawn(this, true, this.monsterid); } + +.vector pos1, pos2; void Monster_Dead_Fade(entity this) { @@ -543,6 +546,7 @@ void Monster_Use(entity this, entity actor, entity trigger) if(Monster_ValidTarget(this, actor)) { this.enemy = actor; } } +.float pass_distance; vector Monster_Move_Target(entity this, entity targ) { // enemy is always preferred target @@ -686,12 +690,14 @@ void Monster_CalculateVelocity(entity this, vector to, vector from, float turnra } .entity draggedby; +.entity target2; void Monster_Move(entity this, float runspeed, float walkspeed, float stpspeed) { - if(this.target2) { this.goalentity = find(NULL, targetname, this.target2); } + // update goal entity if lost + if(this.target2 && this.goalentity.targetname != this.target2) { this.goalentity = find(NULL, targetname, this.target2); } - entity targ; + entity targ = this.goalentity; if(STAT(FROZEN, this) == 2) { @@ -777,8 +783,6 @@ void Monster_Move(entity this, float runspeed, float walkspeed, float stpspeed) } } - targ = this.goalentity; - if (MUTATOR_CALLHOOK(MonsterMove, this, runspeed, walkspeed, targ) || gameover || this.draggedby != NULL @@ -865,10 +869,10 @@ void Monster_Move(entity this, float runspeed, float walkspeed, float stpspeed) } else { - entity e = find(NULL, targetname, this.target2); + entity e = this.goalentity; //find(NULL, targetname, this.target2); if(e.target2) this.target2 = e.target2; - else if(e.target) + else if(e.target) // compatibility this.target2 = e.target; movelib_brake_simple(this, stpspeed); @@ -891,7 +895,8 @@ void Monster_Move(entity this, float runspeed, float walkspeed, float stpspeed) this.angles_y += turny; } - Monster_Attack_Check(this, this.enemy); + .entity weaponentity = weaponentities[0]; // TODO? + Monster_Attack_Check(this, this.enemy, weaponentity); } void Monster_Remove(entity this) @@ -930,8 +935,7 @@ void Monster_Dead_Think(entity this) void Monster_Appear(entity this, entity actor, entity trigger) { this.enemy = actor; - this.spawnflags &= ~MONSTERFLAG_APPEAR; // otherwise, we get an endless loop - Monster_Spawn(this, this.monsterid); + Monster_Spawn(this, false, this.monsterid); } bool Monster_Appear_Check(entity this, int monster_id) @@ -1033,7 +1037,10 @@ void Monster_Dead(entity this, entity attacker, float gibbed) mon.mr_death(mon, this); if(this.candrop && this.weapon) - W_ThrowNewWeapon(this, this.weapon, 0, this.origin, randomvec() * 150 + '0 0 325'); + { + .entity weaponentity = weaponentities[0]; // TODO: unhardcode + W_ThrowNewWeapon(this, this.weapon, 0, this.origin, randomvec() * 150 + '0 0 325', weaponentity); + } } void Monster_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) @@ -1125,23 +1132,19 @@ void Monster_Move_2D(entity this, float mspeed, bool allow_jumpoff) return; } - float reverse = false; - vector a, b; - makevectors(this.angles); - a = this.origin + '0 0 16'; - b = this.origin + '0 0 16' + v_forward * 32; + vector a = CENTER_OR_VIEWOFS(this); + vector b = CENTER_OR_VIEWOFS(this) + v_forward * 32; traceline(a, b, MOVE_NORMAL, this); + bool reverse = false; if(trace_fraction != 1.0) - { reverse = true; - - if(trace_ent) - if(IS_PLAYER(trace_ent) && !(trace_ent.items & IT_STRENGTH)) - reverse = false; - } + if(trace_ent && IS_PLAYER(trace_ent) && !(trace_ent.items & ITEM_Strength.m_itemid)) + reverse = false; + if(trace_ent && IS_MONSTER(trace_ent)) + reverse = true; // TODO: fix this... tracing is broken if the floor is thin /* @@ -1209,7 +1212,7 @@ void Monster_Anim(entity this) void Monster_Think(entity this) { setthink(this, Monster_Think); - this.nextthink = this.ticrate; + this.nextthink = time + this.ticrate; if(this.monster_lifetime) if(time >= this.monster_lifetime) @@ -1288,7 +1291,7 @@ bool Monster_Spawn_Setup(entity this) return true; } -bool Monster_Spawn(entity this, int mon_id) +bool Monster_Spawn(entity this, bool check_appear, int mon_id) { // setup the basic required properties for a monster entity mon = Monsters_from(mon_id); @@ -1299,7 +1302,7 @@ bool Monster_Spawn(entity this, int mon_id) if(!(this.spawnflags & MONSTERFLAG_RESPAWNED)) IL_PUSH(g_monsters, this); - if(Monster_Appear_Check(this, mon_id)) { return true; } // return true so the monster isn't removed + if(check_appear && Monster_Appear_Check(this, mon_id)) { return true; } // return true so the monster isn't removed if(!this.monster_skill) this.monster_skill = cvar("g_monsters_skill"); @@ -1320,9 +1323,13 @@ bool Monster_Spawn(entity this, int mon_id) this.flags = FL_MONSTER; this.classname = "monster"; this.takedamage = DAMAGE_AIM; + if(!this.bot_attack) + IL_PUSH(g_bot_targets, this); this.bot_attack = true; this.iscreature = true; this.teleportable = true; + if(!this.damagedbycontents) + IL_PUSH(g_damagedbycontents, this); this.damagedbycontents = true; this.monsterid = mon_id; this.event_damage = Monster_Damage; @@ -1345,13 +1352,13 @@ bool Monster_Spawn(entity this, int mon_id) this.oldtarget2 = this.target2; this.pass_distance = 0; this.deadflag = DEAD_NO; - this.noalign = ((mon.spawnflags & MONSTER_TYPE_FLY) || (mon.spawnflags & MONSTER_TYPE_SWIM)); this.spawn_time = time; this.gravity = 1; this.monster_moveto = '0 0 0'; this.monster_face = '0 0 0'; this.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_BOTCLIP | DPCONTENTS_MONSTERCLIP; + if(!this.noalign) { this.noalign = ((mon.spawnflags & MONSTER_TYPE_FLY) || (mon.spawnflags & MONSTER_TYPE_SWIM)); } if(!this.scale) { this.scale = 1; } if(autocvar_g_monsters_edit) { this.grab = 1; } if(autocvar_g_fullbrightplayers) { this.effects |= EF_FULLBRIGHT; }