This commit is contained in:
mark 2009-06-29 12:29:09 +00:00
parent 2204d5fb86
commit 03fc95bfb7
105 changed files with 9135 additions and 161 deletions

View file

@ -2912,7 +2912,6 @@ namespace Server.Mobiles
{
DebugSay( "I'm being attacked but my master told me not to fight." );
Warmode = false;
Combatant = null;
return;
}
}

View file

@ -39,6 +39,8 @@ namespace Server.Engines.CannedEvil
private bool m_HasBeenAdvanced;
private bool m_ConfinedRoaming;
private Dictionary<Mobile, int> m_DamageEntries;
[CommandProperty( AccessLevel.GameMaster )]
public bool ConfinedRoaming
{
@ -70,6 +72,8 @@ namespace Server.Engines.CannedEvil
m_ExpireDelay = TimeSpan.FromMinutes( 10.0 );
m_RestartDelay = TimeSpan.FromMinutes( 5.0 );
m_DamageEntries = new Dictionary<Mobile, int>();
Timer.DelayCall( TimeSpan.Zero, new TimerCallback( SetInitialSpawnArea ) );
}
@ -392,13 +396,24 @@ namespace Server.Engines.CannedEvil
{
if( m_Champion.Deleted )
{
if ( m_Platform != null )
RegisterDamageTo( m_Champion );
if( m_Champion is BaseChampion )
AwardArtifact( ((BaseChampion)m_Champion).GetArtifact() );
m_DamageEntries.Clear();
if( m_Platform != null )
m_Platform.Hue = 0x497;
if( m_Altar != null )
{
m_Altar.Hue = 0;
new StarRoomGate( true, m_Altar.Location, m_Altar.Map );
if( !Core.ML || Map == Map.Felucca )
{
new StarRoomGate( true, m_Altar.Location, m_Altar.Map );
}
}
m_Champion = null;
@ -421,9 +436,10 @@ namespace Server.Engines.CannedEvil
--i;
++m_Kills;
Mobile killer = m.FindMostRecentDamager( false );
RegisterDamageTo( m );
if( killer is BaseCreature )
killer = ((BaseCreature)killer).GetMaster();
@ -872,11 +888,103 @@ namespace Server.Engines.CannedEvil
{
}
public virtual void RegisterDamageTo( Mobile m )
{
if( m == null )
return;
foreach( DamageEntry de in m.DamageEntries )
{
if( de.HasExpired )
continue;
Mobile damager = de.Damager;
Mobile master = damager.GetDamageMaster( m );
if( master != null )
damager = master;
RegisterDamage( damager, de.DamageGiven );
}
}
public void RegisterDamage( Mobile from, int amount )
{
if( from == null || !from.Player )
return;
if( m_DamageEntries.ContainsKey( from ) )
m_DamageEntries[from] += amount;
else
m_DamageEntries.Add( from, amount );
}
public void AwardArtifact( Item artifact )
{
if (artifact == null )
return;
int totalDamage = 0;
Dictionary<Mobile, int> validEntries = new Dictionary<Mobile, int>();
foreach (KeyValuePair<Mobile, int> kvp in m_DamageEntries)
{
if( IsEligable( kvp.Key, artifact ) )
{
validEntries.Add( kvp.Key, kvp.Value );
totalDamage += kvp.Value;
}
}
int randomDamage = Utility.RandomMinMax( 1, totalDamage );
totalDamage = 0;
foreach (KeyValuePair<Mobile, int> kvp in m_DamageEntries)
{
totalDamage += kvp.Value;
if( totalDamage > randomDamage )
{
GiveArtifact( kvp.Key, artifact );
break;
}
}
}
public void GiveArtifact( Mobile to, Item artifact )
{
if ( to == null || artifact == null )
return;
Container pack = to.Backpack;
if ( pack == null || !pack.TryDropItem( to, artifact, false ) )
artifact.Delete();
else
to.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you.
}
public bool IsEligable( Mobile m, Item Artifact )
{
//return true;
return m.Player && m.Alive && m.Region != null && m.Region == m_Region && m.Backpack != null && m.Backpack.CheckHold( m, Artifact, false );
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)4 ); // version
writer.Write( (int)5 ); // version
writer.Write( m_DamageEntries.Count );
foreach (KeyValuePair<Mobile, int> kvp in m_DamageEntries)
{
writer.Write( kvp.Key );
writer.Write( kvp.Value );
}
writer.Write( m_ConfinedRoaming );
writer.WriteItem<IdolOfTheChampion>( m_Idol );
@ -910,10 +1018,26 @@ namespace Server.Engines.CannedEvil
{
base.Deserialize( reader );
m_DamageEntries = new Dictionary<Mobile, int>();
int version = reader.ReadInt();
switch( version )
{
case 5:
{
int entries = reader.ReadInt();
Mobile m;
int damage;
for( int i = 0; i < entries; ++i )
{
m = reader.ReadMobile();
damage = reader.ReadInt();
m_DamageEntries.Add( m, damage );
}
goto case 4;
}
case 4:
{
m_ConfinedRoaming = reader.ReadBool();

View file

@ -294,7 +294,8 @@ namespace Server.Engines.Craft
0x184A, 0x184C, // Heating stand (left)
0x184E, 0x1850, // Heating stand (right)
0x398C, 0x399F, // Fire field
0x2DDB, 0x2DDC //Elven stove
0x2DDB, 0x2DDC, //Elven stove
0x19AA, 0x19BB // Veteran Reward Brazier
};
private static int[] m_Ovens = new int[]

View file

@ -0,0 +1,635 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Server;
using Server.Gumps;
using Server.Items;
using Server.Spells;
using Server.Multis;
using Server.Network;
using Server.Targeting;
using Server.Accounting;
using Server.ContextMenus;
using Server.Engines.VeteranRewards;
namespace Server.Mobiles
{
public enum StatueType
{
Marble,
Jade,
Bronze
}
public enum StatuePose
{
Ready,
Casting,
Salute,
AllPraiseMe,
Fighting,
HandsOnHips
}
public enum StatueMaterial
{
Antique,
Dark,
Medium,
Light
}
public class CharacterStatue : Mobile, IRewardItem
{
private StatueType m_Type;
private StatuePose m_Pose;
private StatueMaterial m_Material;
[CommandProperty( AccessLevel.GameMaster )]
public StatueType StatueType
{
get { return m_Type; }
set { m_Type = value; InvalidateHues(); InvalidatePose(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public StatuePose Pose
{
get { return m_Pose; }
set { m_Pose = value; InvalidatePose(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public StatueMaterial Material
{
get { return m_Material; }
set { m_Material = value; InvalidateHues(); InvalidatePose(); }
}
private Mobile m_SculptedBy;
private DateTime m_SculptedOn;
[CommandProperty( AccessLevel.GameMaster )]
public Mobile SculptedBy
{
get{ return m_SculptedBy; }
}
[CommandProperty( AccessLevel.GameMaster )]
public DateTime SculptedOn
{
get{ return m_SculptedOn; }
}
private CharacterStatuePlinth m_Plinth;
public CharacterStatuePlinth Plinth
{
get { return m_Plinth; }
set { m_Plinth = value; }
}
private bool m_IsRewardItem;
[CommandProperty( AccessLevel.GameMaster )]
public bool IsRewardItem
{
get{ return m_IsRewardItem; }
set{ m_IsRewardItem = value; }
}
public CharacterStatue( Mobile from, StatueType type ) : base()
{
m_Type = type;
m_Pose = StatuePose.Ready;
m_Material = StatueMaterial.Antique;
m_SculptedBy = from;
m_SculptedOn = DateTime.Now;
Direction = Direction.South;
AccessLevel = AccessLevel.Counselor;
Hits = HitsMax;
Blessed = true;
Frozen = true;
CloneBody( from );
CloneClothes( from );
InvalidateHues();
}
public CharacterStatue( Serial serial ) : base( serial )
{
}
public override void OnDoubleClick( Mobile from )
{
DisplayPaperdollTo( from );
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_SculptedBy != null )
{
if ( m_SculptedBy.Title != null )
list.Add( 1076202, m_SculptedBy.Title + " " + m_SculptedBy.Name ); // Sculpted by ~1_Name~
else
list.Add( 1076202, m_SculptedBy.Name ); // Sculpted by ~1_Name~
}
}
public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list )
{
base.GetContextMenuEntries( from, list );
if ( from.Alive )
{
BaseHouse house = BaseHouse.FindHouseAt( this );
if ( ( house != null && house.IsCoOwner( from ) ) || (int) from.AccessLevel > (int) AccessLevel.Counselor )
list.Add( new DemolishEntry( this ) );
}
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
if ( m_Plinth != null && !m_Plinth.Deleted )
m_Plinth.Delete();
}
protected override void OnMapChange( Map oldMap )
{
InvalidatePose();
if ( m_Plinth != null )
m_Plinth.Map = Map;
}
protected override void OnLocationChange( Point3D oldLocation )
{
InvalidatePose();
if ( m_Plinth != null )
m_Plinth.Location = new Point3D( X, Y, Z - 5 );
}
public override bool CanBeRenamedBy( Mobile from )
{
return false;
}
public override bool CanBeDamaged()
{
return false;
}
public void OnRequestedAnimation( Mobile from )
{
from.Send( new UpdateStatueAnimation( this, 1, m_Animation, m_Frames ) );
}
public override void OnAosSingleClick( Mobile from )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.WriteEncodedInt( (int) 0 ); // version
writer.Write( (int) m_Type );
writer.Write( (int) m_Pose );
writer.Write( (int) m_Material );
writer.Write( (Mobile) m_SculptedBy );
writer.Write( (DateTime) m_SculptedOn );
writer.Write( (Item) m_Plinth );
writer.Write( (bool) m_IsRewardItem );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadEncodedInt();
m_Type = (StatueType) reader.ReadInt();
m_Pose = (StatuePose) reader.ReadInt();
m_Material = (StatueMaterial) reader.ReadInt();
m_SculptedBy = reader.ReadMobile();
m_SculptedOn = reader.ReadDateTime();
m_Plinth = reader.ReadItem() as CharacterStatuePlinth;
m_IsRewardItem = reader.ReadBool();
InvalidatePose();
Frozen = true;
}
public void Sculpt( Mobile by )
{
m_SculptedBy = by;
m_SculptedOn = DateTime.Now;
InvalidateProperties();
}
public void Demolish( Mobile by )
{
CharacterStatueDeed deed = new CharacterStatueDeed( null );
if ( by.PlaceInBackpack( deed ) )
{
Internalize();
deed.Statue = this;
deed.IsRewardItem = m_IsRewardItem;
if ( m_Plinth != null )
m_Plinth.Internalize();
}
else
{
by.SendLocalizedMessage( 500720 ); // You don't have enough room in your backpack!
deed.Delete();
}
}
public void Restore( CharacterStatue from )
{
m_Material = from.Material;
m_Pose = from.Pose;
Direction = from.Direction;
CloneBody( from );
CloneClothes( from );
InvalidateHues();
InvalidatePose();
}
public void CloneBody( Mobile from )
{
Name = from.Name;
BodyValue = from.BodyValue;
HairItemID = from.HairItemID;
FacialHairItemID = from.FacialHairItemID;
}
public void CloneClothes( Mobile from )
{
for ( int i = Items.Count - 1; i >= 0; i -- )
Items[ i ].Delete();
for ( int i = from.Items.Count - 1; i >= 0; i -- )
{
Item item = from.Items[ i ];
if ( item.Layer != Layer.Backpack && item.Layer != Layer.Mount && item.Layer != Layer.Bank )
AddItem( CloneItem( item ) );
}
}
public Item CloneItem( Item item )
{
Item cloned = new Item( item.ItemID );
cloned.Layer = item.Layer;
cloned.Name = item.Name;
cloned.Hue = item.Hue;
cloned.Weight = item.Weight;
cloned.Movable = false;
return cloned;
}
public void InvalidateHues()
{
Hue = 0xB8F + (int) m_Type * 4 + (int) m_Material;
HairHue = Hue;
if ( FacialHairItemID > 0 )
FacialHairHue = Hue;
for ( int i = Items.Count - 1; i >= 0; i -- )
Items[ i ].Hue = Hue;
if ( m_Plinth != null )
m_Plinth.InvalidateHue();
}
private int m_Animation;
private int m_Frames;
public void InvalidatePose()
{
switch ( m_Pose )
{
case StatuePose.Ready:
m_Animation = 4;
m_Frames = 0;
break;
case StatuePose.Casting:
m_Animation = 16;
m_Frames = 2;
break;
case StatuePose.Salute:
m_Animation = 33;
m_Frames = 1;
break;
case StatuePose.AllPraiseMe:
m_Animation = 17;
m_Frames = 4;
break;
case StatuePose.Fighting:
m_Animation = 31;
m_Frames = 5;
break;
case StatuePose.HandsOnHips:
m_Animation = 6;
m_Frames = 1;
break;
}
if( Map != null )
{
ProcessDelta();
Packet p = null;
IPooledEnumerable eable = Map.GetClientsInRange( Location );
foreach( NetState state in eable )
{
state.Mobile.ProcessDelta();
if( p == null )
p = Packet.Acquire( new UpdateStatueAnimation( this, 1, m_Animation, m_Frames ) );
state.Send( p );
}
Packet.Release( p );
eable.Free();
}
}
private class DemolishEntry : ContextMenuEntry
{
private CharacterStatue m_Statue;
public DemolishEntry( CharacterStatue statue ) : base( 6275, 2 )
{
m_Statue = statue;
}
public override void OnClick()
{
if ( m_Statue.Deleted )
return;
m_Statue.Demolish( Owner.From );
}
}
}
public class CharacterStatueDeed : Item, IRewardItem
{
public override int LabelNumber
{
get
{
if ( m_Statue != null )
{
switch ( m_Statue.StatueType )
{
case StatueType.Marble: return 1076189;
case StatueType.Jade: return 1076188;
case StatueType.Bronze: return 1076190;
}
}
return 1076173;
}
}
private CharacterStatue m_Statue;
private bool m_IsRewardItem;
[CommandProperty( AccessLevel.GameMaster )]
public CharacterStatue Statue
{
get { return m_Statue; }
set { m_Statue = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public StatueType StatueType
{
get
{
if ( m_Statue != null )
return m_Statue.StatueType;
return StatueType.Marble;
}
}
[CommandProperty( AccessLevel.GameMaster )]
public bool IsRewardItem
{
get{ return m_IsRewardItem; }
set{ m_IsRewardItem = value; InvalidateProperties(); }
}
public CharacterStatueDeed( CharacterStatue statue ) : base( 0x14F0 )
{
m_Statue = statue;
LootType = LootType.Blessed;
Weight = 1.0;
}
public CharacterStatueDeed( Serial serial ) : base( serial )
{
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_IsRewardItem )
list.Add( 1076222 ); // 6th Year Veteran Reward
if ( m_Statue != null )
list.Add( 1076231, m_Statue.Name ); // Statue of ~1_Name~
}
public override void OnDoubleClick( Mobile from )
{
Account acct = from.Account as Account;
if ( acct != null && from.AccessLevel == AccessLevel.Player )
{
TimeSpan time = TimeSpan.FromDays( RewardSystem.RewardInterval.TotalDays * 6 ) - ( DateTime.Now - acct.Created );
if ( time > TimeSpan.Zero )
{
from.SendLocalizedMessage( 1008126, true, Math.Ceiling( time.TotalDays / RewardSystem.RewardInterval.TotalDays ).ToString() ); // Your account is not old enough to use this item. Months until you can use this item :
return;
}
}
if ( IsChildOf( from.Backpack ) )
{
if ( !from.IsBodyMod )
{
from.SendLocalizedMessage( 1076194 ); // Select a place where you would like to put your statue.
from.Target = new CharacterStatueTarget( this, StatueType );
}
else
from.SendLocalizedMessage( 1073648 ); // You may only proceed while in your original state...
}
else
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}
public override void OnDelete()
{
base.OnDelete();
if ( m_Statue != null )
m_Statue.Delete();
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.WriteEncodedInt( (int) 0 ); // version
writer.Write( (Mobile) m_Statue );
writer.Write( (bool) m_IsRewardItem );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadEncodedInt();
m_Statue = reader.ReadMobile() as CharacterStatue;
m_IsRewardItem = reader.ReadBool();
}
}
public class CharacterStatueTarget : Target
{
private Item m_Maker;
private StatueType m_Type;
public CharacterStatueTarget( Item maker, StatueType type ) : base( -1, true, TargetFlags.None )
{
m_Maker = maker;
m_Type = type;
}
protected override void OnTarget( Mobile from, object targeted )
{
IPoint3D p = targeted as IPoint3D;
Map map = from.Map;
if ( p == null || map == null || m_Maker == null || m_Maker.Deleted )
return;
if ( m_Maker.IsChildOf( from.Backpack ) )
{
SpellHelper.GetSurfaceTop( ref p );
BaseHouse house = null;
Point3D loc = new Point3D( p );
if ( targeted is Item && !((Item) targeted).IsLockedDown && !((Item) targeted).IsSecure && !(targeted is AddonComponent) )
{
from.SendLocalizedMessage( 1076191 ); // Statues can only be placed in houses.
return;
}
else if ( from.IsBodyMod )
{
from.SendLocalizedMessage( 1073648 ); // You may only proceed while in your original state...
return;
}
AddonFitResult result = CouldFit( loc, map, from, ref house );
if ( result == AddonFitResult.Valid )
{
CharacterStatue statue = new CharacterStatue( from, m_Type );
CharacterStatuePlinth plinth = new CharacterStatuePlinth( statue );
house.Addons.Add( plinth );
if ( m_Maker is IRewardItem )
statue.IsRewardItem = ( (IRewardItem) m_Maker).IsRewardItem;
statue.Plinth = plinth;
plinth.MoveToWorld( loc, map );
statue.InvalidatePose();
from.CloseGump( typeof( CharacterStatueGump ) );
from.SendGump( new CharacterStatueGump( m_Maker, statue, from ) );
}
else if ( result == AddonFitResult.Blocked )
from.SendLocalizedMessage( 500269 ); // You cannot build that there.
else if ( result == AddonFitResult.NotInHouse )
from.SendLocalizedMessage( 1076192 ); // Statues can only be placed in houses where you are the owner or co-owner.
else if ( result == AddonFitResult.DoorsNotClosed )
from.SendMessage( "You must close all house doors before placing this." );
else if ( result == AddonFitResult.DoorTooClose )
from.SendLocalizedMessage( 500271 ); // You cannot build near the door.
}
else
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}
public static AddonFitResult CouldFit( Point3D p, Map map, Mobile from, ref BaseHouse house )
{
if ( !map.CanFit( p.X, p.Y, p.Z, 20, true, true, true ) )
return AddonFitResult.Blocked;
else if ( !BaseAddon.CheckHouse( from, p, map, 20, ref house ) )
return AddonFitResult.NotInHouse;
else
return CheckDoors( p, 20, house );
}
public static AddonFitResult CheckDoors( Point3D p, int height, BaseHouse house )
{
ArrayList doors = house.Doors;
for ( int i = 0; i < doors.Count; i ++ )
{
BaseDoor door = doors[ i ] as BaseDoor;
if ( door != null && door.Open )
return AddonFitResult.DoorsNotClosed;
Point3D doorLoc = door.GetWorldLocation();
int doorHeight = door.ItemData.CalcHeight;
if ( Utility.InRange( doorLoc, p, 1 ) && (p.Z == doorLoc.Z || ((p.Z + height) > doorLoc.Z && (doorLoc.Z + doorHeight) > p.Z)) )
return AddonFitResult.DoorTooClose;
}
return AddonFitResult.Valid;
}
}
}

View file

@ -0,0 +1,174 @@
using System;
using Server;
using Server.Mobiles;
using Server.Targets;
using Server.Engines.VeteranRewards;
namespace Server.Items
{
public class CharacterStatueMaker : Item, IRewardItem
{
public override int LabelNumber{ get{ return 1076173; } } // Character Statue Maker
private bool m_IsRewardItem;
private StatueType m_Type;
[CommandProperty( AccessLevel.GameMaster )]
public bool IsRewardItem
{
get{ return m_IsRewardItem; }
set{ m_IsRewardItem = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public StatueType StatueType
{
get{ return m_Type; }
set{ m_Type = value; InvalidateHue(); }
}
public CharacterStatueMaker( StatueType type ) : base( 0x32F0 )
{
m_Type = type;
InvalidateHue();
LootType = LootType.Blessed;
Weight = 5.0;
}
public CharacterStatueMaker( Serial serial ) : base( serial )
{
}
public override void OnDoubleClick( Mobile from )
{
if ( m_IsRewardItem && !RewardSystem.CheckIsUsableBy( from, this, new object[] { m_Type } ) )
return;
if ( IsChildOf( from.Backpack ) )
{
if ( !from.IsBodyMod )
{
from.SendLocalizedMessage( 1076194 ); // Select a place where you would like to put your statue.
from.Target = new CharacterStatueTarget( this, m_Type );
}
else
from.SendLocalizedMessage( 1073648 ); // You may only proceed while in your original state...
}
else
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_IsRewardItem )
list.Add( 1076222 ); // 6th Year Veteran Reward
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.WriteEncodedInt( (int) 0 ); // version
writer.Write( (bool) m_IsRewardItem );
writer.Write( (int) m_Type );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadEncodedInt();
m_IsRewardItem = reader.ReadBool();
m_Type = (StatueType) reader.ReadInt();
}
public void InvalidateHue()
{
Hue = 0xB8F + (int) m_Type * 4;
}
}
public class MarbleStatueMaker : CharacterStatueMaker
{
[Constructable]
public MarbleStatueMaker() : base( StatueType.Marble )
{
}
public MarbleStatueMaker( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.WriteEncodedInt( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadEncodedInt();
}
}
public class JadeStatueMaker : CharacterStatueMaker
{
[Constructable]
public JadeStatueMaker() : base( StatueType.Jade )
{
}
public JadeStatueMaker( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.WriteEncodedInt( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadEncodedInt();
}
}
public class BronzeStatueMaker : CharacterStatueMaker
{
[Constructable]
public BronzeStatueMaker() : base( StatueType.Bronze )
{
}
public BronzeStatueMaker( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.WriteEncodedInt( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,127 @@
using System;
using System.Globalization;
using Server;
using Server.Gumps;
using Server.Mobiles;
using Server.Multis;
using Server.Targets;
namespace Server.Items
{
public class CharacterStatuePlinth : Static, IAddon
{
public Item Deed{ get{ return new CharacterStatueDeed( m_Statue ); } }
public override int LabelNumber{ get{ return 1076201; } } // Character Statue
private CharacterStatue m_Statue;
public CharacterStatuePlinth( CharacterStatue statue ) : base( 0x32F2 )
{
m_Statue = statue;
InvalidateHue();
}
public CharacterStatuePlinth( Serial serial ) : base( serial )
{
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
if ( m_Statue != null && !m_Statue.Deleted )
m_Statue.Delete();
}
public override void OnMapChange()
{
if ( m_Statue != null )
m_Statue.Map = Map;
}
public override void OnLocationChange( Point3D oldLocation )
{
if ( m_Statue != null )
m_Statue.Location = new Point3D( X, Y, Z + 5 );
}
public override void OnDoubleClick( Mobile from )
{
if ( m_Statue != null )
from.SendGump( new CharacterPlinthGump( m_Statue ) );
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.WriteEncodedInt( (int) 0 ); // version
writer.Write( (Mobile) m_Statue );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadEncodedInt();
m_Statue = reader.ReadMobile() as CharacterStatue;
}
public void InvalidateHue()
{
if ( m_Statue != null )
Hue = 0xB8F + (int) m_Statue.StatueType * 4 + (int) m_Statue.Material;
}
public virtual bool CouldFit( IPoint3D p, Map map )
{
Point3D point = new Point3D( p.X, p.Y, p.Z );
if ( map == null || !map.CanFit( point, 20 ) )
return false;
BaseHouse house = BaseHouse.FindHouseAt( point, map, 20 );
if ( house == null )
return false;
AddonFitResult result = CharacterStatueTarget.CheckDoors( point, 20, house );
if ( result == AddonFitResult.Valid )
return true;
return false;
}
private class CharacterPlinthGump : Gump
{
public CharacterPlinthGump( CharacterStatue statue ) : base( 60, 30 )
{
Closable = true;
Disposable = true;
Dragable = true;
Resizable = false;
AddPage( 0 );
AddImage( 0, 0, 0x24F4 );
AddHtml( 55, 50, 150, 20, statue.Name, false, false );
AddHtml( 55, 75, 150, 20, statue.SculptedOn.ToString( "G", new CultureInfo("de-DE") ), false, false );
AddHtmlLocalized( 55, 100, 150, 20, GetTypeNumber( statue.StatueType ), 0, false, false );
}
public int GetTypeNumber( StatueType type )
{
switch ( type )
{
case StatueType.Marble: return 1076181;
case StatueType.Jade: return 1076180;
case StatueType.Bronze: return 1076230;
default: return 1076181;
}
}
}
}
}

View file

@ -0,0 +1,229 @@
using System;
using Server;
using Server.Items;
using Server.Mobiles;
using Server.Network;
namespace Server.Gumps
{
public class CharacterStatueGump : Gump
{
private Item m_Maker;
private CharacterStatue m_Statue;
private Timer m_Timer;
private Mobile m_Owner;
private enum Buttons
{
Close,
Sculpt,
PosePrev,
PoseNext,
DirPrev,
DirNext,
MatPrev,
MatNext,
Restore
}
public CharacterStatueGump( Item maker, CharacterStatue statue, Mobile owner ) : base( 60, 36 )
{
m_Maker = maker;
m_Statue = statue;
m_Owner = owner;
if ( m_Statue == null )
return;
Closable = true;
Disposable = true;
Dragable = true;
Resizable = false;
AddPage( 0 );
AddBackground( 0, 0, 327, 324, 0x13BE );
AddImageTiled( 10, 10, 307, 20, 0xA40 );
AddImageTiled( 10, 40, 307, 244, 0xA40 );
AddImageTiled( 10, 294, 307, 20, 0xA40 );
AddAlphaRegion( 10, 10, 307, 304 );
AddHtmlLocalized( 14, 12, 327, 20, 1076156, 0x7FFF, false, false ); // Character Statue Maker
// pose
AddHtmlLocalized( 133, 41, 120, 20, 1076168, 0x7FFF, false, false ); // Choose Pose
AddHtmlLocalized( 133, 61, 120, 20, 1076208 + (int) m_Statue.Pose, 0x77E, false, false );
AddButton( 163, 81, 0xFA5, 0xFA7, (int) Buttons.PoseNext, GumpButtonType.Reply, 0 );
AddButton( 133, 81, 0xFAE, 0xFB0, (int) Buttons.PosePrev, GumpButtonType.Reply, 0 );
// direction
AddHtmlLocalized( 133, 126, 120, 20, 1076170, 0x7FFF, false, false ); // Choose Direction
AddHtmlLocalized( 133, 146, 120, 20, GetDirectionNumber( m_Statue.Direction ), 0x77E, false, false );
AddButton( 163, 167, 0xFA5, 0xFA7, (int) Buttons.DirNext, GumpButtonType.Reply, 0 );
AddButton( 133, 167, 0xFAE, 0xFB0, (int) Buttons.DirPrev, GumpButtonType.Reply, 0 );
// material
AddHtmlLocalized( 133, 211, 120, 20, 1076171, 0x7FFF, false, false ); // Choose Material
AddHtmlLocalized( 133, 231, 120, 20, GetMaterialNumber( m_Statue.StatueType, m_Statue.Material ), 0x77E, false, false );
AddButton( 163, 253, 0xFA5, 0xFA7, (int) Buttons.MatNext, GumpButtonType.Reply, 0 );
AddButton( 133, 253, 0xFAE, 0xFB0, (int) Buttons.MatPrev, GumpButtonType.Reply, 0 );
// cancel
AddButton( 10, 294, 0xFB1, 0xFB2, (int) Buttons.Close, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 45, 294, 80, 20, 1006045, 0x7FFF, false, false ); // Cancel
// sculpt
AddButton( 234, 294, 0xFB7, 0xFB9, (int) Buttons.Sculpt, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 269, 294, 80, 20, 1076174, 0x7FFF, false, false ); // Sculpt
// restore
if ( m_Maker is CharacterStatueDeed )
{
AddButton( 107, 294, 0xFAB, 0xFAD, (int) Buttons.Restore, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 142, 294, 80, 20, 1076193, 0x7FFF, false, false ); // Restore
}
m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 2.5 ), TimeSpan.FromSeconds( 2.5 ), new TimerCallback( CheckOnline ) );
}
private void CheckOnline()
{
if ( m_Owner != null && m_Owner.NetState == null )
{
if ( m_Timer != null )
m_Timer.Stop();
if ( m_Statue != null && !m_Statue.Deleted )
m_Statue.Delete();
}
}
private int GetMaterialNumber( StatueType type, StatueMaterial material )
{
switch ( material )
{
case StatueMaterial.Antique:
switch ( type )
{
case StatueType.Bronze: return 1076187;
case StatueType.Jade: return 1076186;
case StatueType.Marble: return 1076182;
}
return 1076187;
case StatueMaterial.Dark:
if ( type == StatueType.Marble )
return 1076183;
return 1076182;
case StatueMaterial.Medium: return 1076184;
case StatueMaterial.Light: return 1076185;
default: return 1076187;
}
}
private int GetDirectionNumber( Direction direction )
{
switch ( direction )
{
case Direction.North: return 1075389;
case Direction.Right: return 1075388;
case Direction.East: return 1075387;
case Direction.Down: return 1076204;
case Direction.South: return 1075386;
case Direction.Left: return 1075391;
case Direction.West: return 1075390;
case Direction.Up: return 1076205;
default: return 1075386;
}
}
public override void OnResponse( NetState state, RelayInfo info )
{
if ( m_Statue == null || m_Statue.Deleted )
return;
bool sendGump = false;
if ( info.ButtonID == (int) Buttons.Sculpt )
{
if ( m_Maker is CharacterStatueDeed )
{
CharacterStatue backup = ( (CharacterStatueDeed) m_Maker ).Statue;
if ( backup != null )
backup.Delete();
}
if ( m_Maker != null )
m_Maker.Delete();
m_Statue.Sculpt( state.Mobile );
}
else if ( info.ButtonID == (int) Buttons.PosePrev )
{
m_Statue.Pose = (StatuePose) ( ( (int) m_Statue.Pose + 5 ) % 6 );
sendGump = true;
}
else if ( info.ButtonID == (int) Buttons.PoseNext )
{
m_Statue.Pose = (StatuePose) ( ( (int) m_Statue.Pose + 1 ) % 6 );
sendGump = true;
}
else if ( info.ButtonID == (int) Buttons.DirPrev )
{
m_Statue.Direction = (Direction) ( ( (int) m_Statue.Direction + 7 ) % 8 );
m_Statue.InvalidatePose();
sendGump = true;
}
else if ( info.ButtonID == (int) Buttons.DirNext )
{
m_Statue.Direction = (Direction) ( ( (int) m_Statue.Direction + 1 ) % 8 );
m_Statue.InvalidatePose();
sendGump = true;
}
else if ( info.ButtonID == (int) Buttons.MatPrev )
{
m_Statue.Material = (StatueMaterial) ( ( (int) m_Statue.Material + 3 ) % 4 );
sendGump = true;
}
else if ( info.ButtonID == (int) Buttons.MatNext )
{
m_Statue.Material = (StatueMaterial) ( ( (int) m_Statue.Material + 1 ) % 4 );
sendGump = true;
}
else if ( info.ButtonID == (int) Buttons.Restore )
{
if ( m_Maker is CharacterStatueDeed )
{
CharacterStatue backup = ( (CharacterStatueDeed) m_Maker ).Statue;
if ( backup != null )
m_Statue.Restore( backup );
}
sendGump = true;
}
else
{
m_Statue.Delete();
}
if ( sendGump )
state.Mobile.SendGump( new CharacterStatueGump( m_Maker, m_Statue, m_Owner ) );
if ( m_Timer != null )
m_Timer.Stop();
}
public override void OnServerClose( NetState owner )
{
if ( m_Timer != null )
m_Timer.Stop();
if ( m_Statue != null && !m_Statue.Deleted )
m_Statue.Delete();
}
}
}

View file

@ -0,0 +1,23 @@
using System;
using Server;
namespace Server.Network
{
public class UpdateStatueAnimation : Packet
{
public UpdateStatueAnimation( Mobile m, int status, int animation, int frame ) : base( 0xBF, 17 )
{
m_Stream.Write( (short) 0x11 );
m_Stream.Write( (short) 0x19 );
m_Stream.Write( (byte) 0x5 );
m_Stream.Write( (int) m.Serial );
m_Stream.Write( (byte) 0 );
m_Stream.Write( (byte) 0xFF );
m_Stream.Write( (byte) status );
m_Stream.Write( (byte) 0 );
m_Stream.Write( (byte) animation );
m_Stream.Write( (byte) 0 );
m_Stream.Write( (byte) frame );
}
}
}

View file

@ -62,15 +62,19 @@ namespace Server.Engines.VeteranRewards
RewardCategory[] categories = RewardSystem.Categories;
int page = 2;
for ( int i = 0; i < categories.Length; ++i )
{
if ( categories[i].Entries.Count == 0 )
if ( !RewardSystem.HasAccess( m_From, categories[i] ) )
{
page += 1;
continue;
}
if ( !RewardSystem.HasAccess( m_From, (RewardEntry)categories[i].Entries[0] ) )
continue;
AddButton( 100, 180 + (i * 40), 4005, 4005, 0, GumpButtonType.Page, page );
AddButton( 100, 180 + (i * 40), 4005, 4005, 0, GumpButtonType.Page, 2 + i );
page += PagesPerCategory( categories[ i ] );
if ( categories[i].NameString != null )
AddHtml( 135, 180 + (i * 40), 300, 20, categories[i].NameString, false, false );
@ -78,8 +82,24 @@ namespace Server.Engines.VeteranRewards
AddHtmlLocalized( 135, 180 + (i * 40), 300, 20, categories[i].Name, false, false );
}
page = 2;
for ( int i = 0; i < categories.Length; ++i )
RenderCategory( categories[i], i );
RenderCategory( categories[ i ], i, ref page );
}
private int PagesPerCategory( RewardCategory category )
{
List<RewardEntry> entries = category.Entries;
int j = 0, i = 0;
for ( j = 0; j < entries.Count; j++ )
{
if ( RewardSystem.HasAccess( m_From, entries[ j ] ) )
i++;
}
return (int) Math.Ceiling( i / 24.0 );
}
private int GetButtonID( int type, int index )
@ -87,26 +107,44 @@ namespace Server.Engines.VeteranRewards
return 2 + (index * 20) + type;
}
private void RenderCategory( RewardCategory category, int index )
private void RenderCategory( RewardCategory category, int index, ref int page )
{
AddPage( 2 + index );
AddPage( page );
List<RewardEntry> entries = category.Entries;
for ( int i = 0; i < entries.Count; ++i )
int i = 0;
for ( int j = 0; j < entries.Count; ++j )
{
RewardEntry entry = entries[i];
RewardEntry entry = entries[j];
if ( !RewardSystem.HasAccess( m_From, entry ) )
break;
continue;
AddButton( 55 + ((i / 12) * 250), 80 + ((i % 12) * 25), 5540, 5541, GetButtonID( index, i ), GumpButtonType.Reply, 0 );
if ( i == 24 )
{
AddButton( 305, 415, 0xFA5, 0xFA7, 0, GumpButtonType.Page, ++page );
AddHtmlLocalized( 340, 415, 200, 20, 1011066, false, false ); // Next page
AddPage( page );
AddButton( 270, 415, 0xFAE, 0xFB0, 0, GumpButtonType.Page, page - 1 );
AddHtmlLocalized( 185, 415, 200, 20, 1011067, false, false ); // Previous page
i = 0;
}
AddButton( 55 + ((i / 12) * 250), 80 + ((i % 12) * 25), 5540, 5541, GetButtonID( index, j ), GumpButtonType.Reply, 0 );
if ( entry.NameString != null )
AddHtml( 80 + ((i / 12) * 250), 80 + ((i % 12) * 25), 250, 20, entry.NameString, false, false );
else
AddHtmlLocalized( 80 + ((i / 12) * 250), 80 + ((i % 12) * 25), 250, 20, entry.Name, false, false );
++i;
}
page += 1;
}
public RewardChoiceGump( Mobile from ) : base( 0, 0 )

View file

@ -51,6 +51,9 @@ namespace Server.Engines.VeteranRewards
if ( item != null )
{
if ( item is Server.Items.RedSoulstone )
((Server.Items.RedSoulstone) item).Account = m_From.Account.Username;
if ( RewardSystem.ConsumeRewardPoint( m_From ) )
m_From.AddToBackpack( item );
else

View file

@ -0,0 +1,73 @@
using System;
using Server;
using Server.Items;
using Server.Multis;
using Server.Network;
namespace Server.Gumps
{
public class RewardDemolitionGump : Gump
{
private IAddon m_Addon;
private enum Buttons
{
Cancel,
Confirm,
}
public RewardDemolitionGump( IAddon addon, int question ) : base( 150, 50 )
{
m_Addon = addon;
Closable = true;
Disposable = true;
Dragable = true;
Resizable = false;
AddBackground( 0, 0, 220, 170, 0x13BE );
AddBackground( 10, 10, 200, 150, 0xBB8 );
AddHtmlLocalized( 20, 30, 180, 60, question, false, false ); // Do you wish to re-deed this decoration?
AddHtmlLocalized( 55, 100, 150, 25, 1011011, false, false ); // CONTINUE
AddButton( 20, 100, 0xFA5, 0xFA7, (int) Buttons.Confirm, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 55, 125, 150, 25, 1011012, false, false ); // CANCEL
AddButton( 20, 125, 0xFA5, 0xFA7, (int) Buttons.Cancel, GumpButtonType.Reply, 0 );
}
public override void OnResponse( NetState sender, RelayInfo info )
{
Item item = m_Addon as Item;
if ( item == null || item.Deleted )
return;
if ( info.ButtonID == (int) Buttons.Confirm )
{
Mobile m = sender.Mobile;
BaseHouse house = BaseHouse.FindHouseAt( m );
if ( house != null && house.IsOwner( m ) )
{
if ( m.InRange( item.Location, 2 ) )
{
Item deed = m_Addon.Deed;
if ( deed != null )
{
m.AddToBackpack( deed );
house.Addons.Remove( item );
item.Delete();
}
}
else
m.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that.
}
else
m.SendLocalizedMessage( 1049784 ); // You can only re-deed this decoration if you are the house owner or originally placed the decoration.
}
}
}
}

View file

@ -7,6 +7,7 @@ namespace Server.Engines.VeteranRewards
private RewardList m_List;
private RewardCategory m_Category;
private Type m_ItemType;
private Expansion m_RequiredExpansion;
private int m_Name;
private string m_NameString;
private object[] m_Args;
@ -14,6 +15,7 @@ namespace Server.Engines.VeteranRewards
public RewardList List{ get{ return m_List; } set{ m_List = value; } }
public RewardCategory Category{ get{ return m_Category; } }
public Type ItemType{ get{ return m_ItemType; } }
public Expansion RequiredExpansion{ get{ return m_RequiredExpansion; } }
public int Name{ get{ return m_Name; } }
public string NameString{ get{ return m_NameString; } }
public object[] Args{ get{ return m_Args; } }
@ -40,6 +42,7 @@ namespace Server.Engines.VeteranRewards
{
m_Category = category;
m_ItemType = itemType;
m_RequiredExpansion = Expansion.None;
m_Name = name;
m_Args = args;
category.Entries.Add( this );
@ -49,6 +52,27 @@ namespace Server.Engines.VeteranRewards
{
m_Category = category;
m_ItemType = itemType;
m_RequiredExpansion = Expansion.None;
m_NameString = name;
m_Args = args;
category.Entries.Add( this );
}
public RewardEntry( RewardCategory category, int name, Type itemType, Expansion requiredExpansion, params object[] args )
{
m_Category = category;
m_ItemType = itemType;
m_RequiredExpansion = requiredExpansion;
m_Name = name;
m_Args = args;
category.Entries.Add( this );
}
public RewardEntry( RewardCategory category, string name, Type itemType, Expansion requiredExpansion, params object[] args )
{
m_Category = category;
m_ItemType = itemType;
m_RequiredExpansion = requiredExpansion;
m_NameString = name;
m_Args = args;
category.Entries.Add( this );

View file

@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using Server;
using Server.Gumps;
using Server.Network;
namespace Server.Gumps
{
public interface IRewardOption
{
void GetOptions( RewardOptionList list );
void OnOptionSelected( Mobile from, int choice );
}
public class RewardOptionGump : Gump
{
private RewardOptionList m_Options = new RewardOptionList();
private IRewardOption m_Option;
public RewardOptionGump( IRewardOption option ) : this( option, 0 )
{
}
public RewardOptionGump( IRewardOption option, int title ) : base( 60, 36 )
{
m_Option = option;
if ( m_Option != null )
m_Option.GetOptions( m_Options );
AddPage( 0 );
AddBackground( 0, 0, 273, 324, 0x13BE );
AddImageTiled( 10, 10, 253, 20, 0xA40 );
AddImageTiled( 10, 40, 253, 244, 0xA40 );
AddImageTiled( 10, 294, 253, 20, 0xA40 );
AddAlphaRegion( 10, 10, 253, 304 );
AddButton( 10, 294, 0xFB1, 0xFB2, 0, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 45, 296, 450, 20, 1060051, 0x7FFF, false, false ); // CANCEL
if ( title > 0 )
AddHtmlLocalized( 14, 12, 273, 20, title, 0x7FFF, false, false );
else
AddHtmlLocalized( 14, 12, 273, 20, 1080392, 0x7FFF, false, false ); // Select your choice from the menu below.
AddPage( 1 );
for ( int i = 0; i < m_Options.Count; i++ )
{
AddButton( 19, 49 + i * 24, 0x845, 0x846, m_Options[ i ].ID, GumpButtonType.Reply, 0 );
AddHtmlLocalized( 44, 47 + i * 24, 213, 20, m_Options[ i ].Cliloc, 0x7FFF, false, false );
}
}
public override void OnResponse( NetState sender, RelayInfo info )
{
if ( m_Option != null && Contains( info.ButtonID ) )
m_Option.OnOptionSelected( sender.Mobile, info.ButtonID );
}
private bool Contains( int chosen )
{
if ( m_Options == null )
return false;
foreach ( RewardOption option in m_Options )
{
if ( option.ID == chosen )
return true;
}
return false;
}
}
public class RewardOption
{
private int m_ID;
private int m_Cliloc;
public int ID{ get{ return m_ID; } }
public int Cliloc{ get{ return m_Cliloc; } }
public RewardOption( int id, int cliloc )
{
m_ID = id;
m_Cliloc = cliloc;
}
}
public class RewardOptionList : List<RewardOption>
{
public RewardOptionList() : base()
{
}
public void Add( int id, int cliloc )
{
Add( new RewardOption( id, cliloc ) );
}
}
}

View file

@ -3,6 +3,8 @@ using Server;
using Server.Items;
using Server.Mobiles;
using Server.Accounting;
using System.Collections;
using System.Collections.Generic;
namespace Server.Engines.VeteranRewards
{
@ -37,8 +39,28 @@ namespace Server.Engines.VeteranRewards
public static bool SkillCapRewards = true; // assuming vet rewards are enabled, should total skill cap bonuses be awarded? (720 skills total at 4th level)
public static TimeSpan RewardInterval = TimeSpan.FromDays( 30.0 );
public static bool HasAccess( Mobile mob, RewardCategory category )
{
List<RewardEntry> entries = category.Entries;
for ( int j = 0; j < entries.Count; ++j )
{
//RewardEntry entry = entries[j];
if ( RewardSystem.HasAccess( mob, entries[j] ) )
{
return true;
}
}
return false;
}
public static bool HasAccess( Mobile mob, RewardEntry entry )
{
if ( Core.Expansion < entry.RequiredExpansion )
{
return false;
}
TimeSpan ts;
return HasAccess( mob, entry.List, out ts );
}
@ -91,6 +113,25 @@ namespace Server.Engines.VeteranRewards
return level;
}
public static bool HasHalfLevel( Mobile mob )
{
Account acct = mob.Account as Account;
if ( acct == null )
return false;
return HasHalfLevel( acct );
}
public static bool HasHalfLevel( Account acct )
{
TimeSpan totalTime = (DateTime.Now - acct.Created);
Double level = (totalTime.TotalDays / RewardInterval.TotalDays);
return level >= 0.5;
}
public static bool ConsumeRewardPoint( Mobile mob )
{
int cur, max;
@ -205,6 +246,52 @@ namespace Server.Engines.VeteranRewards
return true;
}
public static int GetRewardYearLabel( Item item, object[] args )
{
int level = GetRewardYear( item, args );
int cliloc = 1076216 + level;
if( level > 9 )
cliloc += 4231;
return cliloc;
}
public static int GetRewardYear( Item item, object[] args )
{
if ( m_Lists == null )
SetupRewardTables();
Type type = item.GetType();
for ( int i = 0; i < m_Lists.Length; ++i )
{
RewardList list = m_Lists[i];
RewardEntry[] entries = list.Entries;
for ( int j = 0; j < entries.Length; ++j )
{
if ( entries[j].ItemType == type )
{
if ( args == null && entries[j].Args.Length == 0 )
return i + 1;
if ( args.Length == entries[j].Args.Length )
{
bool match = true;
for ( int k = 0; match && k < args.Length; ++k )
match = ( args[k].Equals( entries[j].Args[k] ) );
if ( match )
return i + 1;
}
}
}
}
// no entry?
return 0;
}
public static void SetupRewardTables()
{
RewardCategory monsterStatues = new RewardCategory( 1049750 );
@ -212,6 +299,7 @@ namespace Server.Engines.VeteranRewards
RewardCategory etherealSteeds = new RewardCategory( 1049751 );
RewardCategory specialDyeTubs = new RewardCategory( 1049753 );
RewardCategory houseAddOns = new RewardCategory( 1049754 );
RewardCategory miscellaneous = new RewardCategory( 1078596 );
m_Categories = new RewardCategory[]
{
@ -219,7 +307,8 @@ namespace Server.Engines.VeteranRewards
cloaksAndRobes,
etherealSteeds,
specialDyeTubs,
houseAddOns
houseAddOns,
miscellaneous
};
const int Bronze = 0x972;
@ -234,6 +323,8 @@ namespace Server.Engines.VeteranRewards
const int Fire = 0x489;
const int IceWhite = 0x47E;
const int JetBlack = 0x001;
const int Pink = 0x490;
const int Crimson = 0x485;
m_Lists = new RewardList[]
{
@ -244,8 +335,10 @@ namespace Server.Engines.VeteranRewards
new RewardEntry( specialDyeTubs, 1006047, typeof( SpecialDyeTub ) ),
new RewardEntry( cloaksAndRobes, 1006009, typeof( RewardCloak ), Bronze, 1041286 ),
new RewardEntry( cloaksAndRobes, 1006010, typeof( RewardRobe ), Bronze, 1041287 ),
new RewardEntry( cloaksAndRobes, 1080366, typeof( RewardDress ), Expansion.ML, Bronze, 1080366 ),
new RewardEntry( cloaksAndRobes, 1006011, typeof( RewardCloak ), Copper, 1041288 ),
new RewardEntry( cloaksAndRobes, 1006012, typeof( RewardRobe ), Copper, 1041289 ),
new RewardEntry( cloaksAndRobes, 1080367, typeof( RewardDress ), Expansion.ML, Copper, 1080367 ),
new RewardEntry( monsterStatues, 1006024, typeof( MonsterStatuette ), MonsterStatuetteType.Crocodile ),
new RewardEntry( monsterStatues, 1006025, typeof( MonsterStatuette ), MonsterStatuetteType.Daemon ),
new RewardEntry( monsterStatues, 1006026, typeof( MonsterStatuette ), MonsterStatuetteType.Dragon ),
@ -259,71 +352,121 @@ namespace Server.Engines.VeteranRewards
new RewardEntry( monsterStatues, 1006034, typeof( MonsterStatuette ), MonsterStatuetteType.Orc ),
new RewardEntry( monsterStatues, 1006035, typeof( MonsterStatuette ), MonsterStatuetteType.Ratman ),
new RewardEntry( monsterStatues, 1006036, typeof( MonsterStatuette ), MonsterStatuetteType.Skeleton ),
new RewardEntry( monsterStatues, 1006037, typeof( MonsterStatuette ), MonsterStatuetteType.Troll )
//TODO: RedSoulstone
//Need to reorganize this to OSI.
new RewardEntry( monsterStatues, 1006037, typeof( MonsterStatuette ), MonsterStatuetteType.Troll ),
new RewardEntry( houseAddOns, 1062692, typeof( ContestMiniHouseDeed ), Expansion.AOS, MiniHouseType.MalasMountainPass ),
new RewardEntry( houseAddOns, 1072216, typeof( ContestMiniHouseDeed ), Expansion.SE, MiniHouseType.ChurchAtNight ),
new RewardEntry( miscellaneous, 1076155, typeof( RedSoulstone ), Expansion.ML ),
new RewardEntry( miscellaneous, 1080523, typeof( CommodityDeedBox ), Expansion.ML ),
} ),
new RewardList( RewardInterval, 2, new RewardEntry[]
{
new RewardEntry( specialDyeTubs, 1006052, typeof( LeatherDyeTub ) ),
new RewardEntry( cloaksAndRobes, 1006014, typeof( RewardCloak ), Agapite, 1041290 ),
new RewardEntry( cloaksAndRobes, 1006015, typeof( RewardRobe ), Agapite, 1041291 ),
new RewardEntry( cloaksAndRobes, 1080369, typeof( RewardDress ), Expansion.ML, Agapite, 1080369 ),
new RewardEntry( cloaksAndRobes, 1006016, typeof( RewardCloak ), Golden, 1041292 ),
new RewardEntry( cloaksAndRobes, 1006017, typeof( RewardRobe ), Golden, 1041293 )
/*new RewardEntry( houseAddOns, 0, typeof( BannerDeed ) ),
new RewardEntry( houseAddOns, 0, typeof( FlamingSkullDeed ) )*/
new RewardEntry( cloaksAndRobes, 1006017, typeof( RewardRobe ), Golden, 1041293 ),
new RewardEntry( cloaksAndRobes, 1080368, typeof( RewardDress ), Expansion.ML, Golden, 1080368 ),
new RewardEntry( houseAddOns, 1006048, typeof( BannerDeed ) ),
new RewardEntry( houseAddOns, 1006049, typeof( FlamingHeadDeed ) ),
new RewardEntry( houseAddOns, 1080409, typeof( MinotaurStatueDeed ), Expansion.ML )
} ),
new RewardList( RewardInterval, 3, new RewardEntry[]
{
new RewardEntry( cloaksAndRobes, 1006020, typeof( RewardCloak ), Verite, 1041294 ),
new RewardEntry( cloaksAndRobes, 1006021, typeof( RewardRobe ), Verite, 1041295 ),
new RewardEntry( cloaksAndRobes, 1080370, typeof( RewardDress ), Expansion.ML, Verite, 1080370 ),
new RewardEntry( cloaksAndRobes, 1006022, typeof( RewardCloak ), Valorite, 1041296 ),
new RewardEntry( cloaksAndRobes, 1006023, typeof( RewardRobe ), Valorite, 1041297 ),
new RewardEntry( cloaksAndRobes, 1080371, typeof( RewardDress ), Expansion.ML, Valorite, 1080371 ),
new RewardEntry( monsterStatues, 1006038, typeof( MonsterStatuette ), MonsterStatuetteType.Cow ),
new RewardEntry( monsterStatues, 1006039, typeof( MonsterStatuette ), MonsterStatuetteType.Zombie ),
new RewardEntry( monsterStatues, 1006040, typeof( MonsterStatuette ), MonsterStatuetteType.Llama ),
new RewardEntry( etherealSteeds, 1006019, typeof( EtherealHorse ) ),
new RewardEntry( etherealSteeds, 1006050, typeof( EtherealOstard ) ),
new RewardEntry( etherealSteeds, 1006051, typeof( EtherealLlama ) )
new RewardEntry( etherealSteeds, 1006051, typeof( EtherealLlama ) ),
new RewardEntry( houseAddOns, 1080407, typeof( PottedCactusDeed ), Expansion.ML )
} ),
new RewardList( RewardInterval, 4, new RewardEntry[]
{
new RewardEntry( specialDyeTubs, 1049740, typeof( RunebookDyeTub ) ),
new RewardEntry( cloaksAndRobes, 1049725, typeof( RewardCloak ), DarkGray, 1049757 ),
new RewardEntry( cloaksAndRobes, 1049726, typeof( RewardRobe ), DarkGray, 1049756 ),
new RewardEntry( cloaksAndRobes, 1080374, typeof( RewardDress ), Expansion.ML, DarkGray, 1080374 ),
new RewardEntry( cloaksAndRobes, 1049727, typeof( RewardCloak ), IceGreen, 1049759 ),
new RewardEntry( cloaksAndRobes, 1049728, typeof( RewardRobe ), IceGreen, 1049758 ),
new RewardEntry( cloaksAndRobes, 1080372, typeof( RewardDress ), Expansion.ML, IceGreen, 1080372 ),
new RewardEntry( cloaksAndRobes, 1049729, typeof( RewardCloak ), IceBlue, 1049761 ),
new RewardEntry( cloaksAndRobes, 1049730, typeof( RewardRobe ), IceBlue, 1049760 ),
new RewardEntry( cloaksAndRobes, 1080373, typeof( RewardDress ), Expansion.ML, IceBlue, 1080373 ),
new RewardEntry( monsterStatues, 1049742, typeof( MonsterStatuette ), MonsterStatuetteType.Ophidian ),
new RewardEntry( monsterStatues, 1049743, typeof( MonsterStatuette ), MonsterStatuetteType.Reaper ),
new RewardEntry( monsterStatues, 1049744, typeof( MonsterStatuette ), MonsterStatuetteType.Mongbat ),
new RewardEntry( etherealSteeds, 1049746, typeof( EtherealKirin ) ),
new RewardEntry( etherealSteeds, 1049745, typeof( EtherealUnicorn ) ),
new RewardEntry( etherealSteeds, 1049747, typeof( EtherealRidgeback ) )
/*new RewardEntry( houseAddOns, 0, typeof( DecorativeShieldWallHanging ) ),
new RewardEntry( houseAddOns, 0, typeof( SkeletonWallHanging ) )*/
new RewardEntry( etherealSteeds, 1049747, typeof( EtherealRidgeback ) ),
new RewardEntry( houseAddOns, 1049737, typeof( DecorativeShieldDeed ) ),
new RewardEntry( houseAddOns, 1049738, typeof( HangingSkeletonDeed ) )
} ),
new RewardList( RewardInterval, 5, new RewardEntry[]
{
new RewardEntry( specialDyeTubs, 1049741, typeof( StatuetteDyeTub ) ),
new RewardEntry( cloaksAndRobes, 1049731, typeof( RewardCloak ), JetBlack, 1049763 ),
new RewardEntry( cloaksAndRobes, 1049732, typeof( RewardRobe ), JetBlack, 1049762 ),
new RewardEntry( cloaksAndRobes, 1080377, typeof( RewardDress ), Expansion.ML, JetBlack, 1080377 ),
new RewardEntry( cloaksAndRobes, 1049733, typeof( RewardCloak ), IceWhite, 1049765 ),
new RewardEntry( cloaksAndRobes, 1049734, typeof( RewardRobe ), IceWhite, 1049764 ),
new RewardEntry( cloaksAndRobes, 1080376, typeof( RewardDress ), Expansion.ML, IceWhite, 1080376 ),
new RewardEntry( cloaksAndRobes, 1049735, typeof( RewardCloak ), Fire, 1049767 ),
new RewardEntry( cloaksAndRobes, 1049736, typeof( RewardRobe ), Fire, 1049766 ),
new RewardEntry( cloaksAndRobes, 1080375, typeof( RewardDress ), Expansion.ML, Fire, 1080375 ),
new RewardEntry( monsterStatues, 1049768, typeof( MonsterStatuette ), MonsterStatuetteType.Gazer ),
new RewardEntry( monsterStatues, 1049769, typeof( MonsterStatuette ), MonsterStatuetteType.FireElemental ),
new RewardEntry( monsterStatues, 1049770, typeof( MonsterStatuette ), MonsterStatuetteType.Wolf ),
new RewardEntry( etherealSteeds, 1049749, typeof( EtherealSwampDragon ) ),
new RewardEntry( etherealSteeds, 1049748, typeof( EtherealBeetle ) )
/*new RewardEntry( houseAddOns, 0, typeof( AnkhDecoration ) )*/
new RewardEntry( etherealSteeds, 1049748, typeof( EtherealBeetle ) ),
new RewardEntry( houseAddOns, 1049739, typeof( StoneAnkhDeed ) ),
new RewardEntry( houseAddOns, 1080384, typeof( BloodyPentagramDeed ), Expansion.ML )
} ),
new RewardList( RewardInterval, 6, new RewardEntry[]
{
new RewardEntry( houseAddOns, 1076188, typeof( CharacterStatueMaker ), Expansion.ML, StatueType.Jade ),
new RewardEntry( houseAddOns, 1076189, typeof( CharacterStatueMaker ), Expansion.ML, StatueType.Marble ),
new RewardEntry( houseAddOns, 1076190, typeof( CharacterStatueMaker ), Expansion.ML, StatueType.Bronze ),
new RewardEntry( houseAddOns, 1080527, typeof( RewardBrazierDeed ), Expansion.ML )
} ),
new RewardList( RewardInterval, 7, new RewardEntry[]
{
new RewardEntry( houseAddOns, 1076157, typeof( CannonDeed ), Expansion.ML ),
new RewardEntry( houseAddOns, 1080550, typeof( TreeStumpDeed ), Expansion.ML )
} ),
//TODO: 6th year player statue Markers
//TODO: 7th year Decorative Cannon
//TODO: 8th year Weapon Engraving Tool
//TODO: 9th year Ridable polar bear
new RewardList( RewardInterval, 8, new RewardEntry[]
{
new RewardEntry( miscellaneous, 1076158, typeof( WeaponEngravingTool ), Expansion.ML )
} ),
new RewardList( RewardInterval, 9, new RewardEntry[]
{
new RewardEntry( etherealSteeds, 1076159, typeof( RideablePolarBear ), Expansion.ML ),
new RewardEntry( houseAddOns, 1080549, typeof( WallBannerDeed ), Expansion.ML )
} ),
new RewardList( RewardInterval, 10, new RewardEntry[]
{
new RewardEntry( monsterStatues, 1080520, typeof( MonsterStatuette ), Expansion.ML, MonsterStatuetteType.Harrower ),
new RewardEntry( monsterStatues, 1080521, typeof( MonsterStatuette ), Expansion.ML, MonsterStatuetteType.Efreet ),
new RewardEntry( cloaksAndRobes, 1080382, typeof( RewardCloak ), Expansion.ML, Pink, 1080382 ),
new RewardEntry( cloaksAndRobes, 1080380, typeof( RewardRobe ), Expansion.ML, Pink, 1080380 ),
new RewardEntry( cloaksAndRobes, 1080378, typeof( RewardDress ), Expansion.ML, Pink, 1080378 ),
new RewardEntry( cloaksAndRobes, 1080383, typeof( RewardCloak ), Expansion.ML, Crimson, 1080383 ),
new RewardEntry( cloaksAndRobes, 1080381, typeof( RewardRobe ), Expansion.ML, Crimson, 1080381 ),
new RewardEntry( cloaksAndRobes, 1080379, typeof( RewardDress ), Expansion.ML, Crimson, 1080379 ),
new RewardEntry( etherealSteeds, 1080386, typeof( EtherealCuSidhe ), Expansion.ML ),
new RewardEntry( houseAddOns, 1080548, typeof( MiningCartDeed ), Expansion.ML ),
new RewardEntry( houseAddOns, 1080397, typeof( AnkhOfSacrificeDeed ), Expansion.ML )
} )
};
}
@ -355,6 +498,12 @@ namespace Server.Engines.VeteranRewards
e.Mobile.SkillsCap = 7000;
}
if ( Core.ML && e.Mobile is PlayerMobile && !((PlayerMobile)e.Mobile).HasStatReward && HasHalfLevel( e.Mobile ) )
{
((PlayerMobile)e.Mobile).HasStatReward = true;
e.Mobile.StatCap += 5;
}
if ( cur < max )
e.Mobile.SendGump( new RewardNoticeGump( e.Mobile ) );
}