| 301 | vector<uchar> messages; |
| 302 | |
| 303 | void addmsg(int type, const char *fmt, ...) |
| 304 | { |
| 305 | static uchar buf[MAXTRANS]; |
| 306 | ucharbuf p(buf, MAXTRANS); |
| 307 | putint(p, type); |
| 308 | int numi = 1, nums = 0; |
| 309 | bool reliable = false; |
| 310 | if(fmt) |
| 311 | { |
| 312 | va_list args; |
| 313 | va_start(args, fmt); |
| 314 | while(*fmt) switch(*fmt++) |
| 315 | { |
| 316 | case 'r': reliable = true; break; |
| 317 | case 'v': |
| 318 | { |
| 319 | int n = va_arg(args, int); |
| 320 | int *v = va_arg(args, int *); |
| 321 | loopi(n) putint(p, v[i]); |
| 322 | numi += n; |
| 323 | break; |
| 324 | } |
| 325 | |
| 326 | case 'i': |
| 327 | { |
| 328 | int n = isdigit(*fmt) ? *fmt++-'0' : 1; |
| 329 | loopi(n) putint(p, va_arg(args, int)); |
| 330 | numi += n; |
| 331 | break; |
| 332 | } |
| 333 | case 'a': |
| 334 | { |
| 335 | int n = isdigit(*fmt) ? *fmt++-'0' : 1; |
| 336 | loopi(n) putaint(p, va_arg(args, int)); |
| 337 | numi += n; |
| 338 | break; |
| 339 | } |
| 340 | case 's': |
| 341 | { |
| 342 | const char *t = va_arg(args, const char *); |
| 343 | sendstring(t, p); |
| 344 | nums++; |
| 345 | break; |
| 346 | } |
| 347 | } |
| 348 | va_end(args); |
| 349 | } |
| 350 | int num = nums?0:numi, msgsize = msgsizelookup(type); |
| 351 | if(msgsize && num!=msgsize) { fatal("inconsistent msg size for %d (%d != %d)", type, num, msgsize); } |
| 352 | int len = p.length(); |
| 353 | messages.add(len&0xFF); |
| 354 | messages.add((len>>8)|(reliable ? 0x80 : 0)); |
| 355 | loopi(len) messages.add(buf[i]); |
| 356 | } |
| 357 | |
| 358 | static int lastupdate = -1000, lastping = 0; |
| 359 | bool sendmapidenttoserver = false; |
no test coverage detected