mt-multiserver-proxy/hop.go

165 lines
3.5 KiB
Go
Raw Normal View History

2021-09-06 02:03:27 -07:00
package proxy
import (
"fmt"
2021-09-04 11:25:00 -07:00
"image/color"
2021-09-01 04:04:48 -07:00
"net"
"github.com/anon55555/mt"
)
2021-09-10 03:47:19 -07:00
// Hop connects the ClientConn to the specified upstream server.
// At the moment the ClientConn is NOT fixed if an error occurs
// so the player may have to reconnect.
2021-09-09 08:58:53 -07:00
func (cc *ClientConn) Hop(serverName string) error {
cc.hopMu.Lock()
defer cc.hopMu.Unlock()
2021-09-06 02:03:27 -07:00
cc.Log("<->", "hop", serverName)
2021-09-04 08:25:53 -07:00
if cc.server() == nil {
2021-09-04 08:25:53 -07:00
err := fmt.Errorf("no server connection")
2021-09-06 02:03:27 -07:00
cc.Log("<->", err)
return err
}
var strAddr string
2022-05-02 12:57:38 -07:00
for name, srv := range Conf().Servers {
if name == serverName {
strAddr = srv.Addr
break
}
}
if strAddr == "" {
2021-09-04 08:25:53 -07:00
return fmt.Errorf("inexistent server")
}
2021-09-10 03:47:19 -07:00
// This needs to be done before the ServerConn is closed
// so the clientConn isn't closed by the packet handler
2021-09-04 08:25:53 -07:00
cc.server().mu.Lock()
cc.server().clt = nil
2021-09-04 08:25:53 -07:00
cc.server().mu.Unlock()
cc.server().Close()
// Reset the client to its initial state
for _, inv := range cc.server().detachedInvs {
cc.SendCmd(&mt.ToCltDetachedInv{
Name: inv,
Keep: false,
})
}
var aoRm []mt.AOID
for ao := range cc.server().aos {
aoRm = append(aoRm, ao)
}
cc.SendCmd(&mt.ToCltAORmAdd{Remove: aoRm})
for spawner := range cc.server().particleSpawners {
cc.SendCmd(&mt.ToCltDelParticleSpawner{ID: spawner})
}
for sound := range cc.server().sounds {
cc.SendCmd(&mt.ToCltStopSound{ID: sound})
}
for hud := range cc.server().huds {
cc.SendCmd(&mt.ToCltRmHUD{ID: hud})
}
2021-09-01 01:50:02 -07:00
// Static parameters
cc.SendCmd(&mt.ToCltBreath{Breath: 10})
cc.SendCmd(&mt.ToCltCloudParams{})
cc.SendCmd(&mt.ToCltEyeOffset{})
cc.SendCmd(&mt.ToCltFOV{})
cc.SendCmd(&mt.ToCltFormspecPrepend{})
cc.SendCmd(&mt.ToCltHP{})
cc.SendCmd(&mt.ToCltHUDFlags{Mask: ^mt.HUDFlags(0)})
cc.SendCmd(&mt.ToCltLocalPlayerAnim{})
2021-09-10 06:52:21 -07:00
cc.SendCmd(&mt.ToCltMinimapModes{
2021-09-13 05:07:49 -07:00
Modes: mt.DefaultMinimap,
2021-09-10 06:52:21 -07:00
})
2021-09-04 11:25:00 -07:00
cc.SendCmd(&mt.ToCltMoonParams{
Visible: true,
Texture: "moon.png",
2021-09-13 05:07:49 -07:00
ToneMap: "moon_tonemap.png",
2021-09-04 11:25:00 -07:00
Size: 1,
})
cc.SendCmd(&mt.ToCltMovement{})
cc.SendCmd(&mt.ToCltOverrideDayNightRatio{})
cc.SendCmd(&mt.ToCltPrivs{})
for i := mt.HotbarParam(mt.HotbarSize); i < mt.HotbarSelImg; i++ {
cc.SendCmd(&mt.ToCltSetHotbarParam{Param: i})
}
2021-09-04 11:25:00 -07:00
cc.SendCmd(&mt.ToCltSkyParams{
Type: "regular",
Clouds: true,
DayHorizon: color.NRGBA{144, 211, 246, 255},
DawnHorizon: color.NRGBA{186, 193, 240, 255},
NightHorizon: color.NRGBA{64, 144, 255, 255},
DaySky: color.NRGBA{97, 181, 245, 255},
DawnSky: color.NRGBA{180, 186, 250, 255},
NightSky: color.NRGBA{0, 107, 255, 255},
Indoor: color.NRGBA{100, 100, 100, 255},
})
cc.SendCmd(&mt.ToCltStarParams{
Visible: true,
Count: 1000,
Color: color.NRGBA{105, 235, 235, 255},
Size: 1,
})
cc.SendCmd(&mt.ToCltSunParams{
Visible: true,
Texture: "sun.png",
ToneMap: "sun_tonemap.png",
Rise: "sunrisebg.png",
Rising: true,
Size: 1,
})
var players []string
for player := range cc.server().playerList {
players = append(players, player)
}
cc.SendCmd(&mt.ToCltUpdatePlayerList{
Type: mt.RemovePlayers,
Players: players,
})
2021-09-04 08:25:53 -07:00
cc.mu.Lock()
2021-09-01 04:04:48 -07:00
cc.srv = nil
2021-09-04 08:25:53 -07:00
cc.mu.Unlock()
2021-09-01 04:04:48 -07:00
addr, err := net.ResolveUDPAddr("udp", strAddr)
if err != nil {
return err
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
return err
}
2021-09-10 03:47:19 -07:00
connect(conn, serverName, cc)
2021-09-01 04:30:58 -07:00
for ch := range cc.modChs {
cc.server().SendCmd(&mt.ToSrvJoinModChan{Channel: ch})
}
if !Conf().ForceDefaultSrv {
return authIface.SetLastSrv(cc.Name(), serverName)
}
return nil
}