hengyang_client/lua_probject/base_project/Game/View/WitnessView.lua

471 lines
15 KiB
Lua
Raw Normal View History

2025-08-28 15:02:07 +08:00
local MJMainView = require("main.majiang.MJMainView")
2025-09-11 21:11:49 +08:00
local MissileSender = import(".MissileSender")
2025-07-30 21:56:29 +08:00
local WitnessView = {}
2025-07-30 22:31:32 +08:00
2025-09-08 14:39:21 +08:00
local M = WitnessView
setmetatable(M, { __index = BaseView })
function M:init()
self._gamectr = ControllerManager.GetController(GameController)
self._room = DataManager.CurrenRoom
self._room.Witness = true
UIPackage.AddPackage('base/chat/ui/Chat')
self._eventmap = {}
2025-10-24 19:30:35 +08:00
-- self._scale = true
self._full = true
2025-09-10 20:32:26 +08:00
self._full_offset = false
self.class = "MainView"
2025-09-08 14:39:21 +08:00
self._style = 1
self._popEvent = true
2025-09-11 21:11:49 +08:00
self.Fix_Msg_Chat = ViewUtil.Fix_Msg_Chat -- 自动回复消息列表
2025-09-08 14:39:21 +08:00
self:InitView()
2025-07-30 22:31:32 +08:00
end
2025-09-11 21:11:49 +08:00
-- 语音是否禁止
local record_baned = 0
local function GetPlayer(self, playerId)
for _, p in pairs(self._room.player_list) do
if playerId == p.self_user.account_id then
return p
end
end
return nil
end
2025-09-08 14:39:21 +08:00
function M:InitView(url)
local room = self._room
BaseView.InitView(self, url)
2025-07-30 22:31:32 +08:00
self.com_logocType = self._view:GetChild("com_logo"):GetController("cType")
self._state = self._view:GetController("state")
2025-07-30 22:31:32 +08:00
2025-08-28 15:02:07 +08:00
self.com_notice = self._view:GetChild("com_notice")
2025-10-24 19:30:35 +08:00
if self._room.self_player.entrust then
self:MarkSelfTuoguan()
end
2025-08-28 15:02:07 +08:00
end
2025-09-11 21:11:49 +08:00
function M:EventInit()
local _gamectr = self._gamectr
local _room = self._room
_gamectr:AddEventListener(GameEvent.PlayerEnter, function(...)
ViewUtil.PlaySound("WitnessView", "base/main_majiang/sound/user_enter.mp3")
2025-09-11 21:11:49 +08:00
local arg = { ... }
local p = arg[1]
local info1 = self._player_info[self:GetPos(p.seat)]
info1:FillData(p)
info1._view.visible = true
local info2 = self._player_card_info[self:GetPos(p.seat)]
if info2.SetPlayer then
info2:SetPlayer(p)
info2:FillData()
end
2025-09-11 21:11:49 +08:00
end)
_gamectr:AddEventListener(GameEvent.PlayerLeave, function(...)
local arg = { ... }
local p = arg[1]
local info1 = self._player_info[self:GetPos(p.seat)]
info1._view.visible = false
ViewUtil.PlaySound("WitnessView", "base/main_majiang/sound/user_leave.mp3")
2025-09-11 21:11:49 +08:00
end)
_gamectr:AddEventListener(GameEvent.WitnessPlayerEnter, function(...)
ViewUtil.PlaySound("WitnessView", "base/main_majiang/sound/user_enter.mp3")
2025-09-11 21:11:49 +08:00
local arg = { ... }
local witnessPlayerList = arg[1]
self._room.witness_player_list = witnessPlayerList
local _room = DataManager.CurrenRoom
local viewList_witness = self._view:GetChild('comp_witness'):GetChild('list_players')
if viewList_witness.numItems == #_room.witness_player_list then
viewList_witness:RefreshVirtualList()
else
viewList_witness.numItems = #_room.witness_player_list
end
end)
_gamectr:AddEventListener(GameEvent.WitnessPlayerLeave, function(...)
---- print("刷新托管数据=====")
local arg = { ... }
local player = arg[1]
local witnessPlayerList = self._room.witness_player_list
for i, _player in ipairs(witnessPlayerList) do
if _player.aid == player then
table.remove(witnessPlayerList, i)
break
end
end
local _room = DataManager.CurrenRoom
local viewList_witness = self._view:GetChild('comp_witness'):GetChild('list_players')
print("linemng", _room._flag_updateWitness, #_room.witness_player_list, viewList_witness.numItems)
if viewList_witness.numItems == #_room.witness_player_list then
viewList_witness:RefreshVirtualList()
else
viewList_witness.numItems = #_room.witness_player_list
end
end)
_gamectr:AddEventListener(
GameEvent.TupGuanOpen,
function(...)
---- print("刷新托管数据=====")
local arg = { ... }
local p = arg[1]
local info = self._player_info[self:GetPos(p.seat)]
self._left_time = tonumber(arg[3]) or 0
if info and info.IsShowTGTips then
info:IsShowTGTips(arg[2], arg[3])
end
if info and info.SetShowTGTips then
info:SetShowTGTips(arg[2], arg[3])
end
end
)
_gamectr:AddEventListener(
GameEvent.Interaction,
function(...)
local arg = { ... }
local data = arg[1]
local _type = arg[2]
-- 扔番茄
if _type == 7 then
local sendSeat = arg[3].sendSeat
local targetSeat = arg[3].targetSeat
local Missile = arg[3].Missile
self:Missile(sendSeat, targetSeat, Missile)
end
local p = arg[1]
if not p or not p.seat or p.seat == 0 then
return
end
if DataManager.BanInteractRoom == _room.room_id and p.seat ~= _room.self_player.seat then
return
end
local info = self._player_info[self:GetPos(p.seat)]
local ttype = arg[2]
if ttype == 5 then
local parm = arg[3]
local array = split(parm, '_')
local tp = self._room:GetPlayerById(tonumber(array[2]))
if not tp or not tp.seat or tp.seat == 0 then
return
end
local pos = self._view:GlobalToLocal(info._view:LocalToGlobal(info:GetHeadCenter()))
if tp.seat == p.seat then
for i = 1, #_room.player_list do
local player = _room.player_list[i]
if player.seat ~= tp.seat then
tinfo = self._player_info[self:GetPos(player.seat)]
tpos = self._view:GlobalToLocal(tinfo._view:LocalToGlobal(tinfo:GetHeadCenter()))
self:PlayInteractAnimation(array[1], pos, tpos)
end
end
else
local tinfo = self._player_info[self:GetPos(tp.seat)]
local tpos = self._view:GlobalToLocal(tinfo._view:LocalToGlobal(tinfo:GetHeadCenter()))
self:PlayInteractAnimation(array[1], pos, tpos)
end
elseif ttype == 3 then
if record_baned == 0 then
info:ShowInteraction(ttype, arg[3])
end
else
info:ShowInteraction(ttype, arg[3])
end
end
)
2025-09-12 15:36:45 +08:00
_gamectr:AddEventListener(GameEvent.OnUpdateInfo, function(...)
local arg = { ... }
local p = arg[1]
local t = arg[2]
-- 托管状态变化
if t == 5 then
if p == DataManager.CurrenRoom.self_player then
2025-10-24 19:30:35 +08:00
local player_info = self._player_info[self:GetPos(p.seat)]
2025-09-12 15:36:45 +08:00
if p.entrust then
self:closeTipOnTuoguan()
self:MarkSelfTuoguan()
2025-10-24 19:30:35 +08:00
player_info:MarkTuoguan()
2025-09-12 15:36:45 +08:00
else
self:UnmarkSelfTuoguan()
2025-10-24 19:30:35 +08:00
player_info:UnmarkTuoguan()
2025-09-12 15:36:45 +08:00
end
else
local player_info = self._player_info[self:GetPos(p.seat)]
if p.entrust then
player_info:MarkTuoguan()
else
player_info:UnmarkTuoguan()
end
end
end
end)
2025-09-18 13:32:05 +08:00
_gamectr:AddEventListener(GameEvent.AddScore, handler(self, self.OnAddScoreAnimation))
2025-10-24 19:30:35 +08:00
_gamectr:AddEventListener(
GameEvent.PlayerState,
function(...)
printlog("lingmeng OnEventOnlineState")
local arg = { ... }
local p = arg[1]
local info = self._player_info[self:GetPos(p.seat)]
info._ctr_offline.selectedIndex = p.line_state == 0 and 1 or 0
end
)
2025-09-12 15:36:45 +08:00
end
-- 标记自己托管
function M:MarkSelfTuoguan()
if self._com_tuoguan then
return
end
self._com_tuoguan = UIPackage.CreateObjectFromURL('ui://Common/com_tuoguan_self')
local com_tuoguan = self._com_tuoguan
2025-10-24 19:30:35 +08:00
self._view:AddChildAt(com_tuoguan, self._view:GetChildIndex(self._view:GetChild('btn_setting')) - 1)
-- GRoot.inst:AddChild(com_tuoguan)
com_tuoguan:GetChild('btn_cancel_tuoguan').visible = false
2025-09-16 21:35:09 +08:00
com_tuoguan:MakeFullScreen()
com_tuoguan:Center()
2025-09-12 15:36:45 +08:00
end
-- 取消标记自己托管
function M:UnmarkSelfTuoguan()
if self._com_tuoguan then
self._com_tuoguan:Dispose()
self._com_tuoguan = nil
end
end
-- 托管时关闭一些提示窗口,如起手胡、吃碰提示、海底,由扩展实现
function M:closeTipOnTuoguan()
2025-09-11 21:11:49 +08:00
end
function M:PlayChatSound(sex, chat_index)
local sex_path = ViewUtil.Sex_Chat[sex]
local path1 = string.format('base/common/sound/%s/chat_%s.mp3', sex_path, tostring(chat_index - 1))
GameApplication.Instance:PlaySound('base_chat', path1)
-- GameApplication.Instance:PlaySound(path1)
end
-- 获取消息使用的语言、序号
function M:GetChatMsgLanguage(msg_index)
local language = math.modf(msg_index / 100)
local index = math.fmod(msg_index, 100)
return language, index
end
function M:Missile(seat, targetSeat, Missile)
local animUrl = ""
local url = ""
if Missile == "boom" then
animUrl = "ui://Main_Majiang/bomb"
url = "ui://Common/boom"
elseif Missile == "egg" then
animUrl = "ui://Main_Majiang/egg"
url = "ui://Common/egg"
elseif Missile == "diamo" then
animUrl = "ui://Main_Majiang/jiezhi"
url = "ui://Common/diamo"
elseif Missile == "flower" then
animUrl = "ui://Main_Majiang/flower"
url = "ui://Common/flower"
end
local send = self._player_info[self:GetPos(seat)]
local target = self._player_info[self:GetPos(targetSeat)]
MissileSender.Send(url, send, target, self, animUrl, Missile, 5, 1)
end
2025-09-08 14:39:21 +08:00
function M:Show()
2025-08-28 15:02:07 +08:00
getmetatable(WitnessView).__index.Show(self)
self:DoNoticeAnimation()
end
2025-09-08 14:39:21 +08:00
function M:DoNoticeAnimation()
2025-08-28 15:02:07 +08:00
self.noticeIndex = self.noticeIndex or 1
if not DataManager.GameNotice or #DataManager.GameNotice == 0 then
return
end
local text_notice = self.com_notice:GetChild("text_notice")
text_notice.text = DataManager.GameNotice[self.noticeIndex]
local speed = 44
local time = text_notice.width / speed
text_notice.x = self.com_notice.width
local tween = text_notice:TweenMove(Vector2(-text_notice.width, text_notice.y), time):OnComplete(function()
self:DoNoticeAnimation()
end)
tween:SetEase(EaseType.Linear)
self.noticeIndex = self.noticeIndex + 1
if self.noticeIndex > #DataManager.GameNotice then
self.noticeIndex = 1
end
2025-09-03 21:58:19 +08:00
--强制让牌类型为1只有一种牌
self._room.card_type = 1
2025-07-30 21:56:29 +08:00
end
2025-09-18 13:32:05 +08:00
function M:OnAddScoreAnimation(...)
print("OnAddScoreAnimation")
local arg = { ... }
local totalScoreList = arg[2].totalScoreList
local playerList = arg[2].playerList
local addScoreList = arg[2].addScoreList
pt(arg)
local scoreData = {}
for i = 1, #totalScoreList do
local p = {}
p.totalScore = totalScoreList[i]
p.player = playerList[i]
p.addScore = addScoreList[i]
scoreData[#scoreData + 1] = p
end
for _, p in pairs(scoreData) do
local infoView = self:GetPlayerInfo(p.player)
local player = GetPlayer(self, p.player)
player.cur_hp = p.totalScore
if p.addScore ~= 0 then
infoView:ScoreAnimation(p.addScore)
if player.cur_hp >= 0 then
infoView._view:GetChild("text_jifen").text = "+" .. player.cur_hp
else
infoView._view:GetChild("text_jifen").text = player.cur_hp
end
end
end
end
2025-09-10 20:32:26 +08:00
function M:OnUpdate()
2025-09-11 21:11:49 +08:00
local deltaTime = Time.deltaTime
2025-09-10 20:32:26 +08:00
if (self._popEvent) then
local func = self._gamectr:PopEvent()
if (func ~= nil) then
local success, result = pcall(func)
if success then
else
print("witness error")
print(result)
error(result)
end
end
end
2025-09-11 21:11:49 +08:00
2025-10-24 19:30:35 +08:00
local _left_time = self._left_time or 0
if (_left_time > 0) then
2025-09-11 21:11:49 +08:00
_left_time = _left_time - deltaTime
_left_time = math.max(0, _left_time)
local leftTime = math.floor(_left_time)
2025-10-24 19:30:35 +08:00
--旧的拼接方式
-- if leftTime < 10 then
-- self._tex_leftTime.text = '0' .. tostring(leftTime)
-- for i = 2, 4 do
-- local text = self["_tex_leftTime" .. i]
-- if text then
-- text.text = '0' .. tostring(leftTime)
-- end
-- end
-- else
-- self._tex_leftTime.text = tostring(leftTime)
-- for i = 2, 4 do
-- local text = self["_tex_leftTime" .. i]
-- if text then
-- text.text = tostring(leftTime)
-- end
-- end
-- end
2025-09-11 21:11:49 +08:00
self._tex_leftTime.text = string.format("%02d", _left_time)
self._left_time = _left_time
-- 桌面計時器聲音
if not self._curtime then
self._curtime = 15
end
2025-10-24 19:30:35 +08:00
if leftTime <= self._leftTime_xiangling and self._curtime ~= leftTime and leftTime ~= 0 then
2025-09-11 21:11:49 +08:00
self._curtime = leftTime
GameApplication.Instance:PlaySound('base/common/sound/timeup_alarm.mp3')
end
2025-10-24 19:30:35 +08:00
if self._leftTime_bianhong then
if leftTime <= 5 then
if self._tex_leftTime:GetController('poker_Color') then
self._tex_leftTime:GetController('poker_Color').selectedIndex = 1
end
else
if self._tex_leftTime:GetController('poker_Color') then
self._tex_leftTime:GetController('poker_Color').selectedIndex = 0
end
end
end
2025-09-11 21:11:49 +08:00
else
2025-10-24 19:30:35 +08:00
self:onLeftTimeOver()
2025-09-11 21:11:49 +08:00
if self._tex_leftTime then
self._tex_leftTime.text = '00'
end
for i = 2, 4 do
local text = self["_tex_leftTime" .. i]
if text then
text.text = '00'
end
end
end
2025-09-10 20:32:26 +08:00
end
2025-10-24 19:30:35 +08:00
function M:onLeftTimeOver()
end
2025-09-10 20:32:26 +08:00
function M:DestroyPlayerInfo()
for i = 1, #self._player_info do
self._player_info[i]:Destroy()
end
end
function M:Destroy()
TimerManager.Clear()
2025-09-12 15:36:45 +08:00
self:UnmarkSelfTuoguan()
2025-09-10 20:32:26 +08:00
self:DestroyPlayerInfo()
DSTweenManager.ClearTween()
MissileSender.Clear()
2025-09-10 20:32:26 +08:00
NetResetConnectWindow.CloseNetReset()
Voice.CrealRecord()
ControllerManager.resetJionRoom = false
self._popEvent = false
GRoot.inst:HidePopup()
2025-11-06 17:37:53 +08:00
ViewUtil.CloseModalWait2()
2025-09-10 20:32:26 +08:00
GameApplication.Instance.StopMusic = 0
coroutine.stopAll()
UpdateBeat:Remove(self.OnUpdate, self)
BaseView.Destroy(self)
BaseWindow.DestroyAll()
ResourcesManager.UnLoadGroup('base_chat')
end
2025-09-08 14:39:21 +08:00
return M