X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmutators%2Fmutator%2Fwaypoints%2Fwaypointsprites.qc;h=7e5f79317f6dc046238f83bf5c8995da2b12b077;hb=06ac66a5edaa645e19ed9a6482409e8656a65b1d;hp=3e82db0b5070220b590070aaf8b8ea823333e5b4;hpb=42a9e3d7ece2c716e5cd6899e90841acb7fb891b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc b/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc index 3e82db0b5..7e5f79317 100644 --- a/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc +++ b/qcsrc/common/mutators/mutator/waypoints/waypointsprites.qc @@ -1,7 +1,5 @@ #include "waypointsprites.qh" -#ifdef IMPLEMENTATION - REGISTER_MUTATOR(waypointsprites, true); REGISTER_NET_LINKED(waypointsprites) @@ -18,12 +16,16 @@ bool WaypointSprite_SendEntity(entity this, entity to, float sendflags) sendflags |= 0x80; int f = 0; - if(this.currentammo) + if(this.currentammo == 1) f |= 1; // hideable if(this.exteriormodeltoclient == to) f |= 2; // my own + if(this.currentammo == 2) + f |= 2; // radar only MUTATOR_CALLHOOK(SendWaypoint, this, to, sendflags, f); + sendflags = M_ARGV(2, int); + f = M_ARGV(3, int); WriteByte(MSG_ENTITY, sendflags); WriteByte(MSG_ENTITY, this.wp_extra); @@ -98,9 +100,9 @@ bool WaypointSprite_SendEntity(entity this, entity to, float sendflags) #endif #ifdef CSQC -void Ent_WaypointSprite(entity this); +void Ent_WaypointSprite(entity this, bool isnew); NET_HANDLE(waypointsprites, bool isnew) { - Ent_WaypointSprite(this); + Ent_WaypointSprite(this, isnew); return true; } @@ -112,7 +114,7 @@ void Ent_RemoveWaypointSprite(entity this) } /** flags origin [team displayrule] [spritename] [spritename2] [spritename3] [lifetime maxdistance hideable] */ -void Ent_WaypointSprite(entity this) +void Ent_WaypointSprite(entity this, bool isnew) { int sendflags = ReadByte(); this.wp_extra = ReadByte(); @@ -121,6 +123,10 @@ void Ent_WaypointSprite(entity this) this.spawntime = time; this.draw2d = Draw_WaypointSprite; + if (isnew) { + IL_PUSH(g_drawables_2d, this); + IL_PUSH(g_radaricons, this); + } InterpolateOrigin_Undo(this); this.iflags |= IFLAG_ORIGIN; @@ -225,6 +231,7 @@ float spritelookupblinkvalue(entity this, string s) return 2; } if (s == WP_Item.netname) return Items_from(this.wp_extra).m_waypointblink; + if(s == WP_FlagReturn.netname) return 2; return 1; } @@ -235,7 +242,7 @@ vector spritelookupcolor(entity this, string s, vector def) if (s == WP_Item.netname || s == RADARICON_Item.netname) return Items_from(this.wp_extra).m_color; if (MUTATOR_CALLHOOK(WP_Format, this, s)) { - return MUTATOR_ARGV(0, vector); + return M_ARGV(2, vector); } return def; } @@ -248,7 +255,7 @@ string spritelookuptext(entity this, string s) if (s == WP_Monster.netname) return get_monsterinfo(this.wp_extra).monster_name; if (MUTATOR_CALLHOOK(WP_Format, this, s)) { - return MUTATOR_ARGV(0, string); + return M_ARGV(3, string); } // need to loop, as our netname could be one of three @@ -452,7 +459,7 @@ vector fixrgbexcess(vector rgb) void Draw_WaypointSprite(entity this) { - if (this.lifetime) + if (this.lifetime > 0) this.alpha = pow(bound(0, (this.fadetime - time) / this.lifetime, 1), waypointsprite_timealphaexponent); else this.alpha = 1; @@ -463,14 +470,12 @@ void Draw_WaypointSprite(entity this) if (autocvar_cl_hidewaypoints >= 2) return; - if (this.hideflags & 1) - if (autocvar_cl_hidewaypoints) - return; // fixed waypoint + if (this.hideflags & 1 && autocvar_cl_hidewaypoints) + return; // fixed waypoint InterpolateOrigin_Do(this); float t = entcs_GetTeam(player_localnum) + 1; - string spriteimage = ""; // choose the sprite @@ -479,7 +484,7 @@ void Draw_WaypointSprite(entity this) case SPRITERULE_SPECTATOR: if (!( (autocvar_g_waypointsprite_itemstime == 1 && t == NUM_SPECTATOR + 1) - || (autocvar_g_waypointsprite_itemstime == 2 && (t == NUM_SPECTATOR + 1 || warmup_stage)) + || (autocvar_g_waypointsprite_itemstime == 2 && (t == NUM_SPECTATOR + 1 || warmup_stage || STAT(ITEMSTIME) == 2)) )) return; spriteimage = this.netname; @@ -513,11 +518,8 @@ void Draw_WaypointSprite(entity this) ++waypointsprite_newcount; - float dist; - dist = vlen(this.origin - view_origin); - - float a; - a = this.alpha * autocvar_hud_panel_fg_alpha; + float dist = vlen(this.origin - view_origin); + float a = this.alpha * autocvar_hud_panel_fg_alpha; if (this.maxdistance > waypointsprite_normdistance) a *= pow(bound(0, (this.maxdistance - dist) / (this.maxdistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent); @@ -535,7 +537,7 @@ void Draw_WaypointSprite(entity this) { if (this.helpme && time < this.helpme) a *= SPRITE_HELPME_BLINK; - else if (!this.lifetime) // fading out waypoints don't blink + else if (this.lifetime > 0) // fading out waypoints don't blink a *= spritelookupblinkvalue(this, spriteimage); } @@ -861,9 +863,10 @@ void WaypointSprite_FadeOutIn(entity e, float t) // ensure: // (e.teleport_time - time) / wp.fade_time stays // e.teleport_time = time + fadetime - float current_fadetime; - current_fadetime = e.teleport_time - time; + float current_fadetime = e.teleport_time - time; e.teleport_time = time + t; + if (e.fade_time < 0) + e.fade_time = -e.fade_time; e.fade_time = e.fade_time * t / current_fadetime; } @@ -880,8 +883,8 @@ void WaypointSprite_Init() void WaypointSprite_Kill(entity wp) { if (!wp) return; - if (wp.owner) wp.owner.(wp.owned_by_field) = world; - remove(wp); + if (wp.owner) wp.owner.(wp.owned_by_field) = NULL; + delete(wp); } void WaypointSprite_Disown(entity wp, float fadetime) @@ -895,9 +898,9 @@ void WaypointSprite_Disown(entity wp, float fadetime) if (wp.owner) { if (wp.exteriormodeltoclient == wp.owner) - wp.exteriormodeltoclient = world; - wp.owner.(wp.owned_by_field) = world; - wp.owner = world; + wp.exteriormodeltoclient = NULL; + wp.owner.(wp.owned_by_field) = NULL; + wp.owner = NULL; WaypointSprite_FadeOutIn(wp, fadetime); } @@ -907,18 +910,18 @@ void WaypointSprite_Think(entity this) { bool doremove = false; - if (self.fade_time && time >= self.teleport_time) + if (this.fade_time && time >= this.teleport_time) { doremove = true; } - if (self.exteriormodeltoclient) - WaypointSprite_UpdateOrigin(self, self.exteriormodeltoclient.origin + self.view_ofs); + if (this.exteriormodeltoclient) + WaypointSprite_UpdateOrigin(this, this.exteriormodeltoclient.origin + this.view_ofs); if (doremove) - WaypointSprite_Kill(self); + WaypointSprite_Kill(this); else - self.nextthink = time; // WHY?!? + this.nextthink = time; // WHY?!? } bool WaypointSprite_visible_for_player(entity this, entity player, entity view) @@ -932,7 +935,7 @@ bool WaypointSprite_visible_for_player(entity this, entity player, entity view) { if (!autocvar_sv_itemstime) return false; - if (!warmup_stage && IS_PLAYER(view)) + if (!warmup_stage && IS_PLAYER(view) && autocvar_sv_itemstime != 2) return false; } else if (this.team && this.rule == SPRITERULE_DEFAULT) @@ -951,7 +954,7 @@ entity WaypointSprite_getviewentity(entity e) if (IS_SPEC(e)) e = e.enemy; /* TODO idea (check this breaks nothing) else if (e.classname == "observer") - e = world; + e = NULL; */ return e; } @@ -963,27 +966,27 @@ float WaypointSprite_isteammate(entity e, entity e2) return e2 == e; } -float WaypointSprite_Customize() -{SELFPARAM(); +bool WaypointSprite_Customize(entity this, entity client) +{ // this is not in SendEntity because it shall run every frame, not just every update // make spectators see what the player would see - entity e = WaypointSprite_getviewentity(other); + entity e = WaypointSprite_getviewentity(client); - if (MUTATOR_CALLHOOK(CustomizeWaypoint, self, other)) + if (MUTATOR_CALLHOOK(CustomizeWaypoint, this, client)) return false; - return self.waypointsprite_visible_for_player(self, other, e); + return this.waypointsprite_visible_for_player(this, client, e); } bool WaypointSprite_SendEntity(entity this, entity to, float sendflags); -void WaypointSprite_Reset() -{SELFPARAM(); +void WaypointSprite_Reset(entity this) +{ // 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) - WaypointSprite_Kill(self); + if (this.fade_time) + WaypointSprite_Kill(this); } entity WaypointSprite_Spawn( @@ -997,8 +1000,10 @@ entity WaypointSprite_Spawn( ) { entity wp = new(sprite_waypoint); + wp.fade_time = _lifetime; // if negative tells client not to fade it out + if(_lifetime < 0) + _lifetime = -_lifetime; wp.teleport_time = time + _lifetime; - wp.fade_time = _lifetime; wp.exteriormodeltoclient = ref; if (ref) { @@ -1014,7 +1019,7 @@ entity WaypointSprite_Spawn( if (own) { if (own.(ownfield)) - remove(own.(ownfield)); + delete(own.(ownfield)); own.(ownfield) = wp; wp.owned_by_field = ownfield; } @@ -1022,7 +1027,7 @@ entity WaypointSprite_Spawn( setthink(wp, WaypointSprite_Think); wp.nextthink = time; wp.model1 = spr.netname; - wp.customizeentityforclient = WaypointSprite_Customize; + setcefc(wp, WaypointSprite_Customize); wp.waypointsprite_visible_for_player = WaypointSprite_visible_for_player; wp.reset2 = WaypointSprite_Reset; wp.cnt = icon.m_id; @@ -1039,19 +1044,20 @@ entity WaypointSprite_SpawnFixed( entity icon // initial icon ) { - return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, true, icon); + return WaypointSprite_Spawn(spr, 0, 0, NULL, ofs, NULL, 0, own, ownfield, true, icon); } entity WaypointSprite_DeployFixed( entity spr, float limited_range, + entity player, vector ofs, entity icon // initial icon ) -{SELFPARAM(); +{ float t; if (teamplay) - t = self.team; + t = player.team; else t = 0; float maxdistance; @@ -1059,29 +1065,31 @@ entity WaypointSprite_DeployFixed( maxdistance = waypointsprite_limitedrange; else maxdistance = 0; - return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, false, icon); + return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, NULL, ofs, NULL, t, player, waypointsprite_deployed_fixed, false, icon); } entity WaypointSprite_DeployPersonal( entity spr, + entity player, vector ofs, entity icon // initial icon ) -{SELFPARAM(); - return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, self, waypointsprite_deployed_personal, false, icon); +{ + return WaypointSprite_Spawn(spr, 0, 0, NULL, ofs, NULL, 0, player, waypointsprite_deployed_personal, false, icon); } entity WaypointSprite_Attach( entity spr, + entity player, float limited_range, entity icon // initial icon ) -{SELFPARAM(); +{ float t; - if (self.waypointsprite_attachedforcarrier) - return world; // can't attach to FC + if (player.waypointsprite_attachedforcarrier) + return NULL; // can't attach to FC if (teamplay) - t = self.team; + t = player.team; else t = 0; float maxdistance; @@ -1089,7 +1097,7 @@ entity WaypointSprite_Attach( maxdistance = waypointsprite_limitedrange; else maxdistance = 0; - return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, false, icon); + return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, player, '0 0 64', NULL, t, player, waypointsprite_attached, false, icon); } entity WaypointSprite_AttachCarrier( @@ -1099,7 +1107,7 @@ entity WaypointSprite_AttachCarrier( ) { 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); + entity e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', NULL, carrier.team, carrier, waypointsprite_attachedforcarrier, false, icon); if (carrier.health) { WaypointSprite_UpdateMaxHealth(e, '1 0 0' * healtharmor_maxdamage(start_health, start_armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_WEAPON.m_id) * 2); @@ -1113,16 +1121,16 @@ void WaypointSprite_DetachCarrier(entity carrier) WaypointSprite_Disown(carrier.waypointsprite_attachedforcarrier, waypointsprite_deadlifetime); } -void WaypointSprite_ClearPersonal() -{SELFPARAM(); - WaypointSprite_Kill(self.waypointsprite_deployed_personal); +void WaypointSprite_ClearPersonal(entity this) +{ + WaypointSprite_Kill(this.waypointsprite_deployed_personal); } -void WaypointSprite_ClearOwned() -{SELFPARAM(); - WaypointSprite_Kill(self.waypointsprite_deployed_fixed); - WaypointSprite_Kill(self.waypointsprite_deployed_personal); - WaypointSprite_Kill(self.waypointsprite_attached); +void WaypointSprite_ClearOwned(entity this) +{ + WaypointSprite_Kill(this.waypointsprite_deployed_fixed); + WaypointSprite_Kill(this.waypointsprite_deployed_personal); + WaypointSprite_Kill(this.waypointsprite_attached); } void WaypointSprite_PlayerDead(entity this) @@ -1131,12 +1139,11 @@ void WaypointSprite_PlayerDead(entity this) WaypointSprite_DetachCarrier(this); } -void WaypointSprite_PlayerGone() -{SELFPARAM(); - WaypointSprite_Disown(self.waypointsprite_deployed_fixed, waypointsprite_deadlifetime); - WaypointSprite_Kill(self.waypointsprite_deployed_personal); - WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime); - WaypointSprite_DetachCarrier(self); +void WaypointSprite_PlayerGone(entity this) +{ + WaypointSprite_Disown(this.waypointsprite_deployed_fixed, waypointsprite_deadlifetime); + WaypointSprite_Kill(this.waypointsprite_deployed_personal); + WaypointSprite_Disown(this.waypointsprite_attached, waypointsprite_deadlifetime); + WaypointSprite_DetachCarrier(this); } #endif -#endif