From c93a360d09278d9d22cca1bea37e43954b3c0119 Mon Sep 17 00:00:00 2001 From: olebeck Date: Fri, 18 Mar 2022 19:36:44 +0100 Subject: [PATCH] forgot to spawn player oops --- skins-proxy.go | 26 +++++++++++++++++++++----- world.go | 46 ++++++++++++++++++++++++++-------------------- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/skins-proxy.go b/skins-proxy.go index 7fa96b9..bf679ae 100644 --- a/skins-proxy.go +++ b/skins-proxy.go @@ -2,6 +2,7 @@ package main import ( "context" + "errors" "flag" "fmt" "net" @@ -60,22 +61,32 @@ func skin_proxy_main(ctx context.Context, args []string) error { return fmt.Errorf("failed to connect to %s: %s", server, err) } + if err := spawn_conn(ctx, conn, serverConn); err != nil { + return err + } + println("Connected") println("Press ctrl+c to exit") os.MkdirAll(out_path, 0755) - errs := make(chan error) + errs := make(chan error, 2) go func() { // server -> client + defer serverConn.Close() + defer listener.Disconnect(conn, "connection lost") for { pk, err := serverConn.ReadPacket() if err != nil { - errs <- err + if disconnect, ok := errors.Unwrap(err).(minecraft.DisconnectError); ok { + _ = listener.Disconnect(conn, disconnect.Error()) + } return } process_packet_skins(out_path, pk) - conn.WritePacket(pk) + if err = conn.WritePacket(pk); err != nil { + return + } } }() @@ -83,10 +94,15 @@ func skin_proxy_main(ctx context.Context, args []string) error { for { pk, err := conn.ReadPacket() if err != nil { - errs <- err return } - serverConn.WritePacket(pk) + + if err := serverConn.WritePacket(pk); err != nil { + if disconnect, ok := errors.Unwrap(err).(minecraft.DisconnectError); ok { + _ = listener.Disconnect(conn, disconnect.Error()) + } + return + } } }() diff --git a/world.go b/world.go index 8aedff2..6d960e9 100644 --- a/world.go +++ b/world.go @@ -241,6 +241,29 @@ func ProcessMove(player *packet.MovePlayer) { world_state.PlayerPos = *player } +func spawn_conn(ctx context.Context, conn *minecraft.Conn, serverConn *minecraft.Conn) error { + errs := make(chan error, 2) + go func() { + errs <- conn.StartGame(serverConn.GameData()) + }() + go func() { + errs <- serverConn.DoSpawn() + }() + + // wait for both to finish + for i := 0; i < 2; i++ { + select { + case err := <-errs: + if err != nil { + return fmt.Errorf("failed to start game: %s", err) + } + case <-ctx.Done(): + return fmt.Errorf("connection cancelled") + } + } + return nil +} + func handleConn(ctx context.Context, conn *minecraft.Conn, listener *minecraft.Listener, target string) { var packet_func func(header packet.Header, payload []byte, src, dst net.Addr) = nil if G_debug { @@ -258,26 +281,9 @@ func handleConn(ctx context.Context, conn *minecraft.Conn, listener *minecraft.L return } - errs := make(chan error, 2) - go func() { - errs <- conn.StartGame(serverConn.GameData()) - }() - go func() { - errs <- serverConn.DoSpawn() - }() - - // wait for both to finish - for i := 0; i < 2; i++ { - select { - case err := <-errs: - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to start game: %s\n", err) - return - } - case <-ctx.Done(): - fmt.Fprintf(os.Stderr, "Connection cancelled\n") - return - } + if err := spawn_conn(ctx, conn, serverConn); err != nil { + fmt.Fprintf(os.Stderr, "Failed to spawn: %s\n", err) + return } G_exit = func() {