Sorthious
Member
I tried to post this in RunUO Resources...but it wouldnt let me attach a file. I tried .zip,7z,etc it wouldn't even recognize the file. Anyway, I hope this is ok to put here....I think this is in ServUO also?.....if not could someone move to a more appropriate area?
OnTick() made it so players were never added to List<Mobile> onDamage. OnMoveOver had no logic so ANY mobile was being damaged, including dead ones. The fixes can be used in AcidSlime.cs also. I think I covered all the problems, if not let me know.
OnTick() made it so players were never added to List<Mobile> onDamage. OnMoveOver had no logic so ANY mobile was being damaged, including dead ones. The fixes can be used in AcidSlime.cs also. I think I covered all the problems, if not let me know.
Code:
using System;
using Server;
using Server.Mobiles;
using Server.Spells;
using System.Collections;
using System.Collections.Generic;
namespace Server.Items
{
public class PoolOfAcid : Item
{
private TimeSpan m_Duration;
private int m_MinDamage;
private int m_MaxDamage;
private DateTime m_Created;
private bool m_Drying;
private Timer m_Timer;
[Constructable]
public PoolOfAcid() : this( TimeSpan.FromSeconds( 10.0 ), 2, 5 )
{
}
public override string DefaultName { get { return "a pool of acid"; } }
[Constructable]
public PoolOfAcid( TimeSpan duration, int minDamage, int maxDamage )
: base( 0x122A )
{
Hue = 0x3F;
Movable = false;
m_MinDamage = minDamage;
m_MaxDamage = maxDamage;
m_Duration = duration;
m_Created = DateTime.UtcNow;
m_Drying = false;
m_Timer = Timer.DelayCall( TimeSpan.Zero, TimeSpan.FromSeconds( 1 ), new TimerCallback( OnTick ) );
}
public override void OnAfterDelete()
{
if( m_Timer != null )
m_Timer.Stop();
}
private void OnTick()
{
DateTime now = DateTime.UtcNow;
TimeSpan age = now - m_Created;
if ( age > m_Duration)
{
Delete();
}
else
{
if( !m_Drying && age > (m_Duration - age))
{
m_Drying = true;
ItemID = 0x122B;
}
List<Mobile> toDamage = new List<Mobile>();
foreach( Mobile m in GetMobilesInRange( 0 ) )
{
if (IsValidTarget(m))
{
toDamage.Add(m);
}
}
for ( int i = 0; i < toDamage.Count; i++ )
{
Damage(toDamage[i]);
}
}
}
private bool IsValidTarget(Mobile m)
{
BaseCreature bc = m as BaseCreature;
if (m.Alive && m.AccessLevel == AccessLevel.Player &&
m is PlayerMobile)
{
return true;
}
else if (bc != null && !bc.IsDeadBondedPet
&& (bc.Controlled || bc.Summoned))
{
return true;
}
return false;
}
public override bool OnMoveOver(Mobile m)
{
if (IsValidTarget(m))
{
Damage(m);
}
return true;
}
public void Damage ( Mobile m )
{
int damage = Utility.RandomMinMax(m_MinDamage, m_MaxDamage);
if (Core.AOS)
AOS.Damage(m, damage, 0, 0, 0, 100, 0);
else
m.Damage(damage);
}
public PoolOfAcid( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
//Don't serialize these
}
public override void Deserialize( GenericReader reader )
{
}
}
}