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