|
||
|
|||||||
| Custom Script Releases This forum is where you can release your custom scripts for other users to use. Please note: By releasing your scripts here you are submitting them to the public and as such agree to make them public domain. The RunUO Team has made its software GPL for you to use and enjoy you should do the same for anything based off of RunUO. |
![]() |
|
|
Thread Tools | Display Modes |
|
|
#1 (permalink) | |
|
Newbie
Join Date: Oct 2007
Posts: 35
|
Hello Everyone,
I've yet to release anything on RunUO but I've been programming a new shard for the past several months. During this time, we implemented FS: Animal Taming Systems and it was very bulky, added a long time to our saves, and added some un-needed server stress because some unusual ways of solving some difficult programming problems. Most importantly, it was to hard to balance our shard. Having said that, I thank RoninGT for all of his work and excellent ideas on this concept. *bows* Jerbal Animal Kombat-ology v1.0.1 Jako Leveling Last Updated: August 8th, 2008 This package includes:
Allows players pets to gain experience and increase attributes with each level. Fully scalable and easily edited to preserve a shards balance and/or add new features that were not originally released No new gumps have been introduced for pet leveling as it all is slipped into the Animal Lore Gump. See stats.png and characteristics.png. By Default, players only know a pets max level and sex after taming them. The characteristics page in Animal Lore and the tamed on hover text does not display this information until after it has been tamed. At each level, the pet gains 1 trait point (except at level 10 it receives two). With these trait points, the tamer can boost some of the pets stats. The number of trait points consumed per stat increase and the number of points increased are both able to be easily changed or edited to help preserve the shard's already existing balance. Currently the configuration is: Hits: +2 Max Hits/1 trait Stam:+5 Max Stam/1 trait Mana: +2 Max Mana/1 trait Bonus To One Resist: +2 to one resistance/5 traits Each stat scales, keeping the original intention of the creatures statistics. In this way, we can always be certain that a White Wyrm does not have as much Fire Resistance as Cold Resistance and we will know what they are still weakest to. To insure that a creature's stats do not go to high, caps are in place. Bonuses added from this taming system can be capped at a specific value to help already existing high values not become too high. As in the image below, Cold Resistance is at 84% which is above the default 65% cap. It displays 84% is the maximum and places a lock on the stat increase. Players are not able to increase this stat any further else they may reach 100% resistance in one school, etc. On Death, the pet loses a percentage of it's current experience to level. This can cause a pet to lose a level, but still have all of it's traits and abilities. Certain Functions can be overridden in creatures to limit the amount of experience they give when they die, how much experience they need to level (if tamed), how many traits they get per level, and just about everything else. After a specified level, by default 10, a pet is able to breed with another pet of the same type and opposite sex. This breeding will allow their offspring to have a max level equal to the average of the parent's levels + 1. This process takes time and money and is done though a new NPC called a breeder who can also serve the function as an animal tamer. (see breedContract.png) Quote:
Extract to Customs Folder. Merge BaseCreature.cs and AnimalLore.cs with your current versions. Excuse the multiple posts. I wasn't able to change the title of the thread, which indicated that the script wasn't finished when it was. Thank you! -Jerbal
__________________
The Second Coming, an experience like no other uo.jerbal.com Last edited by Jerbal; 08-27-2008 at 10:15 PM. |
|
|
|
|
|
|
#2 (permalink) |
|
Newbie
Join Date: Oct 2007
Posts: 35
|
/************************************************** ***********************
* Jerbal Animal Kombat-ology * Jako v1.0.1 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * ************************************************** ***********************/ - Known Issues - Potential Shard Crashes when a pet is killed while breeding hasn't been completed. Potential Exploit by breeding and using the confirm gump as a pet-life-safer/recall/etc. - Future Changes - Code optimization to better performance. Code optimization to reduce this package's server compile time. Code removal from BaseCreature.cs to make updates as easy as replacing a file. //****************************** Version 1.0.1 Date: August 8th, 2008 - Update Instructions from v1.0.0 to v1.0.1 - 1) Update Line 259 and 260 of JakoBreeder.cs from: from.SendMessage("But this is testing, so I'm moving on anyway."); //return false; to: //from.SendMessage("But this is testing, so I'm moving on anyway."); return false; - File List - JakoBreeder.cs : Removed a debug line so that players must wait the full breeding time to retrieve their pets. //****************************** Version 1.0.0 Date: August 7th, 2008 - Update Instructions from Alpha to v1.0.0 - 1) Replace the folder Custom/Jerbal/Jako with /Custom/Jerbal/Jako found in this .rar. 2) Update Line 4161 of BaseCreature from: list.Add("Level {0} {1}", m_level, SexString); to: list.Add("Level {0} {1}", m_realLevel, SexString); - File List - BaseCreature.cs : Changed the Level Display to display Real Level and not current level to remove a potential exploit while having a pet look level 1 but be a much higher level by purposefully killing it for EXP loss. AnimalLore.cs : No Changes Custom/Jerbal/Jako/Attributes/ : No changes to Attributes or related files other than organization. Added Custom/Jerbal/Jako/Breeding/ BreedingGumps.cs BreedingParentTicket.cs JakoBreeder.cs //******************************
__________________
The Second Coming, an experience like no other uo.jerbal.com |
|
|
|
|
|
#6 (permalink) |
|
Forum Novice
Join Date: Dec 2003
Posts: 151
|
It works after playing around with it for a few hrs thanks alot for this post ....do you use the BOD
with the shard you are playing on ? that is all i am missing now ![]()
__________________
<a href="http://wappyworld.com/phpBB2/portal.php"</a> |
|
|
|
|
|
#7 (permalink) | |
|
Forum Novice
Join Date: Oct 2003
Posts: 222
|
I'm getting this error when I install and merge this script.
Quote:
Code:
using System;
using Server;
using Server.Gumps;
using Server.Mobiles;
using Server.Targeting;
using Custom.Jerbal.Jako;
namespace Server.SkillHandlers
{
public class AnimalLore
{
public static void Initialize()
{
SkillInfo.Table[(int)SkillName.AnimalLore].Callback = new SkillUseCallback( OnUse );
}
public static TimeSpan OnUse(Mobile m)
{
m.Target = new InternalTarget();
m.SendLocalizedMessage( 500328 ); // What animal should I look at?
return TimeSpan.FromSeconds( 1.0 );
}
private class InternalTarget : Target
{
public InternalTarget() : base( 8, false, TargetFlags.None )
{
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( !from.Alive )
{
from.SendLocalizedMessage( 500331 ); // The spirits of the dead are not the province of animal lore.
}
else if ( targeted is BaseCreature )
{
BaseCreature c = (BaseCreature)targeted;
if ( !c.IsDeadPet )
{
if ( c.Body.IsAnimal || c.Body.IsMonster || c.Body.IsSea )
{
if ( (!c.Controlled || !c.Tamable) && from.Skills[SkillName.AnimalLore].Base < 100.0 )
{
from.SendLocalizedMessage( 1049674 ); // At your skill level, you can only lore tamed creatures.
}
else if ( !c.Tamable && from.Skills[SkillName.AnimalLore].Base < 110.0 )
{
from.SendLocalizedMessage( 1049675 ); // At your skill level, you can only lore tamed or tameable creatures.
}
else if ( !from.CheckTargetSkill( SkillName.AnimalLore, c, 0.0, 120.0 ) )
{
from.SendLocalizedMessage( 500334 ); // You can't think of anything you know offhand.
}
else
{
from.CloseGump( typeof( AnimalLoreGump ) );
from.SendGump( new AnimalLoreGump( c ) );
}
}
else
{
from.SendLocalizedMessage( 500329 ); // That's not an animal!
}
}
else
{
from.SendLocalizedMessage( 500331 ); // The spirits of the dead are not the province of animal lore.
}
}
else
{
from.SendLocalizedMessage( 500329 ); // That's not an animal!
}
}
}
}
public class AnimalLoreGump : Gump
{
private BaseCreature m_bc;
private static string FormatSkill( BaseCreature c, SkillName name )
{
Skill skill = c.Skills[name];
if ( skill.Base < 10.0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0:F1}</div>", skill.Base );
}
#region Jako Taming
private static string FormatAttributes(int cur, uint max)
{
return FormatAttributes(cur, (int)max);
}
#endregion
private static string FormatAttributes( int cur, int max )
{
if ( max == 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}/{1}</div>", cur, max );
}
private static string FormatStat( int val )
{
if ( val == 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}</div>", val );
}
private static string FormatDouble( double val )
{
if ( val == 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0:F1}</div>", val );
}
private static string FormatElement( int val )
{
if ( val <= 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}%</div>", val );
}
#region Mondain's Legacy
private static string FormatDamage( int min, int max )
{
if ( min <= 0 || max <= 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}-{1}</div>", min, max );
}
#endregion
private const int LabelColor = 0x24E5;
public AnimalLoreGump( BaseCreature c ) : base( 250, 50 )
{
#region Jako Taming Added
m_bc = c;
#endregion
AddPage( 0 );
AddImage( 100, 100, 2080 );
AddImage( 118, 137, 2081 );
AddImage( 118, 207, 2081 );
AddImage( 118, 277, 2081 );
AddImage( 118, 347, 2083 );
AddHtml( 147, 108, 210, 18, String.Format( "<center><i>{0}</i></center>", c.Name ), false, false );
AddButton( 240, 77, 2093, 2093, 2, GumpButtonType.Reply, 0 );
AddImage( 140, 138, 2091 );
AddImage( 140, 335, 2091 );
#region Jako Taming Edited
int pages = ( Core.AOS ? 5 : 3 ) + ( c.JakoIsEnabled ? 1 : 0 ) + (c.Controlled && c.ControlMaster != null ? 1 : 0);
#endregion
int page = 0;
#region Attributes
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 1049593, 200, false, false ); // Attributes
AddHtmlLocalized( 153, 168, 160, 18, 1049578, LabelColor, false, false ); // Hits
AddHtml( 280, 168, 75, 18, FormatAttributes( c.Hits, c.HitsMax ), false, false );
AddHtmlLocalized( 153, 186, 160, 18, 1049579, LabelColor, false, false ); // Stamina
AddHtml( 280, 186, 75, 18, FormatAttributes( c.Stam, c.StamMax ), false, false );
AddHtmlLocalized( 153, 204, 160, 18, 1049580, LabelColor, false, false ); // Mana
AddHtml( 280, 204, 75, 18, FormatAttributes( c.Mana, c.ManaMax ), false, false );
AddHtmlLocalized( 153, 222, 160, 18, 1028335, LabelColor, false, false ); // Strength
AddHtml( 320, 222, 35, 18, FormatStat( c.Str ), false, false );
AddHtmlLocalized( 153, 240, 160, 18, 3000113, LabelColor, false, false ); // Dexterity
AddHtml( 320, 240, 35, 18, FormatStat( c.Dex ), false, false );
AddHtmlLocalized( 153, 258, 160, 18, 3000112, LabelColor, false, false ); // Intelligence
AddHtml( 320, 258, 35, 18, FormatStat( c.Int ), false, false );
if ( Core.AOS )
{
int y = 276;
if ( Core.SE )
{
double bd = Items.BaseInstrument.GetBaseDifficulty( c );
if ( c.Uncalmable )
bd = 0;
AddHtmlLocalized( 153, 276, 160, 18, 1070793, LabelColor, false, false ); // Barding Difficulty
AddHtml( 320, y, 35, 18, FormatDouble( bd ), false, false );
y += 18;
}
AddImage( 128, y + 2, 2086 );
AddHtmlLocalized( 147, y, 160, 18, 1049594, 200, false, false ); // Loyalty Rating
y += 18;
AddHtmlLocalized( 153, y, 160, 18, (!c.Controlled || c.Loyalty == 0) ? 1061643 : 1049595 + (c.Loyalty / 10), LabelColor, false, false );
}
else
{
AddImage( 128, 278, 2086 );
AddHtmlLocalized( 147, 276, 160, 18, 3001016, 200, false, false ); // Miscellaneous
AddHtmlLocalized( 153, 294, 160, 18, 1049581, LabelColor, false, false ); // Armor Rating
AddHtml( 320, 294, 35, 18, FormatStat( c.VirtualArmor ), false, false );
}
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, pages );
#endregion
#region Resistances
if ( Core.AOS )
{
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 1061645, 200, false, false ); // Resistances
AddHtmlLocalized( 153, 168, 160, 18, 1061646, LabelColor, false, false ); // Physical
AddHtml( 320, 168, 35, 18, FormatElement( c.PhysicalResistance ), false, false );
AddHtmlLocalized( 153, 186, 160, 18, 1061647, LabelColor, false, false ); // Fire
AddHtml( 320, 186, 35, 18, FormatElement( c.FireResistance ), false, false );
AddHtmlLocalized( 153, 204, 160, 18, 1061648, LabelColor, false, false ); // Cold
AddHtml( 320, 204, 35, 18, FormatElement( c.ColdResistance ), false, false );
AddHtmlLocalized( 153, 222, 160, 18, 1061649, LabelColor, false, false ); // Poison
AddHtml( 320, 222, 35, 18, FormatElement( c.PoisonResistance ), false, false );
AddHtmlLocalized( 153, 240, 160, 18, 1061650, LabelColor, false, false ); // Energy
AddHtml( 320, 240, 35, 18, FormatElement( c.EnergyResistance ), false, false );
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1 );
}
#endregion
#region Damage
if ( Core.AOS )
{
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 1017319, 200, false, false ); // Damage
AddHtmlLocalized( 153, 168, 160, 18, 1061646, LabelColor, false, false ); // Physical
AddHtml( 320, 168, 35, 18, FormatElement( c.PhysicalDamage ), false, false );
AddHtmlLocalized( 153, 186, 160, 18, 1061647, LabelColor, false, false ); // Fire
AddHtml( 320, 186, 35, 18, FormatElement( c.FireDamage ), false, false );
AddHtmlLocalized( 153, 204, 160, 18, 1061648, LabelColor, false, false ); // Cold
AddHtml( 320, 204, 35, 18, FormatElement( c.ColdDamage ), false, false );
AddHtmlLocalized( 153, 222, 160, 18, 1061649, LabelColor, false, false ); // Poison
AddHtml( 320, 222, 35, 18, FormatElement( c.PoisonDamage ), false, false );
AddHtmlLocalized( 153, 240, 160, 18, 1061650, LabelColor, false, false ); // Energy
AddHtml( 320, 240, 35, 18, FormatElement( c.EnergyDamage ), false, false );
#region Mondain's Legacy
if ( Core.ML )
{
AddHtmlLocalized( 153, 258, 160, 18, 1076750, LabelColor, false, false ); // Base Damage
AddHtml( 320, 258, 35, 18, FormatDamage( c.DamageMin, c.DamageMax ), false, false );
}
#endregion
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1 );
}
#endregion
#region Skills
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 3001030, 200, false, false ); // Combat Ratings
AddHtmlLocalized( 153, 168, 160, 18, 1044103, LabelColor, false, false ); // Wrestling
AddHtml( 320, 168, 35, 18, FormatSkill( c, SkillName.Wrestling ), false, false );
AddHtmlLocalized( 153, 186, 160, 18, 1044087, LabelColor, false, false ); // Tactics
AddHtml( 320, 186, 35, 18, FormatSkill( c, SkillName.Tactics ), false, false );
AddHtmlLocalized( 153, 204, 160, 18, 1044086, LabelColor, false, false ); // Magic Resistance
AddHtml( 320, 204, 35, 18, FormatSkill( c, SkillName.MagicResist ), false, false );
AddHtmlLocalized( 153, 222, 160, 18, 1044061, LabelColor, false, false ); // Anatomy
AddHtml( 320, 222, 35, 18, FormatSkill( c, SkillName.Anatomy ), false, false );
#region Mondain's Legacy
if ( c is CuSidhe )
{
AddHtmlLocalized( 153, 240, 160, 18, 1044077, LabelColor, false, false ); // Healing
AddHtml( 320, 240, 35, 18, FormatSkill( c, SkillName.Healing ), false, false );
}
else
{
AddHtmlLocalized( 153, 240, 160, 18, 1044090, LabelColor, false, false ); // Poisoning
AddHtml( 320, 240, 35, 18, FormatSkill( c, SkillName.Poisoning ), false, false );
}
#endregion
AddImage( 128, 260, 2086 );
AddHtmlLocalized( 147, 258, 160, 18, 3001032, 200, false, false ); // Lore & Knowledge
AddHtmlLocalized( 153, 276, 160, 18, 1044085, LabelColor, false, false ); // Magery
AddHtml( 320, 276, 35, 18, FormatSkill( c, SkillName.Magery ), false, false );
AddHtmlLocalized( 153, 294, 160, 18, 1044076, LabelColor, false, false ); // Evaluating Intelligence
AddHtml( 320, 294, 35, 18,FormatSkill( c, SkillName.EvalInt ), false, false );
AddHtmlLocalized( 153, 312, 160, 18, 1044106, LabelColor, false, false ); // Meditation
AddHtml( 320, 312, 35, 18, FormatSkill( c, SkillName.Meditation ), false, false );
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1 );
#endregion
#region Jako Taming | Skills
if (c.Tamable)
{
#region Jako Taming When Tamed
if (c.Controlled && c.ControlMaster != null)
{
AddPage(++page);
AddImage(128, 152, 2086);
AddHtml(147, 150, 160, 18, "<basefont color=#003142>Characteristics</basefont>", false, false);
AddHtml(153, 168, 160, 18, "<basefont color=#4A3929>Level</basefont>", false, false);
AddHtml(280, 168, 75, 18, FormatAttributes((int)c.Level, (int)c.MaxLevel), false, false);
AddHtml(153, 186, 160, 18, "<basefont color=#4A3929>Traits Remaining</basefont>", false, false);
AddHtml(280, 186, 75, 18, FormatStat((int)c.Traits), false, false);
AddHtml(153, 204, 160, 18, "<basefont color=#4A3929>Mating Level</basefont>", false, false);
AddHtml(280, 204, 75, 18, FormatStat((int)c.MatingLevel), false, false);
AddHtml(153, 222, 160, 18, "<basefont color=#4A3929>Sex</basefont>", false, false);
AddHtml(320, 222, 35, 18, FormatString(c.SexString), false, false);
AddHtml(153, 240, 160, 18, "<basefont color=#4A3929>Experience Earned</basefont>", false, false);
AddHtml(320, 240, 35, 18, FormatStat((int)c.Experience), false, false);
AddHtml(153, 258, 160, 18, "<basefont color=#4A3929>Experience Needed</basefont>", false, false);
AddHtml(320, 258, 35, 18, FormatStat((int)c.ExpToNextLevel), false, false);
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
}
#endregion
#region Jako Taming Max Stats/Attributes
AddPage(++page);
AddImage(128, 152, 2086);
AddHtml(147, 150, 160, 18, "<basefont color=#003142>Max Resistances</basefont>", false, false); // Resistances
AddHtmlLocalized(153, 168, 160, 18, 1061646, LabelColor, false, false); // Physical
AddHtml(280, 168, 75, 18, FormatAttributes(c.PhysicalResistance, c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusPhysResist).MaxBonus(c)), false, false);
AddHtmlLocalized(153, 186, 160, 18, 1061647, LabelColor, false, false); // Fire
AddHtml(280, 186, 75, 18, FormatAttributes(c.FireResistance, c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusFireResist).MaxBonus(c)), false, false);
AddHtmlLocalized(153, 204, 160, 18, 1061648, LabelColor, false, false); // Cold
AddHtml(280, 204, 75, 18, FormatAttributes(c.ColdResistance, c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusColdResist).MaxBonus(c)), false, false);
AddHtmlLocalized(153, 222, 160, 18, 1061649, LabelColor, false, false); // Poison
AddHtml(280, 222, 75, 18, FormatAttributes(c.PoisonResistance, c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusPoisResist).MaxBonus(c)), false, false);
AddHtmlLocalized(153, 240, 160, 18, 1061650, LabelColor, false, false); // Energy
AddHtml(280, 240, 75, 18, FormatAttributes(c.EnergyResistance, c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusEnerResist).MaxBonus(c)), false, false);
AddImage(128, 260, 2086);
AddHtml(147, 258, 160, 18, "<basefont color=#003142>Max Attributes</basefont>", false, false); // Lore & Knowledge
AddHtmlLocalized(153, 276, 160, 18, 1049578, LabelColor, false, false); // Hits
AddHtml(280, 276, 75, 18, FormatAttributes(c.HitsMax, c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Hits).MaxBonus(c)), false, false);
AddHtmlLocalized(153, 294, 160, 18, 1049579, LabelColor, false, false); // Stamina
AddHtml(280, 294, 75, 18, FormatAttributes(c.StamMax, c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Stam).MaxBonus(c)), false, false);
AddHtmlLocalized(153, 312, 160, 18, 1049580, LabelColor, false, false); // Mana
AddHtml(280, 312, 75, 18, FormatAttributes(c.ManaMax, c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Mana).MaxBonus(c)), false, false);
if (c.ControlMaster == m)
{
Int32 locked = 0x82C;
Int32 up = 0x983;
Int32 b1004 = (c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusPhysResist).MaxBonus(c) <= c.PhysicalResistance ? locked : up);
Int32 b1005 = (c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusFireResist).MaxBonus(c) <= c.FireResistance ? locked : up);
Int32 b1006 = (c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusColdResist).MaxBonus(c) <= c.ColdResistance ? locked : up);
Int32 b1007 = (c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusPoisResist).MaxBonus(c) <= c.PoisonResistance ? locked : up);
Int32 b1008 = (c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusEnerResist).MaxBonus(c) <= c.EnergyResistance ? locked : up);
Int32 b1001 = (c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Hits).MaxBonus(c) <= c.HitsMax ? locked : up);
Int32 b1002 = (c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Stam).MaxBonus(c) <= c.StamMax ? locked : up);
Int32 b1003 = (c.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Mana).MaxBonus(c) <= c.ManaMax ? locked : up);
AddButton(130, 168, b1004, b1004, 1004, GumpButtonType.Reply, 0);
AddButton(130, 186, b1005, b1005, 1005, GumpButtonType.Reply, 0);
AddButton(130, 204, b1006, b1006, 1006, GumpButtonType.Reply, 0);
AddButton(130, 222, b1007, b1007, 1007, GumpButtonType.Reply, 0);
AddButton(130, 240, b1008, b1008, 1008, GumpButtonType.Reply, 0);
AddButton(130, 276, b1001, b1001, 1001, GumpButtonType.Reply, 0);
AddButton(130, 294, b1002, b1002, 1002, GumpButtonType.Reply, 0);
AddButton(130, 312, b1003, b1003, 1003, GumpButtonType.Reply, 0);
}
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
#endregion
}
#endregion
#region Misc
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 1049563, 200, false, false ); // Preferred Foods
int foodPref = 3000340;
if ( (c.FavoriteFood & FoodType.FruitsAndVegies) != 0 )
foodPref = 1049565; // Fruits and Vegetables
else if ( (c.FavoriteFood & FoodType.GrainsAndHay) != 0 )
foodPref = 1049566; // Grains and Hay
else if ( (c.FavoriteFood & FoodType.Fish) != 0 )
foodPref = 1049568; // Fish
else if ( (c.FavoriteFood & FoodType.Meat) != 0 )
foodPref = 1049564; // Meat
AddHtmlLocalized( 153, 168, 160, 18, foodPref, LabelColor, false, false );
AddImage( 128, 188, 2086 );
AddHtmlLocalized( 147, 186, 160, 18, 1049569, 200, false, false ); // Pack Instincts
int packInstinct = 3000340;
if ( (c.PackInstinct & PackInstinct.Canine) != 0 )
packInstinct = 1049570; // Canine
else if ( (c.PackInstinct & PackInstinct.Ostard) != 0 )
packInstinct = 1049571; // Ostard
else if ( (c.PackInstinct & PackInstinct.Feline) != 0 )
packInstinct = 1049572; // Feline
else if ( (c.PackInstinct & PackInstinct.Arachnid) != 0 )
packInstinct = 1049573; // Arachnid
else if ( (c.PackInstinct & PackInstinct.Daemon) != 0 )
packInstinct = 1049574; // Daemon
else if ( (c.PackInstinct & PackInstinct.Bear) != 0 )
packInstinct = 1049575; // Bear
else if ( (c.PackInstinct & PackInstinct.Equine) != 0 )
packInstinct = 1049576; // Equine
else if ( (c.PackInstinct & PackInstinct.Bull) != 0 )
packInstinct = 1049577; // Bull
AddHtmlLocalized( 153, 204, 160, 18, packInstinct, LabelColor, false, false );
if ( !Core.AOS )
{
AddImage( 128, 224, 2086 );
AddHtmlLocalized( 147, 222, 160, 18, 1049594, 200, false, false ); // Loyalty Rating
AddHtmlLocalized( 153, 240, 160, 18, (!c.Controlled || c.Loyalty == 0) ? 1061643 : 1049595 + (c.Loyalty / 10), LabelColor, false, false );
}
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1 );
#endregion
}
public override void OnResponse(Server.Network.NetState sender, RelayInfo info)
{
Mobile from = sender.Mobile;
String reply = "" ;
switch (info.ButtonID)
{
case 1001: reply = m_bc.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Hits).DoOnClick(m_bc); break;
case 1002: reply = m_bc.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Stam).DoOnClick(m_bc); break;
case 1003: reply = m_bc.m_jakoAttributes.GetAttribute(JakoAttributesEnum.Mana).DoOnClick(m_bc); break;
case 1004: reply = m_bc.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusPhysResist).DoOnClick(m_bc); break;
case 1005: reply = m_bc.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusFireResist).DoOnClick(m_bc); break;
case 1006: reply = m_bc.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusColdResist).DoOnClick(m_bc); break;
case 1007: reply = m_bc.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusPoisResist).DoOnClick(m_bc); break;
case 1008: reply = m_bc.m_jakoAttributes.GetAttribute(JakoAttributesEnum.BonusEnerResist).DoOnClick(m_bc); break;
}
if (reply != null)
from.SendMessage(reply);
base.OnResponse(sender, info);
}
}
}
|
|
|
|
|
|
|
#8 (permalink) |
|
Newbie
Join Date: Oct 2007
Posts: 35
|
You didn't merge AnimalLore.cs correctly.
Line 16 should be: Code:
from.SendGump( new AnimalLoreGump( c, from ) ); Code:
public AnimalLoreGump( BaseCreature c, Mobile m ) : base( 250, 50 ) Under: Code:
private static string FormatElement( int val )
{
if ( val <= 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}%</div>", val );
}
Code:
private static string FormatString(string str)
{
if (str.Length == 0)
return "<div align=right>---</div>";
return String.Format("<div align=right>{0}</div>",str);
}
__________________
The Second Coming, an experience like no other uo.jerbal.com |
|
|
|
|
|
#9 (permalink) |
|
Newbie
Join Date: Oct 2007
Posts: 35
|
Yes, we use the taming bod system that RoninGT developed. You shouldn't have to do anything to your creatures (and I think only one or two playermobile serializables if any) and off you go. I would have to double check, but I think that's what we're doing/how it's done.
__________________
The Second Coming, an experience like no other uo.jerbal.com |
|
|
|
|
|
#10 (permalink) |
|
Forum Novice
|
Looks cool. Now I got a question for you... Is there a set of instructions for this to be installed if you are using the pet breeding pack from Ronin? I like the breeding setup and am happy enough with the level side of things, but I think it would be cooler to have this set work with breeding too (or is breeding included also?) - and the idea about the hiding the max level and sex until tamed is a great idea (I plan on eventually modding the FSATS to do that too if this will not work with the other set).
GreyWolf. |
|
|
|
|
|
#11 (permalink) |
|
Newbie
Join Date: Oct 2007
Posts: 35
|
This is designed to be a replacement for the breeding and pet leveling system that RoninGT developed. This package just includes pet leveling and breeding, just as FS: Taming has, but done in a more controlled and with less serializing. In that sense, this is a replacement for FS:Taming JUST for the breeding and leveling aspect. This does not includes bods or shrink, etc, but there is a shrink system that should globally work regardless of basecreature edits and you can use the bod system with out having the taming from RoninGT.
If I understand your question right, you could convert from FS:Taming to Jako with some moderate work in serialize/deserialze, where users would not lose their current creature level, but they WOULD lose the pet abilities that they have invested in and such. Those users could be given the talent points for the new system to make up for what they had lost during the serialize/deserialize conversion. Let me know if this answers your questions! -Jerbal
__________________
The Second Coming, an experience like no other uo.jerbal.com |
|
|
|
|
|
#12 (permalink) |
|
Forum Novice
|
It does actually clear some stuff up for me. Would it be possible to speak with you later (might not be able to until the weekend or else late at night - like 9 or 10 pm mountain time which is 11-12 eastern time)? I would like to try to convert to this, it sounds cool and looks very nice. And I do not really have any worries about losses since right now my player base is 1 (me).
GreyWolf. |
|
|
|
|
|
#13 (permalink) |
|
Newbie
Join Date: Oct 2007
Posts: 35
|
If you're not worried about losing content, then the switch is easy:
Comment out all of the FS Taming Serialize edits. On my shard it starts with: Code:
// Version 17 FS:ATS EDITS writer.Write( (bool) m_IsMating ); Code:
writer.Write( (int) m_FireBreathAttack ); Code:
if ( version == 17 )//FS:ATS
{
reader.ReadBool(); //m_IsMating =
reader.ReadInt(); //m_ABPoints =
reader.ReadInt(); //m_Exp =
reader.ReadInt(); //m_NextLevel =
reader.ReadInt(); //m_Level =
reader.ReadInt(); //m_MaxLevel =
...
reader.ReadInt(); //m_FireBreathAttack =
}
If you were worried about the creatures level, although they wouldn't mean the same thing, you could easily do something like this in your deserialize: Code:
if ( version == 17 )//FS:ATS
{
reader.ReadBool(); //m_IsMating =
reader.ReadInt(); //m_ABPoints =
reader.ReadInt(); //m_Exp =
reader.ReadInt(); //m_NextLevel =
setLevel((uint)reader.ReadInt(),false); //m_Level =
reader.ReadInt(); //m_MaxLevel =
...
reader.ReadInt(); //m_FireBreathAttack =
}
-Jerbal
__________________
The Second Coming, an experience like no other uo.jerbal.com Last edited by Jerbal; 08-27-2008 at 10:13 PM. Reason: code tags |
|
|
|
|
|
#15 (permalink) | |
|
Forum Novice
Join Date: Oct 2003
Posts: 222
|
I broke it again. Hopefully it's an easy oversight like the last time. I've gone over it a couple of times and just don't understand. Quote:
Code:
using System;
using Server;
using Server.Gumps;
using Server.Mobiles;
using Server.Targeting;
using Custom.Jerbal.Jako;
namespace Server.SkillHandlers
{
public class AnimalLore
{
public static void Initialize()
{
SkillInfo.Table[(int)SkillName.AnimalLore].Callback = new SkillUseCallback( OnUse );
}
public static TimeSpan OnUse(Mobile m)
{
m.Target = new InternalTarget();
m.SendLocalizedMessage( 500328 ); // What animal should I look at?
return TimeSpan.FromSeconds( 1.0 );
}
private class InternalTarget : Target
{
public InternalTarget() : base( 8, false, TargetFlags.None )
{
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( !from.Alive )
{
from.SendLocalizedMessage( 500331 ); // The spirits of the dead are not the province of animal lore.
}
else if ( targeted is BaseCreature )
{
BaseCreature c = (BaseCreature)targeted;
if ( !c.IsDeadPet )
{
if ( c.Body.IsAnimal || c.Body.IsMonster || c.Body.IsSea )
{
if ( (!c.Controlled || !c.Tamable) && from.Skills[SkillName.AnimalLore].Base < 100.0 )
{
from.SendLocalizedMessage( 1049674 ); // At your skill level, you can only lore tamed creatures.
}
else if ( !c.Tamable && from.Skills[SkillName.AnimalLore].Base < 110.0 )
{
from.SendLocalizedMessage( 1049675 ); // At your skill level, you can only lore tamed or tameable creatures.
}
else if ( !from.CheckTargetSkill( SkillName.AnimalLore, c, 0.0, 120.0 ) )
{
from.SendLocalizedMessage( 500334 ); // You can't think of anything you know offhand.
}
else
{
from.CloseGump( typeof( AnimalLoreGump ) );
from.SendGump( new AnimalLoreGump( c, from ) );
}
}
else
{
from.SendLocalizedMessage( 500329 ); // That's not an animal!
}
}
else
{
from.SendLocalizedMessage( 500331 ); // The spirits of the dead are not the province of animal lore.
}
}
else
{
from.SendLocalizedMessage( 500329 ); // That's not an animal!
}
}
}
}
public class AnimalLoreGump : Gump
{
private BaseCreature m_bc;
private static string FormatSkill( BaseCreature c, SkillName name )
{
Skill skill = c.Skills[name];
if ( skill.Base < 10.0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0:F1}</div>", skill.Base );
}
#region Jako Taming
private static string FormatAttributes(int cur, uint max)
{
return FormatAttributes(cur, (int)max);
}
#endregion
private static string FormatAttributes( int cur, int max )
{
if ( max == 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}/{1}</div>", cur, max );
}
private static string FormatStat( int val )
{
if ( val == 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}</div>", val );
}
private static string FormatDouble( double val )
{
if ( val == 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0:F1}</div>", val );
}
private static string FormatElement( int val )
{
if ( val <= 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}%</div>", val );
}
#region Mondain's Legacy
private static string FormatDamage( int min, int max )
{
if ( min <= 0 || max <= 0 )
return "<div align=right>---</div>";
return String.Format( "<div align=right>{0}-{1}</div>", min, max );
}
#endregion
private const int LabelColor = 0x24E5;
public AnimalLoreGump( BaseCreature c, Mobile m ) : base( 250, 50 )
{
#region Jako Taming Added
m_bc = c;
#endregion
AddPage( 0 );
AddImage( 100, 100, 2080 );
AddImage( 118, 137, 2081 );
AddImage( 118, 207, 2081 );
AddImage( 118, 277, 2081 );
AddImage( 118, 347, 2083 );
AddHtml( 147, 108, 210, 18, String.Format( "<center><i>{0}</i></center>", c.Name ), false, false );
AddButton( 240, 77, 2093, 2093, 2, GumpButtonType.Reply, 0 );
AddImage( 140, 138, 2091 );
AddImage( 140, 335, 2091 );
#region Jako Taming Edited
int pages = ( Core.AOS ? 5 : 3 ) + ( c.JakoIsEnabled ? 1 : 0 ) + (c.Controlled && c.ControlMaster != null ? 1 : 0);
#endregion
int page = 0;
#region Attributes
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 1049593, 200, false, false ); // Attributes
AddHtmlLocalized( 153, 168, 160, 18, 1049578, LabelColor, false, false ); // Hits
AddHtml( 280, 168, 75, 18, FormatAttributes( c.Hits, c.HitsMax ), false, false );
AddHtmlLocalized( 153, 186, 160, 18, 1049579, LabelColor, false, false ); // Stamina
AddHtml( 280, 186, 75, 18, FormatAttributes( c.Stam, c.StamMax ), false, false );
AddHtmlLocalized( 153, 204, 160, 18, 1049580, LabelColor, false, false ); // Mana
AddHtml( 280, 204, 75, 18, FormatAttributes( c.Mana, c.ManaMax ), false, false );
AddHtmlLocalized( 153, 222, 160, 18, 1028335, LabelColor, false, false ); // Strength
AddHtml( 320, 222, 35, 18, FormatStat( c.Str ), false, false );
AddHtmlLocalized( 153, 240, 160, 18, 3000113, LabelColor, false, false ); // Dexterity
AddHtml( 320, 240, 35, 18, FormatStat( c.Dex ), false, false );
AddHtmlLocalized( 153, 258, 160, 18, 3000112, LabelColor, false, false ); // Intelligence
AddHtml( 320, 258, 35, 18, FormatStat( c.Int ), false, false );
if ( Core.AOS )
{
int y = 276;
if ( Core.SE )
{
double bd = Items.BaseInstrument.GetBaseDifficulty( c );
if ( c.Uncalmable )
bd = 0;
AddHtmlLocalized( 153, 276, 160, 18, 1070793, LabelColor, false, false ); // Barding Difficulty
AddHtml( 320, y, 35, 18, FormatDouble( bd ), false, false );
y += 18;
}
AddImage( 128, y + 2, 2086 );
AddHtmlLocalized( 147, y, 160, 18, 1049594, 200, false, false ); // Loyalty Rating
y += 18;
AddHtmlLocalized( 153, y, 160, 18, (!c.Controlled || c.Loyalty == 0) ? 1061643 : 1049595 + (c.Loyalty / 10), LabelColor, false, false );
}
else
{
AddImage( 128, 278, 2086 );
AddHtmlLocalized( 147, 276, 160, 18, 3001016, 200, false, false ); // Miscellaneous
AddHtmlLocalized( 153, 294, 160, 18, 1049581, LabelColor, false, false ); // Armor Rating
AddHtml( 320, 294, 35, 18, FormatStat( c.VirtualArmor ), false, false );
}
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, pages );
#endregion
#region Resistances
if ( Core.AOS )
{
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 1061645, 200, false, false ); // Resistances
AddHtmlLocalized( 153, 168, 160, 18, 1061646, LabelColor, false, false ); // Physical
AddHtml( 320, 168, 35, 18, FormatElement( c.PhysicalResistance ), false, false );
AddHtmlLocalized( 153, 186, 160, 18, 1061647, LabelColor, false, false ); // Fire
AddHtml( 320, 186, 35, 18, FormatElement( c.FireResistance ), false, false );
AddHtmlLocalized( 153, 204, 160, 18, 1061648, LabelColor, false, false ); // Cold
AddHtml( 320, 204, 35, 18, FormatElement( c.ColdResistance ), false, false );
AddHtmlLocalized( 153, 222, 160, 18, 1061649, LabelColor, false, false ); // Poison
AddHtml( 320, 222, 35, 18, FormatElement( c.PoisonResistance ), false, false );
AddHtmlLocalized( 153, 240, 160, 18, 1061650, LabelColor, false, false ); // Energy
AddHtml( 320, 240, 35, 18, FormatElement( c.EnergyResistance ), false, false );
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1 );
}
#endregion
#region Damage
if ( Core.AOS )
{
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 1017319, 200, false, false ); // Damage
AddHtmlLocalized( 153, 168, 160, 18, 1061646, LabelColor, false, false ); // Physical
AddHtml( 320, 168, 35, 18, FormatElement( c.PhysicalDamage ), false, false );
AddHtmlLocalized( 153, 186, 160, 18, 1061647, LabelColor, false, false ); // Fire
AddHtml( 320, 186, 35, 18, FormatElement( c.FireDamage ), false, false );
AddHtmlLocalized( 153, 204, 160, 18, 1061648, LabelColor, false, false ); // Cold
AddHtml( 320, 204, 35, 18, FormatElement( c.ColdDamage ), false, false );
AddHtmlLocalized( 153, 222, 160, 18, 1061649, LabelColor, false, false ); // Poison
AddHtml( 320, 222, 35, 18, FormatElement( c.PoisonDamage ), false, false );
AddHtmlLocalized( 153, 240, 160, 18, 1061650, LabelColor, false, false ); // Energy
AddHtml( 320, 240, 35, 18, FormatElement( c.EnergyDamage ), false, false );
#region Mondain's Legacy
if ( Core.ML )
{
AddHtmlLocalized( 153, 258, 160, 18, 1076750, LabelColor, false, false ); // Base Damage
AddHtml( 320, 258, 35, 18, FormatDamage( c.DamageMin, c.DamageMax ), false, false );
}
#endregion
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1 );
}
#endregion
#region Skills
AddPage( ++page );
AddImage( 128, 152, 2086 );
AddHtmlLocalized( 147, 150, 160, 18, 3001030, 200, false, false ); // Combat Ratings
AddHtmlLocalized( 153, 168, 160, 18, 1044103, LabelColor, false, false ); // Wrestling
AddHtml( 320, 168, 35, 18, FormatSkill( c, SkillName.Wrestling ), false, false );
AddHtmlLocalized( 153, 186, 160, 18, 1044087, LabelColor, false, false ); // Tactics
AddHtml( 320, 186, 35, 18, FormatSkill( c, SkillName.Tactics ), false, false );
AddHtmlLocalized( 153, 204, 160, 18, 1044086, LabelColor, false, false ); // Magic Resistance
AddHtml( 320, 204, 35, 18, FormatSkill( c, SkillName.MagicResist ), false, false );
AddHtmlLocalized( 153, 222, 160, 18, 1044061, LabelColor, false, false ); // Anatomy
AddHtml( 320, 222, 35, 18, FormatSkill( c, SkillName.Anatomy ), false, false );
#region Mondain's Legacy
if ( c is CuSidhe )
{
AddHtmlLocalized( 153, 240, 160, 18, 1044077, LabelColor, false, false ); // Healing
AddHtml( 320, 240, 35, 18, FormatSkill( c, SkillName.Healing ), false, false );
}
else
{
AddHtmlLocalized( 153, 240, 160, 18, 1044090, LabelColor, false, false ); // Poisoning
AddHtml( 320, 240, 35, 18, FormatSkill( c, SkillName.Poisoning ), false, false );
}
#endregion
AddImage( 128, 260, 2086 );
AddHtmlLocalized( 147, 258, 160, 18, 3001032, 200, false, false ); // Lore & Knowledge
AddHtmlLocalized( 153, 276, 160, 18, 1044085, LabelColor, false, false ); // Magery
AddHtml( 320, 276, 35, 18, FormatSkill( c, SkillName.Magery ), false, false );
AddHtmlLocalized( 153, 294, 160, 18, 1044076, LabelColor, false, false ); // Evaluating Intelligence
AddHtml( 320, 294, 35, 18,FormatSkill( c, SkillName.EvalInt ), false, false );
AddHtmlLocalized( 153, 312, 160, 18, 1044106, LabelColor, false, false ); // Meditation
AddHtml( 320, 312, 35, 18, FormatSkill( c, SkillName.Meditation ), false, false );
AddButton( 340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1 );
AddButton( 317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1 );
#endregion
#region Jako Taming | Skills
if (c.Tamable)
{
#region Jako Taming When Tamed
if (c.Controlled && c.ControlMaster != null)
{
AddPage(++page);
AddImage(128, 152, 2086);
AddHtml(147, 150, 160, 18, "<basefont color=#003142>Characteristics</basefont>", false, false);
AddHtml(153, 168, 160, 18, "<basefont color=#4A3929>Level</basefont>", false, false);
AddHtml(280, 168, 75, 18, FormatAttributes((int)c.Level, (int)c.MaxLevel), false, false);
AddHtml(153, 186, 160, 18, "<basefont color=#4A3929>Traits Remaining</basefont>", false, false);
AddHtml(280, 186, 75, 18, FormatStat((int)c.Traits), false, false);
AddHtml(153, 204, 160, 18, "<basefont color=#4A3929>Mating Level</basefont>", false, false);
AddHtml(280, 204, 75, 18, FormatStat((int)c.MatingLevel), false, false);
AddHtml(153, 222, 160, 18, "<basefont color=#4A3929>Sex</basefont>", false, false);
AddHtml(320, 222, 35, 18, FormatString(c.SexString), false, false);
AddHtml(153, 240, 160, 18, "<basefont color=#4A3929>Experience Earned</basefont>", false, false);
AddHtml(320, 240, 35, 18, FormatStat((int)c.Experience), false, false);
AddHtml(153, 258, 160, 18, "<basefont color=#4A3929>Experience Needed</basefont>", false, false);
AddHtml(320, 258, 35, 18, FormatStat((int)c.ExpToNextLevel), false, false);
AddButton(340, 358, 5601, 5605, 0, GumpButtonType.Page, page + 1);
AddButton(317, 358, 5603, 5607, 0, GumpButtonType.Page, page - 1);
}
#endregion
#region Jako Taming Max Stats/Attributes
AddPage(++page);
AddImage(128, 152, 2086);
AddHtml(147, 150, 160, 18, "<basefont color=#003142>Max Resistances</ba |