少年修仙传客户端代码仓库
client_Hale
2019-04-13 015cf97eb566ec42776c0c95bc49fcd0be3d3ee6
382 前端掉落; 特殊BOSSAI
1 文件已重命名
4个文件已修改
1个文件已删除
1 文件已复制
2个文件已添加
556 ■■■■ 已修改文件
Core/MapEditor/Editor/MapEditor.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/AI/AI_Boss_HYQ.cs 409 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/AI/AI_Boss_HYQ.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/AI/AI_Normal.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/State/SMB/STM_NormalAttack.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/ClientDropItemUtility.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/ClientDropItemUtility.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/GameActor/GA_NpcClientFightBoss.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/RuntimeLogUtility.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/MapEditor/Editor/MapEditor.cs
@@ -74,7 +74,17 @@
        {
            if (GUILayout.Button("测试"))
            {
                ClientSceneManager.Instance.TriggerTest(8);
                // Debug.Log("1 & 2 = " + (1 & 2));
                var _center = Vector3.zero;
                int _count = 18;
                int _dropCount = 0;
                while (_dropCount < _count)
                {
                    var _cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    _dropCount += 1;
                }
            }
            if (gUISkin == null)
            {
Fight/Actor/AI/AI_Boss_HYQ.cs
New file
@@ -0,0 +1,409 @@
using System.Collections;
using System.Collections.Generic;
using Snxxz.UI;
using UnityEngine;
public class AI_Boss_HYQ : SampleAI
{
    private int m_Step = 0;
    private bool m_InShow = false;
    private int m_LockSkill = 0;
    private int m_NormalAtkCount = 0;
    public AI_Boss_HYQ(GA_NpcClientFightNorm owner, Vector3 bornPosition) : base(owner, bornPosition)
    {
        m_Step = 0;
        m_SleepTime = 1f;
        m_InShow = false;
        m_CanCastSkill = false;
        m_NormalAtkCount = 0;
    }
    private void CheckStep()
    {
        var _hero = PlayerDatas.Instance.hero;
        switch (m_Step)
        {
            case 0:// 检测普攻次数
                if (m_NormalAtkCount > 1)
                {
                    m_Step = 1;
                    m_LockSkill = 10009;
                    m_CanCastSkill = true;
                }
                break;
            case 1:// 检测血量
                if (m_Owner.ActorInfo.RealHp <= m_Owner.ActorInfo.RealMaxHp * .2f)
                {
                    Debug.Log("触发了动画");
                    m_Step = 2;
                }
                break;
            case 2:
                // Boss: 小辈感受吾真正的实力
                var _model1 = ModelCenter.Instance.GetModel<GuideDialogueModel>();
                _model1.dialogID = 1000;
                _model1.onClose = Step_1_TalkFinished;
                WindowCenter.Instance.Open<GuideDialogueWin>();
                if (_hero != null)
                {
                    _hero.Behaviour.StopKillUntilDieAI();
                    _hero.Behaviour.StopHandupAI();
                }
                m_Step = 3;
                break;
            case 4:// 计算角色普攻次数
                if (m_NormalAtkCount > 3)
                {
                    STM_NormalAttack.OnCastNormalAttack -= OnHeroNormalAttack;
                    m_NormalAtkCount = 0;
                    // Boss: 哈哈哈
                    var _model2 = ModelCenter.Instance.GetModel<GuideDialogueModel>();
                    _model2.dialogID = 1000;
                    _model2.onClose = Step_1_TalkFinished;
                    WindowCenter.Instance.Open<GuideDialogueWin>();
                    if (_hero != null)
                    {
                        _hero.Behaviour.StopKillUntilDieAI();
                        _hero.Behaviour.StopHandupAI();
                    }
                    m_Step = 5;
                }
                break;
        }
    }
    private void Step_1_TalkFinished()
    {
        m_Step = 4;
        m_NormalAtkCount = 0;
        STM_NormalAttack.OnCastNormalAttack += OnHeroNormalAttack;
    }
    private void OnHeroNormalAttack()
    {
        m_NormalAtkCount += 1;
    }
    public override void Update()
    {
        if (m_InShow)
        {
            return;
        }
        CheckStep();
        // ai休眠时间
        if (Time.realtimeSinceStartup - m_LastThinkTime > m_SleepTime)
        {
            _Thinking();
        }
        // 是否正在释放技能
        if (m_Owner.SkillMgr.CurCastSkill != null)
        {
            if (m_Owner.SkillMgr.CurCastSkill.SkillCompelete == false)
            {
                if (m_Owner.IsIdle())
                {
                    m_Owner.SkillMgr.CurCastSkill.SkillCompelete = true;
                }
                return;
            }
            if (m_Owner.SkillMgr.CurCastSkill.SkillPreparing)
            {
                return;
            }
            if (m_Owner.NextAction == GAStaticDefine.Act_Warn)
            {
                return;
            }
        }
        switch (m_AIStatus)
        {
            case E_AIStatus.Patrol:
                _Patrol();
                break;
            case E_AIStatus.Attack:
                _Attack();
                break;
            case E_AIStatus.MoveToBornPos:
                MoveToBornPos();
                break;
        }
    }
    private void MoveToBornPos()
    {
        var _dis = MathUtility.DistanceSqrtXZ(m_Owner.Pos, BornPos);
        if (_dis > 0.1f)
        {
            m_Owner.MoveToPosition(BornPos);
        }
        else
        {
            m_AIStatus = E_AIStatus.Patrol;
        }
    }
    private byte atkStep;
    private Vector3 atkPos;
    private void _Attack()
    {
        if (m_AIStatus == E_AIStatus.MoveToBornPos)
        {
            return;
        }
        GA_Hero _hero = PlayerDatas.Instance.hero;
        float _dis;
        switch (atkStep)
        {
            case 0:
                _dis = GetNextSkill().skillInfo.config.AtkDist * .5f;
                var _compareDis = MathUtility.DistanceSqrtXZ(_hero.Pos, m_Owner.Pos);
                if (_compareDis < _dis * _dis)
                {
                    atkStep = 1;
                    m_Owner.StopPathFind();
                    m_Owner.Forward = MathUtility.ForwardXZ(_hero.Pos, m_Owner.Pos);
                }
                else
                {
                    if (m_Owner.posIndex != -1)
                    {
                        HeroRoundGird.Instance.Release(m_Owner.posIndex);
                        m_Owner.posIndex = -1;
                    }
                    var _node = HeroRoundGird.Instance.Request(m_Owner.ServerInstID, m_Owner.Pos, _dis);
                    if (_node != null)
                    {
                        atkPos = HeroRoundGird.Instance.GetRealPos(_node);
                        m_Owner.posIndex = _node.index;
                    }
                    _dis = MathUtility.DistanceSqrtXZ(atkPos, m_Owner.Pos);
                    if (_dis < 0.2f)
                    {
                        atkStep = 1;
                        m_Owner.StopPathFind();
                        m_Owner.Forward = MathUtility.ForwardXZ(_hero.Pos, m_Owner.Pos);
                    }
                    else
                    {
                        atkStep = 2;
                    }
                }
                break;
            case 2:
                _dis = MathUtility.DistanceSqrtXZ(atkPos, m_Owner.Pos);
                if (_dis < 0.2f)
                {
                    atkStep = 0;
                }
                else
                {
                    m_Owner.MoveToPosition(atkPos);
                }
                break;
            case 1:
                if (Time.realtimeSinceStartup - m_LastAttackTime < m_Owner.NpcConfig.AtkInterval * Constants.F_GAMMA)
                {
                    return;
                }
                var _skillID = GetNextSkill().id;
                Debug.LogFormat("{0} 释放了技能 {1}", m_Owner.ServerInstID, _skillID);
                m_Owner.CastSkill(_skillID);
                atkStep = 0;
                if (_skillID == m_LockSkill)
                {
                    m_LockSkill = 0;
                }
                if (_skillID == m_BaseAtkSkillID)
                {
                    m_NormalAtkCount += 1;
                    Debug.Log("次数增加了");
                }
                m_LastAttackTime = Time.realtimeSinceStartup;
                break;
        }
    }
    private Skill GetNextSkill()
    {
        Skill _skill1 = null;
        if (m_CanCastSkill)
        {
            Debug.Log("可以释放技能了");
            if (m_LockSkill > 0)
            {
                Debug.Log("有指定技能");
                _skill1 = m_Owner.SkillMgr.Get(m_LockSkill);
                if (!_skill1.IsValid())
                {
                    _skill1 = null;
                }
            }
            if (_skill1 == null)
            {
                for (int i = 0; i < m_SkillList.Count; ++i)
                {
                    if (m_Owner.SkillMgr.Get(m_SkillList[i]).IsValid())
                    {
                        _skill1 = m_Owner.SkillMgr.Get(m_SkillList[i]);
                        break;
                    }
                }
            }
        }
        if (_skill1 == null)
        {
            _skill1 = m_Owner.SkillMgr.Get(m_BaseAtkSkillID);
        }
        return _skill1;
    }
    private byte patrolStep;
    private float patrolWaitTime;
    private float patrolWaitRandomTime;
    private Vector3 randomPos;
    private void _Patrol()
    {
        if (m_AIStatus == E_AIStatus.MoveToBornPos)
        {
            return;
        }
        switch (patrolStep)
        {
            case 0:
                patrolWaitRandomTime = Random.Range(2f, 4f);
                patrolWaitTime = Time.realtimeSinceStartup;
                patrolStep = 1;
                break;
            case 1:
                if (Time.realtimeSinceStartup - patrolWaitTime > patrolWaitRandomTime)
                {
                    patrolStep = 2;
                    patrolWaitTime = Time.realtimeSinceStartup;
                    randomPos = BornPos + new Vector3(Random.Range(-2f, 2f), 0, Random.Range(-2f, 2f));
                    GActor.TryGetValidPos(randomPos, ref randomPos);
                    m_Owner.MoveToPosition(randomPos);
                }
                break;
            case 2:
                if (Time.realtimeSinceStartup - patrolWaitTime > 2)
                {
                    patrolStep = 1;
                }
                break;
        }
    }
    private void _Thinking()
    {
        if (m_AIStatus == E_AIStatus.MoveToBornPos)
        {
            return;
        }
        float _compareDis;
        // 思考
        var _hero = PlayerDatas.Instance.hero;
        if (_hero == null || _hero.ActorInfo.serverDie)
        {
            // 主角不存在或者死亡了
            // 在出生点附近
            _compareDis = MathUtility.DistanceSqrtXZ(BornPos, m_Owner.Pos);
            if (_compareDis < 4)
            {
                m_AIStatus = E_AIStatus.Patrol;
            }
            // 巡逻
            // 不在出生点附近
            else
            {
                // 回到出生点
                m_AIStatus = E_AIStatus.MoveToBornPos;
            }
        }
        else
        {
            _compareDis = MathUtility.DistanceSqrtXZ(m_Owner.Pos, BornPos);
            if (_compareDis > m_KeepBornDistSqrt)
            {
                m_AIStatus = E_AIStatus.MoveToBornPos;
            }
            else
            {
                // 玩家在可见范围内
                _compareDis = MathUtility.DistanceSqrtXZ(m_Owner.Pos, _hero.Pos);
                if (_compareDis < m_KeepBornDistSqrt)
                {
                    // 标识是否执行攻击逻辑
                    bool _doAttack = false;
                    // 自己是主动怪
                    if (m_Owner.NpcConfig.AtkType == 0)
                    {
                        _doAttack = true;
                    }
                    else
                    {
                        if (m_Owner.heroAttacked)
                        {
                            _doAttack = true;
                        }
                    }
                    if (_doAttack)
                    {
                        m_AIStatus = E_AIStatus.Attack;
                    }
                    else
                    {
                        // 主角不存在或者死亡了
                        // 在出生点附近
                        _compareDis = MathUtility.DistanceSqrtXZ(BornPos, m_Owner.Pos);
                        if (_compareDis < 4)
                        {
                            m_AIStatus = E_AIStatus.Patrol;
                        }
                        // 巡逻
                        // 不在出生点附近
                        else
                        {
                            // 回到出生点
                            m_AIStatus = E_AIStatus.MoveToBornPos;
                            atkStep = 0;
                        }
                    }
                }
                else
                {
                    m_AIStatus = E_AIStatus.Patrol;
                }
            }
        }
    }
}
Fight/Actor/AI/AI_Boss_HYQ.cs.meta
File was renamed from Fight/Actor/AI/AI_Normal.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: bf230da081b2e4d44809f1609f11fe7a
timeCreated: 1514970107
guid: b0554aa977578524c8a477b703730716
timeCreated: 1554967695
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Fight/Actor/AI/AI_Normal.cs
File was deleted
Fight/Actor/State/SMB/STM_NormalAttack.cs
@@ -2,7 +2,7 @@
public class STM_NormalAttack : STM_BaseAttack
{
    public static UnityEngine.Events.UnityAction OnCastNormalAttack;
    protected bool hadCompelete = false;
    protected virtual void CacheSkillId(GActorPlayerBase _playerActor) { }
@@ -56,6 +56,11 @@
                }
                _player.Forward = _dir;
            }
            if (OnCastNormalAttack != null)
            {
                OnCastNormalAttack();
            }
        }
        hadCompelete = false;
Fight/ClientDropItemUtility.cs
New file
@@ -0,0 +1,49 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClientDropItemUtility : Singleton<ClientDropItemUtility>
{
    public void Drop(int[] itemIds)
    {
        var _center = PlayerDatas.Instance.hero.Pos;
        int _count = itemIds.Length;
        int _column = (int)Mathf.Sqrt(_count);
        int _i = 0;
        int _j = 0;
        var _start = _center - Vector3.one * .5f * _column * .5f;
        int _dropCount = 0;
        while (_dropCount < _count)
        {
            var _dropPos = _start + new Vector3(_j * .5f, 0, _i * .5f);
            RaycastHit _hit;
            if (!Physics.Raycast(_dropPos + new Vector3(0, 50, 0), Vector3.down, out _hit, 80, LayerUtility.WalkbleMask))
            {
                continue;
            }
            DropItem _item = DropItem.Drop(itemIds[_dropCount], _hit.point, CameraController.Instance.CameraObject);
            _dropCount += 1;
            if (_j < _column - 1)
            {
                _j = _j + 1;
            }
            else
            {
                _j = 0;
                _i = _i + 1;
            }
        }
    }
    public void Drop(int itemID, Vector3 position)
    {
    }
    private class ClientDropItem
    {
    }
}
Fight/ClientDropItemUtility.cs.meta
copy from Fight/Actor/AI/AI_Normal.cs.meta copy to Fight/ClientDropItemUtility.cs.meta
File was copied from Fight/Actor/AI/AI_Normal.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: bf230da081b2e4d44809f1609f11fe7a
timeCreated: 1514970107
guid: eb195a1547a68e4489085b1b95fbfc7f
timeCreated: 1555138794
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Fight/GameActor/GA_NpcClientFightBoss.cs
@@ -17,13 +17,20 @@
    {
        base.OnInit(package);
        if (NpcConfig.AIType == 186)// 封魔坛boss
        if (NpcConfig.NPCID == 30902001)
        {
            m_AIHandler = new AI_BossFMT(this, BornPos);
            m_AIHandler = new AI_Boss_HYQ(this, BornPos);
        }
        else
        {
            m_AIHandler = new AI_Npc_200(this, BornPos);
            if (NpcConfig.AIType == 186)// 封魔坛boss
            {
                m_AIHandler = new AI_BossFMT(this, BornPos);
            }
            else
            {
                m_AIHandler = new AI_Npc_200(this, BornPos);
            }
        }
    }
Utility/RuntimeLogUtility.cs
@@ -243,9 +243,11 @@
        if (GUILayout.Button("创建PVP敌方"))
        {
            var _npc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightNorm>(10101002, E_ActorGroup.Enemy);
            _npc.BornPos = _npc.Pos = PlayerDatas.Instance.hero.Pos;
            _npc.ActorInfo.ResetHp(5, -1, 5);
            // var _npc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightBoss>(30902001, E_ActorGroup.Enemy);
            // _npc.BornPos = _npc.Pos = PlayerDatas.Instance.hero.Pos;
            // _npc.ActorInfo.ResetHp(200, -1, 200);
            ClientDropItemUtility.Instance.Drop(new int[] { 5006, 5301, 5410, 5505, 10543, 1043050 });
            // var _npc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightBoss>(10103001, E_ActorGroup.Enemy);