Ugh, this is all messy, im trying to make a repeatingtrap execute 2 methods +internaltimer, this is what i currently have;

repeatingtrap script:

Code:
using System;
using System.Collections;
using System.Collections.Generic;
using Server.Mobiles;
using Server.Spells;
using Server.Gumps;
using Server.Engines.XmlSpawner2;
using Server;
using Server.Items;
using Server.Network;
using System.Text;
using Server.Misc;


namespace Server.Items
{
    public class Rtw : BaseTrap
    {

        private int m_TrapRange;
        private int m_MinDamage;
        private int m_MaxDamage;
        private int m_SpellEffect;
        private double m_RefireDelay;
        private bool m_NoDamageHidden;
        private int m_Sound;
       


        //public virtual int DamagedItemEffectDuration { get { return 110; } }
        public virtual int DamagedItemEffectDuration { get { return 220; } }

        public virtual bool UseEffectsDamageIndicator { get { return true; } }    // show damage using location effects
        public virtual bool UseColorDamageIndicator { get { return false; } }    // show damage using item rehueing

        public virtual int WhenToAutoRepair { get { return 0; } }  // 0=never, 1=after any damage, 2=after being destroyed
        public virtual double AutoRepairFactor { get { return 0.1; } } // fraction of HitsMax to repair on each autorepair OnTick. A value of 1 will fully repair.

        private int m_Hits = 1000;        // current hits
        private int m_HitsMax = 1000;    // max hits
        private int m_ResistFire = 30;    // percentage resistance to fire attacks
        private int m_ResistPhysical = 30;    // percentage resistance to physical attacks
        private int m_Stone = 1;    // amount of stone required per repair
        private int m_Iron = 20;    // amount of iron required per repair
        private int m_Wood = 20;    // amount of wood required per repair
        private int m_DestroyedItemID = 10984;    // itemid used when hits go to zero. 2322=dirt patch, 10984 pulsing pool.  Specifying a value of zero will cause the object to be permanently destroyed.
        private TimeSpan m_AutoRepairTime = TimeSpan.Zero;  // autorepair disabled by default

        private bool m_Enabled = true; // allows enabling/disabling siege damage and its effects
        private DateTime m_AutoRepairEnd;
    //    private AutoRepairTimer m_AutoRepairTimer;
        public bool NeedsEffectsUpdate = true;
        private ArrayList m_OriginalItemIDList = new ArrayList();        // original itemids of parent item
        private ArrayList m_OriginalHueList = new ArrayList();        // original hues of parent item
        public bool BeingRepaired;
        private EffectsTimer m_EffectsTimer;


   

        [CommandProperty(AccessLevel.GameMaster)]
        public int TrapRange
        {
            get { return m_TrapRange; }
            set { m_TrapRange = value; }
        }

        [CommandProperty(AccessLevel.GameMaster)]
        public int MinDamage
        {
            get { return m_MinDamage; }
            set { m_MinDamage = value; }
        }

        [CommandProperty(AccessLevel.GameMaster)]
        public int MaxDamage
        {
            get { return m_MaxDamage; }
            set { m_MaxDamage = value; }
        }

        [CommandProperty(AccessLevel.GameMaster)]
        public int SpellEffect
        {
            get { return m_SpellEffect; }
            set { m_SpellEffect = value; }
        }

        [CommandProperty(AccessLevel.GameMaster)]
        public double RefireDelay
        {
            get { return m_RefireDelay; }
            set { m_RefireDelay = value; }

        }

        [CommandProperty(AccessLevel.GameMaster)]
        public bool NoDamageHidden
        {
            get { return m_NoDamageHidden; }
            set { m_NoDamageHidden = value; }

        }

        [CommandProperty(AccessLevel.GameMaster)]
        public int Sound
        {
            get { return m_Sound; }
            set { m_Sound = value; }
        }

        private Timer m_Timer;

        [Constructable]
        public Rtw() : base(0x2F5A)
        {

            m_TrapRange = 4;
            Visible = true;
            m_MinDamage = 0;
            this.Name = "Trw";
            m_MaxDamage = 0;
            m_SpellEffect = 0;
            m_RefireDelay = 1;
            m_Sound = 0;
            m_NoDamageHidden = true;
        }
   
   
        public static void Detection(Mobile from)
        {
            Mobile src = from;

            if (DateTime.Now < src.NextSkillTime)
            {
             //   src.SendSkillMessage();
                return;
            }


            double srcSkill = src.Skills[SkillName.DetectHidden].Value;
            int range = (int)(srcSkill / 5.0);

            if (!src.CheckSkill(SkillName.DetectHidden, 0.0, 100.0))
                range /= 2;

            bool detectedanyone = false;
           
            if ( range > 0 )
            {
                ArrayList inRangeArray = new ArrayList();
               
                foreach ( Mobile trg in src.GetMobilesInRange( range ) )
                {
                    if( trg is PlayerMobile )
                    {
                        PlayerMobile test = trg as PlayerMobile;
                       
                        if ( trg.Hidden && src != trg )
                        {
                            double ss = srcSkill + Utility.Random( 21 ) - 10;
                            double ts = trg.Skills[SkillName.Hiding].Value + Utility.Random( 21 ) - 10;
                            if ( (src.AccessLevel >= trg.AccessLevel) && (ss >= ts) )
                            {
                                detectedanyone = true;
                                Detecting(src, trg);
                                inRangeArray.Add(trg);
                            }
                        }
                    }
                }
               
                //if(detectedanyone)
                //    src.SendMessage("You detect someone nearby!");
                //else
                //    src.SendMessage("You didn't detect anyone nearby.");
               
                InternalTimer pause = new InternalTimer( src, inRangeArray );
                pause.Start();

                src.NextSkillTime = DateTime.Now + TimeSpan.FromSeconds(6.0);
               
            }
        }
    //////////////////////TIMER + ON TICK ++++ ////////<----- METHOD IM TRYING TO EXECUTE
        private static void Detecting(Mobile from, Mobile targ)
        {
           
            PlayerMobile pm = (PlayerMobile)targ;
           
            List<Mobile> list = pm.VisibilityList;
           
            list.Add( from );
           
            if ( Utility.InUpdateRange( from, targ ) )
            {
                if ( from.CanSee( targ ) )
                {
           
                    from.Send( new Network.MobileIncoming( from, targ ) );
                    from.SendAsciiMessage(2458,"You have been detected!");
                }
           
        }
        }
       
       

        private class InternalTimer : Timer
        {
   
private Mobile m_From;
            private ArrayList m_InRange;

            public InternalTimer(Mobile from, ArrayList inRange2)
                : base(TimeSpan.FromSeconds(6.0))
            {
                m_From = from;
                m_InRange = inRange2;
            }

            protected override void OnTick()
            {
   
                foreach (Mobile target in m_InRange)
                {
                    Mobile TargetMobile = target;
                    PlayerMobile TargetPlayerMobile = target as PlayerMobile;

                    TargetPlayerMobile.VisibilityList.Remove(m_From);

                    if (TargetMobile.Hidden && m_From != TargetPlayerMobile)
                    {
                        if (!m_From.CanSee(TargetPlayerMobile) && Utility.InUpdateRange(m_From, TargetMobile))
                            m_From.Send(TargetPlayerMobile.RemovePacket);
                    }
                }
                m_InRange.Clear();
            }
        }
    //////////////////////TIMER + ON TICK ++++ ////////<----- METHOD IM TRYING TO EXECUTE
   
        public override bool OnEquip( Mobile from )
        {
        return false;
        }
       
           public override void OnDoubleClick( Mobile from )
        {
            base.OnDoubleClick(from);
    
            if (from == null)
                return;
       
            
        //     Server.SkillHandlers.DetectHiddenverocultosaram.Detection(from);
       
          
        }


       
            public override bool DropToWorld( Mobile from, Point3D p )
        {
             base.DropToWorld( from, p );
              if ( this.Movable == true )
                        {
         Server.SkillHandlers.DetectHiddenverocultosaram.Detection(from);
              this.Movable = false;
              this.Visible = false;

          }

          return true;
            // Server.SkillHandlers.DetectHiddenverocultosaram.Detection(from);
           
            }
   
   
        public virtual void StartTimer()
        {
            if (m_Timer == null)
                m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(RefireDelay), TimeSpan.FromSeconds(RefireDelay), new TimerCallback(Refresh));
        }

        public virtual void StopTimer()
        {
            if (m_Timer != null )
                m_Timer.Stop();

            m_Timer = null;
        }

        public virtual void CheckTimer()
        {
            Map map = this.Map;

            if (map != null && map.GetSector(GetWorldLocation()).Active)
                StartTimer();
     
                else
            StopTimer();
        }

        public override void OnLocationChange(Point3D oldLocation)
        {
            base.OnLocationChange(oldLocation);

            CheckTimer();
        }

        public override void OnMapChange()
        {
            base.OnMapChange();

            CheckTimer();
        }

        public override void OnSectorActivate()
        {
            base.OnSectorActivate();

            StartTimer();
        }

        public override void OnSectorDeactivate()
        {
            base.OnSectorDeactivate();

            StopTimer();
        }


        public virtual void Refresh()
        {
            ArrayList list = new ArrayList();

            foreach (Mobile mob in GetMobilesInRange(TrapRange))
            {
                if (!mob.Alive || mob.AccessLevel > AccessLevel.Player || (mob.Hidden && NoDamageHidden) || (mob.Player && mob.Backpack.FindItemByType(typeof(objeto1150)) != null)/* || ItemID == 0x2AE8*/ )
                    continue;

                if (((this.Z + 8) >= mob.Z && (mob.Z + 16) > this.Z))
                {
                    if (mob is BaseCreature && (((BaseCreature)mob).Controlled || ((BaseCreature)mob).Summoned))
                        list.Add(mob);
                    else if (mob.Player)
                        list.Add(mob);

                    foreach (Mobile mm in list)
                    {
                       Detecting();       ////////<----- METHOD IM TRYING TO EXECUTE
                      
                      
                      //  Effects.SendMovingEffect(this, mm, SpellEffect, 5, 0, false, true);
                      //  Effects.PlaySound(Location, Map, Sound);
                      //  SpellHelper.Damage(TimeSpan.FromSeconds(0.5), mm, mm, Utility.RandomMinMax(MinDamage, MaxDamage), 100, 0, 0, 0, 0);
                    }
                }
            }
        }

        public override void OnMovement(Mobile m, Point3D oldLocation)
        {
            base.OnMovement(m, oldLocation);

            if (m.Location == oldLocation || !m.Player || !m.Alive || m.AccessLevel > AccessLevel.Player || m.Hidden || (m.Player && m.Backpack.FindItemByType(typeof(objeto1150)) != null) /*|| ItemID == 0x2AE8*/)
                return;

            if (CheckRange(m.Location, oldLocation, TrapRange))
            {
                CheckTimer();
          Detecting();      ////////<----- METHOD IM TRYING TO EXECUTE
         
             //   Effects.SendMovingEffect(this, m, SpellEffect, 5, 0, false, true);
              //  SpellHelper.Damage(TimeSpan.FromSeconds(0.5), m, m, Utility.RandomMinMax(MinDamage, MaxDamage), 100, 0, 0, 0, 0);
              //  Effects.PlaySound(Location, Map, Sound);
            }
        }

        public Rtw(Serial serial) : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version

            writer.Write(m_TrapRange);
            writer.Write(m_MinDamage);
            writer.Write(m_MaxDamage);
            writer.Write(m_SpellEffect);
            writer.Write(m_RefireDelay);
            writer.Write(m_NoDamageHidden);
            writer.Write(m_Sound);

        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            switch (version)
            {

                case 0:
                    {
                        m_TrapRange = reader.ReadInt();
                        m_MinDamage = reader.ReadInt();
                        m_MaxDamage = reader.ReadInt();
                        m_SpellEffect = reader.ReadInt();
                        m_RefireDelay = reader.ReadDouble();
                        m_NoDamageHidden = reader.ReadBool();
                        m_Sound = reader.ReadInt();
                        CheckTimer();

                        break;
                    }
            }
        }
    }
}


The idea is the player hidden steps into the traprange and then (If they carrying a certain item, wich i have no clue how to play with packets) they can see him even hidden.

the next methods are taken from the files i attach.


Detection(Mobile from), Detecting(Mobile from, Mobile targ), InternalTimer

Code:
        public static void Detection(Mobile from)
        {
            Mobile src = from;

            if (DateTime.Now < src.NextSkillTime)
            {
             //   src.SendSkillMessage();
                return;
            }


            double srcSkill = src.Skills[SkillName.DetectHidden].Value;
            int range = (int)(srcSkill / 5.0);

            if (!src.CheckSkill(SkillName.DetectHidden, 0.0, 100.0))
                range /= 2;

            bool detectedanyone = false;
           
            if ( range > 0 )
            {
                ArrayList inRangeArray = new ArrayList();
               
                foreach ( Mobile trg in src.GetMobilesInRange( range ) )
                {
                    if( trg is PlayerMobile )
                    {
                        PlayerMobile test = trg as PlayerMobile;
                       
                        if ( trg.Hidden && src != trg )
                        {
                            double ss = srcSkill + Utility.Random( 21 ) - 10;
                            double ts = trg.Skills[SkillName.Hiding].Value + Utility.Random( 21 ) - 10;
                            if ( (src.AccessLevel >= trg.AccessLevel) && (ss >= ts) )
                            {
                                detectedanyone = true;
                                Detecting(src, trg);
                                inRangeArray.Add(trg);
                            }
                        }
                    }
                }
               
                //if(detectedanyone)
                //    src.SendMessage("You detect someone nearby!");
                //else
                //    src.SendMessage("You didn't detect anyone nearby.");
               
                InternalTimer pause = new InternalTimer( src, inRangeArray );
                pause.Start();

                src.NextSkillTime = DateTime.Now + TimeSpan.FromSeconds(6.0);
               
            }
        }
    //////////////////////TIMER + ON TICK ++++ ////////<----- METHOD IM TRYING TO EXECUTE
        private static void Detecting(Mobile from, Mobile targ)
        {
           
            PlayerMobile pm = (PlayerMobile)targ;
           
            List<Mobile> list = pm.VisibilityList;
           
            list.Add( from );
           
            if ( Utility.InUpdateRange( from, targ ) )
            {
                if ( from.CanSee( targ ) )
                {
           
                    from.Send( new Network.MobileIncoming( from, targ ) );
                    from.SendAsciiMessage(2458,"You have been detected!");
                }
           
        }
        }
       
       

        private class InternalTimer : Timer
        {
   
private Mobile m_From;
            private ArrayList m_InRange;

            public InternalTimer(Mobile from, ArrayList inRange2)
                : base(TimeSpan.FromSeconds(6.0))
            {
                m_From = from;
                m_InRange = inRange2;
            }

            protected override void OnTick()
            {
   
                foreach (Mobile target in m_InRange)
                {
                    Mobile TargetMobile = target;
                    PlayerMobile TargetPlayerMobile = target as PlayerMobile;

                    TargetPlayerMobile.VisibilityList.Remove(m_From);

                    if (TargetMobile.Hidden && m_From != TargetPlayerMobile)
                    {
                        if (!m_From.CanSee(TargetPlayerMobile) && Utility.InUpdateRange(m_From, TargetMobile))
                            m_From.Send(TargetPlayerMobile.RemovePacket);
                    }
                }
                m_InRange.Clear();
            }
        }
    //////////////////////TIMER + ON TICK ++++ ////////<----- METHOD IM TRYING TO EXECUTE



Errors:

CS1501: Line 355: No overload for method 'Detecting' takes '1' arguments
CS1501: Line 374: No overload for method 'Detecting' takes '0' arguments



Obviously im getting erros :D
 

Attachments

  • CustomDetectHidden3.1415.zip
    4 KB · Views: 1
Back