Cube  Diff

Differences From Artifact [738828d34a]:

To Artifact [8678daf863]:


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
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







-
+




















-
+







	resolverresults = [[OFMutableArray alloc] init];
	resolverlimit = limit;
	resolversem = SDL_CreateSemaphore(0);

	while (threads > 0) {
		ResolverThread *rt = [ResolverThread thread];
		rt.name = @"resolverthread";
		[resolverthreads addObject:rt];
		[resolverthreads addObject: rt];
		[rt start];
		--threads;
	}
}

void
resolverstop(size_t i, bool restart)
{
	@synchronized(ResolverThread.class) {
		ResolverThread *rt = resolverthreads[i];
		[rt stop];

		if (restart) {
			rt = [ResolverThread thread];
			rt.name = @"resolverthread";

			resolverthreads[i] = rt;

			[rt start];
		} else
			[resolverthreads removeObjectAtIndex:i];
			[resolverthreads removeObjectAtIndex: i];
	}
}

void
resolverclear()
{
	@synchronized(ResolverThread.class) {
67
68
69
70
71
72
73
74

75
76
77
78
79
80
81
67
68
69
70
71
72
73

74
75
76
77
78
79
80
81







-
+







	}
}

void
resolverquery(OFString *name)
{
	@synchronized(ResolverThread.class) {
		[resolverqueries addObject:name];
		[resolverqueries addObject: name];
		SDL_SemPost(resolversem);
	}
}

bool
resolvercheck(OFString **name, ENetAddress *address)
{
114
115
116
117
118
119
120
121

122
123
124
125
126
127

128
129
130

131
132
133
134
135
136
137
114
115
116
117
118
119
120

121
122
123
124
125
126

127
128
129

130
131
132
133
134
135
136
137







-
+





-
+


-
+







	return servers[n].name;
}

void
addserver(OFString *servername)
{
	for (ServerInfo *si in servers)
		if ([si.name isEqual:servername])
		if ([si.name isEqual: servername])
			return;

	if (servers == nil)
		servers = [[OFMutableArray alloc] init];

	[servers addObject:[ServerInfo infoWithName:servername]];
	[servers addObject: [ServerInfo infoWithName: servername]];
}

COMMAND(addserver, ARG_1STR, ^(OFString *servername) {
COMMAND(addserver, ARG_1STR, ^ (OFString *servername) {
	addserver(servername);
})

void
pingservers()
{
	ENetBuffer buf;
159
160
161
162
163
164
165
166

167
168
169
170
171
172
173
159
160
161
162
163
164
165

166
167
168
169
170
171
172
173







-
+







	OFString *name = nil;
	ENetAddress addr = { ENET_HOST_ANY, CUBE_SERVINFO_PORT };
	while (resolvercheck(&name, &addr)) {
		if (addr.host == ENET_HOST_ANY)
			continue;

		for (ServerInfo *si in servers) {
			if ([name isEqual:si.name]) {
			if ([name isEqual: si.name]) {
				si.address = addr;
				addr.host = ENET_HOST_ANY;
				break;
			}
		}
	}
}
213
214
215
216
217
218
219
220
221


222
223
224
225

226
227
228
229


230
231
232
233
234
235
236
237



238
239
240
241
242

243
244
245
246
247
248
249
213
214
215
216
217
218
219


220
221
222
223
224

225

226


227
228
229
230
231
232
233



234
235
236
237
238
239
240

241
242
243
244
245
246
247
248







-
-
+
+



-
+
-

-
-
+
+





-
-
-
+
+
+




-
+







	checkresolver();
	checkpings();
	if (lastmillis - lastinfo >= 5000)
		pingservers();
	[servers sort];

	__block int maxmenu = 16;
	[servers enumerateObjectsUsingBlock:^(
	    ServerInfo *si, size_t i, bool *stop) {
	[servers enumerateObjectsUsingBlock:
	    ^ (ServerInfo *si, size_t i, bool *stop) {
		if (si.address.host != ENET_HOST_ANY && si.ping != 9999) {
			if (si.protocol != PROTOCOL_VERSION)
				si.full = [OFString stringWithFormat:
				        @"%@ [different cube protocol]",
				    @"%@ [different cube protocol]", si.name];
				    si.name];
			else
				si.full = [OFString
				    stringWithFormat:@"%d\t%d\t%@, %@: %@ %@",
				si.full = [OFString stringWithFormat:
				    @"%d\t%d\t%@, %@: %@ %@",
				    si.ping, si.numplayers,
				    si.map.length > 0 ? si.map : @"[unknown]",
				    modestr(si.mode), si.name, si.sdesc];
		} else
			si.full = [OFString stringWithFormat:
			        (si.address.host != ENET_HOST_ANY
			                ? @"%@ [waiting for server response]"
			                : @"%@ [unknown host]\t"),
			    (si.address.host != ENET_HOST_ANY
			    ? @"%@ [waiting for server response]"
			    : @"%@ [unknown host]\t"),
			    si.name];

		// cut off too long server descriptions
		if (si.full.length > 50)
			si.full = [si.full substringToIndex:50];
			si.full = [si.full substringToIndex: 50];

		menumanual(1, i, si.full);

		if (!--maxmenu)
			return;
	}];
}
261
262
263
264
265
266
267
268

269
270
271
272

273
274
275
276
277
278
279
260
261
262
263
264
265
266

267
268
269
270

271
272
273
274
275
276
277
278







-
+



-
+







	for (ServerInfo *si in servers)
		resolverquery(si.name);

	refreshservers();
	menuset(1);
}

COMMAND(servermenu, ARG_NONE, ^{
COMMAND(servermenu, ARG_NONE, ^ {
	servermenu();
})

COMMAND(updatefrommaster, ARG_NONE, ^{
COMMAND(updatefrommaster, ARG_NONE, ^ {
	const int MAXUPD = 32000;
	unsigned char buf[MAXUPD];
	unsigned char *reply = retrieveservers(buf, MAXUPD);
	if (!*reply || strstr((char *)reply, "<html>") ||
	    strstr((char *)reply, "<HTML>"))
		conoutf(@"master server not replying");
	else {