using Server.Gumps;
using Server.Items;
using Server.Misc;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Server.Mobiles
{
public class NewAnimalLoreGump : BaseGump
{
private readonly int _Label = 0xF424E5;
public BaseCreature Creature { get; private set; }
public NewAnimalLoreGump(PlayerMobile pm, BaseCreature bc)
: base(pm, 250, 50)
{
Creature = bc;
}
public override void AddGumpLayout()
{
AbilityProfile profile = PetTrainingHelper.GetAbilityProfile(Creature);
TrainingProfile trainProfile = PetTrainingHelper.GetTrainingProfile(Creature, true);
AddPage(0);
AddBackground(0, 24, 310, 325, 0x24A4);
AddHtml(47, 32, 210, 18, ColorAndCenter("#000080", Creature.Name), false, false);
AddButton(140, 0, 0x82D, 0x82D, 0, GumpButtonType.Reply, 0);
AddImage(40, 62, 0x82B);
AddImage(40, 258, 0x82B);
if (Creature.Controlled && Creature.ControlMaster == User)
{
AddImage(28, 272, 0x826);
TrainingDefinition def = PetTrainingHelper.GetTrainingDefinition(Creature);
if (trainProfile.HasBegunTraining && def != null && def.Class != Class.Untrainable)
{
AddImage(53, 290, 0x805);
AddHtmlLocalized(47, 270, 160, 18, 1157491, 0xC8, false, false); // Pet Training Progress:
double progress = trainProfile.TrainingProgressPercentile * 100;
if (progress >= 1)
{
AddBackground(53, 290, (int)(109.0 * (progress / 100)), 11, 0x806);
}
AddHtml(162, 285, 50, 18, FormatDouble(progress, false, true), false, false);
AddButton(215, 288, 0x15E1, 0x15E5, 1, GumpButtonType.Reply, 0);
AddTooltip(1157568); // View real-time training progress.
if (trainProfile.CanApplyOptions)
{
AddButton(53, 305, 0x837, 0x838, 2, GumpButtonType.Reply, 0);
AddHtmlLocalized(73, 300, 160, 18, 1157492, false, false); // Pet Training Options
}
AddButton(250, 280, 0x9AA, 0x9A9, 3, GumpButtonType.Reply, 0);
AddTooltip(1158013); // Cancel Training Process. All remaining points will be removed.
}
else if (Creature.ControlSlots < Creature.ControlSlotsMax)
{
AddHtmlLocalized(47, 270, 160, 18, 1157487, 0xC8, false, false); // Begin Animal Training
AddButton(53, 288, 0x837, 0x838, 4, GumpButtonType.Reply, 0);
}
}
AddPage(1);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 1049593, 0xC8, false, false); // Attributes
AddHtmlLocalized(53, 92, 160, 18, 1049578, _Label, false, false); // Hits
AddHtml(180, 92, 75, 18, FormatAttributes(Creature.Hits, Creature.HitsMax), false, false);
AddHtmlLocalized(53, 110, 160, 18, 1049579, _Label, false, false); // Stamina
AddHtml(180, 110, 75, 18, FormatAttributes(Creature.Stam, Creature.StamMax), false, false);
AddHtmlLocalized(53, 128, 160, 18, 1049580, _Label, false, false); // Mana
AddHtml(180, 128, 75, 18, FormatAttributes(Creature.Mana, Creature.ManaMax), false, false);
AddHtmlLocalized(53, 146, 160, 18, 1028335, _Label, false, false); // Strength
AddHtml(180, 146, 75, 18, FormatStat(Creature.Str), false, false);
AddHtmlLocalized(53, 164, 160, 18, 3000113, _Label, false, false); // Dexterity
AddHtml(180, 164, 75, 18, FormatStat(Creature.Dex), false, false);
AddHtmlLocalized(53, 182, 160, 18, 3000112, _Label, false, false); // Intelligence
AddHtml(180, 182, 75, 18, FormatStat(Creature.Int), false, false);
double bd = BaseInstrument.GetBaseDifficulty(Creature);
if (Creature.Uncalmable)
bd = 0;
AddHtmlLocalized(53, 200, 160, 18, 1070793, _Label, false, false); // Barding Difficulty
AddHtml(180, 200, 75, 18, FormatDouble(bd), false, false);
AddImage(28, 220, 0x826);
AddHtmlLocalized(47, 220, 160, 18, 1049594, 0xC8, false, false); // Loyalty Rating
AddHtmlLocalized(53, 236, 160, 18, (!Creature.Controlled || Creature.Loyalty == 0) ? 1061643 : 1049595 + (Creature.Loyalty / 10), _Label, false, false);
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 2);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, Pages(profile));
AddPage(2);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 1049593, 0xC8, false, false); // Attributes
AddHtmlLocalized(53, 92, 160, 18, 1075627, _Label, false, false); // Hit Point Regeneration
AddHtml(180, 92, 75, 18, FormatStat((int)RegenRates.HitPointRegen(Creature)), false, false);
AddHtmlLocalized(53, 110, 160, 18, 1079411, _Label, false, false); // Stamina Regeneration
AddHtml(180, 110, 75, 18, FormatStat((int)RegenRates.StamRegen(Creature)), false, false);
AddHtmlLocalized(53, 128, 160, 18, 1079410, _Label, false, false); // Mana Regeneration
AddHtml(180, 128, 75, 18, FormatStat((int)RegenRates.ManaRegen(Creature)), false, false);
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 3);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 1);
AddPage(3);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 1061645, 0xC8, false, false); // Resistances
AddHtmlLocalized(53, 92, 160, 18, 1061646, _Label, false, false); // Physical
AddHtml(180, 92, 75, 18, FormatElement(Creature.PhysicalResistance, null), false, false);
AddHtmlLocalized(53, 110, 160, 18, 1061647, _Label, false, false); // Fire
AddHtml(180, 110, 75, 18, FormatElement(Creature.FireResistance, "#FF0000"), false, false);
AddHtmlLocalized(53, 128, 160, 18, 1061648, _Label, false, false); // Cold
AddHtml(180, 128, 75, 18, FormatElement(Creature.ColdResistance, "#000080"), false, false);
AddHtmlLocalized(53, 146, 160, 18, 1061649, _Label, false, false); // Poison
AddHtml(180, 146, 75, 18, FormatElement(Creature.PoisonResistance, "#008000"), false, false);
AddHtmlLocalized(53, 164, 160, 18, 1061650, _Label, false, false); // Energy
AddHtml(180, 164, 75, 18, FormatElement(Creature.EnergyResistance, "#BF80FF"), false, false);
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 4);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 2);
AddPage(4);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 1017319, 0xC8, false, false); // Damage
AddHtmlLocalized(53, 92, 160, 18, 1061646, _Label, false, false); // Physical
AddHtml(180, 92, 75, 18, FormatElement(Creature.PhysicalDamage, null), false, false);
AddHtmlLocalized(53, 110, 160, 18, 1061647, _Label, false, false); // Fire
AddHtml(180, 110, 75, 18, FormatElement(Creature.FireDamage, "#FF0000"), false, false);
AddHtmlLocalized(53, 128, 160, 18, 1061648, _Label, false, false); // Cold
AddHtml(180, 128, 75, 18, FormatElement(Creature.ColdDamage, "#000080"), false, false);
AddHtmlLocalized(53, 146, 160, 18, 1061649, _Label, false, false); // Poison
AddHtml(180, 146, 75, 18, FormatElement(Creature.PoisonDamage, "#008000"), false, false);
AddHtmlLocalized(53, 164, 160, 18, 1061650, _Label, false, false); // Energy
AddHtml(180, 164, 75, 18, FormatElement(Creature.EnergyDamage, "#BF80FF"), false, false);
AddHtmlLocalized(53, 182, 160, 18, 1076750, _Label, false, false); // Base Damage
AddHtml(180, 182, 75, 18, FormatDamage(Creature.DamageMin, Creature.DamageMax), false, false);
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 5);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 3);
AddPage(5);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 3001030, 0xC8, false, false); // Combat Ratings
AddHtmlLocalized(53, 92, 160, 18, 1044103, _Label, false, false); // Wrestling
AddHtml(180, 92, 100, 18, FormatSkill(Creature, SkillName.Wrestling), false, false);
AddHtmlLocalized(53, 110, 160, 18, 1044087, _Label, false, false); // Tactics
AddHtml(180, 110, 100, 18, FormatSkill(Creature, SkillName.Tactics), false, false);
AddHtmlLocalized(53, 128, 160, 18, 1044086, _Label, false, false); // Magic Resistance
AddHtml(180, 128, 100, 18, FormatSkill(Creature, SkillName.MagicResist), false, false);
AddHtmlLocalized(53, 146, 160, 18, 1044061, _Label, false, false); // Anatomy
AddHtml(180, 146, 100, 18, FormatSkill(Creature, SkillName.Anatomy), false, false);
AddHtmlLocalized(53, 164, 160, 18, 1002082, _Label, false, false); // Healing
AddHtml(180, 164, 100, 18, FormatSkill(Creature, SkillName.Healing), false, false);
AddHtmlLocalized(53, 182, 160, 18, 1002122, _Label, false, false); // Poisoning
AddHtml(180, 182, 100, 18, FormatSkill(Creature, SkillName.Poisoning), false, false);
AddHtmlLocalized(53, 200, 160, 18, 1044074, _Label, false, false); // Detect Hidden
AddHtml(180, 200, 100, 18, FormatSkill(Creature, SkillName.DetectHidden), false, false);
AddHtmlLocalized(53, 218, 160, 18, 1002088, _Label, false, false); // Hiding
AddHtml(180, 218, 100, 18, FormatSkill(Creature, SkillName.Hiding), false, false);
AddHtmlLocalized(53, 236, 160, 18, 1002118, _Label, false, false); // Parrying
AddHtml(180, 236, 100, 18, FormatSkill(Creature, SkillName.Parry), false, false);
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 6);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 4);
AddPage(6);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 3001032, 0xC8, false, false); // Lore & Knowledge
AddHtmlLocalized(53, 92, 160, 18, 1044085, _Label, false, false); // Magery
AddHtml(180, 92, 100, 18, FormatSkill(Creature, SkillName.Magery), false, false);
AddHtmlLocalized(53, 110, 160, 18, 1044076, _Label, false, false); // Eval Int
AddHtml(180, 110, 100, 18, FormatSkill(Creature, SkillName.EvalInt), false, false);
AddHtmlLocalized(53, 128, 160, 18, 1044106, _Label, false, false); // Meditation
AddHtml(180, 128, 100, 18, FormatSkill(Creature, SkillName.Meditation), false, false);
AddHtmlLocalized(53, 146, 160, 18, 1044109, _Label, false, false); // Necromancy
AddHtml(180, 146, 100, 18, FormatSkill(Creature, SkillName.Necromancy), false, false);
AddHtmlLocalized(53, 164, 160, 18, 1002140, _Label, false, false); // Spirit Speak
AddHtml(180, 164, 100, 18, FormatSkill(Creature, SkillName.SpiritSpeak), false, false);
AddHtmlLocalized(53, 182, 160, 18, 1044115, _Label, false, false); // Mysticism
AddHtml(180, 182, 100, 18, FormatSkill(Creature, SkillName.Mysticism), false, false);
AddHtmlLocalized(53, 200, 160, 18, 1044110, _Label, false, false); // Focus
AddHtml(180, 200, 100, 18, FormatSkill(Creature, SkillName.Focus), false, false);
AddHtmlLocalized(53, 218, 160, 18, 1044114, _Label, false, false); // Spellweaving
AddHtml(180, 218, 100, 18, FormatSkill(Creature, SkillName.Spellweaving), false, false);
AddHtmlLocalized(53, 236, 160, 18, 1044075, _Label, false, false); // Discordance
AddHtml(180, 236, 100, 18, FormatSkill(Creature, SkillName.Discordance), false, false);
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 7);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 5);
AddPage(7);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 3001032, 0xC8, false, false); // Lore & Knowledge
AddHtmlLocalized(53, 92, 160, 18, 1044112, _Label, false, false); // Bushido
AddHtml(180, 92, 100, 18, FormatSkill(Creature, SkillName.Bushido), false, false);
AddHtmlLocalized(53, 110, 160, 18, 1044113, _Label, false, false); // Ninjitsu
AddHtml(180, 110, 100, 18, FormatSkill(Creature, SkillName.Ninjitsu), false, false);
AddHtmlLocalized(53, 128, 160, 18, 1044111, _Label, false, false); // Chivalry
AddHtml(180, 128, 100, 18, FormatSkill(Creature, SkillName.Chivalry), false, false);
AddImage(28, 146, 0x826);
AddHtmlLocalized(47, 144, 160, 18, 1049563, 0xC8, false, false); // Preferred Foods
int foodPref = 3000340;
if ((Creature.FavoriteFood & FoodType.FruitsAndVegies) != 0)
foodPref = 1049565; // Fruits and Vegetables
else if ((Creature.FavoriteFood & FoodType.GrainsAndHay) != 0)
foodPref = 1049566; // Grains and Hay
else if ((Creature.FavoriteFood & FoodType.Fish) != 0)
foodPref = 1049568; // Fish
else if ((Creature.FavoriteFood & FoodType.Meat) != 0)
foodPref = 1049564; // Meat
else if ((Creature.FavoriteFood & FoodType.Eggs) != 0)
foodPref = 1044477; // Eggs
else if ((Creature.FavoriteFood & FoodType.BlackrockStew) != 0)
foodPref = 1115752; // blackrock stew
AddHtmlLocalized(53, 164, 160, 18, foodPref, _Label, false, false);
AddImage(28, 182, 0x826);
AddHtmlLocalized(47, 182, 160, 18, 1049569, 0xC8, false, false); // Pack Instincts
int packInstinct = 3000340;
if ((Creature.PackInstinct & PackInstinct.Canine) != 0)
packInstinct = 1049570; // Canine
else if ((Creature.PackInstinct & PackInstinct.Ostard) != 0)
packInstinct = 1049571; // Ostard
else if ((Creature.PackInstinct & PackInstinct.Feline) != 0)
packInstinct = 1049572; // Feline
else if ((Creature.PackInstinct & PackInstinct.Arachnid) != 0)
packInstinct = 1049573; // Arachnid
else if ((Creature.PackInstinct & PackInstinct.Daemon) != 0)
packInstinct = 1049574; // Daemon
else if ((Creature.PackInstinct & PackInstinct.Bear) != 0)
packInstinct = 1049575; // Bear
else if ((Creature.PackInstinct & PackInstinct.Equine) != 0)
packInstinct = 1049576; // Equine
else if ((Creature.PackInstinct & PackInstinct.Bull) != 0)
packInstinct = 1049577; // Bull
AddHtmlLocalized(53, 200, 160, 18, packInstinct, _Label, false, false);
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 8);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 6);
if (Creature.Tamable)
{
AddImage(28, 218, 0x826);
AddHtmlLocalized(47, 216, 160, 18, 1115783, 0xC8, false, false); // Pet Slots
AddHtml(53, 236, 80, 18, FormatPetSlots(Creature.ControlSlots, Creature.ControlSlotsMax), false, false);
AddHtmlLocalized(158, 236, 115, 18, 1157600, Creature.CurrentTameSkill.ToString("0.0"), _Label, false, false);
AddTooltip(1157586);
}
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 8);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 6);
AddPage(8);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 3001032, 0xC8, false, false); // Lore & Knowledge
if (profile != null)
{
int y = 92;
foreach (object o in profile.EnumerateAllAbilities())
{
TextDefinition[] loc = PetTrainingHelper.GetLocalization(o);
if (loc[0] == null)
continue;
if (loc[0].Number > 0)
{
AddHtmlLocalized(53, y, 180, 18, loc[0].Number, _Label, false, false);
}
else if (loc[0].String != null)
{
AddHtml(53, y, 180, 18, loc[0].String, false, false);
}
if (loc[1] != null && loc[1].Number > 0)
{
AddTooltip(loc[1].Number);
}
y += 18;
}
if (profile.Advancements != null)
{
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 9);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 7);
int advpage = AdvPage(profile);
int profileadvcount = profile.Advancements.Count - 1;
int idx = 0;
for (int p = 1; p <= advpage; p++)
{
y = 92;
AddPage(8 + p);
AddImage(28, 76, 0x826);
AddHtmlLocalized(47, 74, 160, 18, 1157505, 0xC8, false, false); // Pet Advancements
for (int i = profileadvcount; i >= 0; i--)
{
if (++idx > 9)
{
profileadvcount -= idx;
idx = 0;
break;
}
TextDefinition[] loc = PetTrainingHelper.GetLocalization(profile.Advancements[i]);
int tooltip = PetTrainingHelper.GetCategoryLocalization(profile.Advancements[i]);
bool skill = profile.Advancements[i] is SkillName;
if (loc[0] != null)
{
if (loc[0].Number > 0)
{
AddHtmlLocalized(53, y, 180, 18, loc[0], skill ? 0x208 : 0x68A5, false, false);
AddTooltip(tooltip);
if (skill)
{
double cap = Creature.Skills[(SkillName)profile.Advancements[i]].Cap;
if (cap > 0)
{
AddHtml(180, y, 75, 18, string.Format("
{0:F1}
", cap), false, false);
}
}
}
else if (loc[0].String != null)
{
AddHtml(53, y, 180, 18, Color(skill ? "#008442" : "#D62929", loc[0]), false, false);
AddTooltip(tooltip);
}
}
y += 18;
}
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, advpage == p ? 1 : 9 + p);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 7 + p);
}
}
else
{
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 1);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 7);
}
}
else
{
AddButton(240, 328, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 1);
AddButton(217, 328, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 7);
}
}
public override void OnResponse(RelayInfo info)
{
int id = info.ButtonID;
if (Creature == null || Creature.Map == null || Creature.Map == Map.Internal || !Creature.Alive || Creature.Deleted || Creature.IsDeadBondedPet)
id = 0;
switch (id)
{
case 0:
User.CloseGump(typeof(PetTrainingOptionsGump));
User.CloseGump(typeof(PetTrainingPlanningGump));
User.CloseGump(typeof(PetTrainingInfoGump));
User.CloseGump(typeof(PetTrainingStyleConfirmGump));
User.CloseGump(typeof(PetTrainingConfirmationGump));
break;
case 1: // training tracker
User.CloseGump(typeof(PetTrainingProgressGump));
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
SendGump(new PetTrainingProgressGump(User, Creature));
});
break;
case 2: // pet training options
if (User.HasGump(typeof(PetTrainingConfirmationGump)) ||
User.HasGump(typeof(PetTrainingOptionsGump)) ||
User.HasGump(typeof(PetTrainingPlanningGump)) ||
User.HasGump(typeof(PetTrainingStyleConfirmGump)))
{
Refresh();
break;
}
TrainingProfile trainProfile = PetTrainingHelper.GetTrainingProfile(Creature, true);
if (trainProfile.HasBegunTraining)
{
if (!trainProfile.HasRecievedControlSlotWarning)
{
trainProfile.HasRecievedControlSlotWarning = true;
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
SendGump(new PetTrainingStyleConfirmGump(User, 1157571, 1157572, () =>
{
Refresh();
User.CloseGump(typeof(PetTrainingOptionsGump));
SendGump(new PetTrainingOptionsGump(User, Creature));
}));
});
}
else
{
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
Refresh();
User.CloseGump(typeof(PetTrainingOptionsGump));
SendGump(new PetTrainingOptionsGump(User, Creature));
});
}
}
break;
case 3: // cancel
SendGump(new PetTrainingStyleConfirmGump(User, 1153093, 1158019, () =>
{
TrainingProfile trainProfile1 = PetTrainingHelper.GetTrainingProfile(Creature, true);
if (trainProfile1 != null)
{
trainProfile1.EndTraining();
}
}));
break;
case 4: // begin training
TrainingProfile trainProfile2 = PetTrainingHelper.GetTrainingProfile(Creature, true);
trainProfile2.BeginTraining();
Refresh();
Engines.Quests.UsingAnimalLoreQuest.CheckComplete(User);
break;
}
}
public int AdvPage(AbilityProfile profile)
{
int advcount = profile.Advancements.Count;
int advpage = 0;
if (advcount % 9 == 0)
{
advpage = advcount / 9;
}
else
{
advpage = advcount / 9 + 1;
}
return advpage;
}
public int Pages(AbilityProfile profile)
{
if (profile == null || profile.Advancements == null || profile.Advancements.Count == 0)
return 8;
return 8 + AdvPage(profile);
}
private static string FormatSkill(BaseCreature c, SkillName name)
{
if (c.Skills[name].Base < 10.0)
return "---
";
return string.Format("{0:F1}/{1}
", c.Skills[name].Value, c.Skills[name].Cap);
}
private static string FormatAttributes(int cur, int max)
{
if (max == 0)
return "---
";
return string.Format("{0}/{1}
", cur, max);
}
private static string FormatStat(int val)
{
if (val == 0)
return "---
";
return string.Format("{0}
", val);
}
public static string FormatDouble(double val)
{
if (val == 0)
return "---
";
return string.Format("{0:F1}
", val);
}
public static string FormatDouble(double val, bool dontshowzero = true, bool percentage = false)
{
if (dontshowzero)
{
return FormatDouble(val);
}
if (percentage)
{
return string.Format("{0:F1}%
", val);
}
return string.Format("{0:F1}
", val);
}
public static string FormatElement(int val, string color)
{
if (color == null)
{
if (val <= 0)
return string.Format("---
");
return string.Format("{0}%
", val);
}
if (val <= 0)
return string.Format("---
", color);
return string.Format("{0}%
", val, color);
}
public static string FormatDamage(int min, int max)
{
if (min <= 0 || max <= 0)
return "---
";
return string.Format("{0}-{1}
", min, max);
}
public string FormatPetSlots(int min, int max)
{
return string.Format("{0} => {1}", min.ToString(), max.ToString());
}
}
public class PetTrainingProgressGump : BaseGump
{
public override int GetTypeID()
{
return 0xF3EE3;
}
public BaseCreature Creature { get; private set; }
public PetTrainingProgressGump(PlayerMobile pm, BaseCreature bc)
: base(pm, 50, 200)
{
Creature = bc;
}
public override void AddGumpLayout()
{
List pets = new List(User.AllFollowers.OfType().Where(p =>
p.TrainingProfile != null &&
p.TrainingProfile.HasBegunTraining &&
p.Map == User.Map));
if (pets == null || pets.Count == 0)
{
AddBackground(0, 24, 254, 170, 0x24A4);
return;
}
if (pets.Contains(Creature) && pets[0] != Creature)
{
pets.Remove(Creature);
pets.Insert(0, Creature);
}
int length = 254 + ((pets.Count - 1) * 60);
AddBackground(0, 24, 254, length, 0x24A4);
AddHtmlLocalized(30, 32, 200, 18, 1114513, "#1157491", 0, false, false); // Pet Training Progress:
AddButton(120, 0, 0x82D, 0x82D, 0, GumpButtonType.Reply, 0);
for (int i = 0; i < pets.Count; i++)
{
BaseCreature pet = pets[i];
AddHtml(53, 60 + (40 * i), 210, 18, Color("#000080", pet.Name), false, false);
TrainingProfile trainProfile = PetTrainingHelper.GetTrainingProfile(pet);
double progress = 0.0;
AddImage(53, 80 + (40 * i), 0x805);
if (trainProfile != null)
{
progress = trainProfile.TrainingProgressPercentile * 100;
if (progress >= 1)
{
AddBackground(53, 80 + (40 * i), (int)(109.0 * (progress / 100)), 11, 0x806);
}
}
AddHtml(162, 78 + (40 * i), 50, 18, NewAnimalLoreGump.FormatDouble(progress, false, true), false, false);
}
}
}
public class PetTrainingOptionsGump : BaseGump
{
public BaseCreature Creature { get; private set; }
public int Category { get; private set; }
public AbilityProfile AbilityProfile { get; private set; }
public TrainingProfile TrainingProfile { get; private set; }
public TrainingDefinition Definition { get; private set; }
public PetTrainingOptionsGump(PlayerMobile pm, BaseCreature bc)
: base(pm, 40, 200)
{
Creature = bc;
Category = 0;
Definition = PetTrainingHelper.GetTrainingDefinition(Creature);
AbilityProfile = PetTrainingHelper.GetAbilityProfile(Creature, true);
TrainingProfile = PetTrainingHelper.GetTrainingProfile(Creature, true);
}
public override void AddGumpLayout()
{
AddBackground(0, 0, 574, 560, 0x24A4);
AddHtmlLocalized(0, 11, 574, 18, 1157485, false, false); // ANIMAL TRAINING MENU
AddImageTiled(35, 40, 220, 440, 2624);
AddImageTiled(37, 42, 216, 436, 3004);
AddImageTiled(265, 40, 270, 440, 2624);
AddImageTiled(267, 42, 266, 436, 3004);
AddHtmlLocalized(35, 63, 220, 20, 1044010, 0, false, false); // CATEGORIES
AddHtmlLocalized(265, 63, 270, 20, 1044011, 0, false, false); // SELECTIONS
AddECHandleInput();
AddButton(35, 490, 0x9CC8, 0x9CC7, 0, GumpButtonType.Reply, 0);
AddHtml(35, 493, 126, 20, Center("CANCEL"), false, false);
AddECHandleInput();
AddECHandleInput();
AddButton(220, 490, 0x9CC8, 0x9CC7, 1, GumpButtonType.Reply, 0);
AddHtml(220, 493, 126, 20, Center("PLAN"), false, false);
AddECHandleInput();
AddECHandleInput();
AddButton(410, 490, 0x9CC8, 0x9CC7, 2, GumpButtonType.Reply, 0);
AddHtml(410, 493, 126, 20, Center("INFO"), false, false);
int y = 90;
TrainingDefinition def = PetTrainingHelper.GetTrainingDefinition(Creature);
AddButton(40, y, 4005, 4007, 3, GumpButtonType.Reply, 0);
AddHtmlLocalized(75, y + 2, 150, 16, 3010049, false, false); // Stats
y += 24;
AddButton(40, y, 4005, 4007, 4, GumpButtonType.Reply, 0);
AddHtmlLocalized(75, y + 2, 180, 16, 1114254, false, false); // Resists
y += 24;
if (HasAvailable(PetTrainingHelper.MagicSkills))
{
AddButton(40, y, 4005, 4007, 5, GumpButtonType.Reply, 0);
AddHtmlLocalized(75, y + 2, 180, 16, 1157495, false, false); // Increase Magic Skill Caps
y += 24;
}
if (HasAvailable(PetTrainingHelper.CombatSkills))
{
AddButton(40, y, 4005, 4007, 6, GumpButtonType.Reply, 0);
AddHtmlLocalized(75, y + 2, 180, 16, 1157496, false, false); // Increase Combat Skill Caps
y += 24;
}
if (HasAvailable(Definition.MagicalAbilities))
{
AddButton(40, y, 4005, 4007, 7, GumpButtonType.Reply, 0);
AddHtmlLocalized(75, y + 2, 180, 16, 1157481, false, false); // Magical Abilities
y += 24;
}
if (HasAvailable(Definition.SpecialAbilities))
{
AddButton(40, y, 4005, 4007, 8, GumpButtonType.Reply, 0);
AddHtmlLocalized(75, y + 2, 180, 16, 1157480, false, false); // Special Abilities
y += 24;
}
if (HasAvailable(Definition.WeaponAbilities))
{
AddButton(40, y, 4005, 4007, 9, GumpButtonType.Reply, 0);
AddHtmlLocalized(75, y + 2, 180, 16, 1157479, false, false); // Special Moves
y += 24;
}
if (HasAvailable(Definition.AreaEffects))
{
AddButton(40, y, 4005, 4007, 10, GumpButtonType.Reply, 0);
AddHtmlLocalized(75, y + 2, 180, 16, 1157482, false, false); // Area Effect Abilities
}
switch (Category)
{
case 0: BuildStatsPage(); break;
case 1: BuildResistsPage(); break;
case 2: BuildMagicSkillCapsPage(); break;
case 3: BuildCombatSkillCapsPage(); break;
case 4: BuildMagicalAbilitiesPage(); break;
case 5: BuildSpecialAbilitiesPage(); break;
case 6: BuildSpecialMovesPage(); break;
case 7: BuildAreaEffectsPage(); break;
}
}
private void BuildStatsPage()
{
int y = 90;
foreach (int i in Enum.GetValues(typeof(PetStat)))
{
TrainingPoint tp = PetTrainingHelper.GetTrainingPoint((PetStat)i);
AddButton(275, y, 4005, 4007, 100 + i, GumpButtonType.Reply, 0);
Record(tp, 320, y + 2);
y += 22;
}
}
private void BuildResistsPage()
{
int y = 90;
foreach (int i in Enum.GetValues(typeof(ResistanceType)))
{
TrainingPoint tp = PetTrainingHelper.GetTrainingPoint((ResistanceType)i);
AddButton(275, y, 4005, 4007, 100 + i, GumpButtonType.Reply, 0);
Record(tp, 320, y + 2);
y += 22;
}
}
private void BuildMagicSkillCapsPage()
{
int y = 90;
foreach (SkillName skill in PetTrainingHelper.MagicSkills)
{
if ((!PetTrainingHelper.CommonSkill(Creature, skill) && Creature.Skills[skill].Base <= 0) || Creature.Skills[skill].Cap >= 120)
continue;
TrainingPoint tp = PetTrainingHelper.GetTrainingPoint(skill);
AddButton(275, y, 4005, 4007, 100 + (int)skill, GumpButtonType.Reply, 0);
Record(tp, 320, y + 2);
y += 22;
}
}
private void BuildCombatSkillCapsPage()
{
int y = 90;
foreach (SkillName skill in PetTrainingHelper.CombatSkills)
{
if ((!PetTrainingHelper.CommonSkill(Creature, skill) && Creature.Skills[skill].Base <= 0) || Creature.Skills[skill].Cap >= 120)
continue;
TrainingPoint tp = PetTrainingHelper.GetTrainingPoint(skill);
AddButton(275, y, 4005, 4007, 100 + (int)skill, GumpButtonType.Reply, 0);
Record(tp, 320, y + 2);
y += 22;
}
}
private void BuildMagicalAbilitiesPage()
{
int y = 90;
for (int i = 0; i < PetTrainingHelper.MagicalAbilities.Length; i++)
{
MagicalAbility abil = PetTrainingHelper.MagicalAbilities[i];
Mobile master = Creature.ControlMaster;
if ((abil == MagicalAbility.Chivalry && master != null && master.Karma < 0) ||
(abil == MagicalAbility.Necromancy && master != null && master.Karma > 0) ||
(abil == MagicalAbility.Necromage && master != null && master.Karma > 0))
{
continue;
}
if ((Definition.MagicalAbilities & abil) == 0 || AbilityProfile.HasAbility(abil) ||
!AbilityProfile.CanChooseMagicalAbility(abil) || /*(abil <= MagicalAbility.WrestlingMastery && AbilityProfile.AbilityCount() >= 3) ||*/
((abil & MagicalAbility.Tokuno) != 0 && !AbilityProfile.TokunoTame))
{
continue;
}
TrainingPoint tp = PetTrainingHelper.GetTrainingPoint(abil);
AddButton(275, y, 4005, 4007, 100 + i, GumpButtonType.Reply, 0);
Record(tp, 320, y + 2);
y += 22;
}
}
private void BuildSpecialAbilitiesPage()
{
int y = 90;
for (int i = 0; i < SpecialAbility.Abilities.Length; i++)
{
SpecialAbility abil = SpecialAbility.Abilities[i];
if (AbilityProfile.HasAbility(abil) || (AbilityProfile.HasSpecialMagicalAbility() && !AbilityProfile.IsRuleBreaker(abil)))
continue;
if (Definition.HasSpecialAbility(abil) || (AbilityProfile.HasAbility(MagicalAbility.Poisoning) && abil is VenomousBite))
{
TrainingPoint tp = PetTrainingHelper.GetTrainingPoint(abil);
AddButton(275, y, 4005, 4007, 100 + i, GumpButtonType.Reply, 0);
Record(tp, 320, y + 2);
y += 22;
}
}
}
private void BuildSpecialMovesPage()
{
int y = 90;
for (int i = 0; i < Definition.WeaponAbilities.Length; i++)
{
WeaponAbility abil = Definition.WeaponAbilities[i];
if (AbilityProfile.HasAbility(abil))
continue;
TrainingPoint tp = PetTrainingHelper.GetTrainingPoint(abil);
AddButton(275, y, 4005, 4007, 100 + i, GumpButtonType.Reply, 0);
Record(tp, 320, y + 2);
y += 22;
}
}
private void BuildAreaEffectsPage()
{
int y = 90;
for (int i = 0; i < AreaEffect.Effects.Length; i++)
{
AreaEffect abil = AreaEffect.Effects[i];
if (AbilityProfile.HasAbility(abil))
continue;
if (Definition.HasAreaEffect(abil) || (AbilityProfile.HasAbility(MagicalAbility.Poisoning) && abil is PoisonBreath))
{
TrainingPoint tp = PetTrainingHelper.GetTrainingPoint(abil);
AddButton(275, y, 4005, 4007, 100 + i, GumpButtonType.Reply, 0);
Record(tp, 320, y + 2);
y += 22;
}
}
}
private void Record(TrainingPoint tp, int x, int y)
{
if (tp == null)
{
AddLabel(x, y, 0, "Null Training Point");
return;
}
if (tp.Name.Number > 0)
{
AddHtmlLocalized(x, y, 215, 20, tp.Name.Number, 0, false, false);
}
else if (tp.Name.String != null)
{
AddLabel(x, y, 0, tp.Name.String);
}
}
private bool HasAvailable(object o)
{
if (o == null)
return false;
if (o is MagicalAbility && Definition.MagicalAbilities != 0)
{
foreach (object i in Enum.GetValues(typeof(MagicalAbility)))
{
MagicalAbility ability = (MagicalAbility)i;
if ((Definition.MagicalAbilities & ability) != 0 && !AbilityProfile.HasAbility(ability))
{
return true;
}
}
return false;
}
if (o is SpecialAbility[])
{
if (!AbilityProfile.CanChooseSpecialAbility((SpecialAbility[])o))
{
return false;
}
if (AbilityProfile.HasAbility(MagicalAbility.Poisoning) && !AbilityProfile.HasAbility(SpecialAbility.VenomousBite))
{
return true;
}
foreach (SpecialAbility ability in (SpecialAbility[])o)
{
if (!AbilityProfile.HasAbility(ability))
{
return true;
}
}
}
else if (o is WeaponAbility[])
{
if (!AbilityProfile.CanChooseWeaponAbility())
{
return false;
}
foreach (WeaponAbility ability in (WeaponAbility[])o)
{
if (!AbilityProfile.HasAbility(ability))
{
return true;
}
}
}
else if (o is AreaEffect[])
{
if (!AbilityProfile.CanChooseAreaEffect())
{
return false;
}
if (AbilityProfile.HasAbility(MagicalAbility.Poisoning) && !AbilityProfile.HasAbility(AreaEffect.PoisonBreath))
{
return true;
}
foreach (AreaEffect ability in (AreaEffect[])o)
{
if (!AbilityProfile.HasAbility(ability))
{
return true;
}
}
}
else if (o is SkillName[])
{
foreach (SkillName name in (SkillName[])o)
{
Skill skill = Creature.Skills[name];
if (skill.Base > 0 && skill.Cap < 120)
{
return true;
}
}
return false;
}
return false;
}
public override void OnResponse(RelayInfo info)
{
int id = info.ButtonID;
if (id == 0)
{
return;
}
if (id == 1)
{
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
if (User.HasGump(typeof(NewAnimalLoreGump)))
{
Refresh();
User.CloseGump(typeof(PetTrainingPlanningGump));
SendGump(new PetTrainingPlanningGump(User, Creature));
}
});
return;
}
if (id == 2)
{
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
if (User.HasGump(typeof(NewAnimalLoreGump)))
{
Refresh();
User.CloseGump(typeof(PetTrainingInfoGump));
SendGump(new PetTrainingInfoGump(User));
}
});
return;
}
if (id <= 11)
{
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
if (User.HasGump(typeof(NewAnimalLoreGump)))
{
Category = id - 3;
Refresh();
}
});
return;
}
TrainingPoint tp = null;
switch (Category)
{
case 0: // stats
PetStat stat = (PetStat)id - 100;
tp = PetTrainingHelper.GetTrainingPoint(stat);
break;
case 1: // resists
ResistanceType r = (ResistanceType)id - 100;
tp = PetTrainingHelper.GetTrainingPoint(r);
break;
case 2: // mag skill
case 3: // combat skill
SkillName sk = (SkillName)id - 100;
tp = PetTrainingHelper.GetTrainingPoint(sk);
break;
case 4: // mag abil
MagicalAbility mabil = PetTrainingHelper.MagicalAbilities[id - 100];
tp = PetTrainingHelper.GetTrainingPoint(mabil);
break;
case 5: // spec abil
SpecialAbility sabil = SpecialAbility.Abilities[id - 100];
tp = PetTrainingHelper.GetTrainingPoint(sabil);
break;
case 6: // spec moves
WeaponAbility wabil = Definition.WeaponAbilities[id - 100];
tp = PetTrainingHelper.GetTrainingPoint(wabil);
break;
case 7: // area effects
AreaEffect aabil = AreaEffect.Effects[id - 100];
tp = PetTrainingHelper.GetTrainingPoint(aabil);
break;
}
if (tp != null)
{
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
if (User.HasGump(typeof(NewAnimalLoreGump)))
{
User.CloseGump(typeof(PetTrainingConfirmationGump));
SendGump(new PetTrainingConfirmationGump(User, Creature, tp));
}
});
}
}
}
public class PetTrainingConfirmationGump : BaseGump
{
public BaseCreature Creature { get; private set; }
public TrainingPoint TrainingPoint { get; private set; }
public int Value { get; private set; }
public int StartValue { get; private set; }
public PetTrainingConfirmationGump(PlayerMobile pm, BaseCreature bc, TrainingPoint tp)
: base(pm, 50, 200)
{
Creature = bc;
TrainingPoint = tp;
Value = tp.Start;
}
public override void AddGumpLayout()
{
TrainingProfile profile = PetTrainingHelper.GetTrainingProfile(Creature, true);
AddBackground(0, 0, 574, 470, 0x24A4);
AddHtmlLocalized(0, 12, 574, 16, 1157486, false, false); // TRAINING CONFIRMATION
AddImageTiled(35, 40, 245, 140, 2624);
AddImageTiled(37, 42, 241, 136, 3004);
AddImageTiled(290, 40, 245, 140, 2624);
AddImageTiled(292, 42, 241, 136, 3004);
AddImageTiled(35, 190, 245, 140, 2624);
AddImageTiled(37, 192, 241, 136, 3004);
AddImageTiled(290, 190, 245, 140, 2624);
AddImageTiled(292, 192, 241, 136, 3004);
AddImageTiled(35, 340, 500, 60, 2624);
AddImageTiled(37, 342, 496, 56, 3004);
AddButton(40, 410, 0x9CC8, 0x9CC7, 1, GumpButtonType.Reply, 0);
AddHtml(40, 413, 126, 20, Center("Back"), false, false);
AddButton(415, 410, 0x9CC8, 0x9CC7, profile.TrainingMode == TrainingMode.Regular ? 8 : 9, GumpButtonType.Reply, 0);
AddHtml(415, 413, 126, 20, Center(profile.TrainingMode == TrainingMode.Regular ? "Train Pet" : "Add To Plan"), false, false);
AddHtmlLocalized(35, 55, 245, 20, CenterLoc, "#1114269", 0, false, false); // PROPERTY INFORMATION
AddHtmlLocalized(50, 85, 60, 16, 1114270, false, false); // Property:
AddHtmlLocalized(50, 105, 60, 16, 1114272, false, false); // Weight:
if (TrainingPoint.Name.Number > 0)
AddHtmlLocalized(120, 85, 200, 16, TrainingPoint.Name.Number, false, false);
else if (TrainingPoint.Name.String != null)
AddLabel(120, 85, 0, TrainingPoint.Name.String);
AddLabel(120, 105, 0, TrainingPoint.Weight.ToString("0.0"));
if (TrainingPoint.Description.Number > 0)
AddHtmlLocalized(305, 55, 215, 115, TrainingPoint.Description.Number, true, true);
else if (TrainingPoint.Description.String != null)
AddHtml(305, 55, 215, 115, TrainingPoint.Description.String, true, true);
AddHtmlLocalized(290, 205, 245, 20, CenterLoc, "#1113650", 0, false, false); // RESULTS
int start = -1;
int max = TrainingPoint.GetMax(Creature);
PetTrainingHelper.GetStartValue(TrainingPoint, Creature, ref start);
StartValue = start;
if (StartValue > Value)
{
Value = StartValue;
}
if (Value > max)
Value = max;
int cost = PetTrainingHelper.GetTotalCost(TrainingPoint, Creature, Value, StartValue);
double weight = TrainingPoint.Weight;
if (CanAdjust() && cost > profile.TrainingPoints)
{
Value = StartValue + (int)(profile.TrainingPoints / weight);
}
if (StartValue > 0 || TrainingPoint.TrainPoint is ResistanceType)
{
double valueWeight = (Value * weight);
double maxWeight = max * weight;
double nonAdjustedWeight = (Value - StartValue) * weight;
double originalValueWeight = valueWeight;
if (TrainingPoint.TrainPoint is PetStat && (PetStat)TrainingPoint.TrainPoint <= PetStat.Mana)
{
PetStat stat = (PetStat)TrainingPoint.TrainPoint;
double maxTotalCap = PetTrainingHelper.GetTrainingCapTotal(stat);
double currentTotal = stat <= PetStat.Int ? PetTrainingHelper.GetTotalStatWeight(Creature) : PetTrainingHelper.GetTotalAttributeWeight(Creature);
if (currentTotal >= maxTotalCap)
{
valueWeight = 0;
}
else if (currentTotal + nonAdjustedWeight > maxTotalCap)
{
valueWeight -= (currentTotal + nonAdjustedWeight) - maxTotalCap;
}
}
else if (TrainingPoint.TrainPoint is ResistanceType)
{
ResistanceType resist = (ResistanceType)TrainingPoint.TrainPoint;
double maxTotalCap = PetTrainingHelper.GetTrainingCapTotal(resist);
double currentTotal = PetTrainingHelper.GetTotalResistWeight(Creature);
if (currentTotal >= maxTotalCap)
{
valueWeight = 0;
}
else if (currentTotal + nonAdjustedWeight > maxTotalCap)
{
valueWeight -= (currentTotal + nonAdjustedWeight) - maxTotalCap;
}
}
if (valueWeight > maxWeight)
{
valueWeight = maxWeight;
}
if (originalValueWeight != valueWeight)
{
Value = Math.Max(StartValue, (int)(valueWeight / weight));
}
}
cost = PetTrainingHelper.GetTotalCost(TrainingPoint, Creature, Value, StartValue);
int avail = profile.TrainingPoints - cost;
AddHtmlLocalized(35, 205, 245, 20, CenterLoc, "#1157493", 0, false, false); // REQUIREMENTS
if (TrainingPoint.Requirements != null && TrainingPoint.Requirements.Length > 0)
{
for (int i = 0; i < TrainingPoint.Requirements.Length; i++)
{
TrainingPointRequirement req = TrainingPoint.Requirements[i];
if (req == null)
continue;
if (req.Name.Number > 0)
AddHtmlLocalized(45, 225 + (i * 20), 190, 18, req.Name.Number, false, false);
else if (req.Name.String != null)
AddHtml(45, 225 + (i * 20), 190, 18, req.Name.String, false, false);
AddTooltip(1157523);
int reqCost = req.Cost;
if (req.Requirement is SkillName && Creature.Skills[(SkillName)req.Requirement].Value > 0)
reqCost = 0;
AddLabel(245, 225 + (i * 20), 0x26, reqCost.ToString());
AddTooltip(1157523);
}
}
else if (TrainingPoint.TrainPoint is SkillName)
{
int cliloc;
switch (Value)
{
default:
case 50: cliloc = 1049639; break;
case 100: cliloc = 1049640; break;
case 150: cliloc = 1049641; break;
case 200: cliloc = 1049642; break;
}
AddHtmlLocalized(45, 225, 225, 60, cliloc, string.Format("#{0}", TrainingPoint.Name.Number), 0, false, false);
}
AddHtmlLocalized(305, 225, 145, 18, 1157490, false, false); // Avail. Training Points:
AddLabel(455, 225, avail <= 0 ? 0x26 : 0, avail.ToString());
AddHtmlLocalized(305, 245, 145, 18, 1113646, false, false); // Total Property Weight:
AddLabel(455, 245, 0, string.Format("{0}/{1}", ((int)(Value * weight)).ToString(), (max * weight).ToString()));
if (TrainingPoint.Name.Number > 0)
AddHtmlLocalized(305, 265, 145, 18, TrainingPoint.Name.Number, false, false);
else if (TrainingPoint.Name.String != null)
AddLabel(305, 265, 0, TrainingPoint.Name.String);
if (TrainingPoint.TrainPoint is SkillName)
{
AddLabel(455, 265, 0, (100.0 + ((double)Value / 10)).ToString("0.0"));
}
else
{
AddLabel(455, 265, 0, StartValue > Value ? StartValue.ToString() : Value.ToString());
}
AddHtmlLocalized(230, 352, 150, 18, 1113586, false, false); // Property Weight:
AddHtml(267, 373, 40, 18, Center(((int)(Value * weight)).ToString()), false, false);
if (CanAdjust())
{
AddButton(205, 375, 0x1464, 0x1464, 2, GumpButtonType.Reply, 0);
AddButton(213, 375, 0x1466, 0x1466, 2, GumpButtonType.Reply, 0);
AddButton(225, 375, 0x1464, 0x1464, 3, GumpButtonType.Reply, 0);
AddButton(233, 375, 0x1466, 0x1466, 3, GumpButtonType.Reply, 0);
AddButton(245, 375, 0x1464, 0x1464, 4, GumpButtonType.Reply, 0);
AddButton(253, 375, 0x1466, 0x1466, 4, GumpButtonType.Reply, 0);
AddButton(305, 375, 0x1464, 0x1464, 5, GumpButtonType.Reply, 0);
AddButton(313, 375, 0x1466, 0x1466, 5, GumpButtonType.Reply, 0);
AddButton(325, 375, 0x1464, 0x1464, 6, GumpButtonType.Reply, 0);
AddButton(333, 375, 0x1466, 0x1466, 6, GumpButtonType.Reply, 0);
AddButton(345, 375, 0x1464, 0x1464, 7, GumpButtonType.Reply, 0);
AddButton(353, 375, 0x1466, 0x1466, 7, GumpButtonType.Reply, 0);
}
else
{
AddImage(205, 375, 0x1464);
AddImage(213, 375, 0x1466);
AddImage(225, 375, 0x1464);
AddImage(233, 375, 0x1466);
AddImage(245, 375, 0x1464);
AddImage(253, 375, 0x1466);
AddImage(305, 375, 0x1464);
AddImage(313, 375, 0x1466);
AddImage(325, 375, 0x1464);
AddImage(333, 375, 0x1466);
AddImage(345, 375, 0x1464);
AddImage(353, 375, 0x1466);
}
AddLabel(207, 373, 0, "<");
AddLabel(211, 373, 0, "<");
AddLabel(215, 373, 0, "<");
AddLabel(228, 373, 0, "<");
AddLabel(232, 373, 0, "<");
AddLabel(251, 373, 0, "<");
AddLabel(312, 373, 0, ">");
AddLabel(329, 373, 0, ">");
AddLabel(333, 373, 0, ">");
AddLabel(348, 373, 0, ">");
AddLabel(352, 373, 0, ">");
AddLabel(356, 373, 0, ">");
}
private bool CanAdjust()
{
return TrainingPoint.GetMax(Creature) != TrainingPoint.Start;
}
public override void OnResponse(RelayInfo info)
{
switch (info.ButtonID)
{
case 0:
break;
case 1:
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
if (User.HasGump(typeof(NewAnimalLoreGump)))
{
SendGump(new PetTrainingOptionsGump(User, Creature));
}
});
break;
case 2: // <<<
if (TrainingPoint.Start != TrainingPoint.GetMax(Creature))
{
Value = TrainingPoint.Start;
}
Refresh();
break;
case 3: // <<
if (TrainingPoint.Start != TrainingPoint.GetMax(Creature))
{
if (TrainingPoint.TrainPoint is SkillName)
{
Value = Math.Max(TrainingPoint.Start, Value -= 50);
}
else
{
Value = Value - (TrainingPoint.GetMax(Creature) / 10);
}
}
Refresh();
break;
case 4: // <
if (TrainingPoint.Start != TrainingPoint.GetMax(Creature))
{
if (TrainingPoint.TrainPoint is SkillName)
{
Value = Math.Max(TrainingPoint.Start, Value -= 50);
}
else
{
if (TrainingPoint.Weight < 1.0)
{
Value -= (int)(TrainingPoint.Weight * 100);
}
else
{
Value--;
}
}
}
Refresh();
break;
case 5: // >
if (TrainingPoint.Start != TrainingPoint.GetMax(Creature))
{
if (TrainingPoint.TrainPoint is SkillName)
{
Value = Math.Min(TrainingPoint.GetMax(Creature), Value += 50);
}
else
{
if (TrainingPoint.Weight < 1.0)
{
Value += (int)(TrainingPoint.Weight * 100);
}
else
{
Value++;
}
}
}
Refresh();
break;
case 6: // >>
if (TrainingPoint.Start != TrainingPoint.GetMax(Creature))
{
if (TrainingPoint.TrainPoint is SkillName)
{
Value = Math.Min(TrainingPoint.GetMax(Creature), Value += 50);
}
else
{
Value += (TrainingPoint.GetMax(Creature) / 10);
}
}
Refresh();
break;
case 7: // >>>
if (TrainingPoint.Start != TrainingPoint.GetMax(Creature))
{
Value = TrainingPoint.GetMax(Creature);
}
Refresh();
break;
case 8: // train pet
TrainingProfile profile = PetTrainingHelper.GetTrainingProfile(Creature, true);
int cost = PetTrainingHelper.GetTotalCost(TrainingPoint, Creature, Value, StartValue);
Item scroll = null;
if (!Creature.Controlled || User != Creature.ControlMaster)
{
User.SendLocalizedMessage(1114368); // This is not your pet!
}
else if (!Creature.InRange(User.Location, 12))
{
User.SendLocalizedMessage(1153204); // The pet is too far away from you!
}
else if (Spells.SpellHelper.CheckCombat(User) || Spells.SpellHelper.CheckCombat(Creature) ||
Creature.Aggressed.Count > 0 || Creature.Combatant != null)
{
User.SendLocalizedMessage(1156876); // Since you have been in combat recently you may not use this feature.
}
else if (!profile.HasIncreasedControlSlot && User.Followers >= User.FollowersMax)
{
User.SendLocalizedMessage(1157498); // You do not have the available pet slots to train this pet. Please free up pet slots and try again.
}
else if (cost > profile.TrainingPoints)
{
User.SendLocalizedMessage(1157500); // Your pet lacks the required points to complete this training.
}
else if (TrainingPoint.TrainPoint is SkillName && !CheckPowerScroll((SkillName)TrainingPoint.TrainPoint, Value, ref scroll))
{
User.SendLocalizedMessage(1157499); // You are unable to train your pet. The required powerscroll was not found in your main backpack.
}
else if (StartValue >= Value)
{
User.SendLocalizedMessage(1157501); // Your pet looks to have already completed that training.
}
else if (PetTrainingHelper.CanControl(User, Creature, profile))
{
SendGump(new PetTrainingStyleConfirmGump(User, 1157502, TrainingPoint.TrainPoint is MagicalAbility ? 1157566 : 1157503, () =>
{
if (PetTrainingHelper.ApplyTrainingPoint(Creature, TrainingPoint, Value))
{
User.SendLocalizedMessage(1157497); // You successfully train the pet!
if (TrainingPoint.TrainPoint is SkillName)
{
Effects.SendLocationParticles(EffectItem.Create(Creature.Location, Creature.Map, EffectItem.DefaultDuration), 0, 0, 0, 0, 0, 5060, 0);
Effects.PlaySound(Creature.Location, Creature.Map, 0x243);
Effects.SendMovingParticles(new Entity(Server.Serial.Zero, new Point3D(Creature.X - 6, Creature.Y - 6, Creature.Z + 15), Creature.Map), Creature, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100);
Effects.SendMovingParticles(new Entity(Server.Serial.Zero, new Point3D(Creature.X - 4, Creature.Y - 6, Creature.Z + 15), Creature.Map), Creature, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100);
Effects.SendMovingParticles(new Entity(Server.Serial.Zero, new Point3D(Creature.X - 6, Creature.Y - 4, Creature.Z + 15), Creature.Map), Creature, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100);
Effects.SendTargetParticles(Creature, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100);
if (scroll != null)
scroll.Delete();
}
else
{
Creature.PlaySound(0x1EB);
Creature.FixedEffect(0x375A, 1, 11);
}
profile.OnTrain(User, cost);
ResendGumps(profile.HasBegunTraining);
Engines.Quests.TeachingSomethingNewQuest.CheckComplete(User);
}
},
() =>
{
ResendGumps(profile.HasBegunTraining);
}));
}
else
{
User.SendLocalizedMessage(1157550); // You lack the taming skill required to train this creature.
}
break;
case 9:
if (Value > StartValue)
{
PetTrainingHelper.GetPlanningProfile(Creature, true).AddToPlan(TrainingPoint.TrainPoint, Value, PetTrainingHelper.GetTotalCost(TrainingPoint, Creature, Value, StartValue));
User.SendLocalizedMessage(1157592); // Your selection has been added to your training plan.
}
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
if (User.HasGump(typeof(NewAnimalLoreGump)))
{
Refresh();
BaseGump gump = User.FindGump();
if (gump != null)
{
gump.Refresh();
}
else
{
SendGump(new PetTrainingPlanningGump(User, Creature));
}
}
});
break;
}
}
private void ResendGumps(bool sendOptions)
{
Timer.DelayCall(TimeSpan.FromSeconds(.5), () =>
{
BaseGump gump = User.FindGump();
if (gump != null)
{
gump.Refresh();
}
else
{
SendGump(new NewAnimalLoreGump(User, Creature));
}
if (sendOptions)
{
gump = User.FindGump();
if (gump != null)
{
gump.Refresh();
}
else
{
SendGump(new PetTrainingOptionsGump(User, Creature));
}
}
});
}
private bool CheckPowerScroll(SkillName name, int value, ref Item scroll)
{
if (User.Backpack == null)
return false;
scroll = User.Backpack.Items.OfType().FirstOrDefault(ps => ps.Skill == name && ps.Value == 100 + (value / 10));
return scroll != null;
}
}
public class PetTrainingPlanningGump : BaseGump
{
public BaseCreature Creature { get; private set; }
public PetTrainingPlanningGump(PlayerMobile pm, BaseCreature bc)
: base(pm, 50, 200)
{
Creature = bc;
}
public override void AddGumpLayout()
{
TrainingProfile profile = PetTrainingHelper.GetTrainingProfile(Creature, true);
PlanningProfile plan = profile.PlanningProfile;
AddBackground(0, 0, 654, 524, 0x24A4);
AddButton(275, 35, 0x9CC8, 0x9CC7, 1, GumpButtonType.Reply, 0);
AddHtml(275, 38, 126, 20, Center(profile.TrainingMode == TrainingMode.Planning ? "DISABLE" : "ENABLE"), false, false);
AddHtmlLocalized(0, 11, 654, 18, CenterLoc, "#1157591", 0xF424E5, false, false); // Pet Training Planning
AddHtmlLocalized(60, 60, 216, 18, 1044010, 0, false, false); // CATEGORIES
AddHtmlLocalized(275, 60, 216, 18, 1044011, 0, false, false); // SELECTIONS
AddHtmlLocalized(510, 60, 150, 18, 1113586, 0, false, false); // Property Weight:
AddHtmlLocalized(260, 80, 150, 16, 1157490, C32216(0x8B0000), false, false); // Avail. Training Points:
AddLabel(510, 80, 0, profile.TrainingPoints.ToString());
int y = 95;
int total = 0;
for (int i = 0; i < plan.Entries.Count; i++)
{
PlanningProfile.PlanningEntry entry = plan.Entries[i];
AddButton(25, y, 4017, 4019, i + 100, GumpButtonType.Reply, 0);
AddHtmlLocalized(60, y, 200, 18, PetTrainingHelper.GetCategoryLocalization(entry.TrainPoint), false, false);
TextDefinition[] loc = PetTrainingHelper.GetLocalization(entry.TrainPoint);
if (loc[0] != null)
{
if (loc[0].Number > 0)
{
AddHtmlLocalized(260, y, 200, 18, loc[0], false, false);
}
else if (loc[0].String != null)
{
AddHtml(260, y, 200, 18, loc[0].String, false, false);
}
}
int value = entry.TrainPoint is SkillName ? entry.Value + 1000 : entry.Value;
AddLabel(460, y, entry.Value == 0 ? 0x27 : 0, value.ToString());
AddLabel(510, y, entry.Cost == 0 ? 0x27 : 0, string.Format("-{0}", entry.Cost));
total += entry.Cost;
y += 22;
}
int remaining = profile.TrainingPoints - total;
AddHtmlLocalized(260, y, 200, 18, 1157599, C32216(0x8B0000), false, false); // Remaining Training Points:
AddLabel(510, y + 5, remaining < profile.TrainingPoints ? 0x27 : 0, remaining.ToString());
}
public override void OnResponse(RelayInfo info)
{
int id = info.ButtonID;
if (id == 0)
return;
TrainingProfile profile = PetTrainingHelper.GetTrainingProfile(Creature, true);
PlanningProfile plan = profile.PlanningProfile;
if (id == 1)
{
if (profile.TrainingMode == TrainingMode.Planning)
{
profile.TrainingMode = TrainingMode.Regular;
User.SendLocalizedMessage(1157598); // You have disabled pet training planning.
}
else
{
profile.TrainingMode = TrainingMode.Planning;
User.SendLocalizedMessage(1157597); // You have enabled pet training planning. All pet training selections will be added to the planning gump which will display up to 20 training options. For more details view the information gump.
}
BaseGump gump = User.FindGump();
if (gump != null)
{
gump.Refresh();
}
Refresh();
}
else
{
id = id - 100;
if (id >= 0 && id < plan.Entries.Count)
{
plan.Entries.RemoveAt(id);
User.SendLocalizedMessage(1157593); // Your selection has been removed to your training plan.
}
Refresh();
}
}
}
public class PetTrainingInfoGump : BaseGump
{
public PetTrainingInfoGump(PlayerMobile pm)
: base(pm, 50, 200)
{
}
public override void AddGumpLayout()
{
AddPage(0);
AddBackground(0, 0, 654, 500, 0x24A4);
AddHtmlLocalized(0, 45, 654, 16, CenterLoc, "#1157527", 0xF424E5, false, false); // Discovering Animal Training
AddPage(1);
AddHtmlLocalized(30, 75, 590, 380, 1157558, true, true);
AddButton(560, 45, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 4);
AddButton(585, 45, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 2);
AddPage(2);
AddHtmlLocalized(30, 75, 590, 380, 1157563, true, true);
AddButton(560, 45, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 1);
AddButton(585, 45, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 3);
AddPage(3);
AddHtmlLocalized(30, 75, 590, 380, 1157552, true, true);
AddButton(560, 45, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 2);
AddButton(585, 45, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 4);
AddPage(4);
AddHtmlLocalized(30, 75, 590, 380, 1157553, true, true);
AddButton(560, 45, 0x15E3, 0x15E7, 0, GumpButtonType.Page, 3);
AddButton(585, 45, 0x15E1, 0x15E5, 0, GumpButtonType.Page, 1);
}
}
}