summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/gokz-replays/nav.sp
blob: 4e73c2f3202606f59ad749b3043ad911ec987588 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
	Ensures that there is .nav file for the map so the server
	does not to auto-generating one.
*/



// =====[ EVENTS ]=====

void OnMapStart_Nav()
{
	if (!CheckForNavFile())
	{
		GenerateNavFile();
	}
}



// =====[ PRIVATE ]=====

static bool CheckForNavFile()
{
	// Make sure there's a nav file
	// Credit to shavit's simple bhop timer - https://github.com/shavitush/bhoptimer

	char mapPath[PLATFORM_MAX_PATH];
	GetCurrentMap(mapPath, sizeof(mapPath));

	char navFilePath[PLATFORM_MAX_PATH];
	FormatEx(navFilePath, PLATFORM_MAX_PATH, "maps/%s.nav", mapPath);

	return FileExists(navFilePath);
}

static void GenerateNavFile()
{
	// Generate (copy a) .nav file for the map
	// Credit to shavit's simple bhop timer - https://github.com/shavitush/bhoptimer

	char mapPath[PLATFORM_MAX_PATH];
	GetCurrentMap(mapPath, sizeof(mapPath));

	char[] navFilePath = new char[PLATFORM_MAX_PATH];
	FormatEx(navFilePath, PLATFORM_MAX_PATH, "maps/%s.nav", mapPath);

	if (!FileExists(RP_NAV_FILE))
	{
		SetFailState("Failed to load file: \"%s\". Check that it exists.", RP_NAV_FILE);
	}
	File_Copy(RP_NAV_FILE, navFilePath);
	ForceChangeLevel(gC_CurrentMap, "[gokz-replays] Generate .nav file.");
}

/*
 * Copies file source to destination
 * Based on code of javalia:
 * http://forums.alliedmods.net/showthread.php?t=159895
 *
 * Credit to shavit's simple bhop timer - https://github.com/shavitush/bhoptimer
 *
 * @param source		Input file
 * @param destination	Output file
 */
static bool File_Copy(const char[] source, const char[] destination)
{
	File file_source = OpenFile(source, "rb");

	if (file_source == null)
	{
		return false;
	}

	File file_destination = OpenFile(destination, "wb");

	if (file_destination == null)
	{
		delete file_source;

		return false;
	}

	int[] buffer = new int[32];
	int cache = 0;

	while (!IsEndOfFile(file_source))
	{
		cache = ReadFile(file_source, buffer, 32, 1);

		file_destination.Write(buffer, cache, 1);
	}

	delete file_source;
	delete file_destination;

	return true;
}