add ClientMode config option

This commit is contained in:
wish
2023-06-18 20:31:18 +10:00
parent 0b4108fb85
commit b4df642ee3
15 changed files with 169 additions and 78 deletions

View File

@@ -11,6 +11,7 @@
"PatchServerFile": "", "PatchServerFile": "",
"ScreenshotAPIURL": "", "ScreenshotAPIURL": "",
"DeleteOnSaveCorruption": false, "DeleteOnSaveCorruption": false,
"ClientMode": "ZZ",
"DevMode": true, "DevMode": true,
"DevModeOptions": { "DevModeOptions": {
"AutoCreateAccount": true, "AutoCreateAccount": true,

View File

@@ -1,15 +1,28 @@
package config package _config
import ( import (
"fmt" "fmt"
"log" "log"
"net" "net"
"os" "os"
"strings"
"time" "time"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
type Mode string
const (
ZZ Mode = "ZZ"
Z2 Mode = "Z2"
Z1 Mode = "Z1"
)
func (m Mode) String() string {
return string(m)
}
// Config holds the global server-wide config. // Config holds the global server-wide config.
type Config struct { type Config struct {
Host string `mapstructure:"Host"` Host string `mapstructure:"Host"`
@@ -22,6 +35,7 @@ type Config struct {
PatchServerFile string // File patch server override PatchServerFile string // File patch server override
ScreenshotAPIURL string // Destination for screenshots uploaded to BBS ScreenshotAPIURL string // Destination for screenshots uploaded to BBS
DeleteOnSaveCorruption bool // Attempts to save corrupted data will flag the save for deletion DeleteOnSaveCorruption bool // Attempts to save corrupted data will flag the save for deletion
ClientMode Mode
DevMode bool DevMode bool
DevModeOptions DevModeOptions DevModeOptions DevModeOptions
@@ -170,7 +184,6 @@ func init() {
if err != nil { if err != nil {
preventClose(fmt.Sprintf("Failed to load config: %s", err.Error())) preventClose(fmt.Sprintf("Failed to load config: %s", err.Error()))
} }
} }
// getOutboundIP4 gets the preferred outbound ip4 of this machine // getOutboundIP4 gets the preferred outbound ip4 of this machine
@@ -212,6 +225,15 @@ func LoadConfig() (*Config, error) {
c.Host = getOutboundIP4().To4().String() c.Host = getOutboundIP4().To4().String()
} }
switch strings.ToUpper(c.ClientMode.String()) {
case "Z1":
c.ClientMode = Z1
case "Z2":
c.ClientMode = Z2
default:
c.ClientMode = ZZ
}
return c, nil return c, nil
} }

64
main.go
View File

@@ -1,6 +1,7 @@
package main package main
import ( import (
_config "erupe-ce/config"
"fmt" "fmt"
"net" "net"
"os" "os"
@@ -9,7 +10,6 @@ import (
"syscall" "syscall"
"time" "time"
"erupe-ce/config"
"erupe-ce/server/channelserver" "erupe-ce/server/channelserver"
"erupe-ce/server/discordbot" "erupe-ce/server/discordbot"
"erupe-ce/server/entranceserver" "erupe-ce/server/entranceserver"
@@ -45,7 +45,8 @@ func main() {
var err error var err error
var zapLogger *zap.Logger var zapLogger *zap.Logger
if config.ErupeConfig.DevMode { config := _config.ErupeConfig
if config.DevMode {
zapLogger, _ = zap.NewDevelopment() zapLogger, _ = zap.NewDevelopment()
} else { } else {
zapLogger, _ = zap.NewProduction() zapLogger, _ = zap.NewProduction()
@@ -55,20 +56,21 @@ func main() {
logger := zapLogger.Named("main") logger := zapLogger.Named("main")
logger.Info(fmt.Sprintf("Starting Erupe (9.3b-%s)", Commit())) logger.Info(fmt.Sprintf("Starting Erupe (9.3b-%s)", Commit()))
logger.Info(fmt.Sprintf("Client Mode: %s", config.ClientMode.String()))
if config.ErupeConfig.Database.Password == "" { if config.Database.Password == "" {
preventClose("Database password is blank") preventClose("Database password is blank")
} }
if net.ParseIP(config.ErupeConfig.Host) == nil { if net.ParseIP(config.Host) == nil {
ips, _ := net.LookupIP(config.ErupeConfig.Host) ips, _ := net.LookupIP(config.Host)
for _, ip := range ips { for _, ip := range ips {
if ip != nil { if ip != nil {
config.ErupeConfig.Host = ip.String() config.Host = ip.String()
break break
} }
} }
if net.ParseIP(config.ErupeConfig.Host) == nil { if net.ParseIP(config.Host) == nil {
preventClose("Invalid host address") preventClose("Invalid host address")
} }
} }
@@ -76,10 +78,10 @@ func main() {
// Discord bot // Discord bot
var discordBot *discordbot.DiscordBot = nil var discordBot *discordbot.DiscordBot = nil
if config.ErupeConfig.Discord.Enabled { if config.Discord.Enabled {
bot, err := discordbot.NewDiscordBot(discordbot.Options{ bot, err := discordbot.NewDiscordBot(discordbot.Options{
Logger: logger, Logger: logger,
Config: config.ErupeConfig, Config: _config.ErupeConfig,
}) })
if err != nil { if err != nil {
@@ -102,11 +104,11 @@ func main() {
// Create the postgres DB pool. // Create the postgres DB pool.
connectString := fmt.Sprintf( connectString := fmt.Sprintf(
"host='%s' port='%d' user='%s' password='%s' dbname='%s' sslmode=disable", "host='%s' port='%d' user='%s' password='%s' dbname='%s' sslmode=disable",
config.ErupeConfig.Database.Host, config.Database.Host,
config.ErupeConfig.Database.Port, config.Database.Port,
config.ErupeConfig.Database.User, config.Database.User,
config.ErupeConfig.Database.Password, config.Database.Password,
config.ErupeConfig.Database.Database, config.Database.Database,
) )
db, err := sqlx.Open("postgres", connectString) db, err := sqlx.Open("postgres", connectString)
@@ -126,7 +128,7 @@ func main() {
_ = db.MustExec("DELETE FROM servers") _ = db.MustExec("DELETE FROM servers")
// Clean the DB if the option is on. // Clean the DB if the option is on.
if config.ErupeConfig.DevMode && config.ErupeConfig.DevModeOptions.CleanDB { if config.DevMode && config.DevModeOptions.CleanDB {
logger.Info("Database: Started clearing...") logger.Info("Database: Started clearing...")
cleanDB(db) cleanDB(db)
logger.Info("Database: Finished clearing") logger.Info("Database: Finished clearing")
@@ -139,11 +141,11 @@ func main() {
// Entrance server. // Entrance server.
var entranceServer *entranceserver.Server var entranceServer *entranceserver.Server
if config.ErupeConfig.Entrance.Enabled { if config.Entrance.Enabled {
entranceServer = entranceserver.NewServer( entranceServer = entranceserver.NewServer(
&entranceserver.Config{ &entranceserver.Config{
Logger: logger.Named("entrance"), Logger: logger.Named("entrance"),
ErupeConfig: config.ErupeConfig, ErupeConfig: _config.ErupeConfig,
DB: db, DB: db,
}) })
err = entranceServer.Start() err = entranceServer.Start()
@@ -158,11 +160,11 @@ func main() {
// Sign server. // Sign server.
var signServer *signserver.Server var signServer *signserver.Server
if config.ErupeConfig.Sign.Enabled { if config.Sign.Enabled {
signServer = signserver.NewServer( signServer = signserver.NewServer(
&signserver.Config{ &signserver.Config{
Logger: logger.Named("sign"), Logger: logger.Named("sign"),
ErupeConfig: config.ErupeConfig, ErupeConfig: _config.ErupeConfig,
DB: db, DB: db,
}) })
err = signServer.Start() err = signServer.Start()
@@ -176,11 +178,11 @@ func main() {
// New Sign server // New Sign server
var newSignServer *signv2server.Server var newSignServer *signv2server.Server
if config.ErupeConfig.SignV2.Enabled { if config.SignV2.Enabled {
newSignServer = signv2server.NewServer( newSignServer = signv2server.NewServer(
&signv2server.Config{ &signv2server.Config{
Logger: logger.Named("sign"), Logger: logger.Named("sign"),
ErupeConfig: config.ErupeConfig, ErupeConfig: _config.ErupeConfig,
DB: db, DB: db,
}) })
err = newSignServer.Start() err = newSignServer.Start()
@@ -194,23 +196,23 @@ func main() {
var channels []*channelserver.Server var channels []*channelserver.Server
if config.ErupeConfig.Channel.Enabled { if config.Channel.Enabled {
channelQuery := "" channelQuery := ""
si := 0 si := 0
ci := 0 ci := 0
count := 1 count := 1
for j, ee := range config.ErupeConfig.Entrance.Entries { for j, ee := range config.Entrance.Entries {
for i, ce := range ee.Channels { for i, ce := range ee.Channels {
sid := (4096 + si*256) + (16 + ci) sid := (4096 + si*256) + (16 + ci)
c := *channelserver.NewServer(&channelserver.Config{ c := *channelserver.NewServer(&channelserver.Config{
ID: uint16(sid), ID: uint16(sid),
Logger: logger.Named("channel-" + fmt.Sprint(count)), Logger: logger.Named("channel-" + fmt.Sprint(count)),
ErupeConfig: config.ErupeConfig, ErupeConfig: _config.ErupeConfig,
DB: db, DB: db,
DiscordBot: discordBot, DiscordBot: discordBot,
}) })
if ee.IP == "" { if ee.IP == "" {
c.IP = config.ErupeConfig.Host c.IP = config.Host
} else { } else {
c.IP = ee.IP c.IP = ee.IP
} }
@@ -246,7 +248,7 @@ func main() {
signal.Notify(c, os.Interrupt, syscall.SIGTERM) signal.Notify(c, os.Interrupt, syscall.SIGTERM)
<-c <-c
if !config.ErupeConfig.DisableSoftCrash { if !config.DisableSoftCrash {
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
message := fmt.Sprintf("Shutting down in %d...", 10-i) message := fmt.Sprintf("Shutting down in %d...", 10-i)
for _, c := range channels { for _, c := range channels {
@@ -257,21 +259,21 @@ func main() {
} }
} }
if config.ErupeConfig.Channel.Enabled { if config.Channel.Enabled {
for _, c := range channels { for _, c := range channels {
c.Shutdown() c.Shutdown()
} }
} }
if config.ErupeConfig.Sign.Enabled { if config.Sign.Enabled {
signServer.Shutdown() signServer.Shutdown()
} }
if config.ErupeConfig.SignV2.Enabled { if config.SignV2.Enabled {
newSignServer.Shutdown() newSignServer.Shutdown()
} }
if config.ErupeConfig.Entrance.Enabled { if config.Entrance.Enabled {
entranceServer.Shutdown() entranceServer.Shutdown()
} }
@@ -285,7 +287,7 @@ func wait() {
} }
func preventClose(text string) { func preventClose(text string) {
if config.ErupeConfig.DisableSoftCrash { if _config.ErupeConfig.DisableSoftCrash {
os.Exit(0) os.Exit(0)
} }
fmt.Println("\nFailed to start Erupe:\n" + text) fmt.Println("\nFailed to start Erupe:\n" + text)

View File

@@ -2,6 +2,7 @@ package mhfpacket
import ( import (
"errors" "errors"
_config "erupe-ce/config"
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"erupe-ce/network" "erupe-ce/network"
@@ -30,7 +31,9 @@ func (m *MsgMhfEnumerateQuest) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Cli
m.World = bf.ReadUint8() m.World = bf.ReadUint8()
m.Counter = bf.ReadUint16() m.Counter = bf.ReadUint16()
m.Offset = bf.ReadUint16() m.Offset = bf.ReadUint16()
m.Unk4 = bf.ReadUint8() if _config.ErupeConfig.ClientMode != _config.Z1 {
m.Unk4 = bf.ReadUint8()
}
return nil return nil
} }

View File

@@ -35,16 +35,16 @@ const (
BroadcastTypeWorld = 0x0a BroadcastTypeWorld = 0x0a
) )
var commands map[string]config.Command var commands map[string]_config.Command
func init() { func init() {
commands = make(map[string]config.Command) commands = make(map[string]_config.Command)
zapConfig := zap.NewDevelopmentConfig() zapConfig := zap.NewDevelopmentConfig()
zapConfig.DisableCaller = true zapConfig.DisableCaller = true
zapLogger, _ := zapConfig.Build() zapLogger, _ := zapConfig.Build()
defer zapLogger.Sync() defer zapLogger.Sync()
logger := zapLogger.Named("commands") logger := zapLogger.Named("commands")
cmds := config.ErupeConfig.Commands cmds := _config.ErupeConfig.Commands
for _, cmd := range cmds { for _, cmd := range cmds {
commands[cmd.Name] = cmd commands[cmd.Name] = cmd
if cmd.Enabled { if cmd.Enabled {
@@ -55,7 +55,7 @@ func init() {
} }
} }
func sendDisabledCommandMessage(s *Session, cmd config.Command) { func sendDisabledCommandMessage(s *Session, cmd _config.Command) {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandDisabled"], cmd.Name)) sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandDisabled"], cmd.Name))
} }

View File

@@ -5,6 +5,7 @@ import (
"errors" "errors"
"erupe-ce/common/bfutil" "erupe-ce/common/bfutil"
"erupe-ce/common/stringsupport" "erupe-ce/common/stringsupport"
_config "erupe-ce/config"
"erupe-ce/network/mhfpacket" "erupe-ce/network/mhfpacket"
"erupe-ce/server/channelserver/compression/nullcomp" "erupe-ce/server/channelserver/compression/nullcomp"
@@ -12,7 +13,8 @@ import (
) )
const ( const (
pointerGender = 0x51 // +1 pointerGender = 0x51 // +1
pointerRP = 0x22D16 // +2 pointerRP = 0x22D16 // +2
pointerHouseTier = 0x1FB6C // +5 pointerHouseTier = 0x1FB6C // +5
pointerHouseData = 0x1FE01 // +195 pointerHouseData = 0x1FE01 // +195
@@ -26,6 +28,19 @@ const (
pointerHRP = 0x1FDF6 // +2 pointerHRP = 0x1FDF6 // +2
pointerGRP = 0x1FDFC // +4 pointerGRP = 0x1FDFC // +4
pointerKQF = 0x23D20 // +8 pointerKQF = 0x23D20 // +8
pointerRPZ = 0x1A076
pointerHouseTierZ = 0x16ECC
pointerHouseDataZ = 0x17161
pointerBookshelfDataZ = 0x195F8
pointerGalleryDataZ = 0x19680
pointerToreDataZ = 0x17014
pointerGardenDataZ = 0x19FB8
pointerWeaponTypeZ = 0x16A75
pointerWeaponIDZ = 0x1696A
pointerHRPZ = 0x17156
pointerGRPZ = 0x1715C
pointerKQFZ = 0x1B080
) )
type CharacterSaveData struct { type CharacterSaveData struct {
@@ -81,10 +96,6 @@ func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error)
return nil, err return nil, err
} }
if len(saveData.decompSave) < pointerKQF {
return nil, err
}
saveData.updateStructWithSaveData() saveData.updateStructWithSaveData()
return saveData, nil return saveData, nil
@@ -137,8 +148,13 @@ func (save *CharacterSaveData) Decompress() error {
func (save *CharacterSaveData) updateSaveDataWithStruct() { func (save *CharacterSaveData) updateSaveDataWithStruct() {
rpBytes := make([]byte, 2) rpBytes := make([]byte, 2)
binary.LittleEndian.PutUint16(rpBytes, save.RP) binary.LittleEndian.PutUint16(rpBytes, save.RP)
copy(save.decompSave[pointerRP:pointerRP+2], rpBytes) if _config.ErupeConfig.ClientMode == _config.ZZ {
copy(save.decompSave[pointerKQF:pointerKQF+8], save.KQF) copy(save.decompSave[pointerRP:pointerRP+2], rpBytes)
copy(save.decompSave[pointerKQF:pointerKQF+8], save.KQF)
} else {
copy(save.decompSave[pointerRPZ:pointerRPZ+2], rpBytes)
copy(save.decompSave[pointerKQFZ:pointerKQFZ+8], save.KQF)
}
} }
// This will update the save struct with the values stored in the character save // This will update the save struct with the values stored in the character save
@@ -150,20 +166,37 @@ func (save *CharacterSaveData) updateStructWithSaveData() {
save.Gender = false save.Gender = false
} }
if !save.IsNewCharacter { if !save.IsNewCharacter {
save.RP = binary.LittleEndian.Uint16(save.decompSave[pointerRP : pointerRP+2]) if _config.ErupeConfig.ClientMode == _config.ZZ {
save.HouseTier = save.decompSave[pointerHouseTier : pointerHouseTier+5] save.RP = binary.LittleEndian.Uint16(save.decompSave[pointerRP : pointerRP+2])
save.HouseData = save.decompSave[pointerHouseData : pointerHouseData+195] save.HouseTier = save.decompSave[pointerHouseTier : pointerHouseTier+5]
save.BookshelfData = save.decompSave[pointerBookshelfData : pointerBookshelfData+5576] save.HouseData = save.decompSave[pointerHouseData : pointerHouseData+195]
save.GalleryData = save.decompSave[pointerGalleryData : pointerGalleryData+1748] save.BookshelfData = save.decompSave[pointerBookshelfData : pointerBookshelfData+5576]
save.ToreData = save.decompSave[pointerToreData : pointerToreData+240] save.GalleryData = save.decompSave[pointerGalleryData : pointerGalleryData+1748]
save.GardenData = save.decompSave[pointerGardenData : pointerGardenData+68] save.ToreData = save.decompSave[pointerToreData : pointerToreData+240]
save.WeaponType = save.decompSave[pointerWeaponType] save.GardenData = save.decompSave[pointerGardenData : pointerGardenData+68]
save.WeaponID = binary.LittleEndian.Uint16(save.decompSave[pointerWeaponID : pointerWeaponID+2]) save.WeaponType = save.decompSave[pointerWeaponType]
save.HRP = binary.LittleEndian.Uint16(save.decompSave[pointerHRP : pointerHRP+2]) save.WeaponID = binary.LittleEndian.Uint16(save.decompSave[pointerWeaponID : pointerWeaponID+2])
if save.HRP == uint16(999) { save.HRP = binary.LittleEndian.Uint16(save.decompSave[pointerHRP : pointerHRP+2])
save.GR = grpToGR(binary.LittleEndian.Uint32(save.decompSave[pointerGRP : pointerGRP+4])) if save.HRP == uint16(999) {
save.GR = grpToGR(binary.LittleEndian.Uint32(save.decompSave[pointerGRP : pointerGRP+4]))
}
save.KQF = save.decompSave[pointerKQF : pointerKQF+8]
} else {
save.RP = binary.LittleEndian.Uint16(save.decompSave[pointerRPZ : pointerRPZ+2])
save.HouseTier = save.decompSave[pointerHouseTierZ : pointerHouseTierZ+5]
save.HouseData = save.decompSave[pointerHouseDataZ : pointerHouseDataZ+195]
save.BookshelfData = save.decompSave[pointerBookshelfDataZ : pointerBookshelfDataZ+5576]
save.GalleryData = save.decompSave[pointerGalleryDataZ : pointerGalleryDataZ+1748]
save.ToreData = save.decompSave[pointerToreDataZ : pointerToreDataZ+240]
save.GardenData = save.decompSave[pointerGardenDataZ : pointerGardenDataZ+68]
save.WeaponType = save.decompSave[pointerWeaponTypeZ]
save.WeaponID = binary.LittleEndian.Uint16(save.decompSave[pointerWeaponIDZ : pointerWeaponIDZ+2])
save.HRP = binary.LittleEndian.Uint16(save.decompSave[pointerHRPZ : pointerHRPZ+2])
if save.HRP == uint16(999) {
save.GR = grpToGR(binary.LittleEndian.Uint32(save.decompSave[pointerGRPZ : pointerGRPZ+4]))
}
save.KQF = save.decompSave[pointerKQFZ : pointerKQFZ+8]
} }
save.KQF = save.decompSave[pointerKQF : pointerKQF+8]
} }
return return
} }

View File

@@ -3,6 +3,7 @@ package channelserver
import ( import (
"encoding/hex" "encoding/hex"
"erupe-ce/common/stringsupport" "erupe-ce/common/stringsupport"
_config "erupe-ce/config"
"time" "time"
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
@@ -80,7 +81,10 @@ func handleMsgMhfGetUdSchedule(s *Session, p mhfpacket.MHFPacket) {
} }
bf.WriteUint32(id) bf.WriteUint32(id)
for _, timestamp := range timestamps { for i, timestamp := range timestamps {
if s.server.erupeConfig.ClientMode == _config.Z1 && i == 4 {
continue
}
bf.WriteUint32(timestamp) bf.WriteUint32(timestamp)
} }

View File

@@ -2,6 +2,7 @@ package channelserver
import ( import (
"erupe-ce/common/token" "erupe-ce/common/token"
_config "erupe-ce/config"
"math" "math"
"time" "time"
@@ -90,14 +91,18 @@ func handleMsgMhfGetWeeklySchedule(s *Session, p mhfpacket.MHFPacket) {
} }
func generateFeatureWeapons(count int) activeFeature { func generateFeatureWeapons(count int) activeFeature {
if count > 14 { max := 14
count = 14 if _config.ErupeConfig.ClientMode != _config.ZZ {
max = 13
}
if count > max {
count = max
} }
nums := make([]int, 0) nums := make([]int, 0)
var result int var result int
for len(nums) < count { for len(nums) < count {
rng := token.RNG() rng := token.RNG()
num := rng.Intn(14) num := rng.Intn(max)
exist := false exist := false
for _, v := range nums { for _, v := range nums {
if v == num { if v == num {

View File

@@ -7,6 +7,7 @@ import (
"encoding/hex" "encoding/hex"
"encoding/json" "encoding/json"
"errors" "errors"
_config "erupe-ce/config"
"fmt" "fmt"
"math" "math"
"sort" "sort"
@@ -1390,7 +1391,12 @@ func handleMsgMhfEnumerateGuildMember(s *Session, p mhfpacket.MHFPacket) {
bf.WriteUint32(member.CharID) bf.WriteUint32(member.CharID)
bf.WriteUint16(member.HRP) bf.WriteUint16(member.HRP)
bf.WriteUint16(member.GR) bf.WriteUint16(member.GR)
bf.WriteUint16(member.WeaponID) if s.server.erupeConfig.ClientMode != _config.ZZ {
// Magnet Spike crash workaround
bf.WriteUint16(0)
} else {
bf.WriteUint16(member.WeaponID)
}
if member.WeaponType == 1 || member.WeaponType == 5 || member.WeaponType == 10 { // If weapon is ranged if member.WeaponType == 1 || member.WeaponType == 5 || member.WeaponType == 10 { // If weapon is ranged
bf.WriteUint8(7) bf.WriteUint8(7)
} else { } else {

View File

@@ -22,7 +22,7 @@ type Config struct {
Logger *zap.Logger Logger *zap.Logger
DB *sqlx.DB DB *sqlx.DB
DiscordBot *discordbot.DiscordBot DiscordBot *discordbot.DiscordBot
ErupeConfig *config.Config ErupeConfig *_config.Config
Name string Name string
Enable bool Enable bool
} }
@@ -43,7 +43,7 @@ type Server struct {
Port uint16 Port uint16
logger *zap.Logger logger *zap.Logger
db *sqlx.DB db *sqlx.DB
erupeConfig *config.Config erupeConfig *_config.Config
acceptConns chan net.Conn acceptConns chan net.Conn
deleteConns chan net.Conn deleteConns chan net.Conn
sessions map[net.Conn]*Session sessions map[net.Conn]*Session

View File

@@ -9,14 +9,14 @@ import (
type DiscordBot struct { type DiscordBot struct {
Session *discordgo.Session Session *discordgo.Session
config *config.Config config *_config.Config
logger *zap.Logger logger *zap.Logger
MainGuild *discordgo.Guild MainGuild *discordgo.Guild
RealtimeChannel *discordgo.Channel RealtimeChannel *discordgo.Channel
} }
type Options struct { type Options struct {
Config *config.Config Config *_config.Config
Logger *zap.Logger Logger *zap.Logger
} }

View File

@@ -18,7 +18,7 @@ import (
type Server struct { type Server struct {
sync.Mutex sync.Mutex
logger *zap.Logger logger *zap.Logger
erupeConfig *config.Config erupeConfig *_config.Config
db *sqlx.DB db *sqlx.DB
listener net.Listener listener net.Listener
isShuttingDown bool isShuttingDown bool
@@ -28,7 +28,7 @@ type Server struct {
type Config struct { type Config struct {
Logger *zap.Logger Logger *zap.Logger
DB *sqlx.DB DB *sqlx.DB
ErupeConfig *config.Config ErupeConfig *_config.Config
} }
// NewServer creates a new Server type. // NewServer creates a new Server type.
@@ -68,7 +68,7 @@ func (s *Server) Shutdown() {
s.listener.Close() s.listener.Close()
} }
//acceptClients handles accepting new clients in a loop. // acceptClients handles accepting new clients in a loop.
func (s *Server) acceptClients() { func (s *Server) acceptClients() {
for { for {
conn, err := s.listener.Accept() conn, err := s.listener.Accept()

View File

@@ -3,13 +3,13 @@ package entranceserver
import ( import (
"encoding/binary" "encoding/binary"
"encoding/hex" "encoding/hex"
_config "erupe-ce/config"
"fmt" "fmt"
"net" "net"
"erupe-ce/common/stringsupport" "erupe-ce/common/stringsupport"
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"erupe-ce/config"
"erupe-ce/server/channelserver" "erupe-ce/server/channelserver"
) )
@@ -19,11 +19,17 @@ var season uint8
// Server Channels // Server Channels
var currentplayers uint16 var currentplayers uint16
func encodeServerInfo(config *config.Config, s *Server, local bool) []byte { func encodeServerInfo(config *_config.Config, s *Server, local bool) []byte {
serverInfos := config.Entrance.Entries serverInfos := config.Entrance.Entries
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
for serverIdx, si := range serverInfos { for serverIdx, si := range serverInfos {
// Prevent MezFes Worlds displaying on Z1
if config.ClientMode == _config.Z1 {
if si.Type == 6 {
continue
}
}
sid := (4096 + serverIdx*256) + 16 sid := (4096 + serverIdx*256) + 16
err := s.db.QueryRow("SELECT season FROM servers WHERE server_id=$1", sid).Scan(&season) err := s.db.QueryRow("SELECT season FROM servers WHERE server_id=$1", sid).Scan(&season)
if err != nil { if err != nil {
@@ -91,8 +97,17 @@ func makeHeader(data []byte, respType string, entryCount uint16, key byte) []byt
return bf.Data() return bf.Data()
} }
func makeSv2Resp(config *config.Config, s *Server, local bool) []byte { func makeSv2Resp(config *_config.Config, s *Server, local bool) []byte {
serverInfos := config.Entrance.Entries serverInfos := config.Entrance.Entries
// Decrease by the number of MezFes Worlds
var mf int
if config.ClientMode == _config.Z1 {
for _, si := range serverInfos {
if si.Type == 6 {
mf++
}
}
}
rawServerData := encodeServerInfo(config, s, local) rawServerData := encodeServerInfo(config, s, local)
if s.erupeConfig.DevMode && s.erupeConfig.DevModeOptions.LogOutboundMessages { if s.erupeConfig.DevMode && s.erupeConfig.DevModeOptions.LogOutboundMessages {
@@ -100,7 +115,7 @@ func makeSv2Resp(config *config.Config, s *Server, local bool) []byte {
} }
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
bf.WriteBytes(makeHeader(rawServerData, "SV2", uint16(len(serverInfos)), 0x00)) bf.WriteBytes(makeHeader(rawServerData, "SV2", uint16(len(serverInfos)-mf), 0x00))
return bf.Data() return bf.Data()
} }

View File

@@ -16,14 +16,14 @@ import (
type Config struct { type Config struct {
Logger *zap.Logger Logger *zap.Logger
DB *sqlx.DB DB *sqlx.DB
ErupeConfig *config.Config ErupeConfig *_config.Config
} }
// Server is a MHF sign server. // Server is a MHF sign server.
type Server struct { type Server struct {
sync.Mutex sync.Mutex
logger *zap.Logger logger *zap.Logger
erupeConfig *config.Config erupeConfig *_config.Config
sessions map[int]*Session sessions map[int]*Session
db *sqlx.DB db *sqlx.DB
listener net.Listener listener net.Listener

View File

@@ -18,14 +18,14 @@ import (
type Config struct { type Config struct {
Logger *zap.Logger Logger *zap.Logger
DB *sqlx.DB DB *sqlx.DB
ErupeConfig *config.Config ErupeConfig *_config.Config
} }
// Server is the MHF custom launcher sign server. // Server is the MHF custom launcher sign server.
type Server struct { type Server struct {
sync.Mutex sync.Mutex
logger *zap.Logger logger *zap.Logger
erupeConfig *config.Config erupeConfig *_config.Config
db *sqlx.DB db *sqlx.DB
httpServer *http.Server httpServer *http.Server
isShuttingDown bool isShuttingDown bool