From 4bc2685adbc217826eee169930c49f0bf2a02f63 Mon Sep 17 00:00:00 2001 From: Mario Date: Mon, 30 Sep 2013 03:23:35 -0700 Subject: [PATCH] Use the generic CSQC models implementation for client monster linking --- qcsrc/client/Main.qc | 1 - qcsrc/client/progs.src | 2 - qcsrc/common/constants.qh | 1 - qcsrc/common/csqcmodel_settings.qh | 3 + qcsrc/common/monsters/cl_monsters.qc | 298 -------------------- qcsrc/common/monsters/cl_monsters.qh | 1 - qcsrc/common/monsters/monster/animus.qc | 15 +- qcsrc/common/monsters/monster/bruiser.qc | 15 +- qcsrc/common/monsters/monster/brute.qc | 18 +- qcsrc/common/monsters/monster/cerberus.qc | 15 +- qcsrc/common/monsters/monster/knight.qc | 18 +- qcsrc/common/monsters/monster/mage.qc | 25 +- qcsrc/common/monsters/monster/shambler.qc | 19 +- qcsrc/common/monsters/monster/slime.qc | 14 +- qcsrc/common/monsters/monster/spider.qc | 17 +- qcsrc/common/monsters/monster/stingray.qc | 15 +- qcsrc/common/monsters/monster/wyvern.qc | 15 +- qcsrc/common/monsters/monster/zombie.qc | 19 +- qcsrc/common/monsters/monsters.qc | 2 +- qcsrc/common/monsters/monsters.qh | 18 +- qcsrc/common/monsters/sv_monsters.qc | 195 +++---------- qcsrc/csqcmodellib/cl_model.qc | 9 + qcsrc/server/command/cmd.qc | 2 +- qcsrc/server/command/sv_cmd.qc | 2 + qcsrc/server/mutators/gamemode_invasion.qc | 2 + qcsrc/server/mutators/gamemode_onslaught.qc | 3 - qcsrc/server/t_items.qc | 2 + 27 files changed, 142 insertions(+), 604 deletions(-) delete mode 100644 qcsrc/common/monsters/cl_monsters.qc delete mode 100644 qcsrc/common/monsters/cl_monsters.qh diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index 2b067adc3..972b15b0b 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -824,7 +824,6 @@ void CSQC_Ent_Update(float bIsNewEntity) case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break; case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break; case ENT_CLIENT_TURRET: ent_turret(); break; - case ENT_CLIENT_MONSTER: ent_monster(); break; case ENT_CLIENT_MODEL: CSQCModel_Read(bIsNewEntity); break; case ENT_CLIENT_ITEM: ItemRead(bIsNewEntity); break; case ENT_CLIENT_BUMBLE_RAYGUN: bumble_raygun_read(bIsNewEntity); break; diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 7e19b414b..56fe8d206 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -29,7 +29,6 @@ Defs.qc ../common/animdecide.qh command/cl_cmd.qh -../common/monsters/cl_monsters.qh ../common/monsters/monsters.qh autocvars.qh @@ -116,7 +115,6 @@ noise.qc ../common/urllib.qc command/cl_cmd.qc -../common/monsters/cl_monsters.qc ../common/monsters/monsters.qc ../warpzonelib/anglestransform.qc diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index f40dfee38..13b8b8a52 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -101,7 +101,6 @@ const float ENT_CLIENT_NOTIFICATION = 38; const float ENT_CLIENT_TURRET = 40; const float ENT_CLIENT_AUXILIARYXHAIR = 50; const float ENT_CLIENT_VEHICLE = 60; -const float ENT_CLIENT_MONSTER = 70; const float SPRITERULE_DEFAULT = 0; const float SPRITERULE_TEAMPLAY = 1; diff --git a/qcsrc/common/csqcmodel_settings.qh b/qcsrc/common/csqcmodel_settings.qh index a9ed986de..3e7e3f5f9 100644 --- a/qcsrc/common/csqcmodel_settings.qh +++ b/qcsrc/common/csqcmodel_settings.qh @@ -45,6 +45,9 @@ CSQCMODEL_PROPERTY(512, float, ReadChar, WriteChar, anim_upper_action) \ CSQCMODEL_PROPERTY(512, float, ReadApproxPastTime, WriteApproxPastTime, anim_upper_time) \ CSQCMODEL_PROPERTY(1024, float, ReadAngle, WriteAngle, v_angle_x) \ + CSQCMODEL_ENDIF \ + CSQCMODEL_IF(!isplayer) \ + CSQCMODEL_PROPERTY(2048, float, ReadByte, WriteByte, monsterid) \ CSQCMODEL_ENDIF // TODO get rid of colormod/glowmod here, find good solution for nex charge glowmod hack; also get rid of some useless properties on non-players that only exist for CopyBody diff --git a/qcsrc/common/monsters/cl_monsters.qc b/qcsrc/common/monsters/cl_monsters.qc deleted file mode 100644 index 24326ddbd..000000000 --- a/qcsrc/common/monsters/cl_monsters.qc +++ /dev/null @@ -1,298 +0,0 @@ -// ========================= -// CSQC Monster Properties -// ========================= - - -.vector glowmod; -void monster_changeteam() -{ - self.glowmod = Team_ColorRGB(self.team - 1); - - if(self.team) - { - self.teamradar_color = Team_ColorRGB(self.team - 1); - self.colormap = 1024 + (self.team - 1) * 17; - } - else - { - self.teamradar_color = '1 0 0'; - self.colormap = 1024; - } -} - -void monster_die() -{ - MON_ACTION(self.monsterid, MR_DEATH); - - self.solid = SOLID_CORPSE; -} - -void monster_draw2d() -{ - if(self.netname == "") - return; - - if(!autocvar_g_waypointsprite_monsters) - return; - - if(autocvar_cl_hidewaypoints) - return; - - if(self.solid == SOLID_CORPSE) - return; // re-spawning - - if(self.health <= 0) - return; - - float dist = vlen(self.origin - view_origin); - float t = (GetPlayerColor(player_localnum) + 1); - - vector o; - string txt; - - if(autocvar_cl_vehicles_hud_tactical) - if(dist < 10240 && t != self.team) - { - // TODO: Vehicle tactical hud - o = project_3d_to_2d(self.origin + '0 0 1' * ((self.maxs_z + self.mins_z) * 0.5)); - if(o_z < 0 - || o_x < (vid_conwidth * waypointsprite_edgeoffset_left) - || o_y < (vid_conheight * waypointsprite_edgeoffset_top) - || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom))) - return; // Dont draw wp's for monsters out of view - o_z = 0; - if(hud != HUD_NORMAL) - { - switch(hud) - { - case HUD_SPIDERBOT: - case HUD_WAKIZASHI: - case HUD_RAPTOR: - case HUD_BUMBLEBEE: - vector pz = drawgetimagesize("gfx/vehicles/vth-mover.tga") * 0.25; - drawpic(o - pz * 0.5, "gfx/vehicles/vth-mover.tga", pz , '1 1 1', 0.75, DRAWFLAG_NORMAL); - break; - } - } - } - - if(dist > self.maxdistance) - return; - - string spriteimage = self.netname; - float a = self.alpha * autocvar_hud_panel_fg_alpha; - vector rgb = spritelookupcolor(spriteimage, self.teamradar_color); - - - if(self.maxdistance > waypointsprite_normdistance) - a *= pow(bound(0, (self.maxdistance - dist) / (self.maxdistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent); - else if(self.maxdistance > 0) - a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha; - - if(rgb == '0 0 0') - { - self.teamradar_color = '1 0 0'; - print(sprintf("WARNING: sprite of name %s has no color, using red so you notice it\n", spriteimage)); - } - - txt = self.netname; - if(autocvar_g_waypointsprite_spam && waypointsprite_count >= autocvar_g_waypointsprite_spam) - txt = _("Spam"); - else - txt = spritelookuptext(spriteimage); - - if(autocvar_g_waypointsprite_uppercase) - txt = strtoupper(txt); - - if(a > 1) - { - rgb *= a; - a = 1; - } - - if(a <= 0) - return; - - rgb = fixrgbexcess(rgb); - - o = project_3d_to_2d(self.origin + '0 0 1' * (self.maxs_z + 15)); - if(o_z < 0 - || o_x < (vid_conwidth * waypointsprite_edgeoffset_left) - || o_y < (vid_conheight * waypointsprite_edgeoffset_top) - || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom))) - return; // Dont draw wp's for monsters out of view - - o_z = 0; - - float edgedistance_min, crosshairdistance; - edgedistance_min = min((o_y - (vid_conheight * waypointsprite_edgeoffset_top)), - (o_x - (vid_conwidth * waypointsprite_edgeoffset_left)), - (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o_x, - (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o_y); - - float vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height); - - crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) ); - - t = waypointsprite_scale * vidscale; - a *= waypointsprite_alpha; - - { - a = a * (1 - (1 - waypointsprite_distancefadealpha) * (bound(0, dist/waypointsprite_distancefadedistance, 1))); - t = t * (1 - (1 - waypointsprite_distancefadescale) * (bound(0, dist/waypointsprite_distancefadedistance, 1))); - } - if (edgedistance_min < waypointsprite_edgefadedistance) { - a = a * (1 - (1 - waypointsprite_edgefadealpha) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1))); - t = t * (1 - (1 - waypointsprite_edgefadescale) * (1 - bound(0, edgedistance_min/waypointsprite_edgefadedistance, 1))); - } - if(crosshairdistance < waypointsprite_crosshairfadedistance) { - a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1))); - t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1))); - } - - draw_beginBoldFont(); - o = drawspritearrow(o, M_PI, rgb, a, SPRITE_ARROW_SCALE * t); - o = drawspritetext(o, M_PI, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt); - drawhealthbar( - o, - 0, - self.health / 255, - '0 0 0', - '0 0 0', - 0.5 * SPRITE_HEALTHBAR_WIDTH * t, - 0.5 * SPRITE_HEALTHBAR_HEIGHT * t, - SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize, - SPRITE_HEALTHBAR_BORDER * t, - 0, - rgb, - a * SPRITE_HEALTHBAR_BORDERALPHA, - rgb, - a * SPRITE_HEALTHBAR_HEALTHALPHA, - DRAWFLAG_NORMAL - ); - draw_endBoldFont(); -} - -void monster_draw() -{ - float dt; - - dt = time - self.move_time; - self.move_time = time; - if(dt <= 0) - return; - - fixedmakevectors(self.angles); - //movelib_groundalign4point(50, 25, 0.25, 45); - setorigin(self, self.origin + self.velocity * dt); - self.angles_y = self.move_angles_y; -} - -void monster_construct() -{ - entity mon = get_monsterinfo(self.monsterid); - - if(mon.spawnflags & MONSTER_SIZE_BROKEN) - self.scale = 1.3; - - self.netname = M_NAME(self.monsterid); - - setorigin(self, self.origin); - setmodel(self, mon.model); - setsize(self, mon.mins, mon.maxs); - - self.move_movetype = MOVETYPE_BOUNCE; - self.health = 255; - self.solid = SOLID_BBOX; - self.movetype = MOVETYPE_BOUNCE; - self.move_origin = self.origin; - self.move_time = time; - self.drawmask = MASK_NORMAL; - self.alpha = 1; - self.gravity = 1; - self.draw = monster_draw; - self.draw2d = monster_draw2d; - self.maxdistance = autocvar_g_waypointsprite_monsters_maxdist; -} - -void ent_monster() -{ - float sf; - sf = ReadByte(); - - if(sf & MSF_SETUP) - { - self.monsterid = ReadByte(); - - self.origin_x = ReadCoord(); - self.origin_y = ReadCoord(); - self.origin_z = ReadCoord(); - setorigin(self, self.origin); - - self.angles_x = ReadAngle(); - self.angles_y = ReadAngle(); - - self.skin = ReadByte(); - self.team = ReadByte(); - - monster_construct(); - monster_changeteam(); - } - - if(sf & MSF_ANG) - { - self.move_angles_x = ReadShort(); - self.move_angles_y = ReadShort(); - self.angles = self.move_angles; - } - - if(sf & MSF_MOVE) - { - self.origin_x = ReadShort(); - self.origin_y = ReadShort(); - self.origin_z = ReadShort(); - setorigin(self, self.origin); - - self.velocity_x = ReadShort(); - self.velocity_y = ReadShort(); - self.velocity_z = ReadShort(); - - self.move_angles_y = ReadShort(); - - self.move_time = time; - self.move_velocity = self.velocity; - self.move_origin = self.origin; - } - - if(sf & MSF_ANIM) - { - self.frame1time = ReadCoord(); - self.frame = ReadByte(); - } - - if(sf & MSF_STATUS) - { - self.skin = ReadByte(); - - float _tmp; - _tmp = ReadByte(); - if(_tmp != self.team) - { - self.team = _tmp; - monster_changeteam(); - } - - _tmp = ReadByte(); - if(_tmp == 4) // respawning - setmodel(self, "null"); - - _tmp = ReadByte(); - - if(_tmp == 0 && self.health != 0) - monster_die(); - - self.health = _tmp; - } -} diff --git a/qcsrc/common/monsters/cl_monsters.qh b/qcsrc/common/monsters/cl_monsters.qh deleted file mode 100644 index aa6fb4126..000000000 --- a/qcsrc/common/monsters/cl_monsters.qh +++ /dev/null @@ -1 +0,0 @@ -void ent_monster(); diff --git a/qcsrc/common/monsters/monster/animus.qc b/qcsrc/common/monsters/monster/animus.qc index 8d56e0fec..f56bdbefb 100644 --- a/qcsrc/common/monsters/monster/animus.qc +++ b/qcsrc/common/monsters/monster/animus.qc @@ -93,7 +93,7 @@ float m_animus(float req) } case MR_DEATH: { - monsters_setframe(animus_anim_death); + self.frame = animus_anim_death; return TRUE; } case MR_SETUP: @@ -102,13 +102,13 @@ float m_animus(float req) self.monster_loot = spawnfunc_item_health_medium; self.monster_attackfunc = animus_attack; - monsters_setframe(animus_anim_stand); + self.frame = animus_anim_stand; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { - // nothing + precache_model ("models/monsters/demon.mdl"); return TRUE; } case MR_CONFIG: @@ -127,12 +127,7 @@ float m_animus(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/demon.mdl"); return TRUE; diff --git a/qcsrc/common/monsters/monster/bruiser.qc b/qcsrc/common/monsters/monster/bruiser.qc index 3ab609c91..81602ad10 100644 --- a/qcsrc/common/monsters/monster/bruiser.qc +++ b/qcsrc/common/monsters/monster/bruiser.qc @@ -85,7 +85,7 @@ float m_bruiser(float req) } case MR_DEATH: { - monsters_setframe((random() > 0.5) ? bruiser_anim_death1 : bruiser_anim_death2); + self.frame = ((random() > 0.5) ? bruiser_anim_death1 : bruiser_anim_death2); return TRUE; } case MR_SETUP: @@ -94,13 +94,13 @@ float m_bruiser(float req) self.monster_loot = spawnfunc_item_armor_medium; self.monster_attackfunc = bruiser_attack; - monsters_setframe(bruiser_anim_stand); + self.frame = bruiser_anim_stand; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { - // nothing + precache_model ("models/monsters/knight.mdl"); return TRUE; } case MR_CONFIG: @@ -119,12 +119,7 @@ float m_bruiser(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/knight.mdl"); return TRUE; diff --git a/qcsrc/common/monsters/monster/brute.qc b/qcsrc/common/monsters/monster/brute.qc index 91a307bdf..9442c174f 100644 --- a/qcsrc/common/monsters/monster/brute.qc +++ b/qcsrc/common/monsters/monster/brute.qc @@ -169,7 +169,7 @@ float brute_attack(float attack_type) self.brute_cycles = 0; if(random() <= MON_CVAR(brute, attack_uzi_chance)) { - monsters_setframe(brute_anim_pain); + self.frame = brute_anim_pain; self.attack_finished_single = time + 0.8; defer(0.1, brute_uzi); } @@ -177,7 +177,7 @@ float brute_attack(float attack_type) { monster_makevectors(self.enemy); brute_grenade(); - monsters_setframe(brute_anim_pain); + self.frame = brute_anim_pain; self.attack_finished_single = time + 1.2; } @@ -214,7 +214,7 @@ float m_brute(float req) } case MR_DEATH: { - monsters_setframe(brute_anim_die); + self.frame = brute_anim_die; return TRUE; } case MR_SETUP: @@ -223,13 +223,14 @@ float m_brute(float req) self.monster_loot = spawnfunc_item_bullets; self.monster_attackfunc = brute_attack; - monsters_setframe(brute_anim_idle); + self.frame = brute_anim_idle; self.weapon = WEP_GRENADE_LAUNCHER; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { + precache_model ("models/monsters/ogre.dpm"); precache_sound ("weapons/uzi_fire.wav"); precache_sound ("weapons/grenade_impact.wav"); precache_sound ("weapons/grenade_fire.wav"); @@ -251,12 +252,7 @@ float m_brute(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/ogre.dpm"); return TRUE; diff --git a/qcsrc/common/monsters/monster/cerberus.qc b/qcsrc/common/monsters/monster/cerberus.qc index fabaa5a8e..a91f1ddd9 100644 --- a/qcsrc/common/monsters/monster/cerberus.qc +++ b/qcsrc/common/monsters/monster/cerberus.qc @@ -133,7 +133,7 @@ float m_cerberus(float req) { if(self.monster_owner.flags & FL_MONSTER) self.monster_owner = world; - monsters_setframe(cerberus_anim_die); + self.frame = cerberus_anim_die; return TRUE; } case MR_SETUP: @@ -142,13 +142,13 @@ float m_cerberus(float req) self.monster_loot = spawnfunc_item_health_small; self.monster_attackfunc = cerberus_attack; - monsters_setframe(cerberus_anim_idle); + self.frame = cerberus_anim_idle; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { - // nothing + precache_model ("models/monsters/dog.dpm"); return TRUE; } case MR_CONFIG: @@ -167,12 +167,7 @@ float m_cerberus(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/dog.dpm"); return TRUE; diff --git a/qcsrc/common/monsters/monster/knight.qc b/qcsrc/common/monsters/monster/knight.qc index 37dee43df..d4c743fca 100644 --- a/qcsrc/common/monsters/monster/knight.qc +++ b/qcsrc/common/monsters/monster/knight.qc @@ -188,7 +188,7 @@ float knight_attack_ranged() { case 1: { - monsters_setframe(knight_anim_magic2); + self.frame = knight_anim_magic2; self.attack_finished_single = time + 2; defer(0.4, knight_fireball); @@ -202,7 +202,7 @@ float knight_attack_ranged() } case 3: { - monsters_setframe(knight_anim_magic3); + self.frame = knight_anim_magic3; self.attack_finished_single = time + 3; defer(0.4, knight_spikes); @@ -279,7 +279,7 @@ float m_knight(float req) case MR_DEATH: { float chance = random(); - monsters_setframe((random() > 0.5) ? knight_anim_death1 : knight_anim_death2); + self.frame = ((random() > 0.5) ? knight_anim_death1 : knight_anim_death2); if(chance < 0.10 || self.spawnflags & MONSTERFLAG_MINIBOSS) if(self.candrop) { @@ -294,12 +294,13 @@ float m_knight(float req) self.monster_loot = spawnfunc_item_armor_big; self.monster_attackfunc = knight_attack; - monsters_setframe(knight_anim_stand); + self.frame = knight_anim_stand; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { + precache_model ("models/monsters/hknight.mdl"); precache_sound ("player/lava.wav"); precache_sound ("weapons/fireball2.wav"); return TRUE; @@ -320,12 +321,7 @@ float m_knight(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/hknight.mdl"); return TRUE; diff --git a/qcsrc/common/monsters/monster/mage.qc b/qcsrc/common/monsters/monster/mage.qc index fdba5c0a9..2ddfe22cb 100644 --- a/qcsrc/common/monsters/monster/mage.qc +++ b/qcsrc/common/monsters/monster/mage.qc @@ -67,7 +67,7 @@ float friend_needshelp(entity e) return FALSE; if(vlen(e.origin - self.origin) > MON_CVAR(mage, heal_range)) return FALSE; - if(DIFF_TEAM(e, self)) + if(DIFF_TEAM(e, self) && e != self.monster_owner) return FALSE; if(e.frozen) return FALSE; @@ -291,13 +291,12 @@ void mage_heal() { pointparticles(particleeffectnum("healing_fx"), head.origin, '0 0 0', 1); head.health = bound(0, head.health + MON_CVAR(mage, heal_allies), head.max_health); - head.SendFlags |= MSF_STATUS; } } if(washealed) { - monsters_setframe(mage_anim_attack); + self.frame = mage_anim_attack; self.attack_finished_single = time + MON_CVAR(mage, heal_delay); } } @@ -340,7 +339,7 @@ void mage_shield() self.lastshielded = time + MON_CVAR(mage, shield_delay); - monsters_setframe(mage_anim_attack); + self.frame = mage_anim_attack; self.attack_finished_single = time + 1; self.m_armor_blockpercent = MON_CVAR(mage, shield_blockpercent); @@ -353,7 +352,7 @@ float mage_attack(float attack_type) { case MONSTER_ATTACK_MELEE: { - monsters_setframe(mage_anim_attack); + self.frame = mage_anim_attack; self.attack_finished_single = time + MON_CVAR(mage, attack_melee_delay); defer(0.2, mageattack_melee); @@ -367,7 +366,7 @@ float mage_attack(float attack_type) return TRUE; } - monsters_setframe(mage_anim_attack); + self.frame = mage_anim_attack; self.attack_finished_single = time + MON_CVAR(mage, attack_spike_delay); defer(0.2, mage_spike); @@ -433,7 +432,7 @@ float m_mage(float req) } case MR_DEATH: { - monsters_setframe(mage_anim_death); + self.frame = mage_anim_death; return TRUE; } case MR_SETUP: @@ -442,12 +441,13 @@ float m_mage(float req) self.monster_loot = spawnfunc_item_health_large; self.monster_attackfunc = mage_attack; - monsters_setframe(mage_anim_walk); + self.frame = mage_anim_walk; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { + precache_model ("models/monsters/mage.dpm"); precache_model ("models/items/g_h50.md3"); precache_model ("models/ctf/shield.md3"); precache_sound ("weapons/grenade_impact.wav"); @@ -469,12 +469,7 @@ float m_mage(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/mage.dpm"); return TRUE; diff --git a/qcsrc/common/monsters/monster/shambler.qc b/qcsrc/common/monsters/monster/shambler.qc index 91d1e66f2..d7b9cef7c 100644 --- a/qcsrc/common/monsters/monster/shambler.qc +++ b/qcsrc/common/monsters/monster/shambler.qc @@ -40,7 +40,7 @@ void shambler_smash() void shambler_delayedsmash() { - monsters_setframe(shambler_anim_smash); + self.frame = shambler_anim_smash; defer(0.7, shambler_smash); self.attack_finished_single = time + 1.1; } @@ -93,7 +93,7 @@ float shambler_attack(float attack_type) } case MONSTER_ATTACK_RANGED: { - monsters_setframe(shambler_anim_magic); + self.frame = shambler_anim_magic; self.attack_finished_single = time + 1.1; defer(0.6, CastLightning); @@ -127,7 +127,7 @@ float m_shambler(float req) } case MR_DEATH: { - monsters_setframe(shambler_anim_death); + self.frame = shambler_anim_death; return TRUE; } case MR_SETUP: @@ -137,14 +137,14 @@ float m_shambler(float req) self.monster_loot = spawnfunc_item_health_mega; self.monster_attackfunc = shambler_attack; - monsters_setframe(shambler_anim_stand); + self.frame = shambler_anim_stand; self.weapon = WEP_NEX; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { - // nothing + precache_model ("models/monsters/shambler.mdl"); return TRUE; } case MR_CONFIG: @@ -163,12 +163,7 @@ float m_shambler(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/shambler.mdl"); return TRUE; diff --git a/qcsrc/common/monsters/monster/slime.qc b/qcsrc/common/monsters/monster/slime.qc index ffda3b99f..0c27ae246 100644 --- a/qcsrc/common/monsters/monster/slime.qc +++ b/qcsrc/common/monsters/monster/slime.qc @@ -115,8 +115,6 @@ float m_slime(float req) self.enemy = world; self.health = 0; - self.SendFlags |= MSF_MOVE | MSF_STATUS; - return TRUE; } case MR_SETUP: @@ -125,12 +123,13 @@ float m_slime(float req) self.monster_loot = spawnfunc_item_rockets; self.monster_attackfunc = slime_attack; - monsters_setframe(slime_anim_idle); + self.frame = slime_anim_idle; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { + precache_model ("models/monsters/slime.dpm"); precache_sound ("weapons/rocket_impact.wav"); return TRUE; } @@ -150,12 +149,7 @@ float m_slime(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/slime.dpm"); return TRUE; diff --git a/qcsrc/common/monsters/monster/spider.qc b/qcsrc/common/monsters/monster/spider.qc index ea4a6d6b7..7d3815318 100644 --- a/qcsrc/common/monsters/monster/spider.qc +++ b/qcsrc/common/monsters/monster/spider.qc @@ -147,7 +147,7 @@ float spider_attack(float attack_type) if(self.enemy.frozen) return FALSE; - monsters_setframe(spider_anim_attack2); + self.frame = spider_anim_attack2; self.attack_finished_single = time + MON_CVAR(spider, attack_web_delay); spider_shootweb(self.spider_type); @@ -181,9 +181,8 @@ float m_spider(float req) } case MR_DEATH: { - monsters_setframe(spider_anim_attack); + self.frame = spider_anim_attack; self.angles_x = 180; - self.SendFlags |= MSF_ANG; return TRUE; } case MR_SETUP: @@ -193,12 +192,13 @@ float m_spider(float req) self.monster_loot = spawnfunc_item_health_medium; self.monster_attackfunc = spider_attack; - monsters_setframe(spider_anim_idle); + self.frame = spider_anim_idle; return TRUE; } - case MR_INIT: + 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"); @@ -220,12 +220,7 @@ float m_spider(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/spider.dpm"); return TRUE; diff --git a/qcsrc/common/monsters/monster/stingray.qc b/qcsrc/common/monsters/monster/stingray.qc index 5a5335617..a4c80122c 100644 --- a/qcsrc/common/monsters/monster/stingray.qc +++ b/qcsrc/common/monsters/monster/stingray.qc @@ -68,7 +68,7 @@ float m_stingray(float req) } case MR_DEATH: { - monsters_setframe(stingray_anim_death); + self.frame = stingray_anim_death; return TRUE; } case MR_SETUP: @@ -77,13 +77,13 @@ float m_stingray(float req) self.monster_loot = spawnfunc_item_health_small; self.monster_attackfunc = stingray_attack; - monsters_setframe(stingray_anim_swim); + self.frame = stingray_anim_swim; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { - // nothing + precache_model ("models/monsters/fish.mdl"); return TRUE; } case MR_CONFIG: @@ -102,12 +102,7 @@ float m_stingray(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/fish.mdl"); return TRUE; diff --git a/qcsrc/common/monsters/monster/wyvern.qc b/qcsrc/common/monsters/monster/wyvern.qc index 0afc5f928..c59c63b37 100644 --- a/qcsrc/common/monsters/monster/wyvern.qc +++ b/qcsrc/common/monsters/monster/wyvern.qc @@ -122,7 +122,7 @@ float m_wyvern(float req) } case MR_DEATH: { - monsters_setframe(wyvern_anim_death); + self.frame = wyvern_anim_death; self.velocity_x = -200 + 400 * random(); self.velocity_y = -200 + 400 * random(); self.velocity_z = 100 + 100 * random(); @@ -134,13 +134,13 @@ float m_wyvern(float req) self.monster_loot = spawnfunc_item_cells; self.monster_attackfunc = wyvern_attack; - monsters_setframe(wyvern_anim_hover); + self.frame = wyvern_anim_hover; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { - // nothing + precache_model ("models/monsters/wizard.mdl"); return TRUE; } case MR_CONFIG: @@ -159,12 +159,7 @@ float m_wyvern(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/wizard.mdl"); return TRUE; diff --git a/qcsrc/common/monsters/monster/zombie.qc b/qcsrc/common/monsters/monster/zombie.qc index 805fb7bf7..307737ff8 100644 --- a/qcsrc/common/monsters/monster/zombie.qc +++ b/qcsrc/common/monsters/monster/zombie.qc @@ -82,14 +82,14 @@ void zombie_blockend() if(self.health <= 0) return; - monsters_setframe(zombie_anim_blockend); + self.frame = zombie_anim_blockend; self.armorvalue = 0; self.m_armor_blockpercent = autocvar_g_monsters_armor_blockpercent; } float zombie_block() { - monsters_setframe(zombie_anim_blockstart); + self.frame = zombie_anim_blockstart; self.armorvalue = 100; self.m_armor_blockpercent = 0.9; self.state = MONSTER_STATE_ATTACK_MELEE; // freeze monster @@ -157,7 +157,7 @@ float m_zombie(float req) { self.armorvalue = 0; self.m_armor_blockpercent = autocvar_g_monsters_armor_blockpercent; - monsters_setframe((random() > 0.5) ? zombie_anim_deathback1 : zombie_anim_deathfront1); + self.frame = ((random() > 0.5) ? zombie_anim_deathback1 : zombie_anim_deathfront1); return TRUE; } case MR_SETUP: @@ -169,16 +169,16 @@ float m_zombie(float req) self.monster_loot = spawnfunc_item_health_medium; self.monster_attackfunc = zombie_attack; - monsters_setframe(zombie_anim_spawn); + self.frame = zombie_anim_spawn; self.spawn_time = time + 2.1; self.spawnshieldtime = self.spawn_time; self.respawntime = 0.2; return TRUE; } - case MR_INIT: + case MR_PRECACHE: { - // nothing + precache_model ("models/monsters/zombie.dpm"); return TRUE; } case MR_CONFIG: @@ -197,12 +197,7 @@ float m_zombie(float req) { switch(req) { - case MR_DEATH: - { - // nothing - return TRUE; - } - case MR_INIT: + case MR_PRECACHE: { precache_model ("models/monsters/zombie.dpm"); return TRUE; diff --git a/qcsrc/common/monsters/monsters.qc b/qcsrc/common/monsters/monsters.qc index 9cc7211b4..f40d30d29 100644 --- a/qcsrc/common/monsters/monsters.qc +++ b/qcsrc/common/monsters/monsters.qc @@ -20,7 +20,7 @@ void register_monster(float id, float(float) func, float monsterflags, vector mi e.model = strzone(strcat("models/monsters/", modelname)); #ifndef MENUQC - func(MR_INIT); + func(MR_PRECACHE); #endif } float m_null(float dummy) { return 0; } diff --git a/qcsrc/common/monsters/monsters.qh b/qcsrc/common/monsters/monsters.qh index d0f7a9ad3..61e2e5364 100644 --- a/qcsrc/common/monsters/monsters.qh +++ b/qcsrc/common/monsters/monsters.qh @@ -1,8 +1,8 @@ // monster requests #define MR_SETUP 1 // (SERVER) setup monster data #define MR_THINK 2 // (SERVER) logic to run every frame -#define MR_DEATH 3 // (BOTH) called when monster dies -#define MR_INIT 4 // (BOTH) precaches models/sounds used by this monster +#define MR_DEATH 3 // (SERVER) called when monster dies +#define MR_PRECACHE 4 // (BOTH) precaches models/sounds used by this monster #define MR_CONFIG 5 // (ALL) // functions: @@ -27,20 +27,6 @@ const float MON_FLAG_MELEE = 1024; .float spawnflags; .vector mins, maxs; // monster hitbox size -// csqc linking -#ifndef MENUQC -.float anim_start_time; - -float MSF_UPDATE = 2; -float MSF_STATUS = 4; -float MSF_SETUP = 8; -float MSF_ANG = 16; -float MSF_MOVE = 32; -float MSF_ANIM = 64; - -float MSF_FULL_UPDATE = 16777215; -#endif - // other useful macros #define MON_ACTION(monstertype,mrequest) (get_monsterinfo(monstertype)).monster_func(mrequest) #define M_NAME(monstertype) (get_monsterinfo(monstertype)).monster_name diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index 8f97694fe..f64489606 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -11,6 +11,7 @@ void monster_item_spawn() self.gravity = 1; self.velocity = randomvec() * 175 + '0 0 325'; self.classname = "droppedweapon"; // hax + self.wait = time + 0.7; SUB_SetFade(self, time + autocvar_g_monsters_drop_time, 1); } @@ -38,16 +39,6 @@ void monster_dropitem() } } -void monsters_setframe(float _frame) -{ - if(self.frame == _frame) - return; - - self.anim_start_time = time; - self.frame = _frame; - self.SendFlags |= MSF_ANIM; -} - float monster_isvalidtarget (entity targ, entity ent) { if(!targ || !ent) @@ -309,10 +300,9 @@ float monster_melee(entity targ, float damg, float anim, float er, float anim_fi self.velocity_x = 0; self.velocity_y = 0; self.state = MONSTER_STATE_ATTACK_MELEE; - self.SendFlags |= MSF_MOVE; } - monsters_setframe(anim); + self.frame = anim; if(anim_finished != 0) self.attack_finished_single = time + anim_finished; @@ -338,6 +328,7 @@ void Monster_CheckMinibossFlag () if ((self.spawnflags & MONSTERFLAG_MINIBOSS) || (chance < autocvar_g_monsters_miniboss_chance)) { self.health += autocvar_g_monsters_miniboss_healthboost; + self.effects |= EF_RED; if not(self.weapon) self.weapon = WEP_NEX; } @@ -377,9 +368,7 @@ void Monster_Fade () setorigin(self, self.pos1); self.angles = self.pos2; self.health = self.max_health; - - self.SendFlags |= MSF_MOVE; - self.SendFlags |= MSF_STATUS; + setmodel(self, "null"); } else { @@ -418,7 +407,7 @@ float monster_leap (float anm, void() touchfunc, vector vel, float anim_finished if(!Monster_CanJump(vel)) return FALSE; - monsters_setframe(anm); + self.frame = anm; self.state = MONSTER_STATE_ATTACK_LEAP; self.touch = touchfunc; self.origin_z += 1; @@ -542,12 +531,10 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ { self.revive_progress = bound(0, self.revive_progress + frametime * self.revive_speed, 1); self.health = max(1, self.max_health * self.revive_progress); - - self.SendFlags |= MSF_STATUS; - + movelib_beak_simple(stopspeed); - monsters_setframe(manim_idle); + self.frame = manim_idle; self.enemy = world; self.nextthink = time + self.ticrate; @@ -555,13 +542,6 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ if(self.revive_progress >= 1) Unfreeze(self); // wait for next think before attacking - // don't bother updating angles here? - if(self.origin != self.oldorigin) - { - self.oldorigin = self.origin; - self.SendFlags |= MSF_MOVE; - } - return; // no moving while frozen } @@ -593,8 +573,6 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ self.movetype = MOVETYPE_BOUNCE; //self.velocity_z = -200; - self.SendFlags |= MSF_MOVE | MSF_ANG; - return; } else if(self.fish_wasdrowning) @@ -615,13 +593,8 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ { runspeed = walkspeed = 0; if(time >= self.spawn_time) - monsters_setframe(manim_idle); + self.frame = manim_idle; movelib_beak_simple(stopspeed); - if(self.oldorigin != self.origin) - { - self.oldorigin = self.origin; - self.SendFlags |= MSF_MOVE; - } return; } @@ -709,9 +682,9 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ if(time > self.pain_finished) if(time > self.attack_finished_single) if(vlen(self.velocity) > 10) - monsters_setframe((self.enemy) ? manim_run : manim_walk); + self.frame = ((self.enemy) ? manim_run : manim_walk); else - monsters_setframe(manim_idle); + self.frame = manim_idle; } else { @@ -725,22 +698,10 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_ if(time > self.attack_finished_single) if(time > self.pain_finished) if (vlen(self.velocity) <= 30) - monsters_setframe(manim_idle); + self.frame = manim_idle; } monster_checkattack(self, self.enemy); - - if(self.angles != self.oldangles) - { - self.oldangles = self.angles; - self.SendFlags |= MSF_ANG; - } - - if(self.origin != self.oldorigin) - { - self.oldorigin = self.origin; - self.SendFlags |= MSF_MOVE; - } } void monster_dead_think() @@ -756,12 +717,8 @@ void monster_dead_think() Monster_Fade(); return; } - - if(self.oldorigin != self.origin) - { - self.oldorigin = self.origin; - self.SendFlags |= MSF_MOVE; - } + + CSQCMODEL_AUTOUPDATE(); } void monsters_setstatus() @@ -803,76 +760,6 @@ void monsters_reset() self.goalentity = world; self.attack_finished_single = 0; self.moveto = self.origin; - - self.SendFlags |= MSF_STATUS; -} - -float monster_send(entity to, float sf) -{ - WriteByte(MSG_ENTITY, ENT_CLIENT_MONSTER); - WriteByte(MSG_ENTITY, sf); - if(sf & MSF_SETUP) - { - WriteByte(MSG_ENTITY, self.monsterid); - - WriteCoord(MSG_ENTITY, self.origin_x); - WriteCoord(MSG_ENTITY, self.origin_y); - WriteCoord(MSG_ENTITY, self.origin_z); - - WriteAngle(MSG_ENTITY, self.angles_x); - WriteAngle(MSG_ENTITY, self.angles_y); - - WriteByte(MSG_ENTITY, self.skin); - WriteByte(MSG_ENTITY, self.team); - } - - if(sf & MSF_ANG) - { - WriteShort(MSG_ENTITY, rint(self.angles_x)); - WriteShort(MSG_ENTITY, rint(self.angles_y)); - } - - if(sf & MSF_MOVE) - { - WriteShort(MSG_ENTITY, rint(self.origin_x)); - WriteShort(MSG_ENTITY, rint(self.origin_y)); - WriteShort(MSG_ENTITY, rint(self.origin_z)); - - WriteShort(MSG_ENTITY, rint(self.velocity_x)); - WriteShort(MSG_ENTITY, rint(self.velocity_y)); - WriteShort(MSG_ENTITY, rint(self.velocity_z)); - - WriteShort(MSG_ENTITY, rint(self.angles_y)); - } - - if(sf & MSF_ANIM) - { - WriteCoord(MSG_ENTITY, self.anim_start_time); - WriteByte(MSG_ENTITY, self.frame); - } - - if(sf & MSF_STATUS) - { - WriteByte(MSG_ENTITY, self.skin); - - WriteByte(MSG_ENTITY, self.team); - - WriteByte(MSG_ENTITY, self.deadflag); - - if(self.health <= 0) - WriteByte(MSG_ENTITY, 0); - else - WriteByte(MSG_ENTITY, ceil((self.health / self.max_health) * 255)); - } - - return TRUE; -} - -void monster_link(void() spawnproc) -{ - Net_LinkEntity(self, TRUE, 0, monster_send); - self.think = spawnproc; - self.nextthink = time; } void monsters_corpse_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) @@ -929,8 +816,6 @@ void monster_die(entity attacker) if not(self.flags & FL_FLY) self.velocity = '0 0 0'; - self.SendFlags |= MSF_MOVE; - // number of monsters spawned with mobspawn command totalspawned -= 1; @@ -951,11 +836,13 @@ void monsters_damage (entity inflictor, entity attacker, float damage, float dea vector v; float take, save; - v = healtharmor_applydamage(self.armorvalue, self.m_armor_blockpercent, damage, deathtype); + v = healtharmor_applydamage(self.armorvalue, self.m_armor_blockpercent, deathtype, damage); take = v_x; save = v_y; self.health -= take; + + WaypointSprite_UpdateHealth(self.sprite, self.health); self.dmg_time = time; @@ -986,6 +873,8 @@ void monsters_damage (entity inflictor, entity attacker, float damage, float dea monster_die(attacker); + WaypointSprite_Kill(self.sprite); + frag_attacker = attacker; frag_target = self; MUTATOR_CALLHOOK(MonsterDies); @@ -998,8 +887,6 @@ void monsters_damage (entity inflictor, entity attacker, float damage, float dea self.nextthink = time + 0.1; } } - - self.SendFlags |= MSF_STATUS; } void monster_think() @@ -1015,6 +902,8 @@ void monster_think() } MON_ACTION(self.monsterid, MR_THINK); + + CSQCMODEL_AUTOUPDATE(); } void monster_spawn() @@ -1026,14 +915,9 @@ void monster_spawn() self.max_health = self.health; self.pain_finished = self.nextthink; - self.anim_start_time = time; - - if not(self.noalign) - { - setorigin(self, self.origin + '0 0 20'); - tracebox(self.origin + '0 0 100', self.mins, self.maxs, self.origin - '0 0 10000', MOVE_WORLDONLY, self); - setorigin(self, trace_endpos); - } + + if(IS_PLAYER(self.monster_owner)) + self.effects |= EF_DIMLIGHT; if not(self.monster_respawned) if not(self.skin) @@ -1041,24 +925,22 @@ void monster_spawn() if not(self.attack_range) self.attack_range = autocvar_g_monsters_attack_range; - - self.pos1 = self.origin; - - //monster_setupsounds(self.netname); + precache_monstersounds(); UpdateMonsterSounds(); - //monster_precachesounds(self); if(teamplay) self.monster_attack = TRUE; // we can have monster enemies in team games MonsterSound(monstersound_spawn, 0, FALSE, CH_VOICE); + + WaypointSprite_Spawn(M_NAME(self.monsterid), 0, 1024, self, '0 0 1' * (self.maxs_z + 15), world, self.team, self, sprite, TRUE, RADARICON_DANGER, ((self.team) ? Team_ColorRGB(self.team) : '1 0 0')); + WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health); + WaypointSprite_UpdateHealth(self.sprite, self.health); self.think = monster_think; self.nextthink = time + self.ticrate; - self.SendFlags |= MSF_SETUP; - MUTATOR_CALLHOOK(MonsterSpawn); } @@ -1086,6 +968,7 @@ float monster_initialize(float mon_id, float nodrop) if not(self.monster_respawned) monsters_total += 1; + setmodel(self, mon.model); setsize(self, mon.mins, mon.maxs); self.flags = FL_MONSTER; self.takedamage = DAMAGE_AIM; @@ -1104,6 +987,7 @@ float monster_initialize(float mon_id, float nodrop) self.enemy = world; self.velocity = '0 0 0'; self.moveto = self.origin; + self.pos1 = self.origin; self.pos2 = self.angles; self.reset = monsters_reset; self.netname = mon.netname; @@ -1117,6 +1001,12 @@ float monster_initialize(float mon_id, float nodrop) self.spawn_time = time; self.gravity = 1; self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_BOTCLIP | DPCONTENTS_MONSTERCLIP; + + if(autocvar_g_fullbrightplayers) + self.effects |= EF_FULLBRIGHT; + + if(autocvar_g_nodepthtestplayers) + self.effects |= EF_NODEPTHTEST; if(mon.spawnflags & MONSTER_TYPE_SWIM) self.flags |= FL_SWIM; @@ -1146,8 +1036,17 @@ float monster_initialize(float mon_id, float nodrop) if not(self.monster_moveflags) self.monster_moveflags = MONSTER_MOVE_WANDER; - - monster_link(monster_spawn); + + if not(self.noalign) + { + setorigin(self, self.origin + '0 0 20'); + tracebox(self.origin + '0 0 64', self.mins, self.maxs, self.origin - '0 0 10000', MOVE_WORLDONLY, self); + setorigin(self, trace_endpos); + } + + monster_spawn(); + + CSQCMODEL_AUTOINIT(); return TRUE; } diff --git a/qcsrc/csqcmodellib/cl_model.qc b/qcsrc/csqcmodellib/cl_model.qc index 2c7bc2d92..b677fece1 100644 --- a/qcsrc/csqcmodellib/cl_model.qc +++ b/qcsrc/csqcmodellib/cl_model.qc @@ -236,8 +236,17 @@ void CSQCModel_Read(float isnew) #undef CSQCMODEL_IF if(sf & CSQCMODEL_PROPERTY_MODELINDEX) + { setmodelindex(self, self.modelindex); // this retrieves the .model key and sets mins/maxs/absmin/absmax // FIXME do we WANT this to override mins/maxs? + if(isplayer) + setsize(self, PL_MIN, PL_MAX); + else if(self.monsterid) + { + entity mon = get_monsterinfo(self.monsterid); + setsize(self, mon.mins, mon.maxs); + } + } if(sf & CSQCMODEL_PROPERTY_TELEPORTED) { diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index 5baf7ded5..86cc80866 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -196,7 +196,7 @@ void ClientCommand_mobedit(float request, float argc) switch(argv(1)) { - case "skin": if(trace_ent.monsterid != MON_MAGE) { trace_ent.skin = stof(argv(2)); trace_ent.SendFlags |= MSF_STATUS; } return; + case "skin": if(trace_ent.monsterid != MON_MAGE) { trace_ent.skin = stof(argv(2)); } return; case "movetarget": trace_ent.monster_moveflags = stof(argv(2)); return; } } diff --git a/qcsrc/server/command/sv_cmd.qc b/qcsrc/server/command/sv_cmd.qc index 569480b5c..dd3d6e3d0 100644 --- a/qcsrc/server/command/sv_cmd.qc +++ b/qcsrc/server/command/sv_cmd.qc @@ -159,6 +159,8 @@ void GameCommand_butcher(float request) if(head.iceblock) remove(head.iceblock); + WaypointSprite_Kill(head.sprite); + remove(head); ++removed_count; } diff --git a/qcsrc/server/mutators/gamemode_invasion.qc b/qcsrc/server/mutators/gamemode_invasion.qc index 8a7a4738f..ca4736375 100644 --- a/qcsrc/server/mutators/gamemode_invasion.qc +++ b/qcsrc/server/mutators/gamemode_invasion.qc @@ -73,6 +73,7 @@ float Invasion_CheckWinner() { if(head.weaponentity) remove(head.weaponentity); if(head.iceblock) remove(head.iceblock); + WaypointSprite_Kill(head.sprite); remove(head); } @@ -202,6 +203,7 @@ MUTATOR_HOOKFUNCTION(invasion_MonsterSpawn) { if(self.weaponentity) remove(self.weaponentity); if(self.iceblock) remove(self.iceblock); + WaypointSprite_Kill(self.sprite); remove(self); return FALSE; } diff --git a/qcsrc/server/mutators/gamemode_onslaught.qc b/qcsrc/server/mutators/gamemode_onslaught.qc index 804891606..f9f0efb06 100644 --- a/qcsrc/server/mutators/gamemode_onslaught.qc +++ b/qcsrc/server/mutators/gamemode_onslaught.qc @@ -1649,8 +1649,6 @@ MUTATOR_HOOKFUNCTION(ons_MonsterThink) entity e = find(world, targetname, self.target); if (e != world) self.team = e.team; - - self.SendFlags |= MSF_STATUS; // update team return FALSE; } @@ -1665,7 +1663,6 @@ MUTATOR_HOOKFUNCTION(ons_MonsterSpawn) if(e != world) { self.team = e.team; - self.SendFlags |= MSF_STATUS; ee = e; } } diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 4f5391537..94734f1fe 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -690,6 +690,8 @@ void Item_Touch (void) return; if (self.owner == other) return; + if (time < self.wait) + return; switch(MUTATOR_CALLHOOK(ItemTouch)) { -- 2.39.2