ModernUO/Scripts/Items/Skill Items/Carpenter Items/TaxidermyKit.cs
2006-06-15 04:14:30 +00:00

462 lines
No EOL
12 KiB
C#

using System;
using Server;
using Server.Multis;
using Server.Mobiles;
using Server.Targeting;
namespace Server.Items
{
[FlipableAttribute( 0x1EBA, 0x1EBB )]
public class TaxidermyKit : Item
{
public override int LabelNumber{ get{ return 1041279; } } // a taxidermy kit
[Constructable]
public TaxidermyKit() : base( 0x1EBA )
{
Weight = 1.0;
}
public TaxidermyKit( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override void OnDoubleClick(Mobile from)
{
if ( !IsChildOf( from.Backpack ) )
{
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}
else if ( from.Skills[SkillName.Carpentry].Base < 90.0 )
{
from.SendLocalizedMessage( 1042594 ); // You do not understand how to use this.
}
else
{
from.SendLocalizedMessage( 1042595 ); // Target the corpse to make a trophy out of.
from.Target = new CorpseTarget( this );
}
}
private static object[,] m_Table = new object[,]
{
{ typeof( BrownBear ), 0x1E60, 1041093, 1041107 },
{ typeof( GreatHart ), 0x1E61, 1041095, 1041109 },
{ typeof( BigFish ), 0x1E62, 1041096, 1041110 },
{ typeof( Gorilla ), 0x1E63, 1041091, 1041105 },
{ typeof( Orc ), 0x1E64, 1041090, 1041104 },
{ typeof( PolarBear ), 0x1E65, 1041094, 1041108 },
{ typeof( Troll ), 0x1E66, 1041092, 1041106 }
};
private class CorpseTarget : Target
{
private TaxidermyKit m_Kit;
public CorpseTarget( TaxidermyKit kit ) : base( 3, false, TargetFlags.None )
{
m_Kit = kit;
}
protected override void OnTarget( Mobile from, object targeted )
{
if ( m_Kit.Deleted )
return;
if ( !(targeted is Corpse) && !(targeted is BigFish) )
{
from.SendLocalizedMessage( 1042600 ); // That is not a corpse!
}
else if ( targeted is Corpse && ((Corpse)targeted).VisitedByTaxidermist )
{
from.SendLocalizedMessage( 1042596 ); // That corpse seems to have been visited by a taxidermist already.
}
else if ( !m_Kit.IsChildOf( from.Backpack ) )
{
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}
else if ( from.Skills[SkillName.Carpentry].Base < 90.0 )
{
from.SendLocalizedMessage( 1042603 ); // You would not understand how to use the kit.
}
else
{
object obj = targeted;
if ( obj is Corpse )
obj = ((Corpse)obj).Owner;
for ( int i = 0; obj != null && i < m_Table.GetLength( 0 ); ++i )
{
if ( m_Table[i, 0] == obj.GetType() )
{
Container pack = from.Backpack;
if ( pack != null && pack.ConsumeTotal( typeof( Board ), 10 ) )
{
from.SendLocalizedMessage( 1042278 ); // You review the corpse and find it worthy of a trophy.
from.SendLocalizedMessage( 1042602 ); // You use your kit up making the trophy.
Mobile hunter = null;
int weight = 0;
if ( targeted is BigFish )
{
hunter = ((BigFish)targeted).Fisher;
weight = (int) ((BigFish)targeted).Weight;
}
from.AddToBackpack( new TrophyDeed( (int)m_Table[i, 1] + 7, (int)m_Table[i, 1], (int)m_Table[i, 2], (int)m_Table[i, 3], hunter, weight ) );
if ( targeted is Corpse )
((Corpse)targeted).VisitedByTaxidermist = true;
else if ( targeted is BigFish )
((BigFish)targeted).Consume();
m_Kit.Delete();
return;
}
else
{
from.SendLocalizedMessage( 1042598 ); // You do not have enough boards.
return;
}
}
}
from.SendLocalizedMessage( 1042599 ); // That does not look like something you want hanging on a wall.
}
}
}
}
public class TrophyAddon : Item, IAddon
{
private int m_WestID;
private int m_NorthID;
private int m_DeedNumber;
private int m_AddonNumber;
private Mobile m_Hunter;
private int m_AnimalWeight;
[CommandProperty( AccessLevel.GameMaster )]
public int WestID{ get{ return m_WestID; } set{ m_WestID = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public int NorthID{ get{ return m_NorthID; } set{ m_NorthID = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public int DeedNumber{ get{ return m_DeedNumber; } set{ m_DeedNumber = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public int AddonNumber{ get{ return m_AddonNumber; } set{ m_AddonNumber = value; InvalidateProperties(); } }
public override int LabelNumber{ get{ return m_AddonNumber; } }
[Constructable]
public TrophyAddon( Mobile from, int itemID, int westID, int northID, int deedNumber, int addonNumber ) : this( from, itemID, westID, northID, deedNumber, addonNumber, null, 0 )
{
}
public TrophyAddon( Mobile from, int itemID, int westID, int northID, int deedNumber, int addonNumber, Mobile hunter, int animalWeight ) : base( itemID )
{
m_WestID = westID;
m_NorthID = northID;
m_DeedNumber = deedNumber;
m_AddonNumber = addonNumber;
m_Hunter = hunter;
m_AnimalWeight = animalWeight;
Movable = false;
MoveToWorld( from.Location, from.Map );
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_AnimalWeight >= 20 )
{
if ( m_Hunter != null )
list.Add( 1070857, m_Hunter.Name ); // Caught by ~1_fisherman~
list.Add( 1070858, m_AnimalWeight.ToString() ); // ~1_weight~ stones
}
}
public TrophyAddon( Serial serial ) : base( serial )
{
}
public bool CouldFit( IPoint3D p, Map map )
{
if ( !map.CanFit( p.X, p.Y, p.Z, this.ItemData.Height ) )
return false;
if ( this.ItemID == m_NorthID )
return BaseAddon.IsWall( p.X, p.Y - 1, p.Z, map ); // North wall
else
return BaseAddon.IsWall( p.X - 1, p.Y, p.Z, map ); // West wall
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 ); // version
writer.Write( (Mobile) m_Hunter );
writer.Write( (int) m_AnimalWeight );
writer.Write( (int) m_WestID );
writer.Write( (int) m_NorthID );
writer.Write( (int) m_DeedNumber );
writer.Write( (int) m_AddonNumber );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 1:
{
m_Hunter = reader.ReadMobile();
m_AnimalWeight = reader.ReadInt();
goto case 0;
}
case 0:
{
m_WestID = reader.ReadInt();
m_NorthID = reader.ReadInt();
m_DeedNumber = reader.ReadInt();
m_AddonNumber = reader.ReadInt();
break;
}
}
Timer.DelayCall( TimeSpan.Zero, new TimerCallback( FixMovingCrate ) );
}
private void FixMovingCrate()
{
if ( this.Deleted )
return;
if ( this.Movable || this.IsLockedDown )
{
Item deed = this.Deed;
if ( this.Parent is Item )
{
((Item)this.Parent).AddItem( deed );
deed.Location = this.Location;
}
else
{
deed.MoveToWorld( this.Location, this.Map );
}
Delete();
}
}
public Item Deed
{
get{ return new TrophyDeed( m_WestID, m_NorthID, m_DeedNumber, m_AddonNumber, m_Hunter, m_AnimalWeight ); }
}
public override void OnDoubleClick( Mobile from )
{
BaseHouse house = BaseHouse.FindHouseAt( this );
if ( house != null && house.IsCoOwner( from ) )
{
if ( from.InRange( GetWorldLocation(), 1 ) )
{
from.AddToBackpack( this.Deed );
Delete();
}
else
{
from.SendLocalizedMessage( 500295 ); // You are too far away to do that.
}
}
}
}
[Flipable( 0x14F0, 0x14EF )]
public class TrophyDeed : Item
{
private int m_WestID;
private int m_NorthID;
private int m_DeedNumber;
private int m_AddonNumber;
private Mobile m_Hunter;
private int m_AnimalWeight;
[CommandProperty( AccessLevel.GameMaster )]
public int WestID{ get{ return m_WestID; } set{ m_WestID = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public int NorthID{ get{ return m_NorthID; } set{ m_NorthID = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public int DeedNumber{ get{ return m_DeedNumber; } set{ m_DeedNumber = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int AddonNumber{ get{ return m_AddonNumber; } set{ m_AddonNumber = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public Mobile Hunter{ get{ return m_Hunter; } set{ m_Hunter = value; InvalidateProperties(); } }
[CommandProperty( AccessLevel.GameMaster )]
public int AnimalWeight{ get{ return m_AnimalWeight; } set{ m_AnimalWeight = value; InvalidateProperties(); } }
public override int LabelNumber{ get{ return m_DeedNumber; } }
[Constructable]
public TrophyDeed( int westID, int northID, int deedNumber, int addonNumber ) : this( westID, northID, deedNumber, addonNumber, null, 0 )
{
}
public TrophyDeed( int westID, int northID, int deedNumber, int addonNumber, Mobile hunter, int animalWeight ) : base( 0x14F0 )
{
m_WestID = westID;
m_NorthID = northID;
m_DeedNumber = deedNumber;
m_AddonNumber = addonNumber;
m_Hunter = hunter;
m_AnimalWeight = animalWeight;
}
public TrophyDeed( Serial serial ) : base( serial )
{
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_AnimalWeight >= 20 )
{
if ( m_Hunter != null )
list.Add( 1070857, m_Hunter.Name ); // Caught by ~1_fisherman~
list.Add( 1070858, m_AnimalWeight.ToString() ); // ~1_weight~ stones
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 ); // version
writer.Write( (Mobile) m_Hunter );
writer.Write( (int) m_AnimalWeight );
writer.Write( (int) m_WestID );
writer.Write( (int) m_NorthID );
writer.Write( (int) m_DeedNumber );
writer.Write( (int) m_AddonNumber );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 1:
{
m_Hunter = reader.ReadMobile();
m_AnimalWeight = reader.ReadInt();
goto case 0;
}
case 0:
{
m_WestID = reader.ReadInt();
m_NorthID = reader.ReadInt();
m_DeedNumber = reader.ReadInt();
m_AddonNumber = reader.ReadInt();
break;
}
}
}
public override void OnDoubleClick( Mobile from )
{
if ( IsChildOf( from.Backpack ) )
{
BaseHouse house = BaseHouse.FindHouseAt( from );
if ( house != null && house.IsCoOwner( from ) )
{
bool northWall = BaseAddon.IsWall( from.X, from.Y - 1, from.Z, from.Map );
bool westWall = BaseAddon.IsWall( from.X - 1, from.Y, from.Z, from.Map );
if ( northWall && westWall )
{
switch ( from.Direction & Direction.Mask )
{
case Direction.North:
case Direction.South: northWall = true; westWall = false; break;
case Direction.East:
case Direction.West: northWall = false; westWall = true; break;
default: from.SendMessage( "Turn to face the wall on which to hang this trophy." ); return;
}
}
int itemID = 0;
if ( northWall )
itemID = m_NorthID;
else if ( westWall )
itemID = m_WestID;
else
from.SendLocalizedMessage( 1042626 ); // The trophy must be placed next to a wall.
if ( itemID > 0 )
{
house.Addons.Add( new TrophyAddon( from, itemID, m_WestID, m_NorthID, m_DeedNumber, m_AddonNumber, m_Hunter, m_AnimalWeight ) );
Delete();
}
}
else
{
from.SendLocalizedMessage( 502092 ); // You must be in your house to do this.
}
}
else
{
from.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
}
}
}
}