]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/waypointsprites.qc
gmqcc has vector bit operations now. Switch to using them.
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / waypointsprites.qc
index f78296a143aec71dc7fe05003ec8524af3f8c3a7..a5817fa502addef565a946eaaa55a7bd544f60ff 100644 (file)
@@ -127,9 +127,9 @@ void WaypointSprite_FadeOutIn(entity e, float t)
 
 void WaypointSprite_Init()
 {
-       waypointsprite_limitedrange = autocvar_g_waypointsprite_limitedrange;
-       waypointsprite_deployed_lifetime = autocvar_g_waypointsprite_deployed_lifetime;
-       waypointsprite_deadlifetime = autocvar_g_waypointsprite_deadlifetime;
+       waypointsprite_limitedrange = autocvar_sv_waypointsprite_limitedrange;
+       waypointsprite_deployed_lifetime = autocvar_sv_waypointsprite_deployed_lifetime;
+       waypointsprite_deadlifetime = autocvar_sv_waypointsprite_deadlifetime;
 }
 void WaypointSprite_InitClient(entity e)
 {
@@ -197,39 +197,49 @@ float WaypointSprite_visible_for_player(entity e)
        {
                if(self.team != e.team)
                        return FALSE;
-               if(e.classname != "player")
+               if not(IS_PLAYER(e))
                        return FALSE;
        }
 
        return TRUE;
 }
 
+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;
+       */
+       return e;
+}
+
+float WaypointSprite_isteammate(entity e, entity e2)
+{
+       if(teamplay)
+       {
+               if(e2.team != e.team)
+                       return FALSE;
+       }
+       else
+       {
+               if(e2 != e)
+                       return FALSE;
+       }
+       return TRUE;
+}
+
 float WaypointSprite_Customize()
 {
        // 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;
-       e = other;
-       if(e.classname == "spectator")
-               e = e.enemy;
+       e = WaypointSprite_getviewentity(other);
 
-       // as a GENERAL rule:
-       // if you have the invisibility powerup, sprites ALWAYS are restricted to your team
-       // but only apply this to real players, not to spectators
-       if(g_minstagib && (self.owner.items & IT_STRENGTH) && (e == other))
-       {
-               if(teamplay)
-               {
-                       if(self.owner.team != e.team)
-                               return FALSE;
-               }
-               else
-               {
-                       if(self.owner != e)
-                               return FALSE;
-               }
-       }
+       if(MUTATOR_CALLHOOK(CustomizeWaypoint))
+               return FALSE;
 
        return self.waypointsprite_visible_for_player(e);
 }
@@ -243,7 +253,7 @@ float WaypointSprite_SendEntity(entity to, float sendflags)
        sendflags = sendflags & 0x7F;
        
        if(g_nexball)
-               sendflags &~= 0x80;
+               sendflags &= ~0x80;
        else if(self.max_health || (self.pain_finished && (time < self.pain_finished + 0.25)))
                sendflags |= 0x80;
 
@@ -307,12 +317,17 @@ float WaypointSprite_SendEntity(entity to, float sendflags)
                WriteByte(MSG_ENTITY, self.colormod_y * 255.0);
                WriteByte(MSG_ENTITY, self.colormod_z * 255.0);
 
-               dt = (self.waypointsprite_helpmetime - time) / 0.1;
-               if(dt < 0 || (teamplay && self.owner && self.owner.team != to.team)) // don't tell enemies about "HELP ME" (FIXME clean this up to handle spectating/observing well too)
-                       dt = 0;
-               if(dt > 255)
-                       dt = 255;
-               WriteByte(MSG_ENTITY, dt);
+               if(WaypointSprite_isteammate(self.owner, WaypointSprite_getviewentity(to)))
+               {
+                       dt = (self.waypointsprite_helpmetime - time) / 0.1;
+                       if(dt < 0)
+                               dt = 0;
+                       if(dt > 255)
+                               dt = 255;
+                       WriteByte(MSG_ENTITY, dt);
+               }
+               else
+                       WriteByte(MSG_ENTITY, 0);
        }
 
        return TRUE;