using System; using System.Collections.Generic; using System.Linq; using System.Text; using LitJson; using UnityEngine; namespace Snxxz.UI { [XLua.Hotfix] [XLua.LuaCallCSharp] public class DungeonAssistModel : Model, IBeforePlayerDataInitialize,IAfterPlayerDataInitialize,IPlayerLoginOk { public string helpInfoLocalSave { get; private set; } public List helpInfolist { get; private set; } public event Action UpdateResultEvent; FairyModel fairyModel { get { return ModelCenter.Instance.GetModel(); } } FriendsModel friendsModel { get { return ModelCenter.Instance.GetModel(); } } DailyQuestModel dailyQuestModel { get { return ModelCenter.Instance.GetModel(); } } TeamModel teamModel { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } public override void Init() { ParseFuncConfig(); ParseDunegonHelpConfig(); } public void OnBeforePlayerDataInitialize() { FuncOpen.Instance.OnFuncStateChangeEvent -= UpdateFuncState; assistResults.Clear(); assistRefreshNum = 0; IsCheckInOk = false; IsRegisterToday = false; assistPlayerDict.Clear(); SetRedpoint(); } public void OnAfterPlayerDataInitialize() { int playerId = (int)PlayerDatas.Instance.baseData.PlayerID; helpInfoLocalSave = StringUtility.Contact("HelpInfoLocalSave", playerId); GetLocalSaveData(); } public void OnPlayerLoginOk() { FuncOpen.Instance.OnFuncStateChangeEvent += UpdateFuncState; UpdateRedpoint(); UpdateMainAssistRedpoint(); } public override void UnInit() { } public bool IsCheckIn { get { return checkInRedpoint.state == RedPointState.Simple; } } public bool IsNewAssistInfo { get { return main_AssistRedpoint.state != RedPointState.None; } } private void UpdateFuncState(int funcId) { if (funcId != 151) return; UpdateRedpoint(); UpdateMainAssistRedpoint(); } public bool TryGetFreeRefresh(out int remainNum) { if (assistRefreshNum < freeRefreshNum) { remainNum = freeRefreshNum - assistRefreshNum; } else { remainNum = (freeRefreshNum + goldRefreshNum) - assistRefreshNum; } return assistRefreshNum < freeRefreshNum; } public bool TryGetRewardAdd(out int addCoins) { addCoins = 0; foreach (var key in assistPlayerDict.Keys) { var info = assistPlayerDict[key]; if (info.IsAssist) { addCoins += info.GetAddCoins(); } } return addCoins > 0; } public bool TryGetRemainAssistNum(int mapId,out int remainNum) { remainNum = 0; var dungeonConfig = DungeonOpenTimeConfig.Get(mapId); if (dungeonConfig == null) return false; var mission = dungeonModel.mission; remainNum = dungeonConfig.DayHelpCountMax - mission.helpCount; return remainNum > 0; } public bool TryGetCurVipAddRatio(out string addRatioStr) { addRatioStr = string.Empty; int vipLv = PlayerDatas.Instance.baseData.VIPLv; var vipDict = VipPrivilegeConfig.GetVipPrivilegeDic(VipPrivilegeType.AssistXianYuanCoinsRatioAdd); if (vipDict == null || vipLv < 1) return false; List vipLvlist = vipDict.Keys.ToList(); vipLvlist.Sort(); for (int i = vipLvlist.Count - 1; i > -1; i--) { var lv = vipLvlist[i]; var addRatio = vipDict[lv]; if (vipLv >= lv && addRatio > 0) { var ratio = (float)addRatio / 100; addRatioStr = StringUtility.Contact(ratio, "%"); return true; } } return false; } public bool TryGetCurVipAddCoins(out int addCoins) { addCoins = 0; int vipLv = PlayerDatas.Instance.baseData.VIPLv; var vipDict = VipPrivilegeConfig.GetVipPrivilegeDic(VipPrivilegeType.AssistXianYuanCoinsAdd); if (vipDict == null || vipLv < 1) return false; List vipLvlist = vipDict.Keys.ToList(); vipLvlist.Sort(); for (int i = vipLvlist.Count - 1; i > -1; i--) { var lv = vipLvlist[i]; var coins = vipDict[lv]; if (vipLv >= lv && coins > 0) { addCoins = coins; return true; } } return false; } public bool IsMaxAssistCoinsAddByVip(out int nextVipLv,out int coins) { nextVipLv = 0; coins = 0; var vipDict = VipPrivilegeConfig.GetVipPrivilegeDic(VipPrivilegeType.AssistXianYuanCoinsAdd); if (vipDict == null) return false; int vipLv = PlayerDatas.Instance.baseData.VIPLv; int vipMaxLv = GetMaxVipPrivilegeEffectLv(VipPrivilegeType.AssistXianYuanCoinsAdd); bool isMaxVipLv = vipLv >= vipMaxLv ? true : false; List vipLvlist = vipDict.Keys.ToList(); vipLvlist.Sort(); int curAddCoins = 0; if(vipDict.ContainsKey(vipLv)) { curAddCoins = vipDict[vipLv]; } if(!isMaxVipLv) { for (int i = 0; i < vipLvlist.Count; i++) { var lv = vipLvlist[i]; var addCoins = vipDict[lv]; if (lv > vipLv && addCoins > curAddCoins) { nextVipLv = lv; coins = addCoins; return false; } } } else { nextVipLv = vipLv; coins = vipDict[vipMaxLv]; return true; } return false; } public bool IsMaxAssistCoinsRatioAddByVip(out int nextVipLv,out float ratio) { nextVipLv = 0; ratio = 0; var vipDict = VipPrivilegeConfig.GetVipPrivilegeDic(VipPrivilegeType.AssistXianYuanCoinsRatioAdd); if (vipDict == null) return false; int vipLv = PlayerDatas.Instance.baseData.VIPLv; int vipMaxLv = GetMaxVipPrivilegeEffectLv(VipPrivilegeType.AssistXianYuanCoinsRatioAdd); bool isMaxVipLv = vipLv >= vipMaxLv ? true : false; List vipLvlist = vipDict.Keys.ToList(); vipLvlist.Sort(); int curAddRatio = 0; if (vipDict.ContainsKey(vipLv)) { curAddRatio = vipDict[vipLv]; } if(!isMaxVipLv) { for (int i = 0; i < vipLvlist.Count; i++) { var lv = vipLvlist[i]; var addRatio = vipDict[lv]; if (lv > vipLv && addRatio > curAddRatio) { nextVipLv = lv; ratio = (float)addRatio / 100; return false; } } } else { nextVipLv = vipMaxLv; ratio = (float)vipDict[vipMaxLv] / 100; return true; } return false; } public int GetMaxVipPrivilegeEffectLv(VipPrivilegeType type) { var vipDict = VipPrivilegeConfig.GetVipPrivilegeDic(type); if (vipDict == null) return 0; int recordEffect = 0; List vipLvlist = vipDict.Keys.ToList(); vipLvlist.Sort(); for(int i = vipLvlist.Count - 1; i > -1; i--) { int vipLv = vipLvlist[i]; int effect = vipDict[vipLv]; if(effect >= recordEffect) { recordEffect = effect; } else { return vipLv + 1; } } return 0; } public RelatedToPlayer GetRelatedToPlayer(int playerId) { bool isFriend = friendsModel.GetFirendInfo((uint)playerId,(byte)GroupType.Friend) != null; bool isAlly = fairyModel.InSameFairy(playerId); if (isFriend && isAlly) return RelatedToPlayer.Friend; if (isFriend) return RelatedToPlayer.Friend; if (isAlly) return RelatedToPlayer.Ally; return RelatedToPlayer.None; } public int GetNewAssistInfoNum() { if (helpInfolist == null) return 0; int newNum = 0; for(int i = 0; i < helpInfolist.Count; i++) { var info = helpInfolist[i]; string date = string.Empty; string result = string.Empty; bool isNew = false; bool isSelf = false; TryGetAssistResult(info,out date,out result,out isNew,out isSelf); if(isNew && !isSelf) { newNum += 1; } } return newNum; } #region 本地数据 public Dictionary helpBattleDict { get; private set;} private void ParseDunegonHelpConfig() { helpBattleDict = new Dictionary(); var helpBattles = DungeonHelpBattleConfig.GetValues(); for(int i = 0; i < helpBattles.Count; i++) { var helpBattle = helpBattles[i]; string key = StringUtility.Contact(helpBattle.DataMapID,helpBattle.LineID); helpBattleDict.Add(key,helpBattle); } } public int assistCoolTime { get; private set; } public int goldAssistPlayer { get; private set;} public int freeRefreshNum { get; private set; } public int goldRefreshNum { get; private set; } public int refreshCostMoney { get; private set; } public int maxXianYuanCoins { get; private set; } public int checkInTotalTime { get; private set; } public int assistRobotId { get; private set; } public Dictionary> assistCoinsDict { get; private set; } private void ParseFuncConfig() { FuncConfigConfig HelpBattleCall = FuncConfigConfig.Get("HelpBattleCall"); assistCoolTime = int.Parse(HelpBattleCall.Numerical4); goldAssistPlayer = int.Parse(HelpBattleCall.Numerical5); FuncConfigConfig HelpBattleRefresh = FuncConfigConfig.Get("HelpBattleRefresh"); freeRefreshNum = int.Parse(HelpBattleRefresh.Numerical1); goldRefreshNum = int.Parse(HelpBattleRefresh.Numerical2); refreshCostMoney = int.Parse(HelpBattleRefresh.Numerical3); FuncConfigConfig HelpBattlePoint = FuncConfigConfig.Get("HelpBattlePoint"); maxXianYuanCoins = int.Parse(HelpBattlePoint.Numerical1); JsonData assistReward = JsonMapper.ToObject(HelpBattlePoint.Numerical2); assistCoinsDict = new Dictionary>(); foreach (var type in assistReward.Keys) { List rewards = new List(); assistCoinsDict.Add(int.Parse(type),rewards); JsonData rewardData = assistReward[type]; if(rewardData.IsArray) { for(int i = 0; i < rewardData.Count; i++) { rewards.Add(int.Parse(rewardData[i].ToString())); } } } FuncConfigConfig HelpBattleCheckIn = FuncConfigConfig.Get("HelpBattleCheckIn"); checkInTotalTime = int.Parse(HelpBattleCheckIn.Numerical1); FuncConfigConfig HelpBattleRobot = FuncConfigConfig.Get("HelpBattleRobot"); assistRobotId = int.Parse(HelpBattleRobot.Numerical1); } /// /// 1-好友,2-盟友 /// /// /// public int GetAssistReward(int type,bool isSelf = true) { List rewards = null; assistCoinsDict.TryGetValue(type,out rewards); if(rewards != null && rewards.Count > 1) { return isSelf ? rewards[0] : rewards[1]; } return 0; } public DungeonHelpBattleConfig GetHelpBattleConfig(int mapId,int lineId) { DungeonHelpBattleConfig battleConfig = null; string key = StringUtility.Contact(mapId,lineId); helpBattleDict.TryGetValue(key,out battleConfig); return battleConfig; } private void GetLocalSaveData() { string[] helpInfos = LocalSave.GeStringArray(helpInfoLocalSave); helpInfolist = helpInfos == null ? new List() : helpInfos.ToList(); } public void SetHelpInfoLocalSave(string createDate,string info,bool isNew,bool isSelf) { helpInfolist = helpInfolist == null ? new List() : helpInfolist; if (helpInfolist.Count >= 20) { helpInfolist.RemoveAt(helpInfolist.Count - 1); } info = StringUtility.Contact(createDate,"$",info, "$", isNew,"$",isSelf); helpInfolist.Insert(0,info); LocalSave.SetStringArray(helpInfoLocalSave, helpInfolist.ToArray()); if(UpdateResultEvent != null) { UpdateResultEvent(); } UpdateMainAssistRedpoint(); } public bool TryGetAssistResult(string _info,out string _date,out string _result,out bool _isNew,out bool _isSelf) { string[] array = _info.Split('$'); _isNew = false; _date = string.Empty; _result = string.Empty; _isSelf = false; if(array.Length > 3) { _date = array[0]; _result = array[1]; bool.TryParse(array[2], out _isNew); bool.TryParse(array[3], out _isSelf); return true; } return false; } public void SetHelpInfoRead() { if (helpInfolist == null || helpInfolist.Count < 1) return; for(int i = 0; i < helpInfolist.Count; i++) { string[] infos = helpInfolist[i].Split('$'); if(infos != null && infos.Length >= 4) { bool isNew = true; bool.TryParse(infos[2], out isNew); if(isNew) { helpInfolist[i] = StringUtility.Contact(infos[0], "$", infos[1], "$", false,"$",infos[3]); } } } UpdateMainAssistRedpoint(); LocalSave.DeleteKey(helpInfoLocalSave); LocalSave.SetStringArray(helpInfoLocalSave, helpInfolist.ToArray()); } #endregion #region 协议 #region 助战召唤 public event Action UpdataAssistPlayerListEvent; private Dictionary assistPlayerDict = new Dictionary(); public int assistRefreshNum { get; private set;} public void UpdateAssistList(HB207_tagMCHelpBattleList battleList) { assistPlayerDict.Clear(); List playerInfos = new List(); assistRefreshNum = battleList.RefreshCount; for(int i = 0; i < battleList.HelpCount; i++) { var info = battleList.HelpPlayerList[i]; AssistPlayerInfo playerInfo = new AssistPlayerInfo(info); playerInfos.Add(playerInfo); } playerInfos.Sort(CompareByFightPower); for(int i = 0; i < playerInfos.Count; i++) { var playerInfo = playerInfos[i]; assistPlayerDict.Add(playerInfo.PlayerID, playerInfo); } if(UpdataAssistPlayerListEvent != null) { UpdataAssistPlayerListEvent(); } if (!WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Open(); } } public int CompareByFightPower(AssistPlayerInfo start,AssistPlayerInfo end) { int x = start.FightPower; int y = end.FightPower; if (x.CompareTo(y) != 0) return -x.CompareTo(y); return 0; } public event Action UpdataAssistPlayerEvent; public void UpdataAssistPlayer(HB206_tagMCHelpBattleCallResult callResult) { AssistPlayerInfo playerInfo = GetAssistPlayerInfo((int)callResult.PlayerID); if(playerInfo != null) { playerInfo.SetObjID((int)callResult.ObjID); if (GetAlreadyAssistNum() >= 3) { if (WindowCenter.Instance.IsOpen()) { WindowCenter.Instance.Close(); } } else { if (UpdataAssistPlayerEvent != null) { UpdataAssistPlayerEvent(playerInfo.PlayerID); } } } } public AssistPlayerInfo GetAssistPlayerInfo(int playerId) { AssistPlayerInfo playerInfo = null; assistPlayerDict.TryGetValue(playerId,out playerInfo); return playerInfo; } public List GetAssistPlayerInfos() { return assistPlayerDict.Values.ToList(); } public int GetAlreadyAssistNum() { int num = 0; foreach (var key in assistPlayerDict.Keys) { var info = assistPlayerDict[key]; if(info.IsAssist) { num += 1; } } return num; } #endregion public void SendAssistCheckIn() { CB105_tagCMHelpBattleCheckIn checkIn = new CB105_tagCMHelpBattleCheckIn(); GameNetSystem.Instance.SendInfo(checkIn); } public void SendPlayerAssist(int isOneKey,int playerId = 0,int isGold = 0) { CB106_tagCMHelpBattleCall helpBattleCall = new CB106_tagCMHelpBattleCall(); helpBattleCall.IsOneKeyCall = (byte)isOneKey; helpBattleCall.PlayerID = (uint)playerId; helpBattleCall.IsGoldCall = (byte)isGold; GameNetSystem.Instance.SendInfo(helpBattleCall); } public void SendAssistRefresh() { CB107_tagCMHelpBattleRefresh battleRefresh = new CB107_tagCMHelpBattleRefresh(); GameNetSystem.Instance.SendInfo(battleRefresh); } #region 助战登记 public bool IsCheckInOk { get; private set; } public bool IsRegisterToday { get; private set; } public event Action UpdateCheckInResultEvent; public void UpdateAssistCheckInResult(HB205_tagMCHelpBattleCheckInResult checkInResult) { IsCheckInOk = checkInResult.IsOK == 1; IsRegisterToday = checkInResult.IsLogin == 1; if (UpdateCheckInResultEvent != null) { UpdateCheckInResultEvent(); } UpdateRedpoint(); } private List assistResults = new List(); public void UpdateAssistResultNotify(HB211_tagMCHelpBattleRecordList recordList) { for(int i = 0; i < recordList.RecordCount; i++) { var recordInfo = recordList.RecordList[i]; AssistResult assistResult = new AssistResult(); assistResult.assistType = 2; assistResult.callPlayerId = (int)recordInfo.CallPlayerID; assistResult.callPlayerName = recordInfo.CallPlayerName; assistResult.mapId = (int)recordInfo.MapID; assistResult.funcLineId = recordInfo.FuncLineID; assistResult.addXianyuanCoins = recordInfo.XianyuanCoinAdd; assistResult.relatedToPlayer = (RelatedToPlayer)recordInfo.Relation; assistResult.vipLv = recordInfo.VIPLV; assistResult.isSweep = false; assistResult.createTime = recordInfo.HelpTime; assistResult.noGetReason = 2; assistResult.SetNotifyResult(); assistResults.Add(assistResult); } } public void UpdateAssistResultNotify(HB208_tagMCAddXianyuanCoinMsg msg) { AssistResult assistResult = new AssistResult(); assistResult.assistType = 1; assistResult.callPlayerId = (int)msg.CallPlayerID; assistResult.callPlayerName = msg.CallPlayerName; assistResult.mapId = (int)msg.MapID; assistResult.funcLineId = msg.FuncLineID; assistResult.addXianyuanCoins = msg.XianyuanCoinAdd; assistResult.relatedToPlayer = (RelatedToPlayer)msg.Relation; assistResult.addCoins = msg.RelationCoinAdd; assistResult.vipLv = PlayerDatas.Instance.baseData.VIPLv; assistResult.isSweep = msg.IsSweep == 1; assistResult.createTime = TimeUtility.ServerNow.ToString("yyyy-MM-dd HH:mm:ss"); assistResult.noGetReason = msg.Reason; assistResult.SetNotifyResult(); assistResults.Add(assistResult); } #endregion #endregion #region 红点 public const int AssistCheckInRedPoint = 7800001; public Redpoint main_AssistRedpoint = new Redpoint(7800002); public Redpoint checkInRedpoint { get; private set; } public event Action UpdateRedpointEvent; public void SetRedpoint() { if(checkInRedpoint != null) { checkInRedpoint.state = RedPointState.None; checkInRedpoint = null; } DailyQuestData questData = null; dailyQuestModel.TryGetDailyQuest((int)DailyQuestType.DungeonAssist, out questData); if(questData != null) { checkInRedpoint = new Redpoint(questData.redpoint.id, AssistCheckInRedPoint); } } public void UpdateRedpoint() { checkInRedpoint.state = RedPointState.None; if (!FuncOpen.Instance.IsFuncOpen(151)) return; if(IsCheckInOk) { checkInRedpoint.state = RedPointState.None; } else { checkInRedpoint.state = RedPointState.Simple; } } public void UpdateMainAssistRedpoint() { main_AssistRedpoint.state = RedPointState.None; if (!FuncOpen.Instance.IsFuncOpen(151)) return; int newInfoNum = GetNewAssistInfoNum(); main_AssistRedpoint.count = newInfoNum; if (newInfoNum > 0) { main_AssistRedpoint.state = RedPointState.Quantity; } else { main_AssistRedpoint.state = RedPointState.None; } if (UpdateRedpointEvent != null) { UpdateRedpointEvent(); } } #endregion public class AssistResult { public int assistType; // 1 真实的自己 2 自己的镜像 public int callPlayerId; public string callPlayerName; public int mapId; public int funcLineId; public int addXianyuanCoins;// 增加的仙缘币,0代表已达上限 public int addXianyuanCoinsTheory; // 理论增加的仙缘币 public RelatedToPlayer relatedToPlayer; public int vipLv; public bool isSweep; public string createTime; public ResultType resultType; public string info; public int noGetReason;//仙缘币为0时的原因:1-助战次数上限;2-每日获得上限 public int addCoins; // 社交加成(真人进入副本) private int addRatioVipLv; private int addRatio; private string addRatioStr; public bool isNew { get; private set;} public bool isSelf { get; private set;} public bool IsAssistOther { get { return callPlayerId != 0; } } public bool IsGetAllAssistCoins { get { return addXianyuanCoins >= addXianyuanCoinsTheory && addXianyuanCoins > 0; } } public bool IsVipAddRatio { get { return addRatioVipLv > 0; } } public bool IsRealmDungeon { get { return mapId == 31110; } } DungeonAssistModel assistModel { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } public void SetNotifyResult() { info = string.Empty; int lineId = mapId == 31110 ? 1 : funcLineId; int dungeonId = dungeonModel.GetDungeonId(mapId,lineId); DungeonConfig dungeonConfig = dungeonConfig = DungeonConfig.Get(dungeonId); if (dungeonConfig == null) return; string fbName = dungeonConfig.FBName; string realmName = string.Empty; fbName = dungeonConfig.FBName; if (mapId == 31110) { int realmLv = funcLineId + 1; RealmConfig realmConfig = RealmConfig.Get(realmLv); realmName = realmConfig != null ? realmConfig.Name : string.Empty; if(!string.IsNullOrEmpty(realmName)) { realmName = StringUtility.Contact("【", realmName, "】"); realmName = UIHelper.GetRealmColorByLv(realmLv, realmName, true); } } GetCurVipAddRatio(); SetAddXianyuanCoinsTheory(); resultType = GetResultType(); SetResultIsNew(true); string sumAddStr = string.Empty; if(IsAssistOther) { switch (relatedToPlayer) { case RelatedToPlayer.Friend: sumAddStr = Language.Get("DungeonAssist111", assistModel.GetAssistReward(1)); break; case RelatedToPlayer.Ally: sumAddStr = Language.Get("DungeonAssist112", assistModel.GetAssistReward(2)); break; } } if (IsVipAddRatio) { if(sumAddStr.Length > 0) { sumAddStr = StringUtility.Contact(sumAddStr, ",", Language.Get("DungeonAssist110", addRatioVipLv, addRatioStr)); } else { sumAddStr = Language.Get("DungeonAssist110", addRatioVipLv,addRatioStr); } } isSelf = false; callPlayerName = UIHelper.ServerStringTrim(callPlayerName); switch (resultType) { case ResultType.SelfGetScore: isSelf = true; info = Language.Get("DungeonAssist101",fbName,addXianyuanCoins); break; case ResultType.SelfGetPartScore: isSelf = true; info = Language.Get("DungeonAssist100", fbName, addXianyuanCoins); break; case ResultType.SelfNoGetScoreReason2: isSelf = true; info = Language.Get("DungeonAssist102",fbName); break; case ResultType.SelfNoGetScoreReason1: isSelf = true; info = Language.Get("DungeonAssist113", fbName); break; case ResultType.SelfGetExtraScore: isSelf = true; string selfGetExtra = string.Empty; if(addCoins > 0) { selfGetExtra = Language.Get("DungeonAssist115",addCoins); if (!string.IsNullOrEmpty(sumAddStr)) { selfGetExtra = StringUtility.Contact(selfGetExtra,",",sumAddStr); } } else { selfGetExtra = sumAddStr; } info = Language.Get("DungeonAssist103",fbName,addXianyuanCoins, selfGetExtra); break; case ResultType.AssistGetScore: info = Language.Get("DungeonAssist104",callPlayerName,callPlayerId,fbName,addXianyuanCoins); break; case ResultType.AssistGetPartScore: info = Language.Get("DungeonAssist116", callPlayerName, callPlayerId, fbName, addXianyuanCoins); break; case ResultType.AssistNoGetScoreReason2: info = Language.Get("DungeonAssist105", callPlayerName, callPlayerId,fbName); break; case ResultType.AssistGetExtraScore: info = Language.Get("DungeonAssist106", callPlayerName, callPlayerId,fbName, addXianyuanCoins,sumAddStr); break; case ResultType.TeamAssistGetScore: info = Language.Get("DungeonAssist107",callPlayerName, callPlayerId,fbName, addXianyuanCoins); break; case ResultType.TeamAssistGetPartScore: info = Language.Get("DungeonAssist117", callPlayerName, callPlayerId, fbName, addXianyuanCoins); break; case ResultType.TeamAssistNoGetScoreReason2: info = Language.Get("DungeonAssist108", callPlayerName, callPlayerId, fbName); break; case ResultType.TeamAssistNoGetScoreReason1: info = Language.Get("DungeonAssist114", callPlayerName, callPlayerId, fbName); break; case ResultType.TeamAssistGetExtraScore: info = Language.Get("DungeonAssist109", callPlayerName, callPlayerId, fbName, addXianyuanCoins,sumAddStr); break; case ResultType.SweepingGetScore: isSelf = true; info = Language.Get("DungeonAssist148", fbName, addXianyuanCoins); break; case ResultType.SweepingGetPartScore: isSelf = true; info = Language.Get("DungeonAssist151", fbName, addXianyuanCoins); break; case ResultType.SweepingNoGetScoreReason2: isSelf = true; info = Language.Get("DungeonAssist149", fbName); break; case ResultType.SweepingNoGetScoreReason1: isSelf = true; info = Language.Get("DungeonAssist152", fbName); break; case ResultType.SweepingGetExtraScore: isSelf = true; string sweepGetExtra = string.Empty; if (addCoins > 0) { sweepGetExtra = Language.Get("DungeonAssist115", addCoins); if (!string.IsNullOrEmpty(sumAddStr)) { sweepGetExtra = StringUtility.Contact(sweepGetExtra, ",", sumAddStr); } } else { sweepGetExtra = sumAddStr; } info = Language.Get("DungeonAssist150", fbName, addXianyuanCoins, sweepGetExtra); break; case ResultType.SelfRealmGetScore: isSelf = true; info = Language.Get("DungeonAssist153",fbName,realmName, addXianyuanCoins); break; case ResultType.SelfRealmGetPartScore: isSelf = true; info = Language.Get("DungeonAssist156", fbName,realmName, addXianyuanCoins); break; case ResultType.SelfRealmNoGetScoreReason2: isSelf = true; info = Language.Get("DungeonAssist154", fbName,realmName); break; case ResultType.SelfRealmNoGetScoreReason1: isSelf = true; info = Language.Get("DungeonAssist161", fbName,realmName); break; case ResultType.SelfRealmGetExtraScore: isSelf = true; string selfRealmGetExtra = string.Empty; if (addCoins > 0) { selfRealmGetExtra = Language.Get("DungeonAssist115", addCoins); if (!string.IsNullOrEmpty(sumAddStr)) { selfRealmGetExtra = StringUtility.Contact(selfRealmGetExtra, ",", sumAddStr); } } else { selfRealmGetExtra = sumAddStr; } info = Language.Get("DungeonAssist155", fbName,realmName,addXianyuanCoins, selfRealmGetExtra); break; case ResultType.AssistRealmGetScore: info = Language.Get("DungeonAssist157", callPlayerName, callPlayerId, fbName,realmName,addXianyuanCoins); break; case ResultType.AssistRealmGetPartScore: info = Language.Get("DungeonAssist160", callPlayerName, callPlayerId, fbName, realmName,addXianyuanCoins); break; case ResultType.AssistRealmNoGetScoreReason2: info = Language.Get("DungeonAssist158", callPlayerName, callPlayerId, fbName,realmName); break; case ResultType.AssistRealmGetExtraScore: info = Language.Get("DungeonAssist159", callPlayerName, callPlayerId, fbName,realmName,addXianyuanCoins, sumAddStr); break; } assistModel.SetHelpInfoLocalSave(createTime,info,isNew,isSelf); } public void SetResultIsNew(bool _isNew) { this.isNew = _isNew; } public void SetAddXianyuanCoinsTheory() { var dungeonOpenTime = DungeonOpenTimeConfig.Get(mapId); int socialAdd = 0; switch (assistType) { case 1: socialAdd = addCoins; if(IsAssistOther) { addXianyuanCoinsTheory = Mathf.RoundToInt((dungeonOpenTime.HelpPoint + socialAdd) * (1 + addRatio * 0.01f)); } else { addXianyuanCoinsTheory = Mathf.RoundToInt((dungeonOpenTime.FBPoint + socialAdd) * (1 + addRatio * 0.01f)); } break; case 2: switch (relatedToPlayer) { case RelatedToPlayer.Friend: case RelatedToPlayer.FriendAndAlly: socialAdd = assistModel.GetAssistReward(1); break; case RelatedToPlayer.Ally: socialAdd = assistModel.GetAssistReward(2); break; } addXianyuanCoinsTheory = Mathf.RoundToInt((dungeonOpenTime.HelpPoint + socialAdd) * (1 + addRatio*0.01f)); break; } } public ResultType GetResultType() { if(isSweep) { if (IsGetAllAssistCoins) { if (IsVipAddRatio || addCoins > 0) { return ResultType.SweepingGetExtraScore; } else { return ResultType.SweepingGetScore; } } else { if (addXianyuanCoins > 0) { return ResultType.SweepingGetPartScore; } else { switch (noGetReason) { case 0: case 2: return ResultType.SweepingNoGetScoreReason2; case 1: return ResultType.SweepingNoGetScoreReason1; } } } } else { if (assistType == 1) { if (IsAssistOther) { if (IsGetAllAssistCoins) { switch (relatedToPlayer) { case RelatedToPlayer.None: return IsVipAddRatio ? ResultType.TeamAssistGetExtraScore : ResultType.TeamAssistGetScore; case RelatedToPlayer.Friend: case RelatedToPlayer.Ally: return ResultType.TeamAssistGetExtraScore; } } else { if (addXianyuanCoins > 0) { return ResultType.TeamAssistGetPartScore; } else { switch (noGetReason) { case 0: case 2: return ResultType.TeamAssistNoGetScoreReason2; case 1: return ResultType.TeamAssistNoGetScoreReason1; } } } } else { if (IsGetAllAssistCoins) { if (IsVipAddRatio || addCoins > 0) { return IsRealmDungeon ? ResultType.SelfRealmGetExtraScore : ResultType.SelfGetExtraScore; } else { return IsRealmDungeon ? ResultType.SelfRealmGetScore : ResultType.SelfGetScore; } } else { if (addXianyuanCoins > 0) { return IsRealmDungeon ? ResultType.SelfRealmGetPartScore : ResultType.SelfGetPartScore; } else { switch (noGetReason) { case 0: case 2: return IsRealmDungeon ? ResultType.SelfRealmNoGetScoreReason2 : ResultType.SelfNoGetScoreReason2; case 1: return IsRealmDungeon ? ResultType.SelfRealmNoGetScoreReason1 : ResultType.SelfNoGetScoreReason1; } } } } } else { if (IsGetAllAssistCoins) { switch (relatedToPlayer) { case RelatedToPlayer.None: if(IsVipAddRatio) { return IsRealmDungeon ? ResultType.AssistRealmGetExtraScore : ResultType.AssistGetExtraScore; } else { return IsRealmDungeon ? ResultType.AssistRealmGetScore : ResultType.AssistGetScore; } case RelatedToPlayer.Friend: case RelatedToPlayer.Ally: return IsRealmDungeon ? ResultType.AssistRealmGetExtraScore : ResultType.AssistGetExtraScore; } } else { if (addXianyuanCoins > 0) { return IsRealmDungeon ? ResultType.AssistRealmGetPartScore : ResultType.AssistGetPartScore; } else { return IsRealmDungeon ? ResultType.AssistRealmNoGetScoreReason2 : ResultType.AssistNoGetScoreReason2; } } } } return ResultType.None; } public void GetCurVipAddRatio() { addRatioVipLv = 0; var vipDict = VipPrivilegeConfig.GetVipPrivilegeDic(VipPrivilegeType.AssistXianYuanCoinsRatioAdd); if (vipDict == null) return; List vipLvlist = vipDict.Keys.ToList(); vipLvlist.Sort(); for (int i = vipLvlist.Count - 1; i > -1; i--) { var lv = vipLvlist[i]; var ratio = vipDict[lv]; if(vipLv >= lv) { addRatioVipLv = lv; addRatio = ratio / 100; addRatioStr = StringUtility.Contact(addRatio,"%"); break; } } } public enum ResultType { None, SelfGetScore, SelfGetPartScore, SelfNoGetScoreReason1, SelfNoGetScoreReason2, SelfGetExtraScore, AssistGetScore, AssistGetPartScore, AssistNoGetScoreReason2, AssistGetExtraScore, TeamAssistGetScore, TeamAssistGetPartScore, TeamAssistNoGetScoreReason1, TeamAssistNoGetScoreReason2, TeamAssistGetExtraScore, SweepingGetScore, SweepingGetPartScore, SweepingNoGetScoreReason1, SweepingNoGetScoreReason2, SweepingGetExtraScore, SelfRealmGetScore, SelfRealmGetPartScore, SelfRealmNoGetScoreReason1, SelfRealmNoGetScoreReason2, SelfRealmGetExtraScore, AssistRealmGetScore, AssistRealmGetPartScore, AssistRealmNoGetScoreReason2, AssistRealmGetExtraScore, } } public class AssistPlayerInfo { public int ObjID { get; private set; } // 实例ID, 0代表未召唤 public int Job { get; private set; } // 玩家职业, 如果是机器人,则职业有值,服务端控制 public int PlayerID { get; private set; } // 助战镜像ID, 大于1小于100代表机器人,如果是机器人,没有以下信息,相关信息自己读配置 public string Name { get; private set; } // 玩家名,size = NameLen public int LV { get; private set; } // 玩家等级 public int RealmLV { get; private set; } // 玩家境界等级 public int FightPower { get; private set; } // 玩家战力 public int IsNeedGold { get; private set; } // 是否需要仙玉召唤 public RelatedToPlayer relatedToPlayer { get; private set;} //与玩家的关系 public bool IsAssist { get { return ObjID != 0; } } public bool IsGoldAssist { get { return IsNeedGold != 0; } } DungeonAssistModel assistModel { get { return ModelCenter.Instance.GetModel(); }} public AssistPlayerInfo(HB207_tagMCHelpBattleList.tagMCHelpBattlePlayer battlePlayer) { ObjID = (int)battlePlayer.ObjID; Job = battlePlayer.Job; PlayerID = (int)battlePlayer.PlayerID; bool isMirror = PlayerID > 100 ? true : false; if(isMirror) { Name = battlePlayer.Name; LV = battlePlayer.LV; RealmLV = battlePlayer.RealmLV; FightPower = (int)battlePlayer.FightPower; IsNeedGold = battlePlayer.IsNeedGold; relatedToPlayer = (RelatedToPlayer)battlePlayer.Relation; } else { NPCConfig nPCConfig = NPCConfig.Get(assistModel.assistRobotId); Name = nPCConfig.charName; relatedToPlayer = RelatedToPlayer.None; int mapId = PlayerDatas.Instance.baseData.MapID; int lineId = 0; if(mapId != 31110) { lineId = PlayerDatas.Instance.baseData.dungeonLineId; } else { lineId = PlayerDatas.Instance.baseData.realmLevel; } var battleConfig = assistModel.GetHelpBattleConfig(mapId,lineId); if(battleConfig != null) { LV = battleConfig.RobotLV; RealmLV = battleConfig.RobotRealmLV; FightPower = battleConfig.RobotFightPower; IsNeedGold = 0; } } } public void SetObjID(int _objId) { ObjID = _objId; } public int GetAddCoins() { int addCoins = 0; switch (relatedToPlayer) { case RelatedToPlayer.Friend: addCoins = assistModel.GetAssistReward(1); break; case RelatedToPlayer.Ally: addCoins = assistModel.GetAssistReward(2); break; } return addCoins; } } public enum RelatedToPlayer { None = 0,//没关系 Friend = 1, //好友 Ally = 2, //盟友 FriendAndAlly = 3, //既是好友又是盟友 } } }