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