Fixes code according to modern code style. Fixes a few expression bugs.

This commit is contained in:
Kamron Batman 2018-09-15 09:58:51 -07:00
parent 89eea25e5f
commit 970fd563b2
3324 changed files with 441118 additions and 433755 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,224 +1,225 @@
using System;
using System.Collections.Generic;
using Server.Network;
using Server.Targeting;
using Server.Spells;
using Server.Targeting;
namespace Server.Items
{
public class FireHorn : Item
{
public override int LabelNumber => 1060456; // fire horn
public class FireHorn : Item
{
[Constructible]
public FireHorn() : base(0xFC7)
{
Hue = 0x466;
Weight = 1.0;
}
[Constructible]
public FireHorn() : base( 0xFC7 )
{
Hue = 0x466;
Weight = 1.0;
}
public FireHorn(Serial serial) : base(serial)
{
}
public FireHorn( Serial serial ) : base( serial )
{
}
public override int LabelNumber => 1060456; // fire horn
private bool CheckUse( Mobile from )
{
if ( !IsAccessibleTo( from ) )
return false;
private bool CheckUse(Mobile from)
{
if (!IsAccessibleTo(from))
return false;
if ( from.Map != Map || !from.InRange( GetWorldLocation(), 2 ) )
{
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that.
return false;
}
if (from.Map != Map || !from.InRange(GetWorldLocation(), 2))
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
return false;
}
if ( !from.CanBeginAction( typeof( FireHorn ) ) )
{
from.SendLocalizedMessage( 1049615 ); // You must take a moment to catch your breath.
return false;
}
if (!from.CanBeginAction(typeof(FireHorn)))
{
from.SendLocalizedMessage(1049615); // You must take a moment to catch your breath.
return false;
}
int sulfAsh = Core.AOS ? 4 : 15;
if ( from.Backpack == null || from.Backpack.GetAmount( typeof( SulfurousAsh ) ) < sulfAsh )
{
from.SendLocalizedMessage( 1049617 ); // You do not have enough sulfurous ash.
return false;
}
int sulfAsh = Core.AOS ? 4 : 15;
if (from.Backpack == null || from.Backpack.GetAmount(typeof(SulfurousAsh)) < sulfAsh)
{
from.SendLocalizedMessage(1049617); // You do not have enough sulfurous ash.
return false;
}
return true;
}
return true;
}
public override void OnDoubleClick( Mobile from )
{
if ( CheckUse( from ) )
{
from.SendLocalizedMessage( 1049620 ); // Select an area to incinerate.
from.Target = new InternalTarget( this );
}
}
public override void OnDoubleClick(Mobile from)
{
if (CheckUse(from))
{
from.SendLocalizedMessage(1049620); // Select an area to incinerate.
from.Target = new InternalTarget(this);
}
}
public void Use( Mobile from, IPoint3D loc )
{
if ( !CheckUse( from ) )
return;
public void Use(Mobile from, IPoint3D loc)
{
if (!CheckUse(from))
return;
from.BeginAction( typeof( FireHorn ) );
Timer.DelayCall( Core.AOS ? TimeSpan.FromSeconds( 6.0 ) : TimeSpan.FromSeconds( 12.0 ), new TimerStateCallback( EndAction ), from );
from.BeginAction(typeof(FireHorn));
Timer.DelayCall(Core.AOS ? TimeSpan.FromSeconds(6.0) : TimeSpan.FromSeconds(12.0),
new TimerStateCallback(EndAction), from);
int music = from.Skills[SkillName.Musicianship].Fixed;
int music = from.Skills[SkillName.Musicianship].Fixed;
int sucChance = 500 + ( music - 775 ) * 2;
double dSucChance = ((double)sucChance) / 1000.0;
int sucChance = 500 + (music - 775) * 2;
double dSucChance = sucChance / 1000.0;
if ( !from.CheckSkill( SkillName.Musicianship, dSucChance ) )
{
from.SendLocalizedMessage( 1049618 ); // The horn emits a pathetic squeak.
from.PlaySound( 0x18A );
return;
}
if (!from.CheckSkill(SkillName.Musicianship, dSucChance))
{
from.SendLocalizedMessage(1049618); // The horn emits a pathetic squeak.
from.PlaySound(0x18A);
return;
}
int sulfAsh = Core.AOS ? 4 : 15;
from.Backpack.ConsumeUpTo( typeof( SulfurousAsh ), sulfAsh );
int sulfAsh = Core.AOS ? 4 : 15;
from.Backpack.ConsumeUpTo(typeof(SulfurousAsh), sulfAsh);
from.PlaySound( 0x15F );
Effects.SendPacket( from, from.Map, new HuedEffect( EffectType.Moving, from.Serial, Serial.Zero, 0x36D4, from.Location, loc, 5, 0, false, true, 0, 0 ) );
from.PlaySound(0x15F);
Effects.SendPacket(from, from.Map,
new HuedEffect(EffectType.Moving, from.Serial, Serial.Zero, 0x36D4, from.Location, loc, 5, 0, false, true, 0,
0));
List<Mobile> targets = new List<Mobile>();
bool playerVsPlayer = false;
List<Mobile> targets = new List<Mobile>();
bool playerVsPlayer = false;
IPooledEnumerable<Mobile> eable = from.Map.GetMobilesInRange( new Point3D( loc ), 2 );
IPooledEnumerable<Mobile> eable = from.Map.GetMobilesInRange(new Point3D(loc), 2);
foreach ( Mobile m in eable )
{
if ( from != m && SpellHelper.ValidIndirectTarget( from, m ) && from.CanBeHarmful( m, false ) )
{
if ( Core.AOS && !from.InLOS( m ) )
continue;
foreach (Mobile m in eable)
if (from != m && SpellHelper.ValidIndirectTarget(from, m) && from.CanBeHarmful(m, false))
{
if (Core.AOS && !from.InLOS(m))
continue;
targets.Add( m );
targets.Add(m);
if ( m.Player )
playerVsPlayer = true;
}
}
if (m.Player)
playerVsPlayer = true;
}
eable.Free();
eable.Free();
if ( targets.Count > 0 )
{
int prov = from.Skills[SkillName.Provocation].Fixed;
int disc = from.Skills[SkillName.Discordance].Fixed;
int peace = from.Skills[SkillName.Peacemaking].Fixed;
if (targets.Count > 0)
{
int prov = from.Skills[SkillName.Provocation].Fixed;
int disc = from.Skills[SkillName.Discordance].Fixed;
int peace = from.Skills[SkillName.Peacemaking].Fixed;
int minDamage, maxDamage;
int minDamage, maxDamage;
if ( Core.AOS )
{
int musicScaled = music + Math.Max( 0, music - 900 ) * 2;
int provScaled = prov + Math.Max( 0, prov - 900 ) * 2;
int discScaled = disc + Math.Max( 0, disc - 900 ) * 2;
int peaceScaled = peace + Math.Max( 0, peace - 900 ) * 2;
if (Core.AOS)
{
int musicScaled = music + Math.Max(0, music - 900) * 2;
int provScaled = prov + Math.Max(0, prov - 900) * 2;
int discScaled = disc + Math.Max(0, disc - 900) * 2;
int peaceScaled = peace + Math.Max(0, peace - 900) * 2;
int weightAvg = ( musicScaled + provScaled * 3 + discScaled * 3 + peaceScaled ) / 80;
int weightAvg = (musicScaled + provScaled * 3 + discScaled * 3 + peaceScaled) / 80;
int avgDamage;
if ( playerVsPlayer )
avgDamage = weightAvg / 3;
else
avgDamage = weightAvg / 2;
int avgDamage;
if (playerVsPlayer)
avgDamage = weightAvg / 3;
else
avgDamage = weightAvg / 2;
minDamage = ( avgDamage * 9 ) / 10;
maxDamage = ( avgDamage * 10 ) / 9;
}
else
{
int total = prov + disc / 5 + peace / 5;
minDamage = avgDamage * 9 / 10;
maxDamage = avgDamage * 10 / 9;
}
else
{
int total = prov + disc / 5 + peace / 5;
if ( playerVsPlayer )
total /= 3;
if (playerVsPlayer)
total /= 3;
maxDamage = ( total * 2 ) / 30;
minDamage = ( maxDamage * 7 ) / 10;
}
maxDamage = total * 2 / 30;
minDamage = maxDamage * 7 / 10;
}
double damage = Utility.RandomMinMax( minDamage, maxDamage );
double damage = Utility.RandomMinMax(minDamage, maxDamage);
if ( Core.AOS && targets.Count > 1 )
damage = (damage * 2) / targets.Count;
else if ( !Core.AOS )
damage /= targets.Count;
if (Core.AOS && targets.Count > 1)
damage = damage * 2 / targets.Count;
else if (!Core.AOS)
damage /= targets.Count;
for ( int i = 0; i < targets.Count; ++i )
{
Mobile m = (Mobile)targets[i];
for (int i = 0; i < targets.Count; ++i)
{
Mobile m = targets[i];
double toDeal = damage;
double toDeal = damage;
if ( !Core.AOS && m.CheckSkill( SkillName.MagicResist, 0.0, 120.0 ) )
{
toDeal *= 0.5;
m.SendLocalizedMessage( 501783 ); // You feel yourself resisting magical energy.
}
if (!Core.AOS && m.CheckSkill(SkillName.MagicResist, 0.0, 120.0))
{
toDeal *= 0.5;
m.SendLocalizedMessage(501783); // You feel yourself resisting magical energy.
}
from.DoHarmful( m );
SpellHelper.Damage( TimeSpan.Zero, m, from, toDeal, 0, 100, 0, 0, 0 );
from.DoHarmful(m);
SpellHelper.Damage(TimeSpan.Zero, m, from, toDeal, 0, 100, 0, 0, 0);
Effects.SendTargetEffect( m, 0x3709, 10, 30 );
}
}
Effects.SendTargetEffect(m, 0x3709, 10, 30);
}
}
double breakChance = Core.AOS ? 0.01 : 0.16;
if ( Utility.RandomDouble() < breakChance )
{
from.SendLocalizedMessage( 1049619 ); // The fire horn crumbles in your hands.
Delete();
}
}
double breakChance = Core.AOS ? 0.01 : 0.16;
if (Utility.RandomDouble() < breakChance)
{
from.SendLocalizedMessage(1049619); // The fire horn crumbles in your hands.
Delete();
}
}
private static void EndAction( object state )
{
Mobile m = (Mobile) state;
private static void EndAction(object state)
{
Mobile m = (Mobile)state;
m.EndAction( typeof( FireHorn ) );
m.SendLocalizedMessage( 1049621 ); // You catch your breath.
}
m.EndAction(typeof(FireHorn));
m.SendLocalizedMessage(1049621); // You catch your breath.
}
private class InternalTarget : Target
{
private FireHorn m_Horn;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public InternalTarget( FireHorn horn ) : base( Core.AOS ? 3 : 2, true, TargetFlags.Harmful )
{
m_Horn = horn;
}
writer.WriteEncodedInt(0); // version
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( m_Horn.Deleted )
return;
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
IPoint3D loc;
if ( targeted is Item item )
loc = item.GetWorldLocation();
else
loc = targeted as IPoint3D;
int version = reader.ReadEncodedInt();
}
m_Horn.Use( from, loc );
}
}
private class InternalTarget : Target
{
private FireHorn m_Horn;
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
public InternalTarget(FireHorn horn) : base(Core.AOS ? 3 : 2, true, TargetFlags.Harmful)
{
m_Horn = horn;
}
writer.WriteEncodedInt( 0 ); // version
}
protected override void OnTarget(Mobile from, object targeted)
{
if (m_Horn.Deleted)
return;
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
IPoint3D loc;
if (targeted is Item item)
loc = item.GetWorldLocation();
else
loc = targeted as IPoint3D;
int version = reader.ReadEncodedInt();
}
}
}
m_Horn.Use(from, loc);
}
}
}
}

View file

@ -4,117 +4,121 @@ using Server.Network;
namespace Server.Items
{
public class RecipeScroll : Item
{
public override int LabelNumber => 1074560; // recipe scroll
public class RecipeScroll : Item
{
private int m_RecipeID;
private int m_RecipeID;
public RecipeScroll(Recipe r)
: this(r.ID)
{
}
[CommandProperty( AccessLevel.GameMaster )]
public int RecipeID
{
get => m_RecipeID;
set { m_RecipeID = value; InvalidateProperties(); }
}
[Constructible]
public RecipeScroll(int recipeID)
: base(0x2831)
{
m_RecipeID = recipeID;
}
public Recipe Recipe
{
get
{
if ( Recipe.Recipes.ContainsKey( m_RecipeID ) )
return Recipe.Recipes[m_RecipeID];
public RecipeScroll(Serial serial)
: base(serial)
{
}
return null;
}
}
public override int LabelNumber => 1074560; // recipe scroll
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
[CommandProperty(AccessLevel.GameMaster)]
public int RecipeID
{
get => m_RecipeID;
set
{
m_RecipeID = value;
InvalidateProperties();
}
}
Recipe r = Recipe;
public Recipe Recipe
{
get
{
if (Recipe.Recipes.ContainsKey(m_RecipeID))
return Recipe.Recipes[m_RecipeID];
if ( r != null )
list.Add( 1049644, r.TextDefinition.ToString() ); // [~1_stuff~]
}
return null;
}
}
public RecipeScroll( Recipe r )
: this( r.ID )
{
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
[Constructible]
public RecipeScroll( int recipeID )
: base( 0x2831 )
{
m_RecipeID = recipeID;
}
Recipe r = Recipe;
public RecipeScroll( Serial serial )
: base( serial )
{
}
if (r != null)
list.Add(1049644, r.TextDefinition.ToString()); // [~1_stuff~]
}
public override void OnDoubleClick( Mobile from )
{
if ( !from.InRange( GetWorldLocation(), 2 ) )
{
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that.
return;
}
public override void OnDoubleClick(Mobile from)
{
if (!from.InRange(GetWorldLocation(), 2))
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
return;
}
Recipe r = Recipe;
Recipe r = Recipe;
if ( r != null && from is PlayerMobile pm )
{
if ( !pm.HasRecipe( r ) )
{
bool allRequiredSkills = true;
double chance = r.CraftItem.GetSuccessChance( pm, null, r.CraftSystem, false, ref allRequiredSkills );
if (r != null && from is PlayerMobile pm)
{
if (!pm.HasRecipe(r))
{
bool allRequiredSkills = true;
double chance = r.CraftItem.GetSuccessChance(pm, null, r.CraftSystem, false, ref allRequiredSkills);
if ( allRequiredSkills && chance >= 0.0 )
{
pm.SendLocalizedMessage( 1073451, r.TextDefinition.ToString() ); // You have learned a new recipe: ~1_RECIPE~
pm.AcquireRecipe( r );
Delete();
}
else
{
pm.SendLocalizedMessage( 1044153 ); // You don't have the required skills to attempt this item.
}
}
else
{
pm.SendLocalizedMessage( 1073427 ); // You already know this recipe.
}
if (allRequiredSkills && chance >= 0.0)
{
pm.SendLocalizedMessage(1073451,
r.TextDefinition.ToString()); // You have learned a new recipe: ~1_RECIPE~
pm.AcquireRecipe(r);
Delete();
}
else
{
pm.SendLocalizedMessage(1044153); // You don't have the required skills to attempt this item.
}
}
else
{
pm.SendLocalizedMessage(1073427); // You already know this recipe.
}
}
}
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write(0); // version
writer.Write( (int)0 ); // version
writer.Write(m_RecipeID);
}
writer.Write( (int)m_RecipeID );
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
int version = reader.ReadInt();
switch (version)
{
case 0:
{
m_RecipeID = reader.ReadInt();
switch( version )
{
case 0:
{
m_RecipeID = reader.ReadInt();
break;
}
}
}
}
}
break;
}
}
}
}
}

View file

@ -1,242 +1,257 @@
using System;
using Server.Engines.Craft;
using Server.Factions;
using Server.Mobiles;
using Server.Regions;
namespace Server.Items
{
public class RepairDeed : Item
{
private class RepairSkillInfo
{
public TextDefinition NotNearbyMessage { get; }
public class RepairDeed : Item
{
public enum RepairSkillType
{
Smithing,
Tailoring,
Tinkering,
Carpentry,
Fletching
}
public TextDefinition Name { get; }
private Mobile m_Crafter;
private RepairSkillType m_Skill;
private double m_SkillLevel;
[Constructible]
public RepairDeed() : this(RepairSkillType.Smithing, 100.0, null, true)
{
}
[Constructible]
public RepairDeed(RepairSkillType skill, double level) : this(skill, level, null, true)
{
}
[Constructible]
public RepairDeed(RepairSkillType skill, double level, bool normalizeLevel) : this(skill, level, null,
normalizeLevel)
{
}
public RepairDeed(RepairSkillType skill, double level, Mobile crafter) : this(skill, level, crafter, true)
{
}
public RepairDeed(RepairSkillType skill, double level, Mobile crafter, bool normalizeLevel) : base(0x14F0)
{
if (normalizeLevel)
SkillLevel = (int)(level / 10) * 10;
else
SkillLevel = level;
m_Skill = skill;
m_Crafter = crafter;
Hue = 0x1BC;
LootType = LootType.Blessed;
}
public RepairDeed(Serial serial) : base(serial)
{
}
public override bool DisplayLootType => false;
[CommandProperty(AccessLevel.GameMaster)]
public RepairSkillType RepairSkill
{
get => m_Skill;
set
{
m_Skill = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public double SkillLevel
{
get => m_SkillLevel;
set
{
m_SkillLevel = Math.Max(Math.Min(value, 120.0), 0);
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public Mobile Crafter
{
get => m_Crafter;
set
{
m_Crafter = value;
InvalidateProperties();
}
}
public override void AddNameProperty(ObjectPropertyList list)
{
list.Add(1061133,
$"{GetSkillTitle(m_SkillLevel)}\t{RepairSkillInfo.GetInfo(m_Skill).Name}"); // A repair service contract from ~1_SKILL_TITLE~ ~2_SKILL_NAME~.
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (m_Crafter != null)
list.Add(1050043, m_Crafter.Name); // crafted by ~1_NAME~
//On OSI it says it's exceptional. Intentional difference.
}
public override void OnSingleClick(Mobile from)
{
if (Deleted || !from.CanSee(this))
return;
LabelTo(from, 1061133,
$"{GetSkillTitle(m_SkillLevel)}\t{RepairSkillInfo.GetInfo(m_Skill).Name}"); // A repair service contract from ~1_SKILL_TITLE~ ~2_SKILL_NAME~.
if (m_Crafter != null)
LabelTo(from, 1050043, m_Crafter.Name); // crafted by ~1_NAME~
}
private static TextDefinition GetSkillTitle(double skillLevel)
{
int skill = (int)(skillLevel / 10);
if (skill >= 11)
return 1062008 + skill - 11;
if (skill >= 5)
return 1061123 + skill - 5;
switch (skill)
{
case 4:
return "a Novice";
case 3:
return "a Neophyte";
default:
return "a Newbie"; //On OSI, it shouldn't go below 50, but, this is for 'custom' support.
}
}
public static RepairSkillType GetTypeFor(CraftSystem s)
{
for (int i = 0; i < RepairSkillInfo.Table.Length; i++)
if (RepairSkillInfo.Table[i].System == s)
return (RepairSkillType)i;
return RepairSkillType.Smithing;
}
public override void OnDoubleClick(Mobile from)
{
if (Check(from))
Repair.Do(from, RepairSkillInfo.GetInfo(m_Skill).System, this);
}
public bool Check(Mobile from)
{
if (!IsChildOf(from.Backpack))
from.SendLocalizedMessage(1047012); // The contract must be in your backpack to use it.
else if (!VerifyRegion(from))
TextDefinition.SendMessageTo(from, RepairSkillInfo.GetInfo(m_Skill).NotNearbyMessage);
else
return true;
return false;
}
public bool VerifyRegion(Mobile m)
{
//TODO: When the entire region system data is in, convert to that instead of a proximity thing.
if (!m.Region.IsPartOf(typeof(TownRegion)))
return false;
return Faction.IsNearType(m, RepairSkillInfo.GetInfo(m_Skill).NearbyTypes, 6);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write((int)m_Skill);
writer.Write(m_SkillLevel);
writer.Write(m_Crafter);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 0:
{
m_Skill = (RepairSkillType)reader.ReadInt();
m_SkillLevel = reader.ReadDouble();
m_Crafter = reader.ReadMobile();
break;
}
}
}
private class RepairSkillInfo
{
public RepairSkillInfo(CraftSystem system, Type[] nearbyTypes, TextDefinition notNearbyMessage,
TextDefinition name)
{
System = system;
NearbyTypes = nearbyTypes;
NotNearbyMessage = notNearbyMessage;
Name = name;
}
public RepairSkillInfo(CraftSystem system, Type nearbyType, TextDefinition notNearbyMessage, TextDefinition name)
: this(system, new[] { nearbyType }, notNearbyMessage, name)
{
}
public TextDefinition NotNearbyMessage{ get; }
public TextDefinition Name{ get; }
public CraftSystem System { get; }
public CraftSystem System{ get; }
public Type[] NearbyTypes { get; }
public Type[] NearbyTypes{ get; }
public RepairSkillInfo( CraftSystem system, Type[] nearbyTypes, TextDefinition notNearbyMessage, TextDefinition name )
{
System = system;
NearbyTypes = nearbyTypes;
NotNearbyMessage = notNearbyMessage;
Name = name;
}
public static RepairSkillInfo[] Table{ get; } =
{
new RepairSkillInfo(DefBlacksmithy.CraftSystem, typeof(Blacksmith), 1047013, 1023015),
new RepairSkillInfo(DefTailoring.CraftSystem, typeof(Tailor), 1061132, 1022981),
new RepairSkillInfo(DefTinkering.CraftSystem, typeof(Tinker), 1061166, 1022983),
new RepairSkillInfo(DefCarpentry.CraftSystem, typeof(Carpenter), 1061135, 1060774),
new RepairSkillInfo(DefBowFletching.CraftSystem, typeof(Bowyer), 1061134, 1023005)
};
public RepairSkillInfo( CraftSystem system, Type nearbyType, TextDefinition notNearbyMessage, TextDefinition name )
: this( system, new[] { nearbyType }, notNearbyMessage, name )
{
}
public static RepairSkillInfo GetInfo(RepairSkillType type)
{
int v = (int)type;
public static RepairSkillInfo[] Table { get; } =
{
new RepairSkillInfo( DefBlacksmithy.CraftSystem, typeof( Blacksmith ), 1047013, 1023015 ),
new RepairSkillInfo( DefTailoring.CraftSystem, typeof( Tailor ), 1061132, 1022981 ),
new RepairSkillInfo( DefTinkering.CraftSystem, typeof( Tinker ), 1061166, 1022983 ),
new RepairSkillInfo( DefCarpentry.CraftSystem, typeof( Carpenter ), 1061135, 1060774 ),
new RepairSkillInfo( DefBowFletching.CraftSystem, typeof( Bowyer ), 1061134, 1023005 )
};
if (v < 0 || v >= Table.Length)
v = 0;
public static RepairSkillInfo GetInfo( RepairSkillType type )
{
int v = (int)type;
if ( v < 0 || v >= Table.Length )
v = 0;
return Table[v];
}
}
public enum RepairSkillType
{
Smithing,
Tailoring,
Tinkering,
Carpentry,
Fletching
}
public override bool DisplayLootType => false;
private RepairSkillType m_Skill;
private double m_SkillLevel;
private Mobile m_Crafter;
[CommandProperty( AccessLevel.GameMaster )]
public RepairSkillType RepairSkill
{
get => m_Skill;
set { m_Skill = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public double SkillLevel
{
get => m_SkillLevel;
set { m_SkillLevel = Math.Max( Math.Min( value, 120.0 ), 0 ) ; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public Mobile Crafter
{
get => m_Crafter;
set { m_Crafter = value; InvalidateProperties(); }
}
public override void AddNameProperty( ObjectPropertyList list )
{
list.Add( 1061133, $"{GetSkillTitle(m_SkillLevel).ToString()}\t{RepairSkillInfo.GetInfo(m_Skill).Name}"); // A repair service contract from ~1_SKILL_TITLE~ ~2_SKILL_NAME~.
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_Crafter != null )
list.Add( 1050043, m_Crafter.Name ); // crafted by ~1_NAME~
//On OSI it says it's exceptional. Intentional difference.
}
public override void OnSingleClick( Mobile from )
{
if ( Deleted || !from.CanSee( this ) )
return;
LabelTo( from, 1061133,
$"{GetSkillTitle(m_SkillLevel).ToString()}\t{RepairSkillInfo.GetInfo(m_Skill).Name}"); // A repair service contract from ~1_SKILL_TITLE~ ~2_SKILL_NAME~.
if ( m_Crafter != null )
LabelTo( from, 1050043, m_Crafter.Name ); // crafted by ~1_NAME~
}
[Constructible]
public RepairDeed() : this( RepairSkillType.Smithing, 100.0, null, true )
{
}
[Constructible]
public RepairDeed( RepairSkillType skill, double level ) : this( skill, level, null, true )
{
}
[Constructible]
public RepairDeed( RepairSkillType skill, double level, bool normalizeLevel ) : this( skill, level, null, normalizeLevel )
{
}
public RepairDeed( RepairSkillType skill, double level, Mobile crafter ) : this( skill, level, crafter, true )
{
}
public RepairDeed( RepairSkillType skill, double level, Mobile crafter, bool normalizeLevel ) : base( 0x14F0 )
{
if ( normalizeLevel )
SkillLevel = (int)(level/10)*10;
else
SkillLevel = level;
m_Skill = skill;
m_Crafter = crafter;
Hue = 0x1BC;
LootType = LootType.Blessed;
}
public RepairDeed( Serial serial ) : base( serial )
{
}
private static TextDefinition GetSkillTitle( double skillLevel )
{
int skill = (int)(skillLevel/10);
if ( skill >= 11 )
return (1062008 + skill-11);
if ( skill >=5 )
return (1061123 + skill-5);
switch( skill )
{
case 4:
return "a Novice";
case 3:
return "a Neophyte";
default:
return "a Newbie"; //On OSI, it shouldn't go below 50, but, this is for 'custom' support.
}
}
public static RepairSkillType GetTypeFor( CraftSystem s )
{
for( int i = 0; i < RepairSkillInfo.Table.Length; i++ )
{
if ( RepairSkillInfo.Table[i].System == s )
return (RepairSkillType)i;
}
return RepairSkillType.Smithing;
}
public override void OnDoubleClick( Mobile from )
{
if ( Check( from ) )
Repair.Do( from, RepairSkillInfo.GetInfo( m_Skill ).System, this );
}
public bool Check( Mobile from )
{
if ( !IsChildOf( from.Backpack ) )
from.SendLocalizedMessage( 1047012 ); // The contract must be in your backpack to use it.
else if ( !VerifyRegion( from ) )
TextDefinition.SendMessageTo( from, RepairSkillInfo.GetInfo( m_Skill ).NotNearbyMessage );
else
return true;
return false;
}
public bool VerifyRegion( Mobile m )
{
//TODO: When the entire region system data is in, convert to that instead of a proximity thing.
if ( !m.Region.IsPartOf( typeof( TownRegion ) ) )
return false;
return Factions.Faction.IsNearType( m, RepairSkillInfo.GetInfo( m_Skill ).NearbyTypes, 6 );
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 ); // version
writer.Write( (int)m_Skill );
writer.Write( m_SkillLevel );
writer.Write( m_Crafter );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch( version )
{
case 0:
{
m_Skill = (RepairSkillType)reader.ReadInt();
m_SkillLevel = reader.ReadDouble();
m_Crafter = reader.ReadMobile();
break;
}
}
}
}
}
return Table[v];
}
}
}
}