using System;
|
using System.Collections.Generic;
|
using LitJson;
|
|
using UnityEngine;
|
public class AutoFightModel : GameSystemManager<AutoFightModel>
|
{
|
//战斗倍数:值越大越快,影响战斗表现,掉落速度等,这里的倍数是索引,对应配置里的实际速率
|
public int fightSpeed
|
{
|
get
|
{
|
int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_Speed, 0);
|
return Math.Min(Math.Max(value, 1), maxSpeed);
|
}
|
set
|
{
|
var num = Math.Max(1, value);
|
BattleManager.Instance.storyBattleField.SetSpeedRatio(BattleManager.Instance.speedGear[num - 1]);
|
QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Speed, num);
|
}
|
}
|
|
//消耗倍数
|
public int fightCost
|
{
|
get
|
{
|
int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_Cost, 0);
|
return Math.Min(Math.Max(value, 1), maxCost);
|
}
|
set
|
{
|
QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Cost, value);
|
}
|
}
|
|
//自动模式, 真正点击战锤消耗开启,和休息(或无材料)停止
|
public bool isPause = false; //如打BOSS的情况,暂停自动战斗 后续可以补充每X秒检测下是否有异常
|
|
bool m_IsAutoAttack = false;
|
public bool isAutoAttack
|
{
|
get
|
{
|
return m_IsAutoAttack;
|
}
|
set
|
{
|
if (m_IsAutoAttack == value)
|
return;
|
m_IsAutoAttack = value;
|
Debug.Log("isAutoAttack:" + m_IsAutoAttack);
|
}
|
}
|
|
//是否开启自动战斗设置
|
public bool isAutoAttackSet
|
{
|
get
|
{
|
return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_Open, 0);
|
}
|
set
|
{
|
QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Open, value);
|
}
|
}
|
|
//更好装备停止战斗
|
public bool isStopFightByBetterEquip
|
{
|
get
|
{
|
return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_FightPower, 0);
|
}
|
set
|
{
|
QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_FightPower, value);
|
}
|
}
|
|
public bool isAutoChangeBetterEquip
|
{
|
get
|
{
|
return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_AutoChangeBetterEquip, 0);
|
}
|
set
|
{
|
QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_AutoChangeBetterEquip, value);
|
}
|
}
|
public int startServerTime; // 开始时的服务器时间戳
|
bool m_HasAutoExchanged = false;
|
public bool hasAutoExchanged // 是否已自动交换过
|
{
|
get
|
{
|
return m_HasAutoExchanged;
|
}
|
set
|
{
|
if (m_HasAutoExchanged == value)
|
return;
|
m_HasAutoExchanged = value;
|
if (!value)
|
{
|
startServerTime = TimeUtility.AllSeconds;
|
}
|
}
|
}
|
|
bool m_IsAutoExchangeDecomposeOld = false;
|
public bool isAutoExchangeDecomposeOld //是否替换后自动分解原装备
|
{
|
get
|
{
|
return m_IsAutoExchangeDecomposeOld;
|
}
|
set
|
{
|
if (m_IsAutoExchangeDecomposeOld == value)
|
return;
|
m_IsAutoExchangeDecomposeOld = value;
|
if (value)
|
{
|
hasAutoExchanged = false;
|
}
|
}
|
}
|
|
|
public event Action<bool> OnAutoChallengeBossEvent;
|
//自动挑战首领
|
public bool isAutoChallengeBoss
|
{
|
get
|
{
|
return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_ChallengeBoss, 0);
|
}
|
set
|
{
|
QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_ChallengeBoss, value);
|
OnAutoChallengeBossEvent?.Invoke(value);
|
}
|
}
|
|
//当前战败了x次;-1代表停止继续挑战
|
private int m_NowChallengeCount = 0;
|
public float lastChallengeTime = 0;
|
public int nowChallengeCount
|
{
|
get { return m_NowChallengeCount; }
|
set
|
{
|
m_NowChallengeCount = value;
|
lastChallengeTime = Time.time;
|
// Debug.Log($"当前在主线Boss战败了{m_NowChallengeCount}次,上次战败时间是{lastChallengeTime}");
|
if (m_NowChallengeCount >= tryChallengeCount)
|
{
|
m_NowChallengeCount = -1; //代表停止继续挑战BOSS, 但不是停止战斗
|
isAutoChallengeBoss = false; //取消勾选自动挑战boss
|
}
|
}
|
}
|
|
|
//自动挑战首领,战败x次停止
|
public int tryChallengeCount
|
{
|
get
|
{
|
int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_TryChallengeCount, 0);
|
return Math.Min(Math.Max(value, 1), maxTryChallengeCount);
|
}
|
set
|
{
|
QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_TryChallengeCount, value);
|
}
|
}
|
|
//自动完成任务
|
public bool isAutoFinishTask
|
{
|
get
|
{
|
return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_AutoFinishTask, 0);
|
}
|
set
|
{
|
QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_AutoFinishTask, value);
|
}
|
}
|
public event Action ChangeAutoEvent;
|
|
|
|
|
public int maxSpeed = 3; //最高速度 索引
|
public int maxCost; //最高消耗
|
public int[] autoCostWithBlessLV; //自动战斗消耗倍数关联祝福等级
|
public int speed2UnlockMissionID;
|
|
public int openAutoChallengeBossCond;//数值1:自动挑战首领解锁的关卡(需过关)
|
public int maxTryChallengeCount;//最大战败次数(下拉列表的最大值)解锁月卡有效
|
public int maxTryChallengeCD; //打主线boss战败后,间隔x秒后重试
|
public int openAutoFinishCond;//自动完成任务需祝福树X级
|
public int autoCloseWinCD;
|
public int autoChangeBetterEquipWaitTimeS;//装备对比界面打开x秒后,为玩家替换高战力装备
|
|
public override void Init()
|
{
|
ParseConfig();
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerInit;
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
|
BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField;
|
EventBroadcast.Instance.AddListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
|
BlessLVManager.Instance.OnBlessLVUpdateEvent += UpdateRedpint;
|
TaskManager.Instance.OnTaskUpdate += OnTaskUpdate;
|
InvestModel.Instance.onInvestUpdate += OnInvestUpdate;
|
GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
|
|
}
|
|
public override void Release()
|
{
|
BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerInit;
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
|
EventBroadcast.Instance.RemoveListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
|
BlessLVManager.Instance.OnBlessLVUpdateEvent -= UpdateRedpint;
|
TaskManager.Instance.OnTaskUpdate -= OnTaskUpdate;
|
InvestModel.Instance.onInvestUpdate -= OnInvestUpdate;
|
GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
|
|
}
|
|
void ParseConfig()
|
{
|
var config = FuncConfigConfig.Get("AutoGuaji");
|
autoCostWithBlessLV = JsonMapper.ToObject<int[]>(config.Numerical1);
|
speed2UnlockMissionID = int.Parse(config.Numerical2);
|
maxCost = autoCostWithBlessLV.Length;
|
autoCloseWinCD = int.Parse(config.Numerical3);
|
autoChangeBetterEquipWaitTimeS = int.Parse(config.Numerical5);
|
config = FuncConfigConfig.Get("AutoGuaji1");
|
openAutoChallengeBossCond = int.Parse(config.Numerical1);
|
maxTryChallengeCount = int.Parse(config.Numerical2);
|
maxTryChallengeCD = int.Parse(config.Numerical3);
|
openAutoFinishCond = int.Parse(config.Numerical4);
|
}
|
|
|
void BeforePlayerInit()
|
{
|
fightingHeroSkinID = 0;
|
heroGuid = "";
|
startServerTime = 0;
|
hasAutoExchanged = false;
|
}
|
|
private void OnBeforePlayerDataInitializeEventOnRelogin()
|
{
|
nowChallengeCount = 0;
|
isAutoExchangeDecomposeOld = true;
|
}
|
|
Dictionary<string, int> winWaitCloseDict = new Dictionary<string, int>();
|
void OnSecondEvent()
|
{
|
ProccessCloseWin();
|
}
|
void ProccessCloseWin()
|
{
|
if (!isAutoAttack)
|
return;
|
if (isAutoChallengeBoss)
|
{
|
if (UIManager.Instance.IsOpened<BattleVictoryWin>())
|
{
|
if (!winWaitCloseDict.ContainsKey("BattleVictoryWin"))
|
{
|
winWaitCloseDict["BattleVictoryWin"] = 0;
|
}
|
|
if (winWaitCloseDict["BattleVictoryWin"] == 0)
|
{
|
winWaitCloseDict["BattleVictoryWin"] = (int)Time.time;
|
}
|
else if (Time.time - winWaitCloseDict["BattleVictoryWin"] > AutoFightModel.Instance.autoCloseWinCD)
|
{
|
UIManager.Instance.CloseWindow<BattleVictoryWin>();
|
winWaitCloseDict["BattleVictoryWin"] = 0;
|
}
|
}
|
|
if (UIManager.Instance.IsOpened<BattleFailWin>())
|
{
|
if (!winWaitCloseDict.ContainsKey("BattleFailWin"))
|
{
|
winWaitCloseDict["BattleFailWin"] = 0;
|
}
|
|
if (winWaitCloseDict["BattleFailWin"] == 0)
|
{
|
winWaitCloseDict["BattleFailWin"] = (int)Time.time;
|
}
|
else if (Time.time - winWaitCloseDict["BattleFailWin"] > autoCloseWinCD)
|
{
|
UIManager.Instance.CloseWindow<BattleFailWin>();
|
winWaitCloseDict["BattleFailWin"] = 0;
|
}
|
}
|
}
|
|
if (isAutoFinishTask)
|
{
|
if (TaskManager.Instance.GetMainTaskState() == 2 && UIManager.Instance.IsOpened<HomeWin>()
|
&& !UIManager.Instance.ExistAnyFullScreenOrMaskWin("") && !NewBieCenter.Instance.inGuiding)
|
{
|
//领取任务奖励
|
CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward();
|
getReward.RewardType = 66;
|
getReward.DataEx = (uint)TaskManager.Instance.mainTask.TaskID;
|
GameNetSystem.Instance.SendInfo(getReward);
|
return;
|
}
|
|
if (UIManager.Instance.IsOpened<CommonGetItemWin>() && ItemLogicUtility.Instance.getItemEventName == "Task")
|
{
|
if (!winWaitCloseDict.ContainsKey("CommonGetItemWin"))
|
{
|
winWaitCloseDict["CommonGetItemWin"] = 0;
|
}
|
|
if (winWaitCloseDict["CommonGetItemWin"] == 0)
|
{
|
winWaitCloseDict["CommonGetItemWin"] = (int)Time.time;
|
}
|
else if (Time.time - winWaitCloseDict["CommonGetItemWin"] > autoCloseWinCD)
|
{
|
UIManager.Instance.CloseWindow<CommonGetItemWin>();
|
winWaitCloseDict["CommonGetItemWin"] = 0;
|
}
|
}
|
}
|
}
|
|
|
public void SaveAutoFightSetting()
|
{
|
if (PlayerDatas.Instance.baseData.UseHarmerCount != fightCost)
|
{
|
PlayerDatas.Instance.baseData.UseHarmerCount = fightCost;
|
BattleManager.Instance.MainFightRequest(1, (uint)fightCost);
|
}
|
|
StoryBattleField storyBattleField = BattleManager.Instance.storyBattleField;
|
|
if (storyBattleField != null && storyBattleField.GetBattleMode() != BattleMode.Stop)
|
{
|
//战斗中改变模式
|
isAutoAttack = isAutoAttackSet;
|
storyBattleField.AutoSetBattleMode();
|
}
|
|
QuickSetting.Instance.SendPackage();
|
ChangeAutoEvent?.Invoke();
|
}
|
|
|
//自动处理装备,需要等待穿戴返回false,其他情况返回true
|
public bool TryAutoFightDoEquip(ItemModel item)
|
{
|
if (!isAutoAttack)
|
return false;
|
|
if (item == null)
|
return true;
|
|
long showFightPower = FightPowerManager.Instance.GetFightPowerChange(item);
|
|
if (showFightPower < 0)
|
{
|
EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1);
|
return true;
|
}
|
else
|
{
|
if (isStopFightByBetterEquip)
|
return false;
|
|
EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1);
|
return true;
|
|
}
|
|
}
|
|
|
#region 主线战斗(自动和手动)
|
|
public void StartFight()
|
{
|
if (isAutoAttack)
|
return;
|
|
StoryBattleField storyBattleField = BattleManager.Instance.storyBattleField;
|
if (storyBattleField == null)
|
{
|
return;
|
}
|
|
if (!UIHelper.CheckMoneyCount(41, PlayerDatas.Instance.baseData.UseHarmerCount, 2))
|
{
|
if (storyBattleField.GetBattleMode() != BattleMode.Stop)
|
storyBattleField.HaveRest();
|
return;
|
}
|
|
BattleManager.Instance.storyBattleField.SetSpeedRatio(BattleManager.Instance.speedGear[fightSpeed - 1]);
|
isAutoAttack = isAutoAttackSet;
|
|
//手动会一直进入这个逻辑, 自动触发一次
|
storyBattleField.AutoSetBattleMode();
|
storyBattleField.operationAgent.DoNext();
|
}
|
|
void OnCreateBattleField(string guid, BattleField battleField)
|
{
|
if (string.IsNullOrEmpty(guid) && BattleManager.Instance.storyBattleField != null)
|
{
|
BattleManager.Instance.storyBattleField.ChangeBattleModeEvent -= ChangeBattleModeEvent;
|
BattleManager.Instance.storyBattleField.ChangeBattleModeEvent += ChangeBattleModeEvent;
|
}
|
|
}
|
|
|
void ChangeBattleModeEvent(BattleMode _battleMode)
|
{
|
if (_battleMode == BattleMode.Stop)
|
{
|
isAutoAttack = false;
|
}
|
OnFightEvent?.Invoke(false);
|
}
|
|
public int fightingHeroSkinID; //当前战斗的英雄皮肤ID
|
public string heroGuid; //战斗中的武将
|
public event Action<bool> OnFightEvent; //战斗模式变更通知 战斗释放技能通知
|
|
|
/// <summary>
|
/// 技能释放 通知UI处理
|
/// </summary>
|
/// <param name="guid">空为主线</param>
|
/// <param name="skillConfig">用于怒气等显示</param>
|
/// <param name="teamHero">战斗中的武将</param>
|
void OnSkillCast(string guid, SkillConfig skillConfig, TeamHero teamHero)
|
{
|
if (!string.IsNullOrEmpty(guid))
|
return;
|
|
//防范回收报错
|
if (teamHero == null)
|
return;
|
|
//只通知玩家武将的战斗
|
if (teamHero.NPCID != 0)
|
return;
|
|
fightingHeroSkinID = teamHero.SkinID;
|
//战斗时没有GUID ,通过heroid查找
|
var hero = TeamManager.Instance.GetTeam(BattlePreSetType.Story).GetHeroByHeroID(teamHero.heroId);
|
if (hero != null)
|
{
|
heroGuid = hero.guid;
|
}
|
else
|
{
|
heroGuid = "";
|
}
|
OnFightEvent?.Invoke(true);
|
}
|
|
|
|
#endregion
|
|
//新增消耗倍数红点
|
Redpoint redpoint1 = new Redpoint(MainRedDot.RedPoint_AutoBattleKey, MainRedDot.RedPoint_AutoBattleKey * 10 + 1);
|
//新增战斗倍数红点
|
Redpoint redpoint2 = new Redpoint(MainRedDot.RedPoint_AutoBattleKey, MainRedDot.RedPoint_AutoBattleKey * 10 + 2);
|
void UpdateRedpint()
|
{
|
//提示红点记录到第几个索引,每次解锁新的消耗红点都提示
|
var costIndex = LocalSave.GetInt("redcost" + PlayerDatas.Instance.baseData.PlayerID);
|
if (costIndex + 1 < autoCostWithBlessLV.Length)
|
{
|
redpoint1.state = autoCostWithBlessLV[Math.Min(costIndex + 1, autoCostWithBlessLV.Length - 1)] <= BlessLVManager.Instance.m_TreeLV ?
|
RedPointState.Simple : RedPointState.None;
|
}
|
else
|
{
|
redpoint1.state = RedPointState.None;
|
}
|
|
var speedIndex = LocalSave.GetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID);
|
redpoint2.state = RedPointState.None;
|
if (speedIndex == 0 && TaskManager.Instance.mainTask.TaskID > speed2UnlockMissionID &&
|
!InvestModel.Instance.IsActiveFightSpeed(3))
|
{
|
redpoint2.state = RedPointState.Simple;
|
}
|
else if (speedIndex < 2 && InvestModel.Instance.IsActiveFightSpeed(3))
|
{
|
redpoint2.state = RedPointState.Simple;
|
}
|
}
|
|
public void ClickCostRed()
|
{
|
int index = 0;
|
for (int i = 0; i < autoCostWithBlessLV.Length; i++)
|
{
|
if (autoCostWithBlessLV[i] <= BlessLVManager.Instance.m_TreeLV)
|
{
|
index = i;
|
}
|
else
|
{
|
break;
|
}
|
}
|
LocalSave.SetInt("redcost" + PlayerDatas.Instance.baseData.PlayerID, index);
|
UpdateRedpint();
|
}
|
|
public void ClickSpeedRed()
|
{
|
int index = 0;
|
if (!InvestModel.Instance.IsActiveFightSpeed(3))
|
{
|
if (TaskManager.Instance.mainTask.TaskID > speed2UnlockMissionID)
|
{
|
index = 1;
|
}
|
}
|
else
|
{
|
index = 2;
|
}
|
LocalSave.SetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID, index);
|
UpdateRedpint();
|
|
}
|
|
void OnTaskUpdate()
|
{
|
//任务刷新比较频繁
|
if (TaskManager.Instance.mainTask.TaskID < speed2UnlockMissionID)
|
{
|
return;
|
}
|
if (LocalSave.GetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID) > 0)
|
return;
|
if (redpoint2.state == RedPointState.Simple)
|
return;
|
UpdateRedpint();
|
}
|
|
void OnInvestUpdate(int type)
|
{
|
if (type > 2)
|
return;
|
UpdateRedpint();
|
}
|
}
|