diff options
-rw-r--r-- | client_conn.go | 2 | ||||
-rw-r--r-- | content.go | 2 | ||||
-rw-r--r-- | server_conn.go | 85 | ||||
-rw-r--r-- | toolcaps.go | 21 |
4 files changed, 74 insertions, 36 deletions
diff --git a/client_conn.go b/client_conn.go index 02e5445..417cfe2 100644 --- a/client_conn.go +++ b/client_conn.go @@ -466,8 +466,6 @@ func handleClt(cc *clientConn) { case *mt.ToSrvReqMedia: cc.sendMedia(cmd.Filenames) case *mt.ToSrvCltReady: - cc.log("-->", "ready") - cc.major = cmd.Major cc.minor = cmd.Minor cc.patch = cmd.Patch @@ -66,8 +66,6 @@ func handleContent(cc *contentConn) { if errors.Is(err, net.ErrClosed) { if errors.Is(cc.WhyClosed(), rudp.ErrTimedOut) { cc.log("<->", "timeout") - } else { - cc.log("<->", "disconnect") } break } diff --git a/server_conn.go b/server_conn.go index a3c1653..f8e7dec 100644 --- a/server_conn.go +++ b/server_conn.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "net" + "strings" "time" "github.com/HimbeerserverDE/srp" @@ -46,7 +47,7 @@ func handleSrv(sc *serverConn) { } go func() { - for sc.state == csCreated { + for sc.state == csCreated && sc.client() != nil { sc.SendCmd(&mt.ToSrvInit{ SerializeVer: latestSerializeVer, MinProtoVer: latestProtoVer, @@ -66,6 +67,21 @@ func handleSrv(sc *serverConn) { } else { sc.log("<->", "disconnect") } + + if sc.client() != nil { + ack, _ := sc.client().SendCmd(&mt.ToCltDisco{ + Reason: mt.Custom, + Custom: "Server connection closed unexpectedly.", + }) + + select { + case <-sc.client().Closed(): + case <-ack: + sc.client().Close() + sc.clt = nil + } + } + break } @@ -151,6 +167,7 @@ func handleSrv(sc *serverConn) { case <-sc.client().Closed(): case <-ack: sc.client().Close() + sc.clt = nil } case *mt.ToCltAcceptAuth: sc.auth.method = 0 @@ -162,50 +179,74 @@ func handleSrv(sc *serverConn) { sc.state++ case *mt.ToCltAnnounceMedia: sc.SendCmd(&mt.ToSrvReqMedia{}) - case *mt.ToCltMedia: - if sc.state == csInit && cmd.I == cmd.N-1 { - sc.SendCmd(&mt.ToSrvCltReady{ - Major: sc.client().major, - Minor: sc.client().minor, - Patch: sc.client().patch, - Reserved: sc.client().reservedVer, - Version: sc.client().versionStr, - Formspec: sc.client().formspecVer, - }) - sc.state++ - close(sc.initCh) - } + sc.SendCmd(&mt.ToSrvCltReady{ + Major: sc.client().major, + Minor: sc.client().minor, + Patch: sc.client().patch, + Reserved: sc.client().reservedVer, + Version: sc.client().versionStr, + Formspec: sc.client().formspecVer, + }) + + sc.log("<->", "handshake completed") + sc.state++ + close(sc.initCh) case *mt.ToCltInv: var inv mt.Inv inv.Deserialize(strings.NewReader(cmd.Inv)) + for k, l := range inv { + for i, s := range l.Stacks { + inv[k].InvList.Stacks[i].Name = sc.name + "_" + s.Name + } + } + + var t mt.ToolCaps + for _, iDef := range sc.client().itemDefs { + if iDef.Name == sc.name+"_hand" { + t = iDef.ToolCaps + break + } + } + + var tc ToolCaps + tc.fromMT(t) + + b := &strings.Builder{} + tc.SerializeJSON(b) + fields := []mt.Field{ - mt.Field{ - Name: " + { + Name: "tool_capabilities", + Value: b.String(), }, } meta := mt.NewItemMeta(fields) handStack := mt.Stack{ - Name: sc.name + "_hand", - ItemMeta: meta, + Item: mt.Item{ + Name: sc.name + "_hand", + ItemMeta: meta, + }, Count: 1, } hand := inv.List("hand") if hand == nil { inv = append(inv, mt.NamedInvList{ - Name: "hand", - Width: 1, - Stacks: []mt.Stack{handStack}, + Name: "hand", + InvList: mt.InvList{ + Width: 1, + Stacks: []mt.Stack{handStack}, + }, }) } else if len(hand.Stacks) == 0 { hand.Width = 1 hand.Stacks = []mt.Stack{handStack} } - b := &strings.Builder{} + b = &strings.Builder{} inv.SerializeKeep(b, sc.inv) sc.inv = inv diff --git a/toolcaps.go b/toolcaps.go index 7a059cf..5dd25a8 100644 --- a/toolcaps.go +++ b/toolcaps.go @@ -2,12 +2,13 @@ package main import ( "encoding/json" + "io" "github.com/anon55555/mt" ) type ToolGroupCaps struct { - Uses int16 `json:"uses"` + Uses int16 `json:"uses"` MaxLvl int16 `json:"maxlevel"` Times map[int16]float32 `json:"times"` @@ -17,7 +18,7 @@ type ToolCaps struct { NonNil bool `json:"-"` AttackCooldown float32 `json:"full_punch_interval` - MaxDropLvl int16 `json:"max_drop_level"` + MaxDropLvl int16 `json:"max_drop_level"` GroupCaps map[string]ToolGroupCaps `json:"groupcaps"` @@ -28,23 +29,23 @@ type ToolCaps struct { func (t ToolCaps) toMT() mt.ToolCaps { tc := mt.ToolCaps{ - NonNil: t.NonNil, + NonNil: t.NonNil, AttackCooldown: t.AttackCooldown, - MaxDropLvl: t.MaxDropLvl, - AttackUses: t.AttackUses, + MaxDropLvl: t.MaxDropLvl, + AttackUses: t.AttackUses, } for k, v := range t.GroupCaps { gc := mt.ToolGroupCaps{ - Name: k, - Uses: v.Uses, + Name: k, + Uses: v.Uses, MaxLvl: v.MaxLvl, } for k2, v2 := range v.Times { gc.Times = append(gc.Times, mt.DigTime{ Rating: k2, - Time: v2, + Time: v2, }) } @@ -53,7 +54,7 @@ func (t ToolCaps) toMT() mt.ToolCaps { for k, v := range t.DmgGroups { tc.DmgGroups = append(tc.DmgGroups, mt.Group{ - Name: k, + Name: k, Rating: v, }) } @@ -71,7 +72,7 @@ func (t *ToolCaps) fromMT(tc mt.ToolCaps) { for _, gc := range tc.GroupCaps { g := ToolGroupCaps{ - Uses: gc.Uses, + Uses: gc.Uses, MaxLvl: gc.MaxLvl, } |