runuo/Scripts/Items/Containers/TrapableContainer.cs
xavier 5c7774b99a Missing System Message "Your pet looks happier" (regardless of loyalty)
http://www.runuo.com/community/threads/ready-missing-system-message-your-pet-looks-happier.450209/

Not all powerscrolls do drop - Ninjitsu, Bushido etc.
http://www.runuo.com/community/threads/ready-not-all-powerscrolls-do-drop.459974/

Savage Kin Paint Wrong Skill Requirement + Wrong Success Chance
http://www.runuo.com/community/threads/ready-savage-kin-paint-wrong-skill-requirement-wrong-success-chance.455360/

Hag Quest - Stew, can't eat it
http://www.runuo.com/community/threads/ready-hag-quest-stew.454406/

Giant Blue Beetles shouldn't need beating into submission after being tamed once
http://www.runuo.com/community/threads/ready-giant-blue-beetles.450205/

Greater Dragon Fame/Karma Doesn't Match OSI
http://www.runuo.com/community/threads/ready-greater-dragon-fame-karma-doesnt-match-osi.472206/

Resizing Houses, you can resize a house by using a command under the house sign
http://www.runuo.com/community/threads/ready-resizing-houses.414762/

Crafted Shield Resists are wrong on RunUO
http://www.runuo.com/community/threads/ready-crafted-shield-resists.454186/

Yomotsu Mines, you should not be able to recall out of there.
http://www.runuo.com/community/threads/ready-yomotsu-mines.445486/

Missing Necro Icons in the Buff/Debuff Bar
http://www.runuo.com/community/threads/ready-missing-necro-icons-in-the-buff-debuff-bar.450872/

Chivalry Spells, you are allowed to attempt casting of spells outside of your skill range without a system message
http://www.runuo.com/community/threads/ready-chivalry-spells.450757/

Tinker tools use a different graphic on OSI
http://www.runuo.com/community/threads/ready-tinker-tools.460690/

Tinkering should not be required when crafted a Tetsubo
http://www.runuo.com/community/threads/ready-wrong-skill-requirement-carpentry-wrong-success-chances.455342/

Carpentry-Small+Large Beds -Wrong Success Chance
http://www.runuo.com/community/threads/ready-carpentry-small-large-beds-wrong-success-chance.455794/

Telekinesis, various changes to behaviour with items
http://www.runuo.com/community/threads/ready-telekinesis.455250/

Forensic Evaluation Various issues
http://www.runuo.com/community/threads/ready-forensic-evaluation-various-issues-merged.458700/

Animate Dead Corpses, you cannot carve the corpse after it's used
http://www.runuo.com/community/threads/ready-animate-dead-corpses.453823/

You should be able to use begging skill while riding
http://www.runuo.com/community/threads/ready-begging-while-riding.466174/

Crafting Mod Lower Requirements should only appear on shields
http://www.runuo.com/community/threads/ready-crafting-mod-lower-requirements.452112/

You should be revealed While Taking Poison/Strangle Damage
http://www.runuo.com/community/threads/ready-you-never-reveal-while-taking-poison-strangle-damage.456946/

Insurance messages don't do the math!
http://www.runuo.com/community/threads/ready-insurance-messages-dont-do-the-math.454928/

Slayers should work on area of effect spells
http://www.runuo.com/community/threads/ready-slayers-should-work-on-area-of-effect-spells.448774/

You should not be able to use any travel spell in Heartwood
http://www.runuo.com/community/threads/ready-heartwood.457379/

Welcome Back To The House Friend message does not show post-AoS
http://www.runuo.com/community/threads/ready-welcome-back-to-the-house-friend.415924/

Giant Beetle speed should be very fast when magery spells are cast on it
http://www.runuo.com/community/threads/ready-giant-beetle.417848/
2011-06-25 18:39:14 +00:00

260 lines
No EOL
5.8 KiB
C#

using System;
namespace Server.Items
{
public enum TrapType
{
None,
MagicTrap,
ExplosionTrap,
DartTrap,
PoisonTrap
}
public abstract class TrapableContainer : BaseContainer, ITelekinesisable
{
private TrapType m_TrapType;
private int m_TrapPower;
private int m_TrapLevel;
[CommandProperty( AccessLevel.GameMaster )]
public TrapType TrapType
{
get
{
return m_TrapType;
}
set
{
m_TrapType = value;
}
}
[CommandProperty( AccessLevel.GameMaster )]
public int TrapPower
{
get
{
return m_TrapPower;
}
set
{
m_TrapPower = value;
}
}
[CommandProperty( AccessLevel.GameMaster )]
public int TrapLevel
{
get
{
return m_TrapLevel;
}
set
{
m_TrapLevel = value;
}
}
public virtual bool TrapOnOpen{ get{ return true; } }
public TrapableContainer( int itemID ) : base( itemID )
{
}
public TrapableContainer( Serial serial ) : base( serial )
{
}
private void SendMessageTo( Mobile to, int number, int hue )
{
if ( Deleted || !to.CanSee( this ) )
return;
to.Send( new Network.MessageLocalized( Serial, ItemID, Network.MessageType.Regular, hue, 3, number, "", "" ) );
}
private void SendMessageTo( Mobile to, string text, int hue )
{
if ( Deleted || !to.CanSee( this ) )
return;
to.Send( new Network.UnicodeMessage( Serial, ItemID, Network.MessageType.Regular, hue, 3, "ENU", "", text ) );
}
public virtual bool ExecuteTrap( Mobile from )
{
if ( m_TrapType != TrapType.None )
{
Point3D loc = this.GetWorldLocation();
Map facet = this.Map;
if ( from.AccessLevel >= AccessLevel.GameMaster )
{
SendMessageTo( from, "That is trapped, but you open it with your godly powers.", 0x3B2 );
return false;
}
switch ( m_TrapType )
{
case TrapType.ExplosionTrap:
{
SendMessageTo( from, 502999, 0x3B2 ); // You set off a trap!
if ( from.InRange( loc, 3 ) )
{
int damage;
if ( m_TrapLevel > 0 )
damage = Utility.RandomMinMax( 10, 30 ) * m_TrapLevel;
else
damage = m_TrapPower;
AOS.Damage( from, damage, 0, 100, 0, 0, 0 );
// Your skin blisters from the heat!
from.LocalOverheadMessage( Network.MessageType.Regular, 0x2A, 503000 );
}
Effects.SendLocationEffect( loc, facet, 0x36BD, 15, 10 );
Effects.PlaySound( loc, facet, 0x307 );
break;
}
case TrapType.MagicTrap:
{
if ( from.InRange( loc, 1 ) )
from.Damage( m_TrapPower );
//AOS.Damage( from, m_TrapPower, 0, 100, 0, 0, 0 );
Effects.PlaySound( loc, Map, 0x307 );
Effects.SendLocationEffect( new Point3D( loc.X - 1, loc.Y, loc.Z ), Map, 0x36BD, 15 );
Effects.SendLocationEffect( new Point3D( loc.X + 1, loc.Y, loc.Z ), Map, 0x36BD, 15 );
Effects.SendLocationEffect( new Point3D( loc.X, loc.Y - 1, loc.Z ), Map, 0x36BD, 15 );
Effects.SendLocationEffect( new Point3D( loc.X, loc.Y + 1, loc.Z ), Map, 0x36BD, 15 );
Effects.SendLocationEffect( new Point3D( loc.X + 1, loc.Y + 1, loc.Z + 11 ), Map, 0x36BD, 15 );
break;
}
case TrapType.DartTrap:
{
SendMessageTo( from, 502999, 0x3B2 ); // You set off a trap!
if ( from.InRange( loc, 3 ) )
{
int damage;
if ( m_TrapLevel > 0 )
damage = Utility.RandomMinMax( 5, 15 ) * m_TrapLevel;
else
damage = m_TrapPower;
AOS.Damage( from, damage, 100, 0, 0, 0, 0 );
// A dart imbeds itself in your flesh!
from.LocalOverheadMessage( Network.MessageType.Regular, 0x62, 502998 );
}
Effects.PlaySound( loc, facet, 0x223 );
break;
}
case TrapType.PoisonTrap:
{
SendMessageTo( from, 502999, 0x3B2 ); // You set off a trap!
if ( from.InRange( loc, 3 ) )
{
Poison poison;
if ( m_TrapLevel > 0 )
{
poison = Poison.GetPoison( Math.Max( 0, Math.Min( 4, m_TrapLevel - 1 ) ) );
}
else
{
AOS.Damage( from, m_TrapPower, 0, 0, 0, 100, 0 );
poison = Poison.Greater;
}
from.ApplyPoison( from, poison );
// You are enveloped in a noxious green cloud!
from.LocalOverheadMessage( Network.MessageType.Regular, 0x44, 503004 );
}
Effects.SendLocationEffect( loc, facet, 0x113A, 10, 20 );
Effects.PlaySound( loc, facet, 0x231 );
break;
}
}
m_TrapType = TrapType.None;
m_TrapPower = 0;
m_TrapLevel = 0;
return true;
}
return false;
}
public virtual void OnTelekinesis( Mobile from )
{
Effects.SendLocationParticles( EffectItem.Create( Location, Map, EffectItem.DefaultDuration ), 0x376A, 9, 32, 5022 );
Effects.PlaySound( Location, Map, 0x1F5 );
if( this.TrapOnOpen )
{
ExecuteTrap( from );
}
}
public override void Open( Mobile from )
{
if ( !this.TrapOnOpen || !ExecuteTrap( from ) )
base.Open( from );
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 2 ); // version
writer.Write( (int) m_TrapLevel );
writer.Write( (int) m_TrapPower );
writer.Write( (int) m_TrapType );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 2:
{
m_TrapLevel = reader.ReadInt();
goto case 1;
}
case 1:
{
m_TrapPower = reader.ReadInt();
goto case 0;
}
case 0:
{
m_TrapType = (TrapType)reader.ReadInt();
break;
}
}
}
}
}