aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--activeobject.go31
-rw-r--r--connect.go1
-rw-r--r--content.go228
-rw-r--r--server_conn.go40
4 files changed, 245 insertions, 55 deletions
diff --git a/activeobject.go b/activeobject.go
new file mode 100644
index 0000000..7bba616
--- /dev/null
+++ b/activeobject.go
@@ -0,0 +1,31 @@
+package main
+
+import "github.com/anon55555/mt"
+
+func (sc *serverConn) swapAOID(ao *mt.AOID) {
+ if sc.client() != nil {
+ if *ao == sc.client().playerCAO {
+ *ao = sc.client().currentCAO
+ } else if *ao == sc.client().currentCAO {
+ *ao = sc.client().playerCAO
+ }
+ }
+}
+
+func (sc *serverConn) handleAOMsg(aoMsg mt.AOMsg) {
+ switch msg := aoMsg.(type) {
+ case *mt.AOCmdAttach:
+ sc.swapAOID(&msg.Attach.ParentID)
+ case *mt.AOCmdProps:
+ for j := range msg.Props.Textures {
+ prependTexture(sc.name, &msg.Props.Textures[j])
+ }
+ prepend(sc.name, &msg.Props.Mesh)
+ prepend(sc.name, &msg.Props.Itemstring)
+ prependTexture(sc.name, &msg.Props.DmgTextureMod)
+ case *mt.AOCmdSpawnInfant:
+ sc.swapAOID(&msg.ID)
+ case *mt.AOCmdTextureMod:
+ prependTexture(sc.name, &msg.Mod)
+ }
+}
diff --git a/connect.go b/connect.go
index 93bb4e7..1e3c529 100644
--- a/connect.go
+++ b/connect.go
@@ -12,6 +12,7 @@ func connect(conn net.Conn, name string, cc *clientConn) *serverConn {
initCh: make(chan struct{}),
clt: cc,
name: name,
+ aos: make(map[mt.AOID]struct{}),
}
sc.log("-->", "connect")
cc.srv = sc
diff --git a/content.go b/content.go
index 78812f7..8cd16f5 100644
--- a/content.go
+++ b/content.go
@@ -5,6 +5,8 @@ import (
"fmt"
"log"
"net"
+ "regexp"
+ "strings"
"sync"
"time"
@@ -254,7 +256,7 @@ func muxItemDefs(conns []*contentConn) ([]mt.ItemDef, []struct{ Alias, Orig stri
itemDefs = append(itemDefs, mt.ItemDef{
Type: mt.ToolItem,
- InvImg: "blank.png",
+ InvImg: "wieldhand.png",
WieldScale: [3]float32{1, 1, 1},
StackMax: 1,
Usable: true,
@@ -266,41 +268,32 @@ func muxItemDefs(conns []*contentConn) ([]mt.ItemDef, []struct{ Alias, Orig stri
for _, cc := range conns {
wg.Add(1)
-
- prepend := func(s *string) {
- if *s != "" {
- *s = cc.name + "_" + *s
- }
- }
- prependTexture := func(s *mt.Texture) {
- if *s != "" {
- *s = mt.Texture(cc.name) + "_" + *s
- }
- }
-
go func() {
<-cc.done()
for _, def := range cc.itemDefs {
if def.Name == "" {
def.Name = "hand"
}
- prepend(&def.Name)
-
- prependTexture(&def.InvImg)
- prependTexture(&def.WieldImg)
- prepend(&def.PlacePredict)
- prepend(&def.PlaceSnd.Name)
- prepend(&def.PlaceFailSnd.Name)
- prependTexture(&def.Palette)
- prependTexture(&def.InvOverlay)
- prependTexture(&def.WieldOverlay)
+ prepend(cc.name, &def.Name)
+
+ prependTexture(cc.name, &def.InvImg)
+ prependTexture(cc.name, &def.WieldImg)
+ prepend(cc.name, &def.PlacePredict)
+ prepend(cc.name, &def.PlaceSnd.Name)
+ prepend(cc.name, &def.PlaceFailSnd.Name)
+ prependTexture(cc.name, &def.Palette)
+ prependTexture(cc.name, &def.InvOverlay)
+ prependTexture(cc.name, &def.WieldOverlay)
itemDefs = append(itemDefs, def)
}
for _, alias := range cc.aliases {
+ prepend(cc.name, &alias.Alias)
+ prepend(cc.name, &alias.Orig)
+
aliases = append(aliases, struct{ Alias, Orig string }{
- Alias: cc.name + "_" + alias.Alias,
- Orig: cc.name + "_" + alias.Orig,
+ Alias: alias.Alias,
+ Orig: alias.Orig,
})
}
@@ -321,18 +314,6 @@ func muxNodeDefs(conns []*contentConn) (nodeDefs []mt.NodeDef, p0Map param0Map,
for _, cc := range conns {
wg.Add(1)
-
- prepend := func(s *string) {
- if *s != "" {
- *s = cc.name + "_" + *s
- }
- }
- prependTexture := func(s *mt.Texture) {
- if *s != "" {
- *s = mt.Texture(cc.name) + "_" + *s
- }
- }
-
go func() {
<-cc.done()
for _, def := range cc.nodeDefs {
@@ -350,25 +331,25 @@ func muxNodeDefs(conns []*contentConn) (nodeDefs []mt.NodeDef, p0Map param0Map,
}
def.Param0 = param0
- prepend(&def.Name)
- prepend(&def.Mesh)
+ prepend(cc.name, &def.Name)
+ prepend(cc.name, &def.Mesh)
for i := range def.Tiles {
- prependTexture(&def.Tiles[i].Texture)
+ prependTexture(cc.name, &def.Tiles[i].Texture)
}
for i := range def.OverlayTiles {
- prependTexture(&def.OverlayTiles[i].Texture)
+ prependTexture(cc.name, &def.OverlayTiles[i].Texture)
}
for i := range def.SpecialTiles {
- prependTexture(&def.SpecialTiles[i].Texture)
+ prependTexture(cc.name, &def.SpecialTiles[i].Texture)
}
- prependTexture(&def.Palette)
+ prependTexture(cc.name, &def.Palette)
for k, v := range def.ConnectTo {
def.ConnectTo[k] = p0Map[cc.name][v]
}
- prepend(&def.FootstepSnd.Name)
- prepend(&def.DiggingSnd.Name)
- prepend(&def.DugSnd.Name)
- prepend(&def.DigPredict)
+ prepend(cc.name, &def.FootstepSnd.Name)
+ prepend(cc.name, &def.DiggingSnd.Name)
+ prepend(cc.name, &def.DugSnd.Name)
+ prepend(cc.name, &def.DigPredict)
nodeDefs = append(nodeDefs, def)
param0++
@@ -391,17 +372,10 @@ func muxMedia(conns []*contentConn) []mediaFile {
for _, cc := range conns {
wg.Add(1)
-
- prepend := func(s *string) {
- if *s != "" {
- *s = cc.name + "_" + *s
- }
- }
-
go func() {
<-cc.done()
for _, f := range cc.media {
- prepend(&f.name)
+ prepend(cc.name, &f.name)
media = append(media, f)
}
@@ -455,3 +429,147 @@ func muxContent(userName string) (itemDefs []mt.ItemDef, aliases []struct{ Alias
wg.Wait()
return
}
+
+func isDefaultTexture(s string) bool {
+ list := []string{
+ "",
+ "air.png",
+ "aux1_btn.png",
+ "blank.png",
+ "bubble.png",
+ "bubble_gone.png",
+ "camera_btn.png",
+ "cdb_add.png",
+ "cdb_clear.png",
+ "cdb_downloading.png",
+ "cdb_queued.png",
+ "cdb_update.png",
+ "cdb_viewonline.png",
+ "chat_btn.png",
+ "chat_hide_btn.png",
+ "chat_show_btn.png",
+ "checkbox_16.png",
+ "checkbox_32.png",
+ "checkbox_64.png",
+ "clear.png",
+ "crack_anylength.png",
+ "debug_btn.png",
+ "down.png",
+ "drop_btn.png",
+ "end_icon.png",
+ "error_screenshot.png",
+ "fast_btn.png",
+ "fly_btn.png",
+ "gear_icon.png",
+ "halo.png",
+ "heart.png",
+ "heart_gone.png",
+ "ignore.png",
+ "inventory_btn.png",
+ "joystick_bg.png",
+ "joystick_center.png",
+ "joystick_off.png",
+ "jump_btn.png",
+ "loading_screenshot.png",
+ "logo.png",
+ "menu_bg.png",
+ "menu_header.png",
+ "minimap_btn.png",
+ "minimap_mask_round.png",
+ "minimap_mask_square.png",
+ "minimap_overlay_round.png",
+ "minimap_overlay_square.png",
+ "next_icon.png",
+ "noclip_btn.png",
+ "no_screenshot.png",
+ "no_texture_airlike.png",
+ "object_marker_red.png",
+ "player.png",
+ "player_back.png",
+ "player_marker.png",
+ "plus.png",
+ "prev_icon.png",
+ "progress_bar.png",
+ "progress_bar_bg.png",
+ "rangeview_btn.png",
+ "rare_controls.png",
+ "refresh.png",
+ "search.png",
+ "server_favorite.png",
+ "server_flags_creative.png",
+ "server_flags_damage.png",
+ "server_flags_pvp.png",
+ "server_incompatible.png",
+ "server_ping_1.png",
+ "server_ping_2.png",
+ "server_ping_3.png",
+ "server_ping_4.png",
+ "server_public.png",
+ "smoke_puff.png",
+ "start_icon.png",
+ "sunrisebg.png",
+ "unknown_item.png",
+ "unknown_node.png",
+ "unknown_object.png",
+ "wieldhand.png",
+ }
+
+ for _, s2 := range list {
+ if s == s2 {
+ return true
+ }
+ }
+
+ return false
+}
+
+func isDefaultNode(s string) bool {
+ list := []string{
+ "",
+ "air",
+ "unknown",
+ "ignore",
+ }
+
+ for _, s2 := range list {
+ if s == s2 {
+ return true
+ }
+ }
+
+ return false
+}
+
+func prependRaw(prep string, s *string, isTexture bool) {
+ if (isTexture && !isDefaultTexture(*s)) || (!isTexture && !isDefaultNode(*s)) {
+ reg := regexp.MustCompile("[^a-zA-Z0-9-_.:]")
+ subs := reg.Split(*s, -1)
+ seps := reg.FindAllString(*s, -1)
+
+ for i, sub := range subs {
+ if !isTexture || strings.Contains(sub, ".") {
+ subs[i] = prep + "_" + sub
+ }
+ }
+
+ fmt.Println("before", *s)
+ *s = ""
+ for i, sub := range subs {
+ *s += sub
+ if i < len(seps) {
+ *s += seps[i]
+ }
+ }
+ fmt.Println("afters", *s)
+ }
+}
+
+func prepend(prep string, s *string) {
+ prependRaw(prep, s, false)
+}
+
+func prependTexture(prep string, t *mt.Texture) {
+ s := string(*t)
+ prependRaw(prep, &s, true)
+ *t = mt.Texture(s)
+}
diff --git a/server_conn.go b/server_conn.go
index f8e7dec..3f2e9e1 100644
--- a/server_conn.go
+++ b/server_conn.go
@@ -27,6 +27,8 @@ type serverConn struct {
}
inv mt.Inv
+
+ aos map[mt.AOID]struct{}
}
func (sc *serverConn) client() *clientConn { return sc.clt }
@@ -251,6 +253,44 @@ func handleSrv(sc *serverConn) {
sc.inv = inv
sc.client().SendCmd(&mt.ToCltInv{Inv: b.String()})
+ case *mt.ToCltAOMsgs:
+ for k := range cmd.Msgs {
+ sc.swapAOID(&cmd.Msgs[k].ID)
+ sc.handleAOMsg(cmd.Msgs[k].Msg)
+ }
+
+ sc.client().SendCmd(cmd)
+ case *mt.ToCltAORmAdd:
+ resp := &mt.ToCltAORmAdd{}
+
+ for _, ao := range cmd.Remove {
+ delete(sc.aos, ao)
+ resp.Remove = append(resp.Remove, ao)
+ }
+
+ for _, ao := range cmd.Add {
+ if ao.InitData.Name == sc.client().name {
+ sc.client().currentCAO = ao.ID
+
+ if sc.client().playerCAO == 0 {
+ sc.client().playerCAO = ao.ID
+ for _, msg := range ao.InitData.Msgs {
+ sc.handleAOMsg(msg)
+ }
+
+ resp.Add = append(resp.Add, ao)
+ }
+ } else {
+ sc.swapAOID(&ao.ID)
+ for _, msg := range ao.InitData.Msgs {
+ sc.handleAOMsg(msg)
+ }
+
+ resp.Add = append(resp.Add, ao)
+ }
+ }
+
+ sc.client().SendCmd(resp)
}
}
}