]> icculus.org git repositories - divverent/nexuiz.git/blob - scmenu/source/custom/creategame.qm
A lot of work done on the menu, I hope everything works..
[divverent/nexuiz.git] / scmenu / source / custom / creategame.qm
1 // Property of Alientrap
2 // custom/creategame.qm
3
4 // uses target and _target
5 // requires neighbors: Picture, Name, Description
6 void() Nex_MapSelector_UpdateMap =
7 {
8         local entity lInfo;
9         local entity lItem;
10         local entity lSelector;
11         local float lIndex;
12
13         lSelector = Menu_GetItem( "::Data::Server::Map::Selector" );
14         Raise_DataEvent( lSelector, ITEM_DATALINK_GET );
15         lIndex = lSelector._realValue;
16         lInfo = Nex_MapDB_GetFilteredByIndex( lIndex );
17
18         if( lInfo == null_entity ) {
19                 lItem = Menu_GetItem( "Picture" );
20                 String_EntitySet( lItem, picture, "gfx/m_nomap" );
21
22                 lItem = Menu_GetItem( "Name" );
23                 String_EntitySet( lItem, text, "No maps found" );
24
25                 lItem = Menu_GetItem( "Description" );
26                 String_EntitySet( lItem, text, "---" );
27                 return;
28         }
29
30         lItem = Menu_GetItem( "Picture" );
31         String_EntitySet( lItem, picture, lInfo.picture );
32
33         lItem = Menu_GetItem( "Name" );
34         String_EntitySet( lItem, text, lInfo.normal );
35
36         lItem = Menu_GetItem( "Description" );
37         String_EntitySet( lItem, text, lInfo.text );
38
39         lItem = Menu_GetItem( "::Data::Server::Map::Cycle" );
40         DataLink_Nex_MapList_SetFirst( lItem, lInfo.normal, lInfo.link );
41 };
42
43 void() Nex_MapSelector_Synchronize =
44 {
45         local entity lCycle;
46         local entity lSelector;
47
48         lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
49         lSelector = Menu_GetItem( "::Data::Server::Map::Selector" );
50
51         if( lCycle.stepValue == 0.0 ) {
52                 Raise_DataEvent( lCycle, ITEM_DATA_RESET );
53         } else {
54                 local string lPath;
55                 local entity lMapInfo;
56
57                 lPath = Util_GetAltStringItem( lCycle.valueList, 0 );
58                 lMapInfo = Nex_MapDB_GetByPath( lPath );
59                 String_Free( lPath );
60
61                 if( lMapInfo == null_entity ) {
62                         Raise_DataEvent( lCycle, ITEM_DATA_RESET );
63                 } else {
64                         lSelector._realValue = Nex_MapDB_GetFilteredIndex( lMapInfo );
65                         Raise_DataEvent( lSelector, ITEM_DATALINK_SET );
66                 }
67         }
68 };
69
70 // more concrete functions
71 void() Nex_Action_MapSelector_Next =
72 {
73         local entity lItem;
74
75         lItem = Menu_GetItem( "::Data::Server::Map::Selector" );
76         Raise_DataEvent( lItem, ITEM_DATALINK_GET );
77         lItem._realValue = lItem._realValue + 1;
78         Raise_DataEvent( lItem, ITEM_DATALINK_SET );
79 };
80
81 void() Nex_Action_MapSelector_Prev =
82 {
83         local entity lItem;
84
85         lItem = Menu_GetItem( "::Data::Server::Map::Selector" );
86         Raise_DataEvent( lItem, ITEM_DATALINK_GET );
87         lItem._realValue = lItem._realValue - 1;
88         Raise_DataEvent( lItem, ITEM_DATALINK_SET );
89 };
90
91 // TODO: Make MaxPlayers real Data items (no container with correct set behavior)
92 void() Nex_Action_Map_Start =
93 {
94         local entity lItem;
95         local string exit_cfg;
96
97         // Set maxplayers
98         lItem = Menu_GetItem( "::Data::Server::MaxPlayers" );
99         cmd( "maxplayers \"" );
100         cmd( lItem.value );
101         cmd( "\"\n" );
102
103         lItem = Menu_GetItem( "::Data::Server::Map::Cycle" );
104
105         // if an old exit cfg file was set up, exec it
106         // to reset old values before starting the server
107         exit_cfg = cvar_string("exit_cfg");
108         if(exit_cfg)
109         {
110                 cmd( "exec ");
111                 cmd( exit_cfg );
112                 cmd( "\n" );
113         }
114         // exec the game reset cfg and then the mapcfg
115         cmd( "exec game_reset.cfg \nwait \nexec \"maps/" );
116         cmd( String_Normal( Util_GetAltStringItem( lItem.valueList, 0 ) ) );
117         cmd( ".mapcfg\"\n");
118
119         Raise_DataEvent( lItem, ITEM_DATA_SEND );
120
121         // force the menu to hide
122         m_hide();
123 };
124
125 // cycle list edit features
126 void() Nex_Action_Cycle_Add =
127 {
128         local entity lList;
129         local entity lCycle;
130         local string lPath;
131         local string lName;
132
133         lList = Menu_GetItem( "::Data::Server::Map::List" );
134         lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
135
136         lName = DataLink_Nex_MapList_GetCurrentName( lList );
137         lPath = DataLink_Nex_MapList_GetCurrentPath( lList );
138
139         if( lCycle.stepValue == 1.0 ) {
140                 print( "Before: ", ftos( lCycle._realValue ), "\n" );
141                 DataLink_Nex_MapList_InsertEntryAfter( lCycle, lName, lPath );
142         } else {
143                 DataLink_Nex_MapList_SetFirst( lCycle, lName, lPath );
144         }
145
146         String_Free( lName );
147         String_Free( lPath );
148
149         lCycle._realValue = lCycle._realValue + 1;
150         Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
151
152         print( "After: ", ftos( lCycle._realValue ), "\n" );
153
154         Nex_MapSelector_Synchronize();
155 };
156
157 void() Nex_Action_Cycle_Remove =
158 {
159         local entity lCycle;
160
161         lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
162         DataLink_Nex_MapList_DeleteEntry( lCycle );
163
164         Nex_MapSelector_Synchronize();
165 };
166
167 void() Nex_Action_Cycle_MoveUp =
168 {
169         local entity lCycle;
170
171         lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
172         DataLink_Nex_MapList_MoveEntryUp( lCycle );
173
174         lCycle._realValue = lCycle._realValue - 1;
175         Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
176
177         Nex_MapSelector_Synchronize();
178 };
179
180 void() Nex_Action_Cycle_MoveDown =
181 {
182         local entity lCycle;
183
184         lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
185         DataLink_Nex_MapList_MoveEntryDown( lCycle );
186
187         lCycle._realValue = lCycle._realValue + 1;
188         Raise_DataEvent( lCycle, ITEM_DATALINK_SET );
189
190         Nex_MapSelector_Synchronize();
191 };
192
193 void() Nex_Action_Cycle_Clear =
194 {
195         local entity lCycle;
196
197         lCycle = Menu_GetItem( "::Data::Server::Map::Cycle" );
198         DataLink_Nex_MapList_Clear( lCycle );
199
200         Nex_MapSelector_Synchronize();
201 };
202
203
204 void() Nex_Action_Maplist_ChangeMapType = {
205         local entity lMapQuery;
206         local entity lOldSelf;
207
208         lMapQuery = Menu_GetItem( "::Data::Server::Map::Query" );
209
210         Raise_DataEvent( self._target, ITEM_DATALINK_SET );
211
212         Nex_MapDB_FilterMaps( lMapQuery.value );
213
214         // kind of a hack
215         self = Menu_GetItem( "::Data::Server::Map::Selector" );
216         Item_DataLink_Nex_MapList_InitWithMapList();
217         self = Menu_GetItem( "::Data::Server::Map::List" );
218         Item_DataLink_Nex_MapList_InitWithMapList();
219         self = lOldSelf;
220 };
221
222 // mangement
223
224 entity( float pType ) Nex_Management_GetFileList =
225 {
226         switch( pType ) {
227                 case 0:
228                         return Menu_GetItem( "::Data::Management::FileList::Weapon" );
229                 case 1:
230                         return Menu_GetItem( "::Data::Management::FileList::Game" );
231                 case 2:
232                         return Menu_GetItem( "::Data::Management::FileList::MapList" );
233         }
234         crash();
235         return null_entity;
236 };
237
238 entity( float pType ) Nex_Management_GetContainer =
239 {
240         switch( pType ) {
241                 case 0:
242                         return Menu_GetItem( "::Data::Weapon" );
243                 case 1:
244                         return Menu_GetItem( "::Data::Game" );
245                 case 2:
246                         return Menu_GetItem( "::Data::Server::Map::Cycle" );
247         }
248         crash();
249         return null_entity;
250 };
251
252 float() Nex_Management_GetType =
253 {
254         local entity lTypeData;
255
256         lTypeData = Menu_GetItem( "::Data::Management::ConfigType" );
257         return stof( lTypeData.value );
258 };
259
260 string() Nex_Management_GetTypeName =
261 {
262         local entity lTypeSwitch;
263
264         lTypeSwitch = Menu_GetItem( "::Data::Management::ConfigType::Switch" );
265         Raise_DataEvent( lTypeSwitch, ITEM_DATALINK_GET );
266         return String_Zone( lTypeSwitch.value );
267 };
268
269 void( float pType ) Nex_Management_SetType =
270 {
271         local entity lItem;
272         local entity lList;
273         local entity lTypeData;
274
275         lTypeData = Menu_GetItem( "::Data::Management::ConfigType" );
276         String_EntitySet( lTypeData, value, ftos( pType ) );
277         Raise_DataEvent( lTypeData, ITEM_DATALINK_SET );
278
279         // update the filename
280         /*lItem = Menu_GetItem( "::Data::Management::Filename::Text" );
281         String_EntitySet( lItem, value, "" );
282         Raise_DataEvent( lItem, ITEM_DATALINK_SET );*/
283
284         lItem = Menu_GetItem( "FileList" );
285         lList = Nex_Management_GetFileList( pType );
286         String_EntitySet( lItem, target, lList.name );
287 };
288
289 void() Nex_Action_CopyToFilename =
290 {
291         local entity lItem;
292
293         if( !self._target ) {
294                 return;
295         }
296
297         Raise_DataEvent( self._target, ITEM_DATALINK_GET );
298
299         lItem = Menu_GetItem( "::Data::Management::Filename::Text" );
300         String_EntitySet( lItem, value, self._target.value );
301         Raise_DataEvent( lItem, ITEM_DATALINK_SET );
302 };
303
304 void() Nex_Update_Management_SyncData =
305 {
306         if( self._realValue < Timer_Time && self._realValue > 0.0 ) {
307                 Raise_DataEvent( Nex_Management_GetContainer( Nex_Management_GetType() ), ITEM_DATA_SYNC );
308                 self._realValue = 0.0;
309         }
310 };
311
312 void() Nex_Action_Management_Refresh =
313 {
314         local entity lItem;
315
316         lItem = Menu_GetItem( "::Data::Management::FileList" );
317         Raise_DataEvent( lItem, ITEM_DATA_SYNC );
318 };
319
320 void() Nex_Action_Management_LoadConfig =
321 {
322         local entity lFileList;
323         local entity lFilenameData;
324         local entity lSyncItem;
325
326         lFileList = Nex_Management_GetFileList( Nex_Management_GetType() );
327         lFilenameData = Menu_GetItem( "::Data::Management::Filename" );
328
329         cmd( strcat( "exec \"", lFileList.selected, lFilenameData.value, ".", lFileList.normal, "\"\n" ) );
330
331         lSyncItem = Menu_GetItem( "CreateGame::Panel::Management::SyncCategory" );
332         lSyncItem._realValue = Timer_Time;
333 };
334
335 void() Nex_Action_Management_Load =
336 {
337         local entity lItem;
338         local string lQuestion;
339         local string lTitle;
340
341         lItem = Menu_GetItem( "::Data::Management::Filename" );
342         if( lItem.value == "" ) {
343                 Nex_MessageBox( "Loading", "You must specify a filename!", "Ok", "", Util_NullFunction, Util_NullFunction );
344                 return;
345         }
346
347         lTitle = String_Zone( strcat( "Loading ", String_Normal( Nex_Management_GetTypeName() ) ) );
348         lQuestion = String_Zone( strcat( "Do you want to load '", lItem.value, "'?" ) );
349         Nex_MessageBox( lTitle, lQuestion, "Yes", "No", Nex_Action_Management_LoadConfig, Util_NullFunction );
350         String_Free( lQuestion );
351         String_Free( lTitle );
352 };
353
354 void() Nex_Action_Management_SaveConfig =
355 {
356         local float lType;
357         local entity lFileList;
358         local entity lFilename;
359         local entity lContainer;
360         local float lHandle;
361
362         lType = Nex_Management_GetType();
363         lFileList = Nex_Management_GetFileList( lType );
364         lContainer = Nex_Management_GetContainer( lType );
365         lFilename = Menu_GetItem( "::Data::Management::Filename" );
366         if( lFilename.value == "" ) {
367                 Nex_MessageBox( "Saving", "You must specify a filename!", "Ok", "", Util_NullFunction, Util_NullFunction );
368                 return;
369         }
370         lHandle = fopen( strcat( lFileList.selected, lFilename.value, ".", lFileList.normal ), FILE_WRITE );
371
372         if( lHandle < 0 ) {
373                 return;
374         }
375
376         Data_ExecString_BeginUse();
377         Raise_DataEvent( lContainer, ITEM_DATA_SAVE_EXECSTRING );
378
379         fputs( lHandle, Data_ExecString );
380
381         Data_ExecString_EndUse();
382
383         fclose( lHandle );
384
385         Nex_Action_Management_Refresh();
386 };
387
388 void() Nex_Action_Management_Save =
389 {
390         local entity lFileList;
391         local entity lFilename;
392         local float lHandle;
393
394         lFileList = Nex_Management_GetFileList( Nex_Management_GetType() );
395         lFilename = Menu_GetItem( "::Data::Management::Filename" );
396
397         lHandle = fopen( strcat( lFileList.selected, "/", lFilename.value, ".", lFileList.normal ), FILE_READ );
398
399         if( lHandle == ERR_CANNOTOPEN ) {
400                 Nex_Action_Management_SaveConfig();
401         } else if( lHandle > 0 ) {
402                 local string lQuestion;
403                 local string lTitle;
404
405                 fclose( lHandle );
406
407                 lTitle = String_Zone( strcat( "Saving ", String_Normal( Nex_Management_GetTypeName() ) ) );
408                 print( lTitle, "\n" );
409                 lQuestion = String_Zone( strcat( "Do you want to overwrite '", lFilename.value, "'?" ) );
410                 Nex_MessageBox( lTitle, lQuestion, "Yes", "No", Nex_Action_Management_SaveConfig, Util_NullFunction );
411                 String_Free( lQuestion );
412                 String_Free( lTitle );
413         }
414 };
415
416 void() Nex_Action_Management_TypeWeapon =
417 {
418         Nex_Management_SetType( 0 );
419 };
420
421 void() Nex_Action_Management_TypeGame =
422 {
423         Nex_Management_SetType( 1 );
424 };
425
426 void() Nex_Action_Management_TypeMapList =
427 {
428         Nex_Management_SetType( 2 );
429 };