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.


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 )
     {
     }
   }
}
 
Back