Esempio n. 1
0
 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();
 }
Esempio n. 2
0
        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);
                      }
            }
        }
Esempio n. 3
0
 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);
     }
 }
Esempio n. 4
0
 public static bool Select(int id, out DB_Spell entry)
 {
     return(m_spells.TryGetValue(id, out entry));
 }
Esempio n. 5
0
        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;
                    }
                }
            }
        }