]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
new functions for g_superspectate: cmd autospec [strength|shield|mega_health|mega_arm...
authorJakob MG <jakob_mg@hotmail.com>
Sat, 25 Aug 2012 16:08:09 +0000 (18:08 +0200)
committerJakob MG <jakob_mg@hotmail.com>
Sat, 25 Aug 2012 16:08:09 +0000 (18:08 +0200)
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/base.qh
qcsrc/server/mutators/mutator_superspec.qc
qcsrc/server/t_items.qc

index 1e8cb45aa8b56df58ba1f15717a950c3d42e9f15..bb0d5280356957aba68f7b696362db8a94680fa8 100644 (file)
@@ -95,6 +95,7 @@ string STR_OBSERVER = "observer";
 #define FOR_EACH_CLIENT(v) FOR_EACH_CLIENTSLOT(v) if(v.flags & FL_CLIENT)
 #define FOR_EACH_REALCLIENT(v) FOR_EACH_CLIENT(v) if(clienttype(v) == CLIENTTYPE_REAL)
 #define FOR_EACH_PLAYER(v) FOR_EACH_CLIENT(v) if(v.classname == STR_PLAYER)
+#define FOR_EACH_SPEC(v) FOR_EACH_CLIENT(v) if(v.classname != STR_PLAYER)
 #define FOR_EACH_REALPLAYER(v) FOR_EACH_REALCLIENT(v) if(v.classname == STR_PLAYER)
 #endif
 
index 236e311b6a0cb8c0fa7fa39631678b8b46f6ab64..2ab407e1c9d9267789e8c40c664c141a8721f1bf 100644 (file)
@@ -212,3 +212,8 @@ MUTATOR_HOOKABLE(SetWeaponreplace);
                entity other; // weapon info
        // IN+OUT
                string ret_string;
+
+MUTATOR_HOOKABLE(ItemTouch);
+       // called at when a item is touched. Called early, can edit item properties.
+       entity self;    // item
+       entity other;   // player
index 2adef63df180e9ecca21bff9e0274d96a54b156a..5e5e44460bc07a181323331e7d8fdf1abe461c64 100644 (file)
@@ -1,3 +1,11 @@
+#define ASF_STRENGTH 1
+#define ASF_SHIELD 2
+#define ASF_MEGA_AR 4
+#define ASF_MEGA_HP 8
+#define ASF_ALL 0xFFFFFF
+
+.float autospec_flags;
+
 float _spectate(entity _player)
 {
        if(SpectateNext(_player) == 1)
@@ -8,6 +16,25 @@ float _spectate(entity _player)
        return TRUE;
 }
 
+MUTATOR_HOOKFUNCTION(superspec_ItemTouch)
+{
+       entity _oldself = self;
+       entity _item = self;
+       
+       FOR_EACH_SPEC(self)
+       {
+               if( (self.autospec_flags & ASF_SHIELD && _item.invincible_finished) ||
+                       (self.autospec_flags & ASF_STRENGTH && _item.strength_finished) ||
+                       (self.autospec_flags & ASF_MEGA_AR && _item.classname == "item_armor_large") ||
+                       (self.autospec_flags & ASF_MEGA_HP && _item.classname == "item_health_mega") )          
+                               _spectate(other);
+       }
+       
+       self = _oldself;
+       
+       return FALSE;
+}
+
 MUTATOR_HOOKFUNCTION(superspec_SV_ParseClientCommand)
 {
        if(MUTATOR_RETURNVALUE) // command was already handled?
@@ -16,6 +43,62 @@ MUTATOR_HOOKFUNCTION(superspec_SV_ParseClientCommand)
        if(self.classname == "player")
                return FALSE;
 
+       if(cmd_name == "autospec")
+       {
+               if(cmd_argc > 1)
+               {
+#define STRING2FLAG(str,flg) if(argv(i) == str) _bits |= flg
+                       float i, _bits, _start = 1;
+                       if(argv(1) == "clear")
+                       {
+                               self.autospec_flags = 0;
+                               _start = 2;
+                       }
+
+                       for(i = _start; i < cmd_argc; ++i)
+                       {
+                               if(argv(i) == "on" || argv(i) == "1")ยง
+                               {
+                                       self.autospec_flags |= _bits;
+                                       _bits = 0;
+                               }
+                               else if(argv(i) == "off" || argv(i) == "0")
+                               {
+                                       if(_start == 1)
+                                               self.autospec_flags &~= _bits;
+
+                                       _bits = 0;
+                               }
+                               else
+                               {
+                                       STRING2FLAG("strength", ASF_STRENGTH);
+                                       STRING2FLAG("shield", ASF_SHIELD);
+                                       STRING2FLAG("mega_health", ASF_MEGA_HP);
+                                       STRING2FLAG("mega_armor", ASF_MEGA_AR);
+                                       STRING2FLAG("all", ASF_ALL);
+                               }
+                       }
+               }
+               
+               string _aspeco = "^3Current auto spectate options are:\n\n\n\n\n";
+#undef STRING2FLAG
+
+#define SPECOCLR(var,test,text) \
+    var = strcat(var, ((self.autospec_flags & test) ? "^2" : "^1")); \
+    var = strcat(var,text)
+
+               SPECOCLR(_aspeco, ASF_STRENGTH, "Strength\n\n");
+               SPECOCLR(_aspeco, ASF_SHIELD, "Shiled\n\n");
+               SPECOCLR(_aspeco, ASF_MEGA_HP, "Mega Health\n\n");
+               SPECOCLR(_aspeco, ASF_MEGA_AR, "Mega Armor\n\n");
+#undef SPECOCLR
+
+               centerprint(self, _aspeco);
+               return TRUE;            
+               
+               return TRUE;
+       }
+       
        if(cmd_name == "followpowerup")
        {
                entity _player;
@@ -120,6 +203,7 @@ MUTATOR_DEFINITION(mutator_superspec)
        MUTATOR_HOOK(BuildMutatorsString, superspec_BuildMutatorsString, CBC_ORDER_ANY);
        MUTATOR_HOOK(BuildMutatorsPrettyString, superspec_BuildMutatorsPrettyString, CBC_ORDER_ANY);
        MUTATOR_HOOK(SV_ParseClientCommand, superspec_SV_ParseClientCommand, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ItemTouch, superspec_ItemTouch, CBC_ORDER_ANY);
        //MUTATOR_HOOK(ClientConnect, superspec_ClientConnect, CBC_ORDER_ANY);
        //MUTATOR_HOOK(PlayerSpawn, superspec_PlayerSpawn, CBC_ORDER_ANY);
        //MUTATOR_HOOK(PlayerPreThink, superspec_PlayerPreThink, CBC_ORDER_ANY);
index 13850fcad055312f452f0af2e755b74d19b3ef3b..9ed5acb9299ff9567805abaefa8fd1b55e8c4440 100644 (file)
@@ -747,7 +747,7 @@ float Item_GiveTo(entity item, entity player)
 void Item_Touch (void)
 {
        entity e, head;
-
+       
        // remove the item if it's currnetly in a NODROP brush or hits a NOIMPACT surface (such as sky)
        if(self.classname == "droppedweapon")
        {
@@ -766,6 +766,8 @@ void Item_Touch (void)
                return;
        if (self.owner == other)
                return;
+       if(MUTATOR_CALLHOOK(ItemTouch))
+               return;
 
        if (self.classname == "droppedweapon")
        {