Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
sv_minigames.qh File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define REGISTER_MINIGAME(name, nicename)

Enumerations

enum  {
  MINIGAME_COMMON_CMD_ID_CREATE , MINIGAME_COMMON_CMD_ID_JOIN , MINIGAME_COMMON_CMD_ID_LIST , MINIGAME_COMMON_CMD_ID_LIST_SESSIONS ,
  MINIGAME_COMMON_CMD_ID_END , MINIGAME_COMMON_CMD_ID_PART , MINIGAME_COMMON_CMD_ID_INVITE , MINIGAME_COMMON_CMD_COUNT
}

Functions

void ClientCommand_minigame (entity caller, int request, int argc, string command)
void end_minigame (entity minigame_session)
void end_minigames ()
string invite_minigame (entity inviter, entity player)
 Invite a player to join in a minigame.
entity join_minigame (entity player, string game_id)
 Join an existing minigame session.
bool minigame_CheckSend (entity this, entity client)
entity minigame_find_player (entity client)
bool minigame_SendEntity (entity this, entity to, int sf)
bool MinigameImpulse (entity this, int imp)
void part_minigame (entity player)
entity start_minigame (entity player, string minigame)
 Create a new minigame session.

Variables

entity active_minigame
 For players: Minigame being played.
bool autocvar_sv_minigames
bool autocvar_sv_minigames_observer
string MINIGAME_COMMON_CMD [MINIGAME_COMMON_CMD_COUNT]
entity minigame_players
 For minigame sessions: list of players For minigame_player: client entity.
entity minigame_sessions

Macro Definition Documentation

◆ REGISTER_MINIGAME

#define REGISTER_MINIGAME ( name,
nicename )
Value:
REGISTER(Minigames, MINIGAME_##name, m_id, new_pure(minigame_descriptor)); \
int name##_server_event(entity, string, ...); \
REGISTER_INIT(MINIGAME_##name) { \
this.message = nicename; \
this.minigame_event = name##_server_event; \
} \
REGISTER_INIT(MINIGAME_##name)
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
string netname
Definition powerups.qc:20
string message
Definition powerups.qc:19
string strtolower(string s)
int m_id
Definition effect.qh:18
string name
Definition menu.qh:30
string strzone(string s)
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:66
#define REGISTER(...)
Register a new entity with a registry.
Definition registry.qh:121

Definition at line 80 of file sv_minigames.qh.

80#define REGISTER_MINIGAME(name,nicename) \
81 REGISTER(Minigames, MINIGAME_##name, m_id, new_pure(minigame_descriptor)); \
82 int name##_server_event(entity, string, ...); \
83 REGISTER_INIT(MINIGAME_##name) { \
84 this.netname = strzone(strtolower(#name)); \
85 this.message = nicename; \
86 this.minigame_event = name##_server_event; \
87 } \
88 REGISTER_INIT(MINIGAME_##name)

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
MINIGAME_COMMON_CMD_ID_CREATE 
MINIGAME_COMMON_CMD_ID_JOIN 
MINIGAME_COMMON_CMD_ID_LIST 
MINIGAME_COMMON_CMD_ID_LIST_SESSIONS 
MINIGAME_COMMON_CMD_ID_END 
MINIGAME_COMMON_CMD_ID_PART 
MINIGAME_COMMON_CMD_ID_INVITE 
MINIGAME_COMMON_CMD_COUNT 

Definition at line 3 of file sv_minigames.qh.

Function Documentation

◆ ClientCommand_minigame()

void ClientCommand_minigame ( entity caller,
int request,
int argc,
string command )

Definition at line 314 of file sv_minigames.qc.

315{
317 {
318 sprint(caller,"Minigames are not enabled!\n");
319 return;
320 }
321
323 {
324 Send_Notification(NOTIF_ONE_ONLY, caller, MSG_CENTER, CENTER_JOIN_PLAYBAN);
325 sprint(caller, "You aren't allowed to play minigames because you are banned from them in this server.\n");
326 return;
327 }
328
329 if (request == CMD_REQUEST_COMMAND )
330 {
331 string minig_cmd = argv(1);
332 if ( minig_cmd == MINIGAME_CMD(CREATE) && argc > 2 )
333 {
334 entity minig = start_minigame(caller, argv(2));
335 if ( minig )
336 sprint(caller,"Created minigame session: ",minig.netname,"\n");
337 else
338 sprint(caller,"Cannot start minigame session!\n");
339 return;
340 }
341 else if ( minig_cmd == MINIGAME_CMD(JOIN) && argc > 2 )
342 {
343 entity minig = join_minigame(caller, argv(2));
344 if ( minig )
345 sprint(caller,"Joined: ",minig.netname,"\n");
346 else
347 {
348 Send_Notification(NOTIF_ONE, caller, MSG_CENTER, CENTER_JOIN_PREVENT_MINIGAME);
349 sprint(caller,"Cannot join given minigame session!\n");
350 }
351 return;
352 }
353 else if ( minig_cmd == MINIGAME_CMD(LIST) )
354 {
355 FOREACH(Minigames, true, sprint(caller, it.netname, " (", it.message, ") ", "\n"));
356 return;
357 }
358 else if ( minig_cmd == MINIGAME_CMD(LIST_SESSIONS) )
359 {
360 entity e;
361 for ( e = minigame_sessions; e != NULL; e = e.list_next )
362 sprint(caller,e.netname,"\n");
363 return;
364 }
365 else if ( minig_cmd == MINIGAME_CMD(END) || minig_cmd == MINIGAME_CMD(PART) )
366 {
367 if ( CS(caller).active_minigame )
368 {
369 part_minigame(caller);
370 sprint(caller,"Left minigame session\n");
371 }
372 else
373 sprint(caller,"You aren't playing any minigame...\n");
374 return;
375 }
376 else if ( minig_cmd == MINIGAME_CMD(INVITE) && argc > 2 )
377 {
378 if ( CS(caller).active_minigame )
379 {
380 entity client = GetIndexedEntity(argc, 2);
381 string error = invite_minigame(caller,client);
382 if ( error == "" )
383 {
384 sprint(caller,"You have invited ",client.netname,
385 " to join your game of ", CS(caller).active_minigame.descriptor.message, "\n");
386 }
387 else
388 sprint(caller,"Could not invite: ", error, ".\n");
389 }
390 else
391 sprint(caller,"You aren't playing any minigame...\n");
392 return;
393 }
394 else if ( CS(caller).active_minigame )
395 {
396 entity e = minigame_find_player(caller);
397 string subcommand = substring(command,argv_end_index(0),-1);
398 int arg_c = tokenize_console(subcommand);
399 if ( CS(caller).active_minigame.minigame_event(CS(caller).active_minigame,"cmd",e,arg_c,subcommand) )
400 return;
401
402 }
403 else sprint(caller,strcat("Wrong command:^1 ",command,"\n"));
404 }
405
406 sprint(caller, "\nUsage:^3 cmd minigame create <minigame>\n");
407 sprint(caller, " Start a new minigame session\n");
408 sprint(caller, "Usage:^3 cmd minigame join <session>\n");
409 sprint(caller, " Join an exising minigame session\n");
410 sprint(caller, "Usage:^3 cmd minigame list\n");
411 sprint(caller, " List available minigames\n");
412 sprint(caller, "Usage:^3 cmd minigame list-sessions\n");
413 sprint(caller, " List available minigames sessions\n");
414 sprint(caller, "Usage:^3 cmd minigame part|end\n");
415 sprint(caller, " Leave the current minigame\n");
416 sprint(caller, "Usage:^3 cmd minigame invite <player>\n");
417 sprint(caller, " Invite the given player to join you in a minigame\n");
418}
string autocvar_g_playban_list
Definition banning.qh:14
bool autocvar_g_playban_minigames
Definition banning.qh:15
entity active_minigame
const int CMD_REQUEST_COMMAND
Definition command.qh:3
#define argv_end_index
#define tokenize_console
#define FOREACH(list, cond, body)
Definition iter.qh:19
string substring(string s, float start, float length)
void sprint(float clientnum, string text,...)
string argv(float n)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1500
#define NULL
Definition post.qh:14
#define error
Definition pre.qh:6
bool PlayerInList(entity player, string list)
Definition client.qc:1048
entity GetIndexedEntity(int argc, int start_index)
Definition common.qc:82
ClientState CS(Client this)
Definition state.qh:47
#define MINIGAME_CMD(cmd_id)
entity join_minigame(entity player, string game_id)
Join an existing minigame session.
void part_minigame(entity player)
entity start_minigame(entity player, string minigame)
Create a new minigame session.
string invite_minigame(entity inviter, entity player)
Invite a player to join in a minigame.
entity minigame_find_player(entity client)
entity minigame_sessions
bool autocvar_sv_minigames

References active_minigame, argv(), argv_end_index, autocvar_g_playban_list, autocvar_g_playban_minigames, autocvar_sv_minigames, CMD_REQUEST_COMMAND, CS(), entity(), error, FOREACH, GetIndexedEntity(), invite_minigame(), join_minigame(), MINIGAME_CMD, minigame_find_player(), minigame_sessions, NULL, part_minigame(), PlayerInList(), Send_Notification(), sprint(), start_minigame(), strcat(), substring(), and tokenize_console.

Referenced by CLIENT_COMMAND().

◆ end_minigame()

void end_minigame ( entity minigame_session)

Definition at line 227 of file sv_minigames.qc.

228{
229 if ( minigame_session.owner )
230 minigame_session.owner.list_next = minigame_session.list_next;
231 else
232 minigame_sessions = minigame_session.list_next;
233
234 minigame_session.minigame_event(minigame_session,"end");
235 GameLogEcho(strcat(":minigame:end:",minigame_session.netname));
236
237
238 entity e = NULL;
239 while( (e = findfloat(e, minigame_id, minigame_session.minigame_id)) )
240 if ( e.minigame_autoclean )
241 {
242 LOG_TRACE("SV Auto-cleaned: ",ftos(etof(e)), " (",e.classname,")");
243 strfree(e.netname);
244 delete(e);
245 }
246
247 entity p;
248 for ( e = minigame_session.minigame_players; e != NULL; e = p )
249 {
250 p = e.list_next;
251 player_clear_minigame(e.minigame_players);
252 delete(e);
253 }
254
255 strfree(minigame_session.netname);
256 delete(minigame_session);
257}
void GameLogEcho(string s)
Definition gamelog.qc:15
#define LOG_TRACE(...)
Definition log.qh:74
string ftos(float f)
entity findfloat(entity start,.float field, float match)
int minigame_id
Unique ID for the minigame session, associated with all objects currently the result of etof(minigame...
Definition minigames.qh:49
#define etof(e)
Definition misc.qh:25
#define strfree(this)
Definition string.qh:57
void player_clear_minigame(entity player)

References entity(), etof, findfloat(), ftos(), GameLogEcho(), LOG_TRACE, minigame_id, minigame_sessions, NULL, player_clear_minigame(), strcat(), and strfree.

Referenced by end_minigames(), minigame_rmplayer(), and start_minigame().

◆ end_minigames()

void end_minigames ( )

Definition at line 259 of file sv_minigames.qc.

260{
261 while ( minigame_sessions )
262 {
264 }
265}
void end_minigame(entity minigame_session)

References end_minigame(), and minigame_sessions.

◆ invite_minigame()

string invite_minigame ( entity inviter,
entity player )

Invite a player to join in a minigame.

Returns
Error string

Definition at line 267 of file sv_minigames.qc.

268{
269 if ( !inviter || !CS(inviter).active_minigame )
270 return "Invalid minigame";
271 if ( VerifyClientEntity(player, true, false) <= 0 )
272 return "Invalid player";
273 if ( inviter == player )
274 return "You can't invite yourself";
276 return "You can't invite a banned player";
277 if ( CS(player).active_minigame == CS(inviter).active_minigame )
278 return strcat(player.netname," is already playing");
279
280 Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_MINIGAME_INVITE,
281 CS(inviter).active_minigame.netname, inviter.netname );
282
283 GameLogEcho(strcat(":minigame:invite:",CS(inviter).active_minigame.netname,":",
284 ftos(etof(player)),":",player.netname));
285
286 return "";
287}
int VerifyClientEntity(entity client, bool must_be_real, bool must_be_bots)
Definition common.qc:47

References active_minigame, autocvar_g_playban_list, autocvar_g_playban_minigames, CS(), entity(), etof, ftos(), GameLogEcho(), PlayerInList(), Send_Notification(), strcat(), and VerifyClientEntity().

Referenced by ClientCommand_minigame().

◆ join_minigame()

entity join_minigame ( entity player,
string game_id )

Join an existing minigame session.

Returns
minigame session entity

Definition at line 203 of file sv_minigames.qc.

204{
205 if ( !autocvar_sv_minigames || !IS_REAL_CLIENT(player) )
206 return NULL;
207
208 entity minig;
209 for ( minig = minigame_sessions; minig != NULL; minig = minig.list_next )
210 {
211 if ( minig.netname == game_id )
212 if ( minigame_addplayer(minig,player) )
213 return minig;
214 }
215
216 return NULL;
217}
int minigame_addplayer(entity minigame_session, entity player)
#define IS_REAL_CLIENT(v)
Definition utils.qh:17

References autocvar_sv_minigames, entity(), IS_REAL_CLIENT, minigame_addplayer(), minigame_sessions, and NULL.

Referenced by ClientCommand_minigame().

◆ minigame_CheckSend()

bool minigame_CheckSend ( entity this,
entity client )

Definition at line 118 of file sv_minigames.qc.

119{
120 entity e;
121 for ( e = this.owner.minigame_players; e != NULL; e = e.list_next )
122 if ( e.minigame_players == client )
123 return true;
124 return false;
125}
entity owner
Definition main.qh:87

References entity(), NULL, and owner.

Referenced by minigame_addplayer(), and msle_spawn().

◆ minigame_find_player()

entity minigame_find_player ( entity client)

Definition at line 289 of file sv_minigames.qc.

290{
291 if ( ! CS(client).active_minigame )
292 return NULL;
293 entity e;
294 for ( e = CS(client).active_minigame.minigame_players; e; e = e.list_next )
295 if ( e.minigame_players == client )
296 return e;
297 return NULL;
298}

References active_minigame, CS(), entity(), and NULL.

Referenced by ClientCommand_minigame(), and MinigameImpulse().

◆ minigame_SendEntity()

bool minigame_SendEntity ( entity this,
entity to,
int sf )

Definition at line 68 of file sv_minigames.qc.

69{
70 WriteHeader(MSG_ENTITY, ENT_CLIENT_MINIGAME);
72
73 if ( sf & MINIG_SF_CREATE )
74 {
79 }
80
81 entity minigame_ent = this.owner;
82 if ( this.classname == "minigame" )
83 {
84 minigame_ent = this;
85 WriteByte(MSG_ENTITY, (CS(to).active_minigame == this));
86
87 if ( sf & MINIG_SF_UPDATE )
89 }
90 else if ( this.classname == "minigame_player" )
91 {
92 if ( sf & MINIG_SF_CREATE )
94 if ( sf & MINIG_SF_UPDATE )
96 }
98
99 minigame_ent.minigame_event(minigame_ent,"network_send",this,sf);
100
101 return true;
102
103}
int team
Definition main.qh:188
string classname
WriteString(chan, ent.netname)
WriteByte(chan, ent.angles.y/DEC_FACTOR)
const int MSG_ENTITY
Definition net.qh:156
#define WriteHeader(to, id)
Definition net.qh:265
#define WriteRegistered(r, to, it)
Definition net.qh:292
void WriteLong(float data, float dest, float desto)
void WriteShort(float data, float dest, float desto)
void WriteEntity(entity data, float dest, float desto)
#define MINIGAME_SIMPLELINKED_ENTITIES
Set up automatic entity read/write functionality To ensure that everything is handled automatically,...
Definition all.qh:100
int msle_id(string class_name)
Definition minigames.qc:110
int minigame_flags
Definition minigames.qh:107
const int MINIG_SF_UPDATE
Definition minigames.qh:113
const int MINIG_SF_CREATE
Definition minigames.qh:112
entity descriptor
For minigame sessions: minigame descriptor object.
Definition minigames.qh:45
entity minigame_players
For minigame sessions: list of players For minigame_player: client entity.

References active_minigame, classname, CS(), descriptor, entity(), MINIG_SF_CREATE, MINIG_SF_UPDATE, minigame_flags, minigame_id, minigame_players, MINIGAME_SIMPLELINKED_ENTITIES, MSG_ENTITY, msle_id(), netname, owner, team, WriteByte(), WriteEntity(), WriteHeader, WriteLong(), WriteRegistered, WriteShort(), and WriteString().

Referenced by minigame_addplayer(), msle_spawn(), and start_minigame().

◆ MinigameImpulse()

bool MinigameImpulse ( entity this,
int imp )

Definition at line 300 of file sv_minigames.qc.

301{
302 if (!CS(this).active_minigame) return false;
304 if ( imp && CS(this).active_minigame && e )
305 {
306 return CS(this).active_minigame.minigame_event(CS(this).active_minigame,"impulse",e,imp);
307 }
308 return false;
309}
int int int imp
Definition impulse.qc:90

References active_minigame, CS(), entity(), imp, and minigame_find_player().

Referenced by ImpulseCommands(), and ObserverOrSpectatorThink().

◆ part_minigame()

void part_minigame ( entity player)

Definition at line 219 of file sv_minigames.qc.

220{
221 entity minig = CS(player).active_minigame;
222
223 if ( minig && minig.classname == "minigame" )
224 minigame_rmplayer(minig,player);
225}
void minigame_rmplayer(entity minigame_session, entity player)

References CS(), entity(), and minigame_rmplayer().

Referenced by BanCommand_playban(), ClientCommand_minigame(), and ClientDisconnect().

◆ start_minigame()

entity start_minigame ( entity player,
string minigame )

Create a new minigame session.

Returns
minigame session entity

Definition at line 166 of file sv_minigames.qc.

167{
168 if ( !autocvar_sv_minigames || !IS_REAL_CLIENT(player) )
169 return NULL;
170
171 entity e = minigame_get_descriptor(minigame);
172 if ( e )
173 {
174 entity minig = new(minigame);
175 minig.minigame_id = etof(minig);
176 minig.netname = strzone(strcat(e.netname,"_",ftos(minig.minigame_id)));
177 minig.descriptor = e;
178 minig.minigame_event = e.minigame_event;
179 minig.minigame_event(minig,"start");
180 GameLogEcho(strcat(":minigame:start:",minig.netname));
181 if ( ! minigame_addplayer(minig,player) )
182 {
183 LOG_TRACE("Minigame ",minig.netname," rejected the first player join!");
184 end_minigame(minig);
185 return NULL;
186 }
187 Net_LinkEntity(minig, false, 0, minigame_SendEntity);
188
189 if ( !minigame_sessions )
190 minigame_sessions = minig;
191 else
192 {
193 minigame_sessions.owner = minig;
194 minig.list_next = minigame_sessions;
195 minigame_sessions = minig;
196 }
197 return minig;
198 }
199
200 return NULL;
201}
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:167
entity minigame_get_descriptor(string id)
Definition minigames.qc:5
bool minigame_SendEntity(entity this, entity to, int sf)

References autocvar_sv_minigames, end_minigame(), entity(), etof, ftos(), GameLogEcho(), IS_REAL_CLIENT, LOG_TRACE, minigame_addplayer(), minigame_get_descriptor(), minigame_SendEntity(), minigame_sessions, Net_LinkEntity(), NULL, strcat(), and strzone().

Referenced by ClientCommand_minigame().

Variable Documentation

◆ active_minigame

entity active_minigame

For players: Minigame being played.

Definition at line 55 of file sv_minigames.qh.

◆ autocvar_sv_minigames

bool autocvar_sv_minigames

Definition at line 17 of file sv_minigames.qh.

Referenced by ClientCommand_minigame(), join_minigame(), and start_minigame().

◆ autocvar_sv_minigames_observer

bool autocvar_sv_minigames_observer

Definition at line 18 of file sv_minigames.qh.

Referenced by minigame_addplayer().

◆ MINIGAME_COMMON_CMD

string MINIGAME_COMMON_CMD[MINIGAME_COMMON_CMD_COUNT]
Initial value:
=
{"create", "join", "list", "list-sessions", "end", "part", "invite"}

Definition at line 14 of file sv_minigames.qh.

14 {"create", "join", "list", "list-sessions", "end", "part", "invite"};

Referenced by SV_ParseClientCommand().

◆ minigame_players

entity minigame_players

For minigame sessions: list of players For minigame_player: client entity.

Definition at line 59 of file sv_minigames.qh.

Referenced by minigame_SendEntity().

◆ minigame_sessions

entity minigame_sessions