jx_client_neibu/lua_probject/base_project/Game/Controller/GameController.lua

705 lines
20 KiB
Lua
Raw Normal View History

2025-04-01 10:48:36 +08:00
--- Base GameEvent
GameEvent = {
-- 状态
PlayerState = 'PlayerState',
-- 聊天
Interaction = 'Interaction',
-- 玩家离开
PlayerLeave = 'PlayerLeave',
-- 玩家进入
PlayerEnter = 'PlayerEnter',
2025-06-16 15:24:27 +08:00
-- 观战玩家离开
WitnessPlayerLeave = 'WitnessPlayerLeave',
-- 观战玩家进入
WitnessPlayerEnter = 'WitnessPlayerEnter',
2025-04-01 10:48:36 +08:00
-- 玩家准备
PlayerReady = 'PlayerReady',
-- 解散
DeskBreak = 'DeskBreak',
-- 被踢出房间
OnKicked = 'OnKicked',
-- 更新玩家信息
OnUpdateInfo = 'OnUpdateInfo',
2025-04-11 12:49:08 +08:00
--打开托管
TupGuanOpen = 'TupGuanOpen',
--关闭托管
TupGuanClose = 'TupGuanClose',
--麻将修改牌大小
MJModifySzie = 'MJModifySzie',
2025-07-11 21:37:35 +08:00
--翻字
FangziAnimation = "FangziAnimation",
2025-07-19 16:32:03 +08:00
--加减分
AddScore = "AddScore",
--推送道具互动
2025-07-20 06:21:43 +08:00
MISSILE = "MISSILE",
2025-07-20 06:21:43 +08:00
--Home状态推送
HOMESTATE = "HOMESTATE",
2025-04-01 10:48:36 +08:00
}
--- Base GameController
GameController = {
_name = '',
--事件MAP
_eventmap = nil,
--事件缓存
_cacheEvent = nil,
--事件发送器
_dispatcher = nil
}
local M = GameController
2025-04-11 12:49:08 +08:00
setmetatable(M, { __index = IController })
2025-04-01 10:48:36 +08:00
function M:init(name)
self._name = name
self.baseType = GameController
self._cacheEvent = Queue.new(1000)
self._eventmap = {}
self._dispatcher = {}
2025-04-11 12:49:08 +08:00
self._eventmap[Protocol.FGMGR_EVT_UPDATE_RECONECT] = self.ResetConnect
2025-04-01 10:48:36 +08:00
self._eventmap[Protocol.GAME_EVT_PLAYER_JOIN] = self.OnEventPlayerEnter
self._eventmap[Protocol.GAME_EVT_PLAYER_NET_STATE] = self.OnEventOnlineState
self._eventmap[Protocol.GAME_EVT_PLAYER_EXIT] = self.OnEventPlayerLeave
self._eventmap[Protocol.GAME_EVT_READY] = self.OnEventPlayerReady
2025-04-11 12:49:08 +08:00
self._eventmap[Protocol.GAME_EVT_READY_AND_XIPAI] = self.OnEventPlayerXiPaiReady
2025-04-01 10:48:36 +08:00
self._eventmap[Protocol.GAME_EVT_EXIT_ROOM_DISMISS] = self.OnEventExitRoomDismiss
self._eventmap[Protocol.GAME_EVT_DISMISS_ROOM] = self.OnEventDismissRoom
2025-08-06 18:34:58 +08:00
--self._eventmap[Protocol.GAME_EVT_DISMISS_ROOM_VOTE] = self.OnEventDismissRoomVote
2025-04-01 10:48:36 +08:00
self._eventmap[Protocol.GAME_EVT_DISMISS_ROOM_FAIL] = self.OnEventDismissRoomFail
self._eventmap[Protocol.GAME_EVT_INTERACTION] = self.OnEventInteraction
self._eventmap[Protocol.GAME_EVT_UPDATE_GPS] = self.OnEventUpdateGPS
self._eventmap[Protocol.GAME_EVT_KICKED] = self.OnEventKicked
self._eventmap[Protocol.GAME_EVT_UPDATE_PLAYERINFO] = self.OnEvtUpdateInfo
2025-04-11 12:49:08 +08:00
self._eventmap[Protocol.GAME_EVT_READY_ENTRUST] = self.OnEvtOpenTupGTips
self._eventmap[Protocol.GAME_EVT_CANCEL_READY_ENTRUST] = self.OnEvtCloseTupGTips
2025-06-16 15:24:27 +08:00
self._eventmap[Protocol.GAME_EVT_WITNESS_ROOM] = self.OnEvtEnterWitness
self._eventmap[Protocol.GAME_EVT_Exit_WITNESS_ROOM] = self.OnEvtExieWitness
2025-07-18 16:02:20 +08:00
self._eventmap[Protocol.GAME_GANGFEN] = self.OnEvtGANGFEN
2025-07-20 06:21:43 +08:00
self._eventmap[Protocol.GAME_HOME_STATE] = self.OnEvtHomeState
2025-04-11 12:49:08 +08:00
--self._eventmap[Protocol.GAME_AUTO_CARD] = self.OnEvtOpenGameHuTuoGtips
2025-04-01 10:48:36 +08:00
end
function DispatchEvent(_dispatcher, evt_name, ...)
local func = _dispatcher[evt_name]
if func then
func(...)
end
end
function M:AddEventListener(evt_name, func)
self._dispatcher[evt_name] = func
end
function M:ResetConnect()
2025-04-11 12:49:08 +08:00
-- -- print("断线重连================")
--ControllerManager.OnConnect(SocketCode.TimeoutDisconnect)
ViewManager.refreshGameView()
2025-04-01 10:48:36 +08:00
end
----------------------请求------------------------------------
--请求准备
function M:PlayerReady()
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
2025-04-11 12:49:08 +08:00
print("====================================1发送准备")
2025-04-01 10:48:36 +08:00
_client:send(Protocol.GAME_READY)
end
function M:PlayerXiPai()
2025-04-11 12:49:08 +08:00
local _client = ControllerManager.GameNetClinet
2025-04-01 10:48:36 +08:00
if not _client then
return
end
_client:send(Protocol.GAME_READY_AND_XIPAI)
end
--请求准备
function M:StartGame()
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
_client:send(Protocol.GAME_START)
end
2025-06-09 17:41:34 +08:00
--临时
--观战进入房间
function M:WitnessGame(group_id, player_id, room_id)
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
local _data = {}
_data["group_id"] = 0
_data["player_id"] = 0
_data["room_id"] = 0
_client:send(Protocol.GAME_WITNESS_ROOM, _data)
end
2025-07-04 19:36:00 +08:00
function M:ExitWitnessGame(pid, gid, rid)
2025-06-10 20:36:42 +08:00
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
local _data = {}
2025-07-04 19:36:00 +08:00
_data["pid"] = pid
_data["gid"] = gid
_data["room_id"] = rid
2025-06-10 20:36:42 +08:00
_client:send(Protocol.GAME_Exit_WITNESS_ROOM, _data)
2025-08-28 15:02:07 +08:00
_client:destroy()
2025-06-10 20:36:42 +08:00
end
2025-04-01 10:48:36 +08:00
--聊天
--<param name="playid"></param>
--<param name="type">1表情 2固定语音 3语音 4文本 5互动</param>
--<param name="parm"></param>
function M:SendInteraction(playid, type, parm, callback)
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
local _data = {}
_data['playerid'] = playid
_data['type'] = type
_data['parm'] = parm
2025-08-06 15:26:47 +08:00
_data['gid'] = 1
2025-08-05 20:29:11 +08:00
_client:send(Protocol.GAME_INTERACTION, _data, function(res)
2025-08-06 16:19:08 +08:00
if callback then
callback(res)
end
2025-08-05 20:29:11 +08:00
end)
2025-04-01 10:48:36 +08:00
end
--请求离开房间
function M:LevelRoom(callBack)
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
_client:send(
Protocol.GAME_EXIT_ROOM,
nil,
function(res)
if res.ReturnCode == 0 then
ControllerManager.ChangeController(LoddyController)
end
callBack(res)
end
)
end
--请求解散房间
function M:AskDismissRoom()
local _curren_msg = MsgWindow.new(self._root_view, '是否发起解散?', MsgWindow.MsgMode.OkAndCancel)
_curren_msg.onOk:Add(function()
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
2025-04-11 12:49:08 +08:00
_client:send(Protocol.GAME_ASK_DISMISS_ROOM, nil, function(res)
2025-04-01 10:48:36 +08:00
if res.ReturnCode == 84 then
2025-04-11 12:49:08 +08:00
ViewUtil.ErrorTip(res.ReturnCode, "解散失败")
2025-04-01 10:48:36 +08:00
end
end)
end)
_curren_msg:Show()
end
--解散房间投票
function M:DismissRoomVote(agree)
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
2025-04-11 12:49:08 +08:00
-- -- print(agree)
2025-04-01 10:48:36 +08:00
local _data = {}
_data['result'] = agree
_client:send(Protocol.GAME_DISMISS_ROOM_VOTE, _data)
end
--发送GPS坐标
function M:SendGPS(str)
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
local _data = {}
_data['pos'] = str
_client:send(Protocol.GAME_SEND_GPS, _data)
end
2025-07-19 16:32:03 +08:00
function M:SendMissile(_)
local _client = ControllerManager.GameNetClinet
local _data = {}
_client:send(Protocol.GAME_SENDMISSILE, _data)
end
2025-04-01 10:48:36 +08:00
--------------------事件-----------------------------------
-- 房主退出 房间解散
function M:OnEventExitRoomDismiss(evt_data)
self._cacheEvent:Enqueue(
function()
ControllerManager.ChangeController(LoddyController)
DispatchEvent(self._dispatcher, GameEvent.DeskBreak, 1)
end
)
end
-- 显示投票选择
function M:OnEventDismissRoom(evt_data)
self._cacheEvent:Enqueue(
function()
local room = DataManager.CurrenRoom
local req_aid = evt_data['req_aid']
evt_data.req_p = room:GetPlayerById(req_aid)
local player_list = room.player_list
local tem_list = {}
local list = evt_data['list']
for k = 1, #player_list do
local p = nil
for i = 1, #list do
local tem = list[i]
if tem.aid == player_list[k].self_user.account_id then
tem.player = player_list[k]
p = tem
break
end
end
if not p then
p = {}
p.player = player_list[k]
p.result = 0
end
tem_list[k] = p
end
evt_data['list'] = tem_list
DispatchEvent(self._dispatcher, GameEvent.DeskBreak, 0, evt_data)
end
)
end
-- -- 投票结果
-- function M:OnEventDismissRoomVote(evt_data)
-- local aid = evt_data["aid"]
-- local result = evt_data["result"]
-- local p = DataManager.CurrenRoom:GetPlayerById(aid)
-- DispatchEvent(self._dispatcher,GameEvent.DeskBreak, 2,p,result)
-- end
-- 解散失敗
function M:OnEventDismissRoomFail(evt_data)
self._cacheEvent:Enqueue(
function()
DispatchEvent(self._dispatcher, GameEvent.DeskBreak, 3)
end
)
end
-- 玩家进
function M:OnEventPlayerEnter(evt_data)
2025-06-11 16:45:21 +08:00
print("进入房间++++++++++++++++++++++++++++++++++++++")
2025-04-01 10:48:36 +08:00
self._cacheEvent:Enqueue(
function()
local p = self._room:NewPlayer()
local _user
_user = User.new()
_user.account_id = evt_data['aid']
_user.host_ip = evt_data['ip']
_user.nick_name = evt_data['nick']
_user.head_url = evt_data['portrait']
_user.sex = evt_data['sex']
_user.location = Location.new(evt_data['pos'] or '')
p.seat = evt_data['seat']
p.ready = evt_data['ready'] == 1 and true or false
p.cur_hp = evt_data['cur_hp'] or 0
p.spectator = evt_data['spectator']
-- p.total_hp = evt_data["total_hp"] or 0
if evt_data['hp_info'] then
p.cur_hp = evt_data.hp_info.cur_hp
2025-04-11 12:49:08 +08:00
-- p.total_hp = evt_data.hp_info.total_hp
2025-04-01 10:48:36 +08:00
end
p.self_user = _user
p.line_state = 1
DataManager.CurrenRoom:AddPlayer(p)
DispatchEvent(self._dispatcher, GameEvent.PlayerEnter, p)
end
)
end
-- 玩家离开
function M:OnEventPlayerLeave(evt_data)
self._cacheEvent:Enqueue(
function()
local playerid = evt_data['aid']
local p = DataManager.CurrenRoom:GetPlayerById(playerid)
self._room:RemovePlayer(p)
DispatchEvent(self._dispatcher, GameEvent.PlayerLeave, p)
end
)
end
-- 网络状态更新
function M:OnEventOnlineState(evt_data)
2025-08-26 17:25:29 +08:00
printlog("lingmeng OnEventOnlineState")
2025-04-01 10:48:36 +08:00
self._cacheEvent:Enqueue(
function()
2025-08-26 17:25:29 +08:00
printlog("lingmeng OnEventOnlineState1")
2025-04-01 10:48:36 +08:00
local playerid = evt_data['aid']
local online = evt_data['online']
local player = DataManager.CurrenRoom:GetPlayerById(playerid)
if player ~= nil then
player.line_state = online
DispatchEvent(self._dispatcher, GameEvent.PlayerState, player)
end
end
)
end
-- 玩家准备
function M:OnEventPlayerReady(evt_data)
self._cacheEvent:Enqueue(
function()
local pid = evt_data['aid']
local p = self._room:GetPlayerById(pid)
p.ready = true
2025-04-11 12:49:08 +08:00
if evt_data.start ~= nil then
if evt_data.start == 1 then
p.isSendCardState = true
else
p.isSendCardState = false
end
else
p.isSendCardState = false
end
2025-04-01 10:48:36 +08:00
DispatchEvent(self._dispatcher, GameEvent.PlayerReady, p)
end
)
end
function M:OnEventPlayerXiPaiReady(evt_data)
self._cacheEvent:Enqueue(
function()
local pid = evt_data['aid']
local p = self._room:GetPlayerById(pid)
p.ready = true
2025-04-11 12:49:08 +08:00
if evt_data.start ~= nil then
if evt_data.start == 1 then
p.isSendCardState = true
else
p.isSendCardState = false
end
else
p.isSendCardState = false
end
2025-04-01 10:48:36 +08:00
DispatchEvent(self._dispatcher, GameEvent.PlayerReady, p)
end
)
end
-- 聊天事件
function M:OnEventInteraction(evt_data)
--[[
2025-04-01 10:48:36 +08:00
if self._room.ban_chat1 == false or self._room.ban_chat2 == false then
self._cacheEvent:Enqueue(
function()
local playerid = evt_data['playerid']
local p = self._room:GetPlayerById(playerid)
local type1 = evt_data['type']
local parm = evt_data['parm']
DispatchEvent(self._dispatcher, GameEvent.Interaction, p, type1, parm)
end)
end]]
self._cacheEvent:Enqueue(function()
local playerid = evt_data['playerid']
local p = self._room:GetPlayerById(playerid)
local type1 = evt_data['type']
local parm = evt_data['parm']
DispatchEvent(self._dispatcher, GameEvent.Interaction, p, type1, parm)
end)
2025-04-01 10:48:36 +08:00
end
-- GPS更新事件
function M:OnEventUpdateGPS(evt_data)
self._cacheEvent:Enqueue(
function()
local seat = evt_data['seat']
local pos = evt_data['pos']
if seat == 0 or seat == 'skip' then
return
end
local p = self._room:GetPlayerBySeat(seat)
p.self_user.location = Location.new(pos)
end
)
end
-- 被踢出房间事件
function M:OnEventKicked()
if ViewManager.GetCurrenView().dview_class == LobbyView then
DataManager.CurrenRoom = nil
ControllerManager.SetGameNetClient(nil, true)
ControllerManager.ChangeController(LoddyController)
return
end
self._cacheEvent:Enqueue(
function()
DataManager.CurrenRoom = nil
ControllerManager.SetGameNetClient(nil, true)
ControllerManager.ChangeController(LoddyController)
DispatchEvent(self._dispatcher, GameEvent.OnKicked)
end
)
end
-- 托管
function M:Entrust(ok, info)
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
local data = {}
data.ok = ok
data.info = info
_client:send(Protocol.GAME_ENTRUST, data)
end
-- 入座
function M:JoinSeat(callback)
local _client = ControllerManager.GameNetClinet
if not _client then
return
end
_client:send(Protocol.GAME_JOIN_SEAT, nil, function(res)
if res.ReturnCode == 0 then
self._room.self_player.spectator = false
end
if callback then
callback(res)
end
end)
end
-- 更新事件
function M:OnEvtUpdateInfo(evt_data)
self._cacheEvent:Enqueue(
function()
local pid = evt_data['aid']
local p = self._room:GetPlayerById(pid)
local t = evt_data['type']
if t == 5 then
p.entrust = evt_data['entrust']
end
DispatchEvent(self._dispatcher, GameEvent.OnUpdateInfo, p, t)
end
)
end
function M:ClearPlayerData()
local _room = self._room
for i = 1, #_room.player_list do
_room.player_list[i]:Clear()
end
end
function M:PopEvent()
local _cacheEvent = self._cacheEvent
if (_cacheEvent:Count() > 0) then
return _cacheEvent:Dequeue()
end
end
local function list_add(list, val)
if not list_check(list, val) then
table.insert(list, val)
end
end
-- 检查 gps距离、ip地址
function M:CheckGPS()
local plist = {}
local warnList = {}
local ipList = {}
local player_list = self._room.player_list
-- GPS
for i = 1, #player_list do
local player1 = player_list[i]
if player1.self_user ~= DataManager.SelfUser then
local loc1 = player1.self_user.location
if not loc1 or loc1.default then
-- 数据类型gps警告只有此处使用了
-- type0.没有打开gps1.距离过近2.ip地址一样
local warn = {}
warn.type = 0
warn.seat = player1.seat
return true
elseif i < #player_list then
for j = i + 1, #player_list do
local player2 = player_list[j]
if player2.self_user ~= DataManager.SelfUser then
local loc2 = player2.self_user.location
if not loc2 or loc2.default then
local warn = {}
warn.type = 0
warn.seat = player2.seat
return true
else
local dist = loc1:CalcDistance(loc2)
if dist < 0.2 then
local warn = {}
warn.type = 1
warn.seat = player1.seat
warn.seat2 = player2.seat
return true
end
end
end
end
end
end
local p = player1
if p.self_user ~= DataManager.SelfUser then
local ip = p.self_user.host_ip
if not list_check(ipList, ip) then
table.insert(ipList, ip)
else
return true
end
end
end
return false
end
function M:GetGPS()
-- if not DataManager.SelfUser.location.default then return end
-- 获取GPS
get_gps(
function()
self:SendGPS(DataManager.SelfUser.location:Location2String())
end
)
end
function M:OnEnter()
if (debug_print) then
2025-04-11 12:49:08 +08:00
-- print(self._name .. '进入Game控制器')
2025-04-01 10:48:36 +08:00
end
self._room = DataManager.CurrenRoom
local _client = ControllerManager.GameNetClinet
_client.onevent:Add(self.__OnNetEvent, self)
-- self:GetGPS()
end
function M:OnExit()
if (debug_print) then
2025-04-11 12:49:08 +08:00
-- print(self._name .. ' 离开Game控制器')
2025-04-01 10:48:36 +08:00
end
ControllerManager.SetGameNetClient(nil)
self._cacheEvent:Clear()
end
function M:__OnNetEvent(msg)
2025-04-11 12:49:08 +08:00
---- print("Game消息ID===>>"..msg.Command)
2025-04-01 10:48:36 +08:00
local func = self._eventmap[msg.Command]
if (func ~= nil) then
func(self, msg.Data)
end
end
function M:ReturnToRoom()
local roomCtr = ControllerManager.GetController(RoomController)
roomCtr:PublicJoinRoom(
Protocol.WEB_FG_JOIN_ROOM,
self.tmpRoomID,
false,
function(response)
if (response.ReturnCode == -1) then
ViewUtil.CloseModalWait('join_room')
RestartGame()
return
end
ViewManager.ChangeView(ViewManager.View_Main, DataManager.CurrenRoom.game_id)
ViewUtil.CloseModalWait('join_room')
end,
self.tmpGroupID
)
end
function M:OnEvtOpenTupGTips(msg)
2025-04-11 12:49:08 +08:00
---- print("显示托管倒计时=====================")
pt(msg)
local pid = msg['aid']
2025-04-01 10:48:36 +08:00
local p = self._room:GetPlayerById(pid)
2025-04-11 12:49:08 +08:00
local t = msg['time']
DispatchEvent(self._dispatcher, GameEvent.TupGuanOpen, p, true, t)
2025-04-01 10:48:36 +08:00
end
function M:OnEvtCloseTupGTips(msg)
2025-04-11 12:49:08 +08:00
---- print("关闭托管倒计时=================")
--pt(msg)
local pid = msg['aid']
2025-04-01 10:48:36 +08:00
local p = self._room:GetPlayerById(pid)
2025-04-11 12:49:08 +08:00
local t = msg['time']
DispatchEvent(self._dispatcher, GameEvent.TupGuanOpen, p, false, t)
2025-04-01 10:48:36 +08:00
end
2025-07-18 16:02:20 +08:00
function M:OnEvtGANGFEN(msg)
print("有人得分了")
2025-07-19 16:32:03 +08:00
DispatchEvent(self._dispatcher, GameEvent.AddScore, nil, msg)
end
2025-04-11 12:49:08 +08:00
function M:DispatchEventTuoGuan(p, isShow, t)
DispatchEvent(self._dispatcher, GameEvent.TupGuanOpen, p, isShow, t)
2025-04-01 10:48:36 +08:00
end
function M:OnEvtOpenGameHuTuoGtips(isAuto)
2025-04-11 12:49:08 +08:00
local _client = ControllerManager.GameNetClinet
2025-04-01 10:48:36 +08:00
if not _client then
return
end
local data = {}
data.autoCard = isAuto
_client:send(Protocol.GAME_AUTO_CARD, data)
2025-04-11 12:49:08 +08:00
end
2025-06-16 15:24:27 +08:00
function M:OnEvtEnterWitness(msg)
DispatchEvent(self._dispatcher, GameEvent.WitnessPlayerEnter, msg.tableInfo.playerSpectatorData)
end
function M:OnEvtExieWitness(msg)
DispatchEvent(self._dispatcher, GameEvent.WitnessPlayerLeave, msg.playyer)
end
2025-07-11 21:37:35 +08:00
function M:OnEventFzAction(msg)
DispatchEvent(self._dispatcher, GameEvent.FangziAnimation, msg)
end
2025-07-20 06:21:43 +08:00
function M:OnEvtHomeState(msg)
DispatchEvent(self._dispatcher, GameEvent.HOMESTATE, msg)
end