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) + prepend(cc.name, &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) + 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) } } }