game_sync/machine/machinedoll/machinemgr.go

267 lines
5.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package machinedoll
import (
"encoding/json"
"fmt"
"net"
"os"
"path/filepath"
"time"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/module"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/goserver/srvlib"
"mongo.games.com/game/protocol/machine"
)
var GameConn *netlib.Session
var MachineMgr = &MachineManager{
ConnMap: map[int]*Conn{},
DelConnMap: make(map[int]string),
}
type Conn struct {
Id int
net.Conn
Addr string
}
type MachineManager struct {
ConnMap map[int]*Conn
DelConnMap map[int]string
}
func (this *MachineManager) ModuleName() string {
return "MachineManager"
}
func (this *MachineManager) Init() {
var serverAddrs []string
programDir, err := os.Getwd()
if err != nil {
logger.Logger.Error("Error getting working directory:", err)
return
}
configFile := filepath.Join(programDir, "machineIPConfig.json")
logger.Logger.Trace("构建配置文件的路径", configFile)
fileData, err := os.ReadFile(configFile)
if err != nil {
logger.Logger.Error("Read robot account file error:", err)
return
} else {
if err = json.Unmarshal(fileData, &serverAddrs); err != nil {
logger.Logger.Error("Unmarshal robot account data error:", err)
return
}
}
//与娃娃机创建连接
// 遍历每个服务器地址,建立连接
for i, addr := range serverAddrs {
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
if err != nil {
logger.Logger.Error("Failed to connect to server:", err)
continue
}
this.ConnMap[i+1] = &Conn{
Id: i + 1,
Conn: conn,
Addr: addr,
}
SetBaseParam(conn)
fmt.Println("与娃娃机连接成功!设置每台娃娃机基础配置!Id = ", i+1, "addr = ", addr)
}
/* fmt.Println("Connected to server:\n", this.ConnMap[1].RemoteAddr())
fmt.Println("投币请按Q")
fmt.Println("w向前s向后a向左d向右 j强力抓取k弱力抓取")
// 监听 WASD 按键事件
go listenKeyboardEvents(this.ConnMap[1])
// 监听中断信号,等待用户退出
waitForUserExit()*/
}
// 创建娃娃机链接
func (this *MachineManager) CreateConn(key int) *Conn {
fmt.Println("新建与娃娃机链接")
var serverAddrs []string
programDir, err := os.Getwd()
if err != nil {
logger.Logger.Error("Error getting working directory:", err)
return nil
}
configFile := filepath.Join(programDir, "machineIPConfig.json")
logger.Logger.Trace("构建配置文件的路径", configFile)
fileData, err := os.ReadFile(configFile)
if err != nil {
logger.Logger.Error("Read robot account file error:", err)
return nil
} else {
if err = json.Unmarshal(fileData, &serverAddrs); err != nil {
logger.Logger.Error("Unmarshal robot account data error:", err)
return nil
}
}
//与娃娃机创建连接
// 遍历每个服务器地址,建立连接
for i, addr := range serverAddrs {
if i+1 == key {
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
if err != nil {
logger.Logger.Error("Failed to connect to server:", err)
continue
}
this.ConnMap[i+1] = &Conn{
Id: i + 1,
Conn: conn,
Addr: addr,
}
return this.ConnMap[i+1]
}
}
return nil
}
func (this *MachineManager) Update() {
//向游戏服发送心跳包
pack := &machine.MSDollMachineHeartBeat{}
pack.TimeStamp = time.Now().UnixMilli()
SendToGameServer(int(machine.DollMachinePacketID_Packet_MSDollMachineHeartBeat), pack)
}
func (this *MachineManager) Shutdown() {
for _, v := range this.ConnMap {
v.Close()
this.UpdateToGameServer(v, 0)
}
module.UnregisteModule(this)
}
func (this *MachineManager) UpdateToGameServer(conn *Conn, status int32) {
msg := &machine.MSUpdateDollMachineStatus{}
msg.Id = int32(conn.Id)
msg.Status = status
msg.VideoAddr = conn.Addr
SendToGameServer(int(machine.DollMachinePacketID_PACKET_MSUpdateDollMachineStatus), msg)
}
func SendToGameServer(pid int, msg interface{}) {
GameConn = srvlib.ServerSessionMgrSington.GetSession(1, 7, 706)
if GameConn != nil {
GameConn.Send(pid, msg)
} else {
logger.Logger.Error("GameConn is nil !")
}
}
func init() {
module.RegisteModule(MachineMgr, time.Second, 0)
}
/*func listenKeyboardEvents(conn net.Conn) {
for {
// 读取键盘事件
key := readKeyboardEvent()
switch key {
case "w":
Backward(conn)
time.Sleep(200 * time.Millisecond)
BackwardStop(conn)
case "W":
Backward(conn)
time.Sleep(200 * time.Millisecond)
BackwardStop(conn)
case "a":
Left(conn)
time.Sleep(200 * time.Millisecond)
LeftStop(conn)
case "A":
Left(conn)
time.Sleep(200 * time.Millisecond)
LeftStop(conn)
case "s":
Forward(conn)
time.Sleep(200 * time.Millisecond)
ForwardStop(conn)
case "S":
Forward(conn)
time.Sleep(200 * time.Millisecond)
ForwardStop(conn)
case "d":
Right(conn)
time.Sleep(200 * time.Millisecond)
RightStop(conn)
case "D":
Right(conn)
time.Sleep(200 * time.Millisecond)
RightStop(conn)
case "j":
Grab(conn)
case "J":
Grab(conn)
case "k":
WeakGrab(conn)
case "K":
WeakGrab(conn)
case "q":
Coin(conn)
Backward(conn)
time.Sleep(200 * time.Millisecond)
BackwardStop(conn)
case "Q":
Coin(conn)
Backward(conn)
time.Sleep(150 * time.Millisecond)
BackwardStop(conn)
case "1":
RestoreFactorySettings(conn)
case "2":
OpenMusic(conn)
case "3":
Reboot(conn)
case "4":
StopServer(conn)
case "5":
StartServer(conn)
case "6":
ClearRemainingGames(conn)
case "7":
SetPower(conn)
case "8":
CloseMusic(conn)
case "9":
queryBaseParam(conn)
}
}
}*/
/*func readKeyboardEvent() string {
var b [1]byte
var done uint32
err := syscall.ReadFile(syscall.Stdin, b[:], &done, nil)
if err != nil {
panic(err)
}
return string(b[:])
}*/
/*func waitForUserExit() {
// 创建一个信号通道
signalChan := make(chan os.Signal, 1)
// 监听中断信号
signal.Notify(signalChan, os.Interrupt)
// 等待用户按下 Ctrl+C 退出
<-signalChan
fmt.Println("退出程序...")
}*/