]> git.lizzy.rs Git - mt.git/commitdiff
Switch to Minetest 5.4.1 protocol and other changes
authoranon5 <anon5clam@protonmail.com>
Sun, 19 Sep 2021 12:45:50 +0000 (12:45 +0000)
committeranon5 <anon5clam@protonmail.com>
Sun, 19 Sep 2021 12:45:50 +0000 (12:45 +0000)
22 files changed:
cmd.go
deserialize.fmt
internal/mkserialize/mkserialize.go
inv.go
itemdef.go
itemmeta.go
mkserialize.sh
mt.go
nodedef.go
pktinfos
pktinfos.go
playerpos.go
proto.go
serialize.fmt
serialize.go
stack.go
tocltcmds
tocltcmds.go
tocltcmds_cmdno.go
toolcaps.go
toolcaps_json.go [new file with mode: 0644]
tosrvcmds.go

diff --git a/cmd.go b/cmd.go
index 68cb9cb66c19e443a3cf1fac89240143b4f5cba2..4059e10b87828570d2fe7f261be4d2be9409f539 100644 (file)
--- a/cmd.go
+++ b/cmd.go
@@ -6,7 +6,7 @@ func (*ToCltHello) cmd()                 {}
 func (*ToCltAcceptAuth) cmd()            {}
 func (*ToCltAcceptSudoMode) cmd()        {}
 func (*ToCltDenySudoMode) cmd()          {}
-func (*ToCltDisco) cmd()                 {}
+func (*ToCltKick) cmd()                  {}
 func (*ToCltBlkData) cmd()               {}
 func (*ToCltAddNode) cmd()               {}
 func (*ToCltRemoveNode) cmd()            {}
@@ -20,7 +20,7 @@ func (*ToCltAORmAdd) cmd()               {}
 func (*ToCltAOMsgs) cmd()                {}
 func (*ToCltHP) cmd()                    {}
 func (*ToCltMovePlayer) cmd()            {}
-func (*ToCltDiscoLegacy) cmd()           {}
+func (*ToCltLegacyKick) cmd()            {}
 func (*ToCltFOV) cmd()                   {}
 func (*ToCltDeathScreen) cmd()           {}
 func (*ToCltMedia) cmd()                 {}
index d2a7c679bad11ff6f77a1ce54d4585f6908791d5..2e5ce49f51156db0e2486ab3c12872d969a97df7 100644 (file)
@@ -99,7 +99,7 @@ PointedThing  {
 []AOMsg        { // For AOInitData.Msgs.
                *p = make([]AOMsg, read8(r))
                for i := range *p {
-                       r := &io.LimitedReader{r, int64(read32(r))}
+                       r := &io.LimitedReader{R: r, N: int64(read32(r))}
                        msg, err := readAOMsg(r)
                        chk(err)
                        (*p)[i] = msg
@@ -111,7 +111,7 @@ PointedThing        {
 
 []NodeDef      { // For ToCltNodeDefs.Defs.
                *p = make([]NodeDef, read16(r))
-               r := &io.LimitedReader{r, int64(read32(r))}
+               r := &io.LimitedReader{R: r, N: int64(read32(r))}
                for i := range *p {
                        (*p)[i].deserialize(r)
                }
index 2ef57e9b4b5f292a4defcbc1abd3ce7891125294..be1ba223258f47ecf3a311d7f07e87709d80b67e 100644 (file)
@@ -50,9 +50,11 @@ func structPragma(c *ast.Comment, sp *[]func(), expr string, de bool) {
                        fmt.Println("{")
                        x := newVar()
                        fmt.Println("var", x, typeStr(tv.Type))
+                       y := newVar()
+                       fmt.Println(y, ":=", arg)
                        genSerialize(tv.Type, x, token.NoPos, nil, de)
-                       fmt.Println("if", x, "!=", "(", tv.Value, ")",
-                               `{ chk(fmt.Errorf("const %v: %v",`, tv.Value, ",", x, ")) }")
+                       fmt.Println("if", x, "!=", y,
+                               `{ chk(fmt.Errorf("const %v: %v",`, strconv.Quote(arg), ",", x, ")) }")
                        fmt.Println("}")
                } else {
                        v := newVar()
@@ -96,7 +98,7 @@ func structPragma(c *ast.Comment, sp *[]func(), expr string, de bool) {
                        if arg == "64" {
                                fmt.Println(`if n > math.MaxInt64 { panic("too big len") }`)
                        }
-                       fmt.Println("r := &io.LimitedReader{r, int64(n)}")
+                       fmt.Println("r := &io.LimitedReader{R: r, N: int64(n)}")
                } else {
                        switch arg {
                        case "8", "32":
@@ -143,6 +145,28 @@ func genSerialize(t types.Type, expr string, pos token.Pos, doc *ast.CommentGrou
                for _, c := range doc.List {
                        pragma := true
                        switch c.Text {
+                       case "//mt:32to16":
+                               t = types.Typ[types.Int16]
+                               if de {
+                                       v := newVar()
+                                       fmt.Println("var", v, "int16")
+                                       defer fmt.Println(expr + " = int32(" + v + ")")
+                                       expr = v
+                               } else {
+                                       expr = "int16(" + expr + ")"
+                               }
+                               pos = token.NoPos
+                       case "//mt:32tou16":
+                               t = types.Typ[types.Uint16]
+                               if de {
+                                       v := newVar()
+                                       fmt.Println("var", v, "uint16")
+                                       defer fmt.Println(expr + " = int32(" + v + ")")
+                                       expr = v
+                               } else {
+                                       expr = "uint16(" + expr + ")"
+                               }
+                               pos = token.NoPos
                        case "//mt:utf16":
                                t = types.NewSlice(types.Typ[types.Uint16])
                                if de {
@@ -151,7 +175,9 @@ func genSerialize(t types.Type, expr string, pos token.Pos, doc *ast.CommentGrou
                                        defer fmt.Println(expr + " = string(utf16.Decode(" + v + "))")
                                        expr = v
                                } else {
-                                       expr = "utf16.Encode([]rune(" + expr + "))"
+                                       v := newVar()
+                                       fmt.Println(v, ":= utf16.Encode([]rune("+expr+"))")
+                                       expr = v
                                }
                                pos = token.NoPos
                        case "//mt:raw":
@@ -298,6 +324,15 @@ func genSerialize(t types.Type, expr string, pos token.Pos, doc *ast.CommentGrou
                                        expr, typeStr(t), v)
                                genSerialize(types.NewArray(t.Elem(), 0), expr, pos, nil, de)
                        } else {
+                               if b, ok := t.Elem().(*types.Basic); ok && b.Kind() == types.Byte {
+                                       fmt.Println("{")
+                                       fmt.Println("var err error")
+                                       fmt.Println(expr, ", err = io.ReadAll(r)")
+                                       fmt.Println("chk(err)")
+                                       fmt.Println("}")
+                                       return
+                               }
+
                                fmt.Println("for {")
                                v := newVar()
                                fmt.Println("var", v, typeStr(t.Elem()))
@@ -468,7 +503,7 @@ var typeNames = []string{
        "ToCltAcceptAuth",
        "ToCltAcceptSudoMode",
        "ToCltDenySudoMode",
-       "ToCltDisco",
+       "ToCltKick",
        "ToCltBlkData",
        "ToCltAddNode",
        "ToCltRemoveNode",
@@ -482,7 +517,7 @@ var typeNames = []string{
        "ToCltAOMsgs",
        "ToCltHP",
        "ToCltMovePlayer",
-       "ToCltDiscoLegacy",
+       "ToCltLegacyKick",
        "ToCltFOV",
        "ToCltDeathScreen",
        "ToCltMedia",
diff --git a/inv.go b/inv.go
index ccd0935f0a3313f4a254375d912950aaac83988c..77e85ca5db41423c99dd199775571809e42806f5 100644 (file)
--- a/inv.go
+++ b/inv.go
@@ -30,13 +30,18 @@ func (i Inv) SerializeKeep(w io.Writer, old Inv) error {
        ew := &errWriter{w: w}
 
        for _, l := range i {
-               if reflect.DeepEqual(&i, old.List(l.Name)) {
+               var oldList InvList
+               if l := old.List(l.Name); l != nil {
+                       oldList = l.InvList
+               }
+
+               if reflect.DeepEqual(&i, oldList) {
                        fmt.Fprintln(ew, "KeepList", l.Name)
                        continue
                }
 
                fmt.Fprintln(ew, "List", l.Name, len(l.Stacks))
-               l.Serialize(ew)
+               l.SerializeKeep(ew, oldList)
        }
        fmt.Fprintln(ew, "EndInventory")
 
@@ -44,7 +49,7 @@ func (i Inv) SerializeKeep(w io.Writer, old Inv) error {
 }
 
 func (i *Inv) Deserialize(r io.Reader) (err error) {
-       s := new(sentinal)
+       s := new(sentinel)
        defer s.recover(&err)
 
        old := *i
@@ -103,6 +108,7 @@ func (l InvList) SerializeKeep(w io.Writer, old InvList) error {
        for i, s := range l.Stacks {
                if i < len(old.Stacks) && s == old.Stacks[i] {
                        fmt.Fprintln(ew, "Keep")
+                       continue
                }
 
                if s.Count > 0 {
@@ -117,7 +123,7 @@ func (l InvList) SerializeKeep(w io.Writer, old InvList) error {
 }
 
 func (l *InvList) Deserialize(r io.Reader) (err error) {
-       s := new(sentinal)
+       s := new(sentinel)
        defer s.recover(&err)
 
        if _, err := fmt.Fscanf(r, "Width %d\n", &l.Width); err != nil {
@@ -186,16 +192,16 @@ func readCmdLn(r io.Reader, cmds map[string]interface{}) error {
        return nil
 }
 
-type sentinal struct {
+type sentinel struct {
        err error
 }
 
-func (s *sentinal) ret(err error) {
+func (s *sentinel) ret(err error) {
        s.err = err
        panic(s)
 }
 
-func (s *sentinal) recover(p *error) {
+func (s *sentinel) recover(p *error) {
        if r := recover(); r != nil {
                if r == s {
                        *p = s.err
index 12651fa73b395a52659cb862554fc4c461b21be8..f203d7e680ab49916718e16a6a1e473a51ba7a05 100644 (file)
@@ -52,7 +52,5 @@ type ItemDef struct {
 
        ShortDesc string
 
-       PlaceParam2 byte
-
        //mt:end
 }
index 563de99e581c03daee97327db4a5d7ffabf6d5cb..d5d5ff0fa00b895bd841eeabf381acf987e45b6e 100644 (file)
@@ -1,6 +1,9 @@
 package mt
 
-import "strings"
+import (
+       "encoding/json"
+       "strings"
+)
 
 type ItemMeta string
 
@@ -71,3 +74,25 @@ func (m *ItemMeta) SetField(name, value string) {
        fields = append(fields, Field{name, value})
        *m = NewItemMeta(fields)
 }
+
+func (m ItemMeta) ToolCaps() (ToolCaps, bool) {
+       f, ok := m.Field("tool_capabilities")
+       if !ok {
+               return ToolCaps{}, false
+       }
+
+       var tc ToolCaps
+       if err := json.Unmarshal([]byte(f), &tc); err != nil {
+               return tc, false
+       }
+       return tc, true
+}
+
+func (m *ItemMeta) SetToolCaps(tc ToolCaps) {
+       b, err := tc.MarshalJSON()
+       if err != nil {
+               panic(err)
+       }
+
+       m.SetField("tool_capabilities", string(b))
+}
index f5f03501b61744c0eec71e264221f748cdbb1786..e403befd03e1537f508677aa764b2db10552cb23 100755 (executable)
@@ -5,7 +5,7 @@ rm -f serialize.go
 (
        echo '// Code generated by mkserialize.sh; DO NOT EDIT.'
        echo
-       internal/mkserialize/mkserialize | goimports
-) >>serialize.go.tmp &&
+       internal/mkserialize/mkserialize
+) | goimports >serialize.go.tmp &&
 mv serialize.go.tmp serialize.go ||
 rm serialize.go.tmp
diff --git a/mt.go b/mt.go
index e7ca84a2d97080e7c78cc4567ea3d1a8bb001966..8c350d6537860e79ab323864dc693e2adc0829d0 100644 (file)
--- a/mt.go
+++ b/mt.go
@@ -1,6 +1,5 @@
 // Package mt implements the high-level Minetest protocol.
-// This version is compatible with
-// https://github.com/ClamityAnarchy/minetest/commit/66adeade9d5c45a5499b5ad1ad4bd91dae82482a.
+// This version is compatible with Minetest 5.4.1.
 package mt
 
 type Node struct {
index 91b82351a13fffbc7341011127a8b87eff84a395..8664caf8e92f601ff509808a09ec9568162035b3 100644 (file)
@@ -158,3 +158,27 @@ type NodeDef struct {
 
        //mt:end
 }
+
+func BuiltinNodeDefs(n int) map[Content]NodeDef {
+       defs := make(map[Content]NodeDef, 3+n)
+       defs[Unknown] = NodeDef{
+               Name: "unknown",
+       }
+       defs[Air] = NodeDef{
+               Name:        "air",
+               DrawType:    DrawNothing,
+               P1Type:      P1Light,
+               Translucent: true,
+               Transparent: true,
+               Replaceable: true,
+               Floodable:   true,
+               GndContent:  true,
+       }
+       defs[Ignore] = NodeDef{
+               Name:        "ignore",
+               DrawType:    DrawNothing,
+               Replaceable: true,
+               GndContent:  true,
+       }
+       return defs
+}
index d43aa192927d87c6132c71370280d357916f710b..d5bf701bd0c2723b87f256f437a7635eaa566716 100644 (file)
--- a/pktinfos
+++ b/pktinfos
@@ -2,7 +2,7 @@ ToCltHello      0       rel
 ToCltAcceptAuth        0       rel
 ToCltAcceptSudoMode    0       rel
 ToCltDenySudoMode      0       rel
-ToCltDisco     0       rel
+ToCltKick      0       rel
 ToCltBlkData   2       rel
 ToCltAddNode   0       rel
 ToCltRemoveNode        0       rel
@@ -16,7 +16,7 @@ ToCltAORmAdd  0       rel
 ToCltAOMsgs    0       rel
 ToCltHP        0       rel
 ToCltMovePlayer        0       rel
-ToCltDiscoLegacy       0       rel
+ToCltLegacyKick        0       rel
 ToCltFOV       0       rel
 ToCltDeathScreen       0       rel
 ToCltMedia     2       rel
index 69856a31949dc071a7ef0279245ebdec3034a3d3..3ab94bfca0959483b8198de13be37641b2c610cf 100644 (file)
@@ -8,7 +8,7 @@ func (*ToCltHello) DefaultPktInfo() rudp.PktInfo                 { return rudp.P
 func (*ToCltAcceptAuth) DefaultPktInfo() rudp.PktInfo            { return rudp.PktInfo{0, false} }
 func (*ToCltAcceptSudoMode) DefaultPktInfo() rudp.PktInfo        { return rudp.PktInfo{0, false} }
 func (*ToCltDenySudoMode) DefaultPktInfo() rudp.PktInfo          { return rudp.PktInfo{0, false} }
-func (*ToCltDisco) DefaultPktInfo() rudp.PktInfo                 { return rudp.PktInfo{0, false} }
+func (*ToCltKick) DefaultPktInfo() rudp.PktInfo                  { return rudp.PktInfo{0, false} }
 func (*ToCltBlkData) DefaultPktInfo() rudp.PktInfo               { return rudp.PktInfo{2, false} }
 func (*ToCltAddNode) DefaultPktInfo() rudp.PktInfo               { return rudp.PktInfo{0, false} }
 func (*ToCltRemoveNode) DefaultPktInfo() rudp.PktInfo            { return rudp.PktInfo{0, false} }
@@ -22,7 +22,7 @@ func (*ToCltAORmAdd) DefaultPktInfo() rudp.PktInfo               { return rudp.P
 func (*ToCltAOMsgs) DefaultPktInfo() rudp.PktInfo                { return rudp.PktInfo{0, false} }
 func (*ToCltHP) DefaultPktInfo() rudp.PktInfo                    { return rudp.PktInfo{0, false} }
 func (*ToCltMovePlayer) DefaultPktInfo() rudp.PktInfo            { return rudp.PktInfo{0, false} }
-func (*ToCltDiscoLegacy) DefaultPktInfo() rudp.PktInfo           { return rudp.PktInfo{0, false} }
+func (*ToCltLegacyKick) DefaultPktInfo() rudp.PktInfo            { return rudp.PktInfo{0, false} }
 func (*ToCltFOV) DefaultPktInfo() rudp.PktInfo                   { return rudp.PktInfo{0, false} }
 func (*ToCltDeathScreen) DefaultPktInfo() rudp.PktInfo           { return rudp.PktInfo{0, false} }
 func (*ToCltMedia) DefaultPktInfo() rudp.PktInfo                 { return rudp.PktInfo{2, false} }
index 946bbaeb11881957dc06a0d088bd616785d26ec8..1a388af66944b601eab3e6bd5b5dd452e064c54e 100644 (file)
@@ -72,3 +72,7 @@ func (p PlayerPos) FOV() float32 {
 func (p *PlayerPos) SetFOV(fov float32) {
        p.FOV80 = uint8(fov * 80)
 }
+
+func (p PlayerPos) StoodOn() [3]int16 {
+       return p.Pos().Sub(Vec{1: 5}).Int()
+}
index b859a3949b0acd3cde42104e5d32e4bb42ad6035..30a94da2c2f841bd4d265d065eac79d392a0a751 100644 (file)
--- a/proto.go
+++ b/proto.go
@@ -8,8 +8,6 @@ import (
        "github.com/anon55555/mt/rudp"
 )
 
-const ChannelCount = rudp.ChannelCount
-
 // A Pkt is a deserialized rudp.Pkt.
 type Pkt struct {
        Cmd
@@ -29,6 +27,10 @@ func (p Peer) Send(pkt Pkt) (ack <-chan struct{}, err error) {
                cmdNo = pkt.Cmd.(ToCltCmd).toCltCmdNo()
        }
 
+       if cmdNo == 0xffff {
+               return nil, p.Close()
+       }
+
        r, w := io.Pipe()
        go func() (err error) {
                defer w.CloseWithError(err)
@@ -78,7 +80,7 @@ func (p Peer) Recv() (_ Pkt, rerr error) {
 
        extra, err := io.ReadAll(pkt)
        if len(extra) > 0 {
-               err = rudp.TrailingDataError(extra)
+               err = fmt.Errorf("%T: %w", cmd, rudp.TrailingDataError(extra))
        }
        return Pkt{cmd, pkt.PktInfo}, err
 }
index 991c22b87d3cddaf9512a7d5bd0291838f9aeb12..d021217104f01d357ea2dc517bf2609b16827384 100644 (file)
@@ -51,9 +51,7 @@ map[uint16]*NodeMeta  {
                        write8(w, 0)
                } else {
                        write8(w, 2)
-                       if len(x) > math.MaxUint16 {
-                               chk(ErrTooLong)
-                       }
+                       // len(map[uint16]...) always < math.MaxUint16
                        write16(w, uint16(len(x)))
                        keys := make([]uint16, 0, len(x))
                        for key := range x {
index 60f4428a520d9f1c1d2823f1a3ce24388f25786b..aaae74685827f7be2e801935cc92fc86839dfabe 100644 (file)
@@ -615,18 +615,9 @@ func (obj *ToSrvInvAction) serialize(w io.Writer) {
 
 func (obj *ToSrvInvAction) deserialize(r io.Reader) {
        var local23 []uint8
-       for {
-               var local24 uint8
-               err := pcall(func() {
-                       {
-                               p := &local24
-                               *p = read8(r)
-                       }
-               })
-               if err == io.EOF {
-                       break
-               }
-               (local23) = append((local23), local24)
+       {
+               var err error
+               (local23), err = io.ReadAll(r)
                chk(err)
        }
        ((*(*(struct {
@@ -636,28 +627,20 @@ func (obj *ToSrvInvAction) deserialize(r io.Reader) {
 }
 
 func (obj *ToSrvChatMsg) serialize(w io.Writer) {
-       if len((utf16.Encode([]rune((*(*(struct {
+       local24 := utf16.Encode([]rune((*(*(struct {
                //mt:utf16
                Msg string
-       }))(obj)).Msg)))) > math.MaxUint16 {
+       }))(obj)).Msg))
+       if len((local24)) > math.MaxUint16 {
                chk(ErrTooLong)
        }
        {
-               x := uint16(len((utf16.Encode([]rune((*(*(struct {
-                       //mt:utf16
-                       Msg string
-               }))(obj)).Msg)))))
+               x := uint16(len((local24)))
                write16(w, uint16(x))
        }
-       for local25 := range utf16.Encode([]rune((*(*(struct {
-               //mt:utf16
-               Msg string
-       }))(obj)).Msg)) {
+       for local25 := range local24 {
                {
-                       x := (utf16.Encode([]rune((*(*(struct {
-                               //mt:utf16
-                               Msg string
-                       }))(obj)).Msg)))[local25]
+                       x := (local24)[local25]
                        write16(w, uint16(x))
                }
        }
@@ -832,7 +815,7 @@ func (obj *ToSrvInteract) deserialize(r io.Reader) {
                        p := &n
                        *p = read32(r)
                }
-               r := &io.LimitedReader{r, int64(n)}
+               r := &io.LimitedReader{R: r, N: int64(n)}
                {
                        p := &(*(*(struct {
                                Action   Interaction
@@ -1863,9 +1846,47 @@ func (obj *ToCltAcceptAuth) deserialize(r io.Reader) {
 }
 
 func (obj *ToCltAcceptSudoMode) serialize(w io.Writer) {
+       if err := pcall(func() {
+               ((*(*(struct {
+                       SudoAuthMethods AuthMethods
+               }))(obj)).SudoAuthMethods).serialize(w)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AuthMethods", err))
+       }
+       {
+               local57 := [15]byte{}
+               {
+                       _, err := w.Write((local57)[:])
+                       chk(err)
+               }
+       }
 }
 
 func (obj *ToCltAcceptSudoMode) deserialize(r io.Reader) {
+       if err := pcall(func() {
+               ((*(*(struct {
+                       SudoAuthMethods AuthMethods
+               }))(obj)).SudoAuthMethods).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AuthMethods", err))
+       }
+       {
+               var local58 [15]byte
+               local59 := [15]byte{}
+               {
+                       _, err := io.ReadFull(r, (local58)[:])
+                       chk(err)
+               }
+               if local58 != local59 {
+                       chk(fmt.Errorf("const %v: %v", "[15]byte{}", local58))
+               }
+       }
 }
 
 func (obj *ToCltDenySudoMode) serialize(w io.Writer) {
@@ -1874,10 +1895,10 @@ func (obj *ToCltDenySudoMode) serialize(w io.Writer) {
 func (obj *ToCltDenySudoMode) deserialize(r io.Reader) {
 }
 
-func (obj *ToCltDisco) serialize(w io.Writer) {
+func (obj *ToCltKick) serialize(w io.Writer) {
        if err := pcall(func() {
                ((*(*(struct {
-                       Reason DiscoReason
+                       Reason KickReason
 
                        //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                        Custom string
@@ -1889,21 +1910,21 @@ func (obj *ToCltDisco) serialize(w io.Writer) {
                if err == io.EOF {
                        chk(io.EOF)
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.DiscoReason", err))
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.KickReason", err))
        }
        if !((*(*(struct {
-               Reason DiscoReason
+               Reason KickReason
 
                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                Custom string
 
                //mt:if dr := %s.Reason; dr == Shutdown || dr == Crash
                Reconnect bool
-       }))(obj)).Reason < maxDiscoReason) {
-               chk(errors.New("assertion failed: %s.Reason < maxDiscoReason"))
+       }))(obj)).Reason < maxKickReason) {
+               chk(errors.New("assertion failed: %s.Reason < maxKickReason"))
        }
        if dr := (*(*(struct {
-               Reason DiscoReason
+               Reason KickReason
 
                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                Custom string
@@ -1912,7 +1933,7 @@ func (obj *ToCltDisco) serialize(w io.Writer) {
                Reconnect bool
        }))(obj)).Reason; dr == Custom || dr == Shutdown || dr == Crash {
                if len(([]byte((*(*(struct {
-                       Reason DiscoReason
+                       Reason KickReason
 
                        //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                        Custom string
@@ -1924,7 +1945,7 @@ func (obj *ToCltDisco) serialize(w io.Writer) {
                }
                {
                        x := uint16(len(([]byte((*(*(struct {
-                               Reason DiscoReason
+                               Reason KickReason
 
                                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                                Custom string
@@ -1936,7 +1957,7 @@ func (obj *ToCltDisco) serialize(w io.Writer) {
                }
                {
                        _, err := w.Write(([]byte((*(*(struct {
-                               Reason DiscoReason
+                               Reason KickReason
 
                                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                                Custom string
@@ -1948,7 +1969,7 @@ func (obj *ToCltDisco) serialize(w io.Writer) {
                }
        }
        if dr := (*(*(struct {
-               Reason DiscoReason
+               Reason KickReason
 
                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                Custom string
@@ -1958,7 +1979,7 @@ func (obj *ToCltDisco) serialize(w io.Writer) {
        }))(obj)).Reason; dr == Shutdown || dr == Crash {
                {
                        x := (*(*(struct {
-                               Reason DiscoReason
+                               Reason KickReason
 
                                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                                Custom string
@@ -1975,10 +1996,10 @@ func (obj *ToCltDisco) serialize(w io.Writer) {
        }
 }
 
-func (obj *ToCltDisco) deserialize(r io.Reader) {
+func (obj *ToCltKick) deserialize(r io.Reader) {
        if err := pcall(func() {
                ((*(*(struct {
-                       Reason DiscoReason
+                       Reason KickReason
 
                        //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                        Custom string
@@ -1990,21 +2011,21 @@ func (obj *ToCltDisco) deserialize(r io.Reader) {
                if err == io.EOF {
                        chk(io.EOF)
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.DiscoReason", err))
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.KickReason", err))
        }
        if !((*(*(struct {
-               Reason DiscoReason
+               Reason KickReason
 
                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                Custom string
 
                //mt:if dr := %s.Reason; dr == Shutdown || dr == Crash
                Reconnect bool
-       }))(obj)).Reason < maxDiscoReason) {
-               chk(errors.New("assertion failed: %s.Reason < maxDiscoReason"))
+       }))(obj)).Reason < maxKickReason) {
+               chk(errors.New("assertion failed: %s.Reason < maxKickReason"))
        }
        if dr := (*(*(struct {
-               Reason DiscoReason
+               Reason KickReason
 
                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                Custom string
@@ -2012,29 +2033,29 @@ func (obj *ToCltDisco) deserialize(r io.Reader) {
                //mt:if dr := %s.Reason; dr == Shutdown || dr == Crash
                Reconnect bool
        }))(obj)).Reason; dr == Custom || dr == Shutdown || dr == Crash {
-               var local57 []uint8
-               var local58 uint16
+               var local60 []uint8
+               var local61 uint16
                {
-                       p := &local58
+                       p := &local61
                        *p = read16(r)
                }
-               (local57) = make([]uint8, local58)
+               (local60) = make([]uint8, local61)
                {
-                       _, err := io.ReadFull(r, (local57)[:])
+                       _, err := io.ReadFull(r, (local60)[:])
                        chk(err)
                }
                ((*(*(struct {
-                       Reason DiscoReason
+                       Reason KickReason
 
                        //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                        Custom string
 
                        //mt:if dr := %s.Reason; dr == Shutdown || dr == Crash
                        Reconnect bool
-               }))(obj)).Custom) = string(local57)
+               }))(obj)).Custom) = string(local60)
        }
        if dr := (*(*(struct {
-               Reason DiscoReason
+               Reason KickReason
 
                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                Custom string
@@ -2044,7 +2065,7 @@ func (obj *ToCltDisco) deserialize(r io.Reader) {
        }))(obj)).Reason; dr == Shutdown || dr == Crash {
                {
                        p := &(*(*(struct {
-                               Reason DiscoReason
+                               Reason KickReason
 
                                //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
                                Custom string
@@ -2065,7 +2086,7 @@ func (obj *ToCltDisco) deserialize(r io.Reader) {
 }
 
 func (obj *ToCltBlkData) serialize(w io.Writer) {
-       for local59 := range (*(*(struct {
+       for local62 := range (*(*(struct {
                Blkpos [3]int16
                Blk    MapBlk
        }))(obj)).Blkpos {
@@ -2073,7 +2094,7 @@ func (obj *ToCltBlkData) serialize(w io.Writer) {
                        x := ((*(*(struct {
                                Blkpos [3]int16
                                Blk    MapBlk
-                       }))(obj)).Blkpos)[local59]
+                       }))(obj)).Blkpos)[local62]
                        write16(w, uint16(x))
                }
        }
@@ -2091,7 +2112,7 @@ func (obj *ToCltBlkData) serialize(w io.Writer) {
 }
 
 func (obj *ToCltBlkData) deserialize(r io.Reader) {
-       for local60 := range (*(*(struct {
+       for local63 := range (*(*(struct {
                Blkpos [3]int16
                Blk    MapBlk
        }))(obj)).Blkpos {
@@ -2099,7 +2120,7 @@ func (obj *ToCltBlkData) deserialize(r io.Reader) {
                        p := &((*(*(struct {
                                Blkpos [3]int16
                                Blk    MapBlk
-                       }))(obj)).Blkpos)[local60]
+                       }))(obj)).Blkpos)[local63]
                        *p = int16(read16(r))
                }
        }
@@ -2117,7 +2138,7 @@ func (obj *ToCltBlkData) deserialize(r io.Reader) {
 }
 
 func (obj *ToCltAddNode) serialize(w io.Writer) {
-       for local61 := range (*(*(struct {
+       for local64 := range (*(*(struct {
                Pos [3]int16
                Node
                KeepMeta bool
@@ -2127,7 +2148,7 @@ func (obj *ToCltAddNode) serialize(w io.Writer) {
                                Pos [3]int16
                                Node
                                KeepMeta bool
-                       }))(obj)).Pos)[local61]
+                       }))(obj)).Pos)[local64]
                        write16(w, uint16(x))
                }
        }
@@ -2158,7 +2179,7 @@ func (obj *ToCltAddNode) serialize(w io.Writer) {
 }
 
 func (obj *ToCltAddNode) deserialize(r io.Reader) {
-       for local62 := range (*(*(struct {
+       for local65 := range (*(*(struct {
                Pos [3]int16
                Node
                KeepMeta bool
@@ -2168,7 +2189,7 @@ func (obj *ToCltAddNode) deserialize(r io.Reader) {
                                Pos [3]int16
                                Node
                                KeepMeta bool
-                       }))(obj)).Pos)[local62]
+                       }))(obj)).Pos)[local65]
                        *p = int16(read16(r))
                }
        }
@@ -2202,26 +2223,26 @@ func (obj *ToCltAddNode) deserialize(r io.Reader) {
 }
 
 func (obj *ToCltRemoveNode) serialize(w io.Writer) {
-       for local63 := range (*(*(struct {
+       for local66 := range (*(*(struct {
                Pos [3]int16
        }))(obj)).Pos {
                {
                        x := ((*(*(struct {
                                Pos [3]int16
-                       }))(obj)).Pos)[local63]
+                       }))(obj)).Pos)[local66]
                        write16(w, uint16(x))
                }
        }
 }
 
 func (obj *ToCltRemoveNode) deserialize(r io.Reader) {
-       for local64 := range (*(*(struct {
+       for local67 := range (*(*(struct {
                Pos [3]int16
        }))(obj)).Pos {
                {
                        p := &((*(*(struct {
                                Pos [3]int16
-                       }))(obj)).Pos)[local64]
+                       }))(obj)).Pos)[local67]
                        *p = int16(read16(r))
                }
        }
@@ -2238,25 +2259,16 @@ func (obj *ToCltInv) serialize(w io.Writer) {
 }
 
 func (obj *ToCltInv) deserialize(r io.Reader) {
-       var local65 []uint8
-       for {
-               var local66 uint8
-               err := pcall(func() {
-                       {
-                               p := &local66
-                               *p = read8(r)
-                       }
-               })
-               if err == io.EOF {
-                       break
-               }
-               (local65) = append((local65), local66)
+       var local68 []uint8
+       {
+               var err error
+               (local68), err = io.ReadAll(r)
                chk(err)
        }
        ((*(*(struct {
                //mt:raw
                Inv string
-       }))(obj)).Inv) = string(local65)
+       }))(obj)).Inv) = string(local68)
 }
 
 func (obj *ToCltTimeOfDay) serialize(w io.Writer) {
@@ -2375,9 +2387,9 @@ func (obj *ToCltAddPlayerVel) deserialize(r io.Reader) {
 
 func (obj *ToCltMediaPush) serialize(w io.Writer) {
        {
-               local67 := uint16(sha1.Size)
+               local69 := uint16(sha1.Size)
                {
-                       x := local67
+                       x := local69
                        write16(w, uint16(x))
                }
        }
@@ -2483,13 +2495,14 @@ func (obj *ToCltMediaPush) serialize(w io.Writer) {
 
 func (obj *ToCltMediaPush) deserialize(r io.Reader) {
        {
-               var local68 uint16
+               var local70 uint16
+               local71 := uint16(sha1.Size)
                {
-                       p := &local68
+                       p := &local70
                        *p = read16(r)
                }
-               if local68 != (20) {
-                       chk(fmt.Errorf("const %v: %v", 20, local68))
+               if local70 != local71 {
+                       chk(fmt.Errorf("const %v: %v", "uint16(sha1.Size)", local70))
                }
        }
        {
@@ -2504,15 +2517,15 @@ func (obj *ToCltMediaPush) deserialize(r io.Reader) {
                }))(obj)).SHA1)[:])
                chk(err)
        }
-       var local69 []uint8
-       var local70 uint16
+       var local72 []uint8
+       var local73 uint16
        {
-               p := &local70
+               p := &local73
                *p = read16(r)
        }
-       (local69) = make([]uint8, local70)
+       (local72) = make([]uint8, local73)
        {
-               _, err := io.ReadFull(r, (local69)[:])
+               _, err := io.ReadFull(r, (local72)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -2523,7 +2536,7 @@ func (obj *ToCltMediaPush) deserialize(r io.Reader) {
 
                //mt:len32
                Data []byte
-       }))(obj)).Filename) = string(local69)
+       }))(obj)).Filename) = string(local72)
        {
                p := &(*(*(struct {
                        //mt:const uint16(sha1.Size)
@@ -2543,9 +2556,9 @@ func (obj *ToCltMediaPush) deserialize(r io.Reader) {
                        chk(fmt.Errorf("invalid bool: %d", n))
                }
        }
-       var local71 uint32
+       var local74 uint32
        {
-               p := &local71
+               p := &local74
                *p = read32(r)
        }
        ((*(*(struct {
@@ -2556,7 +2569,7 @@ func (obj *ToCltMediaPush) deserialize(r io.Reader) {
 
                //mt:len32
                Data []byte
-       }))(obj)).Data) = make([]byte, local71)
+       }))(obj)).Data) = make([]byte, local74)
        {
                _, err := io.ReadFull(r, ((*(*(struct {
                        //mt:const uint16(sha1.Size)
@@ -2573,9 +2586,9 @@ func (obj *ToCltMediaPush) deserialize(r io.Reader) {
 
 func (obj *ToCltChatMsg) serialize(w io.Writer) {
        {
-               local72 := uint8(1)
+               local75 := uint8(1)
                {
-                       x := local72
+                       x := local75
                        write8(w, uint8(x))
                }
        }
@@ -2594,85 +2607,45 @@ func (obj *ToCltChatMsg) serialize(w io.Writer) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ChatMsgType", err))
        }
-       if len((utf16.Encode([]rune((*(*(struct {
+       local76 := utf16.Encode([]rune((*(*(struct {
                Type ChatMsgType
 
                //mt:utf16
                Sender, Text string
 
                Timestamp int64 // Unix time.
-       }))(obj)).Sender)))) > math.MaxUint16 {
+       }))(obj)).Sender))
+       if len((local76)) > math.MaxUint16 {
                chk(ErrTooLong)
        }
        {
-               x := uint16(len((utf16.Encode([]rune((*(*(struct {
-                       Type ChatMsgType
-
-                       //mt:utf16
-                       Sender, Text string
-
-                       Timestamp int64 // Unix time.
-               }))(obj)).Sender)))))
+               x := uint16(len((local76)))
                write16(w, uint16(x))
        }
-       for local73 := range utf16.Encode([]rune((*(*(struct {
-               Type ChatMsgType
-
-               //mt:utf16
-               Sender, Text string
-
-               Timestamp int64 // Unix time.
-       }))(obj)).Sender)) {
+       for local77 := range local76 {
                {
-                       x := (utf16.Encode([]rune((*(*(struct {
-                               Type ChatMsgType
-
-                               //mt:utf16
-                               Sender, Text string
-
-                               Timestamp int64 // Unix time.
-                       }))(obj)).Sender)))[local73]
+                       x := (local76)[local77]
                        write16(w, uint16(x))
                }
        }
-       if len((utf16.Encode([]rune((*(*(struct {
+       local78 := utf16.Encode([]rune((*(*(struct {
                Type ChatMsgType
 
                //mt:utf16
                Sender, Text string
 
                Timestamp int64 // Unix time.
-       }))(obj)).Text)))) > math.MaxUint16 {
+       }))(obj)).Text))
+       if len((local78)) > math.MaxUint16 {
                chk(ErrTooLong)
        }
        {
-               x := uint16(len((utf16.Encode([]rune((*(*(struct {
-                       Type ChatMsgType
-
-                       //mt:utf16
-                       Sender, Text string
-
-                       Timestamp int64 // Unix time.
-               }))(obj)).Text)))))
+               x := uint16(len((local78)))
                write16(w, uint16(x))
        }
-       for local74 := range utf16.Encode([]rune((*(*(struct {
-               Type ChatMsgType
-
-               //mt:utf16
-               Sender, Text string
-
-               Timestamp int64 // Unix time.
-       }))(obj)).Text)) {
+       for local79 := range local78 {
                {
-                       x := (utf16.Encode([]rune((*(*(struct {
-                               Type ChatMsgType
-
-                               //mt:utf16
-                               Sender, Text string
-
-                               Timestamp int64 // Unix time.
-                       }))(obj)).Text)))[local74]
+                       x := (local78)[local79]
                        write16(w, uint16(x))
                }
        }
@@ -2691,13 +2664,14 @@ func (obj *ToCltChatMsg) serialize(w io.Writer) {
 
 func (obj *ToCltChatMsg) deserialize(r io.Reader) {
        {
-               var local75 uint8
+               var local80 uint8
+               local81 := uint8(1)
                {
-                       p := &local75
+                       p := &local80
                        *p = read8(r)
                }
-               if local75 != (1) {
-                       chk(fmt.Errorf("const %v: %v", 1, local75))
+               if local80 != local81 {
+                       chk(fmt.Errorf("const %v: %v", "uint8(1)", local80))
                }
        }
        if err := pcall(func() {
@@ -2715,16 +2689,16 @@ func (obj *ToCltChatMsg) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ChatMsgType", err))
        }
-       var local76 []uint16
-       var local77 uint16
+       var local82 []uint16
+       var local83 uint16
        {
-               p := &local77
+               p := &local83
                *p = read16(r)
        }
-       (local76) = make([]uint16, local77)
-       for local78 := range local76 {
+       (local82) = make([]uint16, local83)
+       for local84 := range local82 {
                {
-                       p := &(local76)[local78]
+                       p := &(local82)[local84]
                        *p = read16(r)
                }
        }
@@ -2735,17 +2709,17 @@ func (obj *ToCltChatMsg) deserialize(r io.Reader) {
                Sender, Text string
 
                Timestamp int64 // Unix time.
-       }))(obj)).Sender = string(utf16.Decode(local76))
-       var local79 []uint16
-       var local80 uint16
+       }))(obj)).Sender = string(utf16.Decode(local82))
+       var local85 []uint16
+       var local86 uint16
        {
-               p := &local80
+               p := &local86
                *p = read16(r)
        }
-       (local79) = make([]uint16, local80)
-       for local81 := range local79 {
+       (local85) = make([]uint16, local86)
+       for local87 := range local85 {
                {
-                       p := &(local79)[local81]
+                       p := &(local85)[local87]
                        *p = read16(r)
                }
        }
@@ -2756,7 +2730,7 @@ func (obj *ToCltChatMsg) deserialize(r io.Reader) {
                Sender, Text string
 
                Timestamp int64 // Unix time.
-       }))(obj)).Text = string(utf16.Decode(local79))
+       }))(obj)).Text = string(utf16.Decode(local85))
        {
                p := &(*(*(struct {
                        Type ChatMsgType
@@ -2773,46 +2747,26 @@ func (obj *ToCltChatMsg) deserialize(r io.Reader) {
 func (obj *ToCltAORmAdd) serialize(w io.Writer) {
        if len(((*(*(struct {
                Remove []AOID
-               Add    []struct {
-                       ID AOID
-                       //mt:const genericCAO
-                       //mt:lenhdr 32
-                       InitData AOInitData
-               }
+               Add    []AOAdd
        }))(obj)).Remove)) > math.MaxUint16 {
                chk(ErrTooLong)
        }
        {
                x := uint16(len(((*(*(struct {
                        Remove []AOID
-                       Add    []struct {
-                               ID AOID
-                               //mt:const genericCAO
-                               //mt:lenhdr 32
-                               InitData AOInitData
-                       }
+                       Add    []AOAdd
                }))(obj)).Remove)))
                write16(w, uint16(x))
        }
-       for local82 := range (*(*(struct {
+       for local88 := range (*(*(struct {
                Remove []AOID
-               Add    []struct {
-                       ID AOID
-                       //mt:const genericCAO
-                       //mt:lenhdr 32
-                       InitData AOInitData
-               }
+               Add    []AOAdd
        }))(obj)).Remove {
                if err := pcall(func() {
                        (((*(*(struct {
                                Remove []AOID
-                               Add    []struct {
-                                       ID AOID
-                                       //mt:const genericCAO
-                                       //mt:lenhdr 32
-                                       InitData AOInitData
-                               }
-                       }))(obj)).Remove)[local82]).serialize(w)
+                               Add    []AOAdd
+                       }))(obj)).Remove)[local88]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -2822,135 +2776,54 @@ func (obj *ToCltAORmAdd) serialize(w io.Writer) {
        }
        if len(((*(*(struct {
                Remove []AOID
-               Add    []struct {
-                       ID AOID
-                       //mt:const genericCAO
-                       //mt:lenhdr 32
-                       InitData AOInitData
-               }
+               Add    []AOAdd
        }))(obj)).Add)) > math.MaxUint16 {
                chk(ErrTooLong)
        }
        {
                x := uint16(len(((*(*(struct {
                        Remove []AOID
-                       Add    []struct {
-                               ID AOID
-                               //mt:const genericCAO
-                               //mt:lenhdr 32
-                               InitData AOInitData
-                       }
+                       Add    []AOAdd
                }))(obj)).Add)))
                write16(w, uint16(x))
        }
-       for local83 := range (*(*(struct {
+       for local89 := range (*(*(struct {
                Remove []AOID
-               Add    []struct {
-                       ID AOID
-                       //mt:const genericCAO
-                       //mt:lenhdr 32
-                       InitData AOInitData
-               }
+               Add    []AOAdd
        }))(obj)).Add {
                if err := pcall(func() {
-                       ((((*(*(struct {
+                       (((*(*(struct {
                                Remove []AOID
-                               Add    []struct {
-                                       ID AOID
-                                       //mt:const genericCAO
-                                       //mt:lenhdr 32
-                                       InitData AOInitData
-                               }
-                       }))(obj)).Add)[local83]).ID).serialize(w)
+                               Add    []AOAdd
+                       }))(obj)).Add)[local89]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
                        }
-                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
-               }
-               {
-                       local84 := genericCAO
-                       if err := pcall(func() {
-                               (local84).serialize(w)
-                       }); err != nil {
-                               if err == io.EOF {
-                                       chk(io.EOF)
-                               }
-                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.aoType", err))
-                       }
-               }
-               {
-                       ow := w
-                       w := new(bytes.Buffer)
-                       if err := pcall(func() {
-                               ((((*(*(struct {
-                                       Remove []AOID
-                                       Add    []struct {
-                                               ID AOID
-                                               //mt:const genericCAO
-                                               //mt:lenhdr 32
-                                               InitData AOInitData
-                                       }
-                               }))(obj)).Add)[local83]).InitData).serialize(w)
-                       }); err != nil {
-                               if err == io.EOF {
-                                       chk(io.EOF)
-                               }
-                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOInitData", err))
-                       }
-                       {
-                               buf := w
-                               w := ow
-                               if len((buf.Bytes())) > math.MaxUint32 {
-                                       chk(ErrTooLong)
-                               }
-                               {
-                                       x := uint32(len((buf.Bytes())))
-                                       write32(w, uint32(x))
-                               }
-                               {
-                                       _, err := w.Write((buf.Bytes())[:])
-                                       chk(err)
-                               }
-                       }
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOAdd", err))
                }
        }
 }
 
 func (obj *ToCltAORmAdd) deserialize(r io.Reader) {
-       var local85 uint16
+       var local90 uint16
        {
-               p := &local85
+               p := &local90
                *p = read16(r)
        }
        ((*(*(struct {
                Remove []AOID
-               Add    []struct {
-                       ID AOID
-                       //mt:const genericCAO
-                       //mt:lenhdr 32
-                       InitData AOInitData
-               }
-       }))(obj)).Remove) = make([]AOID, local85)
-       for local86 := range (*(*(struct {
+               Add    []AOAdd
+       }))(obj)).Remove) = make([]AOID, local90)
+       for local91 := range (*(*(struct {
                Remove []AOID
-               Add    []struct {
-                       ID AOID
-                       //mt:const genericCAO
-                       //mt:lenhdr 32
-                       InitData AOInitData
-               }
+               Add    []AOAdd
        }))(obj)).Remove {
                if err := pcall(func() {
                        (((*(*(struct {
                                Remove []AOID
-                               Add    []struct {
-                                       ID AOID
-                                       //mt:const genericCAO
-                                       //mt:lenhdr 32
-                                       InitData AOInitData
-                               }
-                       }))(obj)).Remove)[local86]).deserialize(r)
+                               Add    []AOAdd
+                       }))(obj)).Remove)[local91]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -2958,94 +2831,35 @@ func (obj *ToCltAORmAdd) deserialize(r io.Reader) {
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
                }
        }
-       var local87 uint16
+       var local92 uint16
        {
-               p := &local87
+               p := &local92
                *p = read16(r)
        }
        ((*(*(struct {
                Remove []AOID
-               Add    []struct {
-                       ID AOID
-                       //mt:const genericCAO
-                       //mt:lenhdr 32
-                       InitData AOInitData
-               }
-       }))(obj)).Add) = make([]struct {
-               ID       AOID
-               InitData AOInitData
-       }, local87)
-       for local88 := range (*(*(struct {
+               Add    []AOAdd
+       }))(obj)).Add) = make([]AOAdd, local92)
+       for local93 := range (*(*(struct {
                Remove []AOID
-               Add    []struct {
-                       ID AOID
-                       //mt:const genericCAO
-                       //mt:lenhdr 32
-                       InitData AOInitData
-               }
+               Add    []AOAdd
        }))(obj)).Add {
                if err := pcall(func() {
-                       ((((*(*(struct {
+                       (((*(*(struct {
                                Remove []AOID
-                               Add    []struct {
-                                       ID AOID
-                                       //mt:const genericCAO
-                                       //mt:lenhdr 32
-                                       InitData AOInitData
-                               }
-                       }))(obj)).Add)[local88]).ID).deserialize(r)
+                               Add    []AOAdd
+                       }))(obj)).Add)[local93]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
                        }
-                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
-               }
-               {
-                       var local89 aoType
-                       if err := pcall(func() {
-                               (local89).deserialize(r)
-                       }); err != nil {
-                               if err == io.EOF {
-                                       chk(io.EOF)
-                               }
-                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.aoType", err))
-                       }
-                       if local89 != (101) {
-                               chk(fmt.Errorf("const %v: %v", 101, local89))
-                       }
-               }
-               {
-                       var n uint32
-                       {
-                               p := &n
-                               *p = read32(r)
-                       }
-                       r := &io.LimitedReader{r, int64(n)}
-                       if err := pcall(func() {
-                               ((((*(*(struct {
-                                       Remove []AOID
-                                       Add    []struct {
-                                               ID AOID
-                                               //mt:const genericCAO
-                                               //mt:lenhdr 32
-                                               InitData AOInitData
-                                       }
-                               }))(obj)).Add)[local88]).InitData).deserialize(r)
-                       }); err != nil {
-                               if err == io.EOF {
-                                       chk(io.EOF)
-                               }
-                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOInitData", err))
-                       }
-                       if r.N > 0 {
-                               chk(fmt.Errorf("%d bytes of trailing data", r.N))
-                       }
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOAdd", err))
                }
        }
 }
 
 func (obj *ToCltAOMsgs) serialize(w io.Writer) {
-       for local90 := range (*(*(struct {
+       for local94 := range (*(*(struct {
                //mt:raw
                Msgs []IDAOMsg
        }))(obj)).Msgs {
@@ -3053,7 +2867,7 @@ func (obj *ToCltAOMsgs) serialize(w io.Writer) {
                        (((*(*(struct {
                                //mt:raw
                                Msgs []IDAOMsg
-                       }))(obj)).Msgs)[local90]).serialize(w)
+                       }))(obj)).Msgs)[local94]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -3065,10 +2879,10 @@ func (obj *ToCltAOMsgs) serialize(w io.Writer) {
 
 func (obj *ToCltAOMsgs) deserialize(r io.Reader) {
        for {
-               var local91 IDAOMsg
+               var local95 IDAOMsg
                err := pcall(func() {
                        if err := pcall(func() {
-                               (local91).deserialize(r)
+                               (local95).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -3085,7 +2899,7 @@ func (obj *ToCltAOMsgs) deserialize(r io.Reader) {
                }))(obj)).Msgs) = append(((*(*(struct {
                        //mt:raw
                        Msgs []IDAOMsg
-               }))(obj)).Msgs), local91)
+               }))(obj)).Msgs), local95)
                chk(err)
        }
 }
@@ -3164,52 +2978,44 @@ func (obj *ToCltMovePlayer) deserialize(r io.Reader) {
        }
 }
 
-func (obj *ToCltDiscoLegacy) serialize(w io.Writer) {
-       if len((utf16.Encode([]rune((*(*(struct {
+func (obj *ToCltLegacyKick) serialize(w io.Writer) {
+       local96 := utf16.Encode([]rune((*(*(struct {
                //mt:utf16
                Reason string
-       }))(obj)).Reason)))) > math.MaxUint16 {
+       }))(obj)).Reason))
+       if len((local96)) > math.MaxUint16 {
                chk(ErrTooLong)
        }
        {
-               x := uint16(len((utf16.Encode([]rune((*(*(struct {
-                       //mt:utf16
-                       Reason string
-               }))(obj)).Reason)))))
+               x := uint16(len((local96)))
                write16(w, uint16(x))
        }
-       for local92 := range utf16.Encode([]rune((*(*(struct {
-               //mt:utf16
-               Reason string
-       }))(obj)).Reason)) {
+       for local97 := range local96 {
                {
-                       x := (utf16.Encode([]rune((*(*(struct {
-                               //mt:utf16
-                               Reason string
-                       }))(obj)).Reason)))[local92]
+                       x := (local96)[local97]
                        write16(w, uint16(x))
                }
        }
 }
 
-func (obj *ToCltDiscoLegacy) deserialize(r io.Reader) {
-       var local93 []uint16
-       var local94 uint16
+func (obj *ToCltLegacyKick) deserialize(r io.Reader) {
+       var local98 []uint16
+       var local99 uint16
        {
-               p := &local94
+               p := &local99
                *p = read16(r)
        }
-       (local93) = make([]uint16, local94)
-       for local95 := range local93 {
+       (local98) = make([]uint16, local99)
+       for local100 := range local98 {
                {
-                       p := &(local93)[local95]
+                       p := &(local98)[local100]
                        *p = read16(r)
                }
        }
        (*(*(struct {
                //mt:utf16
                Reason string
-       }))(obj)).Reason = string(utf16.Decode(local93))
+       }))(obj)).Reason = string(utf16.Decode(local98))
 }
 
 func (obj *ToCltFOV) serialize(w io.Writer) {
@@ -3394,7 +3200,7 @@ func (obj *ToCltMedia) serialize(w io.Writer) {
                }))(obj)).Files)))
                write32(w, uint32(x))
        }
-       for local96 := range (*(*(struct {
+       for local101 := range (*(*(struct {
                // N is the total number of ToCltMedia packets.
                // I is the index of this packet.
                N, I uint16
@@ -3419,7 +3225,7 @@ func (obj *ToCltMedia) serialize(w io.Writer) {
                                //mt:len32
                                Data []byte
                        }
-               }))(obj)).Files)[local96]).Name))) > math.MaxUint16 {
+               }))(obj)).Files)[local101]).Name))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
                {
@@ -3435,7 +3241,7 @@ func (obj *ToCltMedia) serialize(w io.Writer) {
                                        //mt:len32
                                        Data []byte
                                }
-                       }))(obj)).Files)[local96]).Name))))
+                       }))(obj)).Files)[local101]).Name))))
                        write16(w, uint16(x))
                }
                {
@@ -3451,7 +3257,7 @@ func (obj *ToCltMedia) serialize(w io.Writer) {
                                        //mt:len32
                                        Data []byte
                                }
-                       }))(obj)).Files)[local96]).Name))[:])
+                       }))(obj)).Files)[local101]).Name))[:])
                        chk(err)
                }
                if len(((((*(*(struct {
@@ -3466,7 +3272,7 @@ func (obj *ToCltMedia) serialize(w io.Writer) {
                                //mt:len32
                                Data []byte
                        }
-               }))(obj)).Files)[local96]).Data)) > math.MaxUint32 {
+               }))(obj)).Files)[local101]).Data)) > math.MaxUint32 {
                        chk(ErrTooLong)
                }
                {
@@ -3482,7 +3288,7 @@ func (obj *ToCltMedia) serialize(w io.Writer) {
                                        //mt:len32
                                        Data []byte
                                }
-                       }))(obj)).Files)[local96]).Data)))
+                       }))(obj)).Files)[local101]).Data)))
                        write32(w, uint32(x))
                }
                {
@@ -3498,7 +3304,7 @@ func (obj *ToCltMedia) serialize(w io.Writer) {
                                        //mt:len32
                                        Data []byte
                                }
-                       }))(obj)).Files)[local96]).Data)[:])
+                       }))(obj)).Files)[local101]).Data)[:])
                        chk(err)
                }
        }
@@ -3537,9 +3343,9 @@ func (obj *ToCltMedia) deserialize(r io.Reader) {
                }))(obj)).I
                *p = read16(r)
        }
-       var local97 uint32
+       var local102 uint32
        {
-               p := &local97
+               p := &local102
                *p = read32(r)
        }
        ((*(*(struct {
@@ -3557,8 +3363,8 @@ func (obj *ToCltMedia) deserialize(r io.Reader) {
        }))(obj)).Files) = make([]struct {
                Name string
                Data []byte
-       }, local97)
-       for local98 := range (*(*(struct {
+       }, local102)
+       for local103 := range (*(*(struct {
                // N is the total number of ToCltMedia packets.
                // I is the index of this packet.
                N, I uint16
@@ -3571,15 +3377,15 @@ func (obj *ToCltMedia) deserialize(r io.Reader) {
                        Data []byte
                }
        }))(obj)).Files {
-               var local99 []uint8
-               var local100 uint16
+               var local104 []uint8
+               var local105 uint16
                {
-                       p := &local100
+                       p := &local105
                        *p = read16(r)
                }
-               (local99) = make([]uint8, local100)
+               (local104) = make([]uint8, local105)
                {
-                       _, err := io.ReadFull(r, (local99)[:])
+                       _, err := io.ReadFull(r, (local104)[:])
                        chk(err)
                }
                ((((*(*(struct {
@@ -3594,10 +3400,10 @@ func (obj *ToCltMedia) deserialize(r io.Reader) {
                                //mt:len32
                                Data []byte
                        }
-               }))(obj)).Files)[local98]).Name) = string(local99)
-               var local101 uint32
+               }))(obj)).Files)[local103]).Name) = string(local104)
+               var local106 uint32
                {
-                       p := &local101
+                       p := &local106
                        *p = read32(r)
                }
                ((((*(*(struct {
@@ -3612,7 +3418,7 @@ func (obj *ToCltMedia) deserialize(r io.Reader) {
                                //mt:len32
                                Data []byte
                        }
-               }))(obj)).Files)[local98]).Data) = make([]byte, local101)
+               }))(obj)).Files)[local103]).Data) = make([]byte, local106)
                {
                        _, err := io.ReadFull(r, ((((*(*(struct {
                                // N is the total number of ToCltMedia packets.
@@ -3626,7 +3432,7 @@ func (obj *ToCltMedia) deserialize(r io.Reader) {
                                        //mt:len32
                                        Data []byte
                                }
-                       }))(obj)).Files)[local98]).Data)[:])
+                       }))(obj)).Files)[local103]).Data)[:])
                        chk(err)
                }
        }
@@ -3639,9 +3445,9 @@ func (obj *ToCltNodeDefs) serialize(w io.Writer) {
                {
                        w := zlib.NewWriter(w)
                        {
-                               local102 := uint8(1)
+                               local107 := uint8(1)
                                {
-                                       x := local102
+                                       x := local107
                                        write8(w, uint8(x))
                                }
                        }
@@ -3695,18 +3501,19 @@ func (obj *ToCltNodeDefs) deserialize(r io.Reader) {
                        p := &n
                        *p = read32(r)
                }
-               r := &io.LimitedReader{r, int64(n)}
+               r := &io.LimitedReader{R: r, N: int64(n)}
                {
                        r, err := zlib.NewReader(byteReader{r})
                        chk(err)
                        {
-                               var local103 uint8
+                               var local108 uint8
+                               local109 := uint8(1)
                                {
-                                       p := &local103
+                                       p := &local108
                                        *p = read8(r)
                                }
-                               if local103 != (1) {
-                                       chk(fmt.Errorf("const %v: %v", 1, local103))
+                               if local108 != local109 {
+                                       chk(fmt.Errorf("const %v: %v", "uint8(1)", local108))
                                }
                        }
                        {
@@ -3717,7 +3524,7 @@ func (obj *ToCltNodeDefs) deserialize(r io.Reader) {
                                }))(obj)).Defs
                                { // For ToCltNodeDefs.Defs.
                                        *p = make([]NodeDef, read16(r))
-                                       r := &io.LimitedReader{r, int64(read32(r))}
+                                       r := &io.LimitedReader{R: r, N: int64(read32(r))}
                                        for i := range *p {
                                                (*p)[i].deserialize(r)
                                        }
@@ -3754,7 +3561,7 @@ func (obj *ToCltAnnounceMedia) serialize(w io.Writer) {
                }))(obj)).Files)))
                write16(w, uint16(x))
        }
-       for local104 := range (*(*(struct {
+       for local110 := range (*(*(struct {
                Files []struct {
                        Name       string
                        Base64SHA1 string
@@ -3767,7 +3574,7 @@ func (obj *ToCltAnnounceMedia) serialize(w io.Writer) {
                                Base64SHA1 string
                        }
                        URL string
-               }))(obj)).Files)[local104]).Name))) > math.MaxUint16 {
+               }))(obj)).Files)[local110]).Name))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
                {
@@ -3777,7 +3584,7 @@ func (obj *ToCltAnnounceMedia) serialize(w io.Writer) {
                                        Base64SHA1 string
                                }
                                URL string
-                       }))(obj)).Files)[local104]).Name))))
+                       }))(obj)).Files)[local110]).Name))))
                        write16(w, uint16(x))
                }
                {
@@ -3787,7 +3594,7 @@ func (obj *ToCltAnnounceMedia) serialize(w io.Writer) {
                                        Base64SHA1 string
                                }
                                URL string
-                       }))(obj)).Files)[local104]).Name))[:])
+                       }))(obj)).Files)[local110]).Name))[:])
                        chk(err)
                }
                if len(([]byte((((*(*(struct {
@@ -3796,7 +3603,7 @@ func (obj *ToCltAnnounceMedia) serialize(w io.Writer) {
                                Base64SHA1 string
                        }
                        URL string
-               }))(obj)).Files)[local104]).Base64SHA1))) > math.MaxUint16 {
+               }))(obj)).Files)[local110]).Base64SHA1))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
                {
@@ -3806,7 +3613,7 @@ func (obj *ToCltAnnounceMedia) serialize(w io.Writer) {
                                        Base64SHA1 string
                                }
                                URL string
-                       }))(obj)).Files)[local104]).Base64SHA1))))
+                       }))(obj)).Files)[local110]).Base64SHA1))))
                        write16(w, uint16(x))
                }
                {
@@ -3816,7 +3623,7 @@ func (obj *ToCltAnnounceMedia) serialize(w io.Writer) {
                                        Base64SHA1 string
                                }
                                URL string
-                       }))(obj)).Files)[local104]).Base64SHA1))[:])
+                       }))(obj)).Files)[local110]).Base64SHA1))[:])
                        chk(err)
                }
        }
@@ -3852,9 +3659,9 @@ func (obj *ToCltAnnounceMedia) serialize(w io.Writer) {
 }
 
 func (obj *ToCltAnnounceMedia) deserialize(r io.Reader) {
-       var local105 uint16
+       var local111 uint16
        {
-               p := &local105
+               p := &local111
                *p = read16(r)
        }
        ((*(*(struct {
@@ -3866,23 +3673,23 @@ func (obj *ToCltAnnounceMedia) deserialize(r io.Reader) {
        }))(obj)).Files) = make([]struct {
                Name       string
                Base64SHA1 string
-       }, local105)
-       for local106 := range (*(*(struct {
+       }, local111)
+       for local112 := range (*(*(struct {
                Files []struct {
                        Name       string
                        Base64SHA1 string
                }
                URL string
        }))(obj)).Files {
-               var local107 []uint8
-               var local108 uint16
+               var local113 []uint8
+               var local114 uint16
                {
-                       p := &local108
+                       p := &local114
                        *p = read16(r)
                }
-               (local107) = make([]uint8, local108)
+               (local113) = make([]uint8, local114)
                {
-                       _, err := io.ReadFull(r, (local107)[:])
+                       _, err := io.ReadFull(r, (local113)[:])
                        chk(err)
                }
                ((((*(*(struct {
@@ -3891,16 +3698,16 @@ func (obj *ToCltAnnounceMedia) deserialize(r io.Reader) {
                                Base64SHA1 string
                        }
                        URL string
-               }))(obj)).Files)[local106]).Name) = string(local107)
-               var local109 []uint8
-               var local110 uint16
+               }))(obj)).Files)[local112]).Name) = string(local113)
+               var local115 []uint8
+               var local116 uint16
                {
-                       p := &local110
+                       p := &local116
                        *p = read16(r)
                }
-               (local109) = make([]uint8, local110)
+               (local115) = make([]uint8, local116)
                {
-                       _, err := io.ReadFull(r, (local109)[:])
+                       _, err := io.ReadFull(r, (local115)[:])
                        chk(err)
                }
                ((((*(*(struct {
@@ -3909,17 +3716,17 @@ func (obj *ToCltAnnounceMedia) deserialize(r io.Reader) {
                                Base64SHA1 string
                        }
                        URL string
-               }))(obj)).Files)[local106]).Base64SHA1) = string(local109)
+               }))(obj)).Files)[local112]).Base64SHA1) = string(local115)
        }
-       var local111 []uint8
-       var local112 uint16
+       var local117 []uint8
+       var local118 uint16
        {
-               p := &local112
+               p := &local118
                *p = read16(r)
        }
-       (local111) = make([]uint8, local112)
+       (local117) = make([]uint8, local118)
        {
-               _, err := io.ReadFull(r, (local111)[:])
+               _, err := io.ReadFull(r, (local117)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -3928,7 +3735,7 @@ func (obj *ToCltAnnounceMedia) deserialize(r io.Reader) {
                        Base64SHA1 string
                }
                URL string
-       }))(obj)).URL) = string(local111)
+       }))(obj)).URL) = string(local117)
 }
 
 func (obj *ToCltItemDefs) serialize(w io.Writer) {
@@ -3938,9 +3745,9 @@ func (obj *ToCltItemDefs) serialize(w io.Writer) {
                {
                        w := zlib.NewWriter(w)
                        {
-                               local113 := uint8(0)
+                               local119 := uint8(0)
                                {
-                                       x := local113
+                                       x := local119
                                        write8(w, uint8(x))
                                }
                        }
@@ -3957,7 +3764,7 @@ func (obj *ToCltItemDefs) serialize(w io.Writer) {
                                }))(obj)).Defs)))
                                write16(w, uint16(x))
                        }
-                       for local114 := range (*(*(struct {
+                       for local120 := range (*(*(struct {
                                Defs    []ItemDef
                                Aliases []struct{ Alias, Orig string }
                        }))(obj)).Defs {
@@ -3965,7 +3772,7 @@ func (obj *ToCltItemDefs) serialize(w io.Writer) {
                                        (((*(*(struct {
                                                Defs    []ItemDef
                                                Aliases []struct{ Alias, Orig string }
-                                       }))(obj)).Defs)[local114]).serialize(w)
+                                       }))(obj)).Defs)[local120]).serialize(w)
                                }); err != nil {
                                        if err == io.EOF {
                                                chk(io.EOF)
@@ -3986,48 +3793,48 @@ func (obj *ToCltItemDefs) serialize(w io.Writer) {
                                }))(obj)).Aliases)))
                                write16(w, uint16(x))
                        }
-                       for local115 := range (*(*(struct {
+                       for local121 := range (*(*(struct {
                                Defs    []ItemDef
                                Aliases []struct{ Alias, Orig string }
                        }))(obj)).Aliases {
                                if len(([]byte((((*(*(struct {
                                        Defs    []ItemDef
                                        Aliases []struct{ Alias, Orig string }
-                               }))(obj)).Aliases)[local115]).Alias))) > math.MaxUint16 {
+                               }))(obj)).Aliases)[local121]).Alias))) > math.MaxUint16 {
                                        chk(ErrTooLong)
                                }
                                {
                                        x := uint16(len(([]byte((((*(*(struct {
                                                Defs    []ItemDef
                                                Aliases []struct{ Alias, Orig string }
-                                       }))(obj)).Aliases)[local115]).Alias))))
+                                       }))(obj)).Aliases)[local121]).Alias))))
                                        write16(w, uint16(x))
                                }
                                {
                                        _, err := w.Write(([]byte((((*(*(struct {
                                                Defs    []ItemDef
                                                Aliases []struct{ Alias, Orig string }
-                                       }))(obj)).Aliases)[local115]).Alias))[:])
+                                       }))(obj)).Aliases)[local121]).Alias))[:])
                                        chk(err)
                                }
                                if len(([]byte((((*(*(struct {
                                        Defs    []ItemDef
                                        Aliases []struct{ Alias, Orig string }
-                               }))(obj)).Aliases)[local115]).Orig))) > math.MaxUint16 {
+                               }))(obj)).Aliases)[local121]).Orig))) > math.MaxUint16 {
                                        chk(ErrTooLong)
                                }
                                {
                                        x := uint16(len(([]byte((((*(*(struct {
                                                Defs    []ItemDef
                                                Aliases []struct{ Alias, Orig string }
-                                       }))(obj)).Aliases)[local115]).Orig))))
+                                       }))(obj)).Aliases)[local121]).Orig))))
                                        write16(w, uint16(x))
                                }
                                {
                                        _, err := w.Write(([]byte((((*(*(struct {
                                                Defs    []ItemDef
                                                Aliases []struct{ Alias, Orig string }
-                                       }))(obj)).Aliases)[local115]).Orig))[:])
+                                       }))(obj)).Aliases)[local121]).Orig))[:])
                                        chk(err)
                                }
                        }
@@ -4058,30 +3865,31 @@ func (obj *ToCltItemDefs) deserialize(r io.Reader) {
                        p := &n
                        *p = read32(r)
                }
-               r := &io.LimitedReader{r, int64(n)}
+               r := &io.LimitedReader{R: r, N: int64(n)}
                {
                        r, err := zlib.NewReader(byteReader{r})
                        chk(err)
                        {
-                               var local116 uint8
+                               var local122 uint8
+                               local123 := uint8(0)
                                {
-                                       p := &local116
+                                       p := &local122
                                        *p = read8(r)
                                }
-                               if local116 != (0) {
-                                       chk(fmt.Errorf("const %v: %v", 0, local116))
+                               if local122 != local123 {
+                                       chk(fmt.Errorf("const %v: %v", "uint8(0)", local122))
                                }
                        }
-                       var local117 uint16
+                       var local124 uint16
                        {
-                               p := &local117
+                               p := &local124
                                *p = read16(r)
                        }
                        ((*(*(struct {
                                Defs    []ItemDef
                                Aliases []struct{ Alias, Orig string }
-                       }))(obj)).Defs) = make([]ItemDef, local117)
-                       for local118 := range (*(*(struct {
+                       }))(obj)).Defs) = make([]ItemDef, local124)
+                       for local125 := range (*(*(struct {
                                Defs    []ItemDef
                                Aliases []struct{ Alias, Orig string }
                        }))(obj)).Defs {
@@ -4089,7 +3897,7 @@ func (obj *ToCltItemDefs) deserialize(r io.Reader) {
                                        (((*(*(struct {
                                                Defs    []ItemDef
                                                Aliases []struct{ Alias, Orig string }
-                                       }))(obj)).Defs)[local118]).deserialize(r)
+                                       }))(obj)).Defs)[local125]).deserialize(r)
                                }); err != nil {
                                        if err == io.EOF {
                                                chk(io.EOF)
@@ -4097,9 +3905,9 @@ func (obj *ToCltItemDefs) deserialize(r io.Reader) {
                                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ItemDef", err))
                                }
                        }
-                       var local119 uint16
+                       var local126 uint16
                        {
-                               p := &local119
+                               p := &local126
                                *p = read16(r)
                        }
                        ((*(*(struct {
@@ -4108,41 +3916,41 @@ func (obj *ToCltItemDefs) deserialize(r io.Reader) {
                        }))(obj)).Aliases) = make([]struct {
                                Alias string
                                Orig  string
-                       }, local119)
-                       for local120 := range (*(*(struct {
+                       }, local126)
+                       for local127 := range (*(*(struct {
                                Defs    []ItemDef
                                Aliases []struct{ Alias, Orig string }
                        }))(obj)).Aliases {
-                               var local121 []uint8
-                               var local122 uint16
+                               var local128 []uint8
+                               var local129 uint16
                                {
-                                       p := &local122
+                                       p := &local129
                                        *p = read16(r)
                                }
-                               (local121) = make([]uint8, local122)
+                               (local128) = make([]uint8, local129)
                                {
-                                       _, err := io.ReadFull(r, (local121)[:])
+                                       _, err := io.ReadFull(r, (local128)[:])
                                        chk(err)
                                }
                                ((((*(*(struct {
                                        Defs    []ItemDef
                                        Aliases []struct{ Alias, Orig string }
-                               }))(obj)).Aliases)[local120]).Alias) = string(local121)
-                               var local123 []uint8
-                               var local124 uint16
+                               }))(obj)).Aliases)[local127]).Alias) = string(local128)
+                               var local130 []uint8
+                               var local131 uint16
                                {
-                                       p := &local124
+                                       p := &local131
                                        *p = read16(r)
                                }
-                               (local123) = make([]uint8, local124)
+                               (local130) = make([]uint8, local131)
                                {
-                                       _, err := io.ReadFull(r, (local123)[:])
+                                       _, err := io.ReadFull(r, (local130)[:])
                                        chk(err)
                                }
                                ((((*(*(struct {
                                        Defs    []ItemDef
                                        Aliases []struct{ Alias, Orig string }
-                               }))(obj)).Aliases)[local120]).Orig) = string(local123)
+                               }))(obj)).Aliases)[local127]).Orig) = string(local130)
                        }
                        chk(r.Close())
                }
@@ -4378,15 +4186,15 @@ func (obj *ToCltPlaySound) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.SoundID", err))
        }
-       var local125 []uint8
-       var local126 uint16
+       var local132 []uint8
+       var local133 uint16
        {
-               p := &local126
+               p := &local133
                *p = read16(r)
        }
-       (local125) = make([]uint8, local126)
+       (local132) = make([]uint8, local133)
        {
-               _, err := io.ReadFull(r, (local125)[:])
+               _, err := io.ReadFull(r, (local132)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -4400,7 +4208,7 @@ func (obj *ToCltPlaySound) deserialize(r io.Reader) {
                Fade      float32
                Pitch     float32
                Ephemeral bool
-       }))(obj)).Name) = string(local125)
+       }))(obj)).Name) = string(local132)
        {
                p := &(*(*(struct {
                        ID      SoundID
@@ -4587,55 +4395,55 @@ func (obj *ToCltPrivs) serialize(w io.Writer) {
                }))(obj)).Privs)))
                write16(w, uint16(x))
        }
-       for local127 := range (*(*(struct {
+       for local134 := range (*(*(struct {
                Privs []string
        }))(obj)).Privs {
                if len(([]byte(((*(*(struct {
                        Privs []string
-               }))(obj)).Privs)[local127]))) > math.MaxUint16 {
+               }))(obj)).Privs)[local134]))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
                {
                        x := uint16(len(([]byte(((*(*(struct {
                                Privs []string
-                       }))(obj)).Privs)[local127]))))
+                       }))(obj)).Privs)[local134]))))
                        write16(w, uint16(x))
                }
                {
                        _, err := w.Write(([]byte(((*(*(struct {
                                Privs []string
-                       }))(obj)).Privs)[local127]))[:])
+                       }))(obj)).Privs)[local134]))[:])
                        chk(err)
                }
        }
 }
 
 func (obj *ToCltPrivs) deserialize(r io.Reader) {
-       var local128 uint16
+       var local135 uint16
        {
-               p := &local128
+               p := &local135
                *p = read16(r)
        }
        ((*(*(struct {
                Privs []string
-       }))(obj)).Privs) = make([]string, local128)
-       for local129 := range (*(*(struct {
+       }))(obj)).Privs) = make([]string, local135)
+       for local136 := range (*(*(struct {
                Privs []string
        }))(obj)).Privs {
-               var local130 []uint8
-               var local131 uint16
+               var local137 []uint8
+               var local138 uint16
                {
-                       p := &local131
+                       p := &local138
                        *p = read16(r)
                }
-               (local130) = make([]uint8, local131)
+               (local137) = make([]uint8, local138)
                {
-                       _, err := io.ReadFull(r, (local130)[:])
+                       _, err := io.ReadFull(r, (local137)[:])
                        chk(err)
                }
                (((*(*(struct {
                        Privs []string
-               }))(obj)).Privs)[local129]) = string(local130)
+               }))(obj)).Privs)[local136]) = string(local137)
        }
 }
 
@@ -4663,21 +4471,21 @@ func (obj *ToCltInvFormspec) serialize(w io.Writer) {
 }
 
 func (obj *ToCltInvFormspec) deserialize(r io.Reader) {
-       var local132 []uint8
-       var local133 uint32
+       var local139 []uint8
+       var local140 uint32
        {
-               p := &local133
+               p := &local140
                *p = read32(r)
        }
-       (local132) = make([]uint8, local133)
+       (local139) = make([]uint8, local140)
        {
-               _, err := io.ReadFull(r, (local132)[:])
+               _, err := io.ReadFull(r, (local139)[:])
                chk(err)
        }
        ((*(*(struct {
                //mt:len32
                Formspec string
-       }))(obj)).Formspec) = string(local132)
+       }))(obj)).Formspec) = string(local139)
 }
 
 func (obj *ToCltDetachedInv) serialize(w io.Writer) {
@@ -4753,15 +4561,15 @@ func (obj *ToCltDetachedInv) serialize(w io.Writer) {
 }
 
 func (obj *ToCltDetachedInv) deserialize(r io.Reader) {
-       var local134 []uint8
-       var local135 uint16
+       var local141 []uint8
+       var local142 uint16
        {
-               p := &local135
+               p := &local142
                *p = read16(r)
        }
-       (local134) = make([]uint8, local135)
+       (local141) = make([]uint8, local142)
        {
-               _, err := io.ReadFull(r, (local134)[:])
+               _, err := io.ReadFull(r, (local141)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -4771,7 +4579,7 @@ func (obj *ToCltDetachedInv) deserialize(r io.Reader) {
 
                //mt:raw
                Inv string
-       }))(obj)).Name) = string(local134)
+       }))(obj)).Name) = string(local141)
        {
                p := &(*(*(struct {
                        Name string
@@ -4801,19 +4609,10 @@ func (obj *ToCltDetachedInv) deserialize(r io.Reader) {
                }))(obj)).Len
                *p = read16(r)
        }
-       var local136 []uint8
-       for {
-               var local137 uint8
-               err := pcall(func() {
-                       {
-                               p := &local137
-                               *p = read8(r)
-                       }
-               })
-               if err == io.EOF {
-                       break
-               }
-               (local136) = append((local136), local137)
+       var local143 []uint8
+       {
+               var err error
+               (local143), err = io.ReadAll(r)
                chk(err)
        }
        ((*(*(struct {
@@ -4823,7 +4622,7 @@ func (obj *ToCltDetachedInv) deserialize(r io.Reader) {
 
                //mt:raw
                Inv string
-       }))(obj)).Inv) = string(local136)
+       }))(obj)).Inv) = string(local143)
 }
 
 func (obj *ToCltShowFormspec) serialize(w io.Writer) {
@@ -4882,15 +4681,15 @@ func (obj *ToCltShowFormspec) serialize(w io.Writer) {
 }
 
 func (obj *ToCltShowFormspec) deserialize(r io.Reader) {
-       var local138 []uint8
-       var local139 uint32
+       var local144 []uint8
+       var local145 uint32
        {
-               p := &local139
+               p := &local145
                *p = read32(r)
        }
-       (local138) = make([]uint8, local139)
+       (local144) = make([]uint8, local145)
        {
-               _, err := io.ReadFull(r, (local138)[:])
+               _, err := io.ReadFull(r, (local144)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -4898,16 +4697,16 @@ func (obj *ToCltShowFormspec) deserialize(r io.Reader) {
                Formspec string
 
                Formname string
-       }))(obj)).Formspec) = string(local138)
-       var local140 []uint8
-       var local141 uint16
+       }))(obj)).Formspec) = string(local144)
+       var local146 []uint8
+       var local147 uint16
        {
-               p := &local141
+               p := &local147
                *p = read16(r)
        }
-       (local140) = make([]uint8, local141)
+       (local146) = make([]uint8, local147)
        {
-               _, err := io.ReadFull(r, (local140)[:])
+               _, err := io.ReadFull(r, (local146)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -4915,7 +4714,7 @@ func (obj *ToCltShowFormspec) deserialize(r io.Reader) {
                Formspec string
 
                Formname string
-       }))(obj)).Formname) = string(local140)
+       }))(obj)).Formname) = string(local146)
 }
 
 func (obj *ToCltMovement) serialize(w io.Writer) {
@@ -5141,7 +4940,7 @@ func (obj *ToCltMovement) deserialize(r io.Reader) {
 }
 
 func (obj *ToCltSpawnParticle) serialize(w io.Writer) {
-       for local142 := range (*(*(struct {
+       for local148 := range (*(*(struct {
                Pos, Vel, Acc  [3]float32
                ExpirationTime float32 // in seconds.
                Size           float32
@@ -5177,11 +4976,11 @@ func (obj *ToCltSpawnParticle) serialize(w io.Writer) {
                                NodeParam0  Content
                                NodeParam2  uint8
                                NodeTile    uint8
-                       }))(obj)).Pos)[local142]
+                       }))(obj)).Pos)[local148]
                        write32(w, math.Float32bits(x))
                }
        }
-       for local143 := range (*(*(struct {
+       for local149 := range (*(*(struct {
                Pos, Vel, Acc  [3]float32
                ExpirationTime float32 // in seconds.
                Size           float32
@@ -5217,11 +5016,11 @@ func (obj *ToCltSpawnParticle) serialize(w io.Writer) {
                                NodeParam0  Content
                                NodeParam2  uint8
                                NodeTile    uint8
-                       }))(obj)).Vel)[local143]
+                       }))(obj)).Vel)[local149]
                        write32(w, math.Float32bits(x))
                }
        }
-       for local144 := range (*(*(struct {
+       for local150 := range (*(*(struct {
                Pos, Vel, Acc  [3]float32
                ExpirationTime float32 // in seconds.
                Size           float32
@@ -5257,7 +5056,7 @@ func (obj *ToCltSpawnParticle) serialize(w io.Writer) {
                                NodeParam0  Content
                                NodeParam2  uint8
                                NodeTile    uint8
-                       }))(obj)).Acc)[local144]
+                       }))(obj)).Acc)[local150]
                        write32(w, math.Float32bits(x))
                }
        }
@@ -5581,7 +5380,7 @@ func (obj *ToCltSpawnParticle) serialize(w io.Writer) {
 }
 
 func (obj *ToCltSpawnParticle) deserialize(r io.Reader) {
-       for local145 := range (*(*(struct {
+       for local151 := range (*(*(struct {
                Pos, Vel, Acc  [3]float32
                ExpirationTime float32 // in seconds.
                Size           float32
@@ -5617,11 +5416,11 @@ func (obj *ToCltSpawnParticle) deserialize(r io.Reader) {
                                NodeParam0  Content
                                NodeParam2  uint8
                                NodeTile    uint8
-                       }))(obj)).Pos)[local145]
+                       }))(obj)).Pos)[local151]
                        *p = math.Float32frombits(read32(r))
                }
        }
-       for local146 := range (*(*(struct {
+       for local152 := range (*(*(struct {
                Pos, Vel, Acc  [3]float32
                ExpirationTime float32 // in seconds.
                Size           float32
@@ -5657,11 +5456,11 @@ func (obj *ToCltSpawnParticle) deserialize(r io.Reader) {
                                NodeParam0  Content
                                NodeParam2  uint8
                                NodeTile    uint8
-                       }))(obj)).Vel)[local146]
+                       }))(obj)).Vel)[local152]
                        *p = math.Float32frombits(read32(r))
                }
        }
-       for local147 := range (*(*(struct {
+       for local153 := range (*(*(struct {
                Pos, Vel, Acc  [3]float32
                ExpirationTime float32 // in seconds.
                Size           float32
@@ -5697,7 +5496,7 @@ func (obj *ToCltSpawnParticle) deserialize(r io.Reader) {
                                NodeParam0  Content
                                NodeParam2  uint8
                                NodeTile    uint8
-                       }))(obj)).Acc)[local147]
+                       }))(obj)).Acc)[local153]
                        *p = math.Float32frombits(read32(r))
                }
        }
@@ -5771,15 +5570,15 @@ func (obj *ToCltSpawnParticle) deserialize(r io.Reader) {
                        chk(fmt.Errorf("invalid bool: %d", n))
                }
        }
-       var local148 []uint8
-       var local149 uint32
+       var local154 []uint8
+       var local155 uint32
        {
-               p := &local149
+               p := &local155
                *p = read32(r)
        }
-       (local148) = make([]uint8, local149)
+       (local154) = make([]uint8, local155)
        {
-               _, err := io.ReadFull(r, (local148)[:])
+               _, err := io.ReadFull(r, (local154)[:])
                chk(err)
        }
        (*(*string)(&((*(*(struct {
@@ -5799,7 +5598,7 @@ func (obj *ToCltSpawnParticle) deserialize(r io.Reader) {
                NodeParam0  Content
                NodeParam2  uint8
                NodeTile    uint8
-       }))(obj)).Texture))) = string(local148)
+       }))(obj)).Texture))) = string(local154)
        {
                p := &(*(*(struct {
                        Pos, Vel, Acc  [3]float32
@@ -6050,219 +5849,6 @@ func (obj *ToCltAddParticleSpawner) serialize(w io.Writer) {
                }))(obj)).Duration
                write32(w, math.Float32bits(x))
        }
-       for local150 := range (*(*(struct {
-               Amount         uint16
-               Duration       float32
-               Pos, Vel, Acc  [2][3]float32
-               ExpirationTime [2]float32 // in seconds.
-               Size           [2]float32
-               Collide        bool
-
-               //mt:len32
-               Texture
-
-               ID           ParticleSpawnerID
-               Vertical     bool
-               CollisionRm  bool
-               AttachedAOID AOID
-               AnimParams   TileAnim
-               Glow         uint8
-               AOCollision  bool
-               NodeParam0   Content
-               NodeParam2   uint8
-               NodeTile     uint8
-       }))(obj)).Pos {
-               for local151 := range ((*(*(struct {
-                       Amount         uint16
-                       Duration       float32
-                       Pos, Vel, Acc  [2][3]float32
-                       ExpirationTime [2]float32 // in seconds.
-                       Size           [2]float32
-                       Collide        bool
-
-                       //mt:len32
-                       Texture
-
-                       ID           ParticleSpawnerID
-                       Vertical     bool
-                       CollisionRm  bool
-                       AttachedAOID AOID
-                       AnimParams   TileAnim
-                       Glow         uint8
-                       AOCollision  bool
-                       NodeParam0   Content
-                       NodeParam2   uint8
-                       NodeTile     uint8
-               }))(obj)).Pos)[local150] {
-                       {
-                               x := (((*(*(struct {
-                                       Amount         uint16
-                                       Duration       float32
-                                       Pos, Vel, Acc  [2][3]float32
-                                       ExpirationTime [2]float32 // in seconds.
-                                       Size           [2]float32
-                                       Collide        bool
-
-                                       //mt:len32
-                                       Texture
-
-                                       ID           ParticleSpawnerID
-                                       Vertical     bool
-                                       CollisionRm  bool
-                                       AttachedAOID AOID
-                                       AnimParams   TileAnim
-                                       Glow         uint8
-                                       AOCollision  bool
-                                       NodeParam0   Content
-                                       NodeParam2   uint8
-                                       NodeTile     uint8
-                               }))(obj)).Pos)[local150])[local151]
-                               write32(w, math.Float32bits(x))
-                       }
-               }
-       }
-       for local152 := range (*(*(struct {
-               Amount         uint16
-               Duration       float32
-               Pos, Vel, Acc  [2][3]float32
-               ExpirationTime [2]float32 // in seconds.
-               Size           [2]float32
-               Collide        bool
-
-               //mt:len32
-               Texture
-
-               ID           ParticleSpawnerID
-               Vertical     bool
-               CollisionRm  bool
-               AttachedAOID AOID
-               AnimParams   TileAnim
-               Glow         uint8
-               AOCollision  bool
-               NodeParam0   Content
-               NodeParam2   uint8
-               NodeTile     uint8
-       }))(obj)).Vel {
-               for local153 := range ((*(*(struct {
-                       Amount         uint16
-                       Duration       float32
-                       Pos, Vel, Acc  [2][3]float32
-                       ExpirationTime [2]float32 // in seconds.
-                       Size           [2]float32
-                       Collide        bool
-
-                       //mt:len32
-                       Texture
-
-                       ID           ParticleSpawnerID
-                       Vertical     bool
-                       CollisionRm  bool
-                       AttachedAOID AOID
-                       AnimParams   TileAnim
-                       Glow         uint8
-                       AOCollision  bool
-                       NodeParam0   Content
-                       NodeParam2   uint8
-                       NodeTile     uint8
-               }))(obj)).Vel)[local152] {
-                       {
-                               x := (((*(*(struct {
-                                       Amount         uint16
-                                       Duration       float32
-                                       Pos, Vel, Acc  [2][3]float32
-                                       ExpirationTime [2]float32 // in seconds.
-                                       Size           [2]float32
-                                       Collide        bool
-
-                                       //mt:len32
-                                       Texture
-
-                                       ID           ParticleSpawnerID
-                                       Vertical     bool
-                                       CollisionRm  bool
-                                       AttachedAOID AOID
-                                       AnimParams   TileAnim
-                                       Glow         uint8
-                                       AOCollision  bool
-                                       NodeParam0   Content
-                                       NodeParam2   uint8
-                                       NodeTile     uint8
-                               }))(obj)).Vel)[local152])[local153]
-                               write32(w, math.Float32bits(x))
-                       }
-               }
-       }
-       for local154 := range (*(*(struct {
-               Amount         uint16
-               Duration       float32
-               Pos, Vel, Acc  [2][3]float32
-               ExpirationTime [2]float32 // in seconds.
-               Size           [2]float32
-               Collide        bool
-
-               //mt:len32
-               Texture
-
-               ID           ParticleSpawnerID
-               Vertical     bool
-               CollisionRm  bool
-               AttachedAOID AOID
-               AnimParams   TileAnim
-               Glow         uint8
-               AOCollision  bool
-               NodeParam0   Content
-               NodeParam2   uint8
-               NodeTile     uint8
-       }))(obj)).Acc {
-               for local155 := range ((*(*(struct {
-                       Amount         uint16
-                       Duration       float32
-                       Pos, Vel, Acc  [2][3]float32
-                       ExpirationTime [2]float32 // in seconds.
-                       Size           [2]float32
-                       Collide        bool
-
-                       //mt:len32
-                       Texture
-
-                       ID           ParticleSpawnerID
-                       Vertical     bool
-                       CollisionRm  bool
-                       AttachedAOID AOID
-                       AnimParams   TileAnim
-                       Glow         uint8
-                       AOCollision  bool
-                       NodeParam0   Content
-                       NodeParam2   uint8
-                       NodeTile     uint8
-               }))(obj)).Acc)[local154] {
-                       {
-                               x := (((*(*(struct {
-                                       Amount         uint16
-                                       Duration       float32
-                                       Pos, Vel, Acc  [2][3]float32
-                                       ExpirationTime [2]float32 // in seconds.
-                                       Size           [2]float32
-                                       Collide        bool
-
-                                       //mt:len32
-                                       Texture
-
-                                       ID           ParticleSpawnerID
-                                       Vertical     bool
-                                       CollisionRm  bool
-                                       AttachedAOID AOID
-                                       AnimParams   TileAnim
-                                       Glow         uint8
-                                       AOCollision  bool
-                                       NodeParam0   Content
-                                       NodeParam2   uint8
-                                       NodeTile     uint8
-                               }))(obj)).Acc)[local154])[local155]
-                               write32(w, math.Float32bits(x))
-                       }
-               }
-       }
        for local156 := range (*(*(struct {
                Amount         uint16
                Duration       float32
@@ -6274,6 +5860,219 @@ func (obj *ToCltAddParticleSpawner) serialize(w io.Writer) {
                //mt:len32
                Texture
 
+               ID           ParticleSpawnerID
+               Vertical     bool
+               CollisionRm  bool
+               AttachedAOID AOID
+               AnimParams   TileAnim
+               Glow         uint8
+               AOCollision  bool
+               NodeParam0   Content
+               NodeParam2   uint8
+               NodeTile     uint8
+       }))(obj)).Pos {
+               for local157 := range ((*(*(struct {
+                       Amount         uint16
+                       Duration       float32
+                       Pos, Vel, Acc  [2][3]float32
+                       ExpirationTime [2]float32 // in seconds.
+                       Size           [2]float32
+                       Collide        bool
+
+                       //mt:len32
+                       Texture
+
+                       ID           ParticleSpawnerID
+                       Vertical     bool
+                       CollisionRm  bool
+                       AttachedAOID AOID
+                       AnimParams   TileAnim
+                       Glow         uint8
+                       AOCollision  bool
+                       NodeParam0   Content
+                       NodeParam2   uint8
+                       NodeTile     uint8
+               }))(obj)).Pos)[local156] {
+                       {
+                               x := (((*(*(struct {
+                                       Amount         uint16
+                                       Duration       float32
+                                       Pos, Vel, Acc  [2][3]float32
+                                       ExpirationTime [2]float32 // in seconds.
+                                       Size           [2]float32
+                                       Collide        bool
+
+                                       //mt:len32
+                                       Texture
+
+                                       ID           ParticleSpawnerID
+                                       Vertical     bool
+                                       CollisionRm  bool
+                                       AttachedAOID AOID
+                                       AnimParams   TileAnim
+                                       Glow         uint8
+                                       AOCollision  bool
+                                       NodeParam0   Content
+                                       NodeParam2   uint8
+                                       NodeTile     uint8
+                               }))(obj)).Pos)[local156])[local157]
+                               write32(w, math.Float32bits(x))
+                       }
+               }
+       }
+       for local158 := range (*(*(struct {
+               Amount         uint16
+               Duration       float32
+               Pos, Vel, Acc  [2][3]float32
+               ExpirationTime [2]float32 // in seconds.
+               Size           [2]float32
+               Collide        bool
+
+               //mt:len32
+               Texture
+
+               ID           ParticleSpawnerID
+               Vertical     bool
+               CollisionRm  bool
+               AttachedAOID AOID
+               AnimParams   TileAnim
+               Glow         uint8
+               AOCollision  bool
+               NodeParam0   Content
+               NodeParam2   uint8
+               NodeTile     uint8
+       }))(obj)).Vel {
+               for local159 := range ((*(*(struct {
+                       Amount         uint16
+                       Duration       float32
+                       Pos, Vel, Acc  [2][3]float32
+                       ExpirationTime [2]float32 // in seconds.
+                       Size           [2]float32
+                       Collide        bool
+
+                       //mt:len32
+                       Texture
+
+                       ID           ParticleSpawnerID
+                       Vertical     bool
+                       CollisionRm  bool
+                       AttachedAOID AOID
+                       AnimParams   TileAnim
+                       Glow         uint8
+                       AOCollision  bool
+                       NodeParam0   Content
+                       NodeParam2   uint8
+                       NodeTile     uint8
+               }))(obj)).Vel)[local158] {
+                       {
+                               x := (((*(*(struct {
+                                       Amount         uint16
+                                       Duration       float32
+                                       Pos, Vel, Acc  [2][3]float32
+                                       ExpirationTime [2]float32 // in seconds.
+                                       Size           [2]float32
+                                       Collide        bool
+
+                                       //mt:len32
+                                       Texture
+
+                                       ID           ParticleSpawnerID
+                                       Vertical     bool
+                                       CollisionRm  bool
+                                       AttachedAOID AOID
+                                       AnimParams   TileAnim
+                                       Glow         uint8
+                                       AOCollision  bool
+                                       NodeParam0   Content
+                                       NodeParam2   uint8
+                                       NodeTile     uint8
+                               }))(obj)).Vel)[local158])[local159]
+                               write32(w, math.Float32bits(x))
+                       }
+               }
+       }
+       for local160 := range (*(*(struct {
+               Amount         uint16
+               Duration       float32
+               Pos, Vel, Acc  [2][3]float32
+               ExpirationTime [2]float32 // in seconds.
+               Size           [2]float32
+               Collide        bool
+
+               //mt:len32
+               Texture
+
+               ID           ParticleSpawnerID
+               Vertical     bool
+               CollisionRm  bool
+               AttachedAOID AOID
+               AnimParams   TileAnim
+               Glow         uint8
+               AOCollision  bool
+               NodeParam0   Content
+               NodeParam2   uint8
+               NodeTile     uint8
+       }))(obj)).Acc {
+               for local161 := range ((*(*(struct {
+                       Amount         uint16
+                       Duration       float32
+                       Pos, Vel, Acc  [2][3]float32
+                       ExpirationTime [2]float32 // in seconds.
+                       Size           [2]float32
+                       Collide        bool
+
+                       //mt:len32
+                       Texture
+
+                       ID           ParticleSpawnerID
+                       Vertical     bool
+                       CollisionRm  bool
+                       AttachedAOID AOID
+                       AnimParams   TileAnim
+                       Glow         uint8
+                       AOCollision  bool
+                       NodeParam0   Content
+                       NodeParam2   uint8
+                       NodeTile     uint8
+               }))(obj)).Acc)[local160] {
+                       {
+                               x := (((*(*(struct {
+                                       Amount         uint16
+                                       Duration       float32
+                                       Pos, Vel, Acc  [2][3]float32
+                                       ExpirationTime [2]float32 // in seconds.
+                                       Size           [2]float32
+                                       Collide        bool
+
+                                       //mt:len32
+                                       Texture
+
+                                       ID           ParticleSpawnerID
+                                       Vertical     bool
+                                       CollisionRm  bool
+                                       AttachedAOID AOID
+                                       AnimParams   TileAnim
+                                       Glow         uint8
+                                       AOCollision  bool
+                                       NodeParam0   Content
+                                       NodeParam2   uint8
+                                       NodeTile     uint8
+                               }))(obj)).Acc)[local160])[local161]
+                               write32(w, math.Float32bits(x))
+                       }
+               }
+       }
+       for local162 := range (*(*(struct {
+               Amount         uint16
+               Duration       float32
+               Pos, Vel, Acc  [2][3]float32
+               ExpirationTime [2]float32 // in seconds.
+               Size           [2]float32
+               Collide        bool
+
+               //mt:len32
+               Texture
+
                ID           ParticleSpawnerID
                Vertical     bool
                CollisionRm  bool
@@ -6307,11 +6106,11 @@ func (obj *ToCltAddParticleSpawner) serialize(w io.Writer) {
                                NodeParam0   Content
                                NodeParam2   uint8
                                NodeTile     uint8
-                       }))(obj)).ExpirationTime)[local156]
+                       }))(obj)).ExpirationTime)[local162]
                        write32(w, math.Float32bits(x))
                }
        }
-       for local157 := range (*(*(struct {
+       for local163 := range (*(*(struct {
                Amount         uint16
                Duration       float32
                Pos, Vel, Acc  [2][3]float32
@@ -6355,7 +6154,7 @@ func (obj *ToCltAddParticleSpawner) serialize(w io.Writer) {
                                NodeParam0   Content
                                NodeParam2   uint8
                                NodeTile     uint8
-                       }))(obj)).Size)[local157]
+                       }))(obj)).Size)[local163]
                        write32(w, math.Float32bits(x))
                }
        }
@@ -6793,7 +6592,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                }))(obj)).Duration
                *p = math.Float32frombits(read32(r))
        }
-       for local158 := range (*(*(struct {
+       for local164 := range (*(*(struct {
                Amount         uint16
                Duration       float32
                Pos, Vel, Acc  [2][3]float32
@@ -6815,7 +6614,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                NodeParam2   uint8
                NodeTile     uint8
        }))(obj)).Pos {
-               for local159 := range ((*(*(struct {
+               for local165 := range ((*(*(struct {
                        Amount         uint16
                        Duration       float32
                        Pos, Vel, Acc  [2][3]float32
@@ -6836,7 +6635,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                        NodeParam0   Content
                        NodeParam2   uint8
                        NodeTile     uint8
-               }))(obj)).Pos)[local158] {
+               }))(obj)).Pos)[local164] {
                        {
                                p := &(((*(*(struct {
                                        Amount         uint16
@@ -6859,12 +6658,12 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                                        NodeParam0   Content
                                        NodeParam2   uint8
                                        NodeTile     uint8
-                               }))(obj)).Pos)[local158])[local159]
+                               }))(obj)).Pos)[local164])[local165]
                                *p = math.Float32frombits(read32(r))
                        }
                }
        }
-       for local160 := range (*(*(struct {
+       for local166 := range (*(*(struct {
                Amount         uint16
                Duration       float32
                Pos, Vel, Acc  [2][3]float32
@@ -6886,7 +6685,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                NodeParam2   uint8
                NodeTile     uint8
        }))(obj)).Vel {
-               for local161 := range ((*(*(struct {
+               for local167 := range ((*(*(struct {
                        Amount         uint16
                        Duration       float32
                        Pos, Vel, Acc  [2][3]float32
@@ -6907,7 +6706,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                        NodeParam0   Content
                        NodeParam2   uint8
                        NodeTile     uint8
-               }))(obj)).Vel)[local160] {
+               }))(obj)).Vel)[local166] {
                        {
                                p := &(((*(*(struct {
                                        Amount         uint16
@@ -6930,12 +6729,12 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                                        NodeParam0   Content
                                        NodeParam2   uint8
                                        NodeTile     uint8
-                               }))(obj)).Vel)[local160])[local161]
+                               }))(obj)).Vel)[local166])[local167]
                                *p = math.Float32frombits(read32(r))
                        }
                }
        }
-       for local162 := range (*(*(struct {
+       for local168 := range (*(*(struct {
                Amount         uint16
                Duration       float32
                Pos, Vel, Acc  [2][3]float32
@@ -6957,7 +6756,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                NodeParam2   uint8
                NodeTile     uint8
        }))(obj)).Acc {
-               for local163 := range ((*(*(struct {
+               for local169 := range ((*(*(struct {
                        Amount         uint16
                        Duration       float32
                        Pos, Vel, Acc  [2][3]float32
@@ -6978,7 +6777,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                        NodeParam0   Content
                        NodeParam2   uint8
                        NodeTile     uint8
-               }))(obj)).Acc)[local162] {
+               }))(obj)).Acc)[local168] {
                        {
                                p := &(((*(*(struct {
                                        Amount         uint16
@@ -7001,12 +6800,12 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                                        NodeParam0   Content
                                        NodeParam2   uint8
                                        NodeTile     uint8
-                               }))(obj)).Acc)[local162])[local163]
+                               }))(obj)).Acc)[local168])[local169]
                                *p = math.Float32frombits(read32(r))
                        }
                }
        }
-       for local164 := range (*(*(struct {
+       for local170 := range (*(*(struct {
                Amount         uint16
                Duration       float32
                Pos, Vel, Acc  [2][3]float32
@@ -7050,11 +6849,11 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                                NodeParam0   Content
                                NodeParam2   uint8
                                NodeTile     uint8
-                       }))(obj)).ExpirationTime)[local164]
+                       }))(obj)).ExpirationTime)[local170]
                        *p = math.Float32frombits(read32(r))
                }
        }
-       for local165 := range (*(*(struct {
+       for local171 := range (*(*(struct {
                Amount         uint16
                Duration       float32
                Pos, Vel, Acc  [2][3]float32
@@ -7098,7 +6897,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                                NodeParam0   Content
                                NodeParam2   uint8
                                NodeTile     uint8
-                       }))(obj)).Size)[local165]
+                       }))(obj)).Size)[local171]
                        *p = math.Float32frombits(read32(r))
                }
        }
@@ -7134,15 +6933,15 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                        chk(fmt.Errorf("invalid bool: %d", n))
                }
        }
-       var local166 []uint8
-       var local167 uint32
+       var local172 []uint8
+       var local173 uint32
        {
-               p := &local167
+               p := &local173
                *p = read32(r)
        }
-       (local166) = make([]uint8, local167)
+       (local172) = make([]uint8, local173)
        {
-               _, err := io.ReadFull(r, (local166)[:])
+               _, err := io.ReadFull(r, (local172)[:])
                chk(err)
        }
        (*(*string)(&((*(*(struct {
@@ -7166,7 +6965,7 @@ func (obj *ToCltAddParticleSpawner) deserialize(r io.Reader) {
                NodeParam0   Content
                NodeParam2   uint8
                NodeTile     uint8
-       }))(obj)).Texture))) = string(local166)
+       }))(obj)).Texture))) = string(local172)
        if err := pcall(func() {
                ((*(*(struct {
                        Amount         uint16
@@ -7460,22 +7259,7 @@ func (obj *ToCltAddHUD) serialize(w io.Writer) {
        if err := pcall(func() {
                ((*(*(struct {
                        ID HUDID
-
-                       Type HUDType
-
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
+                       HUD
                }))(obj)).ID).serialize(w)
        }); err != nil {
                if err == io.EOF {
@@ -7486,1048 +7270,398 @@ func (obj *ToCltAddHUD) serialize(w io.Writer) {
        if err := pcall(func() {
                ((*(*(struct {
                        ID HUDID
+                       HUD
+               }))(obj)).HUD).serialize(w)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUD", err))
+       }
+}
 
-                       Type HUDType
+func (obj *ToCltAddHUD) deserialize(r io.Reader) {
+       if err := pcall(func() {
+               ((*(*(struct {
+                       ID HUDID
+                       HUD
+               }))(obj)).ID).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDID", err))
+       }
+       if err := pcall(func() {
+               ((*(*(struct {
+                       ID HUDID
+                       HUD
+               }))(obj)).HUD).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUD", err))
+       }
+}
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Type).serialize(w)
+func (obj *ToCltRmHUD) serialize(w io.Writer) {
+       if err := pcall(func() {
+               ((*(*(struct {
+                       ID HUDID
+               }))(obj)).ID).serialize(w)
        }); err != nil {
                if err == io.EOF {
                        chk(io.EOF)
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDType", err))
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDID", err))
        }
-       for local168 := range (*(*(struct {
-               ID HUDID
+}
 
-               Type HUDType
+func (obj *ToCltRmHUD) deserialize(r io.Reader) {
+       if err := pcall(func() {
+               ((*(*(struct {
+                       ID HUDID
+               }))(obj)).ID).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDID", err))
+       }
+}
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Pos {
-               {
-                       x := ((*(*(struct {
-                               ID HUDID
+func (obj *ToCltChangeHUD) serialize(w io.Writer) {
+       if err := pcall(func() {
+               ((*(*(struct {
+                       ID HUDID
 
-                               Type HUDType
+                       Field HUDField
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Pos)[local168]
-                       write32(w, math.Float32bits(x))
-               }
-       }
-       if len(([]byte((*(*(struct {
-               ID HUDID
+                       //mt:if %s.Field == HUDPos
+                       Pos [2]float32
 
-               Type HUDType
+                       //mt:if %s.Field == HUDName
+                       Name string
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Name))) > math.MaxUint16 {
-               chk(ErrTooLong)
-       }
-       {
-               x := uint16(len(([]byte((*(*(struct {
-                       ID HUDID
+                       //mt:if %s.Field == HUDScale
+                       Scale [2]float32
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDText
+                       Text string
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Name))))
-               write16(w, uint16(x))
-       }
-       {
-               _, err := w.Write(([]byte((*(*(struct {
-                       ID HUDID
+                       //mt:if %s.Field == HUDNumber
+                       Number uint32
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDItem
+                       Item uint32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Name))[:])
-               chk(err)
-       }
-       for local169 := range (*(*(struct {
-               ID HUDID
+                       //mt:if %s.Field == HUDDir
+                       Dir uint32
 
-               Type HUDType
+                       //mt:if %s.Field == HUDAlign
+                       Align [2]float32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Scale {
-               {
-                       x := ((*(*(struct {
-                               ID HUDID
+                       //mt:if %s.Field == HUDOffset
+                       Offset [2]float32
 
-                               Type HUDType
+                       //mt:if %s.Field == HUDWorldPos
+                       WorldPos Pos
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Scale)[local169]
-                       write32(w, math.Float32bits(x))
-               }
-       }
-       if len(([]byte((*(*(struct {
-               ID HUDID
+                       //mt:if %s.Field == HUDSize
+                       Size [2]int32
 
-               Type HUDType
+                       //mt:if %s.Field == HUDZIndex
+                       ZIndex int32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Text))) > math.MaxUint16 {
-               chk(ErrTooLong)
+                       //mt:if %s.Field == HUDText2
+                       Text2 string
+               }))(obj)).ID).serialize(w)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDID", err))
        }
-       {
-               x := uint16(len(([]byte((*(*(struct {
+       if err := pcall(func() {
+               ((*(*(struct {
                        ID HUDID
 
-                       Type HUDType
+                       Field HUDField
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Text))))
-               write16(w, uint16(x))
-       }
-       {
-               _, err := w.Write(([]byte((*(*(struct {
-                       ID HUDID
+                       //mt:if %s.Field == HUDPos
+                       Pos [2]float32
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDName
+                       Name string
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Text))[:])
-               chk(err)
-       }
-       {
-               x := (*(*(struct {
-                       ID HUDID
+                       //mt:if %s.Field == HUDScale
+                       Scale [2]float32
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDText
+                       Text string
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Number
-               write32(w, uint32(x))
-       }
-       {
-               x := (*(*(struct {
-                       ID HUDID
+                       //mt:if %s.Field == HUDNumber
+                       Number uint32
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDItem
+                       Item uint32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Item
-               write32(w, uint32(x))
-       }
-       {
-               x := (*(*(struct {
-                       ID HUDID
+                       //mt:if %s.Field == HUDDir
+                       Dir uint32
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDAlign
+                       Align [2]float32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Dir
-               write32(w, uint32(x))
-       }
-       for local170 := range (*(*(struct {
-               ID HUDID
+                       //mt:if %s.Field == HUDOffset
+                       Offset [2]float32
 
-               Type HUDType
+                       //mt:if %s.Field == HUDWorldPos
+                       WorldPos Pos
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Align {
-               {
-                       x := ((*(*(struct {
-                               ID HUDID
+                       //mt:if %s.Field == HUDSize
+                       Size [2]int32
 
-                               Type HUDType
+                       //mt:if %s.Field == HUDZIndex
+                       ZIndex int32
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Align)[local170]
-                       write32(w, math.Float32bits(x))
+                       //mt:if %s.Field == HUDText2
+                       Text2 string
+               }))(obj)).Field).serialize(w)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
                }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDField", err))
        }
-       for local171 := range (*(*(struct {
+       if !((*(*(struct {
                ID HUDID
 
-               Type HUDType
+               Field HUDField
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Offset {
-               {
-                       x := ((*(*(struct {
-                               ID HUDID
+               //mt:if %s.Field == HUDPos
+               Pos [2]float32
 
-                               Type HUDType
+               //mt:if %s.Field == HUDName
+               Name string
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Offset)[local171]
-                       write32(w, math.Float32bits(x))
-               }
-       }
-       if err := pcall(func() {
-               ((*(*(struct {
-                       ID HUDID
+               //mt:if %s.Field == HUDScale
+               Scale [2]float32
 
-                       Type HUDType
+               //mt:if %s.Field == HUDText
+               Text string
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).WorldPos).serialize(w)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
-               }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Pos", err))
-       }
-       for local172 := range (*(*(struct {
-               ID HUDID
+               //mt:if %s.Field == HUDNumber
+               Number uint32
 
-               Type HUDType
+               //mt:if %s.Field == HUDItem
+               Item uint32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Size {
-               {
-                       x := ((*(*(struct {
-                               ID HUDID
+               //mt:if %s.Field == HUDDir
+               Dir uint32
 
-                               Type HUDType
+               //mt:if %s.Field == HUDAlign
+               Align [2]float32
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Size)[local172]
-                       write32(w, uint32(x))
-               }
-       }
-       {
-               x := (*(*(struct {
-                       ID HUDID
+               //mt:if %s.Field == HUDOffset
+               Offset [2]float32
 
-                       Type HUDType
+               //mt:if %s.Field == HUDWorldPos
+               WorldPos Pos
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).ZIndex
-               write16(w, uint16(x))
-       }
-       if len(([]byte((*(*(struct {
-               ID HUDID
+               //mt:if %s.Field == HUDSize
+               Size [2]int32
 
-               Type HUDType
+               //mt:if %s.Field == HUDZIndex
+               ZIndex int32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Text2))) > math.MaxUint16 {
-               chk(ErrTooLong)
+               //mt:if %s.Field == HUDText2
+               Text2 string
+       }))(obj)).Field < hudMax) {
+               chk(errors.New("assertion failed: %s.Field < hudMax"))
        }
-       {
-               x := uint16(len(([]byte((*(*(struct {
-                       ID HUDID
+       if (*(*(struct {
+               ID HUDID
 
-                       Type HUDType
+               Field HUDField
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Text2))))
-               write16(w, uint16(x))
-       }
-       {
-               _, err := w.Write(([]byte((*(*(struct {
-                       ID HUDID
+               //mt:if %s.Field == HUDPos
+               Pos [2]float32
 
-                       Type HUDType
+               //mt:if %s.Field == HUDName
+               Name string
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Text2))[:])
-               chk(err)
-       }
-}
+               //mt:if %s.Field == HUDScale
+               Scale [2]float32
 
-func (obj *ToCltAddHUD) deserialize(r io.Reader) {
-       if err := pcall(func() {
-               ((*(*(struct {
-                       ID HUDID
+               //mt:if %s.Field == HUDText
+               Text string
 
-                       Type HUDType
+               //mt:if %s.Field == HUDNumber
+               Number uint32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).ID).deserialize(r)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
-               }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDID", err))
-       }
-       if err := pcall(func() {
-               ((*(*(struct {
-                       ID HUDID
+               //mt:if %s.Field == HUDItem
+               Item uint32
 
-                       Type HUDType
+               //mt:if %s.Field == HUDDir
+               Dir uint32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Type).deserialize(r)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
-               }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDType", err))
-       }
-       for local173 := range (*(*(struct {
-               ID HUDID
+               //mt:if %s.Field == HUDAlign
+               Align [2]float32
 
-               Type HUDType
+               //mt:if %s.Field == HUDOffset
+               Offset [2]float32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
+               //mt:if %s.Field == HUDWorldPos
                WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Pos {
-               {
-                       p := &((*(*(struct {
-                               ID HUDID
 
-                               Type HUDType
+               //mt:if %s.Field == HUDSize
+               Size [2]int32
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Pos)[local173]
-                       *p = math.Float32frombits(read32(r))
-               }
-       }
-       var local174 []uint8
-       var local175 uint16
-       {
-               p := &local175
-               *p = read16(r)
-       }
-       (local174) = make([]uint8, local175)
-       {
-               _, err := io.ReadFull(r, (local174)[:])
-               chk(err)
-       }
-       ((*(*(struct {
-               ID HUDID
+               //mt:if %s.Field == HUDZIndex
+               ZIndex int32
 
-               Type HUDType
+               //mt:if %s.Field == HUDText2
+               Text2 string
+       }))(obj)).Field == HUDPos {
+               for local174 := range (*(*(struct {
+                       ID HUDID
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Name) = string(local174)
-       for local176 := range (*(*(struct {
-               ID HUDID
+                       Field HUDField
 
-               Type HUDType
+                       //mt:if %s.Field == HUDPos
+                       Pos [2]float32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Scale {
-               {
-                       p := &((*(*(struct {
-                               ID HUDID
+                       //mt:if %s.Field == HUDName
+                       Name string
 
-                               Type HUDType
+                       //mt:if %s.Field == HUDScale
+                       Scale [2]float32
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Scale)[local176]
-                       *p = math.Float32frombits(read32(r))
-               }
-       }
-       var local177 []uint8
-       var local178 uint16
-       {
-               p := &local178
-               *p = read16(r)
-       }
-       (local177) = make([]uint8, local178)
-       {
-               _, err := io.ReadFull(r, (local177)[:])
-               chk(err)
-       }
-       ((*(*(struct {
-               ID HUDID
+                       //mt:if %s.Field == HUDText
+                       Text string
 
-               Type HUDType
+                       //mt:if %s.Field == HUDNumber
+                       Number uint32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Text) = string(local177)
-       {
-               p := &(*(*(struct {
-                       ID HUDID
+                       //mt:if %s.Field == HUDItem
+                       Item uint32
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDDir
+                       Dir uint32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Number
-               *p = read32(r)
-       }
-       {
-               p := &(*(*(struct {
-                       ID HUDID
+                       //mt:if %s.Field == HUDAlign
+                       Align [2]float32
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDOffset
+                       Offset [2]float32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
+                       //mt:if %s.Field == HUDWorldPos
                        WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Item
-               *p = read32(r)
-       }
-       {
-               p := &(*(*(struct {
-                       ID HUDID
 
-                       Type HUDType
+                       //mt:if %s.Field == HUDSize
+                       Size [2]int32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).Dir
-               *p = read32(r)
-       }
-       for local179 := range (*(*(struct {
-               ID HUDID
+                       //mt:if %s.Field == HUDZIndex
+                       ZIndex int32
 
-               Type HUDType
+                       //mt:if %s.Field == HUDText2
+                       Text2 string
+               }))(obj)).Pos {
+                       {
+                               x := ((*(*(struct {
+                                       ID HUDID
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Align {
-               {
-                       p := &((*(*(struct {
-                               ID HUDID
+                                       Field HUDField
 
-                               Type HUDType
+                                       //mt:if %s.Field == HUDPos
+                                       Pos [2]float32
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Align)[local179]
-                       *p = math.Float32frombits(read32(r))
-               }
-       }
-       for local180 := range (*(*(struct {
-               ID HUDID
+                                       //mt:if %s.Field == HUDName
+                                       Name string
 
-               Type HUDType
+                                       //mt:if %s.Field == HUDScale
+                                       Scale [2]float32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Offset {
-               {
-                       p := &((*(*(struct {
-                               ID HUDID
+                                       //mt:if %s.Field == HUDText
+                                       Text string
 
-                               Type HUDType
+                                       //mt:if %s.Field == HUDNumber
+                                       Number uint32
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Offset)[local180]
-                       *p = math.Float32frombits(read32(r))
-               }
-       }
-       if err := pcall(func() {
-               ((*(*(struct {
-                       ID HUDID
+                                       //mt:if %s.Field == HUDItem
+                                       Item uint32
 
-                       Type HUDType
+                                       //mt:if %s.Field == HUDDir
+                                       Dir uint32
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).WorldPos).deserialize(r)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
+                                       //mt:if %s.Field == HUDAlign
+                                       Align [2]float32
+
+                                       //mt:if %s.Field == HUDOffset
+                                       Offset [2]float32
+
+                                       //mt:if %s.Field == HUDWorldPos
+                                       WorldPos Pos
+
+                                       //mt:if %s.Field == HUDSize
+                                       Size [2]int32
+
+                                       //mt:if %s.Field == HUDZIndex
+                                       ZIndex int32
+
+                                       //mt:if %s.Field == HUDText2
+                                       Text2 string
+                               }))(obj)).Pos)[local174]
+                               write32(w, math.Float32bits(x))
+                       }
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Pos", err))
        }
-       for local181 := range (*(*(struct {
+       if (*(*(struct {
                ID HUDID
 
-               Type HUDType
+               Field HUDField
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
-               WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Size {
-               {
-                       p := &((*(*(struct {
-                               ID HUDID
+               //mt:if %s.Field == HUDPos
+               Pos [2]float32
 
-                               Type HUDType
+               //mt:if %s.Field == HUDName
+               Name string
 
-                               Pos      [2]float32
-                               Name     string
-                               Scale    [2]float32
-                               Text     string
-                               Number   uint32
-                               Item     uint32
-                               Dir      uint32
-                               Align    [2]float32
-                               Offset   [2]float32
-                               WorldPos Pos
-                               Size     [2]int32
-                               ZIndex   int16
-                               Text2    string
-                       }))(obj)).Size)[local181]
-                       *p = int32(read32(r))
-               }
-       }
-       {
-               p := &(*(*(struct {
-                       ID HUDID
+               //mt:if %s.Field == HUDScale
+               Scale [2]float32
 
-                       Type HUDType
+               //mt:if %s.Field == HUDText
+               Text string
 
-                       Pos      [2]float32
-                       Name     string
-                       Scale    [2]float32
-                       Text     string
-                       Number   uint32
-                       Item     uint32
-                       Dir      uint32
-                       Align    [2]float32
-                       Offset   [2]float32
-                       WorldPos Pos
-                       Size     [2]int32
-                       ZIndex   int16
-                       Text2    string
-               }))(obj)).ZIndex
-               *p = int16(read16(r))
-       }
-       var local182 []uint8
-       var local183 uint16
-       {
-               p := &local183
-               *p = read16(r)
-       }
-       (local182) = make([]uint8, local183)
-       {
-               _, err := io.ReadFull(r, (local182)[:])
-               chk(err)
-       }
-       ((*(*(struct {
-               ID HUDID
+               //mt:if %s.Field == HUDNumber
+               Number uint32
 
-               Type HUDType
+               //mt:if %s.Field == HUDItem
+               Item uint32
 
-               Pos      [2]float32
-               Name     string
-               Scale    [2]float32
-               Text     string
-               Number   uint32
-               Item     uint32
-               Dir      uint32
-               Align    [2]float32
-               Offset   [2]float32
+               //mt:if %s.Field == HUDDir
+               Dir uint32
+
+               //mt:if %s.Field == HUDAlign
+               Align [2]float32
+
+               //mt:if %s.Field == HUDOffset
+               Offset [2]float32
+
+               //mt:if %s.Field == HUDWorldPos
                WorldPos Pos
-               Size     [2]int32
-               ZIndex   int16
-               Text2    string
-       }))(obj)).Text2) = string(local182)
-}
 
-func (obj *ToCltRmHUD) serialize(w io.Writer) {
-       if err := pcall(func() {
-               ((*(*(struct {
-                       ID HUDID
-               }))(obj)).ID).serialize(w)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
-               }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDID", err))
-       }
-}
+               //mt:if %s.Field == HUDSize
+               Size [2]int32
 
-func (obj *ToCltRmHUD) deserialize(r io.Reader) {
-       if err := pcall(func() {
-               ((*(*(struct {
-                       ID HUDID
-               }))(obj)).ID).deserialize(r)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
-               }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDID", err))
-       }
-}
+               //mt:if %s.Field == HUDZIndex
+               ZIndex int32
 
-func (obj *ToCltChangeHUD) serialize(w io.Writer) {
-       if err := pcall(func() {
-               ((*(*(struct {
+               //mt:if %s.Field == HUDText2
+               Text2 string
+       }))(obj)).Field == HUDName {
+               if len(([]byte((*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -8566,113 +7700,107 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
-               }))(obj)).ID).serialize(w)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
+               }))(obj)).Name))) > math.MaxUint16 {
+                       chk(ErrTooLong)
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDID", err))
-       }
-       if err := pcall(func() {
-               ((*(*(struct {
-                       ID HUDID
+               {
+                       x := uint16(len(([]byte((*(*(struct {
+                               ID HUDID
 
-                       Field HUDField
+                               Field HUDField
 
-                       //mt:if %s.Field == HUDPos
-                       Pos [2]float32
+                               //mt:if %s.Field == HUDPos
+                               Pos [2]float32
 
-                       //mt:if %s.Field == HUDName
-                       Name string
+                               //mt:if %s.Field == HUDName
+                               Name string
 
-                       //mt:if %s.Field == HUDScale
-                       Scale [2]float32
+                               //mt:if %s.Field == HUDScale
+                               Scale [2]float32
 
-                       //mt:if %s.Field == HUDText
-                       Text string
+                               //mt:if %s.Field == HUDText
+                               Text string
 
-                       //mt:if %s.Field == HUDNumber
-                       Number uint32
+                               //mt:if %s.Field == HUDNumber
+                               Number uint32
 
-                       //mt:if %s.Field == HUDItem
-                       Item uint32
+                               //mt:if %s.Field == HUDItem
+                               Item uint32
 
-                       //mt:if %s.Field == HUDDir
-                       Dir uint32
+                               //mt:if %s.Field == HUDDir
+                               Dir uint32
 
-                       //mt:if %s.Field == HUDAlign
-                       Align [2]float32
+                               //mt:if %s.Field == HUDAlign
+                               Align [2]float32
 
-                       //mt:if %s.Field == HUDOffset
-                       Offset [2]float32
+                               //mt:if %s.Field == HUDOffset
+                               Offset [2]float32
 
-                       //mt:if %s.Field == HUDWorldPos
-                       WorldPos Pos
+                               //mt:if %s.Field == HUDWorldPos
+                               WorldPos Pos
 
-                       //mt:if %s.Field == HUDSize
-                       Size [2]int32
+                               //mt:if %s.Field == HUDSize
+                               Size [2]int32
 
-                       //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                               //mt:if %s.Field == HUDZIndex
+                               ZIndex int32
 
-                       //mt:if %s.Field == HUDText2
-                       Text2 string
-               }))(obj)).Field).serialize(w)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
+                               //mt:if %s.Field == HUDText2
+                               Text2 string
+                       }))(obj)).Name))))
+                       write16(w, uint16(x))
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDField", err))
-       }
-       if !((*(*(struct {
-               ID HUDID
+               {
+                       _, err := w.Write(([]byte((*(*(struct {
+                               ID HUDID
 
-               Field HUDField
+                               Field HUDField
 
-               //mt:if %s.Field == HUDPos
-               Pos [2]float32
+                               //mt:if %s.Field == HUDPos
+                               Pos [2]float32
 
-               //mt:if %s.Field == HUDName
-               Name string
+                               //mt:if %s.Field == HUDName
+                               Name string
 
-               //mt:if %s.Field == HUDScale
-               Scale [2]float32
+                               //mt:if %s.Field == HUDScale
+                               Scale [2]float32
 
-               //mt:if %s.Field == HUDText
-               Text string
+                               //mt:if %s.Field == HUDText
+                               Text string
 
-               //mt:if %s.Field == HUDNumber
-               Number uint32
+                               //mt:if %s.Field == HUDNumber
+                               Number uint32
 
-               //mt:if %s.Field == HUDItem
-               Item uint32
+                               //mt:if %s.Field == HUDItem
+                               Item uint32
 
-               //mt:if %s.Field == HUDDir
-               Dir uint32
+                               //mt:if %s.Field == HUDDir
+                               Dir uint32
 
-               //mt:if %s.Field == HUDAlign
-               Align [2]float32
+                               //mt:if %s.Field == HUDAlign
+                               Align [2]float32
 
-               //mt:if %s.Field == HUDOffset
-               Offset [2]float32
+                               //mt:if %s.Field == HUDOffset
+                               Offset [2]float32
 
-               //mt:if %s.Field == HUDWorldPos
-               WorldPos Pos
+                               //mt:if %s.Field == HUDWorldPos
+                               WorldPos Pos
 
-               //mt:if %s.Field == HUDSize
-               Size [2]int32
+                               //mt:if %s.Field == HUDSize
+                               Size [2]int32
 
-               //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+                               //mt:if %s.Field == HUDZIndex
+                               ZIndex int32
 
-               //mt:if %s.Field == HUDText2
-               Text2 string
-       }))(obj)).Field < hudMax) {
-               chk(errors.New("assertion failed: %s.Field < hudMax"))
+                               //mt:if %s.Field == HUDText2
+                               Text2 string
+                       }))(obj)).Name))[:])
+                       chk(err)
+               }
        }
        if (*(*(struct {
                ID HUDID
@@ -8713,12 +7841,12 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
-       }))(obj)).Field == HUDPos {
-               for local184 := range (*(*(struct {
+       }))(obj)).Field == HUDScale {
+               for local175 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -8757,11 +7885,11 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
-               }))(obj)).Pos {
+               }))(obj)).Scale {
                        {
                                x := ((*(*(struct {
                                        ID HUDID
@@ -8802,11 +7930,11 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Pos)[local184]
+                               }))(obj)).Scale)[local175]
                                write32(w, math.Float32bits(x))
                        }
                }
@@ -8850,11 +7978,11 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
-       }))(obj)).Field == HUDName {
+       }))(obj)).Field == HUDText {
                if len(([]byte((*(*(struct {
                        ID HUDID
 
@@ -8894,329 +8022,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
-
-                       //mt:if %s.Field == HUDText2
-                       Text2 string
-               }))(obj)).Name))) > math.MaxUint16 {
-                       chk(ErrTooLong)
-               }
-               {
-                       x := uint16(len(([]byte((*(*(struct {
-                               ID HUDID
-
-                               Field HUDField
-
-                               //mt:if %s.Field == HUDPos
-                               Pos [2]float32
-
-                               //mt:if %s.Field == HUDName
-                               Name string
-
-                               //mt:if %s.Field == HUDScale
-                               Scale [2]float32
-
-                               //mt:if %s.Field == HUDText
-                               Text string
-
-                               //mt:if %s.Field == HUDNumber
-                               Number uint32
-
-                               //mt:if %s.Field == HUDItem
-                               Item uint32
-
-                               //mt:if %s.Field == HUDDir
-                               Dir uint32
-
-                               //mt:if %s.Field == HUDAlign
-                               Align [2]float32
-
-                               //mt:if %s.Field == HUDOffset
-                               Offset [2]float32
-
-                               //mt:if %s.Field == HUDWorldPos
-                               WorldPos Pos
-
-                               //mt:if %s.Field == HUDSize
-                               Size [2]int32
-
-                               //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
-
-                               //mt:if %s.Field == HUDText2
-                               Text2 string
-                       }))(obj)).Name))))
-                       write16(w, uint16(x))
-               }
-               {
-                       _, err := w.Write(([]byte((*(*(struct {
-                               ID HUDID
-
-                               Field HUDField
-
-                               //mt:if %s.Field == HUDPos
-                               Pos [2]float32
-
-                               //mt:if %s.Field == HUDName
-                               Name string
-
-                               //mt:if %s.Field == HUDScale
-                               Scale [2]float32
-
-                               //mt:if %s.Field == HUDText
-                               Text string
-
-                               //mt:if %s.Field == HUDNumber
-                               Number uint32
-
-                               //mt:if %s.Field == HUDItem
-                               Item uint32
-
-                               //mt:if %s.Field == HUDDir
-                               Dir uint32
-
-                               //mt:if %s.Field == HUDAlign
-                               Align [2]float32
-
-                               //mt:if %s.Field == HUDOffset
-                               Offset [2]float32
-
-                               //mt:if %s.Field == HUDWorldPos
-                               WorldPos Pos
-
-                               //mt:if %s.Field == HUDSize
-                               Size [2]int32
-
-                               //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
-
-                               //mt:if %s.Field == HUDText2
-                               Text2 string
-                       }))(obj)).Name))[:])
-                       chk(err)
-               }
-       }
-       if (*(*(struct {
-               ID HUDID
-
-               Field HUDField
-
-               //mt:if %s.Field == HUDPos
-               Pos [2]float32
-
-               //mt:if %s.Field == HUDName
-               Name string
-
-               //mt:if %s.Field == HUDScale
-               Scale [2]float32
-
-               //mt:if %s.Field == HUDText
-               Text string
-
-               //mt:if %s.Field == HUDNumber
-               Number uint32
-
-               //mt:if %s.Field == HUDItem
-               Item uint32
-
-               //mt:if %s.Field == HUDDir
-               Dir uint32
-
-               //mt:if %s.Field == HUDAlign
-               Align [2]float32
-
-               //mt:if %s.Field == HUDOffset
-               Offset [2]float32
-
-               //mt:if %s.Field == HUDWorldPos
-               WorldPos Pos
-
-               //mt:if %s.Field == HUDSize
-               Size [2]int32
-
-               //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
-
-               //mt:if %s.Field == HUDText2
-               Text2 string
-       }))(obj)).Field == HUDScale {
-               for local185 := range (*(*(struct {
-                       ID HUDID
-
-                       Field HUDField
-
-                       //mt:if %s.Field == HUDPos
-                       Pos [2]float32
-
-                       //mt:if %s.Field == HUDName
-                       Name string
-
-                       //mt:if %s.Field == HUDScale
-                       Scale [2]float32
-
-                       //mt:if %s.Field == HUDText
-                       Text string
-
-                       //mt:if %s.Field == HUDNumber
-                       Number uint32
-
-                       //mt:if %s.Field == HUDItem
-                       Item uint32
-
-                       //mt:if %s.Field == HUDDir
-                       Dir uint32
-
-                       //mt:if %s.Field == HUDAlign
-                       Align [2]float32
-
-                       //mt:if %s.Field == HUDOffset
-                       Offset [2]float32
-
-                       //mt:if %s.Field == HUDWorldPos
-                       WorldPos Pos
-
-                       //mt:if %s.Field == HUDSize
-                       Size [2]int32
-
-                       //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
-
-                       //mt:if %s.Field == HUDText2
-                       Text2 string
-               }))(obj)).Scale {
-                       {
-                               x := ((*(*(struct {
-                                       ID HUDID
-
-                                       Field HUDField
-
-                                       //mt:if %s.Field == HUDPos
-                                       Pos [2]float32
-
-                                       //mt:if %s.Field == HUDName
-                                       Name string
-
-                                       //mt:if %s.Field == HUDScale
-                                       Scale [2]float32
-
-                                       //mt:if %s.Field == HUDText
-                                       Text string
-
-                                       //mt:if %s.Field == HUDNumber
-                                       Number uint32
-
-                                       //mt:if %s.Field == HUDItem
-                                       Item uint32
-
-                                       //mt:if %s.Field == HUDDir
-                                       Dir uint32
-
-                                       //mt:if %s.Field == HUDAlign
-                                       Align [2]float32
-
-                                       //mt:if %s.Field == HUDOffset
-                                       Offset [2]float32
-
-                                       //mt:if %s.Field == HUDWorldPos
-                                       WorldPos Pos
-
-                                       //mt:if %s.Field == HUDSize
-                                       Size [2]int32
-
-                                       //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
-
-                                       //mt:if %s.Field == HUDText2
-                                       Text2 string
-                               }))(obj)).Scale)[local185]
-                               write32(w, math.Float32bits(x))
-                       }
-               }
-       }
-       if (*(*(struct {
-               ID HUDID
-
-               Field HUDField
-
-               //mt:if %s.Field == HUDPos
-               Pos [2]float32
-
-               //mt:if %s.Field == HUDName
-               Name string
-
-               //mt:if %s.Field == HUDScale
-               Scale [2]float32
-
-               //mt:if %s.Field == HUDText
-               Text string
-
-               //mt:if %s.Field == HUDNumber
-               Number uint32
-
-               //mt:if %s.Field == HUDItem
-               Item uint32
-
-               //mt:if %s.Field == HUDDir
-               Dir uint32
-
-               //mt:if %s.Field == HUDAlign
-               Align [2]float32
-
-               //mt:if %s.Field == HUDOffset
-               Offset [2]float32
-
-               //mt:if %s.Field == HUDWorldPos
-               WorldPos Pos
-
-               //mt:if %s.Field == HUDSize
-               Size [2]int32
-
-               //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
-
-               //mt:if %s.Field == HUDText2
-               Text2 string
-       }))(obj)).Field == HUDText {
-               if len(([]byte((*(*(struct {
-                       ID HUDID
-
-                       Field HUDField
-
-                       //mt:if %s.Field == HUDPos
-                       Pos [2]float32
-
-                       //mt:if %s.Field == HUDName
-                       Name string
-
-                       //mt:if %s.Field == HUDScale
-                       Scale [2]float32
-
-                       //mt:if %s.Field == HUDText
-                       Text string
-
-                       //mt:if %s.Field == HUDNumber
-                       Number uint32
-
-                       //mt:if %s.Field == HUDItem
-                       Item uint32
-
-                       //mt:if %s.Field == HUDDir
-                       Dir uint32
-
-                       //mt:if %s.Field == HUDAlign
-                       Align [2]float32
-
-                       //mt:if %s.Field == HUDOffset
-                       Offset [2]float32
-
-                       //mt:if %s.Field == HUDWorldPos
-                       WorldPos Pos
-
-                       //mt:if %s.Field == HUDSize
-                       Size [2]int32
-
-                       //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -9263,7 +8069,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -9310,7 +8116,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -9357,7 +8163,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -9402,7 +8208,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -9449,7 +8255,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -9494,7 +8300,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -9541,7 +8347,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -9586,7 +8392,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -9633,12 +8439,12 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDAlign {
-               for local186 := range (*(*(struct {
+               for local176 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -9677,7 +8483,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -9722,11 +8528,11 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Align)[local186]
+                               }))(obj)).Align)[local176]
                                write32(w, math.Float32bits(x))
                        }
                }
@@ -9770,12 +8576,12 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDOffset {
-               for local187 := range (*(*(struct {
+               for local177 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -9814,7 +8620,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -9859,11 +8665,11 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Offset)[local187]
+                               }))(obj)).Offset)[local177]
                                write32(w, math.Float32bits(x))
                        }
                }
@@ -9907,7 +8713,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -9952,7 +8758,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -10003,12 +8809,12 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDSize {
-               for local188 := range (*(*(struct {
+               for local178 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -10047,7 +8853,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -10092,11 +8898,11 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Size)[local188]
+                               }))(obj)).Size)[local178]
                                write32(w, uint32(x))
                        }
                }
@@ -10140,7 +8946,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -10185,7 +8991,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -10232,7 +9038,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -10276,7 +9082,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -10323,7 +9129,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -10370,7 +9176,7 @@ func (obj *ToCltChangeHUD) serialize(w io.Writer) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -10421,7 +9227,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -10472,7 +9278,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -10522,7 +9328,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -10568,12 +9374,12 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDPos {
-               for local189 := range (*(*(struct {
+               for local179 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -10612,7 +9418,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -10657,11 +9463,11 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Pos)[local189]
+                               }))(obj)).Pos)[local179]
                                *p = math.Float32frombits(read32(r))
                        }
                }
@@ -10705,20 +9511,20 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDName {
-               var local190 []uint8
-               var local191 uint16
+               var local180 []uint8
+               var local181 uint16
                {
-                       p := &local191
+                       p := &local181
                        *p = read16(r)
                }
-               (local190) = make([]uint8, local191)
+               (local180) = make([]uint8, local181)
                {
-                       _, err := io.ReadFull(r, (local190)[:])
+                       _, err := io.ReadFull(r, (local180)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -10760,11 +9566,11 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
-               }))(obj)).Name) = string(local190)
+               }))(obj)).Name) = string(local180)
        }
        if (*(*(struct {
                ID HUDID
@@ -10805,12 +9611,12 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDScale {
-               for local192 := range (*(*(struct {
+               for local182 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -10849,7 +9655,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -10894,11 +9700,11 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Scale)[local192]
+                               }))(obj)).Scale)[local182]
                                *p = math.Float32frombits(read32(r))
                        }
                }
@@ -10942,20 +9748,20 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDText {
-               var local193 []uint8
-               var local194 uint16
+               var local183 []uint8
+               var local184 uint16
                {
-                       p := &local194
+                       p := &local184
                        *p = read16(r)
                }
-               (local193) = make([]uint8, local194)
+               (local183) = make([]uint8, local184)
                {
-                       _, err := io.ReadFull(r, (local193)[:])
+                       _, err := io.ReadFull(r, (local183)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -10997,11 +9803,11 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
-               }))(obj)).Text) = string(local193)
+               }))(obj)).Text) = string(local183)
        }
        if (*(*(struct {
                ID HUDID
@@ -11042,7 +9848,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -11087,7 +9893,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -11134,7 +9940,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -11179,7 +9985,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -11226,7 +10032,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -11271,7 +10077,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -11318,12 +10124,12 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDAlign {
-               for local195 := range (*(*(struct {
+               for local185 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -11362,7 +10168,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -11407,11 +10213,11 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Align)[local195]
+                               }))(obj)).Align)[local185]
                                *p = math.Float32frombits(read32(r))
                        }
                }
@@ -11455,12 +10261,12 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDOffset {
-               for local196 := range (*(*(struct {
+               for local186 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -11499,7 +10305,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -11544,11 +10350,11 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Offset)[local196]
+                               }))(obj)).Offset)[local186]
                                *p = math.Float32frombits(read32(r))
                        }
                }
@@ -11592,7 +10398,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -11637,7 +10443,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
@@ -11688,12 +10494,12 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDSize {
-               for local197 := range (*(*(struct {
+               for local187 := range (*(*(struct {
                        ID HUDID
 
                        Field HUDField
@@ -11732,7 +10538,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
@@ -11777,11 +10583,11 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                        Size [2]int32
 
                                        //mt:if %s.Field == HUDZIndex
-                                       ZIndex uint32
+                                       ZIndex int32
 
                                        //mt:if %s.Field == HUDText2
                                        Text2 string
-                               }))(obj)).Size)[local197]
+                               }))(obj)).Size)[local187]
                                *p = int32(read32(r))
                        }
                }
@@ -11825,7 +10631,7 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
@@ -11870,12 +10676,12 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                                Size [2]int32
 
                                //mt:if %s.Field == HUDZIndex
-                               ZIndex uint32
+                               ZIndex int32
 
                                //mt:if %s.Field == HUDText2
                                Text2 string
                        }))(obj)).ZIndex
-                       *p = read32(r)
+                       *p = int32(read32(r))
                }
        }
        if (*(*(struct {
@@ -11917,20 +10723,20 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                Size [2]int32
 
                //mt:if %s.Field == HUDZIndex
-               ZIndex uint32
+               ZIndex int32
 
                //mt:if %s.Field == HUDText2
                Text2 string
        }))(obj)).Field == HUDText2 {
-               var local198 []uint8
-               var local199 uint16
+               var local188 []uint8
+               var local189 uint16
                {
-                       p := &local199
+                       p := &local189
                        *p = read16(r)
                }
-               (local198) = make([]uint8, local199)
+               (local188) = make([]uint8, local189)
                {
-                       _, err := io.ReadFull(r, (local198)[:])
+                       _, err := io.ReadFull(r, (local188)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -11972,11 +10778,11 @@ func (obj *ToCltChangeHUD) deserialize(r io.Reader) {
                        Size [2]int32
 
                        //mt:if %s.Field == HUDZIndex
-                       ZIndex uint32
+                       ZIndex int32
 
                        //mt:if %s.Field == HUDText2
                        Text2 string
-               }))(obj)).Text2) = string(local198)
+               }))(obj)).Text2) = string(local188)
        }
 }
 
@@ -12063,9 +10869,9 @@ func (obj *ToCltSetHotbarParam) serialize(w io.Writer) {
                Img Texture
        }))(obj)).Param == HotbarSize {
                {
-                       local200 := uint16(4) // Size of Size field.
+                       local190 := uint16(4) // Size of Size field.
                        {
-                               x := local200
+                               x := local190
                                write16(w, uint16(x))
                        }
                }
@@ -12142,13 +10948,14 @@ func (obj *ToCltSetHotbarParam) deserialize(r io.Reader) {
                Img Texture
        }))(obj)).Param == HotbarSize {
                {
-                       var local201 uint16
+                       var local191 uint16
+                       local192 := uint16(4) // Size of Size field.
                        {
-                               p := &local201
+                               p := &local191
                                *p = read16(r)
                        }
-                       if local201 != (4) {
-                               chk(fmt.Errorf("const %v: %v", 4, local201))
+                       if local191 != local192 {
+                               chk(fmt.Errorf("const %v: %v", "uint16(4) // Size of Size field.", local191))
                        }
                }
                {
@@ -12472,7 +11279,7 @@ func (obj *ToCltSkyParams) serialize(w io.Writer) {
                        }))(obj)).Textures)))
                        write16(w, uint16(x))
                }
-               for local202 := range (*(*(struct {
+               for local193 := range (*(*(struct {
                        BgColor     color.NRGBA
                        Type        string
                        Clouds      bool
@@ -12506,7 +11313,7 @@ func (obj *ToCltSkyParams) serialize(w io.Writer) {
                                        DawnSky, DawnHorizon,
                                        NightSky, NightHorizon,
                                        Indoor color.NRGBA
-                               }))(obj)).Textures)[local202]).serialize(w)
+                               }))(obj)).Textures)[local193]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -12696,15 +11503,15 @@ func (obj *ToCltSkyParams) deserialize(r io.Reader) {
                }))(obj)).BgColor
                *p = color.NRGBA{A: read8(r), R: read8(r), G: read8(r), B: read8(r)}
        }
-       var local203 []uint8
-       var local204 uint16
+       var local194 []uint8
+       var local195 uint16
        {
-               p := &local204
+               p := &local195
                *p = read16(r)
        }
-       (local203) = make([]uint8, local204)
+       (local194) = make([]uint8, local195)
        {
-               _, err := io.ReadFull(r, (local203)[:])
+               _, err := io.ReadFull(r, (local194)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -12723,7 +11530,7 @@ func (obj *ToCltSkyParams) deserialize(r io.Reader) {
                DawnSky, DawnHorizon,
                NightSky, NightHorizon,
                Indoor color.NRGBA
-       }))(obj)).Type) = string(local203)
+       }))(obj)).Type) = string(local194)
        {
                p := &(*(*(struct {
                        BgColor     color.NRGBA
@@ -12791,15 +11598,15 @@ func (obj *ToCltSkyParams) deserialize(r io.Reader) {
                }))(obj)).MoonFogTint
                *p = color.NRGBA{A: read8(r), R: read8(r), G: read8(r), B: read8(r)}
        }
-       var local205 []uint8
-       var local206 uint16
+       var local196 []uint8
+       var local197 uint16
        {
-               p := &local206
+               p := &local197
                *p = read16(r)
        }
-       (local205) = make([]uint8, local206)
+       (local196) = make([]uint8, local197)
        {
-               _, err := io.ReadFull(r, (local205)[:])
+               _, err := io.ReadFull(r, (local196)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -12818,7 +11625,7 @@ func (obj *ToCltSkyParams) deserialize(r io.Reader) {
                DawnSky, DawnHorizon,
                NightSky, NightHorizon,
                Indoor color.NRGBA
-       }))(obj)).FogTintType) = string(local205)
+       }))(obj)).FogTintType) = string(local196)
        if (*(*(struct {
                BgColor     color.NRGBA
                Type        string
@@ -12836,9 +11643,9 @@ func (obj *ToCltSkyParams) deserialize(r io.Reader) {
                NightSky, NightHorizon,
                Indoor color.NRGBA
        }))(obj)).Type == "skybox" {
-               var local207 uint16
+               var local198 uint16
                {
-                       p := &local207
+                       p := &local198
                        *p = read16(r)
                }
                ((*(*(struct {
@@ -12857,8 +11664,8 @@ func (obj *ToCltSkyParams) deserialize(r io.Reader) {
                        DawnSky, DawnHorizon,
                        NightSky, NightHorizon,
                        Indoor color.NRGBA
-               }))(obj)).Textures) = make([]Texture, local207)
-               for local208 := range (*(*(struct {
+               }))(obj)).Textures) = make([]Texture, local198)
+               for local199 := range (*(*(struct {
                        BgColor     color.NRGBA
                        Type        string
                        Clouds      bool
@@ -12892,7 +11699,7 @@ func (obj *ToCltSkyParams) deserialize(r io.Reader) {
                                        DawnSky, DawnHorizon,
                                        NightSky, NightHorizon,
                                        Indoor color.NRGBA
-                               }))(obj)).Textures)[local208]).deserialize(r)
+                               }))(obj)).Textures)[local199]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -13107,7 +11914,7 @@ func (obj *ToCltOverrideDayNightRatio) deserialize(r io.Reader) {
 }
 
 func (obj *ToCltLocalPlayerAnim) serialize(w io.Writer) {
-       for local209 := range (*(*(struct {
+       for local200 := range (*(*(struct {
                Idle, Walk, Dig, WalkDig [2]int32
                Speed                    float32
        }))(obj)).Idle {
@@ -13115,11 +11922,11 @@ func (obj *ToCltLocalPlayerAnim) serialize(w io.Writer) {
                        x := ((*(*(struct {
                                Idle, Walk, Dig, WalkDig [2]int32
                                Speed                    float32
-                       }))(obj)).Idle)[local209]
+                       }))(obj)).Idle)[local200]
                        write32(w, uint32(x))
                }
        }
-       for local210 := range (*(*(struct {
+       for local201 := range (*(*(struct {
                Idle, Walk, Dig, WalkDig [2]int32
                Speed                    float32
        }))(obj)).Walk {
@@ -13127,11 +11934,11 @@ func (obj *ToCltLocalPlayerAnim) serialize(w io.Writer) {
                        x := ((*(*(struct {
                                Idle, Walk, Dig, WalkDig [2]int32
                                Speed                    float32
-                       }))(obj)).Walk)[local210]
+                       }))(obj)).Walk)[local201]
                        write32(w, uint32(x))
                }
        }
-       for local211 := range (*(*(struct {
+       for local202 := range (*(*(struct {
                Idle, Walk, Dig, WalkDig [2]int32
                Speed                    float32
        }))(obj)).Dig {
@@ -13139,11 +11946,11 @@ func (obj *ToCltLocalPlayerAnim) serialize(w io.Writer) {
                        x := ((*(*(struct {
                                Idle, Walk, Dig, WalkDig [2]int32
                                Speed                    float32
-                       }))(obj)).Dig)[local211]
+                       }))(obj)).Dig)[local202]
                        write32(w, uint32(x))
                }
        }
-       for local212 := range (*(*(struct {
+       for local203 := range (*(*(struct {
                Idle, Walk, Dig, WalkDig [2]int32
                Speed                    float32
        }))(obj)).WalkDig {
@@ -13151,7 +11958,7 @@ func (obj *ToCltLocalPlayerAnim) serialize(w io.Writer) {
                        x := ((*(*(struct {
                                Idle, Walk, Dig, WalkDig [2]int32
                                Speed                    float32
-                       }))(obj)).WalkDig)[local212]
+                       }))(obj)).WalkDig)[local203]
                        write32(w, uint32(x))
                }
        }
@@ -13165,7 +11972,7 @@ func (obj *ToCltLocalPlayerAnim) serialize(w io.Writer) {
 }
 
 func (obj *ToCltLocalPlayerAnim) deserialize(r io.Reader) {
-       for local213 := range (*(*(struct {
+       for local204 := range (*(*(struct {
                Idle, Walk, Dig, WalkDig [2]int32
                Speed                    float32
        }))(obj)).Idle {
@@ -13173,11 +11980,11 @@ func (obj *ToCltLocalPlayerAnim) deserialize(r io.Reader) {
                        p := &((*(*(struct {
                                Idle, Walk, Dig, WalkDig [2]int32
                                Speed                    float32
-                       }))(obj)).Idle)[local213]
+                       }))(obj)).Idle)[local204]
                        *p = int32(read32(r))
                }
        }
-       for local214 := range (*(*(struct {
+       for local205 := range (*(*(struct {
                Idle, Walk, Dig, WalkDig [2]int32
                Speed                    float32
        }))(obj)).Walk {
@@ -13185,11 +11992,11 @@ func (obj *ToCltLocalPlayerAnim) deserialize(r io.Reader) {
                        p := &((*(*(struct {
                                Idle, Walk, Dig, WalkDig [2]int32
                                Speed                    float32
-                       }))(obj)).Walk)[local214]
+                       }))(obj)).Walk)[local205]
                        *p = int32(read32(r))
                }
        }
-       for local215 := range (*(*(struct {
+       for local206 := range (*(*(struct {
                Idle, Walk, Dig, WalkDig [2]int32
                Speed                    float32
        }))(obj)).Dig {
@@ -13197,11 +12004,11 @@ func (obj *ToCltLocalPlayerAnim) deserialize(r io.Reader) {
                        p := &((*(*(struct {
                                Idle, Walk, Dig, WalkDig [2]int32
                                Speed                    float32
-                       }))(obj)).Dig)[local215]
+                       }))(obj)).Dig)[local206]
                        *p = int32(read32(r))
                }
        }
-       for local216 := range (*(*(struct {
+       for local207 := range (*(*(struct {
                Idle, Walk, Dig, WalkDig [2]int32
                Speed                    float32
        }))(obj)).WalkDig {
@@ -13209,7 +12016,7 @@ func (obj *ToCltLocalPlayerAnim) deserialize(r io.Reader) {
                        p := &((*(*(struct {
                                Idle, Walk, Dig, WalkDig [2]int32
                                Speed                    float32
-                       }))(obj)).WalkDig)[local216]
+                       }))(obj)).WalkDig)[local207]
                        *p = int32(read32(r))
                }
        }
@@ -13350,7 +12157,7 @@ func (obj *ToCltCloudParams) serialize(w io.Writer) {
                }))(obj)).Thickness
                write32(w, math.Float32bits(x))
        }
-       for local217 := range (*(*(struct {
+       for local208 := range (*(*(struct {
                Density      float32
                DiffuseColor color.NRGBA
                AmbientColor color.NRGBA
@@ -13366,7 +12173,7 @@ func (obj *ToCltCloudParams) serialize(w io.Writer) {
                                Height       float32
                                Thickness    float32
                                Speed        [2]float32
-                       }))(obj)).Speed)[local217]
+                       }))(obj)).Speed)[local208]
                        write32(w, math.Float32bits(x))
                }
        }
@@ -13428,7 +12235,7 @@ func (obj *ToCltCloudParams) deserialize(r io.Reader) {
                }))(obj)).Thickness
                *p = math.Float32frombits(read32(r))
        }
-       for local218 := range (*(*(struct {
+       for local209 := range (*(*(struct {
                Density      float32
                DiffuseColor color.NRGBA
                AmbientColor color.NRGBA
@@ -13444,7 +12251,7 @@ func (obj *ToCltCloudParams) deserialize(r io.Reader) {
                                Height       float32
                                Thickness    float32
                                Speed        [2]float32
-                       }))(obj)).Speed)[local218]
+                       }))(obj)).Speed)[local209]
                        *p = math.Float32frombits(read32(r))
                }
        }
@@ -13537,28 +12344,28 @@ func (obj *ToCltUpdatePlayerList) serialize(w io.Writer) {
                }))(obj)).Players)))
                write16(w, uint16(x))
        }
-       for local219 := range (*(*(struct {
+       for local210 := range (*(*(struct {
                Type    PlayerListUpdateType
                Players []string
        }))(obj)).Players {
                if len(([]byte(((*(*(struct {
                        Type    PlayerListUpdateType
                        Players []string
-               }))(obj)).Players)[local219]))) > math.MaxUint16 {
+               }))(obj)).Players)[local210]))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
                {
                        x := uint16(len(([]byte(((*(*(struct {
                                Type    PlayerListUpdateType
                                Players []string
-                       }))(obj)).Players)[local219]))))
+                       }))(obj)).Players)[local210]))))
                        write16(w, uint16(x))
                }
                {
                        _, err := w.Write(([]byte(((*(*(struct {
                                Type    PlayerListUpdateType
                                Players []string
-                       }))(obj)).Players)[local219]))[:])
+                       }))(obj)).Players)[local210]))[:])
                        chk(err)
                }
        }
@@ -13576,34 +12383,34 @@ func (obj *ToCltUpdatePlayerList) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.PlayerListUpdateType", err))
        }
-       var local220 uint16
+       var local211 uint16
        {
-               p := &local220
+               p := &local211
                *p = read16(r)
        }
        ((*(*(struct {
                Type    PlayerListUpdateType
                Players []string
-       }))(obj)).Players) = make([]string, local220)
-       for local221 := range (*(*(struct {
+       }))(obj)).Players) = make([]string, local211)
+       for local212 := range (*(*(struct {
                Type    PlayerListUpdateType
                Players []string
        }))(obj)).Players {
-               var local222 []uint8
-               var local223 uint16
+               var local213 []uint8
+               var local214 uint16
                {
-                       p := &local223
+                       p := &local214
                        *p = read16(r)
                }
-               (local222) = make([]uint8, local223)
+               (local213) = make([]uint8, local214)
                {
-                       _, err := io.ReadFull(r, (local222)[:])
+                       _, err := io.ReadFull(r, (local213)[:])
                        chk(err)
                }
                (((*(*(struct {
                        Type    PlayerListUpdateType
                        Players []string
-               }))(obj)).Players)[local221]) = string(local222)
+               }))(obj)).Players)[local212]) = string(local213)
        }
 }
 
@@ -13680,54 +12487,54 @@ func (obj *ToCltModChanMsg) serialize(w io.Writer) {
 }
 
 func (obj *ToCltModChanMsg) deserialize(r io.Reader) {
-       var local224 []uint8
-       var local225 uint16
+       var local215 []uint8
+       var local216 uint16
        {
-               p := &local225
+               p := &local216
                *p = read16(r)
        }
-       (local224) = make([]uint8, local225)
+       (local215) = make([]uint8, local216)
        {
-               _, err := io.ReadFull(r, (local224)[:])
+               _, err := io.ReadFull(r, (local215)[:])
                chk(err)
        }
        ((*(*(struct {
                Channel string
                Sender  string
                Msg     string
-       }))(obj)).Channel) = string(local224)
-       var local226 []uint8
-       var local227 uint16
+       }))(obj)).Channel) = string(local215)
+       var local217 []uint8
+       var local218 uint16
        {
-               p := &local227
+               p := &local218
                *p = read16(r)
        }
-       (local226) = make([]uint8, local227)
+       (local217) = make([]uint8, local218)
        {
-               _, err := io.ReadFull(r, (local226)[:])
+               _, err := io.ReadFull(r, (local217)[:])
                chk(err)
        }
        ((*(*(struct {
                Channel string
                Sender  string
                Msg     string
-       }))(obj)).Sender) = string(local226)
-       var local228 []uint8
-       var local229 uint16
+       }))(obj)).Sender) = string(local217)
+       var local219 []uint8
+       var local220 uint16
        {
-               p := &local229
+               p := &local220
                *p = read16(r)
        }
-       (local228) = make([]uint8, local229)
+       (local219) = make([]uint8, local220)
        {
-               _, err := io.ReadFull(r, (local228)[:])
+               _, err := io.ReadFull(r, (local219)[:])
                chk(err)
        }
        ((*(*(struct {
                Channel string
                Sender  string
                Msg     string
-       }))(obj)).Msg) = string(local228)
+       }))(obj)).Msg) = string(local219)
 }
 
 func (obj *ToCltModChanSig) serialize(w io.Writer) {
@@ -13776,21 +12583,21 @@ func (obj *ToCltModChanSig) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ModChanSig", err))
        }
-       var local230 []uint8
-       var local231 uint16
+       var local221 []uint8
+       var local222 uint16
        {
-               p := &local231
+               p := &local222
                *p = read16(r)
        }
-       (local230) = make([]uint8, local231)
+       (local221) = make([]uint8, local222)
        {
-               _, err := io.ReadFull(r, (local230)[:])
+               _, err := io.ReadFull(r, (local221)[:])
                chk(err)
        }
        ((*(*(struct {
                Signal  ModChanSig
                Channel string
-       }))(obj)).Channel) = string(local230)
+       }))(obj)).Channel) = string(local221)
 }
 
 func (obj *ToCltNodeMetasChanged) serialize(w io.Writer) {
@@ -13863,7 +12670,7 @@ func (obj *ToCltNodeMetasChanged) deserialize(r io.Reader) {
                        p := &n
                        *p = read32(r)
                }
-               r := &io.LimitedReader{r, int64(n)}
+               r := &io.LimitedReader{R: r, N: int64(n)}
                {
                        p := &(*(*(struct {
                                //mt:lenhdr 32
@@ -14315,28 +13122,28 @@ func (obj *ToCltSRPBytesSaltB) serialize(w io.Writer) {
 }
 
 func (obj *ToCltSRPBytesSaltB) deserialize(r io.Reader) {
-       var local232 uint16
+       var local223 uint16
        {
-               p := &local232
+               p := &local223
                *p = read16(r)
        }
        ((*(*(struct {
                Salt, B []byte
-       }))(obj)).Salt) = make([]byte, local232)
+       }))(obj)).Salt) = make([]byte, local223)
        {
                _, err := io.ReadFull(r, ((*(*(struct {
                        Salt, B []byte
                }))(obj)).Salt)[:])
                chk(err)
        }
-       var local233 uint16
+       var local224 uint16
        {
-               p := &local233
+               p := &local224
                *p = read16(r)
        }
        ((*(*(struct {
                Salt, B []byte
-       }))(obj)).B) = make([]byte, local233)
+       }))(obj)).B) = make([]byte, local224)
        {
                _, err := io.ReadFull(r, ((*(*(struct {
                        Salt, B []byte
@@ -14366,20 +13173,20 @@ func (obj *ToCltFormspecPrepend) serialize(w io.Writer) {
 }
 
 func (obj *ToCltFormspecPrepend) deserialize(r io.Reader) {
-       var local234 []uint8
-       var local235 uint16
+       var local225 []uint8
+       var local226 uint16
        {
-               p := &local235
+               p := &local226
                *p = read16(r)
        }
-       (local234) = make([]uint8, local235)
+       (local225) = make([]uint8, local226)
        {
-               _, err := io.ReadFull(r, (local234)[:])
+               _, err := io.ReadFull(r, (local225)[:])
                chk(err)
        }
        ((*(*(struct {
                Prepend string
-       }))(obj)).Prepend) = string(local234)
+       }))(obj)).Prepend) = string(local225)
 }
 
 func (obj *AOCmdProps) serialize(w io.Writer) {
@@ -14516,13 +13323,13 @@ func (obj *AOCmdArmorGroups) serialize(w io.Writer) {
                }))(obj)).Armor)))
                write16(w, uint16(x))
        }
-       for local236 := range (*(*(struct {
+       for local227 := range (*(*(struct {
                Armor []Group
        }))(obj)).Armor {
                if err := pcall(func() {
                        (((*(*(struct {
                                Armor []Group
-                       }))(obj)).Armor)[local236]).serialize(w)
+                       }))(obj)).Armor)[local227]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -14533,21 +13340,21 @@ func (obj *AOCmdArmorGroups) serialize(w io.Writer) {
 }
 
 func (obj *AOCmdArmorGroups) deserialize(r io.Reader) {
-       var local237 uint16
+       var local228 uint16
        {
-               p := &local237
+               p := &local228
                *p = read16(r)
        }
        ((*(*(struct {
                Armor []Group
-       }))(obj)).Armor) = make([]Group, local237)
-       for local238 := range (*(*(struct {
+       }))(obj)).Armor) = make([]Group, local228)
+       for local229 := range (*(*(struct {
                Armor []Group
        }))(obj)).Armor {
                if err := pcall(func() {
                        (((*(*(struct {
                                Armor []Group
-                       }))(obj)).Armor)[local238]).deserialize(r)
+                       }))(obj)).Armor)[local229]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -14618,21 +13425,21 @@ func (obj *AOCmdBonePos) serialize(w io.Writer) {
 }
 
 func (obj *AOCmdBonePos) deserialize(r io.Reader) {
-       var local239 []uint8
-       var local240 uint16
+       var local230 []uint8
+       var local231 uint16
        {
-               p := &local240
+               p := &local231
                *p = read16(r)
        }
-       (local239) = make([]uint8, local240)
+       (local230) = make([]uint8, local231)
        {
-               _, err := io.ReadFull(r, (local239)[:])
+               _, err := io.ReadFull(r, (local230)[:])
                chk(err)
        }
        ((*(*(struct {
                Bone string
                Pos  AOBonePos
-       }))(obj)).Bone) = string(local239)
+       }))(obj)).Bone) = string(local230)
        if err := pcall(func() {
                ((*(*(struct {
                        Bone string
@@ -14710,9 +13517,9 @@ func (obj *AOCmdSpawnInfant) serialize(w io.Writer) {
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
        }
        {
-               local241 := genericCAO
+               local232 := genericCAO
                if err := pcall(func() {
-                       (local241).serialize(w)
+                       (local232).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -14734,17 +13541,18 @@ func (obj *AOCmdSpawnInfant) deserialize(r io.Reader) {
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
        }
        {
-               var local242 aoType
+               var local233 aoType
+               local234 := genericCAO
                if err := pcall(func() {
-                       (local242).deserialize(r)
+                       (local233).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
                        }
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.aoType", err))
                }
-               if local242 != (101) {
-                       chk(fmt.Errorf("const %v: %v", 101, local242))
+               if local233 != local234 {
+                       chk(fmt.Errorf("const %v: %v", "genericCAO", local233))
                }
        }
 }
@@ -14785,7 +13593,7 @@ func (obj *NodeMeta) serialize(w io.Writer) {
                }))(obj)).Fields)))
                write32(w, uint32(x))
        }
-       for local243 := range (*(*(struct {
+       for local235 := range (*(*(struct {
                //mt:len32
                Fields []NodeMetaField
 
@@ -14797,7 +13605,7 @@ func (obj *NodeMeta) serialize(w io.Writer) {
                                Fields []NodeMetaField
 
                                Inv Inv
-                       }))(obj)).Fields)[local243]).serialize(w)
+                       }))(obj)).Fields)[local235]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -14814,9 +13622,9 @@ func (obj *NodeMeta) serialize(w io.Writer) {
 }
 
 func (obj *NodeMeta) deserialize(r io.Reader) {
-       var local244 uint32
+       var local236 uint32
        {
-               p := &local244
+               p := &local236
                *p = read32(r)
        }
        ((*(*(struct {
@@ -14824,8 +13632,8 @@ func (obj *NodeMeta) deserialize(r io.Reader) {
                Fields []NodeMetaField
 
                Inv Inv
-       }))(obj)).Fields) = make([]NodeMetaField, local244)
-       for local245 := range (*(*(struct {
+       }))(obj)).Fields) = make([]NodeMetaField, local236)
+       for local237 := range (*(*(struct {
                //mt:len32
                Fields []NodeMetaField
 
@@ -14837,7 +13645,7 @@ func (obj *NodeMeta) deserialize(r io.Reader) {
                                Fields []NodeMetaField
 
                                Inv Inv
-                       }))(obj)).Fields)[local245]).deserialize(r)
+                       }))(obj)).Fields)[local237]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -14948,15 +13756,15 @@ func (obj *MinimapMode) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.MinimapType", err))
        }
-       var local246 []uint8
-       var local247 uint16
+       var local238 []uint8
+       var local239 uint16
        {
-               p := &local247
+               p := &local239
                *p = read16(r)
        }
-       (local246) = make([]uint8, local247)
+       (local238) = make([]uint8, local239)
        {
-               _, err := io.ReadFull(r, (local246)[:])
+               _, err := io.ReadFull(r, (local238)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -14965,7 +13773,7 @@ func (obj *MinimapMode) deserialize(r io.Reader) {
                Size  uint16
                Texture
                Scale uint16
-       }))(obj)).Label) = string(local246)
+       }))(obj)).Label) = string(local238)
        {
                p := &(*(*(struct {
                        Type  MinimapType
@@ -15077,9 +13885,9 @@ func (obj *NodeDef) serialize(w io.Writer) {
                ow := w
                w := new(bytes.Buffer)
                {
-                       local248 := uint8(13)
+                       local240 := uint8(13)
                        {
-                               x := local248
+                               x := local240
                                write8(w, uint8(x))
                        }
                }
@@ -15411,7 +14219,7 @@ func (obj *NodeDef) serialize(w io.Writer) {
                        }))(obj)).Groups)))
                        write16(w, uint16(x))
                }
-               for local249 := range (*(*(struct {
+               for local241 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -15537,7 +14345,7 @@ func (obj *NodeDef) serialize(w io.Writer) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).Groups)[local249]).serialize(w)
+                               }))(obj)).Groups)[local241]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -16019,13 +14827,13 @@ func (obj *NodeDef) serialize(w io.Writer) {
                        write32(w, math.Float32bits(x))
                }
                {
-                       local250 := uint8(6)
+                       local242 := uint8(6)
                        {
-                               x := local250
+                               x := local242
                                write8(w, uint8(x))
                        }
                }
-               for local251 := range (*(*(struct {
+               for local243 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -16151,7 +14959,7 @@ func (obj *NodeDef) serialize(w io.Writer) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).Tiles)[local251]).serialize(w)
+                               }))(obj)).Tiles)[local243]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -16159,7 +14967,7 @@ func (obj *NodeDef) serialize(w io.Writer) {
                                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.TileDef", err))
                        }
                }
-               for local252 := range (*(*(struct {
+               for local244 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -16285,7 +15093,7 @@ func (obj *NodeDef) serialize(w io.Writer) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).OverlayTiles)[local252]).serialize(w)
+                               }))(obj)).OverlayTiles)[local244]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -16294,13 +15102,13 @@ func (obj *NodeDef) serialize(w io.Writer) {
                        }
                }
                {
-                       local253 := uint8(6)
+                       local245 := uint8(6)
                        {
-                               x := local253
+                               x := local245
                                write8(w, uint8(x))
                        }
                }
-               for local254 := range (*(*(struct {
+               for local246 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -16426,7 +15234,7 @@ func (obj *NodeDef) serialize(w io.Writer) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).SpecialTiles)[local254]).serialize(w)
+                               }))(obj)).SpecialTiles)[local246]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -16837,7 +15645,7 @@ func (obj *NodeDef) serialize(w io.Writer) {
                        }))(obj)).ConnectTo)))
                        write16(w, uint16(x))
                }
-               for local255 := range (*(*(struct {
+               for local247 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -16963,7 +15771,7 @@ func (obj *NodeDef) serialize(w io.Writer) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).ConnectTo)[local255]).serialize(w)
+                               }))(obj)).ConnectTo)[local247]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -19655,26 +18463,27 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        p := &n
                        *p = read16(r)
                }
-               r := &io.LimitedReader{r, int64(n)}
+               r := &io.LimitedReader{R: r, N: int64(n)}
                {
-                       var local256 uint8
+                       var local248 uint8
+                       local249 := uint8(13)
                        {
-                               p := &local256
+                               p := &local248
                                *p = read8(r)
                        }
-                       if local256 != (13) {
-                               chk(fmt.Errorf("const %v: %v", 13, local256))
+                       if local248 != local249 {
+                               chk(fmt.Errorf("const %v: %v", "uint8(13)", local248))
                        }
                }
-               var local257 []uint8
-               var local258 uint16
+               var local250 []uint8
+               var local251 uint16
                {
-                       p := &local258
+                       p := &local251
                        *p = read16(r)
                }
-               (local257) = make([]uint8, local258)
+               (local250) = make([]uint8, local251)
                {
-                       _, err := io.ReadFull(r, (local257)[:])
+                       _, err := io.ReadFull(r, (local250)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -19739,10 +18548,10 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        MaxLvl uint8
 
                        AlphaUse
-               }))(obj)).Name) = string(local257)
-               var local259 uint16
+               }))(obj)).Name) = string(local250)
+               var local252 uint16
                {
-                       p := &local259
+                       p := &local252
                        *p = read16(r)
                }
                ((*(*(struct {
@@ -19807,8 +18616,8 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        MaxLvl uint8
 
                        AlphaUse
-               }))(obj)).Groups) = make([]Group, local259)
-               for local260 := range (*(*(struct {
+               }))(obj)).Groups) = make([]Group, local252)
+               for local253 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -19934,7 +18743,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).Groups)[local260]).deserialize(r)
+                               }))(obj)).Groups)[local253]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -20152,15 +18961,15 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        }
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.DrawType", err))
                }
-               var local261 []uint8
-               var local262 uint16
+               var local254 []uint8
+               var local255 uint16
                {
-                       p := &local262
+                       p := &local255
                        *p = read16(r)
                }
-               (local261) = make([]uint8, local262)
+               (local254) = make([]uint8, local255)
                {
-                       _, err := io.ReadFull(r, (local261)[:])
+                       _, err := io.ReadFull(r, (local254)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -20225,7 +19034,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        MaxLvl uint8
 
                        AlphaUse
-               }))(obj)).Mesh) = string(local261)
+               }))(obj)).Mesh) = string(local254)
                {
                        p := &(*(*(struct {
                                Param0 Content
@@ -20293,16 +19102,17 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        *p = math.Float32frombits(read32(r))
                }
                {
-                       var local263 uint8
+                       var local256 uint8
+                       local257 := uint8(6)
                        {
-                               p := &local263
+                               p := &local256
                                *p = read8(r)
                        }
-                       if local263 != (6) {
-                               chk(fmt.Errorf("const %v: %v", 6, local263))
+                       if local256 != local257 {
+                               chk(fmt.Errorf("const %v: %v", "uint8(6)", local256))
                        }
                }
-               for local264 := range (*(*(struct {
+               for local258 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -20428,7 +19238,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).Tiles)[local264]).deserialize(r)
+                               }))(obj)).Tiles)[local258]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -20436,7 +19246,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.TileDef", err))
                        }
                }
-               for local265 := range (*(*(struct {
+               for local259 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -20562,7 +19372,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).OverlayTiles)[local265]).deserialize(r)
+                               }))(obj)).OverlayTiles)[local259]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -20571,16 +19381,17 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        }
                }
                {
-                       var local266 uint8
+                       var local260 uint8
+                       local261 := uint8(6)
                        {
-                               p := &local266
+                               p := &local260
                                *p = read8(r)
                        }
-                       if local266 != (6) {
-                               chk(fmt.Errorf("const %v: %v", 6, local266))
+                       if local260 != local261 {
+                               chk(fmt.Errorf("const %v: %v", "uint8(6)", local260))
                        }
                }
-               for local267 := range (*(*(struct {
+               for local262 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -20706,7 +19517,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).SpecialTiles)[local267]).deserialize(r)
+                               }))(obj)).SpecialTiles)[local262]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -20986,9 +19797,9 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        }))(obj)).ConnectSides
                        *p = read8(r)
                }
-               var local268 uint16
+               var local263 uint16
                {
-                       p := &local268
+                       p := &local263
                        *p = read16(r)
                }
                ((*(*(struct {
@@ -21053,8 +19864,8 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        MaxLvl uint8
 
                        AlphaUse
-               }))(obj)).ConnectTo) = make([]Content, local268)
-               for local269 := range (*(*(struct {
+               }))(obj)).ConnectTo) = make([]Content, local263)
+               for local264 := range (*(*(struct {
                        Param0 Content
 
                        Name   string
@@ -21180,7 +19991,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                                        MaxLvl uint8
 
                                        AlphaUse
-                               }))(obj)).ConnectTo)[local269]).deserialize(r)
+                               }))(obj)).ConnectTo)[local264]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -22179,15 +20990,15 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        }
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.LiquidType", err))
                }
-               var local270 []uint8
-               var local271 uint16
+               var local265 []uint8
+               var local266 uint16
                {
-                       p := &local271
+                       p := &local266
                        *p = read16(r)
                }
-               (local270) = make([]uint8, local271)
+               (local265) = make([]uint8, local266)
                {
-                       _, err := io.ReadFull(r, (local270)[:])
+                       _, err := io.ReadFull(r, (local265)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -22252,16 +21063,16 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        MaxLvl uint8
 
                        AlphaUse
-               }))(obj)).FlowingAlt) = string(local270)
-               var local272 []uint8
-               var local273 uint16
+               }))(obj)).FlowingAlt) = string(local265)
+               var local267 []uint8
+               var local268 uint16
                {
-                       p := &local273
+                       p := &local268
                        *p = read16(r)
                }
-               (local272) = make([]uint8, local273)
+               (local267) = make([]uint8, local268)
                {
-                       _, err := io.ReadFull(r, (local272)[:])
+                       _, err := io.ReadFull(r, (local267)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -22326,7 +21137,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        MaxLvl uint8
 
                        AlphaUse
-               }))(obj)).SrcAlt) = string(local272)
+               }))(obj)).SrcAlt) = string(local267)
                {
                        p := &(*(*(struct {
                                Param0 Content
@@ -23237,15 +22048,15 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                                chk(fmt.Errorf("invalid bool: %d", n))
                        }
                }
-               var local274 []uint8
-               var local275 uint16
+               var local269 []uint8
+               var local270 uint16
                {
-                       p := &local275
+                       p := &local270
                        *p = read16(r)
                }
-               (local274) = make([]uint8, local275)
+               (local269) = make([]uint8, local270)
                {
-                       _, err := io.ReadFull(r, (local274)[:])
+                       _, err := io.ReadFull(r, (local269)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -23310,7 +22121,7 @@ func (obj *NodeDef) deserialize(r io.Reader) {
                        MaxLvl uint8
 
                        AlphaUse
-               }))(obj)).DigPredict) = string(local274)
+               }))(obj)).DigPredict) = string(local269)
                {
                        p := &(*(*(struct {
                                Param0 Content
@@ -23454,46 +22265,46 @@ func (obj *NodeDef) deserialize(r io.Reader) {
 }
 
 func (obj *PointedNode) serialize(w io.Writer) {
-       for local276 := range (*(*(struct {
+       for local271 := range (*(*(struct {
                Under, Above [3]int16
        }))(obj)).Under {
                {
                        x := ((*(*(struct {
                                Under, Above [3]int16
-                       }))(obj)).Under)[local276]
+                       }))(obj)).Under)[local271]
                        write16(w, uint16(x))
                }
        }
-       for local277 := range (*(*(struct {
+       for local272 := range (*(*(struct {
                Under, Above [3]int16
        }))(obj)).Above {
                {
                        x := ((*(*(struct {
                                Under, Above [3]int16
-                       }))(obj)).Above)[local277]
+                       }))(obj)).Above)[local272]
                        write16(w, uint16(x))
                }
        }
 }
 
 func (obj *PointedNode) deserialize(r io.Reader) {
-       for local278 := range (*(*(struct {
+       for local273 := range (*(*(struct {
                Under, Above [3]int16
        }))(obj)).Under {
                {
                        p := &((*(*(struct {
                                Under, Above [3]int16
-                       }))(obj)).Under)[local278]
+                       }))(obj)).Under)[local273]
                        *p = int16(read16(r))
                }
        }
-       for local279 := range (*(*(struct {
+       for local274 := range (*(*(struct {
                Under, Above [3]int16
        }))(obj)).Above {
                {
                        p := &((*(*(struct {
                                Under, Above [3]int16
-                       }))(obj)).Above)[local279]
+                       }))(obj)).Above)[local274]
                        *p = int16(read16(r))
                }
        }
@@ -23540,7 +22351,7 @@ func (obj *CompressionModes) deserialize(r io.Reader) {
 }
 
 func (obj *PlayerPos) serialize(w io.Writer) {
-       for local280 := range (*(*(struct {
+       for local275 := range (*(*(struct {
                Pos100, Vel100   [3]int32
                Pitch100, Yaw100 int32
                Keys             Keys
@@ -23554,11 +22365,11 @@ func (obj *PlayerPos) serialize(w io.Writer) {
                                Keys             Keys
                                FOV80            uint8
                                WantedRange      uint8 // in MapBlks.
-                       }))(obj)).Pos100)[local280]
+                       }))(obj)).Pos100)[local275]
                        write32(w, uint32(x))
                }
        }
-       for local281 := range (*(*(struct {
+       for local276 := range (*(*(struct {
                Pos100, Vel100   [3]int32
                Pitch100, Yaw100 int32
                Keys             Keys
@@ -23572,7 +22383,7 @@ func (obj *PlayerPos) serialize(w io.Writer) {
                                Keys             Keys
                                FOV80            uint8
                                WantedRange      uint8 // in MapBlks.
-                       }))(obj)).Vel100)[local281]
+                       }))(obj)).Vel100)[local276]
                        write32(w, uint32(x))
                }
        }
@@ -23633,7 +22444,7 @@ func (obj *PlayerPos) serialize(w io.Writer) {
 }
 
 func (obj *PlayerPos) deserialize(r io.Reader) {
-       for local282 := range (*(*(struct {
+       for local277 := range (*(*(struct {
                Pos100, Vel100   [3]int32
                Pitch100, Yaw100 int32
                Keys             Keys
@@ -23647,11 +22458,11 @@ func (obj *PlayerPos) deserialize(r io.Reader) {
                                Keys             Keys
                                FOV80            uint8
                                WantedRange      uint8 // in MapBlks.
-                       }))(obj)).Pos100)[local282]
+                       }))(obj)).Pos100)[local277]
                        *p = int32(read32(r))
                }
        }
-       for local283 := range (*(*(struct {
+       for local278 := range (*(*(struct {
                Pos100, Vel100   [3]int32
                Pitch100, Yaw100 int32
                Keys             Keys
@@ -23665,7 +22476,7 @@ func (obj *PlayerPos) deserialize(r io.Reader) {
                                Keys             Keys
                                FOV80            uint8
                                WantedRange      uint8 // in MapBlks.
-                       }))(obj)).Vel100)[local283]
+                       }))(obj)).Vel100)[local278]
                        *p = int32(read32(r))
                }
        }
@@ -23809,15 +22620,15 @@ func (obj *Field) serialize(w io.Writer) {
 }
 
 func (obj *Field) deserialize(r io.Reader) {
-       var local284 []uint8
-       var local285 uint16
+       var local279 []uint8
+       var local280 uint16
        {
-               p := &local285
+               p := &local280
                *p = read16(r)
        }
-       (local284) = make([]uint8, local285)
+       (local279) = make([]uint8, local280)
        {
-               _, err := io.ReadFull(r, (local284)[:])
+               _, err := io.ReadFull(r, (local279)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -23825,16 +22636,16 @@ func (obj *Field) deserialize(r io.Reader) {
 
                //mt:len32
                Value string
-       }))(obj)).Name) = string(local284)
-       var local286 []uint8
-       var local287 uint32
+       }))(obj)).Name) = string(local279)
+       var local281 []uint8
+       var local282 uint32
        {
-               p := &local287
+               p := &local282
                *p = read32(r)
        }
-       (local286) = make([]uint8, local287)
+       (local281) = make([]uint8, local282)
        {
-               _, err := io.ReadFull(r, (local286)[:])
+               _, err := io.ReadFull(r, (local281)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -23842,7 +22653,7 @@ func (obj *Field) deserialize(r io.Reader) {
 
                //mt:len32
                Value string
-       }))(obj)).Value) = string(local286)
+       }))(obj)).Value) = string(local281)
 }
 
 func (obj *AuthMethods) serialize(w io.Writer) {
@@ -23881,14 +22692,14 @@ func (obj *Pos) deserialize(r io.Reader) {
        }
 }
 
-func (obj *DiscoReason) serialize(w io.Writer) {
+func (obj *KickReason) serialize(w io.Writer) {
        {
                x := *(*(uint8))(obj)
                write8(w, uint8(x))
        }
 }
 
-func (obj *DiscoReason) deserialize(r io.Reader) {
+func (obj *KickReason) deserialize(r io.Reader) {
        {
                p := &*(*(uint8))(obj)
                *p = read8(r)
@@ -23933,22 +22744,22 @@ func (obj *MapBlk) serialize(w io.Writer) {
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.LitFromBlks", err))
        }
        {
-               local288 := uint8(2) // Size of param0 in bytes.
+               local283 := uint8(2) // Size of param0 in bytes.
                {
-                       x := local288
+                       x := local283
                        write8(w, uint8(x))
                }
        }
        {
-               local289 := uint8(1 + 1) // Size of param1 and param2 combined, in bytes.
+               local284 := uint8(1 + 1) // Size of param1 and param2 combined, in bytes.
                {
-                       x := local289
+                       x := local284
                        write8(w, uint8(x))
                }
        }
        {
                w := zlib.NewWriter(w)
-               for local290 := range (*(*(struct {
+               for local285 := range (*(*(struct {
                        Flags   MapBlkFlags
                        LitFrom LitFromBlks
 
@@ -23970,7 +22781,7 @@ func (obj *MapBlk) serialize(w io.Writer) {
                                        Param2 [4096]uint8
 
                                        NodeMetas map[uint16]*NodeMeta
-                               }))(obj)).Param0)[local290]).serialize(w)
+                               }))(obj)).Param0)[local285]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -24026,9 +22837,7 @@ func (obj *MapBlk) serialize(w io.Writer) {
                                write8(w, 0)
                        } else {
                                write8(w, 2)
-                               if len(x) > math.MaxUint16 {
-                                       chk(ErrTooLong)
-                               }
+                               // len(map[uint16]...) always < math.MaxUint16
                                write16(w, uint16(len(x)))
                                keys := make([]uint16, 0, len(x))
                                for key := range x {
@@ -24058,9 +22867,9 @@ func (obj *MapBlk) serialize(w io.Writer) {
                }
        }
        {
-               local291 := uint8(2) // version
+               local286 := uint8(2) // version
                {
-                       x := local291
+                       x := local286
                        write8(w, uint8(x))
                }
        }
@@ -24104,29 +22913,31 @@ func (obj *MapBlk) deserialize(r io.Reader) {
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.LitFromBlks", err))
        }
        {
-               var local292 uint8
+               var local287 uint8
+               local288 := uint8(2) // Size of param0 in bytes.
                {
-                       p := &local292
+                       p := &local287
                        *p = read8(r)
                }
-               if local292 != (2) {
-                       chk(fmt.Errorf("const %v: %v", 2, local292))
+               if local287 != local288 {
+                       chk(fmt.Errorf("const %v: %v", "uint8(2)     // Size of param0 in bytes.", local287))
                }
        }
        {
-               var local293 uint8
+               var local289 uint8
+               local290 := uint8(1 + 1) // Size of param1 and param2 combined, in bytes.
                {
-                       p := &local293
+                       p := &local289
                        *p = read8(r)
                }
-               if local293 != (2) {
-                       chk(fmt.Errorf("const %v: %v", 2, local293))
+               if local289 != local290 {
+                       chk(fmt.Errorf("const %v: %v", "uint8(1 + 1) // Size of param1 and param2 combined, in bytes.", local289))
                }
        }
        {
                r, err := zlib.NewReader(byteReader{r})
                chk(err)
-               for local294 := range (*(*(struct {
+               for local291 := range (*(*(struct {
                        Flags   MapBlkFlags
                        LitFrom LitFromBlks
 
@@ -24148,7 +22959,7 @@ func (obj *MapBlk) deserialize(r io.Reader) {
                                        Param2 [4096]uint8
 
                                        NodeMetas map[uint16]*NodeMeta
-                               }))(obj)).Param0)[local294]).deserialize(r)
+                               }))(obj)).Param0)[local291]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -24220,13 +23031,14 @@ func (obj *MapBlk) deserialize(r io.Reader) {
                }
        }
        {
-               var local295 uint8
+               var local292 uint8
+               local293 := uint8(2) // version
                {
-                       p := &local295
+                       p := &local292
                        *p = read8(r)
                }
-               if local295 != (2) {
-                       chk(fmt.Errorf("const %v: %v", 2, local295))
+               if local292 != local293 {
+                       chk(fmt.Errorf("const %v: %v", "uint8(2) // version", local292))
                }
        }
 }
@@ -24302,18 +23114,18 @@ func (obj *CSMRestrictionFlags) deserialize(r io.Reader) {
 }
 
 func (obj *Vec) serialize(w io.Writer) {
-       for local296 := range *(*([3]float32))(obj) {
+       for local294 := range *(*([3]float32))(obj) {
                {
-                       x := (*(*([3]float32))(obj))[local296]
+                       x := (*(*([3]float32))(obj))[local294]
                        write32(w, math.Float32bits(x))
                }
        }
 }
 
 func (obj *Vec) deserialize(r io.Reader) {
-       for local297 := range *(*([3]float32))(obj) {
+       for local295 := range *(*([3]float32))(obj) {
                {
-                       p := &(*(*([3]float32))(obj))[local297]
+                       p := &(*(*([3]float32))(obj))[local295]
                        *p = math.Float32frombits(read32(r))
                }
        }
@@ -24347,123 +23159,13 @@ func (obj *AOID) deserialize(r io.Reader) {
        }
 }
 
-func (obj *aoType) serialize(w io.Writer) {
-       {
-               x := *(*(uint8))(obj)
-               write8(w, uint8(x))
-       }
-}
-
-func (obj *aoType) deserialize(r io.Reader) {
-       {
-               p := &*(*(uint8))(obj)
-               *p = read8(r)
-       }
-}
-
-func (obj *AOInitData) serialize(w io.Writer) {
-       {
-               local298 := uint8(1)
-               {
-                       x := local298
-                       write8(w, uint8(x))
-               }
-       }
-       if len(([]byte((*(*(struct {
-
-               // For players.
-               Name     string
-               IsPlayer bool
-
-               ID AOID
-
-               Pos
-               Rot [3]float32
-
-               HP uint16
-
-               // See (de)serialize.fmt.
-               Msgs []AOMsg
-       }))(obj)).Name))) > math.MaxUint16 {
-               chk(ErrTooLong)
-       }
-       {
-               x := uint16(len(([]byte((*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).Name))))
-               write16(w, uint16(x))
-       }
-       {
-               _, err := w.Write(([]byte((*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).Name))[:])
-               chk(err)
-       }
-       {
-               x := (*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).IsPlayer
-               if x {
-                       write8(w, 1)
-               } else {
-                       write8(w, 0)
-               }
-       }
+func (obj *AOAdd) serialize(w io.Writer) {
        if err := pcall(func() {
                ((*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
                        ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
+                       //mt:const genericCAO
+                       //mt:lenhdr 32
+                       InitData AOInitData
                }))(obj)).ID).serialize(w)
        }); err != nil {
                if err == io.EOF {
@@ -24471,200 +23173,58 @@ func (obj *AOInitData) serialize(w io.Writer) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
        }
-       if err := pcall(func() {
-               ((*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).Pos).serialize(w)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
+       {
+               local296 := genericCAO
+               if err := pcall(func() {
+                       (local296).serialize(w)
+               }); err != nil {
+                       if err == io.EOF {
+                               chk(io.EOF)
+                       }
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.aoType", err))
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Pos", err))
        }
-       for local299 := range (*(*(struct {
-
-               // For players.
-               Name     string
-               IsPlayer bool
-
-               ID AOID
-
-               Pos
-               Rot [3]float32
-
-               HP uint16
-
-               // See (de)serialize.fmt.
-               Msgs []AOMsg
-       }))(obj)).Rot {
-               {
-                       x := ((*(*(struct {
-
-                               // For players.
-                               Name     string
-                               IsPlayer bool
-
+       {
+               ow := w
+               w := new(bytes.Buffer)
+               if err := pcall(func() {
+                       ((*(*(struct {
                                ID AOID
-
-                               Pos
-                               Rot [3]float32
-
-                               HP uint16
-
-                               // See (de)serialize.fmt.
-                               Msgs []AOMsg
-                       }))(obj)).Rot)[local299]
-                       write32(w, math.Float32bits(x))
+                               //mt:const genericCAO
+                               //mt:lenhdr 32
+                               InitData AOInitData
+                       }))(obj)).InitData).serialize(w)
+               }); err != nil {
+                       if err == io.EOF {
+                               chk(io.EOF)
+                       }
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOInitData", err))
                }
-       }
-       {
-               x := (*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).HP
-               write16(w, uint16(x))
-       }
-       {
-               x := (*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).Msgs
-               { // For AOInitData.Msgs.
-                       if len(x) > math.MaxUint8 {
+               {
+                       buf := w
+                       w := ow
+                       if len((buf.Bytes())) > math.MaxUint32 {
                                chk(ErrTooLong)
                        }
-                       write8(w, uint8(len(x)))
-                       for _, msg := range x {
-                               var b bytes.Buffer
-                               chk(writeAOMsg(&b, msg))
-                               if b.Len() > math.MaxUint32 {
-                                       chk(ErrTooLong)
-                               }
-                               write32(w, uint32(b.Len()))
-                               _, err := b.WriteTo(w)
+                       {
+                               x := uint32(len((buf.Bytes())))
+                               write32(w, uint32(x))
+                       }
+                       {
+                               _, err := w.Write((buf.Bytes())[:])
                                chk(err)
                        }
                }
        }
 }
 
-func (obj *AOInitData) deserialize(r io.Reader) {
-       {
-               var local300 uint8
-               {
-                       p := &local300
-                       *p = read8(r)
-               }
-               if local300 != (1) {
-                       chk(fmt.Errorf("const %v: %v", 1, local300))
-               }
-       }
-       var local301 []uint8
-       var local302 uint16
-       {
-               p := &local302
-               *p = read16(r)
-       }
-       (local301) = make([]uint8, local302)
-       {
-               _, err := io.ReadFull(r, (local301)[:])
-               chk(err)
-       }
-       ((*(*(struct {
-
-               // For players.
-               Name     string
-               IsPlayer bool
-
-               ID AOID
-
-               Pos
-               Rot [3]float32
-
-               HP uint16
-
-               // See (de)serialize.fmt.
-               Msgs []AOMsg
-       }))(obj)).Name) = string(local301)
-       {
-               p := &(*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).IsPlayer
-               switch n := read8(r); n {
-               case 0:
-                       *p = false
-               case 1:
-                       *p = true
-               default:
-                       chk(fmt.Errorf("invalid bool: %d", n))
-               }
-       }
+func (obj *AOAdd) deserialize(r io.Reader) {
        if err := pcall(func() {
                ((*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
                        ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
+                       //mt:const genericCAO
+                       //mt:lenhdr 32
+                       InitData AOInitData
                }))(obj)).ID).deserialize(r)
        }); err != nil {
                if err == io.EOF {
@@ -24672,112 +23232,43 @@ func (obj *AOInitData) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
        }
-       if err := pcall(func() {
-               ((*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).Pos).deserialize(r)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
+       {
+               var local297 aoType
+               local298 := genericCAO
+               if err := pcall(func() {
+                       (local297).deserialize(r)
+               }); err != nil {
+                       if err == io.EOF {
+                               chk(io.EOF)
+                       }
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.aoType", err))
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Pos", err))
-       }
-       for local303 := range (*(*(struct {
-
-               // For players.
-               Name     string
-               IsPlayer bool
-
-               ID AOID
-
-               Pos
-               Rot [3]float32
-
-               HP uint16
-
-               // See (de)serialize.fmt.
-               Msgs []AOMsg
-       }))(obj)).Rot {
-               {
-                       p := &((*(*(struct {
-
-                               // For players.
-                               Name     string
-                               IsPlayer bool
-
-                               ID AOID
-
-                               Pos
-                               Rot [3]float32
-
-                               HP uint16
-
-                               // See (de)serialize.fmt.
-                               Msgs []AOMsg
-                       }))(obj)).Rot)[local303]
-                       *p = math.Float32frombits(read32(r))
+               if local297 != local298 {
+                       chk(fmt.Errorf("const %v: %v", "genericCAO", local297))
                }
        }
        {
-               p := &(*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).HP
-               *p = read16(r)
-       }
-       {
-               p := &(*(*(struct {
-
-                       // For players.
-                       Name     string
-                       IsPlayer bool
-
-                       ID AOID
-
-                       Pos
-                       Rot [3]float32
-
-                       HP uint16
-
-                       // See (de)serialize.fmt.
-                       Msgs []AOMsg
-               }))(obj)).Msgs
-               { // For AOInitData.Msgs.
-                       *p = make([]AOMsg, read8(r))
-                       for i := range *p {
-                               r := &io.LimitedReader{r, int64(read32(r))}
-                               msg, err := readAOMsg(r)
-                               chk(err)
-                               (*p)[i] = msg
-                               if r.N > 0 {
-                                       chk(fmt.Errorf("%d bytes of trailing data", r.N))
-                               }
+               var n uint32
+               {
+                       p := &n
+                       *p = read32(r)
+               }
+               r := &io.LimitedReader{R: r, N: int64(n)}
+               if err := pcall(func() {
+                       ((*(*(struct {
+                               ID AOID
+                               //mt:const genericCAO
+                               //mt:lenhdr 32
+                               InitData AOInitData
+                       }))(obj)).InitData).deserialize(r)
+               }); err != nil {
+                       if err == io.EOF {
+                               chk(io.EOF)
                        }
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOInitData", err))
+               }
+               if r.N > 0 {
+                       chk(fmt.Errorf("%d bytes of trailing data", r.N))
                }
        }
 }
@@ -24843,7 +23334,7 @@ func (obj *IDAOMsg) deserialize(r io.Reader) {
                        p := &n
                        *p = read16(r)
                }
-               r := &io.LimitedReader{r, int64(n)}
+               r := &io.LimitedReader{R: r, N: int64(n)}
                {
                        p := &(*(*(struct {
                                ID AOID
@@ -24867,9 +23358,9 @@ func (obj *ItemDef) serialize(w io.Writer) {
                ow := w
                w := new(bytes.Buffer)
                {
-                       local304 := uint8(6)
+                       local299 := uint8(6)
                        {
-                               x := local304
+                               x := local299
                                write8(w, uint8(x))
                        }
                }
@@ -24906,8 +23397,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Type).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -24947,8 +23436,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
                }))(obj)).Name))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
@@ -24985,8 +23472,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Name))))
                        write16(w, uint16(x))
                }
@@ -25023,8 +23508,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Name))[:])
                        chk(err)
                }
@@ -25060,8 +23543,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
                }))(obj)).Desc))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
@@ -25098,8 +23579,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Desc))))
                        write16(w, uint16(x))
                }
@@ -25136,8 +23615,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Desc))[:])
                        chk(err)
                }
@@ -25174,8 +23651,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).InvImg).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -25216,8 +23691,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).WieldImg).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -25225,7 +23698,7 @@ func (obj *ItemDef) serialize(w io.Writer) {
                        }
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Texture", err))
                }
-               for local305 := range (*(*(struct {
+               for local300 := range (*(*(struct {
                        Type ItemType
 
                        Name, Desc string
@@ -25257,8 +23730,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
                }))(obj)).WieldScale {
                        {
                                x := ((*(*(struct {
@@ -25293,9 +23764,7 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                        InvOverlay, WieldOverlay Texture
 
                                        ShortDesc string
-
-                                       PlaceParam2 byte
-                               }))(obj)).WieldScale)[local305]
+                               }))(obj)).WieldScale)[local300]
                                write32(w, math.Float32bits(x))
                        }
                }
@@ -25332,8 +23801,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).StackMax
                        write16(w, uint16(x))
                }
@@ -25370,8 +23837,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Usable
                        if x {
                                write8(w, 1)
@@ -25412,8 +23877,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).CanPointLiquids
                        if x {
                                write8(w, 1)
@@ -25454,8 +23917,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).ToolCaps).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -25495,8 +23956,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
                }))(obj)).Groups)) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
@@ -25533,12 +23992,10 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Groups)))
                        write16(w, uint16(x))
                }
-               for local306 := range (*(*(struct {
+               for local301 := range (*(*(struct {
                        Type ItemType
 
                        Name, Desc string
@@ -25570,8 +24027,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
                }))(obj)).Groups {
                        if err := pcall(func() {
                                (((*(*(struct {
@@ -25606,9 +24061,7 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                        InvOverlay, WieldOverlay Texture
 
                                        ShortDesc string
-
-                                       PlaceParam2 byte
-                               }))(obj)).Groups)[local306]).serialize(w)
+                               }))(obj)).Groups)[local301]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -25648,8 +24101,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
                }))(obj)).PlacePredict))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
@@ -25686,8 +24137,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).PlacePredict))))
                        write16(w, uint16(x))
                }
@@ -25724,8 +24173,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).PlacePredict))[:])
                        chk(err)
                }
@@ -25762,8 +24209,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).PlaceSnd).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -25804,8 +24249,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).PlaceFailSnd).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -25846,8 +24289,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).PointRange
                        write32(w, math.Float32bits(x))
                }
@@ -25884,8 +24325,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Palette).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -25926,8 +24365,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Color
                        w.Write([]byte{x.A, x.R, x.G, x.B})
                }
@@ -25964,8 +24401,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).InvOverlay).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -26006,8 +24441,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).WieldOverlay).serialize(w)
                }); err != nil {
                        if err == io.EOF {
@@ -26047,8 +24480,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
                }))(obj)).ShortDesc))) > math.MaxUint16 {
                        chk(ErrTooLong)
                }
@@ -26085,8 +24516,6 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).ShortDesc))))
                        write16(w, uint16(x))
                }
@@ -26123,13 +24552,48 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).ShortDesc))[:])
                        chk(err)
                }
                {
-                       x := (*(*(struct {
+                       buf := w
+                       w := ow
+                       if len((buf.Bytes())) > math.MaxUint16 {
+                               chk(ErrTooLong)
+                       }
+                       {
+                               x := uint16(len((buf.Bytes())))
+                               write16(w, uint16(x))
+                       }
+                       {
+                               _, err := w.Write((buf.Bytes())[:])
+                               chk(err)
+                       }
+               }
+       }
+}
+
+func (obj *ItemDef) deserialize(r io.Reader) {
+       {
+               var n uint16
+               {
+                       p := &n
+                       *p = read16(r)
+               }
+               r := &io.LimitedReader{R: r, N: int64(n)}
+               {
+                       var local302 uint8
+                       local303 := uint8(6)
+                       {
+                               p := &local302
+                               *p = read8(r)
+                       }
+                       if local302 != local303 {
+                               chk(fmt.Errorf("const %v: %v", "uint8(6)", local302))
+                       }
+               }
+               if err := pcall(func() {
+                       ((*(*(struct {
                                Type ItemType
 
                                Name, Desc string
@@ -26161,49 +24625,332 @@ func (obj *ItemDef) serialize(w io.Writer) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
+                       }))(obj)).Type).deserialize(r)
+               }); err != nil {
+                       if err == io.EOF {
+                               chk(io.EOF)
+                       }
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ItemType", err))
+               }
+               var local304 []uint8
+               var local305 uint16
+               {
+                       p := &local305
+                       *p = read16(r)
+               }
+               (local304) = make([]uint8, local305)
+               {
+                       _, err := io.ReadFull(r, (local304)[:])
+                       chk(err)
+               }
+               ((*(*(struct {
+                       Type ItemType
 
-                               PlaceParam2 byte
-                       }))(obj)).PlaceParam2
-                       write8(w, uint8(x))
+                       Name, Desc string
+
+                       InvImg, WieldImg Texture
+                       WieldScale       [3]float32
+
+                       StackMax uint16
+
+                       Usable          bool
+                       CanPointLiquids bool
+
+                       ToolCaps ToolCaps
+
+                       Groups []Group
+
+                       PlacePredict string
+
+                       PlaceSnd, PlaceFailSnd SoundDef
+
+                       PointRange float32
+
+                       // Set index in Palette with "palette_index" item meta field,
+                       // this overrides Color.
+                       Palette Texture
+                       Color   color.NRGBA
+
+                       // Texture overlays.
+                       InvOverlay, WieldOverlay Texture
+
+                       ShortDesc string
+               }))(obj)).Name) = string(local304)
+               var local306 []uint8
+               var local307 uint16
+               {
+                       p := &local307
+                       *p = read16(r)
                }
+               (local306) = make([]uint8, local307)
                {
-                       buf := w
-                       w := ow
-                       if len((buf.Bytes())) > math.MaxUint16 {
-                               chk(ErrTooLong)
+                       _, err := io.ReadFull(r, (local306)[:])
+                       chk(err)
+               }
+               ((*(*(struct {
+                       Type ItemType
+
+                       Name, Desc string
+
+                       InvImg, WieldImg Texture
+                       WieldScale       [3]float32
+
+                       StackMax uint16
+
+                       Usable          bool
+                       CanPointLiquids bool
+
+                       ToolCaps ToolCaps
+
+                       Groups []Group
+
+                       PlacePredict string
+
+                       PlaceSnd, PlaceFailSnd SoundDef
+
+                       PointRange float32
+
+                       // Set index in Palette with "palette_index" item meta field,
+                       // this overrides Color.
+                       Palette Texture
+                       Color   color.NRGBA
+
+                       // Texture overlays.
+                       InvOverlay, WieldOverlay Texture
+
+                       ShortDesc string
+               }))(obj)).Desc) = string(local306)
+               if err := pcall(func() {
+                       ((*(*(struct {
+                               Type ItemType
+
+                               Name, Desc string
+
+                               InvImg, WieldImg Texture
+                               WieldScale       [3]float32
+
+                               StackMax uint16
+
+                               Usable          bool
+                               CanPointLiquids bool
+
+                               ToolCaps ToolCaps
+
+                               Groups []Group
+
+                               PlacePredict string
+
+                               PlaceSnd, PlaceFailSnd SoundDef
+
+                               PointRange float32
+
+                               // Set index in Palette with "palette_index" item meta field,
+                               // this overrides Color.
+                               Palette Texture
+                               Color   color.NRGBA
+
+                               // Texture overlays.
+                               InvOverlay, WieldOverlay Texture
+
+                               ShortDesc string
+                       }))(obj)).InvImg).deserialize(r)
+               }); err != nil {
+                       if err == io.EOF {
+                               chk(io.EOF)
                        }
-                       {
-                               x := uint16(len((buf.Bytes())))
-                               write16(w, uint16(x))
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Texture", err))
+               }
+               if err := pcall(func() {
+                       ((*(*(struct {
+                               Type ItemType
+
+                               Name, Desc string
+
+                               InvImg, WieldImg Texture
+                               WieldScale       [3]float32
+
+                               StackMax uint16
+
+                               Usable          bool
+                               CanPointLiquids bool
+
+                               ToolCaps ToolCaps
+
+                               Groups []Group
+
+                               PlacePredict string
+
+                               PlaceSnd, PlaceFailSnd SoundDef
+
+                               PointRange float32
+
+                               // Set index in Palette with "palette_index" item meta field,
+                               // this overrides Color.
+                               Palette Texture
+                               Color   color.NRGBA
+
+                               // Texture overlays.
+                               InvOverlay, WieldOverlay Texture
+
+                               ShortDesc string
+                       }))(obj)).WieldImg).deserialize(r)
+               }); err != nil {
+                       if err == io.EOF {
+                               chk(io.EOF)
                        }
+                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Texture", err))
+               }
+               for local308 := range (*(*(struct {
+                       Type ItemType
+
+                       Name, Desc string
+
+                       InvImg, WieldImg Texture
+                       WieldScale       [3]float32
+
+                       StackMax uint16
+
+                       Usable          bool
+                       CanPointLiquids bool
+
+                       ToolCaps ToolCaps
+
+                       Groups []Group
+
+                       PlacePredict string
+
+                       PlaceSnd, PlaceFailSnd SoundDef
+
+                       PointRange float32
+
+                       // Set index in Palette with "palette_index" item meta field,
+                       // this overrides Color.
+                       Palette Texture
+                       Color   color.NRGBA
+
+                       // Texture overlays.
+                       InvOverlay, WieldOverlay Texture
+
+                       ShortDesc string
+               }))(obj)).WieldScale {
                        {
-                               _, err := w.Write((buf.Bytes())[:])
-                               chk(err)
+                               p := &((*(*(struct {
+                                       Type ItemType
+
+                                       Name, Desc string
+
+                                       InvImg, WieldImg Texture
+                                       WieldScale       [3]float32
+
+                                       StackMax uint16
+
+                                       Usable          bool
+                                       CanPointLiquids bool
+
+                                       ToolCaps ToolCaps
+
+                                       Groups []Group
+
+                                       PlacePredict string
+
+                                       PlaceSnd, PlaceFailSnd SoundDef
+
+                                       PointRange float32
+
+                                       // Set index in Palette with "palette_index" item meta field,
+                                       // this overrides Color.
+                                       Palette Texture
+                                       Color   color.NRGBA
+
+                                       // Texture overlays.
+                                       InvOverlay, WieldOverlay Texture
+
+                                       ShortDesc string
+                               }))(obj)).WieldScale)[local308]
+                               *p = math.Float32frombits(read32(r))
                        }
                }
-       }
-}
-
-func (obj *ItemDef) deserialize(r io.Reader) {
-       {
-               var n uint16
                {
-                       p := &n
+                       p := &(*(*(struct {
+                               Type ItemType
+
+                               Name, Desc string
+
+                               InvImg, WieldImg Texture
+                               WieldScale       [3]float32
+
+                               StackMax uint16
+
+                               Usable          bool
+                               CanPointLiquids bool
+
+                               ToolCaps ToolCaps
+
+                               Groups []Group
+
+                               PlacePredict string
+
+                               PlaceSnd, PlaceFailSnd SoundDef
+
+                               PointRange float32
+
+                               // Set index in Palette with "palette_index" item meta field,
+                               // this overrides Color.
+                               Palette Texture
+                               Color   color.NRGBA
+
+                               // Texture overlays.
+                               InvOverlay, WieldOverlay Texture
+
+                               ShortDesc string
+                       }))(obj)).StackMax
                        *p = read16(r)
                }
-               r := &io.LimitedReader{r, int64(n)}
                {
-                       var local307 uint8
-                       {
-                               p := &local307
-                               *p = read8(r)
-                       }
-                       if local307 != (6) {
-                               chk(fmt.Errorf("const %v: %v", 6, local307))
+                       p := &(*(*(struct {
+                               Type ItemType
+
+                               Name, Desc string
+
+                               InvImg, WieldImg Texture
+                               WieldScale       [3]float32
+
+                               StackMax uint16
+
+                               Usable          bool
+                               CanPointLiquids bool
+
+                               ToolCaps ToolCaps
+
+                               Groups []Group
+
+                               PlacePredict string
+
+                               PlaceSnd, PlaceFailSnd SoundDef
+
+                               PointRange float32
+
+                               // Set index in Palette with "palette_index" item meta field,
+                               // this overrides Color.
+                               Palette Texture
+                               Color   color.NRGBA
+
+                               // Texture overlays.
+                               InvOverlay, WieldOverlay Texture
+
+                               ShortDesc string
+                       }))(obj)).Usable
+                       switch n := read8(r); n {
+                       case 0:
+                               *p = false
+                       case 1:
+                               *p = true
+                       default:
+                               chk(fmt.Errorf("invalid bool: %d", n))
                        }
                }
-               if err := pcall(func() {
-                       ((*(*(struct {
+               {
+                       p := &(*(*(struct {
                                Type ItemType
 
                                Name, Desc string
@@ -26235,383 +24982,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
-                       }))(obj)).Type).deserialize(r)
-               }); err != nil {
-                       if err == io.EOF {
-                               chk(io.EOF)
-                       }
-                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ItemType", err))
-               }
-               var local308 []uint8
-               var local309 uint16
-               {
-                       p := &local309
-                       *p = read16(r)
-               }
-               (local308) = make([]uint8, local309)
-               {
-                       _, err := io.ReadFull(r, (local308)[:])
-                       chk(err)
-               }
-               ((*(*(struct {
-                       Type ItemType
-
-                       Name, Desc string
-
-                       InvImg, WieldImg Texture
-                       WieldScale       [3]float32
-
-                       StackMax uint16
-
-                       Usable          bool
-                       CanPointLiquids bool
-
-                       ToolCaps ToolCaps
-
-                       Groups []Group
-
-                       PlacePredict string
-
-                       PlaceSnd, PlaceFailSnd SoundDef
-
-                       PointRange float32
-
-                       // Set index in Palette with "palette_index" item meta field,
-                       // this overrides Color.
-                       Palette Texture
-                       Color   color.NRGBA
-
-                       // Texture overlays.
-                       InvOverlay, WieldOverlay Texture
-
-                       ShortDesc string
-
-                       PlaceParam2 byte
-               }))(obj)).Name) = string(local308)
-               var local310 []uint8
-               var local311 uint16
-               {
-                       p := &local311
-                       *p = read16(r)
-               }
-               (local310) = make([]uint8, local311)
-               {
-                       _, err := io.ReadFull(r, (local310)[:])
-                       chk(err)
-               }
-               ((*(*(struct {
-                       Type ItemType
-
-                       Name, Desc string
-
-                       InvImg, WieldImg Texture
-                       WieldScale       [3]float32
-
-                       StackMax uint16
-
-                       Usable          bool
-                       CanPointLiquids bool
-
-                       ToolCaps ToolCaps
-
-                       Groups []Group
-
-                       PlacePredict string
-
-                       PlaceSnd, PlaceFailSnd SoundDef
-
-                       PointRange float32
-
-                       // Set index in Palette with "palette_index" item meta field,
-                       // this overrides Color.
-                       Palette Texture
-                       Color   color.NRGBA
-
-                       // Texture overlays.
-                       InvOverlay, WieldOverlay Texture
-
-                       ShortDesc string
-
-                       PlaceParam2 byte
-               }))(obj)).Desc) = string(local310)
-               if err := pcall(func() {
-                       ((*(*(struct {
-                               Type ItemType
-
-                               Name, Desc string
-
-                               InvImg, WieldImg Texture
-                               WieldScale       [3]float32
-
-                               StackMax uint16
-
-                               Usable          bool
-                               CanPointLiquids bool
-
-                               ToolCaps ToolCaps
-
-                               Groups []Group
-
-                               PlacePredict string
-
-                               PlaceSnd, PlaceFailSnd SoundDef
-
-                               PointRange float32
-
-                               // Set index in Palette with "palette_index" item meta field,
-                               // this overrides Color.
-                               Palette Texture
-                               Color   color.NRGBA
-
-                               // Texture overlays.
-                               InvOverlay, WieldOverlay Texture
-
-                               ShortDesc string
-
-                               PlaceParam2 byte
-                       }))(obj)).InvImg).deserialize(r)
-               }); err != nil {
-                       if err == io.EOF {
-                               chk(io.EOF)
-                       }
-                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Texture", err))
-               }
-               if err := pcall(func() {
-                       ((*(*(struct {
-                               Type ItemType
-
-                               Name, Desc string
-
-                               InvImg, WieldImg Texture
-                               WieldScale       [3]float32
-
-                               StackMax uint16
-
-                               Usable          bool
-                               CanPointLiquids bool
-
-                               ToolCaps ToolCaps
-
-                               Groups []Group
-
-                               PlacePredict string
-
-                               PlaceSnd, PlaceFailSnd SoundDef
-
-                               PointRange float32
-
-                               // Set index in Palette with "palette_index" item meta field,
-                               // this overrides Color.
-                               Palette Texture
-                               Color   color.NRGBA
-
-                               // Texture overlays.
-                               InvOverlay, WieldOverlay Texture
-
-                               ShortDesc string
-
-                               PlaceParam2 byte
-                       }))(obj)).WieldImg).deserialize(r)
-               }); err != nil {
-                       if err == io.EOF {
-                               chk(io.EOF)
-                       }
-                       chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Texture", err))
-               }
-               for local312 := range (*(*(struct {
-                       Type ItemType
-
-                       Name, Desc string
-
-                       InvImg, WieldImg Texture
-                       WieldScale       [3]float32
-
-                       StackMax uint16
-
-                       Usable          bool
-                       CanPointLiquids bool
-
-                       ToolCaps ToolCaps
-
-                       Groups []Group
-
-                       PlacePredict string
-
-                       PlaceSnd, PlaceFailSnd SoundDef
-
-                       PointRange float32
-
-                       // Set index in Palette with "palette_index" item meta field,
-                       // this overrides Color.
-                       Palette Texture
-                       Color   color.NRGBA
-
-                       // Texture overlays.
-                       InvOverlay, WieldOverlay Texture
-
-                       ShortDesc string
-
-                       PlaceParam2 byte
-               }))(obj)).WieldScale {
-                       {
-                               p := &((*(*(struct {
-                                       Type ItemType
-
-                                       Name, Desc string
-
-                                       InvImg, WieldImg Texture
-                                       WieldScale       [3]float32
-
-                                       StackMax uint16
-
-                                       Usable          bool
-                                       CanPointLiquids bool
-
-                                       ToolCaps ToolCaps
-
-                                       Groups []Group
-
-                                       PlacePredict string
-
-                                       PlaceSnd, PlaceFailSnd SoundDef
-
-                                       PointRange float32
-
-                                       // Set index in Palette with "palette_index" item meta field,
-                                       // this overrides Color.
-                                       Palette Texture
-                                       Color   color.NRGBA
-
-                                       // Texture overlays.
-                                       InvOverlay, WieldOverlay Texture
-
-                                       ShortDesc string
-
-                                       PlaceParam2 byte
-                               }))(obj)).WieldScale)[local312]
-                               *p = math.Float32frombits(read32(r))
-                       }
-               }
-               {
-                       p := &(*(*(struct {
-                               Type ItemType
-
-                               Name, Desc string
-
-                               InvImg, WieldImg Texture
-                               WieldScale       [3]float32
-
-                               StackMax uint16
-
-                               Usable          bool
-                               CanPointLiquids bool
-
-                               ToolCaps ToolCaps
-
-                               Groups []Group
-
-                               PlacePredict string
-
-                               PlaceSnd, PlaceFailSnd SoundDef
-
-                               PointRange float32
-
-                               // Set index in Palette with "palette_index" item meta field,
-                               // this overrides Color.
-                               Palette Texture
-                               Color   color.NRGBA
-
-                               // Texture overlays.
-                               InvOverlay, WieldOverlay Texture
-
-                               ShortDesc string
-
-                               PlaceParam2 byte
-                       }))(obj)).StackMax
-                       *p = read16(r)
-               }
-               {
-                       p := &(*(*(struct {
-                               Type ItemType
-
-                               Name, Desc string
-
-                               InvImg, WieldImg Texture
-                               WieldScale       [3]float32
-
-                               StackMax uint16
-
-                               Usable          bool
-                               CanPointLiquids bool
-
-                               ToolCaps ToolCaps
-
-                               Groups []Group
-
-                               PlacePredict string
-
-                               PlaceSnd, PlaceFailSnd SoundDef
-
-                               PointRange float32
-
-                               // Set index in Palette with "palette_index" item meta field,
-                               // this overrides Color.
-                               Palette Texture
-                               Color   color.NRGBA
-
-                               // Texture overlays.
-                               InvOverlay, WieldOverlay Texture
-
-                               ShortDesc string
-
-                               PlaceParam2 byte
-                       }))(obj)).Usable
-                       switch n := read8(r); n {
-                       case 0:
-                               *p = false
-                       case 1:
-                               *p = true
-                       default:
-                               chk(fmt.Errorf("invalid bool: %d", n))
-                       }
-               }
-               {
-                       p := &(*(*(struct {
-                               Type ItemType
-
-                               Name, Desc string
-
-                               InvImg, WieldImg Texture
-                               WieldScale       [3]float32
-
-                               StackMax uint16
-
-                               Usable          bool
-                               CanPointLiquids bool
-
-                               ToolCaps ToolCaps
-
-                               Groups []Group
-
-                               PlacePredict string
-
-                               PlaceSnd, PlaceFailSnd SoundDef
-
-                               PointRange float32
-
-                               // Set index in Palette with "palette_index" item meta field,
-                               // this overrides Color.
-                               Palette Texture
-                               Color   color.NRGBA
-
-                               // Texture overlays.
-                               InvOverlay, WieldOverlay Texture
-
-                               ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).CanPointLiquids
                        switch n := read8(r); n {
                        case 0:
@@ -26655,8 +25025,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).ToolCaps).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
@@ -26664,9 +25032,9 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                        }
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ToolCaps", err))
                }
-               var local313 uint16
+               var local309 uint16
                {
-                       p := &local313
+                       p := &local309
                        *p = read16(r)
                }
                ((*(*(struct {
@@ -26701,10 +25069,8 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
-               }))(obj)).Groups) = make([]Group, local313)
-               for local314 := range (*(*(struct {
+               }))(obj)).Groups) = make([]Group, local309)
+               for local310 := range (*(*(struct {
                        Type ItemType
 
                        Name, Desc string
@@ -26736,8 +25102,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
                }))(obj)).Groups {
                        if err := pcall(func() {
                                (((*(*(struct {
@@ -26772,9 +25136,7 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                        InvOverlay, WieldOverlay Texture
 
                                        ShortDesc string
-
-                                       PlaceParam2 byte
-                               }))(obj)).Groups)[local314]).deserialize(r)
+                               }))(obj)).Groups)[local310]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -26782,15 +25144,15 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Group", err))
                        }
                }
-               var local315 []uint8
-               var local316 uint16
+               var local311 []uint8
+               var local312 uint16
                {
-                       p := &local316
+                       p := &local312
                        *p = read16(r)
                }
-               (local315) = make([]uint8, local316)
+               (local311) = make([]uint8, local312)
                {
-                       _, err := io.ReadFull(r, (local315)[:])
+                       _, err := io.ReadFull(r, (local311)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -26825,9 +25187,7 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
-               }))(obj)).PlacePredict) = string(local315)
+               }))(obj)).PlacePredict) = string(local311)
                if err := pcall(func() {
                        ((*(*(struct {
                                Type ItemType
@@ -26861,8 +25221,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).PlaceSnd).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
@@ -26903,8 +25261,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).PlaceFailSnd).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
@@ -26945,8 +25301,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).PointRange
                        *p = math.Float32frombits(read32(r))
                }
@@ -26983,8 +25337,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Palette).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
@@ -27025,8 +25377,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).Color
                        *p = color.NRGBA{A: read8(r), R: read8(r), G: read8(r), B: read8(r)}
                }
@@ -27063,8 +25413,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).InvOverlay).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
@@ -27105,8 +25453,6 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                                InvOverlay, WieldOverlay Texture
 
                                ShortDesc string
-
-                               PlaceParam2 byte
                        }))(obj)).WieldOverlay).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
@@ -27114,15 +25460,15 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                        }
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Texture", err))
                }
-               var local317 []uint8
-               var local318 uint16
+               var local313 []uint8
+               var local314 uint16
                {
-                       p := &local318
+                       p := &local314
                        *p = read16(r)
                }
-               (local317) = make([]uint8, local318)
+               (local313) = make([]uint8, local314)
                {
-                       _, err := io.ReadFull(r, (local317)[:])
+                       _, err := io.ReadFull(r, (local313)[:])
                        chk(err)
                }
                ((*(*(struct {
@@ -27157,47 +25503,7 @@ func (obj *ItemDef) deserialize(r io.Reader) {
                        InvOverlay, WieldOverlay Texture
 
                        ShortDesc string
-
-                       PlaceParam2 byte
-               }))(obj)).ShortDesc) = string(local317)
-               {
-                       p := &(*(*(struct {
-                               Type ItemType
-
-                               Name, Desc string
-
-                               InvImg, WieldImg Texture
-                               WieldScale       [3]float32
-
-                               StackMax uint16
-
-                               Usable          bool
-                               CanPointLiquids bool
-
-                               ToolCaps ToolCaps
-
-                               Groups []Group
-
-                               PlacePredict string
-
-                               PlaceSnd, PlaceFailSnd SoundDef
-
-                               PointRange float32
-
-                               // Set index in Palette with "palette_index" item meta field,
-                               // this overrides Color.
-                               Palette Texture
-                               Color   color.NRGBA
-
-                               // Texture overlays.
-                               InvOverlay, WieldOverlay Texture
-
-                               ShortDesc string
-
-                               PlaceParam2 byte
-                       }))(obj)).PlaceParam2
-                       *p = read8(r)
-               }
+               }))(obj)).ShortDesc) = string(local313)
                if r.N > 0 {
                        chk(fmt.Errorf("%d bytes of trailing data", r.N))
                }
@@ -27297,7 +25603,7 @@ func (obj *TileAnim) serialize(w io.Writer) {
                Duration float32 // in seconds
 
        }))(obj)).Type == VerticalFrameAnim {
-               for local319 := range (*(*(struct {
+               for local315 := range (*(*(struct {
                        Type AnimType
 
                        //mt:if %s.Type == SpriteSheetAnim
@@ -27323,7 +25629,7 @@ func (obj *TileAnim) serialize(w io.Writer) {
                                        //mt:if %s.Type != NoAnim
                                        Duration float32 // in seconds
 
-                               }))(obj)).NFrames)[local319]
+                               }))(obj)).NFrames)[local315]
                                write16(w, uint16(x))
                        }
                }
@@ -27374,188 +25680,1077 @@ func (obj *TileAnim) deserialize(r io.Reader) {
                        //mt:if %s.Type != NoAnim
                        Duration float32 // in seconds
 
-               }))(obj)).Type).deserialize(r)
-       }); err != nil {
-               if err == io.EOF {
-                       chk(io.EOF)
+               }))(obj)).Type).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AnimType", err))
+       }
+       if !((*(*(struct {
+               Type AnimType
+
+               //mt:if %s.Type == SpriteSheetAnim
+               AspectRatio [2]uint8
+
+               //mt:if %s.Type == VerticalFrameAnim
+               NFrames [2]uint16
+
+               //mt:if %s.Type != NoAnim
+               Duration float32 // in seconds
+
+       }))(obj)).Type < maxAnim) {
+               chk(errors.New("assertion failed: %s.Type < maxAnim"))
+       }
+       if (*(*(struct {
+               Type AnimType
+
+               //mt:if %s.Type == SpriteSheetAnim
+               AspectRatio [2]uint8
+
+               //mt:if %s.Type == VerticalFrameAnim
+               NFrames [2]uint16
+
+               //mt:if %s.Type != NoAnim
+               Duration float32 // in seconds
+
+       }))(obj)).Type == SpriteSheetAnim {
+               {
+                       _, err := io.ReadFull(r, ((*(*(struct {
+                               Type AnimType
+
+                               //mt:if %s.Type == SpriteSheetAnim
+                               AspectRatio [2]uint8
+
+                               //mt:if %s.Type == VerticalFrameAnim
+                               NFrames [2]uint16
+
+                               //mt:if %s.Type != NoAnim
+                               Duration float32 // in seconds
+
+                       }))(obj)).AspectRatio)[:])
+                       chk(err)
+               }
+       }
+       if (*(*(struct {
+               Type AnimType
+
+               //mt:if %s.Type == SpriteSheetAnim
+               AspectRatio [2]uint8
+
+               //mt:if %s.Type == VerticalFrameAnim
+               NFrames [2]uint16
+
+               //mt:if %s.Type != NoAnim
+               Duration float32 // in seconds
+
+       }))(obj)).Type == VerticalFrameAnim {
+               for local316 := range (*(*(struct {
+                       Type AnimType
+
+                       //mt:if %s.Type == SpriteSheetAnim
+                       AspectRatio [2]uint8
+
+                       //mt:if %s.Type == VerticalFrameAnim
+                       NFrames [2]uint16
+
+                       //mt:if %s.Type != NoAnim
+                       Duration float32 // in seconds
+
+               }))(obj)).NFrames {
+                       {
+                               p := &((*(*(struct {
+                                       Type AnimType
+
+                                       //mt:if %s.Type == SpriteSheetAnim
+                                       AspectRatio [2]uint8
+
+                                       //mt:if %s.Type == VerticalFrameAnim
+                                       NFrames [2]uint16
+
+                                       //mt:if %s.Type != NoAnim
+                                       Duration float32 // in seconds
+
+                               }))(obj)).NFrames)[local316]
+                               *p = read16(r)
+                       }
+               }
+       }
+       if (*(*(struct {
+               Type AnimType
+
+               //mt:if %s.Type == SpriteSheetAnim
+               AspectRatio [2]uint8
+
+               //mt:if %s.Type == VerticalFrameAnim
+               NFrames [2]uint16
+
+               //mt:if %s.Type != NoAnim
+               Duration float32 // in seconds
+
+       }))(obj)).Type != NoAnim {
+               {
+                       p := &(*(*(struct {
+                               Type AnimType
+
+                               //mt:if %s.Type == SpriteSheetAnim
+                               AspectRatio [2]uint8
+
+                               //mt:if %s.Type == VerticalFrameAnim
+                               NFrames [2]uint16
+
+                               //mt:if %s.Type != NoAnim
+                               Duration float32 // in seconds
+
+                       }))(obj)).Duration
+                       *p = math.Float32frombits(read32(r))
+               }
+       }
+}
+
+func (obj *Content) serialize(w io.Writer) {
+       {
+               x := *(*(uint16))(obj)
+               write16(w, uint16(x))
+       }
+}
+
+func (obj *Content) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint16))(obj)
+               *p = read16(r)
+       }
+}
+
+func (obj *ParticleSpawnerID) serialize(w io.Writer) {
+       {
+               x := *(*(uint32))(obj)
+               write32(w, uint32(x))
+       }
+}
+
+func (obj *ParticleSpawnerID) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint32))(obj)
+               *p = read32(r)
+       }
+}
+
+func (obj *HUDID) serialize(w io.Writer) {
+       {
+               x := *(*(uint32))(obj)
+               write32(w, uint32(x))
+       }
+}
+
+func (obj *HUDID) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint32))(obj)
+               *p = read32(r)
+       }
+}
+
+func (obj *HUD) serialize(w io.Writer) {
+       if err := pcall(func() {
+               ((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Type).serialize(w)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDType", err))
+       }
+       for local317 := range (*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Pos {
+               {
+                       x := ((*(*(struct {
+                               Type HUDType
+
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Pos)[local317]
+                       write32(w, math.Float32bits(x))
+               }
+       }
+       if len(([]byte((*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Name))) > math.MaxUint16 {
+               chk(ErrTooLong)
+       }
+       {
+               x := uint16(len(([]byte((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Name))))
+               write16(w, uint16(x))
+       }
+       {
+               _, err := w.Write(([]byte((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Name))[:])
+               chk(err)
+       }
+       for local318 := range (*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Scale {
+               {
+                       x := ((*(*(struct {
+                               Type HUDType
+
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Scale)[local318]
+                       write32(w, math.Float32bits(x))
+               }
+       }
+       if len(([]byte((*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Text))) > math.MaxUint16 {
+               chk(ErrTooLong)
+       }
+       {
+               x := uint16(len(([]byte((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Text))))
+               write16(w, uint16(x))
+       }
+       {
+               _, err := w.Write(([]byte((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Text))[:])
+               chk(err)
+       }
+       {
+               x := (*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Number
+               write32(w, uint32(x))
+       }
+       {
+               x := (*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Item
+               write32(w, uint32(x))
+       }
+       {
+               x := (*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Dir
+               write32(w, uint32(x))
+       }
+       for local319 := range (*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Align {
+               {
+                       x := ((*(*(struct {
+                               Type HUDType
+
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Align)[local319]
+                       write32(w, math.Float32bits(x))
+               }
+       }
+       for local320 := range (*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Offset {
+               {
+                       x := ((*(*(struct {
+                               Type HUDType
+
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Offset)[local320]
+                       write32(w, math.Float32bits(x))
+               }
+       }
+       if err := pcall(func() {
+               ((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).WorldPos).serialize(w)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Pos", err))
+       }
+       for local321 := range (*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Size {
+               {
+                       x := ((*(*(struct {
+                               Type HUDType
+
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Size)[local321]
+                       write32(w, uint32(x))
+               }
+       }
+       {
+               x := (*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).ZIndex
+               write16(w, uint16(x))
+       }
+       if len(([]byte((*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Text2))) > math.MaxUint16 {
+               chk(ErrTooLong)
+       }
+       {
+               x := uint16(len(([]byte((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Text2))))
+               write16(w, uint16(x))
+       }
+       {
+               _, err := w.Write(([]byte((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Text2))[:])
+               chk(err)
+       }
+}
+
+func (obj *HUD) deserialize(r io.Reader) {
+       if err := pcall(func() {
+               ((*(*(struct {
+                       Type HUDType
+
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Type).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.HUDType", err))
+       }
+       for local322 := range (*(*(struct {
+               Type HUDType
+
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Pos {
+               {
+                       p := &((*(*(struct {
+                               Type HUDType
+
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Pos)[local322]
+                       *p = math.Float32frombits(read32(r))
                }
-               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AnimType", err))
        }
-       if !((*(*(struct {
-               Type AnimType
-
-               //mt:if %s.Type == SpriteSheetAnim
-               AspectRatio [2]uint8
-
-               //mt:if %s.Type == VerticalFrameAnim
-               NFrames [2]uint16
-
-               //mt:if %s.Type != NoAnim
-               Duration float32 // in seconds
-
-       }))(obj)).Type < maxAnim) {
-               chk(errors.New("assertion failed: %s.Type < maxAnim"))
+       var local323 []uint8
+       var local324 uint16
+       {
+               p := &local324
+               *p = read16(r)
        }
-       if (*(*(struct {
-               Type AnimType
-
-               //mt:if %s.Type == SpriteSheetAnim
-               AspectRatio [2]uint8
-
-               //mt:if %s.Type == VerticalFrameAnim
-               NFrames [2]uint16
+       (local323) = make([]uint8, local324)
+       {
+               _, err := io.ReadFull(r, (local323)[:])
+               chk(err)
+       }
+       ((*(*(struct {
+               Type HUDType
 
-               //mt:if %s.Type != NoAnim
-               Duration float32 // in seconds
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Name) = string(local323)
+       for local325 := range (*(*(struct {
+               Type HUDType
 
-       }))(obj)).Type == SpriteSheetAnim {
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Scale {
                {
-                       _, err := io.ReadFull(r, ((*(*(struct {
-                               Type AnimType
-
-                               //mt:if %s.Type == SpriteSheetAnim
-                               AspectRatio [2]uint8
-
-                               //mt:if %s.Type == VerticalFrameAnim
-                               NFrames [2]uint16
-
-                               //mt:if %s.Type != NoAnim
-                               Duration float32 // in seconds
+                       p := &((*(*(struct {
+                               Type HUDType
 
-                       }))(obj)).AspectRatio)[:])
-                       chk(err)
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Scale)[local325]
+                       *p = math.Float32frombits(read32(r))
                }
        }
-       if (*(*(struct {
-               Type AnimType
-
-               //mt:if %s.Type == SpriteSheetAnim
-               AspectRatio [2]uint8
-
-               //mt:if %s.Type == VerticalFrameAnim
-               NFrames [2]uint16
-
-               //mt:if %s.Type != NoAnim
-               Duration float32 // in seconds
-
-       }))(obj)).Type == VerticalFrameAnim {
-               for local320 := range (*(*(struct {
-                       Type AnimType
-
-                       //mt:if %s.Type == SpriteSheetAnim
-                       AspectRatio [2]uint8
-
-                       //mt:if %s.Type == VerticalFrameAnim
-                       NFrames [2]uint16
+       var local326 []uint8
+       var local327 uint16
+       {
+               p := &local327
+               *p = read16(r)
+       }
+       (local326) = make([]uint8, local327)
+       {
+               _, err := io.ReadFull(r, (local326)[:])
+               chk(err)
+       }
+       ((*(*(struct {
+               Type HUDType
 
-                       //mt:if %s.Type != NoAnim
-                       Duration float32 // in seconds
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Text) = string(local326)
+       {
+               p := &(*(*(struct {
+                       Type HUDType
 
-               }))(obj)).NFrames {
-                       {
-                               p := &((*(*(struct {
-                                       Type AnimType
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Number
+               *p = read32(r)
+       }
+       {
+               p := &(*(*(struct {
+                       Type HUDType
 
-                                       //mt:if %s.Type == SpriteSheetAnim
-                                       AspectRatio [2]uint8
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Item
+               *p = read32(r)
+       }
+       {
+               p := &(*(*(struct {
+                       Type HUDType
 
-                                       //mt:if %s.Type == VerticalFrameAnim
-                                       NFrames [2]uint16
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).Dir
+               *p = read32(r)
+       }
+       for local328 := range (*(*(struct {
+               Type HUDType
 
-                                       //mt:if %s.Type != NoAnim
-                                       Duration float32 // in seconds
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Align {
+               {
+                       p := &((*(*(struct {
+                               Type HUDType
 
-                               }))(obj)).NFrames)[local320]
-                               *p = read16(r)
-                       }
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Align)[local328]
+                       *p = math.Float32frombits(read32(r))
                }
        }
-       if (*(*(struct {
-               Type AnimType
-
-               //mt:if %s.Type == SpriteSheetAnim
-               AspectRatio [2]uint8
-
-               //mt:if %s.Type == VerticalFrameAnim
-               NFrames [2]uint16
-
-               //mt:if %s.Type != NoAnim
-               Duration float32 // in seconds
+       for local329 := range (*(*(struct {
+               Type HUDType
 
-       }))(obj)).Type != NoAnim {
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Offset {
                {
-                       p := &(*(*(struct {
-                               Type AnimType
-
-                               //mt:if %s.Type == SpriteSheetAnim
-                               AspectRatio [2]uint8
-
-                               //mt:if %s.Type == VerticalFrameAnim
-                               NFrames [2]uint16
-
-                               //mt:if %s.Type != NoAnim
-                               Duration float32 // in seconds
+                       p := &((*(*(struct {
+                               Type HUDType
 
-                       }))(obj)).Duration
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Offset)[local329]
                        *p = math.Float32frombits(read32(r))
                }
        }
-}
+       if err := pcall(func() {
+               ((*(*(struct {
+                       Type HUDType
 
-func (obj *Content) serialize(w io.Writer) {
-       {
-               x := *(*(uint16))(obj)
-               write16(w, uint16(x))
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).WorldPos).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Pos", err))
        }
-}
+       for local330 := range (*(*(struct {
+               Type HUDType
 
-func (obj *Content) deserialize(r io.Reader) {
-       {
-               p := &*(*(uint16))(obj)
-               *p = read16(r)
-       }
-}
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Size {
+               {
+                       p := &((*(*(struct {
+                               Type HUDType
 
-func (obj *ParticleSpawnerID) serialize(w io.Writer) {
-       {
-               x := *(*(uint32))(obj)
-               write32(w, uint32(x))
+                               Pos      [2]float32
+                               Name     string
+                               Scale    [2]float32
+                               Text     string
+                               Number   uint32
+                               Item     uint32
+                               Dir      uint32
+                               Align    [2]float32
+                               Offset   [2]float32
+                               WorldPos Pos
+                               Size     [2]int32
+                               ZIndex   int16
+                               Text2    string
+                       }))(obj)).Size)[local330]
+                       *p = int32(read32(r))
+               }
        }
-}
-
-func (obj *ParticleSpawnerID) deserialize(r io.Reader) {
        {
-               p := &*(*(uint32))(obj)
-               *p = read32(r)
-       }
-}
+               p := &(*(*(struct {
+                       Type HUDType
 
-func (obj *HUDID) serialize(w io.Writer) {
-       {
-               x := *(*(uint32))(obj)
-               write32(w, uint32(x))
+                       Pos      [2]float32
+                       Name     string
+                       Scale    [2]float32
+                       Text     string
+                       Number   uint32
+                       Item     uint32
+                       Dir      uint32
+                       Align    [2]float32
+                       Offset   [2]float32
+                       WorldPos Pos
+                       Size     [2]int32
+                       ZIndex   int16
+                       Text2    string
+               }))(obj)).ZIndex
+               *p = int16(read16(r))
        }
-}
-
-func (obj *HUDID) deserialize(r io.Reader) {
+       var local331 []uint8
+       var local332 uint16
        {
-               p := &*(*(uint32))(obj)
-               *p = read32(r)
+               p := &local332
+               *p = read16(r)
        }
-}
-
-func (obj *HUDType) serialize(w io.Writer) {
+       (local331) = make([]uint8, local332)
        {
-               x := *(*(uint8))(obj)
-               write8(w, uint8(x))
+               _, err := io.ReadFull(r, (local331)[:])
+               chk(err)
        }
-}
+       ((*(*(struct {
+               Type HUDType
 
-func (obj *HUDType) deserialize(r io.Reader) {
-       {
-               p := &*(*(uint8))(obj)
-               *p = read8(r)
-       }
+               Pos      [2]float32
+               Name     string
+               Scale    [2]float32
+               Text     string
+               Number   uint32
+               Item     uint32
+               Dir      uint32
+               Align    [2]float32
+               Offset   [2]float32
+               WorldPos Pos
+               Size     [2]int32
+               ZIndex   int16
+               Text2    string
+       }))(obj)).Text2) = string(local331)
 }
 
 func (obj *HUDField) serialize(w io.Writer) {
@@ -27615,18 +26810,18 @@ func (obj *Texture) serialize(w io.Writer) {
 }
 
 func (obj *Texture) deserialize(r io.Reader) {
-       var local321 []uint8
-       var local322 uint16
+       var local333 []uint8
+       var local334 uint16
        {
-               p := &local322
+               p := &local334
                *p = read16(r)
        }
-       (local321) = make([]uint8, local322)
+       (local333) = make([]uint8, local334)
        {
-               _, err := io.ReadFull(r, (local321)[:])
+               _, err := io.ReadFull(r, (local333)[:])
                chk(err)
        }
-       (*(*(string))(obj)) = string(local321)
+       (*(*(string))(obj)) = string(local333)
 }
 
 func (obj *PlayerListUpdateType) serialize(w io.Writer) {
@@ -27659,9 +26854,9 @@ func (obj *ModChanSig) deserialize(r io.Reader) {
 
 func (obj *AOProps) serialize(w io.Writer) {
        {
-               local323 := uint8(4)
+               local335 := uint8(4)
                {
-                       x := local323
+                       x := local335
                        write8(w, uint8(x))
                }
        }
@@ -28031,7 +27226,7 @@ func (obj *AOProps) serialize(w io.Writer) {
                }))(obj)).Visual))[:])
                chk(err)
        }
-       for local324 := range (*(*(struct {
+       for local336 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -28103,7 +27298,7 @@ func (obj *AOProps) serialize(w io.Writer) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).VisualSize)[local324]
+                       }))(obj)).VisualSize)[local336]
                        write32(w, math.Float32bits(x))
                }
        }
@@ -28184,7 +27379,7 @@ func (obj *AOProps) serialize(w io.Writer) {
                }))(obj)).Textures)))
                write16(w, uint16(x))
        }
-       for local325 := range (*(*(struct {
+       for local337 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -28256,7 +27451,7 @@ func (obj *AOProps) serialize(w io.Writer) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).Textures)[local325]).serialize(w)
+                       }))(obj)).Textures)[local337]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -28264,7 +27459,7 @@ func (obj *AOProps) serialize(w io.Writer) {
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Texture", err))
                }
        }
-       for local326 := range (*(*(struct {
+       for local338 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -28336,11 +27531,11 @@ func (obj *AOProps) serialize(w io.Writer) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).SpriteSheetSize)[local326]
+                       }))(obj)).SpriteSheetSize)[local338]
                        write16(w, uint16(x))
                }
        }
-       for local327 := range (*(*(struct {
+       for local339 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -28412,7 +27607,7 @@ func (obj *AOProps) serialize(w io.Writer) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).SpritePos)[local327]
+                       }))(obj)).SpritePos)[local339]
                        write16(w, uint16(x))
                }
        }
@@ -28734,7 +27929,7 @@ func (obj *AOProps) serialize(w io.Writer) {
                }))(obj)).Colors)))
                write16(w, uint16(x))
        }
-       for local328 := range (*(*(struct {
+       for local340 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -28806,7 +28001,7 @@ func (obj *AOProps) serialize(w io.Writer) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).Colors)[local328]
+                       }))(obj)).Colors)[local340]
                        w.Write([]byte{x.A, x.R, x.G, x.B})
                }
        }
@@ -29814,13 +29009,14 @@ func (obj *AOProps) serialize(w io.Writer) {
 
 func (obj *AOProps) deserialize(r io.Reader) {
        {
-               var local329 uint8
+               var local341 uint8
+               local342 := uint8(4)
                {
-                       p := &local329
+                       p := &local341
                        *p = read8(r)
                }
-               if local329 != (4) {
-                       chk(fmt.Errorf("const %v: %v", 4, local329))
+               if local341 != local342 {
+                       chk(fmt.Errorf("const %v: %v", "uint8(4)", local341))
                }
        }
        {
@@ -30079,15 +29275,15 @@ func (obj *AOProps) deserialize(r io.Reader) {
                        chk(fmt.Errorf("invalid bool: %d", n))
                }
        }
-       var local330 []uint8
-       var local331 uint16
+       var local343 []uint8
+       var local344 uint16
        {
-               p := &local331
+               p := &local344
                *p = read16(r)
        }
-       (local330) = make([]uint8, local331)
+       (local343) = make([]uint8, local344)
        {
-               _, err := io.ReadFull(r, (local330)[:])
+               _, err := io.ReadFull(r, (local343)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -30125,8 +29321,8 @@ func (obj *AOProps) deserialize(r io.Reader) {
                Shaded           bool
                ShowOnMinimap    bool
                NametagBG        color.NRGBA
-       }))(obj)).Visual) = string(local330)
-       for local332 := range (*(*(struct {
+       }))(obj)).Visual) = string(local343)
+       for local345 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -30198,13 +29394,13 @@ func (obj *AOProps) deserialize(r io.Reader) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).VisualSize)[local332]
+                       }))(obj)).VisualSize)[local345]
                        *p = math.Float32frombits(read32(r))
                }
        }
-       var local333 uint16
+       var local346 uint16
        {
-               p := &local333
+               p := &local346
                *p = read16(r)
        }
        ((*(*(struct {
@@ -30242,8 +29438,8 @@ func (obj *AOProps) deserialize(r io.Reader) {
                Shaded           bool
                ShowOnMinimap    bool
                NametagBG        color.NRGBA
-       }))(obj)).Textures) = make([]Texture, local333)
-       for local334 := range (*(*(struct {
+       }))(obj)).Textures) = make([]Texture, local346)
+       for local347 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -30315,7 +29511,7 @@ func (obj *AOProps) deserialize(r io.Reader) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).Textures)[local334]).deserialize(r)
+                       }))(obj)).Textures)[local347]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -30323,7 +29519,7 @@ func (obj *AOProps) deserialize(r io.Reader) {
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Texture", err))
                }
        }
-       for local335 := range (*(*(struct {
+       for local348 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -30395,11 +29591,11 @@ func (obj *AOProps) deserialize(r io.Reader) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).SpriteSheetSize)[local335]
+                       }))(obj)).SpriteSheetSize)[local348]
                        *p = int16(read16(r))
                }
        }
-       for local336 := range (*(*(struct {
+       for local349 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -30471,7 +29667,7 @@ func (obj *AOProps) deserialize(r io.Reader) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).SpritePos)[local336]
+                       }))(obj)).SpritePos)[local349]
                        *p = int16(read16(r))
                }
        }
@@ -30606,15 +29802,15 @@ func (obj *AOProps) deserialize(r io.Reader) {
                }))(obj)).RotateSpeed
                *p = math.Float32frombits(read32(r))
        }
-       var local337 []uint8
-       var local338 uint16
+       var local350 []uint8
+       var local351 uint16
        {
-               p := &local338
+               p := &local351
                *p = read16(r)
        }
-       (local337) = make([]uint8, local338)
+       (local350) = make([]uint8, local351)
        {
-               _, err := io.ReadFull(r, (local337)[:])
+               _, err := io.ReadFull(r, (local350)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -30652,10 +29848,10 @@ func (obj *AOProps) deserialize(r io.Reader) {
                Shaded           bool
                ShowOnMinimap    bool
                NametagBG        color.NRGBA
-       }))(obj)).Mesh) = string(local337)
-       var local339 uint16
+       }))(obj)).Mesh) = string(local350)
+       var local352 uint16
        {
-               p := &local339
+               p := &local352
                *p = read16(r)
        }
        ((*(*(struct {
@@ -30693,8 +29889,8 @@ func (obj *AOProps) deserialize(r io.Reader) {
                Shaded           bool
                ShowOnMinimap    bool
                NametagBG        color.NRGBA
-       }))(obj)).Colors) = make([]color.NRGBA, local339)
-       for local340 := range (*(*(struct {
+       }))(obj)).Colors) = make([]color.NRGBA, local352)
+       for local353 := range (*(*(struct {
                MaxHP            uint16 // Player only.
                CollideWithNodes bool
                Weight           float32 // deprecated
@@ -30766,7 +29962,7 @@ func (obj *AOProps) deserialize(r io.Reader) {
                                Shaded           bool
                                ShowOnMinimap    bool
                                NametagBG        color.NRGBA
-                       }))(obj)).Colors)[local340]
+                       }))(obj)).Colors)[local353]
                        *p = color.NRGBA{A: read8(r), R: read8(r), G: read8(r), B: read8(r)}
                }
        }
@@ -30986,15 +30182,15 @@ func (obj *AOProps) deserialize(r io.Reader) {
                        chk(fmt.Errorf("invalid bool: %d", n))
                }
        }
-       var local341 []uint8
-       var local342 uint16
+       var local354 []uint8
+       var local355 uint16
        {
-               p := &local342
+               p := &local355
                *p = read16(r)
        }
-       (local341) = make([]uint8, local342)
+       (local354) = make([]uint8, local355)
        {
-               _, err := io.ReadFull(r, (local341)[:])
+               _, err := io.ReadFull(r, (local354)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -31032,7 +30228,7 @@ func (obj *AOProps) deserialize(r io.Reader) {
                Shaded           bool
                ShowOnMinimap    bool
                NametagBG        color.NRGBA
-       }))(obj)).Nametag) = string(local341)
+       }))(obj)).Nametag) = string(local354)
        {
                p := &(*(*(struct {
                        MaxHP            uint16 // Player only.
@@ -31111,15 +30307,15 @@ func (obj *AOProps) deserialize(r io.Reader) {
                }))(obj)).FaceRotateSpeed
                *p = math.Float32frombits(read32(r))
        }
-       var local343 []uint8
-       var local344 uint16
+       var local356 []uint8
+       var local357 uint16
        {
-               p := &local344
+               p := &local357
                *p = read16(r)
        }
-       (local343) = make([]uint8, local344)
+       (local356) = make([]uint8, local357)
        {
-               _, err := io.ReadFull(r, (local343)[:])
+               _, err := io.ReadFull(r, (local356)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -31157,16 +30353,16 @@ func (obj *AOProps) deserialize(r io.Reader) {
                Shaded           bool
                ShowOnMinimap    bool
                NametagBG        color.NRGBA
-       }))(obj)).Infotext) = string(local343)
-       var local345 []uint8
-       var local346 uint16
+       }))(obj)).Infotext) = string(local356)
+       var local358 []uint8
+       var local359 uint16
        {
-               p := &local346
+               p := &local359
                *p = read16(r)
        }
-       (local345) = make([]uint8, local346)
+       (local358) = make([]uint8, local359)
        {
-               _, err := io.ReadFull(r, (local345)[:])
+               _, err := io.ReadFull(r, (local358)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -31204,7 +30400,7 @@ func (obj *AOProps) deserialize(r io.Reader) {
                Shaded           bool
                ShowOnMinimap    bool
                NametagBG        color.NRGBA
-       }))(obj)).Itemstring) = string(local345)
+       }))(obj)).Itemstring) = string(local358)
        {
                p := &(*(*(struct {
                        MaxHP            uint16 // Player only.
@@ -31632,7 +30828,7 @@ func (obj *AOPos) serialize(w io.Writer) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Vec", err))
        }
-       for local347 := range (*(*(struct {
+       for local360 := range (*(*(struct {
                Pos
                Vel, Acc Vec
                Rot      [3]float32
@@ -31650,7 +30846,7 @@ func (obj *AOPos) serialize(w io.Writer) {
                                Interpolate    bool
                                End            bool
                                UpdateInterval float32
-                       }))(obj)).Rot)[local347]
+                       }))(obj)).Rot)[local360]
                        write32(w, math.Float32bits(x))
                }
        }
@@ -31749,7 +30945,7 @@ func (obj *AOPos) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Vec", err))
        }
-       for local348 := range (*(*(struct {
+       for local361 := range (*(*(struct {
                Pos
                Vel, Acc Vec
                Rot      [3]float32
@@ -31767,7 +30963,7 @@ func (obj *AOPos) deserialize(r io.Reader) {
                                Interpolate    bool
                                End            bool
                                UpdateInterval float32
-                       }))(obj)).Rot)[local348]
+                       }))(obj)).Rot)[local361]
                        *p = math.Float32frombits(read32(r))
                }
        }
@@ -31824,7 +31020,7 @@ func (obj *AOPos) deserialize(r io.Reader) {
 }
 
 func (obj *AOSprite) serialize(w io.Writer) {
-       for local349 := range (*(*(struct {
+       for local362 := range (*(*(struct {
                Frame0          [2]int16
                Frames          uint16
                FrameDuration   float32
@@ -31836,7 +31032,7 @@ func (obj *AOSprite) serialize(w io.Writer) {
                                Frames          uint16
                                FrameDuration   float32
                                ViewAngleFrames bool
-                       }))(obj)).Frame0)[local349]
+                       }))(obj)).Frame0)[local362]
                        write16(w, uint16(x))
                }
        }
@@ -31874,7 +31070,7 @@ func (obj *AOSprite) serialize(w io.Writer) {
 }
 
 func (obj *AOSprite) deserialize(r io.Reader) {
-       for local350 := range (*(*(struct {
+       for local363 := range (*(*(struct {
                Frame0          [2]int16
                Frames          uint16
                FrameDuration   float32
@@ -31886,7 +31082,7 @@ func (obj *AOSprite) deserialize(r io.Reader) {
                                Frames          uint16
                                FrameDuration   float32
                                ViewAngleFrames bool
-                       }))(obj)).Frame0)[local350]
+                       }))(obj)).Frame0)[local363]
                        *p = int16(read16(r))
                }
        }
@@ -31957,21 +31153,21 @@ func (obj *Group) serialize(w io.Writer) {
 }
 
 func (obj *Group) deserialize(r io.Reader) {
-       var local351 []uint8
-       var local352 uint16
+       var local364 []uint8
+       var local365 uint16
        {
-               p := &local352
+               p := &local365
                *p = read16(r)
        }
-       (local351) = make([]uint8, local352)
+       (local364) = make([]uint8, local365)
        {
-               _, err := io.ReadFull(r, (local351)[:])
+               _, err := io.ReadFull(r, (local364)[:])
                chk(err)
        }
        ((*(*(struct {
                Name   string
                Rating int16
-       }))(obj)).Name) = string(local351)
+       }))(obj)).Name) = string(local364)
        {
                p := &(*(*(struct {
                        Name   string
@@ -31982,7 +31178,7 @@ func (obj *Group) deserialize(r io.Reader) {
 }
 
 func (obj *AOAnim) serialize(w io.Writer) {
-       for local353 := range (*(*(struct {
+       for local366 := range (*(*(struct {
                Frames [2]int32
                Speed  float32
                Blend  float32
@@ -31994,7 +31190,7 @@ func (obj *AOAnim) serialize(w io.Writer) {
                                Speed  float32
                                Blend  float32
                                NoLoop bool
-                       }))(obj)).Frames)[local353]
+                       }))(obj)).Frames)[local366]
                        write32(w, uint32(x))
                }
        }
@@ -32032,7 +31228,7 @@ func (obj *AOAnim) serialize(w io.Writer) {
 }
 
 func (obj *AOAnim) deserialize(r io.Reader) {
-       for local354 := range (*(*(struct {
+       for local367 := range (*(*(struct {
                Frames [2]int32
                Speed  float32
                Blend  float32
@@ -32044,7 +31240,7 @@ func (obj *AOAnim) deserialize(r io.Reader) {
                                Speed  float32
                                Blend  float32
                                NoLoop bool
-                       }))(obj)).Frames)[local354]
+                       }))(obj)).Frames)[local367]
                        *p = int32(read32(r))
                }
        }
@@ -32096,7 +31292,7 @@ func (obj *AOBonePos) serialize(w io.Writer) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Vec", err))
        }
-       for local355 := range (*(*(struct {
+       for local368 := range (*(*(struct {
                Pos Vec
                Rot [3]float32
        }))(obj)).Rot {
@@ -32104,7 +31300,7 @@ func (obj *AOBonePos) serialize(w io.Writer) {
                        x := ((*(*(struct {
                                Pos Vec
                                Rot [3]float32
-                       }))(obj)).Rot)[local355]
+                       }))(obj)).Rot)[local368]
                        write32(w, math.Float32bits(x))
                }
        }
@@ -32122,7 +31318,7 @@ func (obj *AOBonePos) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Vec", err))
        }
-       for local356 := range (*(*(struct {
+       for local369 := range (*(*(struct {
                Pos Vec
                Rot [3]float32
        }))(obj)).Rot {
@@ -32130,7 +31326,7 @@ func (obj *AOBonePos) deserialize(r io.Reader) {
                        p := &((*(*(struct {
                                Pos Vec
                                Rot [3]float32
-                       }))(obj)).Rot)[local356]
+                       }))(obj)).Rot)[local369]
                        *p = math.Float32frombits(read32(r))
                }
        }
@@ -32194,7 +31390,7 @@ func (obj *AOAttach) serialize(w io.Writer) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Vec", err))
        }
-       for local357 := range (*(*(struct {
+       for local370 := range (*(*(struct {
                ParentID     AOID
                Bone         string
                Pos          Vec
@@ -32208,7 +31404,7 @@ func (obj *AOAttach) serialize(w io.Writer) {
                                Pos          Vec
                                Rot          [3]float32
                                ForceVisible bool
-                       }))(obj)).Rot)[local357]
+                       }))(obj)).Rot)[local370]
                        write32(w, math.Float32bits(x))
                }
        }
@@ -32243,15 +31439,15 @@ func (obj *AOAttach) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
        }
-       var local358 []uint8
-       var local359 uint16
+       var local371 []uint8
+       var local372 uint16
        {
-               p := &local359
+               p := &local372
                *p = read16(r)
        }
-       (local358) = make([]uint8, local359)
+       (local371) = make([]uint8, local372)
        {
-               _, err := io.ReadFull(r, (local358)[:])
+               _, err := io.ReadFull(r, (local371)[:])
                chk(err)
        }
        ((*(*(struct {
@@ -32260,7 +31456,7 @@ func (obj *AOAttach) deserialize(r io.Reader) {
                Pos          Vec
                Rot          [3]float32
                ForceVisible bool
-       }))(obj)).Bone) = string(local358)
+       }))(obj)).Bone) = string(local371)
        if err := pcall(func() {
                ((*(*(struct {
                        ParentID     AOID
@@ -32275,7 +31471,7 @@ func (obj *AOAttach) deserialize(r io.Reader) {
                }
                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Vec", err))
        }
-       for local360 := range (*(*(struct {
+       for local373 := range (*(*(struct {
                ParentID     AOID
                Bone         string
                Pos          Vec
@@ -32289,7 +31485,7 @@ func (obj *AOAttach) deserialize(r io.Reader) {
                                Pos          Vec
                                Rot          [3]float32
                                ForceVisible bool
-                       }))(obj)).Rot)[local360]
+                       }))(obj)).Rot)[local373]
                        *p = math.Float32frombits(read32(r))
                }
        }
@@ -32459,6 +31655,20 @@ func (obj *AOPhysOverride) deserialize(r io.Reader) {
        }
 }
 
+func (obj *aoType) serialize(w io.Writer) {
+       {
+               x := *(*(uint8))(obj)
+               write8(w, uint8(x))
+       }
+}
+
+func (obj *aoType) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint8))(obj)
+               *p = read8(r)
+       }
+}
+
 func (obj *NodeMetaField) serialize(w io.Writer) {
        if err := pcall(func() {
                ((*(*(struct {
@@ -32570,9 +31780,9 @@ func (obj *DrawType) deserialize(r io.Reader) {
 
 func (obj *TileDef) serialize(w io.Writer) {
        {
-               local361 := uint8(6)
+               local374 := uint8(6)
                {
-                       x := local361
+                       x := local374
                        write8(w, uint8(x))
                }
        }
@@ -32777,13 +31987,14 @@ func (obj *TileDef) serialize(w io.Writer) {
 
 func (obj *TileDef) deserialize(r io.Reader) {
        {
-               var local362 uint8
+               var local375 uint8
+               local376 := uint8(6)
                {
-                       p := &local362
+                       p := &local375
                        *p = read8(r)
                }
-               if local362 != (6) {
-                       chk(fmt.Errorf("const %v: %v", 6, local362))
+               if local375 != local376 {
+                       chk(fmt.Errorf("const %v: %v", "uint8(6)", local375))
                }
        }
        if err := pcall(func() {
@@ -33015,9 +32226,9 @@ func (obj *LiquidType) deserialize(r io.Reader) {
 
 func (obj *NodeBox) serialize(w io.Writer) {
        {
-               local363 := uint8(6)
+               local377 := uint8(6)
                {
-                       x := local363
+                       x := local377
                        write8(w, uint8(x))
                }
        }
@@ -33174,7 +32385,7 @@ func (obj *NodeBox) serialize(w io.Writer) {
                        }))(obj)).Fixed)))
                        write16(w, uint16(x))
                }
-               for local364 := range (*(*(struct {
+               for local378 := range (*(*(struct {
                        Type NodeBoxType
 
                        //mt:if %s.Type == MountedBox
@@ -33200,7 +32411,7 @@ func (obj *NodeBox) serialize(w io.Writer) {
                                        //mt:if %s.Type == ConnectedBox
                                        ConnDirs, DiscoDirs  DirBoxes
                                        DiscoAll, DiscoSides []Box
-                               }))(obj)).Fixed)[local364]).serialize(w)
+                               }))(obj)).Fixed)[local378]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -33293,7 +32504,7 @@ func (obj *NodeBox) serialize(w io.Writer) {
                        }))(obj)).DiscoAll)))
                        write16(w, uint16(x))
                }
-               for local365 := range (*(*(struct {
+               for local379 := range (*(*(struct {
                        Type NodeBoxType
 
                        //mt:if %s.Type == MountedBox
@@ -33319,7 +32530,7 @@ func (obj *NodeBox) serialize(w io.Writer) {
                                        //mt:if %s.Type == ConnectedBox
                                        ConnDirs, DiscoDirs  DirBoxes
                                        DiscoAll, DiscoSides []Box
-                               }))(obj)).DiscoAll)[local365]).serialize(w)
+                               }))(obj)).DiscoAll)[local379]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -33358,7 +32569,7 @@ func (obj *NodeBox) serialize(w io.Writer) {
                        }))(obj)).DiscoSides)))
                        write16(w, uint16(x))
                }
-               for local366 := range (*(*(struct {
+               for local380 := range (*(*(struct {
                        Type NodeBoxType
 
                        //mt:if %s.Type == MountedBox
@@ -33384,7 +32595,7 @@ func (obj *NodeBox) serialize(w io.Writer) {
                                        //mt:if %s.Type == ConnectedBox
                                        ConnDirs, DiscoDirs  DirBoxes
                                        DiscoAll, DiscoSides []Box
-                               }))(obj)).DiscoSides)[local366]).serialize(w)
+                               }))(obj)).DiscoSides)[local380]).serialize(w)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -33397,13 +32608,14 @@ func (obj *NodeBox) serialize(w io.Writer) {
 
 func (obj *NodeBox) deserialize(r io.Reader) {
        {
-               var local367 uint8
+               var local381 uint8
+               local382 := uint8(6)
                {
-                       p := &local367
+                       p := &local381
                        *p = read8(r)
                }
-               if local367 != (6) {
-                       chk(fmt.Errorf("const %v: %v", 6, local367))
+               if local381 != local382 {
+                       chk(fmt.Errorf("const %v: %v", "uint8(6)", local381))
                }
        }
        if err := pcall(func() {
@@ -33528,9 +32740,9 @@ func (obj *NodeBox) deserialize(r io.Reader) {
                ConnDirs, DiscoDirs  DirBoxes
                DiscoAll, DiscoSides []Box
        }))(obj)).Type; t == FixedBox || t == LeveledBox || t == ConnectedBox {
-               var local368 uint16
+               var local383 uint16
                {
-                       p := &local368
+                       p := &local383
                        *p = read16(r)
                }
                ((*(*(struct {
@@ -33545,8 +32757,8 @@ func (obj *NodeBox) deserialize(r io.Reader) {
                        //mt:if %s.Type == ConnectedBox
                        ConnDirs, DiscoDirs  DirBoxes
                        DiscoAll, DiscoSides []Box
-               }))(obj)).Fixed) = make([]Box, local368)
-               for local369 := range (*(*(struct {
+               }))(obj)).Fixed) = make([]Box, local383)
+               for local384 := range (*(*(struct {
                        Type NodeBoxType
 
                        //mt:if %s.Type == MountedBox
@@ -33572,7 +32784,7 @@ func (obj *NodeBox) deserialize(r io.Reader) {
                                        //mt:if %s.Type == ConnectedBox
                                        ConnDirs, DiscoDirs  DirBoxes
                                        DiscoAll, DiscoSides []Box
-                               }))(obj)).Fixed)[local369]).deserialize(r)
+                               }))(obj)).Fixed)[local384]).deserialize(r)
                        }); err != nil {
                                if err == io.EOF {
                                        chk(io.EOF)
@@ -33634,250 +32846,672 @@ func (obj *NodeBox) deserialize(r io.Reader) {
                        }
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.DirBoxes", err))
                }
-               var local370 uint16
+               var local385 uint16
                {
-                       p := &local370
+                       p := &local385
                        *p = read16(r)
                }
-               ((*(*(struct {
-                       Type NodeBoxType
+               ((*(*(struct {
+                       Type NodeBoxType
+
+                       //mt:if %s.Type == MountedBox
+                       WallTop, WallBot, WallSides Box
+
+                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
+                       Fixed []Box
+
+                       //mt:if %s.Type == ConnectedBox
+                       ConnDirs, DiscoDirs  DirBoxes
+                       DiscoAll, DiscoSides []Box
+               }))(obj)).DiscoAll) = make([]Box, local385)
+               for local386 := range (*(*(struct {
+                       Type NodeBoxType
+
+                       //mt:if %s.Type == MountedBox
+                       WallTop, WallBot, WallSides Box
+
+                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
+                       Fixed []Box
+
+                       //mt:if %s.Type == ConnectedBox
+                       ConnDirs, DiscoDirs  DirBoxes
+                       DiscoAll, DiscoSides []Box
+               }))(obj)).DiscoAll {
+                       if err := pcall(func() {
+                               (((*(*(struct {
+                                       Type NodeBoxType
+
+                                       //mt:if %s.Type == MountedBox
+                                       WallTop, WallBot, WallSides Box
+
+                                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
+                                       Fixed []Box
+
+                                       //mt:if %s.Type == ConnectedBox
+                                       ConnDirs, DiscoDirs  DirBoxes
+                                       DiscoAll, DiscoSides []Box
+                               }))(obj)).DiscoAll)[local386]).deserialize(r)
+                       }); err != nil {
+                               if err == io.EOF {
+                                       chk(io.EOF)
+                               }
+                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
+                       }
+               }
+               var local387 uint16
+               {
+                       p := &local387
+                       *p = read16(r)
+               }
+               ((*(*(struct {
+                       Type NodeBoxType
+
+                       //mt:if %s.Type == MountedBox
+                       WallTop, WallBot, WallSides Box
+
+                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
+                       Fixed []Box
+
+                       //mt:if %s.Type == ConnectedBox
+                       ConnDirs, DiscoDirs  DirBoxes
+                       DiscoAll, DiscoSides []Box
+               }))(obj)).DiscoSides) = make([]Box, local387)
+               for local388 := range (*(*(struct {
+                       Type NodeBoxType
+
+                       //mt:if %s.Type == MountedBox
+                       WallTop, WallBot, WallSides Box
+
+                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
+                       Fixed []Box
+
+                       //mt:if %s.Type == ConnectedBox
+                       ConnDirs, DiscoDirs  DirBoxes
+                       DiscoAll, DiscoSides []Box
+               }))(obj)).DiscoSides {
+                       if err := pcall(func() {
+                               (((*(*(struct {
+                                       Type NodeBoxType
+
+                                       //mt:if %s.Type == MountedBox
+                                       WallTop, WallBot, WallSides Box
+
+                                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
+                                       Fixed []Box
+
+                                       //mt:if %s.Type == ConnectedBox
+                                       ConnDirs, DiscoDirs  DirBoxes
+                                       DiscoAll, DiscoSides []Box
+                               }))(obj)).DiscoSides)[local388]).deserialize(r)
+                       }); err != nil {
+                               if err == io.EOF {
+                                       chk(io.EOF)
+                               }
+                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
+                       }
+               }
+       }
+}
+
+func (obj *SoundDef) serialize(w io.Writer) {
+       if len(([]byte((*(*(struct {
+               Name              string
+               Gain, Pitch, Fade float32
+       }))(obj)).Name))) > math.MaxUint16 {
+               chk(ErrTooLong)
+       }
+       {
+               x := uint16(len(([]byte((*(*(struct {
+                       Name              string
+                       Gain, Pitch, Fade float32
+               }))(obj)).Name))))
+               write16(w, uint16(x))
+       }
+       {
+               _, err := w.Write(([]byte((*(*(struct {
+                       Name              string
+                       Gain, Pitch, Fade float32
+               }))(obj)).Name))[:])
+               chk(err)
+       }
+       {
+               x := (*(*(struct {
+                       Name              string
+                       Gain, Pitch, Fade float32
+               }))(obj)).Gain
+               write32(w, math.Float32bits(x))
+       }
+       {
+               x := (*(*(struct {
+                       Name              string
+                       Gain, Pitch, Fade float32
+               }))(obj)).Pitch
+               write32(w, math.Float32bits(x))
+       }
+       {
+               x := (*(*(struct {
+                       Name              string
+                       Gain, Pitch, Fade float32
+               }))(obj)).Fade
+               write32(w, math.Float32bits(x))
+       }
+}
+
+func (obj *SoundDef) deserialize(r io.Reader) {
+       var local389 []uint8
+       var local390 uint16
+       {
+               p := &local390
+               *p = read16(r)
+       }
+       (local389) = make([]uint8, local390)
+       {
+               _, err := io.ReadFull(r, (local389)[:])
+               chk(err)
+       }
+       ((*(*(struct {
+               Name              string
+               Gain, Pitch, Fade float32
+       }))(obj)).Name) = string(local389)
+       {
+               p := &(*(*(struct {
+                       Name              string
+                       Gain, Pitch, Fade float32
+               }))(obj)).Gain
+               *p = math.Float32frombits(read32(r))
+       }
+       {
+               p := &(*(*(struct {
+                       Name              string
+                       Gain, Pitch, Fade float32
+               }))(obj)).Pitch
+               *p = math.Float32frombits(read32(r))
+       }
+       {
+               p := &(*(*(struct {
+                       Name              string
+                       Gain, Pitch, Fade float32
+               }))(obj)).Fade
+               *p = math.Float32frombits(read32(r))
+       }
+}
+
+func (obj *AlphaUse) serialize(w io.Writer) {
+       {
+               x := *(*(uint8))(obj)
+               write8(w, uint8(x))
+       }
+}
+
+func (obj *AlphaUse) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint8))(obj)
+               *p = read8(r)
+       }
+}
+
+func (obj *Keys) serialize(w io.Writer) {
+       {
+               x := *(*(uint32))(obj)
+               write32(w, uint32(x))
+       }
+}
+
+func (obj *Keys) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint32))(obj)
+               *p = read32(r)
+       }
+}
+
+func (obj *MapBlkFlags) serialize(w io.Writer) {
+       {
+               x := *(*(uint8))(obj)
+               write8(w, uint8(x))
+       }
+}
+
+func (obj *MapBlkFlags) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint8))(obj)
+               *p = read8(r)
+       }
+}
+
+func (obj *LitFromBlks) serialize(w io.Writer) {
+       {
+               x := *(*(uint16))(obj)
+               write16(w, uint16(x))
+       }
+}
+
+func (obj *LitFromBlks) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint16))(obj)
+               *p = read16(r)
+       }
+}
+
+func (obj *AOInitData) serialize(w io.Writer) {
+       {
+               local391 := uint8(1)
+               {
+                       x := local391
+                       write8(w, uint8(x))
+               }
+       }
+       if len(([]byte((*(*(struct {
+
+               // For players.
+               Name     string
+               IsPlayer bool
+
+               ID AOID
+
+               Pos
+               Rot [3]float32
+
+               HP uint16
+
+               // See (de)serialize.fmt.
+               Msgs []AOMsg
+       }))(obj)).Name))) > math.MaxUint16 {
+               chk(ErrTooLong)
+       }
+       {
+               x := uint16(len(([]byte((*(*(struct {
+
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).Name))))
+               write16(w, uint16(x))
+       }
+       {
+               _, err := w.Write(([]byte((*(*(struct {
+
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).Name))[:])
+               chk(err)
+       }
+       {
+               x := (*(*(struct {
+
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).IsPlayer
+               if x {
+                       write8(w, 1)
+               } else {
+                       write8(w, 0)
+               }
+       }
+       if err := pcall(func() {
+               ((*(*(struct {
+
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).ID).serialize(w)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
+       }
+       if err := pcall(func() {
+               ((*(*(struct {
+
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).Pos).serialize(w)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Pos", err))
+       }
+       for local392 := range (*(*(struct {
 
-                       //mt:if %s.Type == MountedBox
-                       WallTop, WallBot, WallSides Box
+               // For players.
+               Name     string
+               IsPlayer bool
 
-                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
-                       Fixed []Box
+               ID AOID
 
-                       //mt:if %s.Type == ConnectedBox
-                       ConnDirs, DiscoDirs  DirBoxes
-                       DiscoAll, DiscoSides []Box
-               }))(obj)).DiscoAll) = make([]Box, local370)
-               for local371 := range (*(*(struct {
-                       Type NodeBoxType
+               Pos
+               Rot [3]float32
 
-                       //mt:if %s.Type == MountedBox
-                       WallTop, WallBot, WallSides Box
+               HP uint16
 
-                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
-                       Fixed []Box
+               // See (de)serialize.fmt.
+               Msgs []AOMsg
+       }))(obj)).Rot {
+               {
+                       x := ((*(*(struct {
 
-                       //mt:if %s.Type == ConnectedBox
-                       ConnDirs, DiscoDirs  DirBoxes
-                       DiscoAll, DiscoSides []Box
-               }))(obj)).DiscoAll {
-                       if err := pcall(func() {
-                               (((*(*(struct {
-                                       Type NodeBoxType
+                               // For players.
+                               Name     string
+                               IsPlayer bool
 
-                                       //mt:if %s.Type == MountedBox
-                                       WallTop, WallBot, WallSides Box
+                               ID AOID
 
-                                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
-                                       Fixed []Box
+                               Pos
+                               Rot [3]float32
 
-                                       //mt:if %s.Type == ConnectedBox
-                                       ConnDirs, DiscoDirs  DirBoxes
-                                       DiscoAll, DiscoSides []Box
-                               }))(obj)).DiscoAll)[local371]).deserialize(r)
-                       }); err != nil {
-                               if err == io.EOF {
-                                       chk(io.EOF)
-                               }
-                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
-                       }
-               }
-               var local372 uint16
-               {
-                       p := &local372
-                       *p = read16(r)
+                               HP uint16
+
+                               // See (de)serialize.fmt.
+                               Msgs []AOMsg
+                       }))(obj)).Rot)[local392]
+                       write32(w, math.Float32bits(x))
                }
-               ((*(*(struct {
-                       Type NodeBoxType
+       }
+       {
+               x := (*(*(struct {
 
-                       //mt:if %s.Type == MountedBox
-                       WallTop, WallBot, WallSides Box
+                       // For players.
+                       Name     string
+                       IsPlayer bool
 
-                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
-                       Fixed []Box
+                       ID AOID
 
-                       //mt:if %s.Type == ConnectedBox
-                       ConnDirs, DiscoDirs  DirBoxes
-                       DiscoAll, DiscoSides []Box
-               }))(obj)).DiscoSides) = make([]Box, local372)
-               for local373 := range (*(*(struct {
-                       Type NodeBoxType
+                       Pos
+                       Rot [3]float32
 
-                       //mt:if %s.Type == MountedBox
-                       WallTop, WallBot, WallSides Box
+                       HP uint16
 
-                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
-                       Fixed []Box
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).HP
+               write16(w, uint16(x))
+       }
+       {
+               x := (*(*(struct {
 
-                       //mt:if %s.Type == ConnectedBox
-                       ConnDirs, DiscoDirs  DirBoxes
-                       DiscoAll, DiscoSides []Box
-               }))(obj)).DiscoSides {
-                       if err := pcall(func() {
-                               (((*(*(struct {
-                                       Type NodeBoxType
+                       // For players.
+                       Name     string
+                       IsPlayer bool
 
-                                       //mt:if %s.Type == MountedBox
-                                       WallTop, WallBot, WallSides Box
+                       ID AOID
 
-                                       //mt:if t := %s.Type; t == FixedBox || t == LeveledBox || t == ConnectedBox
-                                       Fixed []Box
+                       Pos
+                       Rot [3]float32
 
-                                       //mt:if %s.Type == ConnectedBox
-                                       ConnDirs, DiscoDirs  DirBoxes
-                                       DiscoAll, DiscoSides []Box
-                               }))(obj)).DiscoSides)[local373]).deserialize(r)
-                       }); err != nil {
-                               if err == io.EOF {
-                                       chk(io.EOF)
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).Msgs
+               { // For AOInitData.Msgs.
+                       if len(x) > math.MaxUint8 {
+                               chk(ErrTooLong)
+                       }
+                       write8(w, uint8(len(x)))
+                       for _, msg := range x {
+                               var b bytes.Buffer
+                               chk(writeAOMsg(&b, msg))
+                               if b.Len() > math.MaxUint32 {
+                                       chk(ErrTooLong)
                                }
-                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
+                               write32(w, uint32(b.Len()))
+                               _, err := b.WriteTo(w)
+                               chk(err)
                        }
                }
        }
 }
 
-func (obj *SoundDef) serialize(w io.Writer) {
-       if len(([]byte((*(*(struct {
-               Name              string
-               Gain, Pitch, Fade float32
-       }))(obj)).Name))) > math.MaxUint16 {
-               chk(ErrTooLong)
-       }
-       {
-               x := uint16(len(([]byte((*(*(struct {
-                       Name              string
-                       Gain, Pitch, Fade float32
-               }))(obj)).Name))))
-               write16(w, uint16(x))
-       }
-       {
-               _, err := w.Write(([]byte((*(*(struct {
-                       Name              string
-                       Gain, Pitch, Fade float32
-               }))(obj)).Name))[:])
-               chk(err)
-       }
-       {
-               x := (*(*(struct {
-                       Name              string
-                       Gain, Pitch, Fade float32
-               }))(obj)).Gain
-               write32(w, math.Float32bits(x))
-       }
-       {
-               x := (*(*(struct {
-                       Name              string
-                       Gain, Pitch, Fade float32
-               }))(obj)).Pitch
-               write32(w, math.Float32bits(x))
-       }
+func (obj *AOInitData) deserialize(r io.Reader) {
        {
-               x := (*(*(struct {
-                       Name              string
-                       Gain, Pitch, Fade float32
-               }))(obj)).Fade
-               write32(w, math.Float32bits(x))
+               var local393 uint8
+               local394 := uint8(1)
+               {
+                       p := &local393
+                       *p = read8(r)
+               }
+               if local393 != local394 {
+                       chk(fmt.Errorf("const %v: %v", "uint8(1)", local393))
+               }
        }
-}
-
-func (obj *SoundDef) deserialize(r io.Reader) {
-       var local374 []uint8
-       var local375 uint16
+       var local395 []uint8
+       var local396 uint16
        {
-               p := &local375
+               p := &local396
                *p = read16(r)
        }
-       (local374) = make([]uint8, local375)
+       (local395) = make([]uint8, local396)
        {
-               _, err := io.ReadFull(r, (local374)[:])
+               _, err := io.ReadFull(r, (local395)[:])
                chk(err)
        }
        ((*(*(struct {
-               Name              string
-               Gain, Pitch, Fade float32
-       }))(obj)).Name) = string(local374)
-       {
-               p := &(*(*(struct {
-                       Name              string
-                       Gain, Pitch, Fade float32
-               }))(obj)).Gain
-               *p = math.Float32frombits(read32(r))
-       }
-       {
-               p := &(*(*(struct {
-                       Name              string
-                       Gain, Pitch, Fade float32
-               }))(obj)).Pitch
-               *p = math.Float32frombits(read32(r))
-       }
+
+               // For players.
+               Name     string
+               IsPlayer bool
+
+               ID AOID
+
+               Pos
+               Rot [3]float32
+
+               HP uint16
+
+               // See (de)serialize.fmt.
+               Msgs []AOMsg
+       }))(obj)).Name) = string(local395)
        {
                p := &(*(*(struct {
-                       Name              string
-                       Gain, Pitch, Fade float32
-               }))(obj)).Fade
-               *p = math.Float32frombits(read32(r))
-       }
-}
 
-func (obj *AlphaUse) serialize(w io.Writer) {
-       {
-               x := *(*(uint8))(obj)
-               write8(w, uint8(x))
-       }
-}
+                       // For players.
+                       Name     string
+                       IsPlayer bool
 
-func (obj *AlphaUse) deserialize(r io.Reader) {
-       {
-               p := &*(*(uint8))(obj)
-               *p = read8(r)
-       }
-}
+                       ID AOID
 
-func (obj *Keys) serialize(w io.Writer) {
-       {
-               x := *(*(uint32))(obj)
-               write32(w, uint32(x))
-       }
-}
+                       Pos
+                       Rot [3]float32
 
-func (obj *Keys) deserialize(r io.Reader) {
-       {
-               p := &*(*(uint32))(obj)
-               *p = read32(r)
-       }
-}
+                       HP uint16
 
-func (obj *MapBlkFlags) serialize(w io.Writer) {
-       {
-               x := *(*(uint8))(obj)
-               write8(w, uint8(x))
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).IsPlayer
+               switch n := read8(r); n {
+               case 0:
+                       *p = false
+               case 1:
+                       *p = true
+               default:
+                       chk(fmt.Errorf("invalid bool: %d", n))
+               }
        }
-}
+       if err := pcall(func() {
+               ((*(*(struct {
 
-func (obj *MapBlkFlags) deserialize(r io.Reader) {
-       {
-               p := &*(*(uint8))(obj)
-               *p = read8(r)
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).ID).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.AOID", err))
        }
-}
+       if err := pcall(func() {
+               ((*(*(struct {
 
-func (obj *LitFromBlks) serialize(w io.Writer) {
-       {
-               x := *(*(uint16))(obj)
-               write16(w, uint16(x))
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).Pos).deserialize(r)
+       }); err != nil {
+               if err == io.EOF {
+                       chk(io.EOF)
+               }
+               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Pos", err))
        }
-}
+       for local397 := range (*(*(struct {
 
-func (obj *LitFromBlks) deserialize(r io.Reader) {
+               // For players.
+               Name     string
+               IsPlayer bool
+
+               ID AOID
+
+               Pos
+               Rot [3]float32
+
+               HP uint16
+
+               // See (de)serialize.fmt.
+               Msgs []AOMsg
+       }))(obj)).Rot {
+               {
+                       p := &((*(*(struct {
+
+                               // For players.
+                               Name     string
+                               IsPlayer bool
+
+                               ID AOID
+
+                               Pos
+                               Rot [3]float32
+
+                               HP uint16
+
+                               // See (de)serialize.fmt.
+                               Msgs []AOMsg
+                       }))(obj)).Rot)[local397]
+                       *p = math.Float32frombits(read32(r))
+               }
+       }
        {
-               p := &*(*(uint16))(obj)
+               p := &(*(*(struct {
+
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).HP
                *p = read16(r)
        }
+       {
+               p := &(*(*(struct {
+
+                       // For players.
+                       Name     string
+                       IsPlayer bool
+
+                       ID AOID
+
+                       Pos
+                       Rot [3]float32
+
+                       HP uint16
+
+                       // See (de)serialize.fmt.
+                       Msgs []AOMsg
+               }))(obj)).Msgs
+               { // For AOInitData.Msgs.
+                       *p = make([]AOMsg, read8(r))
+                       for i := range *p {
+                               r := &io.LimitedReader{R: r, N: int64(read32(r))}
+                               msg, err := readAOMsg(r)
+                               chk(err)
+                               (*p)[i] = msg
+                               if r.N > 0 {
+                                       chk(fmt.Errorf("%d bytes of trailing data", r.N))
+                               }
+                       }
+               }
+       }
 }
 
 func (obj *ItemType) serialize(w io.Writer) {
@@ -33903,12 +33537,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                MaxDropLvl     int16
 
                //mt:len32
-               GroupCaps []ToolGroupCaps
+               GroupCaps []ToolGroupCap
 
                //mt:len32
                DmgGroups []Group
 
-               AttackUses uint16
+               //mt:32tou16
+               PunchUses int32
        }))(obj)); false {
                {
                        x := (*(*(struct {
@@ -33919,12 +33554,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                MaxDropLvl     int16
 
                                //mt:len32
-                               GroupCaps []ToolGroupCaps
+                               GroupCaps []ToolGroupCap
 
                                //mt:len32
                                DmgGroups []Group
 
-                               AttackUses uint16
+                               //mt:32tou16
+                               PunchUses int32
                        }))(obj)).NonNil
                        if x {
                                write8(w, 1)
@@ -33945,12 +33581,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                        MaxDropLvl      int16
 
                        //mt:len32
-                       GroupCaps       []ToolGroupCaps
+                       GroupCaps       []ToolGroupCap
 
                        //mt:len32
                        DmgGroups       []Group
 
-                       AttackUses      uint16
+                       //mt:32tou16
+                       PunchUses       int32
                   }))(obj)).NonNil = true}; /**/{
                        if (*(*(struct {
                                //mt:if _ = %s; false
@@ -33960,17 +33597,18 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                MaxDropLvl     int16
 
                                //mt:len32
-                               GroupCaps []ToolGroupCaps
+                               GroupCaps []ToolGroupCap
 
                                //mt:len32
                                DmgGroups []Group
 
-                               AttackUses uint16
+                               //mt:32tou16
+                               PunchUses int32
                        }))(obj)).NonNil {
                                {
-                                       local376 := uint8(5)
+                                       local398 := uint8(5)
                                        {
-                                               x := local376
+                                               x := local398
                                                write8(w, uint8(x))
                                        }
                                }
@@ -33983,12 +33621,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                                MaxDropLvl     int16
 
                                                //mt:len32
-                                               GroupCaps []ToolGroupCaps
+                                               GroupCaps []ToolGroupCap
 
                                                //mt:len32
                                                DmgGroups []Group
 
-                                               AttackUses uint16
+                                               //mt:32tou16
+                                               PunchUses int32
                                        }))(obj)).AttackCooldown
                                        write32(w, math.Float32bits(x))
                                }
@@ -34001,12 +33640,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                                MaxDropLvl     int16
 
                                                //mt:len32
-                                               GroupCaps []ToolGroupCaps
+                                               GroupCaps []ToolGroupCap
 
                                                //mt:len32
                                                DmgGroups []Group
 
-                                               AttackUses uint16
+                                               //mt:32tou16
+                                               PunchUses int32
                                        }))(obj)).MaxDropLvl
                                        write16(w, uint16(x))
                                }
@@ -34018,12 +33658,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                        MaxDropLvl     int16
 
                                        //mt:len32
-                                       GroupCaps []ToolGroupCaps
+                                       GroupCaps []ToolGroupCap
 
                                        //mt:len32
                                        DmgGroups []Group
 
-                                       AttackUses uint16
+                                       //mt:32tou16
+                                       PunchUses int32
                                }))(obj)).GroupCaps)) > math.MaxUint32 {
                                        chk(ErrTooLong)
                                }
@@ -34036,16 +33677,17 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                                MaxDropLvl     int16
 
                                                //mt:len32
-                                               GroupCaps []ToolGroupCaps
+                                               GroupCaps []ToolGroupCap
 
                                                //mt:len32
                                                DmgGroups []Group
 
-                                               AttackUses uint16
+                                               //mt:32tou16
+                                               PunchUses int32
                                        }))(obj)).GroupCaps)))
                                        write32(w, uint32(x))
                                }
-                               for local377 := range (*(*(struct {
+                               for local399 := range (*(*(struct {
                                        //mt:if _ = %s; false
                                        NonNil bool
 
@@ -34053,12 +33695,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                        MaxDropLvl     int16
 
                                        //mt:len32
-                                       GroupCaps []ToolGroupCaps
+                                       GroupCaps []ToolGroupCap
 
                                        //mt:len32
                                        DmgGroups []Group
 
-                                       AttackUses uint16
+                                       //mt:32tou16
+                                       PunchUses int32
                                }))(obj)).GroupCaps {
                                        if err := pcall(func() {
                                                (((*(*(struct {
@@ -34069,18 +33712,19 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                                        MaxDropLvl     int16
 
                                                        //mt:len32
-                                                       GroupCaps []ToolGroupCaps
+                                                       GroupCaps []ToolGroupCap
 
                                                        //mt:len32
                                                        DmgGroups []Group
 
-                                                       AttackUses uint16
-                                               }))(obj)).GroupCaps)[local377]).serialize(w)
+                                                       //mt:32tou16
+                                                       PunchUses int32
+                                               }))(obj)).GroupCaps)[local399]).serialize(w)
                                        }); err != nil {
                                                if err == io.EOF {
                                                        chk(io.EOF)
                                                }
-                                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ToolGroupCaps", err))
+                                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ToolGroupCap", err))
                                        }
                                }
                                if len(((*(*(struct {
@@ -34091,12 +33735,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                        MaxDropLvl     int16
 
                                        //mt:len32
-                                       GroupCaps []ToolGroupCaps
+                                       GroupCaps []ToolGroupCap
 
                                        //mt:len32
                                        DmgGroups []Group
 
-                                       AttackUses uint16
+                                       //mt:32tou16
+                                       PunchUses int32
                                }))(obj)).DmgGroups)) > math.MaxUint32 {
                                        chk(ErrTooLong)
                                }
@@ -34109,16 +33754,17 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                                MaxDropLvl     int16
 
                                                //mt:len32
-                                               GroupCaps []ToolGroupCaps
+                                               GroupCaps []ToolGroupCap
 
                                                //mt:len32
                                                DmgGroups []Group
 
-                                               AttackUses uint16
+                                               //mt:32tou16
+                                               PunchUses int32
                                        }))(obj)).DmgGroups)))
                                        write32(w, uint32(x))
                                }
-                               for local378 := range (*(*(struct {
+                               for local400 := range (*(*(struct {
                                        //mt:if _ = %s; false
                                        NonNil bool
 
@@ -34126,12 +33772,13 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                        MaxDropLvl     int16
 
                                        //mt:len32
-                                       GroupCaps []ToolGroupCaps
+                                       GroupCaps []ToolGroupCap
 
                                        //mt:len32
                                        DmgGroups []Group
 
-                                       AttackUses uint16
+                                       //mt:32tou16
+                                       PunchUses int32
                                }))(obj)).DmgGroups {
                                        if err := pcall(func() {
                                                (((*(*(struct {
@@ -34142,13 +33789,14 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                                        MaxDropLvl     int16
 
                                                        //mt:len32
-                                                       GroupCaps []ToolGroupCaps
+                                                       GroupCaps []ToolGroupCap
 
                                                        //mt:len32
                                                        DmgGroups []Group
 
-                                                       AttackUses uint16
-                                               }))(obj)).DmgGroups)[local378]).serialize(w)
+                                                       //mt:32tou16
+                                                       PunchUses int32
+                                               }))(obj)).DmgGroups)[local400]).serialize(w)
                                        }); err != nil {
                                                if err == io.EOF {
                                                        chk(io.EOF)
@@ -34157,7 +33805,7 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                        }
                                }
                                {
-                                       x := (*(*(struct {
+                                       x := uint16((*(*(struct {
                                                //mt:if _ = %s; false
                                                NonNil bool
 
@@ -34165,13 +33813,14 @@ func (obj *ToolCaps) serialize(w io.Writer) {
                                                MaxDropLvl     int16
 
                                                //mt:len32
-                                               GroupCaps []ToolGroupCaps
+                                               GroupCaps []ToolGroupCap
 
                                                //mt:len32
                                                DmgGroups []Group
 
-                                               AttackUses uint16
-                                       }))(obj)).AttackUses
+                                               //mt:32tou16
+                                               PunchUses int32
+                                       }))(obj)).PunchUses)
                                        write16(w, uint16(x))
                                }
                        }
@@ -34203,12 +33852,13 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                MaxDropLvl     int16
 
                //mt:len32
-               GroupCaps []ToolGroupCaps
+               GroupCaps []ToolGroupCap
 
                //mt:len32
                DmgGroups []Group
 
-               AttackUses uint16
+               //mt:32tou16
+               PunchUses int32
        }))(obj)); false {
                {
                        p := &(*(*(struct {
@@ -34219,12 +33869,13 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                MaxDropLvl     int16
 
                                //mt:len32
-                               GroupCaps []ToolGroupCaps
+                               GroupCaps []ToolGroupCap
 
                                //mt:len32
                                DmgGroups []Group
 
-                               AttackUses uint16
+                               //mt:32tou16
+                               PunchUses int32
                        }))(obj)).NonNil
                        switch n := read8(r); n {
                        case 0:
@@ -34242,7 +33893,7 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                        p := &n
                        *p = read16(r)
                }
-               r := &io.LimitedReader{r, int64(n)}
+               r := &io.LimitedReader{R: r, N: int64(n)}
                if r.N > 0 {
                        (*(*(struct {
                                //mt:if _ = %s; false
@@ -34252,12 +33903,13 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                MaxDropLvl     int16
 
                                //mt:len32
-                               GroupCaps []ToolGroupCaps
+                               GroupCaps []ToolGroupCap
 
                                //mt:len32
                                DmgGroups []Group
 
-                               AttackUses uint16
+                               //mt:32tou16
+                               PunchUses int32
                        }))(obj)).NonNil = true
                } /**/
                {
@@ -34269,21 +33921,23 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                MaxDropLvl     int16
 
                                //mt:len32
-                               GroupCaps []ToolGroupCaps
+                               GroupCaps []ToolGroupCap
 
                                //mt:len32
                                DmgGroups []Group
 
-                               AttackUses uint16
+                               //mt:32tou16
+                               PunchUses int32
                        }))(obj)).NonNil {
                                {
-                                       var local379 uint8
+                                       var local401 uint8
+                                       local402 := uint8(5)
                                        {
-                                               p := &local379
+                                               p := &local401
                                                *p = read8(r)
                                        }
-                                       if local379 != (5) {
-                                               chk(fmt.Errorf("const %v: %v", 5, local379))
+                                       if local401 != local402 {
+                                               chk(fmt.Errorf("const %v: %v", "uint8(5)", local401))
                                        }
                                }
                                {
@@ -34295,12 +33949,13 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                                MaxDropLvl     int16
 
                                                //mt:len32
-                                               GroupCaps []ToolGroupCaps
+                                               GroupCaps []ToolGroupCap
 
                                                //mt:len32
                                                DmgGroups []Group
 
-                                               AttackUses uint16
+                                               //mt:32tou16
+                                               PunchUses int32
                                        }))(obj)).AttackCooldown
                                        *p = math.Float32frombits(read32(r))
                                }
@@ -34313,18 +33968,19 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                                MaxDropLvl     int16
 
                                                //mt:len32
-                                               GroupCaps []ToolGroupCaps
+                                               GroupCaps []ToolGroupCap
 
                                                //mt:len32
                                                DmgGroups []Group
 
-                                               AttackUses uint16
+                                               //mt:32tou16
+                                               PunchUses int32
                                        }))(obj)).MaxDropLvl
                                        *p = int16(read16(r))
                                }
-                               var local380 uint32
+                               var local403 uint32
                                {
-                                       p := &local380
+                                       p := &local403
                                        *p = read32(r)
                                }
                                ((*(*(struct {
@@ -34335,14 +33991,15 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                        MaxDropLvl     int16
 
                                        //mt:len32
-                                       GroupCaps []ToolGroupCaps
+                                       GroupCaps []ToolGroupCap
 
                                        //mt:len32
                                        DmgGroups []Group
 
-                                       AttackUses uint16
-                               }))(obj)).GroupCaps) = make([]ToolGroupCaps, local380)
-                               for local381 := range (*(*(struct {
+                                       //mt:32tou16
+                                       PunchUses int32
+                               }))(obj)).GroupCaps) = make([]ToolGroupCap, local403)
+                               for local404 := range (*(*(struct {
                                        //mt:if _ = %s; false
                                        NonNil bool
 
@@ -34350,12 +34007,13 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                        MaxDropLvl     int16
 
                                        //mt:len32
-                                       GroupCaps []ToolGroupCaps
+                                       GroupCaps []ToolGroupCap
 
                                        //mt:len32
                                        DmgGroups []Group
 
-                                       AttackUses uint16
+                                       //mt:32tou16
+                                       PunchUses int32
                                }))(obj)).GroupCaps {
                                        if err := pcall(func() {
                                                (((*(*(struct {
@@ -34366,23 +34024,24 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                                        MaxDropLvl     int16
 
                                                        //mt:len32
-                                                       GroupCaps []ToolGroupCaps
+                                                       GroupCaps []ToolGroupCap
 
                                                        //mt:len32
                                                        DmgGroups []Group
 
-                                                       AttackUses uint16
-                                               }))(obj)).GroupCaps)[local381]).deserialize(r)
+                                                       //mt:32tou16
+                                                       PunchUses int32
+                                               }))(obj)).GroupCaps)[local404]).deserialize(r)
                                        }); err != nil {
                                                if err == io.EOF {
                                                        chk(io.EOF)
                                                }
-                                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ToolGroupCaps", err))
+                                               chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.ToolGroupCap", err))
                                        }
                                }
-                               var local382 uint32
+                               var local405 uint32
                                {
-                                       p := &local382
+                                       p := &local405
                                        *p = read32(r)
                                }
                                ((*(*(struct {
@@ -34393,14 +34052,15 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                        MaxDropLvl     int16
 
                                        //mt:len32
-                                       GroupCaps []ToolGroupCaps
+                                       GroupCaps []ToolGroupCap
 
                                        //mt:len32
                                        DmgGroups []Group
 
-                                       AttackUses uint16
-                               }))(obj)).DmgGroups) = make([]Group, local382)
-                               for local383 := range (*(*(struct {
+                                       //mt:32tou16
+                                       PunchUses int32
+                               }))(obj)).DmgGroups) = make([]Group, local405)
+                               for local406 := range (*(*(struct {
                                        //mt:if _ = %s; false
                                        NonNil bool
 
@@ -34408,12 +34068,13 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                        MaxDropLvl     int16
 
                                        //mt:len32
-                                       GroupCaps []ToolGroupCaps
+                                       GroupCaps []ToolGroupCap
 
                                        //mt:len32
                                        DmgGroups []Group
 
-                                       AttackUses uint16
+                                       //mt:32tou16
+                                       PunchUses int32
                                }))(obj)).DmgGroups {
                                        if err := pcall(func() {
                                                (((*(*(struct {
@@ -34424,13 +34085,14 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                                        MaxDropLvl     int16
 
                                                        //mt:len32
-                                                       GroupCaps []ToolGroupCaps
+                                                       GroupCaps []ToolGroupCap
 
                                                        //mt:len32
                                                        DmgGroups []Group
 
-                                                       AttackUses uint16
-                                               }))(obj)).DmgGroups)[local383]).deserialize(r)
+                                                       //mt:32tou16
+                                                       PunchUses int32
+                                               }))(obj)).DmgGroups)[local406]).deserialize(r)
                                        }); err != nil {
                                                if err == io.EOF {
                                                        chk(io.EOF)
@@ -34438,24 +34100,27 @@ func (obj *ToolCaps) deserialize(r io.Reader) {
                                                chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Group", err))
                                        }
                                }
+                               var local407 uint16
                                {
-                                       p := &(*(*(struct {
-                                               //mt:if _ = %s; false
-                                               NonNil bool
+                                       p := &local407
+                                       *p = read16(r)
+                               }
+                               (*(*(struct {
+                                       //mt:if _ = %s; false
+                                       NonNil bool
 
-                                               AttackCooldown float32
-                                               MaxDropLvl     int16
+                                       AttackCooldown float32
+                                       MaxDropLvl     int16
 
-                                               //mt:len32
-                                               GroupCaps []ToolGroupCaps
+                                       //mt:len32
+                                       GroupCaps []ToolGroupCap
 
-                                               //mt:len32
-                                               DmgGroups []Group
+                                       //mt:len32
+                                       DmgGroups []Group
 
-                                               AttackUses uint16
-                                       }))(obj)).AttackUses
-                                       *p = read16(r)
-                               }
+                                       //mt:32tou16
+                                       PunchUses int32
+                               }))(obj)).PunchUses = int32(local407)
                        }
                }
                if r.N > 0 {
@@ -34478,10 +34143,24 @@ func (obj *AnimType) deserialize(r io.Reader) {
        }
 }
 
+func (obj *HUDType) serialize(w io.Writer) {
+       {
+               x := *(*(uint8))(obj)
+               write8(w, uint8(x))
+       }
+}
+
+func (obj *HUDType) deserialize(r io.Reader) {
+       {
+               p := &*(*(uint8))(obj)
+               *p = read8(r)
+       }
+}
+
 func (obj *Box) serialize(w io.Writer) {
-       for local384 := range *(*([2]Vec))(obj) {
+       for local408 := range *(*([2]Vec))(obj) {
                if err := pcall(func() {
-                       ((*(*([2]Vec))(obj))[local384]).serialize(w)
+                       ((*(*([2]Vec))(obj))[local408]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34492,9 +34171,9 @@ func (obj *Box) serialize(w io.Writer) {
 }
 
 func (obj *Box) deserialize(r io.Reader) {
-       for local385 := range *(*([2]Vec))(obj) {
+       for local409 := range *(*([2]Vec))(obj) {
                if err := pcall(func() {
-                       ((*(*([2]Vec))(obj))[local385]).deserialize(r)
+                       ((*(*([2]Vec))(obj))[local409]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34560,7 +34239,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                }))(obj)).Top)))
                write16(w, uint16(x))
        }
-       for local386 := range (*(*(struct {
+       for local410 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Top {
@@ -34568,7 +34247,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Top)[local386]).serialize(w)
+                       }))(obj)).Top)[local410]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34589,7 +34268,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                }))(obj)).Bot)))
                write16(w, uint16(x))
        }
-       for local387 := range (*(*(struct {
+       for local411 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Bot {
@@ -34597,7 +34276,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Bot)[local387]).serialize(w)
+                       }))(obj)).Bot)[local411]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34618,7 +34297,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                }))(obj)).Front)))
                write16(w, uint16(x))
        }
-       for local388 := range (*(*(struct {
+       for local412 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Front {
@@ -34626,7 +34305,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Front)[local388]).serialize(w)
+                       }))(obj)).Front)[local412]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34647,7 +34326,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                }))(obj)).Left)))
                write16(w, uint16(x))
        }
-       for local389 := range (*(*(struct {
+       for local413 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Left {
@@ -34655,7 +34334,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Left)[local389]).serialize(w)
+                       }))(obj)).Left)[local413]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34676,7 +34355,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                }))(obj)).Back)))
                write16(w, uint16(x))
        }
-       for local390 := range (*(*(struct {
+       for local414 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Back {
@@ -34684,7 +34363,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Back)[local390]).serialize(w)
+                       }))(obj)).Back)[local414]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34705,7 +34384,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                }))(obj)).Right)))
                write16(w, uint16(x))
        }
-       for local391 := range (*(*(struct {
+       for local415 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Right {
@@ -34713,7 +34392,7 @@ func (obj *DirBoxes) serialize(w io.Writer) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Right)[local391]).serialize(w)
+                       }))(obj)).Right)[local415]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34724,16 +34403,16 @@ func (obj *DirBoxes) serialize(w io.Writer) {
 }
 
 func (obj *DirBoxes) deserialize(r io.Reader) {
-       var local392 uint16
+       var local416 uint16
        {
-               p := &local392
+               p := &local416
                *p = read16(r)
        }
        ((*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
-       }))(obj)).Top) = make([]Box, local392)
-       for local393 := range (*(*(struct {
+       }))(obj)).Top) = make([]Box, local416)
+       for local417 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Top {
@@ -34741,7 +34420,7 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Top)[local393]).deserialize(r)
+                       }))(obj)).Top)[local417]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34749,16 +34428,16 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
                }
        }
-       var local394 uint16
+       var local418 uint16
        {
-               p := &local394
+               p := &local418
                *p = read16(r)
        }
        ((*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
-       }))(obj)).Bot) = make([]Box, local394)
-       for local395 := range (*(*(struct {
+       }))(obj)).Bot) = make([]Box, local418)
+       for local419 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Bot {
@@ -34766,7 +34445,7 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Bot)[local395]).deserialize(r)
+                       }))(obj)).Bot)[local419]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34774,16 +34453,16 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
                }
        }
-       var local396 uint16
+       var local420 uint16
        {
-               p := &local396
+               p := &local420
                *p = read16(r)
        }
        ((*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
-       }))(obj)).Front) = make([]Box, local396)
-       for local397 := range (*(*(struct {
+       }))(obj)).Front) = make([]Box, local420)
+       for local421 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Front {
@@ -34791,7 +34470,7 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Front)[local397]).deserialize(r)
+                       }))(obj)).Front)[local421]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34799,16 +34478,16 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
                }
        }
-       var local398 uint16
+       var local422 uint16
        {
-               p := &local398
+               p := &local422
                *p = read16(r)
        }
        ((*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
-       }))(obj)).Left) = make([]Box, local398)
-       for local399 := range (*(*(struct {
+       }))(obj)).Left) = make([]Box, local422)
+       for local423 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Left {
@@ -34816,7 +34495,7 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Left)[local399]).deserialize(r)
+                       }))(obj)).Left)[local423]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34824,16 +34503,16 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
                }
        }
-       var local400 uint16
+       var local424 uint16
        {
-               p := &local400
+               p := &local424
                *p = read16(r)
        }
        ((*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
-       }))(obj)).Back) = make([]Box, local400)
-       for local401 := range (*(*(struct {
+       }))(obj)).Back) = make([]Box, local424)
+       for local425 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Back {
@@ -34841,7 +34520,7 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Back)[local401]).deserialize(r)
+                       }))(obj)).Back)[local425]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34849,16 +34528,16 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        chk(fmt.Errorf("%s: %w", "github.com/anon55555/mt.Box", err))
                }
        }
-       var local402 uint16
+       var local426 uint16
        {
-               p := &local402
+               p := &local426
                *p = read16(r)
        }
        ((*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
-       }))(obj)).Right) = make([]Box, local402)
-       for local403 := range (*(*(struct {
+       }))(obj)).Right) = make([]Box, local426)
+       for local427 := range (*(*(struct {
                Top, Bot                 []Box
                Front, Left, Back, Right []Box
        }))(obj)).Right {
@@ -34866,7 +34545,7 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
                        (((*(*(struct {
                                Top, Bot                 []Box
                                Front, Left, Back, Right []Box
-                       }))(obj)).Right)[local403]).deserialize(r)
+                       }))(obj)).Right)[local427]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34876,10 +34555,13 @@ func (obj *DirBoxes) deserialize(r io.Reader) {
        }
 }
 
-func (obj *ToolGroupCaps) serialize(w io.Writer) {
+func (obj *ToolGroupCap) serialize(w io.Writer) {
        if len(([]byte((*(*(struct {
-               Name   string
-               Uses   int16
+               Name string
+
+               //mt:32to16
+               Uses int32
+
                MaxLvl int16
 
                //mt:len32
@@ -34889,8 +34571,11 @@ func (obj *ToolGroupCaps) serialize(w io.Writer) {
        }
        {
                x := uint16(len(([]byte((*(*(struct {
-                       Name   string
-                       Uses   int16
+                       Name string
+
+                       //mt:32to16
+                       Uses int32
+
                        MaxLvl int16
 
                        //mt:len32
@@ -34900,8 +34585,11 @@ func (obj *ToolGroupCaps) serialize(w io.Writer) {
        }
        {
                _, err := w.Write(([]byte((*(*(struct {
-                       Name   string
-                       Uses   int16
+                       Name string
+
+                       //mt:32to16
+                       Uses int32
+
                        MaxLvl int16
 
                        //mt:len32
@@ -34910,20 +34598,26 @@ func (obj *ToolGroupCaps) serialize(w io.Writer) {
                chk(err)
        }
        {
-               x := (*(*(struct {
-                       Name   string
-                       Uses   int16
+               x := int16((*(*(struct {
+                       Name string
+
+                       //mt:32to16
+                       Uses int32
+
                        MaxLvl int16
 
                        //mt:len32
                        Times []DigTime
-               }))(obj)).Uses
+               }))(obj)).Uses)
                write16(w, uint16(x))
        }
        {
                x := (*(*(struct {
-                       Name   string
-                       Uses   int16
+                       Name string
+
+                       //mt:32to16
+                       Uses int32
+
                        MaxLvl int16
 
                        //mt:len32
@@ -34932,8 +34626,11 @@ func (obj *ToolGroupCaps) serialize(w io.Writer) {
                write16(w, uint16(x))
        }
        if len(((*(*(struct {
-               Name   string
-               Uses   int16
+               Name string
+
+               //mt:32to16
+               Uses int32
+
                MaxLvl int16
 
                //mt:len32
@@ -34943,8 +34640,11 @@ func (obj *ToolGroupCaps) serialize(w io.Writer) {
        }
        {
                x := uint32(len(((*(*(struct {
-                       Name   string
-                       Uses   int16
+                       Name string
+
+                       //mt:32to16
+                       Uses int32
+
                        MaxLvl int16
 
                        //mt:len32
@@ -34952,9 +34652,12 @@ func (obj *ToolGroupCaps) serialize(w io.Writer) {
                }))(obj)).Times)))
                write32(w, uint32(x))
        }
-       for local404 := range (*(*(struct {
-               Name   string
-               Uses   int16
+       for local428 := range (*(*(struct {
+               Name string
+
+               //mt:32to16
+               Uses int32
+
                MaxLvl int16
 
                //mt:len32
@@ -34962,13 +34665,16 @@ func (obj *ToolGroupCaps) serialize(w io.Writer) {
        }))(obj)).Times {
                if err := pcall(func() {
                        (((*(*(struct {
-                               Name   string
-                               Uses   int16
+                               Name string
+
+                               //mt:32to16
+                               Uses int32
+
                                MaxLvl int16
 
                                //mt:len32
                                Times []DigTime
-                       }))(obj)).Times)[local404]).serialize(w)
+                       }))(obj)).Times)[local428]).serialize(w)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
@@ -34978,41 +34684,52 @@ func (obj *ToolGroupCaps) serialize(w io.Writer) {
        }
 }
 
-func (obj *ToolGroupCaps) deserialize(r io.Reader) {
-       var local405 []uint8
-       var local406 uint16
+func (obj *ToolGroupCap) deserialize(r io.Reader) {
+       var local429 []uint8
+       var local430 uint16
        {
-               p := &local406
+               p := &local430
                *p = read16(r)
        }
-       (local405) = make([]uint8, local406)
+       (local429) = make([]uint8, local430)
        {
-               _, err := io.ReadFull(r, (local405)[:])
+               _, err := io.ReadFull(r, (local429)[:])
                chk(err)
        }
        ((*(*(struct {
-               Name   string
-               Uses   int16
+               Name string
+
+               //mt:32to16
+               Uses int32
+
                MaxLvl int16
 
                //mt:len32
                Times []DigTime
-       }))(obj)).Name) = string(local405)
+       }))(obj)).Name) = string(local429)
+       var local431 int16
        {
-               p := &(*(*(struct {
-                       Name   string
-                       Uses   int16
-                       MaxLvl int16
-
-                       //mt:len32
-                       Times []DigTime
-               }))(obj)).Uses
+               p := &local431
                *p = int16(read16(r))
        }
+       (*(*(struct {
+               Name string
+
+               //mt:32to16
+               Uses int32
+
+               MaxLvl int16
+
+               //mt:len32
+               Times []DigTime
+       }))(obj)).Uses = int32(local431)
        {
                p := &(*(*(struct {
-                       Name   string
-                       Uses   int16
+                       Name string
+
+                       //mt:32to16
+                       Uses int32
+
                        MaxLvl int16
 
                        //mt:len32
@@ -35020,22 +34737,28 @@ func (obj *ToolGroupCaps) deserialize(r io.Reader) {
                }))(obj)).MaxLvl
                *p = int16(read16(r))
        }
-       var local407 uint32
+       var local432 uint32
        {
-               p := &local407
+               p := &local432
                *p = read32(r)
        }
        ((*(*(struct {
-               Name   string
-               Uses   int16
+               Name string
+
+               //mt:32to16
+               Uses int32
+
                MaxLvl int16
 
                //mt:len32
                Times []DigTime
-       }))(obj)).Times) = make([]DigTime, local407)
-       for local408 := range (*(*(struct {
-               Name   string
-               Uses   int16
+       }))(obj)).Times) = make([]DigTime, local432)
+       for local433 := range (*(*(struct {
+               Name string
+
+               //mt:32to16
+               Uses int32
+
                MaxLvl int16
 
                //mt:len32
@@ -35043,13 +34766,16 @@ func (obj *ToolGroupCaps) deserialize(r io.Reader) {
        }))(obj)).Times {
                if err := pcall(func() {
                        (((*(*(struct {
-                               Name   string
-                               Uses   int16
+                               Name string
+
+                               //mt:32to16
+                               Uses int32
+
                                MaxLvl int16
 
                                //mt:len32
                                Times []DigTime
-                       }))(obj)).Times)[local408]).deserialize(r)
+                       }))(obj)).Times)[local433]).deserialize(r)
                }); err != nil {
                        if err == io.EOF {
                                chk(io.EOF)
index d9306047d94687cb7ecabda8f0dacbb82709d60d..8cf3aa84a314d7a714380f27ae0789348a355c6a 100644 (file)
--- a/stack.go
+++ b/stack.go
@@ -1,6 +1,6 @@
 // In this file, JSON refers to WTF-JSON.
 //
-// BUG(mt): Itemstrings use variant of JSON called WTF-JSON
+// BUG(mt): Stackstrings use variant of JSON called WTF-JSON
 // where \u00XX escapes in string literals act like Go's \xXX escapes.
 // This should not be fixed because it would break existing items.
 
@@ -25,10 +25,7 @@ type Item struct {
        ItemMeta
 }
 
-// String returns the Stack's itemstring.
-//
-// BUG(mt): The term itemstring is somewhat misleading, because
-// an itemstring represents a stack of items, not a single item.
+// String returns the Stack's stackstring.
 func (s Stack) String() string {
        if s.Count == 0 {
                return ""
@@ -90,7 +87,7 @@ func jsonStr(s string) string {
        return b.String()
 }
 
-// Scan scans an itemstring, implementing the fmt.Scanner interface.
+// Scan scans a stackstring, implementing the fmt.Scanner interface.
 func (stk *Stack) Scan(state fmt.ScanState, verb rune) (err error) {
        *stk = Stack{}
 
index 0dd5e7d1c42585913a07484a0a319c1a1e42a48f..b9b8e2bc24cd9663342bd9d3ae70304bd12d7479 100644 (file)
--- a/tocltcmds
+++ b/tocltcmds
@@ -2,7 +2,7 @@
 3      AcceptAuth
 4      AcceptSudoMode
 5      DenySudoMode
-10     Disco
+10     Kick
 32     BlkData
 33     AddNode
 34     RemoveNode
@@ -16,7 +16,7 @@
 50     AOMsgs
 51     HP
 52     MovePlayer
-53     DiscoLegacy
+53     LegacyKick
 54     FOV
 55     DeathScreen
 56     Media
index 14e42995a4409ac7d0c60fdedbb8b467ce08b7f2..ff18e0ae459875656d59f066a58cff5453f7161e 100644 (file)
@@ -6,6 +6,8 @@ import (
        "image/color"
        "io"
        "math"
+
+       "github.com/anon55555/mt/rudp"
 )
 
 type ToCltCmd interface {
@@ -38,14 +40,17 @@ type ToCltAcceptAuth struct {
        SudoAuthMethods AuthMethods
 }
 
-type ToCltAcceptSudoMode struct{}
+type ToCltAcceptSudoMode struct {
+       SudoAuthMethods AuthMethods
+       //mt:const [15]byte{}
+}
 
 type ToCltDenySudoMode struct{}
 
-// ToCltDisco tells that the client that it has been disconnected by the server.
-type ToCltDisco struct {
-       Reason DiscoReason
-       //mt:assert %s.Reason < maxDiscoReason
+// ToCltKick tells that the client that it has been kicked by the server.
+type ToCltKick struct {
+       Reason KickReason
+       //mt:assert %s.Reason < maxKickReason
 
        //mt:if dr := %s.Reason; dr == Custom || dr == Shutdown || dr == Crash
        Custom string
@@ -56,10 +61,11 @@ type ToCltDisco struct {
        //mt:end
 }
 
-type DiscoReason uint8
+// A KickReason is the reason a ToCltKick has been sent.
+type KickReason uint8
 
 const (
-       WrongPasswd DiscoReason = iota
+       WrongPasswd KickReason = iota
        UnexpectedData
        SrvIsSingleplayer
        UnsupportedVer
@@ -72,10 +78,10 @@ const (
        Custom
        Shutdown
        Crash
-       maxDiscoReason
+       maxKickReason
 )
 
-func (cmd ToCltDisco) String() (msg string) {
+func (cmd ToCltKick) String() (msg string) {
        switch cmd.Reason {
        case WrongPasswd:
                return "wrong password"
@@ -104,7 +110,7 @@ func (cmd ToCltDisco) String() (msg string) {
        case Crash:
                msg = "server crash"
        default:
-               msg = fmt.Sprintf("DiscoReason(%d)", cmd.Reason)
+               msg = fmt.Sprintf("KickReason(%d)", cmd.Reason)
        }
 
        if cmd.Custom != "" {
@@ -209,13 +215,15 @@ const (
 // the AOs that it can see.
 type ToCltAORmAdd struct {
        Remove []AOID
-       Add    []struct {
-               ID AOID
-               //mt:const genericCAO
-               //mt:lenhdr 32
-               InitData AOInitData
-               //mt:end
-       }
+       Add    []AOAdd
+}
+
+type AOAdd struct {
+       ID AOID
+       //mt:const genericCAO
+       //mt:lenhdr 32
+       InitData AOInitData
+       //mt:end
 }
 
 // ToCltAOMsgs updates the client about nearby AOs.
@@ -235,7 +243,7 @@ type ToCltMovePlayer struct {
        Pitch, Yaw float32
 }
 
-type ToCltDiscoLegacy struct {
+type ToCltLegacyKick struct {
        //mt:utf16
        Reason string
 }
@@ -409,12 +417,7 @@ type ToCltAddParticleSpawner struct {
        NodeTile     uint8
 }
 
-type HUDID uint32
-
-// ToCltHUDAdd tells the client to add a HUD.
-type ToCltAddHUD struct {
-       ID HUDID
-
+type HUD struct {
        Type HUDType
 
        Pos      [2]float32
@@ -432,6 +435,14 @@ type ToCltAddHUD struct {
        Text2    string
 }
 
+type HUDID uint32
+
+// ToCltHUDAdd tells the client to add a HUD.
+type ToCltAddHUD struct {
+       ID HUDID
+       HUD
+}
+
 type HUDType uint8
 
 const (
@@ -503,7 +514,7 @@ type ToCltChangeHUD struct {
        //mt:end
 
        //mt:if %s.Field == HUDZIndex
-       ZIndex uint32
+       ZIndex int32
        //mt:end
 
        //mt:if %s.Field == HUDText2
@@ -759,3 +770,9 @@ func (cmd *ToCltMinimapModes) deserialize(r io.Reader) {
                chk(deserialize(r, &cmd.Modes[i]))
        }
 }
+
+type ToCltDisco struct{}
+
+func (*ToCltDisco) cmd()                         {}
+func (*ToCltDisco) toCltCmdNo() uint16           { return 0xffff }
+func (*ToCltDisco) DefaultPktInfo() rudp.PktInfo { return rudp.PktInfo{} }
index 0dbe4e402babb7d442e2343e3cfdd25605030e5e..c96501e16a2a6af2d2cc08e7a8b730984f336585 100644 (file)
@@ -6,7 +6,7 @@ func (*ToCltHello) toCltCmdNo() uint16                 { return 2 }
 func (*ToCltAcceptAuth) toCltCmdNo() uint16            { return 3 }
 func (*ToCltAcceptSudoMode) toCltCmdNo() uint16        { return 4 }
 func (*ToCltDenySudoMode) toCltCmdNo() uint16          { return 5 }
-func (*ToCltDisco) toCltCmdNo() uint16                 { return 10 }
+func (*ToCltKick) toCltCmdNo() uint16                  { return 10 }
 func (*ToCltBlkData) toCltCmdNo() uint16               { return 32 }
 func (*ToCltAddNode) toCltCmdNo() uint16               { return 33 }
 func (*ToCltRemoveNode) toCltCmdNo() uint16            { return 34 }
@@ -20,7 +20,7 @@ func (*ToCltAORmAdd) toCltCmdNo() uint16               { return 49 }
 func (*ToCltAOMsgs) toCltCmdNo() uint16                { return 50 }
 func (*ToCltHP) toCltCmdNo() uint16                    { return 51 }
 func (*ToCltMovePlayer) toCltCmdNo() uint16            { return 52 }
-func (*ToCltDiscoLegacy) toCltCmdNo() uint16           { return 53 }
+func (*ToCltLegacyKick) toCltCmdNo() uint16            { return 53 }
 func (*ToCltFOV) toCltCmdNo() uint16                   { return 54 }
 func (*ToCltDeathScreen) toCltCmdNo() uint16           { return 55 }
 func (*ToCltMedia) toCltCmdNo() uint16                 { return 56 }
@@ -65,7 +65,7 @@ var newToCltCmd = map[uint16]func() Cmd{
        3:  func() Cmd { return new(ToCltAcceptAuth) },
        4:  func() Cmd { return new(ToCltAcceptSudoMode) },
        5:  func() Cmd { return new(ToCltDenySudoMode) },
-       10: func() Cmd { return new(ToCltDisco) },
+       10: func() Cmd { return new(ToCltKick) },
        32: func() Cmd { return new(ToCltBlkData) },
        33: func() Cmd { return new(ToCltAddNode) },
        34: func() Cmd { return new(ToCltRemoveNode) },
@@ -79,7 +79,7 @@ var newToCltCmd = map[uint16]func() Cmd{
        50: func() Cmd { return new(ToCltAOMsgs) },
        51: func() Cmd { return new(ToCltHP) },
        52: func() Cmd { return new(ToCltMovePlayer) },
-       53: func() Cmd { return new(ToCltDiscoLegacy) },
+       53: func() Cmd { return new(ToCltLegacyKick) },
        54: func() Cmd { return new(ToCltFOV) },
        55: func() Cmd { return new(ToCltDeathScreen) },
        56: func() Cmd { return new(ToCltMedia) },
index 7bf6c09afe9c100908cdc3f2261347dc330af8cb..7684de2b6a83a54a99d16c2c718abebd355125ad 100644 (file)
@@ -1,5 +1,10 @@
 package mt
 
+import (
+       "math"
+       "time"
+)
+
 type ToolCaps struct {
        //mt:if _ = %s; false
        NonNil bool
@@ -18,12 +23,13 @@ type ToolCaps struct {
        MaxDropLvl     int16
 
        //mt:len32
-       GroupCaps []ToolGroupCaps
+       GroupCaps []ToolGroupCap
 
        //mt:len32
        DmgGroups []Group
 
-       AttackUses uint16
+       //mt:32tou16
+       PunchUses int32
 
        //mt:end
        //mt:end
@@ -31,9 +37,12 @@ type ToolCaps struct {
        //mt:end
 }
 
-type ToolGroupCaps struct {
-       Name   string
-       Uses   int16
+type ToolGroupCap struct {
+       Name string
+
+       //mt:32to16
+       Uses int32
+
        MaxLvl int16
 
        //mt:len32
@@ -44,3 +53,44 @@ type DigTime struct {
        Rating int16
        Time   float32
 }
+
+func (tc ToolCaps) DigTime(groups map[string]int16) (time.Duration, bool) {
+       immDig := groups["dig_immediate"]
+
+       minTime := float32(math.Inf(1))
+
+       lvl := groups["level"]
+       for _, gc := range tc.GroupCaps {
+               if gc.Name == "dig_immediate" {
+                       immDig = 0
+               }
+
+               if lvl > gc.MaxLvl {
+                       continue
+               }
+
+               r := groups[gc.Name]
+               for _, dt := range gc.Times {
+                       t := dt.Time
+                       if lvl < gc.MaxLvl {
+                               t /= float32(gc.MaxLvl - lvl)
+                       }
+                       if dt.Rating == r && t < minTime {
+                               minTime = t
+                       }
+               }
+       }
+
+       switch immDig {
+       case 2:
+               return time.Second / 2, true
+       case 3:
+               return 0, true
+       }
+
+       if math.IsInf(float64(minTime), 1) {
+               return 0, false
+       }
+
+       return time.Duration(math.Ceil(float64(minTime) * float64(time.Second))), true
+}
diff --git a/toolcaps_json.go b/toolcaps_json.go
new file mode 100644 (file)
index 0000000..23ecb81
--- /dev/null
@@ -0,0 +1,225 @@
+package mt
+
+import (
+       "bytes"
+       "encoding/json"
+       "errors"
+       "fmt"
+       "strconv"
+)
+
+func (tc ToolCaps) String() string {
+       b, err := tc.MarshalJSON()
+       if err != nil {
+               panic(err)
+       }
+
+       return string(b)
+}
+
+func (tc ToolCaps) MarshalJSON() ([]byte, error) {
+       if !tc.NonNil {
+               return []byte("null"), nil
+       }
+
+       var dgs bytes.Buffer
+       dgs.WriteByte('{')
+       e := json.NewEncoder(&dgs)
+       for i, dg := range tc.DmgGroups {
+               e.Encode(dg.Name)
+               dgs.WriteByte(':')
+               e.Encode(dg.Rating)
+               if i < len(tc.DmgGroups)-1 {
+                       dgs.WriteByte(',')
+               }
+       }
+       dgs.WriteByte('}')
+
+       var gcs bytes.Buffer
+       gcs.WriteByte('{')
+       e = json.NewEncoder(&gcs)
+       for i, gc := range tc.GroupCaps {
+               var maxRating int16
+               for _, t := range gc.Times {
+                       if t.Rating >= maxRating {
+                               maxRating = t.Rating + 1
+                       }
+               }
+
+               times := make([]interface{}, maxRating)
+               for _, t := range gc.Times {
+                       times[t.Rating] = fmtFloat(t.Time)
+               }
+
+               e.Encode(gc.Name)
+               gcs.WriteByte(':')
+               e.Encode(map[string]interface{}{
+                       "uses":     gc.Uses,
+                       "maxlevel": gc.MaxLvl,
+                       "times":    times,
+               })
+               if i < len(tc.GroupCaps)-1 {
+                       gcs.WriteByte(',')
+               }
+       }
+       gcs.WriteByte('}')
+
+       return json.Marshal(map[string]interface{}{
+               "damage_groups":       json.RawMessage(dgs.Bytes()),
+               "full_punch_interval": fmtFloat(tc.AttackCooldown),
+               "groupcaps":           json.RawMessage(gcs.Bytes()),
+               "max_drop_level":      tc.MaxDropLvl,
+               "punch_attack_uses":   tc.PunchUses,
+       })
+}
+
+func (tc *ToolCaps) UnmarshalJSON(data []byte) error {
+       d := json.NewDecoder(bytes.NewReader(data))
+
+       t, err := d.Token()
+       if err != nil {
+               return err
+       }
+       if t == nil {
+               *tc = ToolCaps{}
+               return nil
+       }
+       if d, ok := t.(json.Delim); !ok || d != '{' {
+               return errors.New("not an object")
+       }
+       for d.More() {
+               t, err := d.Token()
+               if err != nil {
+                       return err
+               }
+               key := t.(string)
+
+               err = nil
+               switch key {
+               case "full_punch_interval":
+                       err = d.Decode(&tc.AttackCooldown)
+               case "max_drop_level":
+                       err = d.Decode(&tc.MaxDropLvl)
+               case "groupcaps":
+                       tc.GroupCaps = nil
+
+                       t, err := d.Token()
+                       if err != nil {
+                               return fmt.Errorf("groupcaps: %w", err)
+                       }
+                       if d, ok := t.(json.Delim); !ok || d != '{' {
+                               return errors.New("groupcaps: not an object")
+                       }
+                       for d.More() {
+                               var gc ToolGroupCap
+
+                               t, err := d.Token()
+                               if err != nil {
+                                       return fmt.Errorf("groupcaps: %w", err)
+                               }
+                               gc.Name = t.(string)
+
+                               t, err = d.Token()
+                               if err != nil {
+                                       return fmt.Errorf("groupcaps: %w", err)
+                               }
+                               if d, ok := t.(json.Delim); !ok || d != '{' {
+                                       return errors.New("groupcaps: not an object")
+                               }
+                               for d.More() {
+                                       t, err := d.Token()
+                                       if err != nil {
+                                               return fmt.Errorf("groupcaps: %w", err)
+                                       }
+                                       key := t.(string)
+
+                                       err = nil
+                                       switch key {
+                                       case "uses":
+                                               err = d.Decode(&gc.Uses)
+                                       case "maxlevel":
+                                               err = d.Decode(&gc.MaxLvl)
+                                       case "times":
+                                               gc.Times = nil
+
+                                               t, err := d.Token()
+                                               if err != nil {
+                                                       return fmt.Errorf("groupcaps: times: %w", err)
+                                               }
+                                               if d, ok := t.(json.Delim); !ok || d != '[' {
+                                                       return errors.New("groupcaps: times: not an array")
+                                               }
+                                               for i := int16(0); d.More(); i++ {
+                                                       t, err := d.Token()
+                                                       if err != nil {
+                                                               return fmt.Errorf("groupcaps: times: %w", err)
+                                                       }
+                                                       switch t := t.(type) {
+                                                       case nil:
+                                                       case float64:
+                                                               gc.Times = append(gc.Times, DigTime{i, float32(t)})
+                                                       default:
+                                                               return errors.New("groupcaps: times: not null or a number")
+                                                       }
+                                               }
+                                               _, err = d.Token()
+                                       }
+                                       if err != nil {
+                                               return fmt.Errorf("groupcaps: %s: %w", key, err)
+                                       }
+                               }
+                               if _, err := d.Token(); err != nil {
+                                       return err
+                               }
+                               tc.GroupCaps = append(tc.GroupCaps, gc)
+                       }
+                       _, err = d.Token()
+               case "damage_groups":
+                       tc.DmgGroups = nil
+
+                       t, err := d.Token()
+                       if err != nil {
+                               return fmt.Errorf("damage_groups: %w", err)
+                       }
+                       if d, ok := t.(json.Delim); !ok || d != '{' {
+                               return errors.New("damage_groups: not an object")
+                       }
+                       for d.More() {
+                               var g Group
+
+                               t, err := d.Token()
+                               if err != nil {
+                                       return err
+                               }
+                               g.Name = t.(string)
+
+                               if err := d.Decode(&g.Rating); err != nil {
+                                       return fmt.Errorf("damage_groups: %w", err)
+                               }
+
+                               tc.DmgGroups = append(tc.DmgGroups, g)
+                       }
+                       _, err = d.Token()
+               case "punch_attack_uses":
+                       err = d.Decode(&tc.PunchUses)
+               }
+               if err != nil {
+                       return fmt.Errorf("%s: %w", key, err)
+               }
+       }
+       if _, err := d.Token(); err != nil {
+               return err
+       }
+
+       tc.NonNil = true
+       return nil
+}
+
+func fmtFloat(f float32) json.Number {
+       buf := make([]byte, 0, 24)
+       buf = strconv.AppendFloat(buf, float64(f), 'g', 17, 32)
+       if !bytes.ContainsRune(buf, '.') {
+               buf = append(buf, '.', '0')
+       }
+       return json.Number(buf)
+}
index de80b1228d895d4c9ab35f7c7a4386ac1209a212..885f2006239cd15a5fff6241a1de9bb9b33c6215 100644 (file)
@@ -1,5 +1,7 @@
 package mt
 
+import "github.com/anon55555/mt/rudp"
+
 type ToSrvCmd interface {
        Cmd
        toSrvCmdNo() uint16
@@ -35,12 +37,12 @@ type ToSrvJoinModChan struct {
        Channel string
 }
 
-// ToSrvJoinModChan attempts to leave a mod channel.
+// ToSrvLeaveModChan attempts to leave a mod channel.
 type ToSrvLeaveModChan struct {
        Channel string
 }
 
-// ToSrvJoinModChan sends a message on a mod channel.
+// ToSrvMsgModChan sends a message on a mod channel.
 type ToSrvMsgModChan struct {
        Channel string
        Msg     string
@@ -155,3 +157,9 @@ type ToSrvSRPBytesA struct {
 type ToSrvSRPBytesM struct {
        M []byte
 }
+
+type ToSrvDisco struct{}
+
+func (*ToSrvDisco) cmd()                         {}
+func (*ToSrvDisco) toSrvCmdNo() uint16           { return 0xffff }
+func (*ToSrvDisco) DefaultPktInfo() rudp.PktInfo { return rudp.PktInfo{} }