server: split login/ and shard/

This commit is contained in:
CPunch 2023-03-27 17:02:13 -05:00
parent 70e42b5d79
commit 727c68aef3
7 changed files with 27 additions and 21 deletions

View File

@ -4,7 +4,7 @@ A toy implementation of the [Fusionfall Packet Protocol](https://openpunk.com/pa
## Landwalker demo ## Landwalker demo
An implementation of a landwalker server is located in `server/`. This includes a functional login server and a dummy shard (supporting the minimum amount of packets necessary). The DB implementation in `core/db/` matches the OpenFusion 1.4 SQLite tables, which the login server located in `server/` uses. There's no support for NPCs nor other players, and is liable to softlock the client. An implementation of a landwalker server is located in `login/` && `shard/`. This includes a functional login server and a dummy shard (supporting the minimum amount of packets necessary). The DB implementation in `core/db/` matches the OpenFusion 1.4 SQLite tables, which the login server uses. There's no support for NPCs nor other players, and is liable to softlock the client.
## Generating structures ## Generating structures

View File

@ -1,4 +1,4 @@
package server package login
import ( import (
"encoding/binary" "encoding/binary"
@ -8,6 +8,7 @@ import (
"github.com/CPunch/gopenfusion/config" "github.com/CPunch/gopenfusion/config"
"github.com/CPunch/gopenfusion/core/db" "github.com/CPunch/gopenfusion/core/db"
"github.com/CPunch/gopenfusion/core/protocol" "github.com/CPunch/gopenfusion/core/protocol"
"github.com/CPunch/gopenfusion/shard"
) )
const ( const (
@ -263,14 +264,14 @@ func (server *LoginServer) ShardSelect(peer *protocol.CNPeer, pkt protocol.Packe
// TODO: verify peer->AccountID and selection->IPC_UID are valid!!!! // TODO: verify peer->AccountID and selection->IPC_UID are valid!!!!
resp := protocol.SP_LS2CL_REP_SHARD_SELECT_SUCC{ resp := protocol.SP_LS2CL_REP_SHARD_SELECT_SUCC{
G_FE_ServerPort: int32(server.shard.port), G_FE_ServerPort: int32(server.shard.GetPort()),
IEnterSerialKey: key, IEnterSerialKey: key,
} }
// the rest of the bytes in G_FE_ServerIP will be zero'd, so there's no need to write the NULL byte // the rest of the bytes in G_FE_ServerIP will be zero'd, so there's no need to write the NULL byte
copy(resp.G_FE_ServerIP[:], []byte(config.SHARD_IP)) copy(resp.G_FE_ServerIP[:], []byte(config.SHARD_IP))
server.shard.QueueLogin(key, &LoginMetadata{ server.shard.QueueLogin(key, &shard.LoginMetadata{
FEKey: peer.FE_key, FEKey: peer.FE_key,
Timestamp: time.Now(), Timestamp: time.Now(),
PlayerID: int32(selection.IPC_UID), PlayerID: int32(selection.IPC_UID),

View File

@ -1,4 +1,4 @@
package server package login
import ( import (
"fmt" "fmt"
@ -8,8 +8,13 @@ import (
"github.com/CPunch/gopenfusion/core/db" "github.com/CPunch/gopenfusion/core/db"
"github.com/CPunch/gopenfusion/core/protocol" "github.com/CPunch/gopenfusion/core/protocol"
"github.com/CPunch/gopenfusion/shard"
) )
type PacketHandler func(peer *protocol.CNPeer, pkt protocol.Packet) error
func stubbedPacket(_ *protocol.CNPeer, _ protocol.Packet) error { /* stubbed */ return nil }
type LoginServer struct { type LoginServer struct {
listener net.Listener listener net.Listener
port int port int
@ -17,7 +22,7 @@ type LoginServer struct {
packetHandlers map[uint32]PacketHandler packetHandlers map[uint32]PacketHandler
peers map[*protocol.CNPeer]bool peers map[*protocol.CNPeer]bool
peersLock sync.Mutex peersLock sync.Mutex
shard *ShardServer shard *shard.ShardServer
} }
func NewLoginServer(dbHndlr *db.DBHandler, port int) (*LoginServer, error) { func NewLoginServer(dbHndlr *db.DBHandler, port int) (*LoginServer, error) {
@ -95,6 +100,6 @@ func (server *LoginServer) Connect(peer *protocol.CNPeer) {
server.peersLock.Unlock() server.peersLock.Unlock()
} }
func (server *LoginServer) AddShard(shard *ShardServer) { func (server *LoginServer) AddShard(shard *shard.ShardServer) {
server.shard = shard server.shard = shard
} }

View File

@ -5,7 +5,8 @@ import (
"github.com/CPunch/gopenfusion/config" "github.com/CPunch/gopenfusion/config"
"github.com/CPunch/gopenfusion/core/db" "github.com/CPunch/gopenfusion/core/db"
"github.com/CPunch/gopenfusion/server" "github.com/CPunch/gopenfusion/login"
"github.com/CPunch/gopenfusion/shard"
) )
func main() { func main() {
@ -15,12 +16,12 @@ func main() {
} }
dbHndlr.Setup() dbHndlr.Setup()
loginServer, err := server.NewLoginServer(dbHndlr, config.LOGIN_PORT) loginServer, err := login.NewLoginServer(dbHndlr, config.LOGIN_PORT)
if err != nil { if err != nil {
log.Panicf("failed to create login server: %v", err) log.Panicf("failed to create login server: %v", err)
} }
shardServer, err := server.NewShardServer(dbHndlr, config.SHARD_PORT) shardServer, err := shard.NewShardServer(dbHndlr, config.SHARD_PORT)
if err != nil { if err != nil {
log.Panicf("failed to create shard server: %v", err) log.Panicf("failed to create shard server: %v", err)
} }

View File

@ -1,9 +0,0 @@
package server
import (
"github.com/CPunch/gopenfusion/core/protocol"
)
type PacketHandler func(peer *protocol.CNPeer, pkt protocol.Packet) error
func stubbedPacket(_ *protocol.CNPeer, _ protocol.Packet) error { /* stubbed */ return nil }

View File

@ -1,4 +1,4 @@
package server package shard
import ( import (
"fmt" "fmt"

View File

@ -1,4 +1,4 @@
package server package shard
import ( import (
"fmt" "fmt"
@ -18,6 +18,10 @@ type LoginMetadata struct {
PlayerID int32 PlayerID int32
} }
type PacketHandler func(peer *protocol.CNPeer, pkt protocol.Packet) error
func stubbedPacket(_ *protocol.CNPeer, _ protocol.Packet) error { /* stubbed */ return nil }
type ShardServer struct { type ShardServer struct {
listener net.Listener listener net.Listener
port int port int
@ -69,6 +73,10 @@ func (server *ShardServer) Start() {
} }
} }
func (server *ShardServer) GetPort() int {
return server.port
}
func (server *ShardServer) HandlePacket(peer *protocol.CNPeer, typeID uint32, pkt protocol.Packet) error { func (server *ShardServer) HandlePacket(peer *protocol.CNPeer, typeID uint32, pkt protocol.Packet) error {
if hndlr, ok := server.packetHandlers[typeID]; ok { if hndlr, ok := server.packetHandlers[typeID]; ok {
if err := hndlr(peer, pkt); err != nil { if err := hndlr(peer, pkt); err != nil {