mirror of
https://github.com/runuo/runuo
synced 2026-08-11 22:26:04 -04:00
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/
260 lines
No EOL
5.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |