hch
6 天以前 7419fb5b162a0aeec17b520437aa3af8203639ca
287 【公会】BOSS讨伐
4个文件已修改
308 ■■■■■ 已修改文件
Main/System/Guild/GuildBossManager.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildBossOtherPlayer.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildBossOtherPlayerAttack.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildBossWin.cs 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildBossManager.cs
@@ -9,8 +9,9 @@
    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>();
    public int lastPlayTick = 0;    //按时间顺序播放,当前播放的tick,如果找不到则从第一个开始
    //玩家ID:玩家数据 (退出公会的玩家)
    public Dictionary<int, MemberData> taofaPlayerData = new Dictionary<int, MemberData>();
    public event Action BossHurtEvent;
@@ -37,9 +38,10 @@
    public int[][] atkItemList;
    public int maxAngerValue;
    public long[] 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;
@@ -67,7 +69,20 @@
        config = FuncConfigConfig.Get("FamilyTaofaBox");
        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()
@@ -240,13 +255,15 @@
                continue;
            }
            var arr = JsonMapper.ToObject<long[][]>(jsonData["atkList"].ToJson());
            taofaAtkData[(int)arr[0][0]] = new TaofaAtkData()
            for (int i = 0; i < arr.Length; i++)
            {
                playerID = (int)item.Value1,
                atkType = (int)arr[0][3],
                hurt = arr[0][2],
            };
                taofaAtkData[(int)arr[i][0]] = new TaofaAtkData()
                {
                    playerID = (int)item.Value1,
                    atkType = (int)arr[i][3],
                    hurt = arr[i][2],
                };
            }
            if (jsonData.ContainsKey("info"))
            {
Main/System/Guild/GuildBossOtherPlayer.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
@@ -10,11 +11,44 @@
    [SerializeField] Text hurtValueText;
    [SerializeField] Image rankImg;
    public void Display()
    [NonSerialized] public int moveState;   // 0 缓慢移动,1 快速突进boss
    [NonSerialized] public int playerID;
    [NonSerialized] public Vector3 startPos;
    public void Display(HA513_tagMCFamilyActionInfo.tagMCFamilyAction data)
    {
        playerID = (int)data.Value1;
        var playData = GuildBossManager.Instance.GetMemberData(playerID);
        headCell.InitUI(AvatarHelper.GetAvatarModel(playerID, playData.Face, playData.FacePic));
        nameText.text = playData.Name;
        hurtValueText.text = UIHelper.ReplaceLargeNum(data.Value4 + data.Value5 * Constants.ExpPointValue);
        var rank = GetRankIndex(playerID);
        if (rank == 0)
        {
            rankImg.SetActive(false);
        }
        else
        {
            rankImg.SetActive(true);
            rankImg.SetSprite("GuildBossRank" + rank);
        }
    }
    int GetRankIndex(int playerID)
    {
        int rank = 0;
        for (int i = 0; i < 3; i++)
        {
            if (GuildBossManager.Instance.playerBossHurtRank[i].Value1 == playerID)
            {
                rank = i + 1;
                break;
            }
        }
        return rank;
    }
    public void NotePos()
    {
        startPos = transform.localPosition;
    }
}
Main/System/Guild/GuildBossOtherPlayerAttack.cs
@@ -9,15 +9,25 @@
    [SerializeField] Text hurtValueText;
    [SerializeField] Text nameText;
    [SerializeField] UIEffectPlayer atkEffect;
    [SerializeField] Transform atkValueRect;
    // [SerializeField] Transform atkValueRect;
    [SerializeField] ScaleTween scaleTween;
    [SerializeField] UIAlphaTween uiAlphaTween;
    public void Display()
    public void Display(TaofaAtkData taofaAtkData)
    {
        scaleTween.SetStartState();
        uiAlphaTween.SetStartState();
        angerAtkImg.SetActive(taofaAtkData.atkType == 1);
        var data = GuildBossManager.Instance.GetMemberData(taofaAtkData.playerID);
        nameText.text = data == null ? "" : data.Name;
        hurtValueText.text = BattleUtility.DisplayDamageNum(taofaAtkData.hurt, 2);
        atkEffect.Play();
        scaleTween.Play();
        uiAlphaTween.Play();
    }
    public void Hide()
    {
        uiAlphaTween.SetEndState();
    }
}
Main/System/Guild/GuildBossWin.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
using DG.Tweening;
using UnityEngine;
@@ -49,12 +50,14 @@
    [SerializeField] Text awardCntText;
    //攻击区
    [SerializeField] UIHeroController bossModel;
    [SerializeField] Transform atkTargetPos;
    [SerializeField] HorseController heroModel;
    [SerializeField] Transform attackArea1;
    [SerializeField] Transform attackArea2;
    [SerializeField] Transform attackArea3;
    [SerializeField] Transform[] attackAreas;
    [SerializeField] RectTransform attackAreaParent;
    [SerializeField] GuildBossOtherPlayer otherPlayer;  //创建多个用
    [SerializeField] GuildBossOtherPlayerAttack otherPlayerAttack;  //创建多个用
    List<GuildBossOtherPlayer> otherPlayers;
    [SerializeField] GuildBossOtherPlayerAttack[] otherPlayerAttacks;
    //自己的攻击
    [SerializeField] UIEffectPlayer hurtEffect; 
@@ -64,6 +67,9 @@
    [SerializeField] Image[] awardIcons;
    [SerializeField] Transform pos1;
    [SerializeField] Transform pos2;
    [SerializeField] Transform[] dropBoxes;
    [SerializeField] Transform targetPos;
    [SerializeField] Transform fakeRedBZ;
    [SerializeField] Transform fakeRedAward;
@@ -229,6 +235,8 @@
            beforeLayerNum = (int)layer;
        }
        ShowDynamicUI();
        ShowDropBox();
        ShowOtherAttacker();
    }
    void ShowRank()
@@ -286,6 +294,7 @@
        endTimeText.text = Language.Get("Arena14", TimeUtility.SecondsToHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds));
        var bossAction = GuildBossManager.Instance.GetGuildBossAction();
        ShowBzInfo(bossAction);
        OtherPlayerAnimation();
    }
    void ShowProcess(float value)
@@ -318,12 +327,12 @@
    void OnBzBtnClick()
    {
        int curLayer = 0;
        var bossAction = GuildBossManager.Instance.GetGuildBossAction();
        if (bossAction != null)
        {
            curLayer = (int)bossAction.Value3;
        }
        // int curLayer = 0;
        // var bossAction = GuildBossManager.Instance.GetGuildBossAction();
        // if (bossAction != null)
        // {
        //     curLayer = (int)bossAction.Value3;
        // }
        // if (curLayer >= GuildBossManager.Instance.bzMaxLevel)
        // {
@@ -513,5 +522,187 @@
            bossModel.onComplete = null;
        };
        bossModel.PlayAnimation("chuxian");
        lastValueIndex = FindHurtIndex();
        for (int i = 0; i < dropBoxes.Length; i++)
        {
            dropBoxes[i].transform.localScale = Vector3.zero;
        }
        for (int i = otherPlayers.Count - 1; i >= 0; i--)
        {
            otherPlayers[i].moveState = 0;
        }
        for (int i = 0; i < otherPlayerAttacks.Length; i++)
        {
            otherPlayerAttacks[i].Hide();
            //置底
            otherPlayerAttacks[i].transform.SetAsLastSibling();
        }
    }
    int lastValueIndex = -1;    // -1 未达标
    void ShowDropBox()
    {
        int index = FindHurtIndex();
        if (index > lastValueIndex)
        {
            var showBoxCnt = index - lastValueIndex;
            lastValueIndex = index;
            for (int i = 0; i < dropBoxes.Length; i++)
            {
                if (i < showBoxCnt)
                {
                    dropBoxes[i].transform.localScale = Vector3.one*0.5f;
                    var startPos = new Vector3(UnityEngine.Random.Range(-80, 80), 30, 0);
                    //随机方向返回1或者-1
                    int randDir = UnityEngine.Random.Range(0, 2) == 0 ? 1 : -1;
                    dropBoxes[i].localPosition = startPos;
                    int _index = i;
                    dropBoxes[i].DOLocalPath(new Vector3[] { startPos,
                            new Vector3(startPos.x + randDir * 10, startPos.y + 30f, 0),
                            new Vector3(startPos.x + randDir * 25, startPos.y - 60, 0) }, 0.5f, PathType.CatmullRom).SetEase(Ease.InOutSine).OnComplete(()=>
                            {
                                dropBoxes[_index].DOLocalMove(targetPos.localPosition, 0.3f).OnComplete(()=>
                                {
                                    dropBoxes[_index].transform.localScale = Vector3.zero;
                                    awardBtn.GetComponent<ScaleTween>().Play();
                                });
                            });
                }
                else
                {
                    dropBoxes[i].transform.localScale = Vector3.zero;
                }
            }
        }
    }
    int FindHurtIndex()
    {
        for (int i = 0; i < GuildBossManager.Instance.allBXCumulativeDamageList.Count; i++)
        {
            if (GuildBossManager.Instance.m_BoxHurt < GuildBossManager.Instance.allBXCumulativeDamageList[i])
            {
                return i - 1;
            }
        }
        return GuildBossManager.Instance.allBXCumulativeDamageList.Count;
    }
    void ShowOtherAttacker()
    {
        CreateOtherAttacker();
        var cnt = GuildBossManager.Instance.playerBossHurtRank.Count;
        //伤害高的在上面,逆序显示
        for (int i = otherPlayers.Count - 1; i >= 0; i--)
        {
            if (i < cnt)
            {
                otherPlayers[i].SetActive(true);
                otherPlayers[i].Display(GuildBossManager.Instance.playerBossHurtRank[cnt - i - 1]);
            }
            else
            {
                otherPlayers[i].SetActive(false);
            }
        }
    }
    void CreateOtherAttacker()
    {
        if (otherPlayers.IsNullOrEmpty())
        {
            otherPlayers = new List<GuildBossOtherPlayer>();
        }
        int addCnt = GuildBossManager.Instance.playerBossHurtRank.Count - otherPlayers.Count;
        for (int i = 0; i < addCnt; i++)
        {
            var inst = Instantiate(otherPlayer, attackAreaParent);
            //坐标从attackAreas 随机一个组件,然后在组件的范围内随机,父类为attackAreaParent
            int pos = UnityEngine.Random.Range(0, attackAreas.Length);
            var rect = attackAreas[pos] as RectTransform;
            inst.transform.localPosition = attackAreas[pos].transform.localPosition +
                new Vector3(UnityEngine.Random.Range(-rect.rect.width / 2, rect.rect.width / 2),
                UnityEngine.Random.Range(-rect.rect.height / 2, rect.rect.height / 2), 0);
            inst.NotePos();
            otherPlayers.Add(inst);
        }
    }
    void OtherPlayerAnimation()
    {
        if (GuildBossManager.Instance.taofaAtkData.Keys.Count == 0)
        {
            return;
        }
        var keys = GuildBossManager.Instance.taofaAtkData.Keys.ToList();
        keys.Sort();
        int index = keys.IndexOf(GuildBossManager.Instance.lastPlayTick) + 1;
        if (index >= keys.Count)
        {
            index = 0;
        }
        GuildBossManager.Instance.lastPlayTick = keys[index];
        var atkData = GuildBossManager.Instance.taofaAtkData[keys[index]];
        var atkPlayerID = atkData.playerID;
        for (int i = 0; i < otherPlayers.Count; i++)
        {
            if (!otherPlayers[i].isActiveAndEnabled)
            {
                continue;
            }
            if (otherPlayers[i].moveState != 0)
            {
                continue;
            }
            // 突进
            if (otherPlayers[i].playerID == atkPlayerID)
            {
                if (otherPlayers[i].moveState != 1)
                {
                    otherPlayers[i].moveState = 1;
                    //向目标 atkTargetPos 突进80后回原位置
                    Vector3 currentPos = otherPlayers[i].transform.localPosition;
                    Vector3 targetPos = atkTargetPos.localPosition;
                    // 计算从当前点到目标点的方向向量
                    Vector3 direction = (targetPos - currentPos).normalized;
                    // 向目标方向移动80的距离
                    Vector3 attackPos = currentPos + direction * 50f;
                    // 记录原位置,用于后续返回
                    Vector3 originalPos = currentPos;
                    // 先移动到攻击位置,然后返回原位置
                    //  先停止原位置的移动
                    int _index = i;
                    int valueIndex = i % otherPlayerAttacks.Length;
                    otherPlayerAttacks[valueIndex].transform.localPosition = currentPos + direction * 160f;
                    otherPlayerAttacks[valueIndex].Display(atkData);
                    otherPlayers[i].transform.DOKill();
                    otherPlayers[i].transform.DOLocalMove(attackPos, 0.2f).SetEase(Ease.OutQuad)
                        .OnComplete(() =>
                        {
                            otherPlayers[_index].transform.DOLocalMove(originalPos, 0.2f).SetEase(Ease.InQuad);
                            otherPlayers[_index].moveState = 0;
                        });
                }
                continue;
            }
            otherPlayers[i].transform.DOKill();
            //缓慢移动
            var randomPos = otherPlayers[i].startPos + new Vector3(UnityEngine.Random.Range(-50, 50), UnityEngine.Random.Range(-50, 50), 0);
            otherPlayers[i].transform.DOLocalMove(randomPos, 2f).SetEase(Ease.InOutSine);
        }
    }
}