X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fminigames%2Fsv_minigames.qc;h=672f7f0bdff3b6720263fb3e0360f7ade90732c9;hp=40332796e2b5c41992911f164694bc2f719292dc;hb=64b8409b2d6fb93dc51ba24a82d219c8cd56a907;hpb=a1b328c05f71d4a2f54f9d743dd46c70f5b5e7c8 diff --git a/qcsrc/common/minigames/sv_minigames.qc b/qcsrc/common/minigames/sv_minigames.qc index 40332796e..672f7f0bd 100644 --- a/qcsrc/common/minigames/sv_minigames.qc +++ b/qcsrc/common/minigames/sv_minigames.qc @@ -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,9 +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 WriteFloat WriteCoord #define MSLE(Name,Fields) \ else if ( self.classname == #Name ) { \ if ( sf & MINIG_SF_CREATE ) WriteString(MSG_ENTITY,self.owner.netname); \ @@ -61,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) +bool minigame_SendEntity(entity this, entity to, int sf) { - WriteByte(MSG_ENTITY, ENT_CLIENT_MINIGAME); + 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); } @@ -95,15 +92,14 @@ 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 -#undef WriteFloat // Force resend all minigame entities void minigame_resend(entity minigame) @@ -117,7 +113,7 @@ void minigame_resend(entity minigame) } bool minigame_CheckSend() -{ +{SELFPARAM(); entity e; for ( e = self.owner.minigame_players; e != world; e = e.list_next ) if ( e.minigame_players == other ) @@ -126,20 +122,18 @@ bool minigame_CheckSend() } int minigame_addplayer(entity minigame_session, entity player) -{ +{SELFPARAM(); if ( player.active_minigame ) { if ( player.active_minigame == minigame_session ) 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; @@ -152,19 +146,17 @@ int minigame_addplayer(entity minigame_session, entity player) if ( !IS_OBSERVER(player) && autocvar_sv_minigames_observer ) { - entity e = self; - self = player; - PutObserverInServer(); - self = e; + WITH(entity, self, player, PutObserverInServer()); } 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; } @@ -172,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,12 +176,12 @@ entity start_minigame(entity player, string minigame ) GameLogEcho(strcat(":minigame:start:",minig.netname)); if ( ! minigame_addplayer(minig,player) ) { - dprint("Minigame ",minig.netname," rejected the first player join!\n"); + LOG_TRACE("Minigame ",minig.netname," rejected the first player join!\n"); end_minigame(minig); return world; } Net_LinkEntity(minig, false, 0, minigame_SendEntity); - + if ( !minigame_sessions ) minigame_sessions = minig; else @@ -201,7 +192,7 @@ entity start_minigame(entity player, string minigame ) } return minig; } - + return world; } @@ -209,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 ) { @@ -217,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); } @@ -235,19 +226,19 @@ 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 ) { - dprint("SV Auto-cleaned: ",ftos(num_for_edict(e)), " (",e.classname,")\n"); + 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 ) { @@ -255,7 +246,7 @@ void end_minigame(entity minigame_session) player_clear_minigame(e.minigame_players); remove(e); } - + strunzone(minigame_session.netname); remove(minigame_session); } @@ -268,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 ) @@ -297,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 ""; } @@ -318,12 +290,13 @@ entity minigame_find_player(entity client) return world; } -bool MinigameImpulse(int imp) +bool MinigameImpulse(entity this, int imp) { - entity e = minigame_find_player(self); - if ( imp && self.active_minigame && e ) + 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; } @@ -331,13 +304,13 @@ bool MinigameImpulse(int imp) void ClientCommand_minigame(int request, int argc, string command) -{ +{SELFPARAM(); if ( !autocvar_sv_minigames ) { sprint(self,"Minigames are not enabled!\n"); return; } - + if (request == CMD_REQUEST_COMMAND ) { string minig_cmd = argv(1); @@ -364,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" ) @@ -412,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 \n"); sprint(self, " Start a new minigame session\n"); sprint(self, "Usage:^3 cmd minigame join \n"); @@ -429,4 +403,4 @@ void ClientCommand_minigame(int request, int argc, string command) sprint(self, " Leave the current minigame\n"); sprint(self, "Usage:^3 cmd minigame invite \n"); sprint(self, " Invite the given player to join you in a minigame\n"); -} \ No newline at end of file +}