forgot to spawn player oops

This commit is contained in:
olebeck 2022-03-18 19:36:44 +01:00
parent 6f6cbd344c
commit c93a360d09
2 changed files with 47 additions and 25 deletions

View File

@ -2,6 +2,7 @@ package main
import ( import (
"context" "context"
"errors"
"flag" "flag"
"fmt" "fmt"
"net" "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) 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("Connected")
println("Press ctrl+c to exit") println("Press ctrl+c to exit")
os.MkdirAll(out_path, 0755) os.MkdirAll(out_path, 0755)
errs := make(chan error) errs := make(chan error, 2)
go func() { // server -> client go func() { // server -> client
defer serverConn.Close()
defer listener.Disconnect(conn, "connection lost")
for { for {
pk, err := serverConn.ReadPacket() pk, err := serverConn.ReadPacket()
if err != nil { if err != nil {
errs <- err if disconnect, ok := errors.Unwrap(err).(minecraft.DisconnectError); ok {
_ = listener.Disconnect(conn, disconnect.Error())
}
return return
} }
process_packet_skins(out_path, pk) 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 { for {
pk, err := conn.ReadPacket() pk, err := conn.ReadPacket()
if err != nil { if err != nil {
errs <- err
return 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
}
} }
}() }()

View File

@ -241,6 +241,29 @@ func ProcessMove(player *packet.MovePlayer) {
world_state.PlayerPos = *player 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) { 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 var packet_func func(header packet.Header, payload []byte, src, dst net.Addr) = nil
if G_debug { if G_debug {
@ -258,26 +281,9 @@ func handleConn(ctx context.Context, conn *minecraft.Conn, listener *minecraft.L
return return
} }
errs := make(chan error, 2) if err := spawn_conn(ctx, conn, serverConn); err != nil {
go func() { fmt.Fprintf(os.Stderr, "Failed to spawn: %s\n", err)
errs <- conn.StartGame(serverConn.GameData()) return
}()
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
}
} }
G_exit = func() { G_exit = func() {