Files
Main/Assets/GameAssets/Resources/Lua/Logic/Team/TeamSystem.lua
2025-01-25 04:38:09 +08:00

590 lines
19 KiB
Lua
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.

------------------------------------------------
--作者: yangqf
--日期: 2021-03-12
--文件: TeamSystem.lua
--模块: TeamSystem
--描述: 队伍系统
------------------------------------------------
local FreeDomerInfo = require "Logic.Team.FreeDomerInfo"
local TeamInfo = require "Logic.Team.TeamInfo"
local TeamMemberInfo = require "Logic.Team.TeamMemberInfo"
local TeamSystem = {
--组队功能开启等级
TeamOpenLv = 0,
--最大队员数量
MaxPlayerNum = 2,
--队伍信息
MyTeamInfo = TeamInfo:New(),
--邀请列表信息
InviteInfos = List:New(),
--申请列表信息
ApplyInfos = List:New(),
--快速组队的所有队伍信息
TeamInfos = List:New(),
HanHuaCDTime = 0,
CuiCuCDTime = 0,
ApplyLeaderCDTime = 0,
--正在匹配
IsMatching = false,
-- 当前选中的副本ID
CurrSelectMapID = 0,
DeltaTime = 0.0,
CuiCuDeltaTime = 0.0,
ApplyLeaderDeltaTime = 0.0,
}
--队伍是否满员
function TeamSystem:IsMemberFull()
return #self.MyTeamInfo.MemberList >= self.MaxPlayerNum
end
function TeamSystem:IsExitApply(playerId)
local _count = #self.ApplyInfos
for i = 1, _count do
if self.ApplyInfos[i].PlayerID == playerId then
return true
end
end
return false
end
function TeamSystem:Initialize()
self.MaxPlayerNum = tonumber(DataConfig.DataGlobal[1482].Params)
local _cfg = DataConfig.DataFunctionStart[FunctionStartIdCode.Team]
if _cfg ~= nil then
local _param = Utils.SplitNumber(_cfg.StartVariables, '_')
self.TeamOpenLv = _param[2]
end
end
-- 请求创建队伍
function TeamSystem:ReqCreateTeam(cfgID, autoAccept)
GameCenter.Network.Send("MSG_Team.ReqCreateTeam", {type = cfgID, autoAccept = autoAccept})
if cfgID == 6002 then
GameCenter.BISystem:ReqClickEvent(BiIdCode.XMHJCreatTeam)
elseif cfgID == 6003 then
GameCenter.BISystem:ReqClickEvent(BiIdCode.SLTCreatTeam)
end
end
--请求队伍的信息
function TeamSystem:ReqGetTeamInfo()
GameCenter.Network.Send("MSG_Team.ReqGetTeamInfo")
end
--请求调整队伍
function TeamSystem:ReqAlterTeam(isNotice, inType)
local _teamid = self.MyTeamInfo.TeamID
GameCenter.Network.Send("MSG_Team.ReqAlterTeam", {isNotice = isNotice, type = inType})
self.MyTeamInfo.IsNotice = isNotice
self.MyTeamInfo.Type = inType
end
--一键喊话收人
function TeamSystem:ReqOneHan(teamType)
local _type = self.MyTeamInfo.Type
if teamType ~= nil then
_type = teamType
end
GameCenter.Network.Send("MSG_Team.ReqAlterTeam", {isNotice = true, type = _type, teamId = 0})
end
--催促队长
function TeamSystem:ReqCuiChuLeader()
GameCenter.Network.Send("MSG_Team.ReqTeamLeaderOpenState")
end
--获取邀请列表,0周围玩家1好友2势力
function TeamSystem:ReqGetFreedomList(inType)
GameCenter.Network.Send("MSG_Team.ReqGetFreedomList", {type = inType})
end
--邀请某人加入
function TeamSystem:ReqInvite(playerId)
GameCenter.Network.Send("MSG_Team.ReqInvite", {roleid = playerId})
end
--请求是否同意入队
function TeamSystem:ReqInviteRes(teamId, roleId, inType)
GameCenter.Network.Send("MSG_Team.ReqInviteRes", {teamdId = teamId, roleId = roleId, type = inType})
end
--请求获取申请列表
function TeamSystem:ReqGetApplyList()
GameCenter.Network.Send("MSG_Team.ReqGetApplyList")
end
--操作申请对象0同意加入 -1拒绝加入
function TeamSystem:ReqApplyOpt(id, inType)
GameCenter.Network.Send("MSG_Team.ReqApplyOpt", {id = id, type = inType})
end
--获取等待的队伍列表
function TeamSystem:ReqGetWaitList(inType)
GameCenter.Network.Send("MSG_Team.ReqGetWaitList", {type = inType})
end
--申请加入
function TeamSystem:ReqApplyEnter(teamId)
if self:IsTeamExist() then
Utils.ShowPromptByEnum("TEAM_YOUHAVEDTEAM")
return
end
GameCenter.Network.Send("MSG_Team.ReqApplyEnter", {teamId = teamId})
end
--操作队伍 1提升队长 2踢出队伍 3退出队伍 4解散队伍 5自动接受申请自反6申请成为队长 7拒绝队员成为队长
function TeamSystem:ReqTeamOpt(playerId, inType)
GameCenter.Network.Send("MSG_Team.ReqTeamOpt", {targetId = playerId, opt = inType})
end
--召唤队员
function TeamSystem:ReqCallAllMember()
GameCenter.Network.Send("MSG_Team.ReqCallAllMember")
end
--传送到队长
function TeamSystem:ReqTransport2Leader()
GameCenter.Network.Send("MSG_Team.ReqTransport2Leader")
end
--请求清空申请列表
function TeamSystem:ReqCleanApplyList()
GameCenter.Network.Send("MSG_Team.ReqCleanApplyList")
end
--自动匹配
function TeamSystem:ReqMatchAll(inType, match)
self.IsMatching = match
GameCenter.Network.Send("MSG_Team.ReqMatchAll", {type = inType, match = match})
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UITEAMFORM_UPDATE)
if match then
if inType == 6002 then
GameCenter.BISystem:ReqClickEvent(BiIdCode.XMHJTeamAutoMatch)
elseif inType == 6003 then
GameCenter.BISystem:ReqClickEvent(BiIdCode.SLTTeamAutoMatch)
end
end
end
--同意召唤
function TeamSystem:ReqAgreeCall(callid)
GameCenter.Network.Send("MSG_Team.ReqAgreeCall", {callId = callid})
end
--返回队伍信息
function TeamSystem:ResTeamInfo(result)
if result.teamId == 0 then
return
end
local _noTeam = (#self.MyTeamInfo.MemberList <= 0)
self.MyTeamInfo.MemberList:Clear()
self.MyTeamInfo.TeamID = result.teamId
self.MyTeamInfo.Type = result.type
self.MyTeamInfo.IsAutoAcceptApply = result.autoAccept
for i = 1, #result.members do
local _index = TeamMemberInfo:New(result.members[i])
self.MyTeamInfo.MemberList:Add(_index)
local _player = GameCenter.GameSceneSystem:FindPlayer(_index.PlayerID)
if _player ~= nil then
_player:UpdateNameColor()
end
end
self:MyTeamMemberSort()
self:OnTeamChanged()
if _noTeam then
if self.MyTeamInfo:IsLeader() then
Utils.ShowPromptByEnum("TEAM_CREATE_SUCCESS")
else
Utils.ShowPromptByEnum("TEAM_ADD_SUCCESS")
end
end
end
--更新队伍中某个玩家的信息
function TeamSystem:ResUpdateTeamMemberInfo(result)
local _isExistPlayer = false
local _info = nil
for i = 1, #self.MyTeamInfo.MemberList do
_info = self.MyTeamInfo.MemberList[i]
if _info.PlayerID == result.member.roleId then
_isExistPlayer = true
break
end
end
if not _isExistPlayer then
Utils.ShowPromptByEnum("TEAM_PLAYERENTERTEAM", result.member.name)
_info = TeamMemberInfo:New()
self.MyTeamInfo.MemberList:Add(_info)
end
_info:Parse(result.member)
self:MyTeamMemberSort()
self:OnTeamChanged()
local _player = GameCenter.GameSceneSystem:FindPlayer(_info.PlayerID)
if _player ~= nil then
_player:UpdateNameColor()
end
self:UpdateApplyList(result.member.roleId)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAM_TEAM_SUCC)
end
--返回邀请成员列表
function TeamSystem:ResFreedomList(result)
self.InviteInfos:Clear()
if result.members ~= nil then
for i = 1, #result.members do
if not self:IsExitApply(result.members[i].roleId) then
local _info = FreeDomerInfo:New(result.members[i])
self.InviteInfos:Add(_info)
end
end
end
self.InviteInfos:Sort(function(x, y)
return x.Honey > y.Honey
end)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMINVITEFORM_UPDATE)
end
--返回某某邀请
function TeamSystem:ResInviteInfo(result)
local _teamId = result.teamdId
local _playerId = result.roleId
local _name = result.name
if GameCenter.GameSetting:GetSetting(GameSettingKeyCode.MandateAutoJoinTeam) > 0 then
self:ReqInviteRes(_teamId, _playerId, 0)
else
Utils.ShowMsgBoxAndBtn(function(x)
if x == MsgBoxResultCode.Button1 then
self:ReqInviteRes(_teamId, _playerId, -1)
elseif x == MsgBoxResultCode.Button2 then
self:ReqInviteRes(_teamId, _playerId, 0)
end
end, "TEAM_REFUSE", "TEAM_JOIN", "TEAM_0INVITEYOU", _name)
end
end
--返回申请列表
function TeamSystem:ResApplyList(result)
self.ApplyInfos:Clear()
if result.members ~= nil then
for i =1, #result.members do
if not self:IsExitApply(result.members[i].roleId) then
local _info = FreeDomerInfo:New(result.members[i])
self.ApplyInfos:Add(_info)
end
end
end
self:SetTeamNotice()
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMAPPLYFORM_UPDATE)
end
--添加申请人
function TeamSystem:ResAddApplyer(result)
local _state = self.MyTeamInfo.IsAutoAcceptApply
if _state then
self:ReqApplyOpt(result.member.roleId, 0)
else
if not self:IsExitApply(result.member.roleId) then
Utils.ShowPromptByEnum("TEAM_NEWPLAYER_JOIN")
local _info = FreeDomerInfo:New(result.member)
self.ApplyInfos:Add(_info)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMAPPLYFORM_UPDATE)
self:SetTeamNotice()
end
end
end
--返回正在等待的队伍
function TeamSystem:ResWaitList(result)
self.TeamInfos:Clear()
if result.teams ~= nil then
for i = 1, #result.teams do
local _info = TeamInfo:New()
_info.TeamID = result.teams[i].teamId
_info.Type = result.teams[i].type
for j = 1, #result.teams[i].members do
local _index = TeamMemberInfo:New(result.teams[i].members[j])
_info.MemberList:Add(_index)
end
self.TeamInfos:Add(_info)
end
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMMATCHFORM_UPDATE)
end
--删除队员
function TeamSystem:ResDeleteTeamMember(result)
local _roleId = result.roleId
local _ownId = GameCenter.GameSceneSystem:GetLocalPlayerID()
if _ownId ~= _roleId then
for i = 1, #self.MyTeamInfo.MemberList do
local _playerId = self.MyTeamInfo.MemberList[i].PlayerID
if _playerId == _roleId then
Utils.ShowPromptByEnum("TEAM_PLAYERLEAVETEAM", self.MyTeamInfo.MemberList[i].PlayerName)
self.MyTeamInfo.MemberList:RemoveAt(i)
break
end
end
self:MyTeamMemberSort()
local _player = GameCenter.GameSceneSystem:FindPlayer(_roleId)
if _player ~= nil then
_player:UpdateNameColor()
end
else
self.MyTeamInfo.Type = 0
self.MyTeamInfo.TeamID = 0
self.HanHuaCDTime = 0
for i = #self.MyTeamInfo.MemberList, 1, -1 do
local _playerID = self.MyTeamInfo.MemberList[i].PlayerID
self.MyTeamInfo.MemberList:RemoveAt(i)
local _player = GameCenter.GameSceneSystem:FindPlayer(_playerID)
if _player ~= nil then
_player:UpdateNameColor()
end
end
self.ApplyInfos:Clear()
self:SetTeamNotice()
end
self:OnTeamChanged()
end
--召唤队员返回
function TeamSystem:ResCallAllMemberRes(result)
local _callId = result.callId
local _mapName = string.gsub(result.name, "2&_", "")
_mapName = GameCenter.LanguageConvertSystem:ConvertLan(_mapName)
local _posX = math.floor(result.x)
local _posY = math.floor(result.y)
Utils.ShowMsgBoxAndBtn(function(x)
if x == MsgBoxResultCode.Button2 then
self:ReqAgreeCall(_callId)
end
end, "C_MSGBOX_CANEL", "C_MSGBOX_AGREE", "TEAM_LEADER_ZHAOJI", _posX, _posY)
end
--返回实时更新玩家地图和血量
function TeamSystem:ResUpdateHPAndMapKey(result)
local _info = nil
for i= 1, #self.MyTeamInfo.MemberList do
_info = self.MyTeamInfo.MemberList[i]
if _info.PlayerID == result.roleId then
_info.CurMapID = result.mapKey
_info.HpPro = result.hpPro
end
end
self:OnTeamChanged(1)
end
function TeamSystem:OnTeamChanged(param)
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UITEAMFORM_UPDATE, param)
end
function TeamSystem:ResMatchAll(result)
self.IsMatching = false
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMAUTOMATCH_OVER)
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UITEAMFORM_UPDATE)
if result.success then
Utils.ShowPromptByEnum("TEAM_AUTOMATCHSUCEESS")
GameCenter.PushFixEvent(UIEventDefine.UITeamForm_CLOSE)
else
Utils.ShowPromptByEnum("TEAM_HAVENOTEAMCREATETEAM")
end
end
function TeamSystem:ResTeamLeaderOpenState(result)
if result.state == 0 then
local _id = GameCenter.GameSceneSystem:GetLocalPlayerID()
if _id == result.leaderId then
Utils.ShowPromptByEnum("TEAM_CUICHULEADERDADAO", self:GetTeamTargetTypeName())
else
self.CuiCuCDTime = 10
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMCUICUCD)
end
elseif result.state == 1 then
Utils.ShowPromptByEnum("TEAM_LEADERNOTONLINE")
else
Utils.ShowPromptByEnum("TEAM_NOTHAVETEAMCUNZAI")
end
end
function TeamSystem:ResBecomeLeader(result)
local _player = self.MyTeamInfo:GetMemderInfo(result.targetId)
if _player ~= nil then
Utils.ShowMsgBoxAndBtn(function(x)
if x == MsgBoxResultCode.Button1 or x == MsgBoxResultCode.None then
self:ReqTeamOpt(result.targetId, 7)
else
self:ReqTeamOpt(result.targetId, 1)
end
end, "TEAM_REFUSE", "agree", "TEAM_0APPLYLEADER", _player.PlayerName)
end
end
--设置申请提示
function TeamSystem:SetTeamNotice()
local _state = (#self.ApplyInfos > 0)
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.TeamInfo, state)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMREDPOINT)
end
--判断玩家是否有队伍
function TeamSystem:IsTeamExist()
return #self.MyTeamInfo.MemberList > 0
end
-- 判断某玩家是否是成员
function TeamSystem:IsTeamMember(ID)
return self.MyTeamInfo:IsTeamMember(ID)
end
-- 对自身队伍成员进行排序
function TeamSystem:MyTeamMemberSort()
local _lpId = GameCenter.GameSceneSystem:GetLocalPlayerID()
if #self.MyTeamInfo.MemberList > 1 then
for i = 1, #self.MyTeamInfo.MemberList do
if self.MyTeamInfo.MemberList[i].PlayerID == _lpId and i ~= 1 then
local _info = self.MyTeamInfo.MemberList[1]
self.MyTeamInfo.MemberList[1] = self.MyTeamInfo.MemberList[i]
self.MyTeamInfo.MemberList[i] = _info
break
end
end
end
end
--清除申请列表中的某一个玩家的请求
function TeamSystem:ClearApplyPlayer(playerId)
for i = 1, #self.ApplyInfos do
if self.ApplyInfos[i].PlayerID == playerId then
self.ApplyInfos:RemoveAt(i)
break
end
end
end
--创建一个队伍并且设置队伍目标
function TeamSystem:CreateTeamAndSetTarget(cfg)
if not self:IsTeamExist() then
self:ReqCreateTeam(cfg.Id, self.MyTeamInfo.IsAutoAcceptApply)
end
self:SetTeamTarget(cfg)
end
--设置当前队伍目标
function TeamSystem:SetTeamTarget(cfg)
self:ReqAlterTeam(false, cfg.Id)
end
-- 更新队伍申请列表
function TeamSystem:UpdateApplyList(playerId)
for i= 1, #self.ApplyInfos do
if self.ApplyInfos[i].PlayerID == playerId then
self.ApplyInfos:RemoveAt(i)
break
end
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMREDPOINT)
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.TeamInfo, #self.ApplyInfos > 0)
end
-- 检测邀请玩家是否达到组队等级
function TeamSystem:CheckInviteIsOpenTeam(playerId)
for i = 1, #self.InviteInfos do
local _info = self.InviteInfos[i]
if _info.PlayerID == playerId then
return _info.Level >= self.TeamOpenLv, _info.PlayerName
end
end
return false, nil
end
--邀请玩家组队
function TeamSystem:InviteJoinTeam(playerId, mapId, isOneHan)
local _lpId = GameCenter.GameSceneSystem:GetLocalPlayerID()
--存在队伍
if self:IsTeamExist() then
--只有自己
if #self.MyTeamInfo.MemberList == 1 then
--切换目标地图
self:ReqAlterTeam(false, mapId)
--邀请入队
if playerId > 0 then
self:ReqInvite(playerId)
end
else --有两个人
local _otherPlayerId = 0
for i = 1, #self.MyTeamInfo.MemberList do
if self.MyTeamInfo.MemberList[i].PlayerID ~= _lpId then
_otherPlayerId = self.MyTeamInfo.MemberList[i].PlayerID
end
end
--如果另一个刚好是邀请的人
if playerId > 0 and playerId == _otherPlayerId then
--切换目标地图(自己是队员会切换失败)
self:ReqAlterTeam(false, mapId)
else
Utils.ShowPromptByEnum("C_TEAM_HAVE_TEAM")
end
end
else--不存在队伍
--创建队伍
self:ReqCreateTeam(mapId, self.MyTeamInfo.IsAutoAcceptApply)
--邀请入队
if playerId > 0 then
self:ReqInvite(playerId)
end
end
--一键喊话
if isOneHan then
self:ReqOneHan(mapId)
end
end
function TeamSystem:GetTeamTargetTypeName()
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
if _lp == nil then
return ""
end
local _memberList = self.MyTeamInfo.MemberList
if #_memberList > 0 then
if self.MyTeamInfo.Type == -1 then
return DataConfig.DataMessageString.Get("TEAM_ALL_ACTIVITY")
elseif self.MyTeamInfo.Type == -2 then
return DataConfig.DataMessageString.Get("TEAM_JINGYINGBOSS")
end
else
return DataConfig.DataMessageString.Get("TEAM_WU")
end
return ""
end
--更新
function TeamSystem:Update(dt)
if self.HanHuaCDTime > 0 then
self.DeltaTime = self.DeltaTime + dt
if self.DeltaTime >= 1 then
self.DeltaTime = self.DeltaTime - 1
self.HanHuaCDTime = self.HanHuaCDTime - 1
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMHANHUACD)
end
end
if self.CuiCuCDTime > 0 then
self.CuiCuDeltaTime = self.CuiCuDeltaTime - dt
if self.CuiCuDeltaTime >= 1.0 then
self.CuiCuDeltaTime = self.CuiCuDeltaTime - 1
self.CuiCuCDTime = self.CuiCuCDTime - 1
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_UITEAMCUICUCD)
end
end
if self.ApplyLeaderCDTime > 0 then
self.ApplyLeaderDeltaTime = self.ApplyLeaderDeltaTime + dt
if self.ApplyLeaderDeltaTime >= 1.0 then
self.ApplyLeaderDeltaTime = self.ApplyLeaderDeltaTime - 1
self.ApplyLeaderCDTime = self.ApplyLeaderCDTime - 1
end
end
end
return TeamSystem