]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/minigames/sv_minigames.qc
Impulses: migration pathway
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / minigames / sv_minigames.qc
index 44653ae9410436f70860fc5d831ab05e1ccb1548..672f7f0bdff3b6720263fb3e0360f7ade90732c9 100644 (file)
@@ -15,7 +15,7 @@ void minigame_rmplayer(entity minigame_session, entity player)
 {
        entity e;
        entity p = minigame_session.minigame_players;
-       
+
        if ( p.minigame_players == player )
        {
                if ( p.list_next == world )
@@ -51,8 +51,6 @@ void minigame_rmplayer(entity minigame_session, entity player)
 
 
 #define FIELD(Flags, Type,Name) if ( sf & (Flags) ) Write##Type(MSG_ENTITY, self.Name);
-#define WriteVector(to,Name) WriteCoord(to,Name##_x); WriteCoord(to,Name##_y); WriteCoord(to,Name##_z)
-#define WriteVector2D(to,Name) WriteCoord(to,Name##_x); WriteCoord(to,Name##_y)
 #define MSLE(Name,Fields) \
        else if ( self.classname == #Name ) { \
                if ( sf & MINIG_SF_CREATE ) WriteString(MSG_ENTITY,self.owner.netname); \
@@ -60,26 +58,26 @@ void minigame_rmplayer(entity minigame_session, entity player)
 
 // Send an entity to a client
 // only use on minigame entities or entities with a minigame owner
-bool minigame_SendEntity(entity to, int sf)
-{SELFPARAM();
-       WriteByte(MSG_ENTITY, ENT_CLIENT_MINIGAME);
+bool minigame_SendEntity(entity this, entity to, int sf)
+{
+       WriteHeader(MSG_ENTITY, ENT_CLIENT_MINIGAME);
        WriteByte(MSG_ENTITY, sf);
-       
+
        if ( sf & MINIG_SF_CREATE )
        {
                WriteShort(MSG_ENTITY,msle_id(self.classname));
                WriteString(MSG_ENTITY,self.netname);
        }
-       
+
        entity minigame_ent = self.owner;
-       
+
        if ( self.classname == "minigame" )
        {
                minigame_ent = self;
-               
+
                if ( sf & MINIG_SF_CREATE )
                        WriteString(MSG_ENTITY,self.descriptor.netname);
-               
+
                if ( sf & MINIG_SF_UPDATE )
                        WriteLong(MSG_ENTITY,self.minigame_flags);
        }
@@ -94,11 +92,11 @@ bool minigame_SendEntity(entity to, int sf)
                        WriteByte(MSG_ENTITY,self.team);
        }
        MINIGAME_SIMPLELINKED_ENTITIES
-       
+
        minigame_ent.minigame_event(minigame_ent,"network_send",self,sf);
-       
+
        return true;
-       
+
 }
 #undef FIELD
 #undef MSLE
@@ -131,13 +129,11 @@ int minigame_addplayer(entity minigame_session, entity player)
                        return 0;
                minigame_rmplayer(player.active_minigame,player);
        }
-       
-       int mgteam = minigame_session.minigame_event(minigame_session,"join",player);
-       
+       entity player_pointer = new(minigame_player);
+       int mgteam = minigame_session.minigame_event(minigame_session,"join",player,player_pointer);
+
        if ( mgteam )
        {
-               entity player_pointer = spawn();
-               player_pointer.classname = "minigame_player";
                player_pointer.owner = minigame_session;
                player_pointer.minigame_players = player;
                player_pointer.team = mgteam;
@@ -154,12 +150,13 @@ int minigame_addplayer(entity minigame_session, entity player)
                }
                if ( autocvar_sv_minigames_observer == 2 )
                        player.team_forced = -1;
-               
+
                minigame_resend(minigame_session);
        }
+       else { remove(player_pointer); }
        GameLogEcho(strcat(":minigame:join",(mgteam?"":"fail"),":",minigame_session.netname,":",
                ftos(num_for_edict(player)),":",player.netname));
-       
+
        return mgteam;
 }
 
@@ -167,12 +164,11 @@ entity start_minigame(entity player, string minigame )
 {
        if ( !autocvar_sv_minigames || !IS_REAL_CLIENT(player) )
                return world;
-       
+
        entity e = minigame_get_descriptor(minigame);
-       if ( e ) 
+       if ( e )
        {
-               entity minig = spawn();
-               minig.classname = "minigame";
+               entity minig = new(minigame);
                minig.netname = strzone(strcat(e.netname,"_",ftos(num_for_edict(minig))));
                minig.descriptor = e;
                minig.minigame_event = e.minigame_event;
@@ -185,7 +181,7 @@ entity start_minigame(entity player, string minigame )
                        return world;
                }
                Net_LinkEntity(minig, false, 0, minigame_SendEntity);
-               
+
                if ( !minigame_sessions )
                        minigame_sessions = minig;
                else
@@ -196,7 +192,7 @@ entity start_minigame(entity player, string minigame )
                }
                return minig;
        }
-               
+
        return world;
 }
 
@@ -204,7 +200,7 @@ entity join_minigame(entity player, string game_id )
 {
        if ( !autocvar_sv_minigames || !IS_REAL_CLIENT(player) )
                return world;
-       
+
        entity minig;
        for ( minig = minigame_sessions; minig != world; minig = minig.list_next )
        {
@@ -212,14 +208,14 @@ entity join_minigame(entity player, string game_id )
                if ( minigame_addplayer(minig,player) )
                        return minig;
        }
-       
+
        return world;
 }
 
 void part_minigame(entity player )
 {
        entity minig = player.active_minigame;
-       
+
        if ( minig && minig.classname == "minigame" )
                minigame_rmplayer(minig,player);
 }
@@ -230,11 +226,11 @@ void end_minigame(entity minigame_session)
                minigame_session.owner.list_next = minigame_session.list_next;
        else
                minigame_sessions = minigame_session.list_next;
-       
+
        minigame_session.minigame_event(minigame_session,"end");
        GameLogEcho(strcat(":minigame:end:",minigame_session.netname));
-       
-       
+
+
        entity e = world;
        while( (e = findentity(e, owner, minigame_session)) )
                if ( e.minigame_autoclean )
@@ -242,7 +238,7 @@ void end_minigame(entity minigame_session)
                        LOG_TRACE("SV Auto-cleaned: ",ftos(num_for_edict(e)), " (",e.classname,")\n");
                        remove(e);
                }
-       
+
        entity p;
        for ( e = minigame_session.minigame_players; e != world; e = p )
        {
@@ -250,7 +246,7 @@ void end_minigame(entity minigame_session)
                player_clear_minigame(e.minigame_players);
                remove(e);
        }
-       
+
        strunzone(minigame_session.netname);
        remove(minigame_session);
 }
@@ -263,25 +259,6 @@ void end_minigames()
        }
 }
 
-void initialize_minigames()
-{
-       entity last_minig = world;
-       entity minig;
-       #define MINIGAME(name,nicename) \
-               minig = spawn(); \
-               minig.classname = "minigame_descriptor"; \
-               minig.netname = #name; \
-               minig.message = nicename; \
-               minig.minigame_event = name##_server_event; \
-               if ( !last_minig ) minigame_descriptors = minig; \
-               else last_minig.list_next = minig; \
-               last_minig = minig;
-               
-       REGISTERED_MINIGAMES
-       
-       #undef MINIGAME
-}
-
 string invite_minigame(entity inviter, entity player)
 {
        if ( !inviter || !inviter.active_minigame )
@@ -292,13 +269,13 @@ string invite_minigame(entity inviter, entity player)
                return "You can't invite yourself";
        if ( player.active_minigame == inviter.active_minigame )
                return strcat(player.netname," is already playing");
-       
-       Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_MINIGAME_INVITE, 
+
+       Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_MINIGAME_INVITE,
                inviter.active_minigame.netname, inviter.netname );
-       
+
        GameLogEcho(strcat(":minigame:invite:",inviter.active_minigame.netname,":",
                ftos(num_for_edict(player)),":",player.netname));
-       
+
        return "";
 }
 
@@ -313,12 +290,13 @@ entity minigame_find_player(entity client)
        return world;
 }
 
-bool MinigameImpulse(int imp)
-{SELFPARAM();
-       entity e = minigame_find_player(self);
-       if ( imp && self.active_minigame && e )
+bool MinigameImpulse(entity this, int imp)
+{
+       if (!this.active_minigame) return false;
+       entity e = minigame_find_player(this);
+       if ( imp && this.active_minigame && e )
        {
-               return self.active_minigame.minigame_event(self.active_minigame,"impulse",e,imp);
+               return this.active_minigame.minigame_event(this.active_minigame,"impulse",e,imp);
        }
        return false;
 }
@@ -332,7 +310,7 @@ void ClientCommand_minigame(int request, int argc, string command)
                sprint(self,"Minigames are not enabled!\n");
                return;
        }
-       
+
        if (request == CMD_REQUEST_COMMAND )
        {
                string minig_cmd = argv(1);
@@ -359,9 +337,10 @@ void ClientCommand_minigame(int request, int argc, string command)
                }
                else if ( minig_cmd == "list" )
                {
-                       entity e;
-                       for ( e = minigame_descriptors; e != world; e = e.list_next )
-                               sprint(self,e.netname," (",e.message,") ","\n");
+                       FOREACH(Minigames, true, LAMBDA(
+                       {
+                               sprint(self,it.netname," (",it.message,") ","\n");
+                       }));
                        return;
                }
                else if ( minig_cmd == "list-sessions" )
@@ -407,11 +386,11 @@ void ClientCommand_minigame(int request, int argc, string command)
                        int arg_c = tokenize_console(subcommand);
                        if ( self.active_minigame.minigame_event(self.active_minigame,"cmd",e,arg_c,subcommand) )
                                return;
-                               
+
                }
                else sprint(self,strcat("Wrong command:^1 ",command,"\n"));
        }
-       
+
        sprint(self, "\nUsage:^3 cmd minigame create <minigame>\n");
        sprint(self, "  Start a new minigame session\n");
        sprint(self, "Usage:^3 cmd minigame join <session>\n");