· 8 years ago · Mar 10, 2018, 10:48 PM
1#include <bTimes-core>
2
3
4EngineVersion g_Game;
5
6#define PLUGIN_VERSION "1.00"
7
8public Plugin myinfo =
9{
10 name = "Checkpoint Menu for Blackys Timer",
11 author = "Ici, Promises",
12 version = PLUGIN_VERSION,
13 url = "http://steamcommunity.com/profiles/76561198075677363/"
14};
15
16
17#include <sourcemod>
18#include <sdktools>
19#include <smlib/clients>
20
21
22
23#define MAXCPS 30
24
25//Checkpoint DB
26enum Checkpoint
27{
28 Float:origin[3],
29 Float:angles[3],
30 Float:speed[3]
31}
32
33enum UseConfig
34{
35 bool:origin,
36 bool:angles,
37 bool:speed
38}
39
40#pragma semicolon 1
41#pragma newdecls required
42
43enum
44{
45 FRM_SIZE
46};
47
48
49//CP stuff
50char g_sMapName[64];
51
52Handle g_DB;
53bool bLateLoad = false;
54float g_Checkpoint[MAXPLAYERS+1][MAXCPS][Checkpoint]; //Array holds all cps per client
55float g_CurrentCP[MAXPLAYERS+1]; //the current cp what is used
56bool g_UseConfig[MAXPLAYERS+1][UseConfig]; //User menu config
57
58public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
59{
60 bLateLoad = late;
61 return APLRes_Success;
62}
63
64public void OnPluginStart()
65{
66 //Commands
67 RegConsoleCmd("sm_cp", SM_CP, "Opens the CP Menu.");
68 RegConsoleCmd("sm_save", SM_Save, "Saves a new CP");
69
70 g_Game = GetEngineVersion();
71 if(g_Game != Engine_CSGO && g_Game != Engine_CSS)
72 {
73 SetFailState("This plugin is for CSGO/CSS only.");
74 }
75 if (bLateLoad)
76 for (int i = 1; i <= MaxClients; ++i)
77 OnClientPutInServer(i);
78
79 GetCurrentMap(g_sMapName, sizeof(g_sMapName));
80
81 DB_Connect();
82
83}
84
85public Action SM_CP(int client, int args)
86{
87 OpenCheckpointMenu(client);
88 return Plugin_Handled;
89}
90
91
92public void OnClientPutInServer(int client)
93{
94
95 //Set every Option on by default
96 g_UseConfig[client][origin] = true;
97 g_UseConfig[client][angles] = true;
98 g_UseConfig[client][speed] = true;
99
100 //Clear Data
101 for (int i; i < MAXCPS; ++i)
102 deleteCP(client, i);
103
104 g_CurrentCP[client] = 0;
105
106}
107
108void OpenCheckpointMenu(int client)
109{
110 Handle panel = CreatePanel();
111 char sOrigin[32];
112 char sAngles[32];
113 char sSpeed[32];
114 char sBuffer[128];
115
116 int firstUnused = firstCP(client);
117
118 if (firstUnused == 0)
119 SetPanelTitle(panel, "Checkpoint Menu");
120 else
121 {
122 FormatEx(sBuffer, sizeof(sBuffer), "Checkpoint: %i / %i\nOrigin: %s\nAngles: %s\nSpeed: %s",
123 (g_CurrentCP[client]+1), MAXCPS,
124 ((CanConvertOrigin(client, sOrigin, sizeof(sOrigin)) && g_UseConfig[client][origin]) ? sOrigin : "-"),
125 ((CanConvertAngles(client, sAngles, sizeof(sAngles)) && g_UseConfig[client][angles]) ? sAngles : "-"),
126 ((CanConvertSpeed(client, sSpeed, sizeof(sSpeed)) && g_UseConfig[client][speed]) ? sSpeed : "-"));
127
128 SetPanelTitle(panel, sBuffer);
129 }
130 DrawPanelText(panel, " ");
131
132 DrawPanelItem(panel, "Save CP");
133 DrawPanelItem(panel, "Teleport to CP"/*, (firstUnused == 0) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT*/);
134 DrawPanelText(panel, " ");
135
136 DrawPanelItem(panel, "Previous CP", (g_CurrentCP[client] == 0) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT);
137 DrawPanelItem(panel, "Next CP", ((g_CurrentCP[client] == MAXCPS-1) || (firstUnused == g_CurrentCP[client]) || (firstUnused-1 == g_CurrentCP[client])) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT);
138 DrawPanelText(panel, " ");
139
140 DrawPanelItem(panel, "Delete CP", (firstUnused == 0) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT);
141 DrawPanelItem(panel, "Delete All CPs", (firstUnused == 0) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT);
142 DrawPanelText(panel, " ");
143
144 DrawPanelItem(panel, "Save CPs");
145 DrawPanelItem(panel, "Load CPs");
146 DrawPanelItem(panel, "Settings");
147
148 SetPanelCurrentKey(panel, 10);
149 DrawPanelItem(panel, "Exit", ITEMDRAW_CONTROL);
150 SendPanelToClient(panel, client, menu_CP, 0);
151 CloseHandle(panel);
152}
153
154public int menu_CP(Handle menu, MenuAction action, int client, int item)
155{
156 switch (action)
157 {
158 case MenuAction_Select:
159 {
160 switch (item)
161 {
162 case 1: // Save CP
163 {
164 saveCP(client);
165 OpenCheckpointMenu(client);
166
167 }
168 case 2: // Teleport to CP
169 {
170 TeleportToCheckpoint(client);
171 OpenCheckpointMenu(client);
172 }
173 case 3: // Previous CP
174 {
175 --g_CurrentCP[client];
176 OpenCheckpointMenu(client);
177 }
178 case 4: // Next CP
179 {
180 ++g_CurrentCP[client];
181 OpenCheckpointMenu(client);
182 }
183 case 5: // Delete current CP
184 {
185 deleteCP(client, g_CurrentCP[client]);
186 shiftDown(client, g_CurrentCP[client]);
187
188 // Decrement the CP slot if there's no data in the current slot
189 if (!IsOriginPresent(client, g_CurrentCP[client]) && g_CurrentCP[client] > 0)
190 --g_CurrentCP[client];
191
192 OpenCheckpointMenu(client);
193 }
194 case 6: // Delete All CPs
195 {
196 OpenDeleteAllMenu(client);
197
198 }
199 case 7: //save cp file
200 {
201 OpenSaveFileMenu(client);
202 }
203 case 8://load cp file
204 {
205 OpenLoadFileMenu(client);
206 }
207 case 9: // Settings
208 {
209 OpenSettingsMenu(client);
210 }
211 }
212 }
213 }
214}
215
216
217void OpenDeleteAllMenu(int client)
218{
219 Handle panel = CreatePanel();
220
221 SetPanelTitle(panel, "Are you sure?");
222
223 DrawPanelItem(panel, "Yes");
224 DrawPanelItem(panel, "No");
225
226 SendPanelToClient(panel, client, menu_DeleteAll, 0);
227 SetMenuExitBackButton(panel, true);
228 CloseHandle(panel);
229}
230
231public int menu_DeleteAll(Handle menu, MenuAction action, int client, int item)
232{
233 switch (action)
234 {
235 case MenuAction_Select:
236 {
237 switch (item)
238 {
239 case 1: //Delete All
240 {
241 DeleteAll(client);
242 OpenCheckpointMenu(client);
243 }
244
245 case 2: //Don't delete any CPs
246 {
247 OpenCheckpointMenu(client);
248 }
249 }
250 }
251 }
252}
253
254void DeleteAll(int client)
255{
256 for (int i; i < MAXCPS; ++i)
257 deleteCP(client, i);
258
259 g_CurrentCP[client] = 0;
260}
261
262void OpenSettingsMenu(int client)
263{
264 char sBuffer[128];
265 Handle panel = CreatePanel();
266
267 SetPanelTitle(panel, "SettingsMenu");
268 FormatEx(sBuffer, sizeof(sBuffer), "[%s] - Origin", (g_UseConfig[client][origin]) ? "x" : " ");
269 DrawPanelItem(panel, sBuffer);
270 FormatEx(sBuffer, sizeof(sBuffer), "[%s] - Eye Angles", (g_UseConfig[client][angles]) ? "x" : " ");
271 DrawPanelItem(panel, sBuffer);
272 FormatEx(sBuffer, sizeof(sBuffer), "[%s] - Speed", (g_UseConfig[client][speed]) ? "x" : " ");
273 DrawPanelItem(panel, sBuffer);
274 //FormatEx(sBuffer, sizeof(sBuffer), "Back");
275 //DrawPanelItem(panel, sBuffer);
276 SetPanelCurrentKey(panel, 4);
277 DrawPanelItem(panel, "Exit", OpenCheckpointMenu(client));
278 SendPanelToClient(panel, client, menu_OpenSettings, 0);
279 CloseHandle(panel);
280}
281
282public int menu_OpenSettings(Handle menu, MenuAction action, int client, int item)
283{
284 switch(action)
285 {
286 case MenuAction_Select:
287
288 {
289 switch(item)
290 {
291 case 1: // Use Origin?
292 {
293 g_UseConfig[client][origin] = !g_UseConfig[client][origin];
294 OpenSettingsMenu(client);
295 }
296 case 2: // Use Eye Angles?
297 {
298 g_UseConfig[client][angles] = !g_UseConfig[client][angles];
299 OpenSettingsMenu(client);
300 }
301 case 3: // Use Speed?
302 {
303 g_UseConfig[client][speed] = !g_UseConfig[client][speed];
304 OpenSettingsMenu(client);
305 }
306 case 4:
307 {
308 OpenCheckpointMenu(client);
309 }
310 }
311 }
312 }
313}
314
315 public Action SM_Save(int client, int args)
316{
317 // if (args < 1)
318 // {
319 // PrintToServer("[CP Menu] sm_save received less than 1 argument. UserID required.");
320 // return Plugin_Handled;
321 // }
322
323
324 // decl String:steamid[64];
325 // GetCmdArg(1, steamid, sizeof(steamid));
326 // new client = GetClientAuthId(client, 2, steamid, 63);
327
328 // The client disconnected
329 // if (!client || !IsClientInGame(client))
330 // return Plugin_Handled;
331
332 // Perform save on the first unused/available CP slot
333 // g_CurrentCP[client] = firstCP(client);
334 // if (g_CurrentCP[client] == MAXCPS)
335 // --g_CurrentCP[client];
336 saveCP(client);
337
338 OpenCheckpointMenu(client);
339 return Plugin_Handled;
340}
341
342void Teleport(int client)
343{
344
345 if (g_CurrentCP[client] != 0)
346 {
347 int checkpoint = g_CurrentCP[client] -1;
348 TeleportToCheckpoint(client, checkpoint);
349 }
350}
351
352void TeleportToCheckpoint(int client)
353{
354 float vOrigin[3];
355 float vAngles[3];
356 float vVelocity[3];
357
358 StopTimer(client);
359
360 copyArray(g_Checkpoint[client][g_CurrentCP[client]][origin], vOrigin, sizeof(vOrigin));
361 copyArray(g_Checkpoint[client][g_CurrentCP[client]][angles], vAngles, sizeof(vAngles));
362 copyArray(g_Checkpoint[client][g_CurrentCP[client]][speed], vVelocity, sizeof(vVelocity));
363
364 TeleportEntity(client,
365 (g_UseConfig[client][origin] && IsOriginPresent(client, g_CurrentCP[client])) ? vOrigin : NULL_VECTOR,
366 (g_UseConfig[client][angles] && AreAnglesPresent(client, g_CurrentCP[client])) ? vAngles : NULL_VECTOR,
367 (g_UseConfig[client][speed] && IsSpeedPresent(client, g_CurrentCP[client])) ? vVelocity : NULL_VECTOR);
368
369}
370
371
372void saveCP(int client)
373{
374
375 g_CurrentCP[client] = firstCP(client);
376 if (g_CurrentCP[client] == MAXCPS)
377 --g_CurrentCP[client];
378
379 float vOrigin[3];
380 GetClientAbsOrigin(client, vOrigin);
381 copyArray(vOrigin, g_Checkpoint[client][g_CurrentCP[client]][origin], 3);
382
383 float vAngles[3];
384 GetClientEyeAngles(client, vAngles);
385 copyArray(vAngles, g_Checkpoint[client][g_CurrentCP[client]][angles], 3);
386
387 float vVelocity[3];
388 GetEntPropVector(client, Prop_Data, "m_vecAbsVelocity", vVelocity);
389 copyArray(vVelocity, g_Checkpoint[client][g_CurrentCP[client]][speed], 3);
390}
391
392
393void deleteCP(int client, int cpSlot)
394{
395 zeroizeOrigin(client, cpSlot);
396 zeroizeAngles(client, cpSlot);
397 zeroizeSpeed(client, cpSlot);
398}
399
400void shiftDown(int client, int cpSlot)
401{
402 for (int i = cpSlot + 1; i < MAXCPS; ++i)
403 {
404 if (IsOriginPresent(client, i)) // Checking just the origin cause no need for angles & speed
405 {
406 // Copy the contents of the next slot to the previous one
407 copyArray(g_Checkpoint[client][i][origin], g_Checkpoint[client][i-1][origin], 3);
408 copyArray(g_Checkpoint[client][i][angles], g_Checkpoint[client][i-1][angles], 3);
409 copyArray(g_Checkpoint[client][i][speed], g_Checkpoint[client][i-1][speed], 3);
410
411 // Clear the data from the slot (the next one that was used)
412 deleteCP(client, i);
413 }
414 }
415}
416
417bool IsOriginPresent(int client, int cpSlot)
418{
419 if (g_Checkpoint[client][cpSlot][origin][0] != 0.0
420 || g_Checkpoint[client][cpSlot][origin][1] != 0.0
421 || g_Checkpoint[client][cpSlot][origin][2] != 0.0)
422 return true;
423 return false;
424}
425
426bool AreAnglesPresent(int client, int cpSlot)
427{
428 if (g_Checkpoint[client][cpSlot][angles][0] != 0.0
429 || g_Checkpoint[client][cpSlot][angles][1] != 0.0
430 || g_Checkpoint[client][cpSlot][angles][2] != 0.0)
431 return true;
432 return false;
433}
434
435bool IsSpeedPresent(int client, int cpSlot)
436{
437 if (g_Checkpoint[client][cpSlot][speed][0] != 0.0
438 || g_Checkpoint[client][cpSlot][speed][1] != 0.0
439 || g_Checkpoint[client][cpSlot][speed][2] != 0.0)
440 return true;
441 return false;
442}
443
444bool CanConvertOrigin(int client, char[] data, int size)
445{
446 if (IsOriginPresent(client, g_CurrentCP[client]))
447 {
448 FormatEx(data, size, "%.0f %.0f %.0f",
449 g_Checkpoint[client][g_CurrentCP[client]][origin][0],
450 g_Checkpoint[client][g_CurrentCP[client]][origin][1],
451 g_Checkpoint[client][g_CurrentCP[client]][origin][2]);
452
453 return true;
454 }
455 return false;
456}
457
458bool CanConvertAngles(int client, char[] data, int size)
459{
460 if (AreAnglesPresent(client, g_CurrentCP[client]))
461 {
462 FormatEx(data, size, "%.0f %.0f %.0f",
463 g_Checkpoint[client][g_CurrentCP[client]][angles][0],
464 g_Checkpoint[client][g_CurrentCP[client]][angles][1],
465 g_Checkpoint[client][g_CurrentCP[client]][angles][2]);
466
467 return true;
468 }
469 return false;
470}
471
472bool CanConvertSpeed(int client, char[] data, int size)
473{
474 if (IsSpeedPresent(client, g_CurrentCP[client]))
475 {
476 float vVelocity[3];
477 copyArray(g_Checkpoint[client][g_CurrentCP[client]][speed], vVelocity, sizeof(vVelocity));
478 vVelocity[2] = 0.0; // Show 2D "TrueVel"
479
480 FormatEx(data, size, "%.0f", GetVectorLength(vVelocity));
481 return true;
482 }
483 return false;
484}
485
486// 'stock' functions don't get compiled if they're not used
487stock void copyArray(any[] from, any[] to, int size)
488{
489 for (int i; i < size; ++i)
490 from[i] = to[i];
491}
492
493stock void zeroizeOrigin(int client, int cpSlot)
494{
495 for (int i; i < 3; ++i)
496 g_Checkpoint[client][cpSlot][origin][i] = 0.0;
497}
498
499stock void zeroizeAngles(int client, int cpSlot)
500{
501 for (int i; i < 3; ++i)
502 g_Checkpoint[client][cpSlot][angles][i] = 0.0;
503}
504
505stock void zeroizeSpeed(int client, int cpSlot)
506{
507 for (int i; i < 3; ++i)
508 g_Checkpoint[client][cpSlot][speed][i] = 0.0;
509}
510
511stock void firstCP(int client)
512{
513 int i=0; // 0 as starting point
514 for (; i < MAXCPS; ++i)
515 if (!IsOriginPresent(client, i)) // Found the first unused slot
516 return i;
517 return i;
518}
519
520//cp file save/load
521
522void DB_Connect()
523{
524 if(g_DB != INVALID_HANDLE)
525 CloseHandle(g_DB);
526
527 char error[255];
528 g_DB = SQL_Connect("timer", true, error, sizeof(error));
529
530 if(g_DB == INVALID_HANDLE)
531 {
532 LogError(error);
533 CloseHandle(g_DB);
534 }
535 else
536 {
537 char query[512];
538
539 //Create Checkpoint table
540 Format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS checkpoint(CPs INTEGER NOT NULL AUTO_INCREMENT, MapID INTEGER, PlayerID INTEGER, Origin_x REAL, Origin_y REAL, Origin_z REAL, Angle_pitch REAL, Angle_yaw REAL, Angle_roll REAL, Speed_x REAL, Speed_y REAL, Speed_z REAL, PRIMARY KEY (CPs))");
541 SQL_TQuery(g_DB, DB_Connect_Callback, query);
542 }
543}
544
545public void DB_Connect_Callback(Handle owner, Handle hndl, const char[] error, any data)
546{
547 if(hndl == INVALID_HANDLE)
548 {
549 LogError(error);
550 }
551}
552
553void savecpfile(int client)
554{
555 int PlayerID = GetPlayerID(client);
556 char query[512];
557
558 //delete current saved cps
559 Format(query, sizeof(query), "DELETE FROM checkpoint WHERE ((SELECT MapID FROM maps WHERE MapName = '%s') AND PlayerID = '%d') ", g_sMapName, PlayerID);
560 SQL_TQuery(g_DB, DeleteCP_Callback, query, client);
561
562 int size = GetArraySizeMDA(client);
563
564 for (int cpSlot=0; cpSlot < size; ++cpSlot)
565 {
566 //Save CPs into db
567 Format(query, sizeof(query), "REPLACE INTO checkpoint (MapID, PlayerID, Origin_x, Origin_y, Origin_z, Angle_pitch, Angle_yaw, Angle_roll, Speed_x, Speed_y, Speed_z) VALUES ((SELECT MapID FROM maps WHERE MapName='%s' LIMIT 1), %d, %f, %f, %f, %f, %f, %f, %f, %f, %f)",
568 g_sMapName,
569 PlayerID,
570 g_Checkpoint[client][cpSlot][origin][0], g_Checkpoint[client][cpSlot][origin][1], g_Checkpoint[client][cpSlot][origin][2],
571 g_Checkpoint[client][cpSlot][angles][0], g_Checkpoint[client][cpSlot][angles][1], g_Checkpoint[client][cpSlot][angles][2],
572 g_Checkpoint[client][cpSlot][speed][0], g_Checkpoint[client][cpSlot][speed][1], g_Checkpoint[client][cpSlot][speed][2]);
573
574 SQL_TQuery(g_DB, SaveCP_Callback, query, client);
575 }
576 if (IsClientInGame(client))
577 {
578 PrintToChat(client, "[CP] Saved %i checkpoints into the database.", size);
579 }
580}
581public void GetArraySizeMDA(int client)
582{
583 int CPsize = 0;
584 for (int cpSlot = 0.0; cpSlot < MAXCPS; ++cpSlot)
585 {
586 //Check if theres a valid CP
587 if (g_Checkpoint[client][cpSlot][origin][0] != 0.0
588 || g_Checkpoint[client][cpSlot][origin][1] != 0.0
589 || g_Checkpoint[client][cpSlot][origin][2] != 0.0,
590 g_Checkpoint[client][cpSlot][speed][0] != 0.0
591 || g_Checkpoint[client][cpSlot][speed][1] != 0.0
592 || g_Checkpoint[client][cpSlot][speed][2] != 0.0,
593 g_Checkpoint[client][cpSlot][angles][0] != 0.0
594 || g_Checkpoint[client][cpSlot][angles][1] != 0.0
595 || g_Checkpoint[client][cpSlot][angles][2] != 0.0)
596 {
597 ++CPsize;
598 }
599
600 }
601 return CPsize;
602}
603public void DeleteCP_Callback(Handle owner, Handle hndl, const char[] error, any data)
604{
605 if(hndl == INVALID_HANDLE)
606 {
607 LogError("Query failed \"%s\"", error);
608 CloseHandle(g_DB);
609 }
610}
611
612public void SaveCP_Callback(Handle owner, Handle hndl, const char[] error, any data)
613{
614 if(hndl == INVALID_HANDLE)
615 {
616 LogError("Query failed \"%s\"", error);
617 CloseHandle(g_DB);
618 }
619}
620
621public void loadcpfile(int client)
622{
623 int PlayerID = GetPlayerID(client);
624 char query[512];
625 Format(query, sizeof(query), "SELECT Origin_x, Origin_y, Origin_z, Angle_pitch, Angle_yaw, Angle_roll, Speed_x, Speed_y, Speed_z FROM checkpoint WHERE MapID=(SELECT MapID FROM maps WHERE MapName='%s' LIMIT 0, 1) AND PlayerID=%d ORDER BY Cps ASC",
626 g_sMapName,
627 PlayerID);
628
629 SQL_TQuery(g_DB, DB_LoadCP_Callback, query, GetClientUserId(client));
630}
631
632public void DB_LoadCP_Callback(Handle owner, Handle hndl, char[] error, any data)
633{
634 if(hndl == INVALID_HANDLE)
635 {
636 LogError("Query failed \"%s\"", error);
637 CloseHandle(g_DB);
638 }
639 else
640 {
641
642 int client = GetClientOfUserId(data);
643 int start = GetArraySizeMDA(client);
644 int CpSlot = 0;
645 while (SQL_FetchRow(hndl))
646 {
647
648 for (int i; i < 9; i++)
649 {
650
651 g_Checkpoint[client][start + CpSlot][origin][0] = SQL_FetchFloat(hndl, 0),
652 g_Checkpoint[client][start + CpSlot][origin][1] = SQL_FetchFloat(hndl, 1),
653 g_Checkpoint[client][start + CpSlot][origin][2] = SQL_FetchFloat(hndl, 2);
654
655 g_Checkpoint[client][start + CpSlot][angles][0] = SQL_FetchFloat(hndl, 3),
656 g_Checkpoint[client][start + CpSlot][angles][1] = SQL_FetchFloat(hndl, 4),
657 g_Checkpoint[client][start + CpSlot][angles][2] = SQL_FetchFloat(hndl, 5);
658
659 g_Checkpoint[client][start + CpSlot][speed][0] = SQL_FetchFloat(hndl, 6),
660 g_Checkpoint[client][start + CpSlot][speed][1] = SQL_FetchFloat(hndl, 7),
661 g_Checkpoint[client][start + CpSlot][speed][2] = SQL_FetchFloat(hndl, 8);
662
663 }
664
665 CpSlot++;
666 }
667
668 g_CurrentCP[client] = start + CpSlot - 1;
669
670 if (IsClientInGame(client))
671 {
672 PrintToChat(client, "[CP] Loaded %i checkpoints from database.", CpSlot);
673 }
674
675 }
676}
677
678void OpenSaveFileMenu(int client)
679{
680 Handle panel = CreatePanel();
681
682 SetPanelTitle(panel, "Save CP File");
683 DrawPanelItem(panel, "Yes");
684 DrawPanelItem(panel, "No");
685 SendPanelToClient(panel, client, menu_SaveFile, 0);
686 SetMenuExitBackButton(panel, false);
687 CloseHandle(panel);
688}
689public int menu_SaveFile(Handle menu, MenuAction action, int client, int item)
690{
691 switch (action)
692 {
693 case MenuAction_Select:
694 {
695 switch (item)
696 {
697 case 1: //Yes
698 {
699 savecpfile(client);
700 OpenCheckpointMenu(client);
701 }
702 case 2: //No
703 {
704 OpenCheckpointMenu(client);
705 }
706 }
707 }
708 }
709}
710
711void OpenLoadFileMenu(int client)
712{
713 Handle panel = CreatePanel();
714
715 SetPanelTitle(panel, "Load CP File");
716 DrawPanelItem(panel, "Yes");
717 DrawPanelItem(panel, "No");
718 SendPanelToClient(panel, client, menu_LoadFile, 0);
719 SetMenuExitBackButton(panel, true);
720 CloseHandle(panel);
721}
722public int menu_LoadFile(Handle menu, MenuAction action, int client, int item)
723{
724 switch (action)
725 {
726 case MenuAction_Select:
727 {
728 switch (item)
729 {
730 case 1: //Yes
731 {
732 loadcpfile(client);
733 OpenCheckpointMenu(client);
734 }
735 case 2: //No
736 {
737 OpenCheckpointMenu(client);
738 }
739 }
740 }
741 }
742}