]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/portals.qc
gmqcc has vector bit operations now. Switch to using them.
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / portals.qc
index 76af253dca5c0f3bd3b5785134f9c378687fdf8c..bf3772090d35bab537a6bdc0935b688841f1d0f9 100644 (file)
@@ -146,7 +146,7 @@ float Portal_TeleportPlayer(entity teleporter, entity player)
        //print(vtos(to), "\n");
 
        // ang_x stuff works around weird quake angles
-       if(player.classname == "player")
+       if(IS_PLAYER(player))
                ang = Portal_ApplyTransformToPlayerAngle(transform, player.v_angle);
        else
                ang = AnglesTransform_ApplyToAngles(transform, player.angles);
@@ -154,8 +154,11 @@ float Portal_TeleportPlayer(entity teleporter, entity player)
        // factor -1 allows chaining portals, but may be weird
        player.right_vector = -1 * AnglesTransform_Apply(transform, player.right_vector);
 
-       if(player.flagcarried)
-               DropFlag(player.flagcarried, player, world);
+       entity oldself = self;
+       self = player;
+       MUTATOR_CALLHOOK(PortalTeleport);
+       player = self;
+       self = oldself;
 
        if not(teleporter.enemy)
        {
@@ -169,7 +172,7 @@ float Portal_TeleportPlayer(entity teleporter, entity player)
        {
                // telefrag within 1 second of portal creation = amazing
                if(time < teleporter.teleport_time + 1)
-                       AnnounceTo(player, "amazing");
+                       Send_Notification(NOTIF_ONE, player, MSG_ANNCE, ANNCE_ACHIEVEMENT_AMAZING);
        }
 
        if not(teleporter.enemy)
@@ -241,7 +244,7 @@ void Portal_Touch()
        if(self.solid != SOLID_TRIGGER)
                return; // possibly engine bug
 
-       if(other.classname == "player")
+       if(IS_PLAYER(other))
                return; // handled by think
 #endif
 
@@ -274,11 +277,11 @@ void Portal_Touch()
                        return;
                }
        if(other != self.aiment)
-               if(other.classname == "player")
+               if(IS_PLAYER(other))
                        if(IS_INDEPENDENT_PLAYER(other) || IS_INDEPENDENT_PLAYER(self.aiment))
                                return; // cannot go through someone else's portal
        if(other.aiment != self.aiment)
-               if(other.aiment.classname == "player")
+               if(IS_PLAYER(other.aiment))
                        if(IS_INDEPENDENT_PLAYER(other.aiment) || IS_INDEPENDENT_PLAYER(self.aiment))
                                return; // cannot go through someone else's portal
        fixedmakevectors(self.mangle);
@@ -306,8 +309,8 @@ void Portal_MakeBrokenPortal(entity portal)
 {
        portal.skin = 2;
        portal.solid = SOLID_NOT;
-       portal.touch = SUB_Null;
-       portal.think = SUB_Null;
+       portal.touch = func_null;
+       portal.think = func_null;
        portal.effects = 0;
        portal.nextthink = 0;
        portal.takedamage = DAMAGE_NO;
@@ -317,8 +320,8 @@ void Portal_MakeWaitingPortal(entity portal)
 {
        portal.skin = 2;
        portal.solid = SOLID_NOT;
-       portal.touch = SUB_Null;
-       portal.think = SUB_Null;
+       portal.touch = func_null;
+       portal.think = func_null;
        portal.effects = EF_ADDITIVE;
        portal.nextthink = 0;
        portal.takedamage = DAMAGE_YES;
@@ -339,8 +342,8 @@ void Portal_MakeOutPortal(entity portal)
 {
        portal.skin = 1;
        portal.solid = SOLID_NOT;
-       portal.touch = SUB_Null;
-       portal.think = SUB_Null;
+       portal.touch = func_null;
+       portal.think = func_null;
        portal.effects = EF_STARDUST | EF_BLUE;
        portal.nextthink = 0;
        portal.takedamage = DAMAGE_YES;
@@ -395,14 +398,14 @@ void Portal_Remove(entity portal, float killed)
        if(killed)
        {
                fixedmakevectors(portal.mangle);
-               sound(portal, CH_SHOTS, "porto/explode.wav", VOL_BASE, ATTN_NORM);
+               sound(portal, CH_SHOTS, "porto/explode.wav", VOL_BASE, ATTEN_NORM);
                pointparticles(particleeffectnum("rocket_explode"), portal.origin + v_forward * 16, v_forward * 1024, 4);
                remove(portal);
        }
        else
        {
                Portal_MakeBrokenPortal(portal);
-               sound(portal, CH_SHOTS, "porto/expire.wav", VOL_BASE, ATTN_NORM);
+               sound(portal, CH_SHOTS, "porto/expire.wav", VOL_BASE, ATTEN_NORM);
                SUB_SetFade(portal, time, 0.5);
        }
 }
@@ -476,7 +479,7 @@ void Portal_Think()
 
 float Portal_Customize()
 {
-       if(other.classname == "spectator")
+       if(IS_SPEC(other))
                other = other.enemy;
        if(other == self.aiment)
        {