コード例 #1
0
ファイル: Monster.cs プロジェクト: BerryBless/MMO_Basic
        protected virtual void UpdateSkill()
        {
            if (_coolTick == 0)
            {
                // 유효한 타겟인지
                if (_target == null || _target.Room != Room)
                {
                    _target = null;
                    State   = CreatureState.Moving;
                    BroadcastMove();
                    return;
                }

                // 스킬이 아직 사용 가능한지
                Vector2Int dir         = (_target.CellPos - CellPos);
                int        dist        = dir.cellDistFromZero;
                bool       canUseSkill = (dist <= _skillRange && (dir.x == 0 || dir.y == 0));
                if (canUseSkill == false)
                {
                    State = CreatureState.Moving;
                    BroadcastMove();
                    return;
                }

                // 타게팅 방향 주시
                MoveDir lookDir = GetDirFromVector(dir);
                if (Dir != lookDir)
                {
                    Dir = lookDir;
                    BroadcastMove();
                }

                Skill skillData = null;
                DataManager.SkillDict.TryGetValue(1, out skillData);

                // 데미지 판정
                _target.OnDamaged(this, skillData.damage + TotalAttack);

                // 스킬 사용 Broadcast
                S_Skill skill = new S_Skill()
                {
                    Info = new SkillInfo()
                };
                skill.ObjectId     = Id;
                skill.Info.SkillId = skillData.id;
                Room.Broadcast(CellPos, skill);

                // 스킬 쿨타임 적용
                int coolTick = (int)(1000 * skillData.cooldown);
                _coolTick = Environment.TickCount64 + coolTick;
            }

            if (_coolTick > Environment.TickCount64)
            {
                return;
            }

            _coolTick = 0;
        }
コード例 #2
0
        protected virtual void UpdateSkill()
        {
            // _coolTick이 0이라는것은 스킬 사용할 준비가 완료됐음을 뜻함
            if (_coolTick == 0)
            {
                // 유효한 타겟인지 체크
                if (_target == null || _target.Room != Room || _target.Hp == 0)
                {
                    _target = null;
                    State   = CreatureState.Moving;
                    BroadcastMove(); // 좀 비효율적이지만..
                    return;
                }

                // 스킬이 아직 사용 가능한지
                Vector2Int dir         = (_target.CellPos - CellPos);
                int        dist        = dir.cellDistFromZero;
                bool       canUseSkill = (dist <= _skillRange && (dir.x == 0 || dir.y == 0));
                if (canUseSkill == false)
                {
                    // 스킬을 사용할 수 없는 상태가 됨
                    // 플레이어가 도망가거나 게임 자체를 나가거나 할 때 그걸 다시 쫓을지는 Moving 상태에서 판단
                    State = CreatureState.Moving;
                    BroadcastMove();
                    return;
                }

                // 타게팅 방향 주시
                MoveDir lookDir = GetDirFromVec(dir); // 상대방 - 내위치 = 내가 상대방을 바라보는 방향
                if (Dir != lookDir)
                {
                    Dir = lookDir;   // 모가지를 돌리고
                    BroadcastMove(); // 알림
                }

                Skill skillData = null;
                // 몬스터 시트를 따로 빼서 몬스터에 연결된 스킬과 아이디를 맵핑
                DataManager.SkillDict.TryGetValue(1, out skillData);

                // 데미지 판정
                _target.OnDamaged(this, skillData.damage + Stat.Attack);

                // 스킬 사용 Broadcast
                S_Skill skill = new S_Skill()
                {
                    Info = new SkillInfo()
                };
                skill.ObjectId     = Id;
                skill.Info.SkillId = skillData.id;
                Room.Broadcast(skill); // 몹이 스킬을 쓴다고 알림

                // 스킬 쿨타임 시작
                int coolTick = (int)(1000 * skillData.cooldown); // 단위 ms임
                _coolTick = Environment.TickCount64 + coolTick;  // 다음 tick 시간 구함
            }

            // 다시 스킬을 사용할 준비가 됐는지 여부
            if (_coolTick > Environment.TickCount64)
            {
                return;
            }

            // 햇갈릴수도 있겠네
            _coolTick = 0; //_coolTick이 0이면 스킬사용 준비가 됐다는 뜻이다.
        }