From: Mario Date: Wed, 17 Apr 2013 05:20:55 +0000 (+1000) Subject: Move td generator model loading to client X-Git-Tag: xonotic-v0.8.0~241^2^2~382 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=643ff433247b229b814f4c2de8d4cc4292a62357;p=xonotic%2Fxonotic-data.pk3dir.git Move td generator model loading to client --- diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index e0d063c8f..2567373cc 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -781,6 +781,7 @@ void CSQC_Ent_Update(float bIsNewEntity) 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_GENERATOR: ent_td_generator(); 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/monsters.qc b/qcsrc/client/monsters.qc index 53292d28e..64dd4f137 100644 --- a/qcsrc/client/monsters.qc +++ b/qcsrc/client/monsters.qc @@ -382,3 +382,67 @@ void ent_monster() self.health = _tmp; } } + +void td_generator_precache() +{ + precache_model("models/onslaught/generator.md3"); + precache_model("models/onslaught/generator_dead.md3"); + precache_sound("onslaught/generator_underattack.wav"); +} + +void td_generator_die() +{ + setmodel(self, "models/onslaught/generator_dead.md3"); + pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1); +} + +void td_generator_draw() { } // TODO + +void td_generator_construct() +{ + self.netname = "Generator"; + + setorigin(self, self.origin); + setmodel(self, "models/onslaught/generator.md3"); + setsize(self, GENERATOR_MIN, GENERATOR_MAX); + + self.move_movetype = MOVETYPE_NOCLIP; + self.health = 255; + self.solid = SOLID_BBOX; + self.movetype = MOVETYPE_NOCLIP; + self.move_origin = self.origin; + self.move_time = time; + self.drawmask = MASK_NORMAL; + self.alpha = 1; + self.draw = td_generator_draw; +} + +void ent_td_generator() +{ + float sf; + sf = ReadByte(); + + if(sf & MSF_SETUP) + { + self.origin_x = ReadCoord(); + self.origin_y = ReadCoord(); + self.origin_z = ReadCoord(); + setorigin(self, self.origin); + + td_generator_precache(); + td_generator_construct(); + self.colormap = 1024; + self.glowmod = '1 1 0'; + } + + if(sf & MSF_STATUS) + { + float _tmp = ReadByte(); + + if(_tmp == 0 && self.health != 0) + td_generator_die(); + + self.health = _tmp; + } +} + diff --git a/qcsrc/client/monsters.qh b/qcsrc/client/monsters.qh index 83dac2956..897b0d957 100644 --- a/qcsrc/client/monsters.qh +++ b/qcsrc/client/monsters.qh @@ -1,2 +1,3 @@ void ent_monster(); void Monsters_Precache(); +void ent_td_generator(); diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index fd894be1f..528a7441d 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -102,6 +102,7 @@ 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 ENT_CLIENT_GENERATOR = 80; const float SPRITERULE_DEFAULT = 0; const float SPRITERULE_TEAMPLAY = 1; diff --git a/qcsrc/server/monsters/lib/monsters_early.qh b/qcsrc/server/monsters/lib/monsters_early.qh index 3493b44a7..505976413 100644 --- a/qcsrc/server/monsters/lib/monsters_early.qh +++ b/qcsrc/server/monsters/lib/monsters_early.qh @@ -48,4 +48,7 @@ float MSF_SIZE = 128; float MSF_FULL_UPDATE = 16777215; +#define GENERATOR_MIN '-52 -52 -14' +#define GENERATOR_MAX '52 52 75' + #endif // CSQC/SVQC \ No newline at end of file diff --git a/qcsrc/server/mutators/gamemode_towerdefense.qc b/qcsrc/server/mutators/gamemode_towerdefense.qc index 5588d086d..3c31d57b4 100644 --- a/qcsrc/server/mutators/gamemode_towerdefense.qc +++ b/qcsrc/server/mutators/gamemode_towerdefense.qc @@ -53,14 +53,11 @@ void td_generator_die() Send_Notification(NOTIF_ALL, world, MSG_MULTI, MULTI_TD_GENDESTROYED); - setmodel(self, "models/onslaught/generator_dead.md3"); self.solid = SOLID_NOT; self.takedamage = DAMAGE_NO; self.event_damage = func_null; self.enemy = world; td_gencount -= 1; - - pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1); WaypointSprite_Kill(self.sprite); } @@ -84,45 +81,86 @@ void td_generator_damage(entity inflictor, entity attacker, float damage, float if(self.health <= 0) td_generator_die(); + + self.SendFlags |= MSF_STATUS; } -void spawnfunc_td_generator() +float td_generator_send(entity to, float sf) { - if not(g_td) { remove(self); return; } - - gendestroyed = FALSE; - - if not(self.health) - self.health = autocvar_g_td_generator_health; + WriteByte(MSG_ENTITY, ENT_CLIENT_GENERATOR); + WriteByte(MSG_ENTITY, sf); + if(sf & MSF_SETUP) + { + WriteCoord(MSG_ENTITY, self.origin_x); + WriteCoord(MSG_ENTITY, self.origin_y); + WriteCoord(MSG_ENTITY, self.origin_z); + } + + if(sf & MSF_STATUS) + { + if(self.health <= 0) + WriteByte(MSG_ENTITY, 0); + else + WriteByte(MSG_ENTITY, ceil((self.health / self.max_health) * 255)); + } + + return TRUE; +} - // precache generator model - precache_model("models/onslaught/generator.md3"); - precache_model("models/onslaught/generator_dead.md3"); +void td_generator_think() +{ + self.think = td_generator_think; + self.nextthink = time + 0.5; +} + +void td_generator_setup() +{ + + self.think = td_generator_think; + self.nextthink = time + 0.1; - self.model = "models/onslaught/generator.md3"; - setmodel(self, self.model); - self.classname = "td_generator"; self.solid = SOLID_BBOX; self.takedamage = DAMAGE_AIM; self.event_damage = td_generator_damage; self.enemy = world; - self.nextthink = -1; - self.think = func_null; self.max_health = self.health; self.movetype = MOVETYPE_NONE; self.monster_attack = TRUE; - td_gencount += 1; self.netname = "Generator"; - setsize(self, GENERATOR_MIN, GENERATOR_MAX); - - droptofloor(); + self.SendFlags |= MSF_SETUP; WaypointSprite_SpawnFixed(self.netname, self.origin + '0 0 60', self, sprite, RADARICON_OBJECTIVE, '1 0.5 0'); WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health); WaypointSprite_UpdateHealth(self.sprite, self.health); } +void td_generator_link() +{ + Net_LinkEntity(self, TRUE, 0, td_generator_send); + self.think = td_generator_setup; + self.nextthink = time; +} + +void spawnfunc_td_generator() +{ + if not(g_td) { remove(self); return; } + + gendestroyed = FALSE; + + if not(self.health) + self.health = autocvar_g_td_generator_health; + + self.classname = "td_generator"; + td_gencount += 1; + + setsize(self, GENERATOR_MIN, GENERATOR_MAX); + + droptofloor(); + + td_generator_link(); +} + entity PickGenerator() { entity generator, head; diff --git a/qcsrc/server/mutators/gamemode_towerdefense.qh b/qcsrc/server/mutators/gamemode_towerdefense.qh index 513cb9287..7cd002589 100644 --- a/qcsrc/server/mutators/gamemode_towerdefense.qh +++ b/qcsrc/server/mutators/gamemode_towerdefense.qh @@ -57,6 +57,4 @@ float current_phase; .float ignoreturrets; // Generator -float gendestroyed; -#define GENERATOR_MIN '-52 -52 -14' -#define GENERATOR_MAX '52 52 75' \ No newline at end of file +float gendestroyed; \ No newline at end of file