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; } }
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); }
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)); } }