protected override void TickCore(Entity host, RealmTime time, ref object state)
 {
     Pet pet;
     if (!isValidPet(host, out pet)) return;
     if (Pet == null) Pet = pet;
     TickCore(pet, time, ref state);
 }
 private bool isValidPet(Entity host, out Pet p)
 {
     p = null;
     if (!(host is Pet)) return false;
     var pet = (Pet)host;
     if (PlayerOwnerRequired && pet.PlayerOwner == null) return false;
     p = pet;
     return true;
 }
 private int GetElectricCooldown(Pet host, PetLevel type)
 {
     if (Enumerable.Range(0, 30).Contains(type.Level))
         return (int)(2.5 - type.Level * 0.01666666666666666666666666666667) * 1000;
     else if (Enumerable.Range(30, 20).Contains(type.Level))
         return (int)(2.0 - (type.Level - 30) * 0.025) * 1000;
     else if (Enumerable.Range(50, 20).Contains(type.Level))
         return (int)(1.5 - (type.Level - 50) * 0.025) * 1000;
     else if (Enumerable.Range(70, 20).Contains(type.Level))
         return (int)(1.5 - (type.Level - 70) * 0.025) * 1000;
     else if (Enumerable.Range(90, 11).Contains(type.Level))
         return (int)(0.5 - (type.Level - 90) * 0.04) * 1000;
     throw new Exception("PetLevel not supported");
 }
 private int getCooldown(Pet host, PetLevel type)
 {
     if (type.Level <= 30)
     {
         double cool = 2500;
         for (int i = 0; i < type.Level; i++)
             cool -= 16.6666666666666;
         return (int)cool;
     }
     else if (type.Level > 89)
     {
         double cool = 500;
         for (int i = 0; i < type.Level - 90; i++)
             cool -= 40;
         return (int)cool;
     }
     else
     {
         double cool = 2000;
         for (int i = 0; i < type.Level - 30; i++)
             cool -= 25;
         return (int)cool;
     }
 }
        public static async void Create(RealmManager manager, Player player, Item egg)
        {
            await manager.Database.DoActionAsync(db =>
            {
                PetStruct petStruct = GetPetStruct(manager, egg.Family, (Rarity)egg.Rarity);
                PetSkin skin = manager.GameData.IdToPetSkin[petStruct.DefaultSkin];

                PetItem item = new PetItem
                {
                    InstanceId = db.GetNextPetId(player.AccountId),
                    Rarity = (int)egg.Rarity,
                    Family = egg.Family.ToString(),
                    SkinName = skin.DisplayId,
                    Skin = skin.ObjectType,
                    Type = petStruct.ObjectType,
                    Abilities = GetPetAbilites(egg, petStruct),
                };

                switch (item.Rarity)
                {
                    case 1:
                        item.MaxAbilityPower = 50;
                        item.Abilities[0].Power = 30;
                        item.Abilities[0].Points = 2080;
                        item.Abilities[1].Power = 11;
                        item.Abilities[1].Points = 290;
                        item.Abilities[2].Power = 0;
                        item.Abilities[2].Points = 0;
                        break;

                    case 2:
                        item.MaxAbilityPower = 70;
                        item.Abilities[0].Power = 50;
                        item.Abilities[0].Points = 10607;
                        item.Abilities[1].Power = 30;
                        item.Abilities[1].Points = 2080;
                        item.Abilities[2].Power = 0;
                        item.Abilities[2].Points = 0;
                        break;

                    case 3:
                        item.MaxAbilityPower = 90;
                        item.Abilities[0].Power = 70;
                        item.Abilities[0].Points = 50355;
                        item.Abilities[1].Power = 50;
                        item.Abilities[1].Points = 10607;
                        item.Abilities[2].Power = 30;
                        item.Abilities[2].Points = 2080;
                        break;

                    case 4:
                        item.MaxAbilityPower = 100;
                        item.Abilities[0].Power = 90;
                        item.Abilities[0].Points = 235610;
                        item.Abilities[1].Power = 70;
                        item.Abilities[1].Points = 50354;
                        item.Abilities[2].Power = 50;
                        item.Abilities[2].Points = 10607;
                        break;

                    default:
                        item.MaxAbilityPower = 30;
                        item.Abilities[0].Power = 1;
                        item.Abilities[0].Points = 0;
                        item.Abilities[1].Power = 0;
                        item.Abilities[1].Points = 0;
                        item.Abilities[2].Power = 0;
                        item.Abilities[2].Points = 0;
                        break;
                }

                Pet pet = new Pet(manager, item, null);
                int x;
                int y;
                Random rand = new Random((int)DateTime.Now.Ticks);
                do
                {
                    x = rand.Next(0, player.Owner.Map.Width);
                    y = rand.Next(0, player.Owner.Map.Height);
                } while (player.Owner.Map[x, y].Region != TileRegion.Spawn);
                pet.Move(x + 0.5f, y + 0.5f);
                db.CreatePet(player.Client.Account, item);
                player.Owner.EnterWorld(pet);
                player.Client.SendPacket(new HatchEggPacket
                {
                    PetName = skin.DisplayId,
                    PetSkinId = skin.ObjectType
                });
                player.Client.SendPacket(new UpdatePacket
                {
                    Tiles = new UpdatePacket.TileData[0],
                    NewObjects = new ObjectDef[1] { pet.ToDefinition() },
                    RemovedObjectIds = new int[0]
                });
            });
        }
        private int GetMP(Pet host, ref int cooldown)
        {
            for (int i = 0; i < 3; i++)
            {
                switch (i)
                {
                    case 0:
                        if (host.FirstPetLevel.Ability == Ability.MagicHeal)
                        {
                            return CalculateMagicHeal(host.FirstPetLevel.Level, ref cooldown);
                        }
                        break;

                    case 1:
                        if (host.SecondPetLevel.Ability == Ability.MagicHeal)
                        {
                            return CalculateMagicHeal(host.SecondPetLevel.Level, ref cooldown);
                        }
                        break;

                    case 2:
                        if (host.ThirdPetLevel.Ability == Ability.MagicHeal)
                        {
                            return CalculateMagicHeal(host.ThirdPetLevel.Level, ref cooldown);
                        }
                        break;

                    default:
                        break;
                }
            }
            return -1;
        }
 protected abstract void TickCore(Pet pet, RealmTime time, ref object state);
 protected override void OnStateEntry(Entity host, RealmTime time, ref object state)
 {
     Pet pet;
     if (!isValidPet(host, out pet)) return;
     if (Pet == null) Pet = pet;
 }
 //a * (1 - Math.pow(r, level)) / (1 - r)
 //points to get to level
 //with a = 20 , r = 1.08
 //
 //first 100%
 //second ~ 70%
 //third ~ 30%
 public PetLevel(AbilityType ability, Ability abilityType, int power, int level, Pet pet)
 {
     this.pet = pet;
     type = ability;
     Ability = abilityType;
     Level = level;
     Power = power;
 }
        private void LoadPetYardData(Player player)
        {
            Manager.Database.DoActionAsync(db =>
            {
                MySqlCommand cmd = db.CreateQuery();
                cmd.CommandText = "SELECT petId, objType FROM pets WHERE accId=@accId AND NOT petId=@petId;";
                cmd.Parameters.AddWithValue("@accId", player.AccountId);
                cmd.Parameters.AddWithValue("@petId", player.Pet is Pet ? player.Pet.PetId : -1);

                List<PetItem> petData = new List<PetItem>();

                using (MySqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        int petId = rdr.GetInt32("petId");
                        if (player.Pet != null && player.Pet.PetId == petId) continue;
                        petData.Add(db.GetPet(petId, player.Client.Account));
                    }
                }

                foreach (PetItem i in petData)
                {
                    Pet obj = new Pet(player.Manager, i, null);
                    int x, y;
                    do
                    {
                        x = player.Random.Next(0, this.Map.Width);
                        y = player.Random.Next(0, this.Map.Height);
                    } while (this.Map[x, y].Region != TileRegion.PetRegion || this.Map[x, y].ObjType != 0);
                    obj.Move(x + 0.5f, y + 0.5f);
                    EnterWorld(obj);
                }
            });
        }
        protected override void TickCore(Pet pet, RealmTime time, ref object state)
        {
            var cool = (int)state;
            if (cool <= 0)
            {
                Player player = pet.GetEntity(pet.PlayerOwner.Id) as Player;
                if (player == null) return;

                int maxHp = player.Stats[0] + player.Boost[0];
                int h = GetHP(pet, ref cool);
                if (h == -1) return;
                int newHp = Math.Min(maxHp, player.HP + h);
                if (newHp != player.HP)
                {
                    if (player.HasConditionEffect(ConditionEffectIndex.Sick))
                    {
                        player.Owner.BroadcastPacket(new ShowEffectPacket
                        {
                            EffectType = EffectType.Trail,
                            TargetId = pet.Id,
                            PosA = new Position { X = player.X, Y = player.Y },
                            Color = new ARGB(0xffffffff)
                        }, null);
                        player.Owner.BroadcastPacket(new NotificationPacket
                        {
                            ObjectId = player.Id,
                            Text = "{\"key\":\"blank\",\"tokens\":{\"data\":\"No Effect\"}}",
                            Color = new ARGB(0xFF0000)
                        }, null);
                        state = cool;
                        return;
                    }
                    int n = newHp - player.HP;
                    player.HP = newHp;
                    player.UpdateCount++;
                    player.Owner.BroadcastPacket(new ShowEffectPacket
                    {
                        EffectType = EffectType.Potion,
                        TargetId = player.Id,
                        Color = new ARGB(0xffffffff)
                    }, null);
                    player.Owner.BroadcastPacket(new ShowEffectPacket
                    {
                        EffectType = EffectType.Trail,
                        TargetId = pet.Id,
                        PosA = new Position { X = player.X, Y = player.Y },
                        Color = new ARGB(0xffffffff)
                    }, null);
                    player.Owner.BroadcastPacket(new NotificationPacket
                    {
                        ObjectId = player.Id,
                        Text = "{\"key\":\"blank\",\"tokens\":{\"data\":\"+" + n + "\"}}",
                        Color = new ARGB(0xff00ff00)
                    }, null);
                }
            }
            else
                cool -= time.thisTickTimes;

            state = cool;
        }
 private double getDist(Pet host, PetLevel type)
 {
     return 2;
 }
Example #13
0
File: Pet.cs Project: maximan20/CJ
        public static async void Create(RealmManager manager, Player player, Item egg)
        {
            await manager.Database.DoActionAsync(db =>
            {
                PetStruct petStruct = GetPetStruct(manager, egg.Family, (Rarity)egg.Rarity);
                PetSkin skin        = manager.GameData.IdToPetSkin[petStruct.DefaultSkin];

                PetItem item = new PetItem
                {
                    InstanceId = db.GetNextPetId(player.AccountId),
                    Rarity     = (int)egg.Rarity,
                    SkinName   = skin.DisplayId,
                    Skin       = skin.ObjectType,
                    Type       = petStruct.ObjectType,
                    Abilities  = GetPetAbilites(egg, petStruct),
                };

                switch (item.Rarity)
                {
                case 1:
                    item.MaxAbilityPower     = 50;
                    item.Abilities[0].Power  = 30;
                    item.Abilities[0].Points = 2080;
                    item.Abilities[1].Power  = 11;
                    item.Abilities[1].Points = 290;
                    item.Abilities[2].Power  = 1;
                    item.Abilities[2].Points = 0;
                    break;

                case 2:
                    item.MaxAbilityPower     = 70;
                    item.Abilities[0].Power  = 50;
                    item.Abilities[0].Points = 10607;
                    item.Abilities[1].Power  = 30;
                    item.Abilities[1].Points = 2080;
                    item.Abilities[2].Power  = 1;
                    item.Abilities[2].Points = 0;
                    break;

                case 3:
                    item.MaxAbilityPower     = 90;
                    item.Abilities[0].Power  = 70;
                    item.Abilities[0].Points = 50355;
                    item.Abilities[1].Power  = 50;
                    item.Abilities[1].Points = 10607;
                    item.Abilities[2].Power  = 30;
                    item.Abilities[2].Points = 2080;
                    break;

                case 4:
                    item.MaxAbilityPower     = 100;
                    item.Abilities[0].Power  = 90;
                    item.Abilities[0].Points = 235610;
                    item.Abilities[1].Power  = 70;
                    item.Abilities[1].Points = 50354;
                    item.Abilities[2].Power  = 50;
                    item.Abilities[2].Points = 10607;
                    break;

                default:
                    item.MaxAbilityPower     = 30;
                    item.Abilities[0].Power  = 1;
                    item.Abilities[0].Points = 0;
                    item.Abilities[1].Power  = 1;
                    item.Abilities[1].Points = 0;
                    item.Abilities[2].Power  = 1;
                    item.Abilities[2].Points = 0;
                    break;
                }

                Pet pet = new Pet(manager, item, null);
                int x;
                int y;
                Random rand = new Random((int)DateTime.Now.Ticks);
                do
                {
                    x = rand.Next(0, player.Owner.Map.Width);
                    y = rand.Next(0, player.Owner.Map.Height);
                } while (player.Owner.Map[x, y].Region != TileRegion.Spawn);
                pet.Move(x + 0.5f, y + 0.5f);
                db.CreatePet(player.Client.Account, item);
                player.Owner.EnterWorld(pet);
                player.Client.SendPacket(new HatchEggPacket
                {
                    PetName   = skin.DisplayId,
                    PetSkinId = skin.ObjectType
                });
                player.Client.SendPacket(new UpdatePacket
                {
                    Tiles      = new UpdatePacket.TileData[0],
                    NewObjects = new ObjectDef[1] {
                        pet.ToDefinition()
                    },
                    RemovedObjectIds = new int[0]
                });
            });
        }
 private int GetElectricDamage(Pet host, PetLevel type)
 {
     if (Enumerable.Range(0, 30).Contains(type.Level))
         return (int)(5 + type.Level * 0.5);
     else if (Enumerable.Range(30, 20).Contains(type.Level))
         return (int)(20 + (type.Level - 30) * 1.7);
     else if (Enumerable.Range(50, 20).Contains(type.Level))
         return (int)(54 + (type.Level - 50) * 3.15);
     else if (Enumerable.Range(70, 20).Contains(type.Level))
         return (int)(117 + (type.Level - 70) * 5.35);
     else if (Enumerable.Range(90, 11).Contains(type.Level))
         return (int)(224 + (type.Level - 90) * 7.6);
     throw new Exception("PetLevel not supported");
 }
 private double GetElectricDistance(Pet host, PetLevel type)
 {
     if (Enumerable.Range(0, 30).Contains(type.Level))
         return Math.Round(0.1 + type.Level * 0.01333333333333333333333333333333, 2);
     if (Enumerable.Range(30, 20).Contains(type.Level))
         return Math.Round(0.5 + (type.Level - 30) * 0.025, 2);
     if (Enumerable.Range(50, 20).Contains(type.Level))
         return Math.Round(1.0 + (type.Level - 50) * 0.025, 2);
     if (Enumerable.Range(70, 20).Contains(type.Level))
         return Math.Round(1.5 + (type.Level - 70) * 0.025, 2);
     if (Enumerable.Range(90, 11).Contains(type.Level))
         return Math.Round(2.0 + (type.Level - 90) * 0.025, 2);
     throw new Exception("PetLevel not supported");
 }