Main/System/Guild/GuildBossManager.cs
@@ -1,8 +1,45 @@
using System;
using System.Collections.Generic;
using LitJson;
public class GuildBossManager : GameSystemManager<GuildBossManager>
{
    public Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction> bossActions = new Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction>();
    // 玩家伤害排行
    public List<HA513_tagMCFamilyActionInfo.tagMCFamilyAction> playerBossHurtRank = new List<HA513_tagMCFamilyActionInfo.tagMCFamilyAction>();
    //时间戳:讨伐数据; 用于播放每次攻击
    public Dictionary<int, TaofaAtkData> taofaAtkData = new Dictionary<int, TaofaAtkData>();
    //按时间顺序播放,当前播放的tick,如果找不到则从第一个开始
    public int lastPlayTick
    {
        get
        {
            return LocalSave.GetInt("lastPlayTick" + PlayerDatas.Instance.baseData.PlayerID);
        }
        set
        {
            LocalSave.SetInt("lastPlayTick" + PlayerDatas.Instance.baseData.PlayerID, value);
        }
    }
    //玩家ID:玩家数据 (退出公会的玩家)
    public Dictionary<int, MemberData> taofaPlayerData = new Dictionary<int, MemberData>();
    public event Action BossHurtEvent;
    //自己的数据
    public byte m_BuZhenState;    // 是否已布阵
    public ushort m_AtkCount;    // 已斩杀次数,用于计算剩余次数=免费次数+道具增加次数-已斩杀次数
    public ushort m_ItemAddCount;    // 道具增加斩杀次数
    public ushort m_Anger;    // 当前怒气值
    public ushort m_BoxUnGetCount;    // 当前未领取的宝箱数,即可领取的
    public long m_BoxHurt;    // 今日伤害
    public long m_BoxHurtHis;    // 历史伤害
    //攻击数据
    public HA504_tagSCFamilyTaofaAtkRet atkResult;
    public event Action AtkResultEvent;
    //配置
    public int initSuperHitRate;
    public int[] bzAddAttrs;
@@ -12,13 +49,18 @@
    public int[][] atkItemList;
    public int maxAngerValue;
    public int[] bxCumulativeDamageList;
    long[] bxCumulativeDamageList;
    public List<long> allBXCumulativeDamageList = new List<long>();
    public int bxDailyMax;  //个人每日产出上限
    public int bxDailyAwardMax; //个人每日领取奖励上限
    public long lastDmgAddValue; // 最后一档伤害增值循环用
    public int addAtkCntItemID = 17; //增加讨伐次数道具ID
    public int bossSkinID = 7100300;
    void ParseConfig()
    {
        // 数值1:初始暴击率万分率,功能独立的暴击率,与角色暴击无关
        // 数值3:布阵最大层级,暂固定每人1次,1次1层
        // 数值3:布阵最大层级
        var config = FuncConfigConfig.Get("FamilyTaofaBuzhen");
        initSuperHitRate = int.Parse(config.Numerical1);
        bzAddAttrs = ConfigParse.GetMultipleStr<int>(config.Numerical2);
@@ -36,18 +78,70 @@
        // 数值2:每日个人贡献宝箱数上限,最后一档可循环,上限控制
        // 数值3:每日个人领取宝箱奖励个数上限
        config = FuncConfigConfig.Get("FamilyTaofaBox");
        bxCumulativeDamageList = JsonMapper.ToObject<int[]>(config.Numerical1);
        bxCumulativeDamageList = JsonMapper.ToObject<long[]>(config.Numerical1);
        bxDailyMax = int.Parse(config.Numerical2);
        bxDailyAwardMax = int.Parse(config.Numerical3);
        lastDmgAddValue = bxCumulativeDamageList[bxCumulativeDamageList.Length - 1] - bxCumulativeDamageList[bxCumulativeDamageList.Length - 2];
        //最后一档循环
        for (int i = 0; i < bxDailyMax; i++)
        {
            if (i < bxCumulativeDamageList.Length)
            {
                allBXCumulativeDamageList.Add(bxCumulativeDamageList[i]);
            }
            else
            {
                allBXCumulativeDamageList.Add(allBXCumulativeDamageList[i - 1] + lastDmgAddValue);
            }
        }
    }
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
        GuildManager.Instance.EnterOrQuitGuildEvent += EnterOrQuitGuildEvent;
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
        ParseConfig();
    }
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
        GuildManager.Instance.EnterOrQuitGuildEvent -= EnterOrQuitGuildEvent;
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
    }
    void OnBeforePlayerDataInitializeEventOnRelogin()
    {
        bossActions.Clear();
        playerBossHurtRank.Clear();
        m_BuZhenState = 0;
        m_AtkCount = 0;
        m_ItemAddCount = 0;
        m_Anger = 0;
        m_BoxUnGetCount = 0;
        m_BoxHurt = 0;
        m_BoxHurtHis = 0;
        taofaAtkData.Clear();
        taofaPlayerData.Clear();
    }
    private void OnRefreshFairyInfo()
    {
        UpdateRedpoint();
    }
    void EnterOrQuitGuildEvent(bool isEnter)
    {
        if (!isEnter)
        {
            bossActions.Clear();
            playerBossHurtRank.Clear();
            taofaAtkData.Clear();
            taofaPlayerData.Clear();
        }
        UpdateRedpoint();
    }
    //// 操作:0-斩杀攻击;1-布阵
    public void TaofaBoss(int opType)
@@ -57,8 +151,31 @@
        GameNetSystem.Instance.SendInfo(pack);
    }
    public void UpdataMyBossData(HA503_tagSCFamilyTaofaInfo netPack)
    {
        m_BuZhenState = netPack.BuZhenState;
        m_AtkCount = netPack.AtkCount;
        m_ItemAddCount = netPack.ItemAddCount;
        m_Anger = netPack.Anger;
        m_BoxUnGetCount = netPack.BoxUnGetCount;
        m_BoxHurt = netPack.BoxHurt + netPack.BoxHurtEx * Constants.ExpPointValue;
        m_BoxHurtHis = netPack.BoxHurtHis + netPack.BoxHurtHisEx * Constants.ExpPointValue;
        UpdateRedpoint();
        BossHurtEvent?.Invoke();
    }
    public void UpdateAtkResult(HA504_tagSCFamilyTaofaAtkRet netPack)
    {
        atkResult = netPack;
        AtkResultEvent?.Invoke();
    }
    public int GetHasAtkCnt()
    {
        return freeAtkCount + m_ItemAddCount - m_AtkCount;
    }
    // 【公会行为】
    // 增加行为类型18 - 公会讨伐相关数据
@@ -75,12 +192,16 @@
    // atkList   -     讨伐记录列表,可用于表现成员头像攻击: atkTime  -  攻击时间戳,  atkType  -  攻击类型(0-普通攻击, 1-怒气攻击)
    // info     -     不一定有该key,仅退出的成员才有,用于更新退出成员相关基础信息,如名字、头像等,还在公会里的成员通过 // A5 20 玩家家族信息 #tagMCRoleFamilyInfo 取成员信息
    // "info":{"LV":106,"Job":1,"Name":"主公3016219","FacePic":0,"FightPower":1831995,"RealmLV":12,"ServerID":86,"TitleID":0,"Face":0},
    // boss讨伐的全局数据
    public HA513_tagMCFamilyActionInfo.tagMCFamilyAction GetGuildBossAction()
    {
        if (bossActions.ContainsKey(1))
        {
            return bossActions[1];
        }
        return null;
    }
    // 获取公会中的伤害记录做排名
    public bool UpdateGuildBossInfo(HA513_tagMCFamilyActionInfo vNetData)
@@ -90,19 +211,179 @@
            return false;
        }
        //判断是否新的公会数据
        for (int i = 0; i < vNetData.Count; i++)
        {
            var playerID = (int)vNetData.FamilyActionList[i].Value1;
            if (playerID != 1)
            {
                continue;
            }
            if (bossActions.ContainsKey(1) && bossActions[1].Time != vNetData.FamilyActionList[0].Time)
            {
                bossActions.Clear();
                playerBossHurtRank.Clear();
            }
        }
        for (int i = 0; i < vNetData.Count; i++)
        {
            bossActions[(int)vNetData.FamilyActionList[i].Value1] = vNetData.FamilyActionList[i];
        }
        SortPlayerHurt();
        RefreshAtkList();
        BossHurtEvent?.Invoke();
        return true;
    }
    void SortPlayerHurt()
    {
        playerBossHurtRank.Clear();
        foreach (var item in bossActions)
        {
            if (item.Value.Value1 != 1)
            {
                if (item.Value.Value4 == 0 && item.Value.Value5 == 0)
                {
                    continue;
                }
                playerBossHurtRank.Add(item.Value);
            }
        }
        playerBossHurtRank.Sort((a, b) => (b.Value4 + b.Value5 * Constants.ExpPointValue).CompareTo(a.Value4 + a.Value5 * Constants.ExpPointValue));
    }
    //解析攻击记录 和 玩家信息(退出公会的)
    void RefreshAtkList()
    {
        //{"atkList":[[atkTime, 本次贡献箱子数, 本次总伤害, atkType], ...],   "info":{k:v, ...}}
        //"info":{"LV":106,"Job":1,"Name":"主公3016219","FacePic":0,"FightPower":1831995,"RealmLV":12,"ServerID":86,"TitleID":0,"Face":0},
        taofaAtkData.Clear();
        taofaPlayerData.Clear();
        foreach (var item in playerBossHurtRank)
        {
            JsonData jsonData = JsonMapper.ToObject(item.UseData);
            if (!jsonData.ContainsKey("atkList"))
            {
                continue;
            }
            var arr = JsonMapper.ToObject<long[][]>(jsonData["atkList"].ToJson());
            for (int i = 0; i < arr.Length; i++)
            {
                taofaAtkData[(int)arr[i][0]] = new TaofaAtkData()
                {
                    playerID = (int)item.Value1,
                    atkType = (int)arr[i][3],
                    hurt = arr[i][2],
                };
            }
            if (jsonData.ContainsKey("info"))
            {
                taofaPlayerData[(int)item.Value1] = JsonMapper.ToObject<MemberData>(jsonData["info"].ToJson());
            }
        }
    }
    // 获取我的排名
    public int GetMyRank()
    {
        int rank = 0;
        for (int i = 0; i < playerBossHurtRank.Count; i++)
        {
            if (playerBossHurtRank[i].Value1 == PlayerDatas.Instance.baseData.PlayerID)
            {
                rank = i + 1;
                break;
            }
        }
        return rank;
    }
    //获取成员外观数据 头像名字等
    public MemberData GetMemberData(int playerId)
    {
        var playerInfo = PlayerDatas.Instance.fairyData.GetMember(playerId);
        if (playerInfo == null)
        {
            return taofaPlayerData.ContainsKey(playerId) ? taofaPlayerData[playerId] : new MemberData();
        }
        return new MemberData()
        {
            LV = playerInfo.LV,
            Job = playerInfo.Job,
            Name = playerInfo.Name,
            FacePic = playerInfo.FacePic,
            FightPower = (ulong)playerInfo.FightPower,
            RealmLV = playerInfo.RealmLV,
            ServerID = playerInfo.ServerID,
            TitleID = playerInfo.TitleID,
            Face = playerInfo.Face
        };
    }
    #region 红点
    Redpoint redPoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.bossTaofaRedpointID);
    void UpdateRedpoint()
    {
        redPoint.state = RedPointState.None;
        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.GuildBoss))
        {
            return;
        }
        if (PlayerDatas.Instance.fairyData.fairy == null)
        {
            return;
        }
        if (m_BuZhenState == 0)
        {
            redPoint.state = RedPointState.Simple;
            return;
        }
        if (GetHasAtkCnt() > 0)
        {
            redPoint.state = RedPointState.Simple;
            return;
        }
        if (m_BoxUnGetCount > 0)
        {
            redPoint.state = RedPointState.Simple;
            return;
        }
    }
    #endregion
}
public class PlayerGuildBossAtkInfo
public class TaofaAtkData
{
    public int playerID;
    public int atkTime;
    public int bzTime;
    public int atkCount;
    public long totalHurtValue;
    public int boxCnt;
    public int atkType;
    public long hurt;
}
public class MemberData
{
    public int LV;
    public int Job;
    public string Name;
    public int FacePic;
    public ulong FightPower;
    public int RealmLV;
    public int ServerID;
    public int TitleID;
    public int Face;
}