summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/player.go28
-rw-r--r--server/server.go1
2 files changed, 21 insertions, 8 deletions
diff --git a/server/player.go b/server/player.go
index 5ac99da..b7698b1 100644
--- a/server/player.go
+++ b/server/player.go
@@ -5,6 +5,7 @@ import (
"os"
"fmt"
"regexp"
+ "strings"
"git.citrons.xyz/metronode/phony"
"git.citrons.xyz/metronode/classic"
)
@@ -18,6 +19,7 @@ type player struct {
extensions map[string]bool
level *level
levelLoaded bool
+ currentMessage string
}
type authLevel int
@@ -129,19 +131,29 @@ func (p *player) handlePacket(packet classic.Packet) {
}
p.level.SetBlock(p, pos, block)
case *classic.Message:
- message := classic.UnpadString(pck.Message)
- isCmd, text := isCommand(message)
- if text == "" {
- break
- }
- if !isCmd {
- p.server.OnPlayerMessage(p, p.name, text)
+ incomplete := pck.PlayerId == 1 && p.extensions["LongerMessages"]
+ message := p.currentMessage + classic.UnpadString(pck.Message)
+ if !incomplete {
+ p.handleChat(message)
+ p.currentMessage = ""
} else {
- p.server.ExecuteCommand(p, p.state.Auth, text)
+ p.currentMessage += string(pck.Message[:]) // preserve whitespace
}
}
}
+func (p *player) handleChat(message string) {
+ isCmd, text := isCommand(message)
+ if strings.TrimSpace(text) == "" {
+ return
+ }
+ if !isCmd {
+ p.server.OnPlayerMessage(p, p.name, text)
+ } else {
+ p.server.ExecuteCommand(p, p.state.Auth, text)
+ }
+}
+
func (p *player) Save(from phony.Actor, done func()) {
p.Act(from, func() {
p.save(func() {
diff --git a/server/server.go b/server/server.go
index 6c73044..407ae35 100644
--- a/server/server.go
+++ b/server/server.go
@@ -17,6 +17,7 @@ var SoftwareName = "Metronode"
var supportedExtensions = []string {
"ExtEntityPositions",
"HackControl",
+ "LongerMessages",
}
var requiredExtensions = []string {
"ExtEntityPositions",