This commit is contained in:
parent
2204d5fb86
commit
03fc95bfb7
105 changed files with 9135 additions and 161 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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[]
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
73
Scripts/Engines/VeteranRewards/RewardDemolitionGump.cs
Normal file
73
Scripts/Engines/VeteranRewards/RewardDemolitionGump.cs
Normal 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.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 );
|
||||
|
|
|
|||
104
Scripts/Engines/VeteranRewards/RewardOptionGump.cs
Normal file
104
Scripts/Engines/VeteranRewards/RewardOptionGump.cs
Normal 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 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 ) );
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue