Giter Club home page Giter Club logo

libtw2's Introduction

libtw2

Some Teeworlds stuff in Rust.™

This repository hosts some third-party Teeworlds/DDNet libraries and tooling, written in Rust. Additionally, it has some programming language independent documentation of some Teeworlds/DDNet protocols, in the doc directory.

The highlights are probably

  • doc. The documentation.
  • wireshark-dissector. A working Wireshark dissector for Teeworlds 0.6, Teeworlds 0.7 and DDNet.
  • gamenet/generate/spec. JSON files describing the high-level Teeworlds 0.6, Teeworlds 0.7 and DDNet protocol.

Documentation

More links to other people's documentation can be found in "Resources" on the DDNet Wiki.

Code

The code is split into many smaller and larger libraries. Bold names indicate that the libraries or executables might be useful outside of libtw2.

  • _old. Unmaintained implementation of the low-level file format of Teeworlds/DDNet maps ("datafiles"), written in C, before libtw2 turned to Rust.
  • common. Utilities for all the other crates. Number conversion, byte strings, etc.
  • datafile. Low-level file format of Teeworlds/DDNet maps.
  • demo. Low-level file format of Teeworlds/DDNet demos (replays).
  • downloader. Downloader for maps from game servers.
  • event_loop. Helper for creating Teeworlds/DDNet protocol clients/servers.
  • gamenet. Multiple crates for handling the high-level Teeworlds 0.6, Teeworlds 0.7 and DDNet network protocols.
  • gamenet/generate/spec. JSON files describing the high-level Teeworlds 0.6, Teeworlds 0.7 and DDNet protocol.
  • huffman. Homebrew compression format using Huffman coding, used in demos and over the network. Alternative: Ryozuki's rustyman.
  • logger. Utility crate to unify logging across libtw2 code.
  • map. High-level format of Teeworlds/DDNet maps. You should probably use Patiga's TwMap instead.
  • net. Low-level network protocol of Teeworlds 0.6, Teeworlds 0.7 and DDNet.
  • packer. Encodings for Teeworlds/DDNet network protocols and file formats. See also Ryozuki's teeint for another implementation of Teeworlds/DDNet's variable-length integers.
  • render_map. Render Teeworlds/DDNet maps to images. You should probably use Patiga's TwGpu instead.
  • server. Proof-of-concept Teeworlds 0.6 server implementation.
  • serverbrowse. Server info protocol for Teeworlds 0.5, Teeworlds 0.6, Teeworlds 0.7 and DDNet. See also Ryozuki's teestatus. Essentially superseded by the DDNet HTTPS masterserver protocol, server list is at https://master1.ddnet.org/ddnet/15/servers.json, you should probably use that instead.
  • snapshot Teeworlds/DDNet data structure for transferring gamestate.
  • socket. Helper for creating UDP sockets.
  • stats_browser. Used for adding entries to the DDNet HTTPS masterserver, for game servers not supporting the HTTPS masterserver protocol. Originally intended to provide a tracking for Teeworlds servers. That info can now be found at https://ddnet.org/stats/master/ and parsed using Ryozuki's teemasterparser.
  • teehistorian. DDNet file format for storing all player input. Alternative: Zwelf's teehistorian.
  • tools. Various tools.
  • uniffi. Python bindings for huffman using Mozilla's uniffi: libtw2-huffman.
  • wireshark-dissector. Working Wireshark dissector for Teeworlds 0.6, Teeworlds 0.7 and DDNet.
  • world. Proof-of-concept Teeworlds physics. You should probably use Zwelf's TwGame instead.
  • zlib_minimal. Minimal wrapper around zlib.

libtw2's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

libtw2's Issues

Hook is weaker while hooking to left

libtw2/world/src/lib.rs

Lines 737 to 748 in b928667

pub fn saturated_add(min: f32, max: f32, value: f32, modifier: f32) -> f32 {
if modifier < 0.0 {
if value < min {
return value;
}
} else {
if value > max {
return value;
}
}
clamp(value + modifier, min, max)
}

After changing this code to next given hook problem disappears though

pub fn saturated_add(min: f32, max: f32, value: f32, modifier: f32) -> f32 {
    if modifier < 0.0 {
        if value < min {
            return value;
        } else {
            return min.max(value + modifier);
        }
    } else {
        if value > max {
            return value;
        } else {
            return max.min(value + modifier);
        }
    }
}

Remove `ref_slice` dependency

warning: use of deprecated function `ref_slice::ref_slice`: Similar method was added to std and stabilized in rust 1.28.0. Use `core::slice::from_ref` instead.
 --> common/src/slice.rs:4:20
  |
4 | pub use ref_slice::ref_slice;
  |                    ^^^^^^^^^
  |
  = note: `#[warn(deprecated)]` on by default

warning: use of deprecated function `ref_slice::ref_slice_mut`: Similar method was added to std and stabilized in rust 1.28.0. Use `core::slice::from_mut` instead.
 --> common/src/slice.rs:5:20
  |
5 | pub use ref_slice::mut_ref_slice;
  |                    ^^^^^^^^^^^^^

warning: `common` (lib) generated 2 warnings

teehistorian_index: Run on stdin

Specifying - for stdin as the directory/file (--help says just directory but file also works) does not work, so instead I have to create a temporary file:

xzcat $1 > /tmp/${1:t:r} && ./teehistorian_index /tmp/${1:t:r} | tail -n-1 | cut -d',' -f2- >> ${1:h}/index.txt && rm /tmp/${1:t:r}

teehistorian2demo: Teehistorian(UnexpectedEnd) (exit code: 1)

getting (exit code: 1) error while trying to convert:
18ea384e-42c7-428a-8abd-4f568e392b73.teehistorian
locally on Windows 10 64bit.

I dunno if that's related but:
The demo I get as output isn't the full demo, I think. It's missing the actual run from Aoe, iParano and coradax.
This probably also happens on Learath's teehistorian2demo version because he gets the same demo output as I do locally.

gamenet: Publish to crates.io

It would be helpful to me if you could upload the gamenet crates to crates.io to ease including them (not urgent, because there is a way to specify git dependencies in Cargo.toml, but would be nice to have).

These are my current dependencies to this repository:

gamenet_ddnet = { git = "https://github.com/heinrich5991/libtw2" }
gamenet_teeworlds_0_7 = { git = "https://github.com/heinrich5991/libtw2" }
packer = { git = "https://github.com/heinrich5991/libtw2" }

wireshark-dissector: Resent 0.7 packet marked as broken

[12:22 PM] [quakenet] ChillerDragon: @heinrich5991 are you interested in a dump where your dissector marked a vanilla 0.7 servers resend request as malformed?
[12:23 PM] [quakenet] ChillerDragon: You probably never tested that since its a unhappy path. My client sent a broken startinfo packet and thus the server responded in a unsual way
[12:26 PM] [quakenet] ChillerDragon: here it is in case you want it :) https://zillyhuhn.com/tmp/srv_request_resend_startinfo.pcap
[1:47 PM] [quakenet] ChillerDragon: GetString and GetInt is a bit inconsistent huh? Should be either GetStr and GetInt or GetString and GetIneteger ._.
[1:48 PM] [quakenet] ChillerDragon: or maybe consistent in the C++ world with std::string and int
[2:01 PM] heinrich5991: ChillerDragon: yes, I'm interested
[2:01 PM] heinrich5991: do report bugs for these

image
srv_request_resend_startinfo.pcap.zip

Update rustc version to 1.41.1?

Is there any new feature we want in 1.41.1?

Debian oldstable and stable recently upgraded to that version from 1.34.2. The only other old distro I can see on repology is the newest CentOS 8, with rustc 1.35.0, but I'd be fine with dropping support for it.

wireshark-dissector: crash wmem_alloc: assertion failed

test.zip

^ pcap that causes the crash

crash log:

$ wireshark test.pcap
ERROR:/usr/src/debug/wireshark/wireshark-4.0.4/wsutil/wmem/wmem_core.c:38:wmem_alloc: assertion failed: (allocator->in_scope)
Bail out! ERROR:/usr/src/debug/wireshark/wireshark-4.0.4/wsutil/wmem/wmem_core.c:38:wmem_alloc: assertion failed: (allocator->in_scope)
Aborted (core dumped)

My libtw2 version is self compiled at commit 5b51501

$ wireshark --version
Wireshark 4.0.4 (Git v4.0.4 packaged as 4.0.4-1).

teehistorian2demo: thread 'main' panicked at 'assertion failed: 0 <= self.client_id && self.client_id <= MAX_CLIENTS - 1', gamenet/src/snap_obj.rs:938:9

$ RUST_BACKTRACE=full /media/libtw2/target/debug/teehistorian2demo 7482cb75-d198-4256-b80d-c69f342c95ff.teehistorian
thread 'main' panicked at 'assertion failed: 0 <= self.client_id && self.client_id <= MAX_CLIENTS - 1', gamenet/src/snap_obj.rs:938:9
stack backtrace:
   0:     0x55ee7c3dc360 - std::backtrace_rs::backtrace::libunwind::trace::ha31cb35ba35052ca
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/../../backtrace/src/backtrace/libunwind.rs:96
   1:     0x55ee7c3dc360 - std::backtrace_rs::backtrace::trace_unsynchronized::h914154c46fedb791
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/../../backtrace/src/backtrace/mod.rs:66
   2:     0x55ee7c3dc360 - std::sys_common::backtrace::_print_fmt::h4bed7544cf4783cc
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/sys_common/backtrace.rs:79
   3:     0x55ee7c3dc360 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h71baf994de642464
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/sys_common/backtrace.rs:58
   4:     0x55ee7c3fb7ec - core::fmt::write::hcb5569f97eae5185
                               at /build/rust/src/rustc-1.47.0-src/library/core/src/fmt/mod.rs:1082
   5:     0x55ee7c3da007 - std::io::Write::write_fmt::hec04380539c975a7
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/io/mod.rs:1514
   6:     0x55ee7c3de570 - std::sys_common::backtrace::_print::h7217f428d769d34f
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/sys_common/backtrace.rs:61
   7:     0x55ee7c3de570 - std::sys_common::backtrace::print::heb9b7db110cef504
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/sys_common/backtrace.rs:48
   8:     0x55ee7c3de570 - std::panicking::default_hook::{{closure}}::hc8bd48d88d5fcceb
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/panicking.rs:200
   9:     0x55ee7c3de2bc - std::panicking::default_hook::h4a7994bce6af5114
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/panicking.rs:219
  10:     0x55ee7c3debd3 - std::panicking::rust_panic_with_hook::h796dceade986353b
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/panicking.rs:569
  11:     0x55ee7c286a8c - std::panicking::begin_panic::{{closure}}::h416179a7af2fee40
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/panicking.rs:498
  12:     0x55ee7c2886c9 - std::sys_common::backtrace::__rust_end_short_backtrace::h1b903db681673098
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/sys_common/backtrace.rs:153
  13:     0x55ee7c2869b7 - std::panicking::begin_panic::h33ac19220b99d72e
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/panicking.rs:497
  14:     0x55ee7c27018e - gamenet::snap_obj::PlayerInfo::encode::h3eec30657d2d633e
                               at /media/libtw2/gamenet/src/snap_obj.rs:938
  15:     0x55ee7c1190c7 - teehistorian2demo::process::h4ca4ace54434f115
                               at /media/libtw2/tools/src/bin/teehistorian2demo.rs:200
  16:     0x55ee7c11a400 - teehistorian2demo::main::h9cbf2c5663608aa6
                               at /media/libtw2/tools/src/bin/teehistorian2demo.rs:277
  17:     0x55ee7c11558b - core::ops::function::FnOnce::call_once::h3aa9dde62d42bf95
                               at /build/rust/src/rustc-1.47.0-src/library/core/src/ops/function.rs:227
  18:     0x55ee7c10439e - std::sys_common::backtrace::__rust_begin_short_backtrace::hd0b21bdb1d841623
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/sys_common/backtrace.rs:137
  19:     0x55ee7c114311 - std::rt::lang_start::{{closure}}::hc905b80db833b0ac
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/rt.rs:66
  20:     0x55ee7c3defbe - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h3b46348dde94a3ab
                               at /build/rust/src/rustc-1.47.0-src/library/core/src/ops/function.rs:259
  21:     0x55ee7c3defbe - std::panicking::try::do_call::h65a06556d74549bf
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/panicking.rs:373
  22:     0x55ee7c3defbe - std::panicking::try::h906dbc9901f62921
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/panicking.rs:337
  23:     0x55ee7c3defbe - std::panic::catch_unwind::hd56632d711be2855
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/panic.rs:379
  24:     0x55ee7c3defbe - std::rt::lang_start_internal::h90f188c8b72672f1
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/rt.rs:51
  25:     0x55ee7c1142e7 - std::rt::lang_start::h9e33b6276f9c20b0
                               at /build/rust/src/rustc-1.47.0-src/library/std/src/rt.rs:65
  26:     0x55ee7c11a77a - main
  27:     0x7ff09dad6152 - __libc_start_main
  28:     0x55ee7c10409e - _start
  29:                0x0 - <unknown>

from GER1

huffman: python package fails on ``proc_macro_span_shrink`` in nightly

dtolnay/proc-macro2#348 (comment)

$ pip install libtw2-huffman --break-system-packages --no-cache                                                                                          
Defaulting to user installation because normal site-packages is not writeable
Collecting libtw2-huffman
  Downloading libtw2_huffman-0.2.0.tar.gz (29 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: libtw2-huffman
  Building wheel for libtw2-huffman (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Building wheel for libtw2-huffman (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [41 lines of output]
      Running `maturin pep517 build-wheel -i /usr/bin/python3 --compatibility off`
      🔗 Found uniffi bindings
         Compiling proc-macro2 v1.0.59
         Compiling unicode-ident v1.0.9
         Compiling quote v1.0.28
         Compiling serde v1.0.163
         Compiling thiserror v1.0.40
         Compiling semver v1.0.17
         Compiling serde_json v1.0.96
         Compiling camino v1.1.4
         Compiling memchr v2.5.0
         Compiling anyhow v1.0.71
         Compiling log v0.4.18
         Compiling version_check v0.9.4
         Compiling syn v1.0.109
         Compiling paste v1.0.12
         Compiling minimal-lexical v0.2.1
         Compiling mime v0.3.17
         Compiling ryu v1.0.13
         Compiling itoa v1.0.6
         Compiling once_cell v1.17.2
         Compiling unicase v2.6.0
         Compiling bytes v1.4.0
         Compiling static_assertions v1.1.0
      error[E0635]: unknown feature `proc_macro_span_shrink`
        --> /home/chiller/.cargo/registry/src/index.crates.io-6f17d22bba15001f/proc-macro2-1.0.59/src/lib.rs:92:30
         |
      92 |     feature(proc_macro_span, proc_macro_span_shrink)
         |                              ^^^^^^^^^^^^^^^^^^^^^^
      
         Compiling plain v0.2.3
         Compiling fs-err v2.9.0
         Compiling siphasher v0.3.10
         Compiling askama_escape v0.10.3
      For more information about this error, try `rustc --explain E0635`.
      error: could not compile `proc-macro2` (lib) due to 1 previous error
      warning: build failed, waiting for other jobs to finish...
      💥 maturin failed
        Caused by: Failed to build a native library through cargo
        Caused by: Cargo build finished with "exit status: 101": `env -u CARGO "cargo" "rustc" "--message-format" "json-render-diagnostics" "--manifest-path" "/tmp/pip-install-epylzuge/libtw2-huffman_3e2d95b30d654202b1a63197dab4ade0/Cargo.toml" "--release" "--lib"`
      Error: command ['maturin', 'pep517', 'build-wheel', '-i', '/usr/bin/python3', '--compatibility', 'off'] returned non-zero exit status 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for libtw2-huffman
Failed to build libtw2-huffman
ERROR: Could not build wheels for libtw2-huffman, which is required to install pyproject.toml-based projects
$ rustc --version
rustc 1.77.0-nightly (5d3d3479d 2024-01-23)
$ python --version
Python 3.10.6
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
$ uname -a
Linux debian 6.1.0-16-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.67-1 (2023-12-12) x86_64 GNU/Linux

wireshark-dissector: Not identifying as TW with custom server

The dissector is actually not identifying packets as TW for a custom server implementation. Even using a default DDNet client, the sending packets are also not detected.

image

This is a simple python implementation that reproduces a "The server is full" response message:

import socket

UDP_IP_ADDRESS = "127.0.0.1"
UDP_PORT_NO = 8304

serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))

while True:
    data, addr = serverSock.recvfrom(1024)
    serverSock.sendto(b"\x10\x00\x00\x04\x54\x68\x65\x20\x73\x65\x72\x76\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c", addr)

wireshark-dissector: Fix Windows build

Apparently one can't actually load the built binary into Wireshark.

From Discord:

[8:58 PM] Ravie Senpai: Does someone know how to fix this annoying error? (Followed every step from the "README.md" and compiled it on win11)
image

wireshark-dissector: failed to parse 1460 byte rcon cmd and map list packet

image

Messages in similar format are detected just fine.

0000   00 00 00 00 00 00 00 00 00 00 00 00 86 dd 60 03   ..............`.
0010   75 4b 05 7e 11 40 00 00 00 00 00 00 00 00 00 00   uK.~.@..........
0020   00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00   ................
0030   00 00 00 00 00 01 20 6f d7 43 05 7e 05 91 00 05   ...... o.C.~....
0040   21 4d cb 93 60 41 2f 3e 1d 65 76 61 6c 5f 69 66   !M..`A/>.eval_if
0050   00 45 78 65 63 75 74 65 20 63 6f 6d 6d 61 6e 64   .Execute command
0060   20 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73    if condition is
0070   20 74 72 75 65 00 73 5b 63 6f 6e 66 69 67 5d 20    true.s[config] 
0080   73 5b 63 6f 6d 70 61 72 69 73 6f 6e 5d 20 73 5b   s[comparison] s[
0090   76 61 6c 75 65 5d 20 73 5b 63 6f 6d 6d 61 6e 64   value] s[command
00a0   5d 20 3f 73 5b 65 6c 73 65 5d 20 3f 73 5b 63 6f   ] ?s[else] ?s[co
00b0   6d 6d 61 6e 64 5d 00 40 29 3f 1d 65 78 65 63 00   mmand].@)?.exec.
00c0   45 78 65 63 75 74 65 20 74 68 65 20 73 70 65 63   Execute the spec
00d0   69 66 69 65 64 20 66 69 6c 65 00 72 5b 66 69 6c   ified file.r[fil
00e0   65 5d 00 40 27 40 1d 66 6f 72 63 65 5f 74 65 61   e].@'@.force_tea
00f0   6d 62 61 6c 61 6e 63 65 00 46 6f 72 63 65 20 74   mbalance.Force t
0100   65 61 6d 20 62 61 6c 61 6e 63 65 00 00 41 04 41   eam balance..A.A
0110   1d 6b 69 63 6b 00 4b 69 63 6b 20 70 6c 61 79 65   .kick.Kick playe
0120   72 20 77 69 74 68 20 73 70 65 63 69 66 69 65 64   r with specified
0130   20 69 64 20 66 6f 72 20 61 6e 79 20 72 65 61 73    id for any reas
0140   6f 6e 00 69 5b 69 64 5d 20 3f 72 5b 72 65 61 73   on.i[id] ?r[reas
0150   6f 6e 5d 00 40 1f 42 1d 6c 6f 63 6b 5f 74 65 61   on][email protected]_tea
0160   6d 73 00 4c 6f 63 6b 2f 75 6e 6c 6f 63 6b 20 74   ms.Lock/unlock t
0170   65 61 6d 73 00 00 40 2a 43 1d 6c 6f 67 66 69 6c   eams..@*C.logfil
0180   65 00 46 69 6c 65 6e 61 6d 65 20 74 6f 20 6c 6f   e.Filename to lo
0190   67 20 61 6c 6c 20 6f 75 74 70 75 74 20 74 6f 00   g all output to.
01a0   3f 72 00 40 3e 44 1d 6c 6f 67 66 69 6c 65 5f 74   ?r.@>D.logfile_t
01b0   69 6d 65 73 74 61 6d 70 00 41 64 64 20 61 20 74   imestamp.Add a t
01c0   69 6d 65 20 73 74 61 6d 70 20 74 6f 20 74 68 65   ime stamp to the
01d0   20 6c 6f 67 20 66 69 6c 65 27 73 20 6e 61 6d 65    log file's name
01e0   00 3f 69 00 40 18 45 1d 6c 6f 67 6f 75 74 00 4c   [email protected]
01f0   6f 67 6f 75 74 20 6f 66 20 72 63 6f 6e 00 00 41   ogout of rcon..A
0200   16 46 1d 6d 6f 64 5f 63 6f 6d 6d 61 6e 64 00 53   .F.mod_command.S
0210   70 65 63 69 66 79 20 63 6f 6d 6d 61 6e 64 20 61   pecify command a
0220   63 63 65 73 73 69 62 69 6c 69 74 79 20 66 6f 72   ccessibility for
0230   20 6d 6f 64 65 72 61 74 6f 72 73 00 73 5b 63 6f    moderators.s[co
0240   6d 6d 61 6e 64 5d 20 3f 69 5b 61 63 63 65 73 73   mmand] ?i[access
0250   2d 6c 65 76 65 6c 5d 00 41 03 47 1d 6d 6f 64 5f   -level].A.G.mod_
0260   73 74 61 74 75 73 00 4c 69 73 74 20 61 6c 6c 20   status.List all 
0270   63 6f 6d 6d 61 6e 64 73 20 77 68 69 63 68 20 61   commands which a
0280   72 65 20 61 63 63 65 73 73 69 62 6c 65 20 66 6f   re accessible fo
0290   72 20 6d 6f 64 65 72 61 74 6f 72 73 00 00 40 3a   r moderators..@:
02a0   48 1d 6e 65 74 5f 74 63 70 5f 61 62 6f 72 74 5f   H.net_tcp_abort_
02b0   6f 6e 5f 63 6c 6f 73 65 00 41 62 6f 72 74 73 20   on_close.Aborts 
02c0   74 63 70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f   tcp connection o
02d0   6e 20 63 6c 6f 73 65 00 3f 69 00 40 24 49 1d 70   n close.?i.@$I.p
02e0   61 73 73 77 6f 72 64 00 50 61 73 73 77 6f 72 64   assword.Password
02f0   20 74 6f 20 74 68 65 20 73 65 72 76 65 72 00 3f    to the server.?
0300   72 00 40 26 4a 1d 70 61 75 73 65 00 50 61 75 73   r.@&J.pause.Paus
0310   65 2f 75 6e 70 61 75 73 65 20 67 61 6d 65 00 3f   e/unpause game.?
0320   69 5b 73 65 63 6f 6e 64 73 5d 00 40 22 4b 1d 72   i[seconds].@"K.r
0330   65 63 6f 72 64 00 52 65 63 6f 72 64 20 74 6f 20   ecord.Record to 
0340   61 20 66 69 6c 65 00 3f 73 5b 66 69 6c 65 5d 00   a file.?s[file].
0350   40 18 4c 1d 72 65 6c 6f 61 64 00 52 65 6c 6f 61   @.L.reload.Reloa
0360   64 20 74 68 65 20 6d 61 70 00 00 40 2e 4d 1d 72   d the [email protected]
0370   65 6d 6f 76 65 5f 76 6f 74 65 00 72 65 6d 6f 76   emove_vote.remov
0380   65 20 61 20 76 6f 74 69 6e 67 20 6f 70 74 69 6f   e a voting optio
0390   6e 00 73 5b 6f 70 74 69 6f 6e 5d 00 40 1c 4e 3b   n.s[option][email protected];
03a0   42 6c 6d 61 70 43 68 69 6c 6c 2f 42 6c 6d 61 70   BlmapChill/Blmap
03b0   43 68 69 6c 6c 46 4f 4b 4b 36 00 40 1c 4f 3b 42   [email protected];B
03c0   6c 6d 61 70 43 68 69 6c 6c 2f 42 6c 6d 61 70 43   lmapChill/BlmapC
03d0   68 69 6c 6c 46 4f 4b 4b 34 00 40 18 50 3b 42 6c   [email protected];Bl
03e0   6d 61 70 43 68 69 6c 6c 2f 42 6c 6d 61 70 43 68   mapChill/BlmapCh
03f0   69 6c 6c 34 00 40 1c 51 3b 42 6c 6d 61 70 43 68   [email protected];BlmapCh
0400   69 6c 6c 2f 42 6c 6d 61 70 43 68 69 6c 6c 46 4f   ill/BlmapChillFO
0410   4b 4b 33 00 40 21 52 3b 42 6c 6d 61 70 43 68 69   KK3.@!R;BlmapChi
0420   6c 6c 2f 42 6c 6d 61 70 43 68 69 6c 6c 5f 32 6b   ll/BlmapChill_2k
0430   31 38 5f 62 61 63 6b 00 40 1c 53 3b 42 6c 6d 61   [email protected];Blma
0440   70 43 68 69 6c 6c 2f 42 6c 6d 61 70 43 68 69 6c   pChill/BlmapChil
0450   6c 46 4f 4b 4b 32 00 40 18 54 3b 42 6c 6d 61 70   [email protected];Blmap
0460   43 68 69 6c 6c 2f 42 6c 6d 61 70 43 68 69 6c 6c   Chill/BlmapChill
0470   32 00 40 1b 55 3b 42 6c 6d 61 70 43 68 69 6c 6c   [email protected];BlmapChill
0480   2f 42 6c 6d 61 70 43 68 69 6c 6c 53 41 56 45 00   /BlmapChillSAVE.
0490   40 1c 56 3b 42 6c 6d 61 70 43 68 69 6c 6c 2f 42   @.V;BlmapChill/B
04a0   6c 6d 61 70 43 68 69 6c 6c 46 4f 4b 4b 35 00 40   lmapChillFOKK5.@
04b0   1b 57 3b 42 6c 6d 61 70 43 68 69 6c 6c 2f 42 6c   .W;BlmapChill/Bl
04c0   6d 61 70 43 68 69 6c 6c 5f 31 30 39 00 40 21 58   mapChill_109.@!X
04d0   3b 42 6c 6d 61 70 43 68 69 6c 6c 2f 42 6c 6d 61   ;BlmapChill/Blma
04e0   70 43 68 69 6c 6c 5f 63 69 6e 65 6d 61 5f 74 65   pChill_cinema_te
04f0   00 40 1c 59 3b 42 6c 6d 61 70 43 68 69 6c 6c 2f   [email protected];BlmapChill/
0500   42 6c 6d 61 70 43 68 69 6c 6c 5f 32 6b 31 38 00   BlmapChill_2k18.
0510   40 21 5a 3b 42 6c 6d 61 70 43 68 69 6c 6c 2f 42   @!Z;BlmapChill/B
0520   6c 6d 61 70 43 68 69 6c 6c 5f 63 69 6e 65 6d 61   lmapChill_cinema
0530   74 65 73 00 40 1c 5b 3b 42 6c 6d 61 70 43 68 69   tes.@.[;BlmapChi
0540   6c 6c 2f 42 6c 6d 61 70 43 68 69 6c 6c 5f 74 65   ll/BlmapChill_te
0550   73 74 00 40 1f 5c 3b 42 6c 6d 61 70 43 68 69 6c   st.@.\;BlmapChil
0560   6c 2f 42 6c 6d 61 70 43 68 69 6c 6c 32 2e 30 5f   l/BlmapChill2.0_
0570   53 41 56 45 00 40 18 5d 3b 42 6c 6d 61 70 43 68   SAVE.@.];BlmapCh
0580   69 6c 6c 2f 42 6c 6d 61 70 43 68 69 6c 6c 33 00   ill/BlmapChill3.
0590   40 21 5e 3b 42 6c 6d 61 70 43 68 69 6c 6c 2f 42   @!^;BlmapChill/B
05a0   6c 6d 61 70 43 68 69 6c 6c 5f 32 6b 31 38 5f 62   lmapChill_2k18_b
05b0   61 63 6b 00                                       ack.

Sent by a vanilla 0.7.5 server (latest master as of april 16 2023 teeworlds/teeworlds@26d24ec) to a vanilla client. With a custom map pool (obvious from the ascii dump :D)

pcap.zip

map_properties: Error(Map(TooManyGameLayers))

maps/ddrace_loop.map: Error(Map(TooManyGameLayers))
maps/run_black_jack.map: Error(Map(TooManyGameLayers))
maps/run_hard_hell.map: Error(Map(TooManyGameLayers))
maps/run_inset_into_the_light.map: Error(Map(TooManyGameLayers))
maps/run_WARmoepopo.map: Error(Map(TooManyGameLayers))
maps/Yoko 1.1.map: Error(Map(TooManyGameLayers))

Maps available here: http://maps.ddnet.tw/

Not checking Switch layer

As I wrote on Discord:

I think there is a bug with the software you are using to find out which tiles are in a map to then display it under ddnet.tw/releases. In Skychase 2 there is no special tile marked, but it uses deepfreeze, but from switch layer. You have to look for that layer too, not only for game and front

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.