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 (
"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
}
}
}()

View File

@ -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() {