X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmutators%2Fmutator%2Fwaypoints%2Fwaypointsprites.qc;h=7fa9181f2060f7b659e1e7e0b5bb00948706f5e3;hp=2015acb5f8cda0d73408d9794465873fbf1b5aa6;hb=e9f30b97435c6afe3d6911f21e1f4fd1b97e93da;hpb=ef74e1ba8e890befb4a4892a96d244a66c05fd48 diff --git a/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc b/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc index 2015acb5f..7fa9181f2 100644 --- a/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc +++ b/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc @@ -1,20 +1,30 @@ #include "waypointsprites.qh" +#ifdef IMPLEMENTATION + REGISTER_MUTATOR(waypointsprites, true); +REGISTER_NET_LINKED(waypointsprites) + #ifdef SVQC /** flags origin [team displayrule] [spritename] [spritename2] [spritename3] [lifetime maxdistance hideable] */ -float WaypointSprite_SendEntity(entity to, float sendflags) -{SELFPARAM(); - WriteMutator(MSG_ENTITY, waypointsprites); +bool WaypointSprite_SendEntity(entity this, entity to, float sendflags) +{ + WriteHeader(MSG_ENTITY, waypointsprites); sendflags = sendflags & 0x7F; - if (g_nexball) - sendflags &= ~0x80; - else if (self.max_health || (self.pain_finished && (time < self.pain_finished + 0.25))) + if (self.max_health || (self.pain_finished && (time < self.pain_finished + 0.25))) sendflags |= 0x80; + int f = 0; + if(self.currentammo) + f |= 1; // hideable + if(self.exteriormodeltoclient == to) + f |= 2; // my own + + MUTATOR_CALLHOOK(SendWaypoint, this, to, sendflags, f); + WriteByte(MSG_ENTITY, sendflags); WriteByte(MSG_ENTITY, self.wp_extra); @@ -60,27 +70,6 @@ float WaypointSprite_SendEntity(entity to, float sendflags) WriteCoord(MSG_ENTITY, self.fade_time); WriteCoord(MSG_ENTITY, self.teleport_time); WriteShort(MSG_ENTITY, self.fade_rate); // maxdist - float f = 0; - if (self.currentammo) - f |= 1; // hideable - if (self.exteriormodeltoclient == to) - f |= 2; // my own - if (g_onslaught) - { - if (self.owner.classname == "onslaught_controlpoint") - { - entity wp_owner = self.owner; - entity e = WaypointSprite_getviewentity(to); - if (SAME_TEAM(e, wp_owner) && wp_owner.goalentity.health >= wp_owner.goalentity.max_health) { f |= 2; } - if (!ons_ControlPoint_Attackable(wp_owner, e.team)) { f |= 2; } - } - if (self.owner.classname == "onslaught_generator") - { - entity wp_owner = self.owner; - if (wp_owner.isshielded && wp_owner.health >= wp_owner.max_health) { f |= 2; } - if (wp_owner.health <= 0) { f |= 2; } - } - } WriteByte(MSG_ENTITY, f); } @@ -110,9 +99,7 @@ float WaypointSprite_SendEntity(entity to, float sendflags) #ifdef CSQC void Ent_WaypointSprite(); -MUTATOR_HOOKFUNCTION(waypointsprites, CSQC_Ent_Update) { - if (MUTATOR_RETURNVALUE) return false; - if (!ReadMutatorEquals(mutator_argv_int_0, waypointsprites)) return false; +NET_HANDLE(waypointsprites, bool isnew) { Ent_WaypointSprite(); return true; } @@ -210,8 +197,8 @@ void Ent_WaypointSprite() if (sendflags & 32) { int f = ReadByte(); - self.teamradar_icon = (f & 0x7F); - if (f & 0x80) + self.teamradar_icon = f & BITS(7); + if (f & BIT(7)) { self.(teamradar_times[self.teamradar_time_index]) = time; self.teamradar_time_index = (self.teamradar_time_index + 1) % MAX_TEAMRADAR_TIMES; @@ -237,29 +224,29 @@ float spritelookupblinkvalue(string s) if (get_weaponinfo(self.wp_extra).spawnflags & WEP_FLAG_SUPERWEAPON) return 2; } - if (s == WP_Item.netname) return ITEMS[self.wp_extra].m_waypointblink; + if (s == WP_Item.netname) return Items_from(self.wp_extra).m_waypointblink; return 1; } -vector spritelookupcolor(string s, vector def) -{SELFPARAM(); - if (s == WP_Weapon.netname) return get_weaponinfo(self.wp_extra).wpcolor; - if (s == WP_Item.netname) return ITEMS[self.wp_extra].m_color; - if (s == WP_Buff.netname) return BUFFS[self.wp_extra].m_color; +vector spritelookupcolor(entity this, string s, vector def) +{ + if (s == WP_Weapon.netname || s == RADARICON_Weapon.netname) return get_weaponinfo(this.wp_extra).wpcolor; + if (s == WP_Item.netname || s == RADARICON_Item.netname) return Items_from(this.wp_extra).m_color; + if (s == WP_Buff.netname || s == RADARICON_Buff.netname) return Buffs_from(this.wp_extra).m_color; return def; } string spritelookuptext(string s) {SELFPARAM(); if (s == WP_RaceStartFinish.netname) return (race_checkpointtime || race_mycheckpointtime) ? _("Finish") : _("Start"); - if (s == WP_Weapon.netname) return get_weaponinfo(self.wp_extra).message; - if (s == WP_Item.netname) return ITEMS[self.wp_extra].m_waypoint; - if (s == WP_Buff.netname) return BUFFS[self.wp_extra].m_prettyName; + if (s == WP_Weapon.netname) return get_weaponinfo(self.wp_extra).m_name; + if (s == WP_Item.netname) return Items_from(self.wp_extra).m_waypoint; + if (s == WP_Buff.netname) return Buffs_from(self.wp_extra).m_prettyName; if (s == WP_Monster.netname) return get_monsterinfo(self.wp_extra).monster_name; // need to loop, as our netname could be one of three - FOREACH(WAYPOINTS, it.netname == s, LAMBDA( + FOREACH(Waypoints, it.netname == s, LAMBDA( return it.m_name; )); @@ -455,8 +442,8 @@ vector fixrgbexcess(vector rgb) return rgb; } -void Draw_WaypointSprite() -{SELFPARAM(); +void Draw_WaypointSprite(entity this) +{ if (self.lifetime) self.alpha = pow(bound(0, (self.fadetime - time) / self.lifetime, 1), waypointsprite_timealphaexponent); else @@ -529,7 +516,7 @@ void Draw_WaypointSprite() else if (self.maxdistance > 0) a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha; - vector rgb = spritelookupcolor(spriteimage, self.teamradar_color); + vector rgb = spritelookupcolor(self, spriteimage, self.teamradar_color); if (rgb == '0 0 0') { self.teamradar_color = '1 0 1'; @@ -827,10 +814,11 @@ void WaypointSprite_UpdateRule(entity e, float t, float r) e.SendFlags |= 1; } -void WaypointSprite_UpdateTeamRadar(entity e, float icon, vector col) +void WaypointSprite_UpdateTeamRadar(entity e, entity icon, vector col) { // no check, as this is never called without doing an actual change (usually only once) - e.cnt = (icon & 0x7F) | (e.cnt & 0x80); + int i = icon.m_id; + e.cnt = (e.cnt & BIT(7)) | (i & BITS(7)); e.colormod = col; e.SendFlags |= 32; } @@ -841,7 +829,7 @@ void WaypointSprite_Ping(entity e) if (time < e.waypointsprite_pingtime) return; e.waypointsprite_pingtime = time + 0.3; // ALWAYS sends (this causes a radar circle), thus no check - e.cnt |= 0x80; + e.cnt |= BIT(7); e.SendFlags |= 32; } @@ -984,13 +972,13 @@ float WaypointSprite_Customize() return self.waypointsprite_visible_for_player(e); } -float WaypointSprite_SendEntity(entity to, float sendflags); +bool WaypointSprite_SendEntity(entity this, entity to, float sendflags); void WaypointSprite_Reset() {SELFPARAM(); // if a WP wants to time out, let it time out immediately; other WPs ought to be reset/killed by their owners - if (self.fade_time) // there was there before: || g_keyhunt, do we really need this? + if (self.fade_time) WaypointSprite_Kill(self); } @@ -1001,10 +989,11 @@ entity WaypointSprite_Spawn( entity showto, float t, // show to whom? Use a flag to indicate a team entity own, .entity ownfield, // remove when own gets killed float hideable, // true when it should be controlled by cl_hidewaypoints - float icon // initial icon + entity icon // initial icon ) { entity wp = new(sprite_waypoint); + make_pure(wp); wp.teleport_time = time + _lifetime; wp.fade_time = _lifetime; wp.exteriormodeltoclient = ref; @@ -1033,7 +1022,7 @@ entity WaypointSprite_Spawn( wp.customizeentityforclient = WaypointSprite_Customize; wp.waypointsprite_visible_for_player = WaypointSprite_visible_for_player; wp.reset2 = WaypointSprite_Reset; - wp.cnt = icon; + wp.cnt = icon.m_id; wp.colormod = spr.m_color; Net_LinkEntity(wp, false, 0, WaypointSprite_SendEntity); return wp; @@ -1044,7 +1033,7 @@ entity WaypointSprite_SpawnFixed( vector ofs, entity own, .entity ownfield, - float icon // initial icon + entity icon // initial icon ) { return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, true, icon); @@ -1054,7 +1043,7 @@ entity WaypointSprite_DeployFixed( entity spr, float limited_range, vector ofs, - float icon // initial icon + entity icon // initial icon ) {SELFPARAM(); float t; @@ -1073,7 +1062,7 @@ entity WaypointSprite_DeployFixed( entity WaypointSprite_DeployPersonal( entity spr, vector ofs, - float icon // initial icon + entity icon // initial icon ) {SELFPARAM(); return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, self, waypointsprite_deployed_personal, false, icon); @@ -1082,7 +1071,7 @@ entity WaypointSprite_DeployPersonal( entity WaypointSprite_Attach( entity spr, float limited_range, - float icon // initial icon + entity icon // initial icon ) {SELFPARAM(); float t; @@ -1103,15 +1092,15 @@ entity WaypointSprite_Attach( entity WaypointSprite_AttachCarrier( entity spr, entity carrier, - float icon // initial icon and color + entity icon // initial icon and color ) { WaypointSprite_Kill(carrier.waypointsprite_attached); // FC overrides attached entity e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, false, icon); if (e) { - WaypointSprite_UpdateMaxHealth(e, '1 0 0' * healtharmor_maxdamage(start_health, start_armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_WEAPON) * 2); - WaypointSprite_UpdateHealth(e, '1 0 0' * healtharmor_maxdamage(carrier.health, carrier.armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_WEAPON)); + WaypointSprite_UpdateMaxHealth(e, '1 0 0' * healtharmor_maxdamage(start_health, start_armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_WEAPON.m_id) * 2); + WaypointSprite_UpdateHealth(e, '1 0 0' * healtharmor_maxdamage(carrier.health, carrier.armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_WEAPON.m_id)); } return e; } @@ -1147,3 +1136,4 @@ void WaypointSprite_PlayerGone() WaypointSprite_DetachCarrier(self); } #endif +#endif