]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Use the generic CSQC models implementation for client monster linking
authorMario <mario.mario@y7mail.com>
Mon, 30 Sep 2013 10:23:35 +0000 (03:23 -0700)
committerMario <mario.mario@y7mail.com>
Mon, 30 Sep 2013 10:23:35 +0000 (03:23 -0700)
27 files changed:
qcsrc/client/Main.qc
qcsrc/client/progs.src
qcsrc/common/constants.qh
qcsrc/common/csqcmodel_settings.qh
qcsrc/common/monsters/cl_monsters.qc [deleted file]
qcsrc/common/monsters/cl_monsters.qh [deleted file]
qcsrc/common/monsters/monster/animus.qc
qcsrc/common/monsters/monster/bruiser.qc
qcsrc/common/monsters/monster/brute.qc
qcsrc/common/monsters/monster/cerberus.qc
qcsrc/common/monsters/monster/knight.qc
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/monster/shambler.qc
qcsrc/common/monsters/monster/slime.qc
qcsrc/common/monsters/monster/spider.qc
qcsrc/common/monsters/monster/stingray.qc
qcsrc/common/monsters/monster/wyvern.qc
qcsrc/common/monsters/monster/zombie.qc
qcsrc/common/monsters/monsters.qc
qcsrc/common/monsters/monsters.qh
qcsrc/common/monsters/sv_monsters.qc
qcsrc/csqcmodellib/cl_model.qc
qcsrc/server/command/cmd.qc
qcsrc/server/command/sv_cmd.qc
qcsrc/server/mutators/gamemode_invasion.qc
qcsrc/server/mutators/gamemode_onslaught.qc
qcsrc/server/t_items.qc

index 2b067adc34b549ef4b558557dad8a8d84d8db395..972b15b0ba78a1bc146c32ec8e5e909a6bbcd33b 100644 (file)
@@ -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;
index 7e19b414b3f9e6e61a6e42bbdd2cda4e91f8fa25..56fe8d2065ffaaab3a4a484449a213de55445fda 100644 (file)
@@ -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
index f40dfee386a795c3f789209eecfb035892813b65..13b8b8a5288562aa3fdc2a96f094f34186657f13 100644 (file)
@@ -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;
index a9ed986deef9e774a4a3c38b0eaaf50a30dfce82..3e7e3f5f99a1d98ea8bc22dbaab65153812bbd86 100644 (file)
@@ -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 (file)
index 24326dd..0000000
+++ /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 (file)
index aa6fb41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-void ent_monster();
index 8d56e0fecfdbc262f9b126cd1932cf75c2d9555e..f56bdbefbcbfedb87708b23d3822830e6708d8d2 100644 (file)
@@ -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;
index 3ab609c914b932060861e892ed69d1873991d923..81602ad1097bdf4b4de1b9c165b21d9574367525 100644 (file)
@@ -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;
index 91a307bdff0b60bb6842fe84423b8522bd34e715..9442c174fcc3f4f17154b86f415bef79ef7e4142 100644 (file)
@@ -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;
index fabaa5a8eba0141b8998e37d65768207c94a22fe..a91f1ddd95f071e42d8243bcca7abc1ea2dc2cc5 100644 (file)
@@ -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;
index 37dee43df813f48dfded0a55ff3d331c0b11e8b1..d4c743fca9d2ccc02645671e8e7e67f8dc8e2c41 100644 (file)
@@ -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;
index fdba5c0a98e20b87a41e6c9d413f455af638ff0c..2ddfe22cbc8b2e229bd413cbec2d81a244e632b9 100644 (file)
@@ -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;
index 91d1e66f27087c513e2af60abeb543424c640521..d7b9cef7cd4c9d65579c7a7eebe65b7abd1be4dd 100644 (file)
@@ -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;
index ffda3b99feaa35b70bfac68f169944fd8d68bad7..0c27ae246a0472181b6e94f934a65cee6657eb18 100644 (file)
@@ -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;
index ea4a6d6b786f5b1f70abb3b1ed82456fb9bf5dcb..7d381531872f1429389a7888de676eade503682c 100644 (file)
@@ -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;
index 5a53356176146dd13e3f7bb63a5b04ebdc06f846..a4c80122c959b1e95d754240c3c34fd06ac306b6 100644 (file)
@@ -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;
index 0afc5f9281d89af88539d45587804523b2a5da30..c59c63b376affdbf069a6e319e1a1c24f393ea44 100644 (file)
@@ -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;
index 805fb7bf779b9ffee09e7fd6b353a7aef9133bfc..307737ff81d0a9e05155465af2eb3ba855f7bbd7 100644 (file)
@@ -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;
index 9cc7211b43f7f2ed9972e55f3fde0d7a3c67916e..f40d30d2921522009cd66909a27a3d6279a02f5d 100644 (file)
@@ -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; }
index d0f7a9ad31c9f315635eb847a5f706233405e861..61e2e536453840c283a1fb026906f781e7567b8b 100644 (file)
@@ -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
index 8f97694fed1a5b74d9ff3e0afd62def118666a73..f644896066ecd2916aedbe665adb0b07c41f0cca 100644 (file)
@@ -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;
 }
index 2c7bc2d925da89fc0c1d971ad86e2ca696cddb2c..b677fece1ca9f364cfb18cfb9a5490ebb6e22f79 100644 (file)
@@ -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)
        {
index 5baf7ded5e16c655ef6d3394215e7f018e01f01a..86cc80866c7beab98ebbcae32d56ae5b3b0b9854 100644 (file)
@@ -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;
                        }
                }
index 569480b5c744473d66fdde248a4caf626bd6abcd..dd3d6e3d0c8a9eed8364d0f48660ec289f03a95a 100644 (file)
@@ -159,6 +159,8 @@ void GameCommand_butcher(float request)
                                if(head.iceblock)
                                        remove(head.iceblock);
                                        
+                               WaypointSprite_Kill(head.sprite);
+                                       
                                remove(head);
                                ++removed_count;
                        }
index 8a7a4738f347c452b9d6a6772f313a70c2898551..ca47363753e152f74e092eb37d9712722e11e0aa 100644 (file)
@@ -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;
        }
index 80489160696a42a45421d50f6a4e4c0c509982ad..f9f0efb060f0106e6df6e6f727785ee1131c2001 100644 (file)
@@ -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;
                }
        }
index 4f5391537c88184842933d9d0128363788d6baca..94734f1fe41c183987987bc88bbd91253b16a0eb 100644 (file)
@@ -690,6 +690,8 @@ void Item_Touch (void)
                return;
        if (self.owner == other)
                return;
+       if (time < self.wait)
+               return;
 
        switch(MUTATOR_CALLHOOK(ItemTouch))
        {