diff --git a/d2networking/dedicated_server.go b/d2networking/dedicated_server.go new file mode 100644 index 00000000..3b2d3dde --- /dev/null +++ b/d2networking/dedicated_server.go @@ -0,0 +1,74 @@ +package d2networking + +import ( + "os" + "strconv" + + "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" + "github.com/OpenDiablo2/OpenDiablo2/d2networking/d2server" +) + +const ( + stopServer = 0b1 +) + +/* +StartDedicatedServer Checks whether or not we should start a server i.e the -listen parameter has been passed in, and if so launches a +server hosted to the network, in theory. (this is still WIP) +*/ +func StartDedicatedServer(manager *d2asset.AssetManager, in chan byte, log chan string) (started bool, e error) { + var listen bool + + maxPlayers := 3 + + for argCount, arg := range os.Args { + if arg == "--listen" || arg == "-L" { + listen = true + } + + if arg == "--maxplayers" || arg == "-p" { + max, _ := strconv.ParseInt(os.Args[argCount+1], 10, 32) + maxPlayers = int(max) + } + } + + if !listen { + return false, nil + } + + server, err := d2server.NewGameServer(manager, true, maxPlayers) + + if err != nil { + return false, err + } + + err = server.Start() + + if err != nil { + return false, err + } + + // I have done the messaging with a bitmask for memory efficiency, this can easily be translated to pretty error + // messages later, sue me. + go func() { + for { + msgIn := <-in + /* For those who do not know an AND operation denoted by & discards bits which do not line up so for instance: + 01011001 & 00000001 = 00000001 or 1 + 00100101 & 00000010 = 00000000 or 0 + 01100110 & 01100000 = 01100000 or 96 + these can be used to have multiple messages in just 8 bits, that's a quarter of a rune in go! + */ + if (msgIn & stopServer) == stopServer { + log <- "Stopping server" + + server.Stop() + log <- "Exiting..." + + os.Exit(0) + } + } + }() + + return true, nil +} diff --git a/main.go b/main.go index 2101cebd..192b58dc 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,11 @@ package main import ( "log" + "os" + "os/signal" + "syscall" + + "github.com/OpenDiablo2/OpenDiablo2/d2networking" "github.com/OpenDiablo2/OpenDiablo2/d2app" "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" @@ -47,6 +52,28 @@ func main() { return } + srvChanIn := make(chan byte) + srvChanLog := make(chan string) + started, srvErr := d2networking.StartDedicatedServer(asset, srvChanIn, srvChanLog) + + if srvErr != nil { + panic(err) + } + + c := make(chan os.Signal) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) // This traps Control-c to safely shut down the server + + go func() { + <-c + srvChanIn <- 0b1 + }() + + if started { + for data := range srvChanLog { + log.Println(data) + } + } + audio := ebiten2.CreateAudio(asset) inputManager := d2input.NewInputManager()