aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client_conn.go2
-rw-r--r--content.go2
-rw-r--r--server_conn.go85
-rw-r--r--toolcaps.go21
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
diff --git a/content.go b/content.go
index 39e49d5..78812f7 100644
--- a/content.go
+++ b/content.go
@@ -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,
}