Exemplo n.º 1
0
    protected override IEnumerator BehaviourCoroutine()
    {
        unitInfo.ChangeState(UnitInfo.UnitState.action);
        animator.CrossFade(GetActionName(), 0.25f);
        unitInfo.ToggleInvincible(true);
        yield return(new WaitForStateChange(this, 2));

        GameObject cameraObject = ControlManager.Instance.mainCameraObject;

        if (Vector3.Distance(cameraObject.transform.position, unitInfo.transform.position) <= roarRadius * 5)
        {
            cameraObject.GetComponent <CameraShaker>().ShakeCamera(0.6f, 1f, 0.4f);
        }
        DamageInfo[] dInfos = DamageGenerator.ApplyRadialDamage(unitInfo, transform.position, roarRadius, 1, false, LayerMask.GetMask("Unit"));
        foreach (DamageInfo dinfo in dInfos)
        {
            Vector3 forward = unitInfo.transform.position - dinfo.hitPoint;
            Vector3 euler   = Quaternion.LookRotation(forward).eulerAngles;
            euler.x = 0;
            euler.z = 0;
            dinfo.hitUnit.transform.eulerAngles = euler;
            dinfo.hitUnit.GetComponent <Rigidbody>().velocity = Vector3.up * 1 + (dinfo.hitUnit.transform.position - (transform.position).normalized * knockBackDistance);
            dinfo.hitUnit.GetAction().StopAction();
            dinfo.hitUnit.AddCrowdControl(ConditionData.UnitCondition.knockBack, 1,
                                          delegate() { dinfo.hitUnit.GetComponent <ActionComponent>().UseSkill("WakeUp", true); });
        }
        yield return(new WaitForStateChange(this, 3));

        unitInfo.ToggleInvincible(false);
        unitInfo.ChangeState(UnitInfo.UnitState.idle);
        StopAction();
    }
Exemplo n.º 2
0
        public RangedWeapon(RangedWeaponObject rangedWeaponObject) : base(rangedWeaponObject)
        {
            reloadTime      = rangedWeaponObject.Cooldown;
            projectileSpeed = rangedWeaponObject.ProjectileSpeed;

            var type = rangedWeaponObject.damageTypes[UnityEngine.Random.Range(0, rangedWeaponObject.damageTypes.Length)];

            damage      = new DamageGenerator(rangedWeaponObject.MinDamage, rangedWeaponObject.MaxDamage, type);
            name        = StringifyName();
            description = StringifyDescription();
        }
Exemplo n.º 3
0
        protected override int[] GetUnitsDamage(BattleSideType battleSideTime, Unit unit, int unitCount, Random random)
        {
            int[] result = new int[unitCount];

            DamageGenerator damageGenerator = GetDamageGenerator(battleSideTime, unit);

            for (int i = 0; i < result.Length; i++)
            {
                result[i] = damageGenerator.Generate();
            }

            return(result);
        }
Exemplo n.º 4
0
    protected override IEnumerator BehaviourCoroutine()
    {
        GenericIK ik = unitInfo.transform.GetComponent <GenericIK>();

        unitInfo.ChangeState(UnitInfo.UnitState.action);
        animator.CrossFade("DragonBreath", 0.45f);
        unitInfo.GetMovement().Stop();
        unitInfo.GetMovement().StopRotating();
        ik.ToggleIK(false);


        yield return(new WaitForStateChange(this, 2));

        animator.speed = 0.3f;
        breathParticle = Instantiate <GameObject>(Resources.Load <GameObject>("Effects/P_EF_Frost"));
        breathParticle.transform.parent        = mouseTransform;
        breathParticle.transform.eulerAngles   = mouseTransform.eulerAngles + mouseAngleOffset;
        breathParticle.transform.localPosition = Vector3.zero;
        SetStopActionEvent(delegate(){
            unitInfo.GetAnimator().speed = 1.0f;
            Destroy(breathParticle);
        });
        Vector3 nOffsetEuler = mouseAngleOffset;

        nOffsetEuler.x -= mouseAngleOffset.x;
        while (behaviourState == 2)
        {
            DamageInfo[] infos = DamageGenerator.ApplyBoxDamage(unitInfo, mouseTransform.position + Quaternion.Euler(mouseTransform.eulerAngles + nOffsetEuler) * offset, extends, Quaternion.Euler(mouseTransform.eulerAngles + nOffsetEuler), damage, false, LayerMask.GetMask("Unit"));
            foreach (DamageInfo info in infos)
            {
                info.hitUnit.SetInvincibleTime(0.5f);
            }
            yield return(null);
        }
        animator.speed = 1.0f;
        Destroy(breathParticle);
        yield return(new WaitForStateChange(this, 4));

        StopAction();
    }
Exemplo n.º 5
0
        private DamageGenerator GetDamageGenerator(BattleSideType battleSideTime, Unit unit)
        {
            DamageGenerator result;

            if (battleSideTime == BattleSideType.Player)
            {
                if (m_attackerChances.TryGetValue(unit.Id, out result))
                {
                    return(result);
                }
            }
            else
            {
                if (m_defenderChances.TryGetValue(unit.Id, out result))
                {
                    return(result);
                }
            }

            if (result == null)
            {
                result = new DamageGenerator(unit,
                                             battleSideTime == BattleSideType.Player
                                                                ? m_targetAttackerChance
                                                                : m_targetDefenderChance);

                if (battleSideTime == BattleSideType.Player)
                {
                    m_attackerChances[unit.Id] = result;
                }
                else
                {
                    m_defenderChances[unit.Id] = result;
                }
            }

            return(result);
        }
Exemplo n.º 6
0
 protected override IEnumerator BehaviourCoroutine()
 {
     unitInfo.ChangeState(UnitInfo.UnitState.action);
     animator.CrossFade(GetActionName(), 0.45f);
     unitInfo.GetMovement().Stop();
     unitInfo.GetMovement().StopRotating();
     if (ik == null)
     {
         ik = unitInfo.GetComponent <GenericIK>();
     }
     ik.ToggleIK(false);
     while (behaviourState < 2)
     {
         if (eventToggle)
         {
             DamageInfo[] dinfos = DamageGenerator.ApplyBoxDamage(unitInfo, unitInfo.transform.position + unitInfo.transform.rotation * hitOffset, hitSize, unitInfo.transform.rotation, damage, false, LayerMask.GetMask("Unit"));
             foreach (DamageInfo dinfo in dinfos)
             {
                 dinfo.hitUnit.GetAction().StopAction();
                 Vector3 f     = unitInfo.transform.position - dinfo.hitPoint;
                 Vector3 euler = Quaternion.LookRotation(f).eulerAngles;
                 euler.x = 0;
                 euler.z = 0;
                 dinfo.hitUnit.transform.eulerAngles = euler;
                 dinfo.hitUnit.GetComponent <Rigidbody>().velocity = Vector3.up * 1 + (dinfo.hitUnit.transform.position - unitInfo.transform.position).normalized * knockBackDistance;
                 dinfo.hitUnit.GetAction().StopAction();
                 dinfo.hitUnit.AddCrowdControl(ConditionData.UnitCondition.knockBack, 1,
                                               delegate() { dinfo.hitUnit.GetComponent <ActionComponent>().UseSkill("WakeUp", true); });
             }
             eventToggle = false;
         }
         yield return(null);
     }
     //yield return new WaitForStateChange(this, 3);
     unitInfo.ChangeState(UnitInfo.UnitState.idle);
     StopAction();
 }
Exemplo n.º 7
0
    protected override IEnumerator BehaviourCoroutine()
    {
        unitInfo.ChangeState(UnitInfo.UnitState.action);
        animator.CrossFade(GetActionName(), 0);
        unitInfo.GetMovement().Stop();
        unitInfo.GetMovement().StopRotating();
        float     deltaZ        = 0;
        float     deltaY        = 0;
        Transform unitTransform = unitInfo.transform;
        Vector3   startPosition = unitTransform.position;
        Vector3   newPosition   = unitTransform.position;
        Rigidbody rigid         = unitInfo.GetMovement().GetRigidBody();
        GenericIK ik            = unitTransform.GetComponent <GenericIK>();

        ik.ToggleIK(false);
        Vector3 forward  = unitTransform.forward;
        float   distance = dashDistance - offsetZ;

        if (targetObject != null)
        {
            forward  = (targetObject.position - unitTransform.position).normalized;
            distance = Vector3.Distance(targetObject.position, unitTransform.position) - offsetZ;
        }
        bool rotated = false;

        while (behaviourState < 2)
        {
            deltaZ = animator.GetFloat("posZ");
            deltaY = animator.GetFloat("posY");
            if (deltaY >= 0.9f)
            {
                rotated = false;
            }
            if (deltaZ > 0.1f && !rotated)
            {
                rotated   = true;
                forward.y = 0;
                unitInfo.GetMovement().RotateTo(forward, 5);
                unitInfo.GetMovement().GetRigidBody().useGravity = false;
                //unitInfo.GetMovement().enabled = false;
            }
            newPosition    = startPosition + forward * deltaZ * distance + unitTransform.up * deltaY * dashHeight;
            rigid.position = (newPosition);

            yield return(null);
        }
        GameObject cameraObject = ControlManager.Instance.mainCameraObject;

        if (Vector3.Distance(cameraObject.transform.position, unitTransform.position) <= impactRadius * 2)
        {
            cameraObject.GetComponent <CameraShaker>().ShakeCamera(1, 0.3f);
        }
        DamageInfo[] dInfos = DamageGenerator.ApplyRadialDamage(unitInfo, unitTransform.position, impactRadius, 1, false, LayerMask.GetMask("Unit"));
        foreach (DamageInfo dinfo in dInfos)
        {
            Vector3 f     = unitInfo.transform.position - dinfo.hitPoint;
            Vector3 euler = Quaternion.LookRotation(f).eulerAngles;
            euler.x = 0;
            euler.z = 0;
            dinfo.hitUnit.transform.eulerAngles = euler;
            dinfo.hitUnit.GetComponent <Rigidbody>().velocity = Vector3.up * 1 + (dinfo.hitUnit.transform.position - unitTransform.position).normalized * knockBackDistance;
            dinfo.hitUnit.GetAction().StopAction();
            dinfo.hitUnit.AddCrowdControl(ConditionData.UnitCondition.knockBack, 1,
                                          delegate() { dinfo.hitUnit.GetComponent <ActionComponent>().UseSkill("WakeUp", true); });
        }
        EffectGenerator effect = unitInfo.GetComponent <EffectGenerator>();

        effect.GenerateEffect("DashDust");
        yield return(new WaitForStateChange(this, 3));

        Reset();
        StopAction();
    }
Exemplo n.º 8
0
    protected override IEnumerator BehaviourCoroutine()
    {
        // type 0
        CharacterMovement movement = unitInfo.GetComponent <CharacterMovement>();

        unitInfo.ChangeState(UnitInfo.UnitState.action);
        int comboLength = hData.Length;// 기본 3타 현재 1타

        SetStopActionEvent(delegate()
        {
            unitInfo.ChangeState(UnitInfo.UnitState.idle);
            unitInfo.GetMovement().Stop();
        });

        for (int i = 0; i < comboLength; i++)
        {
            animator.CrossFade("SwingWeapon_" + (i), 0.1f);
            bool    combo = false;
            Vector3 axis  = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            if (Input.GetAxis("Horizontal") == 0 && Input.GetAxis("Vertical") == 0)
            {
                axis = Vector3.forward;
                SetRotation(movement, Vector3.forward);
            }
            else
            {
                SetRotation(movement, axis);
            }
            movement.Stop();
            axis   = Camera.main.transform.TransformVector(axis);
            axis.y = 0;
            axis.Normalize();
            movement.Move(axis, 2, 2, 2);
            //ResetBehaviourEvent();//타격판정꺼줌
            while (behaviourMessage != "swing_comboCheckEnd")
            {
                yield return(new WaitForFixedUpdate());

                if (!combo && Input.GetKeyDown(KeyCode.Mouse0))
                {
                    combo = true;
                }
                if (behaviourMessage == "swing_hitEvent")
                {
                    eventToggle = false;
                    DamageInfo[] infos = DamageGenerator.ApplyBoxDamage(unitInfo, unitInfo.transform.TransformPoint(hData[i].center), hData[i].halfExtents, Quaternion.Euler(hData[i].orientation), damage, false, LayerMask.GetMask("Unit", "Ignore Ground"));
                    if (infos.Length > 0)
                    {
                        foreach (DamageInfo info in infos)
                        {
                            if (hitEffect)
                            {
                                GameObject effect = Instantiate <GameObject>(hitEffect, info.hitPoint, unitInfo.transform.rotation);
                                //effect.transform.position = info.hitPoint;
                                Destroy(effect, 3.0f);
                            }
                            //Debug.DrawLine(info.hitPoint, info.hitPoint + Vector3.up * 3f,Color.blue,5);
                        }

                        GameObject cameraObject = ControlManager.Instance.mainCameraObject;
                        float      sF           = stopFrame;
                        if (Vector3.Distance(cameraObject.transform.position, unitInfo.transform.position) <= 3)
                        {
                            if (i == comboLength - 1)
                            {
                                sF *= 2;
                                cameraObject.GetComponent <CameraShaker>().ShakeCamera(0.2f, 0.3f, 0.03f);
                            }
                            else
                            {
                                //cameraObject.GetComponent<CameraShaker>().ShakeCamera(0.1f, 0.1f, 0.03f);
                            }
                            HitEffector.Instance.StopFrameEffect(sF);
                        }
                    }
                }
                //yield return null;
            }
            if (!combo)
            {
                break;
            }
            else if (i < comboLength - 1)
            {
                behaviourMessage = "none";
            }
        }
        yield return(new WaitForMessageReceiving(this, "swing_Ended"));

        StopAction();
    }
Exemplo n.º 9
0
        private static void CreateDamages(IDictionary<string, JToken> damages)
        {
            var generator = new DamageGenerator();

            foreach (var hero in GameObjects.Heroes)
            {
                JToken championToken;
                if (damages.TryGetValue(hero.ChampionName, out championToken))
                {
                    if (generator.IsClassTaken(hero.ChampionName))
                    {
                        continue;
                    }

                    var @class = generator.AddClass(hero.ChampionName);
                    var championTokenCollection = (IDictionary<string, JToken>)championToken;

                    JToken varToken;
                    if (championTokenCollection.TryGetValue("Vars", out varToken))
                    {
                        var varTokenCollection = (IDictionary<string, JToken>)varToken;
                        foreach (var item in varTokenCollection)
                        {
                            switch (item.Value.Type)
                            {
                                case JTokenType.Array:
                                    var itemArray = (JArray)item.Value;
                                    if (itemArray.Count > 0)
                                    {
                                        if (Regex.IsMatch((string)(itemArray[0]), @"[0-9]*\.[0-9]*"))
                                        {
                                            if (((string)(itemArray[0])).Length <= 9)
                                            {
                                                // float
                                                @class.AddField(
                                                    item.Key,
                                                    itemArray.Select(colItem => (float)colItem).ToArray());
                                            }
                                            else
                                            {
                                                // double
                                                @class.AddField(
                                                    item.Key,
                                                    itemArray.Select(colItem => (double)colItem).ToArray());
                                            }
                                        }
                                        else if (Regex.IsMatch((string)(itemArray[0]), @"^[0-9]*$"))
                                        {
                                            // integer
                                            @class.AddField(
                                                item.Key,
                                                itemArray.Select(colItem => (int)colItem).ToArray());
                                        }
                                    }
                                    break;
                                case JTokenType.Float:
                                    @class.AddField(item.Key, (float)item.Value);
                                    break;
                                case JTokenType.Integer:
                                    @class.AddField(item.Key, (int)item.Value);
                                    break;
                                case JTokenType.String:
                                    @class.AddField(item.Key, (string)item.Value);
                                    break;
                            }
                        }
                    }

                    JToken passiveToken;
                    if (championTokenCollection.TryGetValue("Passives", out passiveToken))
                    {
                        var passiveTokenCollection = (IDictionary<string, JToken>)passiveToken;
                        foreach (var passiveInfo in passiveTokenCollection)
                        {
                            var syslink = generator.AddPassiveLink(hero.ChampionName, passiveInfo.Key);
                            var inlineFunction = "return 0d;";

                            if (passiveInfo.Value.Type == JTokenType.Array && ((JArray)passiveInfo.Value).HasValues)
                            {
                                inlineFunction = ((JArray)passiveInfo.Value).Aggregate(
                                    string.Empty,
                                    (current, item) => current + item);
                            }
                            else
                            {
                                Logging.Write()(
                                    LogLevel.Fatal,
                                    $"Invalid configuration {hero.ChampionName}->PASSIVE->{passiveInfo.Key}.");
                            }

                            @class.AddFunction(
                                $"public static double {syslink.Function}(Obj_AI_Base source)",
                                inlineFunction);
                        }
                    }

                    foreach (var entry in championTokenCollection)
                    {
                        SpellSlot spellSlot;
                        if (Enum.TryParse(entry.Key, out spellSlot))
                        {
                            var spellToken = (IDictionary<string, JToken>)entry.Value;
                            int stages;
                            if (spellToken.ContainsKey("Stages")
                                && int.TryParse(spellToken["Stages"].ToString(), out stages))
                            {
                                for (var i = 0; i < stages; ++i)
                                {
                                    JToken stageToken;
                                    if (spellToken.TryGetValue("Stage" + i, out stageToken))
                                    {
                                        var syslink = generator.AddLink(hero.ChampionName, spellSlot, i);
                                        var inlineFunction = "return 0d;";

                                        if (stageToken.Type == JTokenType.Array && ((JArray)stageToken).HasValues)
                                        {
                                            inlineFunction = ((JArray)stageToken).Aggregate(
                                                string.Empty,
                                                (current, item) => current + (string)item);
                                        }
                                        else
                                        {
                                            Logging.Write()(
                                                LogLevel.Fatal,
                                                $"Invalid configuration {hero.ChampionName}->{spellSlot}->{i}.");
                                        }

                                        @class.AddFunction(
                                            $"public static double {syslink.Function}(Obj_AI_Base source, Obj_AI_Base target)",
                                            inlineFunction);
                                    }
                                    else
                                    {
                                        Logging.Write()(
                                            LogLevel.Fatal,
                                            $"Missing configuration {hero.ChampionName}->{spellSlot}->{i}.");
                                    }
                                }
                            }
                            else
                            {
                                Logging.Write()(
                                    LogLevel.Fatal,
                                    $"Invalid configuration {hero.ChampionName}->{spellSlot} at 'Stages'.");
                            }
                        }
                    }
                }
                else
                {
                    Logging.Write()(LogLevel.Fatal, "No entry for champion {0} in damage file.", hero.ChampionName);
                }
            }

            var assembly = generator.Compile();
            if (assembly != null)
            {
                var links = generator.GetLinks(assembly);

                foreach (var link in links)
                {
                    DamageInfo damageInfo;
                    if (!DamagesDictionary.TryGetValue(link.Key, out damageInfo))
                    {
                        damageInfo = new DamageInfo(link.Key);
                        DamagesDictionary.Add(link.Key, damageInfo);
                    }

                    foreach (var spellSlot in link.Value)
                    {
                        foreach (var stage in spellSlot.Value)
                        {
                            damageInfo.AddSpell(spellSlot.Key, stage.Key, stage.Value);
                        }
                    }
                }

                var passiveLinks = generator.GetPassiveLinks(assembly);
                foreach (var link in passiveLinks)
                {
                    PassiveInfo passiveInfo;
                    if (!PassiveDictionary.TryGetValue(link.Key, out passiveInfo))
                    {
                        passiveInfo = new PassiveInfo(link.Key);
                        PassiveDictionary.Add(link.Key, passiveInfo);
                    }

                    foreach (var passive in link.Value)
                    {
                        passiveInfo.AddPassive(passive.Key, passive.Value);
                    }
                }
            }
            else
            {
                Logging.Write()(LogLevel.Fatal, "Unable to compile damage class.");
            }
        }