示例#1
0
        public override void DoEffect(Monster p_monster, Character p_target, SpellEventArgs p_spellArgs)
        {
            Grid     grid     = LegacyLogic.Instance.MapLoader.Grid;
            Position position = p_monster.Position;
            GridSlot slot     = grid.GetSlot(position);
            Int32    num;

            if (LegacyLogic.Instance.WorldManager.Party.InCombat)
            {
                num = Random.Range(0, 4);
            }
            else
            {
                List <GridSlot> list = new List <GridSlot>();
                for (Int32 i = 0; i < 4; i++)
                {
                    GridSlot slot2 = grid.GetSlot(position + (EDirection)i);
                    if (slot2 != null && p_monster.CanPassTerrain(slot2.TerrainType))
                    {
                        list.Add(slot2);
                    }
                }
                list.Sort((GridSlot a, GridSlot b) => Position.Distance(a.Position, LegacyLogic.Instance.WorldManager.Party.Position).CompareTo(Position.Distance(b.Position, LegacyLogic.Instance.WorldManager.Party.Position)));
                num = (Int32)EDirectionFunctions.GetDirection(position, list[0].Position);
            }
            EDirection p_dir = (EDirection)num;

            if (grid.AddMovingEntity(position + p_dir, p_monster))
            {
                slot.RemoveEntity(p_monster);
            }
            else
            {
                Int32 num2 = num - 1;
                while (num != num2)
                {
                    if (num2 < 0)
                    {
                        num2 = 3;
                    }
                    if (grid.AddMovingEntity(position + (EDirection)num2, p_monster))
                    {
                        slot.RemoveEntity(p_monster);
                        break;
                    }
                    num2--;
                }
            }
            if (position != p_monster.Position && LegacyLogic.Instance.WorldManager.Party.SelectedMonster == p_monster)
            {
                LegacyLogic.Instance.WorldManager.Party.SelectedMonster = null;
            }
        }
        public override void HandleAttacks(List <Attack> p_attackList, Monster p_monster, Character p_character, Boolean p_isMagic)
        {
            if (p_monster.DistanceToParty > 1f)
            {
                return;
            }
            Party    party     = LegacyLogic.Instance.WorldManager.Party;
            Grid     grid      = LegacyLogic.Instance.MapLoader.Grid;
            Position position  = party.Position;
            Position position2 = position + EDirectionFunctions.GetLineOfSightDirection(p_monster.Position, party.Position);
            GridSlot slot      = grid.GetSlot(position2);

            if (slot == null)
            {
                return;
            }
            party.IsPushed = true;
            if (!slot.HasEntities && grid.CanMoveEntity(party, p_monster.Direction))
            {
                GridSlot slot2 = grid.GetSlot(position);
                slot2.RemoveEntity(party);
                party.Position = position2;
                grid.GetSlot(position2).AddEntity(party);
                MoveEntityEventArgs p_eventArgs = new MoveEntityEventArgs(position, position2);
                LegacyLogic.Instance.EventManager.InvokeEvent(party, EEventType.MOVE_ENTITY, p_eventArgs);
                LegacyLogic.Instance.EventManager.InvokeEvent(this, EEventType.ENTITY_ABILITY_ADDED, new AbilityEventArgs(p_monster, this));
                AbilityTriggeredEventArgs p_args = new AbilityTriggeredEventArgs(p_monster, this);
                LegacyLogic.Instance.ActionLog.PushEntry(p_args);
            }
            else
            {
                party.IsPushed = false;
            }
        }
示例#3
0
        protected void Drag(Monster p_monster, SpellEventArgs p_result)
        {
            if (p_monster.CurrentHealth <= 0)
            {
                return;
            }
            if (p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.LARGE) || p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.BOSS) || p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.STATIC_OBJECT))
            {
                return;
            }
            Party      party     = LegacyLogic.Instance.WorldManager.Party;
            Grid       grid      = LegacyLogic.Instance.MapLoader.Grid;
            EDirection direction = EDirectionFunctions.GetDirection(p_monster.Position, party.Position);
            Int32      num       = (Int32)Position.Distance(p_monster.Position, party.Position) - 1;

            for (Int32 i = 0; i < num; i++)
            {
                if (!grid.CanMoveEntity(p_monster, direction))
                {
                    break;
                }
                Position p_pos = p_monster.Position + direction;
                GridSlot slot  = grid.GetSlot(p_monster.Position);
                if (grid.GetSlot(p_pos).AddEntity(p_monster))
                {
                    slot.RemoveEntity(p_monster);
                }
            }
            if (Position.Distance(p_monster.Position, party.Position) > 1f)
            {
                LegacyLogic.Instance.WorldManager.Party.SelectedMonster = null;
            }
        }
        private void MoveParty(GridSlot p_targetSlot)
        {
            Party    party = LegacyLogic.Instance.WorldManager.Party;
            GridSlot slot  = m_grid.GetSlot(party.Position);

            slot.RemoveEntity(party);
            p_targetSlot.AddEntity(party);
            if (!p_targetSlot.VisitedByParty)
            {
                p_targetSlot.VisitedByParty = true;
                LegacyLogic.Instance.EventManager.InvokeEvent(this, EEventType.UNCOVERED_TILES, EventArgs.Empty);
            }
            party.Position = p_targetSlot.Position;
            BaseObjectEventArgs p_eventArgs = new BaseObjectEventArgs(party, party.Position);

            LegacyLogic.Instance.EventManager.InvokeEvent(party, EEventType.TELEPORT_ENTITY, p_eventArgs);
        }
示例#5
0
        protected override void DoExecute()
        {
            Monster monster = LegacyLogic.Instance.WorldManager.FindObjectBySpawnerId <Monster>(m_targetSpawnID);

            if (monster == null)
            {
                LegacyLogger.Log("Tried to move something that is not a monster " + m_targetSpawnID);
            }
            else
            {
                Position position  = monster.Position;
                Position position2 = new Position(m_posX, m_posY);
                GridSlot slot      = Grid.GetSlot(monster.Position);
                if (Grid.GetSlot(position2).AddEntity(monster))
                {
                    slot.RemoveEntity(monster);
                }
                MoveEntityEventArgs p_eventArgs = new MoveEntityEventArgs(position, position2);
                LegacyLogic.Instance.EventManager.InvokeEvent(monster, EEventType.MOVE_ENTITY, p_eventArgs);
                FinishExecution();
            }
        }
        protected virtual void PushBack(Monster p_monster, SpellEventArgs p_result)
        {
            if (p_monster.CurrentHealth <= 0)
            {
                return;
            }
            if (p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.LARGE) || p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.BOSS) || p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.STATIC_OBJECT) || p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.SPIRIT_BOUND))
            {
                p_result.SpellTargets.Add(new PushedTarget(p_monster, p_monster.Position, false));
                if (p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.LARGE))
                {
                    MonsterAbilityBase        ability = p_monster.AbilityHandler.GetAbility(EMonsterAbilityType.LARGE);
                    AbilityTriggeredEventArgs p_args  = new AbilityTriggeredEventArgs(p_monster, ability);
                    p_monster.AbilityHandler.AddEntry(ability.ExecutionPhase, p_args);
                }
                else if (p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.BOSS))
                {
                    MonsterAbilityBase        ability2 = p_monster.AbilityHandler.GetAbility(EMonsterAbilityType.BOSS);
                    AbilityTriggeredEventArgs p_args2  = new AbilityTriggeredEventArgs(p_monster, ability2);
                    p_monster.AbilityHandler.AddEntry(ability2.ExecutionPhase, p_args2);
                }
                else if (p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.STATIC_OBJECT))
                {
                    MonsterAbilityBase        ability3 = p_monster.AbilityHandler.GetAbility(EMonsterAbilityType.STATIC_OBJECT);
                    AbilityTriggeredEventArgs p_args3  = new AbilityTriggeredEventArgs(p_monster, ability3);
                    p_monster.AbilityHandler.AddEntry(ability3.ExecutionPhase, p_args3);
                }
                else if (p_monster.AbilityHandler.HasAbility(EMonsterAbilityType.SPIRIT_BOUND))
                {
                    MonsterAbilityBase        ability4 = p_monster.AbilityHandler.GetAbility(EMonsterAbilityType.SPIRIT_BOUND);
                    AbilityTriggeredEventArgs p_args4  = new AbilityTriggeredEventArgs(p_monster, ability4);
                    p_monster.AbilityHandler.AddEntry(ability4.ExecutionPhase, p_args4);
                }
                return;
            }
            Position   position  = p_monster.Position;
            Party      party     = LegacyLogic.Instance.WorldManager.Party;
            Grid       grid      = LegacyLogic.Instance.MapLoader.Grid;
            EDirection direction = EDirectionFunctions.GetDirection(party.Position, p_monster.Position);

            for (Int32 i = 0; i < m_PushCount; i++)
            {
                if (!grid.CanMoveEntity(p_monster, direction))
                {
                    break;
                }
                Position p_pos = p_monster.Position + direction;
                GridSlot slot  = grid.GetSlot(p_monster.Position);
                if (grid.GetSlot(p_pos).AddEntity(p_monster))
                {
                    if (party.SelectedMonster == p_monster)
                    {
                        party.SelectedMonster = null;
                    }
                    slot.RemoveEntity(p_monster);
                }
            }
            if (position != p_monster.Position)
            {
                p_result.SpellTargets.Add(new PushedTarget(p_monster, p_monster.Position, true));
            }
        }