예제 #1
0
 protected override void OnDetachFrom(EntityLogic parentEntity, object userData)
예제 #2
0
        protected internal override void OnDetachFrom(EntityLogic parentEntity, object userData)
#endif
        {
            base.OnDetachFrom(parentEntity, userData);
        }
예제 #3
0
 protected override void OnAttachTo(EntityLogic parentEntity, Transform parentTransform, object userData)
예제 #4
0
        protected internal override void OnAttachTo(EntityLogic parentEntity, Transform parentTransform, object userData)
#endif
        {
            base.OnAttachTo(parentEntity, parentTransform, userData);
        }
예제 #5
0
파일: MsgAction.cs 프로젝트: Pircs/Yi
        private static void MapShow(Player player, ref MsgAction packet)
        {
            player.ForceSend(MapShowPacket(player), (ushort)sizeof(MsgAction));
            player.ForceSend(MsgStatus.Create(player.MapId, 0), (ushort)sizeof(MsgStatus));

            if (player.Inventory.Items == null)
            {
                player.Inventory = new Inventory(player);
            }
            else
            {
                player.Inventory.SetOwner(player);
            }
            if (player.Equipment.Items == null)
            {
                player.Equipment = new Equipment(player);
            }
            else
            {
                player.Equipment.SetOwner(player);
            }
            foreach (var kvp in player.Equipment)
            {
                player.Send(new MsgItemInformation(kvp.Value, kvp.Key));
            }

            foreach (var kvp in player.Inventory)
            {
                player.Send(new MsgItemInformation(kvp.Value, MsgItemPosition.Inventory));
            }

            foreach (var kvp in player.Profs)
            {
                player.Send(MsgProf.Create(kvp.Value));
            }

            foreach (var kvp in player.Skills)
            {
                player.Send(MsgSkill.Create(kvp.Value));
            }

            EntityLogic.Recalculate(player);

            if (player.Online)
            {
                return;
            }
            player.AddStatusEffect(StatusEffect.Frozen);
            player.CurrentNpcId = 1337;
            player.Send(LegacyPackets.NpcSay("Select Char."));
            player.Send(LegacyPackets.NpcLink("Next", 1));
            player.Send(LegacyPackets.NpcLink("Select", 10));
            player.Send(LegacyPackets.NpcLink("New", 100));
            player.Send(LegacyPackets.NpcFace(10));
            player.Send(LegacyPackets.NpcFinish());

            ScreenSystem.Create(player);
            ScreenSystem.Update(player);

            ScreenSystem.Send(player, Create(player, player.UniqueId, MsgActionType.SpawnEffect), true);
        }
예제 #6
0
        protected internal override void OnDetached(EntityLogic childEntity, object userData)
#endif
        {
            base.OnDetached(childEntity, userData);
        }
예제 #7
0
 /// <summary>
 /// 实体解除子实体。
 /// </summary>
 /// <param name="parentEntity">被解除的父实体。</param>
 /// <param name="userData">用户自定义数据。</param>
 protected override void OnDetachFrom(EntityLogic parentEntity, object userData)
 {
     base.OnDetachFrom(parentEntity, userData);
     BaseEntityAction?.OnDetachFrom?.Invoke(parentEntity, userData);
 }
예제 #8
0
 public RoutesController()
 {
     _context     = new ApplicationDbContext();
     _entityLogic = new EntityLogic <Route>();
 }
예제 #9
0
 /// <summary>
 /// 实体解除子实体。
 /// </summary>
 /// <param name="childEntity">解除的子实体。</param>
 /// <param name="userData">用户自定义数据。</param>
 protected override void OnDetached(EntityLogic childEntity, object userData)
 {
     base.OnDetached(childEntity, userData);
     BaseEntityAction?.OnDetached?.Invoke(childEntity, userData);
 }
예제 #10
0
 /// <summary>
 /// 实体附加子实体。
 /// </summary>
 /// <param name="parentEntity">被附加的父实体。</param>
 /// <param name="parentTransform">被附加父实体的位置。</param>
 /// <param name="userData">用户自定义数据。</param>
 protected override void OnAttachTo(EntityLogic parentEntity, Transform parentTransform, object userData)
 {
     base.OnAttachTo(parentEntity, parentTransform, userData);
     BaseEntityAction?.OnAttachTo?.Invoke(parentEntity, parentTransform, userData);
 }
예제 #11
0
    public override IEnumerator StartMyActivationCoroutine()
    {
        Ability move         = mySpellBook.GetAbilityByName("Move");
        Ability strike       = mySpellBook.GetAbilityByName("Strike");
        Ability goblinWarCry = mySpellBook.GetAbilityByName("Goblin War Cry");
        Ability invigorate   = mySpellBook.GetAbilityByName("Invigorate");

ActionStart:

        SetTargetDefender(EntityLogic.GetBestTarget(this, true));

        while (EventManager.Instance.gameOverEventStarted)
        {
            yield return(null);
        }

        if (EntityLogic.IsAbleToTakeActions(this) == false)
        {
            LivingEntityManager.Instance.EndEntityActivation(this);
        }

        // Goblin War Cry
        else if (EntityLogic.IsAbilityUseable(this, goblinWarCry))
        {
            Action action = AbilityLogic.Instance.PerformGoblinWarCry(this);
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Strike
        else if (EntityLogic.IsAbilityUseable(this, strike, myCurrentTarget) &&
                 EntityLogic.IsTargetInRange(this, myCurrentTarget, currentMeleeRange))
        {
            Action action = AbilityLogic.Instance.PerformStrike(this, myCurrentTarget);
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Invigorate
        else if (EntityLogic.IsTargetInRange(this, EntityLogic.GetBestInvigorateTarget(this), invigorate.abilityRange) &&
                 EntityLogic.IsAbilityUseable(this, invigorate, EntityLogic.GetBestInvigorateTarget(this)))
        {
            Action action = AbilityLogic.Instance.PerformInvigorate(this, EntityLogic.GetBestInvigorateTarget(this));
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Move
        else if (EntityLogic.IsTargetInRange(this, myCurrentTarget, currentMeleeRange) == false &&
                 EntityLogic.IsAbleToMove(this) &&
                 EntityLogic.IsAbilityUseable(this, move) &&
                 EntityLogic.GetBestValidMoveLocationBetweenMeAndTarget(this, myCurrentTarget, currentMeleeRange, EntityLogic.GetTotalMobility(this)) != null
                 )
        {
            Tile   destination    = EntityLogic.GetBestValidMoveLocationBetweenMeAndTarget(this, myCurrentTarget, currentMeleeRange, EntityLogic.GetTotalMobility(this));
            Action movementAction = AbilityLogic.Instance.PerformMove(this, destination);
            yield return(new WaitUntil(() => movementAction.ActionResolved() == true));

            // small delay here in order to seperate the two actions a bit.
            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Can't do anything more, end activation
        else
        {
            LivingEntityManager.Instance.EndEntityActivation(this);
        }
    }
예제 #12
0
파일: MsgDialog.cs 프로젝트: Pircs/Yi
        private static void Process(int npcIdoverride = 0)
        {
            if (Control == 255 && Player.Online)
            {
                Player.CurrentNpcId = 0;
            }

            if (Player.CurrentNpcId == 0)
            {
                return;
            }

            var id = Player.CurrentNpcId;

            if (npcIdoverride != 0)
            {
                id = npcIdoverride;
            }

            switch (id)
            {
            case 1337:
            {
                switch (Control)
                {
                case 255:
                    Player.CurrentNpcId = 1337;
                    using (var packet = new NpcDialog(10))
                    {
                        packet

                        .Text("Select Char")
                        .Link("Next", 1)
                        .Link("Select", 10)
                        .Link("New", 100)
                        .Finish();

                        Player.Send(packet);
                    }
                    break;

                case 1:
                    var players = SelectorSystem.GetPlayersFor(Player.AccountId).ToList();

                    var index = players.IndexOf(Player);
                    if (index + 1 > players.Count - 1)
                    {
                        index = 0;
                    }
                    else
                    {
                        index++;
                    }

                    Player = SelectorSystem.SwapCharacter(Player, players[index]);
                    Player.Send(LegacyPackets.CharacterInformation(Player));
                    Player.Send(MsgAction.MapShowPacket(Player));
                    Player.AddStatusEffect(StatusEffect.Frozen);
                    ScreenSystem.Create(Player);
                    ScreenSystem.Update(Player);
                    break;

                case 10:
                    Player.RemoveStatusEffect(StatusEffect.Frozen);
                    ScreenSystem.Create(Player);
                    Player.AddSpawnProtection();
                    Player.IncrementXp();

                    foreach (var kvp in Player.Skills)
                    {
                        Player.Send(MsgSkill.Create(kvp.Value));
                    }
                    foreach (var prof in Player.Profs)
                    {
                        Player.Send(MsgProf.Create(prof.Value));
                    }

                    EntityLogic.Recalculate(Player);
                    Player.CurrentHp = Player.MaximumHp;
                    Player.CurrentMp = Player.MaximumMp;
                    GameWorld.Maps[Player.MapId].Enter(Player);

                    Player.Send(MsgAction.Create(Player, (int)Player.PkMode, MsgActionType.ChangePkMode));
                    Player.Send(MsgUpdate.Create(Player, Player.Stamina, MsgUpdateType.Stamina));
                    Player.Send(MsgUpdate.Create(Player, Player.Class, MsgUpdateType.Class));
                    Player.Online = true;

                    if (Player.HasFlag(StatusEffect.SuperMan))
                    {
                        BuffSystem.Create(Player);
                        BuffSystem.AddBuff(Player, new Buff(Player, SkillId.Superman, TimeSpan.FromSeconds(10)));
                    }
                    if (Player.HasFlag(StatusEffect.Cyclone))
                    {
                        BuffSystem.Create(Player);
                        BuffSystem.AddBuff(Player, new Buff(Player, SkillId.Cyclone, TimeSpan.FromSeconds(10)));
                    }

                    if (Player.PkPoints > 1)
                    {
                        Player.PkPJob = new Job(TimeSpan.FromSeconds(15), () => Player.PkPoints--);
                        YiScheduler.Instance.Do(Player.PkPJob);
                    }
                    ScreenSystem.Send(Player, MsgAction.Create(Player, Player.UniqueId, MsgActionType.EntityRemove));
                    ScreenSystem.Send(Player, MsgSpawn.Create(Player));
                    break;

                case 100:
                    SelectorSystem.CreateNewCharacterFor(Player.AccountId);
                    Player.Disconnect();
                    break;
                }
                break;
            }

            default:
            {
                if (ScriptEngine.Scripts.TryGetValue(ScriptType.NpcDialog, out var sc) && !sc.Execute(Player, id, Control))
                {
                    Message.SendTo(Player, $"[{Player.CurrentNpcId}] Npc has no script.", MsgTextType.Talk);
                }
                break;
            }
            }
        }
예제 #13
0
    public override IEnumerator StartMyActivationCoroutine()
    {
        Ability twinStrike = mySpellBook.GetAbilityByName("Twin Strike");
        Ability move       = mySpellBook.GetAbilityByName("Move");
        Ability dash       = mySpellBook.GetAbilityByName("Dash");
        Ability shank      = mySpellBook.GetAbilityByName("Shank");

ActionStart:

        SetTargetDefender(EntityLogic.GetBestTarget(this, false, true));

        while (EventManager.Instance.gameOverEventStarted)
        {
            yield return(null);
        }

        if (EntityLogic.IsAbleToTakeActions(this) == false)
        {
            LivingEntityManager.Instance.EndEntityActivation(this);
        }

        // Shank best target
        else if (EntityLogic.IsTargetInRange(this, myCurrentTarget, currentMeleeRange) &&
                 EntityLogic.IsAbilityUseable(this, shank))
        {
            Action action = AbilityLogic.Instance.PerformShank(this, myCurrentTarget);
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Twin Strike best target
        else if (EntityLogic.IsTargetInRange(this, myCurrentTarget, currentMeleeRange) &&
                 EntityLogic.IsAbilityUseable(this, twinStrike, myCurrentTarget))
        {
            Action action = AbilityLogic.Instance.PerformTwinStrike(this, myCurrentTarget);
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Shank closest target
        else if (EntityLogic.IsTargetInRange(this, EntityLogic.GetBestTarget(this, true), currentMeleeRange) &&
                 EntityLogic.IsAbilityUseable(this, shank, EntityLogic.GetBestTarget(this, true)))
        {
            SetTargetDefender(EntityLogic.GetBestTarget(this, true));

            Action action = AbilityLogic.Instance.PerformShank(this, myCurrentTarget);
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Strike closest target
        else if (EntityLogic.IsTargetInRange(this, EntityLogic.GetBestTarget(this, true), currentMeleeRange) &&
                 EntityLogic.IsAbilityUseable(this, twinStrike, EntityLogic.GetBestTarget(this, true)))
        {
            SetTargetDefender(EntityLogic.GetBestTarget(this, true));

            Action action = AbilityLogic.Instance.PerformTwinStrike(this, myCurrentTarget);
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Dash
        else if (EntityLogic.IsTargetInRange(this, EntityLogic.GetBestTarget(this, false, true), currentMeleeRange) == false &&
                 EntityLogic.IsAbleToMove(this) &&
                 // dont dash if already in melee (this would trigger a free strike)
                 EntityLogic.GetAllEnemiesWithinRange(this, currentMeleeRange).Count == 0 &&
                 EntityLogic.IsAbilityUseable(this, dash) &&
                 EntityLogic.CanPerformAbilityTwoAfterAbilityOne(dash, twinStrike, this) &&
                 EntityLogic.GetBestValidMoveLocationBetweenMeAndTarget(this, EntityLogic.GetBestTarget(this, false, true), currentMeleeRange, dash.abilityPrimaryValue + EntityLogic.GetTotalMobility(this)) != null
                 )
        {
            SetTargetDefender(EntityLogic.GetBestTarget(this, false, true));

            Tile   destination    = EntityLogic.GetBestValidMoveLocationBetweenMeAndTarget(this, myCurrentTarget, currentMeleeRange, dash.abilityPrimaryValue + EntityLogic.GetTotalMobility(this));
            Action movementAction = AbilityLogic.Instance.PerformDash(this, destination);
            yield return(new WaitUntil(() => movementAction.ActionResolved() == true));

            // small delay here in order to seperate the two actions a bit.
            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Move
        else if (EntityLogic.IsTargetInRange(this, EntityLogic.GetBestTarget(this, false, true), currentMeleeRange) == false &&
                 EntityLogic.IsAbleToMove(this) &&
                 EntityLogic.IsAbilityUseable(this, move) &&
                 EntityLogic.GetBestValidMoveLocationBetweenMeAndTarget(this, myCurrentTarget, currentMeleeRange, EntityLogic.GetTotalMobility(this)) != null &&
                 EntityLogic.CanPerformAbilityTwoAfterAbilityOne(move, twinStrike, this)
                 )
        {
            SetTargetDefender(EntityLogic.GetBestTarget(this, false, true));

            Tile   destination    = EntityLogic.GetBestValidMoveLocationBetweenMeAndTarget(this, myCurrentTarget, currentMeleeRange, EntityLogic.GetTotalMobility(this));
            Action movementAction = AbilityLogic.Instance.PerformMove(this, destination);
            yield return(new WaitUntil(() => movementAction.ActionResolved() == true));

            // small delay here in order to seperate the two actions a bit.
            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // If, for whatever reason, we cant attack or move towards the weakest enemy, attack the nearest enemy

        // Shank closest target
        else if (EntityLogic.IsTargetInRange(this, EntityLogic.GetBestTarget(this, true), currentMeleeRange) &&
                 EntityLogic.IsAbilityUseable(this, shank, EntityLogic.GetBestTarget(this, true)))
        {
            SetTargetDefender(EntityLogic.GetBestTarget(this, true));

            Action action = AbilityLogic.Instance.PerformShank(this, myCurrentTarget);
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Twin Strike
        else if (EntityLogic.IsTargetInRange(this, EntityLogic.GetBestTarget(this, true), currentMeleeRange) &&
                 EntityLogic.IsAbilityUseable(this, twinStrike, EntityLogic.GetBestTarget(this, true)))
        {
            SetTargetDefender(EntityLogic.GetBestTarget(this, true));

            Action action = AbilityLogic.Instance.PerformTwinStrike(this, myCurrentTarget);
            yield return(new WaitUntil(() => action.ActionResolved() == true));

            yield return(new WaitForSeconds(1f));

            goto ActionStart;
        }

        // Can't do anything more, end activation
        else
        {
            LivingEntityManager.Instance.EndEntityActivation(this);
        }
    }
예제 #14
0
 protected override void OnAttached(EntityLogic childEntity, Transform parentTransform, object userData)
 {
     base.OnAttached(childEntity, parentTransform, userData);
 }
예제 #15
0
파일: MsgAction.cs 프로젝트: Pircs/Yi
 private static void EndTransform(Player player, ref MsgAction packet)
 {
     player.DelTransform();
     EntityLogic.Recalculate(player);
     player.Send(packet);
 }
예제 #16
0
 protected override void OnDetached(EntityLogic childEntity, object userData)
 {
     base.OnDetached(childEntity, userData);
 }
        protected override void OnAttachTo(EntityLogic parentEntity, Transform parentTransform, object userData)
        {
            base.OnAttachTo(parentEntity, parentTransform, userData);

            transform.localPosition = entityDataRadiusVisualiser.Position + new Vector3(0, radiusVisualizerHeight, 0);
        }