public WO_VoidZone(CreatureObject onwer, DB_Spell spell, DB_SpellEffect main) : base(onwer.Manager.GetNewGuid() | Constants.DRObject, onwer.Manager) { _main = main; _spell = spell; _onwer = onwer; _position = onwer.Position; _ticks = (int)main.AttackModifer; OnUpdate += WO_VoidZone_OnUpdate; OnDestroy += WO_VoidZone_OnDestroy; _targets = new List <CreatureObject>(); _addedTargets = new List <CreatureObject>(); _removedTargets = new List <CreatureObject>(); _update = _period = (int)(main.LevelModifer * 1000) / _ticks; _hasAura = spell.Effects.Values.Any(x => x.Type == SpellEffectType.AuraModifier); Spawn(); }
public static bool SelectAllSpells(out Dictionary <int, DB_Spell> data) { var locked = false; data = new Dictionary <int, DB_Spell>(); if (!IsConnected) { return(false); } try { using (MySqlCommand _cmd = _connection.CreateCommand()) { _cmd.CommandText = $"SELECT * FROM {tb_11};"; Monitor.Enter(_connection, ref locked); using (MySqlDataReader _result = _cmd.ExecuteReader()) { int id; byte index; DB_Spell spell; if (_result.HasRows) { while (_result.Read()) { id = _result.GetInt32(0); index = _result.GetByte(1); if (!data.TryGetValue(id, out spell)) { data[id] = spell = new DB_Spell(id); } spell.Effects.Add(index, new DB_SpellEffect(_result.GetByte(2), _result.GetByte(3), _result.GetFloat(4), _result.GetFloat(5), _result.GetFloat(6), _result.GetFloat(7), _result.GetFloat(8), _result.GetFloat(9))); } } } } return(true); } catch { return(false); } finally { if (locked) { Monitor.Exit(_connection); } } }
public static async Task <Dictionary <int, DB_Spell> > SelectAllSpellsAsync() { try { using (var connection = await GetConnectionAsync()) { using (var command = connection.CreateCommand()) { command.CommandText = $"SELECT * FROM {tb_11};"; using (var reader = await command.ExecuteReaderAsyncEx()) { var result = new Dictionary <int, DB_Spell>(); if (reader.HasRows) { while (await reader.ReadAsyncEx()) { var id = reader.GetInt32(0); var index = reader.GetByte(1); if (!result.TryGetValue(id, out var entry)) { result[id] = entry = new DB_Spell(id); } entry.Effects.Add(index, new DB_SpellEffect(reader.GetByte(2), reader.GetByte(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6), reader.GetFloat(7), reader.GetFloat(8), reader.GetFloat(9))); } } return(result); } } } } catch (Exception exp) { ServerLogger.LogException(exp); return(null); } }
public static bool Select(int id, out DB_Spell entry) { return(m_spells.TryGetValue(id, out entry)); }
public static void PerformSkill(CreatureObject creature, TargetEntry target) { DB_Spell spell = DataMgr.SelectSpell(target.SpellID); bool area = false, magick; DB_SpellEffect main = spell.Effects[0]; CreatureObject targetCO; creature.View.PerformSkill(target); if (creature.IsPlayer) { ((WO_Player)creature).Player.Skills.AddCooldown(spell.ID, main.Data03); } creature.Stats.DecreaseCurrent(Stats.Energy, main.Data01); if (target.HasGuid) { creature.Server.Objects.TryGetCreature((ushort)target.Guid, out targetCO); foreach (var item in spell.Effects.Values) { float effect = item.BaseConst + (item.LevelModifer * creature.Stats.Level) + (item.AttackModifer * creature.Stats.Attack); switch (item.Type) { case SpellEffectType.Damage: case SpellEffectType.MagickDamage: if (targetCO != creature) { targetCO.Stats.DoDamage(creature, effect, item.Type == SpellEffectType.MagickDamage); } break; case SpellEffectType.FrontAreaDamage: case SpellEffectType.MagicFrontAreaDamage: magick = item.Type == SpellEffectType.MagicFrontAreaDamage; Vector3 direction = MathHelper.GetDirection(creature); if ((item.Target & SpellTarget.Creature) != 0) { foreach (var entry in creature.Server.Objects.GetMobsInRadius(creature.Position + direction * item.Data01, item.Data02).ToArray()) { entry.Stats?.DoDamage(creature, effect, magick); } } break; case SpellEffectType.SplashDamage: case SpellEffectType.MagicSplashDamage: magick = item.Type == SpellEffectType.MagicSplashDamage; if ((item.Target & SpellTarget.NotMain) == 0 && targetCO != creature) { targetCO.Stats.DoDamage(creature, effect, magick); } if ((item.Target & SpellTarget.Creature) != 0) { foreach (var entry in creature.Server.Objects.GetMobsInRadiusExcept(creature, targetCO, item.Data02).ToArray()) { entry.Stats?.DoDamage(creature, effect, magick); } } break; case SpellEffectType.Heal: targetCO.Stats.DoHeal(creature, effect); break; case SpellEffectType.Modifier: targetCO.Stats.AddModifier((Stats)item.Data01, effect, item.Data03, item.Data02 == 1); break; case SpellEffectType.Teleport: creature.Movement.Teleport(targetCO.Position); break; case SpellEffectType.AreaInit: if (!area) { new WO_VoidZone(creature, spell, item); area = true; } break; } } } else { foreach (var item in spell.Effects.Values) { float effect = item.BaseConst + (item.LevelModifer * creature.Stats.Level) + (item.AttackModifer * creature.Stats.Attack); switch (item.Type) { case SpellEffectType.Teleport: creature.Movement.Teleport(target.Position); break; case SpellEffectType.AreaInit: if (!area) { new WO_VoidZone(creature, spell, item); area = true; } break; case SpellEffectType.FrontAreaDamage: case SpellEffectType.MagicFrontAreaDamage: magick = item.Type == SpellEffectType.MagicFrontAreaDamage; Vector3 direction = MathHelper.GetDirection(creature); if ((item.Target & SpellTarget.Creature) != 0) { foreach (var entry in creature.Server.Objects.GetMobsInRadius(creature.Position + direction * item.Data01, item.Data02).ToArray()) { entry.Stats?.DoDamage(creature, effect, magick); } } break; case SpellEffectType.SplashDamage: case SpellEffectType.MagicSplashDamage: magick = item.Type == SpellEffectType.MagicSplashDamage; if ((item.Target & SpellTarget.Creature) != 0) { foreach (var entry in creature.Server.Objects.GetMobsInRadius(creature, item.Data02).ToArray()) { entry.Stats?.DoDamage(creature, effect, magick); } } break; } } } }