Beispiel #1
0
        public Creature(CreatureGroup group, float x, float y, Chromosome chromo = null)
            : base(x, y)
        {
            this.group = group;

            if (chromo != null)
            {
                chromosome = chromo;
            }
            else
            {
                chromosome = new Chromosome();
            }
            SetProperties();
        }
        public override void Deserialize( GenericReader reader )
        {
            base.Deserialize( reader );

            int version = reader.ReadInt();

            int test = 0;

            if (version > 57)
            {
                m_Orders = new List<OrderInfo>();
                int orderCount = reader.ReadInt();
                for (int i = 0; i < orderCount; i++)
                {
                    OrderInfo newOrder = new OrderInfo("", 1, 1, this);
                    OrderInfo.Deserialize(reader, newOrder);
                    m_Orders.Add(newOrder);
                }
            }

            if (version > 55)
            {
                m_Deadly = reader.ReadInt();
            }

            if (version > 54)
            {
                m_Nation = (Nation)reader.ReadInt();
                m_Government = (GovernmentEntity)reader.ReadItem();
                m_Organization = (CustomGuildStone)reader.ReadItem();
            }

            if( version > 53 )
                m_AuraType = (AuraType)reader.ReadInt();

            if( version > 52 )
                m_CustomBreathType = (CustomBreathType)reader.ReadInt();

            if( version > 51 )
                m_ManeuverResistance = reader.ReadInt();

            if( version > 50 )
            {
                m_CantInterrupt = reader.ReadBool();
                m_CantParry = reader.ReadBool();
                m_HasNoCorpse = reader.ReadBool();
            }

            if( version > 49 )
            {
                int count = reader.ReadInt();

                for( int i = 0; i < count; i++ )
                    m_SecondaryWikiConfigs.Add( reader.ReadString() );

                count = reader.ReadInt();

                for( int i = 0; i < count; i++ )
                {
                    XMLEventType eventType = (XMLEventType)reader.ReadInt();
                    List<string> list = new List<string>();
                    int codeCount = reader.ReadInt();

                    for( int a = 0; a < codeCount; a++ )
                        list.Add( reader.ReadString() );

                    m_XMLEventsDatabase.Add( eventType, list );
                }
            }

            if( version > 48 )
                m_RangedAttackType = (RangedAttackType)reader.ReadInt();

            if( version > 47 )
                m_CustomSkinnableParts = reader.ReadStrongItemList();

            if( version > 46 )
            {
                m_NoWoundedMovePenalty = reader.ReadBool();
                m_MeleeAttackType = (MeleeAttackType)reader.ReadInt();
            }

            if( version > 45 )
                m_WikiConfig = reader.ReadString();

            if( version > 44 )
            {
                m_Technique = reader.ReadString();
                m_TechniqueLevel = reader.ReadInt();
            }

            if( version > 43 )
                m_StableTicket = reader.ReadItem();

            if( version > 41 )
                m_StabledOwner = reader.ReadMobile();

            if( version > 40 )
                m_ReceivedNewLoot = reader.ReadBool();

            if( version > 39 )
            {
                m_TimeOfDeath = reader.ReadDeltaTime();

                if( reader.ReadBool() )
                    BeginRess( reader.ReadDeltaTime() - DateTime.Now, this.Corpse );

                m_Lives = reader.ReadInt();
            }

            if( version > 38 )
                m_ReleaseTime = reader.ReadDateTime();

            if( version > 37 )
                m_MarkedForTermination = reader.ReadBool();

            if( version > 36 )
            {
                m_FavouriteStance = reader.ReadString();
                m_FavouriteManeuver = reader.ReadString();
            }

            if( version > 34 )
                m_CombatStyles = new CombatStyles( reader );

            if( version > 32 )
                m_Feats = new Feats( reader, true );

            if( version > 33 )
                m_FixedScales = reader.ReadBool();

            if( version > 31 )
            {
                m_NoDeathCondition = reader.ReadBool();
                m_NoDeath = reader.ReadBool();
                m_NoDeathMsg = reader.ReadString();
                m_NoDeathSound = reader.ReadInt();
            }

            if( version > 30 )
                this.Frozen = reader.ReadBool();

            if( version > 27 )
            {
                m_VanishTime = reader.ReadDateTime();
                m_VanishEmote = reader.ReadString();
            }

            m_CreatureGroup = (CreatureGroup)reader.ReadInt();

            if( version < 29 )
            {
                test = reader.ReadInt();
                m_IsSneaky = test > 0;
            }

            else
                m_IsSneaky = reader.ReadBool();

            if( version < 29 )
            {
                test = reader.ReadInt();
                m_TakesLifeOnKill = test > 0;
            }

            else
                m_TakesLifeOnKill = reader.ReadBool();

            m_Description = reader.ReadString();

            m_Intimidated = reader.ReadInt();

            if( version < 29 )
            {
                test = reader.ReadInt();
                m_IsHuntingHound = test > 0;
            }

            else
                m_IsHuntingHound = reader.ReadBool();

            m_XPScale = reader.ReadInt();

            m_StatScale = reader.ReadInt();

            m_SkillScale = reader.ReadInt();

            m_Level = reader.ReadInt();

            m_XP = reader.ReadInt();

            m_NextLevel = reader.ReadInt();

            if( version < 29 )
            {
                test = reader.ReadInt();
                m_Warned = test > 0;
            }

            else
                m_Warned = reader.ReadBool();

            m_WarningTime = reader.ReadDateTime();

            m_BribingTime = reader.ReadDateTime();

            m_EmployerFeatLevel = reader.ReadInt();

            m_TargetsName = reader.ReadString();

            m_Employer = reader.ReadMobile();

            m_HiringTime = reader.ReadDateTime();

            if( version < 29 )
            {
                test = reader.ReadInt();
                m_Bribed = test > 0;
            }

            else
                m_Bribed = reader.ReadBool();

            m_LastSeen = reader.ReadDateTime();

            if( version < 29 )
            {
                test = reader.ReadInt();
                m_CanBeInformant = test > 0;
            }

            else
                m_CanBeInformant = reader.ReadBool();

            m_CurrentAI = (AIType)reader.ReadInt();
            m_DefaultAI = (AIType)reader.ReadInt();

            m_iRangePerception = reader.ReadInt();
            m_iRangeFight = reader.ReadInt();

            m_iTeam = reader.ReadInt();

            m_dActiveSpeed = reader.ReadDouble();
            m_dPassiveSpeed = reader.ReadDouble();
            m_dCurrentSpeed = reader.ReadDouble();

            if ( m_iRangePerception == OldRangePerception )
                m_iRangePerception = DefaultRangePerception;

            m_pHome.X = reader.ReadInt();
            m_pHome.Y = reader.ReadInt();
            m_pHome.Z = reader.ReadInt();

            if ( version >= 1 )
            {
                m_iRangeHome = reader.ReadInt();

                int i, iCount;

                iCount = reader.ReadInt();
                for ( i=0; i< iCount; i++ )
                {
                    string str = reader.ReadString();
                    Type type = Type.GetType( str );

                    if ( type != null )
                    {
                        m_arSpellAttack.Add( type );
                    }
                }

                iCount = reader.ReadInt();
                for ( i=0; i< iCount; i++ )
                {
                    string str = reader.ReadString();
                    Type type = Type.GetType( str );

                    if ( type != null )
                    {
                        m_arSpellDefense.Add( type );
                    }
                }
            }
            else
            {
                m_iRangeHome = 0;
            }

            if ( version >= 2 )
            {
                m_FightMode = ( FightMode )reader.ReadInt();

                m_bControlled = reader.ReadBool();
                m_ControlMaster = reader.ReadMobile();
                m_ControlTarget = reader.ReadMobile();
                m_ControlDest = reader.ReadPoint3D();
                m_ControlOrder = (OrderType) reader.ReadInt();

                m_dMinTameSkill = reader.ReadDouble();

                if ( version < 9 )
                    reader.ReadDouble();

                m_bTamable = reader.ReadBool();
                m_bSummoned = reader.ReadBool();

                if ( m_bSummoned )
                {
                    m_SummonEnd = reader.ReadDeltaTime();
                    new UnsummonTimer( m_ControlMaster, this, m_SummonEnd - DateTime.Now ).Start();
                }

                m_iControlSlots = reader.ReadInt();
            }
            else
            {
                m_FightMode = FightMode.Closest;

                m_bControlled = false;
                m_ControlMaster = null;
                m_ControlTarget = null;
                m_ControlOrder = OrderType.None;
            }

            if ( version >= 3 )
                m_Loyalty = reader.ReadInt();
            else
                m_Loyalty = MaxLoyalty; // Wonderfully Happy

            if ( version >= 4 )
                m_CurrentWayPoint = reader.ReadItem() as WayPoint;

            if ( version >= 5 )
                m_SummonMaster = reader.ReadMobile();

            if ( version >= 6 )
            {
                //m_HitsMax = reader.ReadInt();
                //m_StamMax = reader.ReadInt();
                //m_ManaMax = reader.ReadInt();
                m_DamageMin = reader.ReadInt();
                m_DamageMax = reader.ReadInt();
            }

            if ( version >= 7 )
            {
                m_PhysicalResistance = reader.ReadInt();
                m_PhysicalDamage = reader.ReadInt();

                m_FireResistance = reader.ReadInt();
                m_FireDamage = reader.ReadInt();

                m_ColdResistance = reader.ReadInt();
                m_ColdDamage = reader.ReadInt();

                m_PoisonResistance = reader.ReadInt();
                m_PoisonDamage = reader.ReadInt();

                m_EnergyResistance = reader.ReadInt();
                m_EnergyDamage = reader.ReadInt();
            }

            if ( version >= 8 )
                m_Owners = reader.ReadStrongMobileList();
            else
                m_Owners = new List<Mobile>();

            if ( version >= 10 )
            {
                m_IsDeadPet = reader.ReadBool();
                m_IsBonded = reader.ReadBool();
                m_BondingBegin = reader.ReadDateTime();
                m_OwnerAbandonTime = reader.ReadDateTime();
            }

            if ( version >= 11 )
                m_HasGeneratedLoot = reader.ReadBool();
            else
                m_HasGeneratedLoot = true;

            if ( version >= 12 )
                m_Paragon = reader.ReadBool();
            else
                m_Paragon = false;

            if ( version >= 13 && reader.ReadBool() )
                m_Friends = reader.ReadStrongMobileList();
            else if ( version < 13 && m_ControlOrder >= OrderType.Unfriend )
                ++m_ControlOrder;

            if ( version < 16 )
                Loyalty *= 10;

            double activeSpeed = m_dActiveSpeed;
            double passiveSpeed = m_dPassiveSpeed;

            SpeedInfo.GetSpeeds( this, ref activeSpeed, ref passiveSpeed );

            bool isStandardActive = false;
            for ( int i = 0; !isStandardActive && i < m_StandardActiveSpeeds.Length; ++i )
                isStandardActive = ( m_dActiveSpeed == m_StandardActiveSpeeds[i] );

            bool isStandardPassive = false;
            for ( int i = 0; !isStandardPassive && i < m_StandardPassiveSpeeds.Length; ++i )
                isStandardPassive = ( m_dPassiveSpeed == m_StandardPassiveSpeeds[i] );

            if ( isStandardActive && m_dCurrentSpeed == m_dActiveSpeed )
                m_dCurrentSpeed = activeSpeed;
            else if ( isStandardPassive && m_dCurrentSpeed == m_dPassiveSpeed )
                m_dCurrentSpeed = passiveSpeed;

            if ( isStandardActive && !m_Paragon )
                m_dActiveSpeed = activeSpeed;

            if ( isStandardPassive && !m_Paragon )
                m_dPassiveSpeed = passiveSpeed;

            if ( version >= 14 )
            {
                m_RemoveIfUntamed = reader.ReadBool();
                m_RemoveStep = reader.ReadInt();
            }

            if( version <= 14 && m_Paragon && Hue == 0x31 )
            {
                Hue = Paragon.Hue; //Paragon hue fixed, should now be 0x501.
            }

            m_BluntResistance = reader.ReadInt();
            m_BluntDamage = reader.ReadInt();
            m_SlashingResistance = reader.ReadInt();
            m_SlashingDamage = reader.ReadInt();
            m_PiercingResistance = reader.ReadInt();
            m_PiercingDamage = reader.ReadInt();

            CheckStatTimers();

            Timer.DelayCall( TimeSpan.FromSeconds( 5 ), new TimerCallback( WaitToChangeAI ) );

            AddFollowers();

            if ( IsAnimatedDead )
                Spells.Necromancy.AnimateDeadSpell.Register( m_SummonMaster, this );

            if( this.Level < 1 )
                this.Level = 1;

            if( this.Blessed && this.Alive )
                this.CanBeInformant = true;

            m_Intimidated = 0;

            if( !( this is Mercenary ) && version < 34 && this.Level > 1 )
            {
                int bonus = this.Level / 2;
                int rest = this.Level % 2;

                this.DamageMax += bonus + rest;
                this.DamageMin += bonus;
            }

            LevelSystem.FixStatsAndSkills( this );

            m_Deserialized = true;
        }
Beispiel #3
0
        public void Target(object obj)
        {
            MaabusCoffinComponent comp = obj as MaabusCoffinComponent;

            if (comp != null)
            {
                MaabusCoffin addon = comp.Addon as MaabusCoffin;

                if (addon != null)
                {
                    PlayerMobile pm = Caster as PlayerMobile;

                    if (pm != null)
                    {
                        QuestSystem qs = pm.Quest;

                        if (qs is DarkTidesQuest)
                        {
                            QuestObjective objective = qs.FindObjective(typeof(AnimateMaabusCorpseObjective));

                            if (objective != null && !objective.Completed)
                            {
                                addon.Awake(Caster);
                                objective.Complete();
                            }
                        }
                    }

                    return;
                }
            }

            Corpse c = obj as Corpse;

            if (c == null)
            {
                Caster.SendLocalizedMessage(1061084);                   // You cannot animate that.
            }
            else
            {
                Type type = null;

                if (c.Owner != null)
                {
                    type = c.Owner.GetType();
                }

                if (c.ItemID != 0x2006 || c.Animated || type == typeof(PlayerMobile) || type == null || (c.Owner != null && c.Owner.Fame < 100) || ((c.Owner != null) && (c.Owner is BaseCreature) && ((( BaseCreature )c.Owner).Summoned || (( BaseCreature )c.Owner).IsBonded)))
                {
                    Caster.SendLocalizedMessage(1061085);                       // There's not enough life force there to animate.
                }
                else
                {
                    CreatureGroup group = FindGroup(type);

                    if (group != null)
                    {
                        if (group.m_Entries.Length == 0 || type == typeof(DemonKnight))
                        {
                            Caster.SendLocalizedMessage(1061086);                               // You cannot animate undead remains.
                        }
                        else if (CheckSequence())
                        {
                            Point3D p   = c.GetWorldLocation();
                            Map     map = c.Map;

                            if (map != null)
                            {
                                Effects.PlaySound(p, map, 0x1FB);
                                Effects.SendLocationParticles(EffectItem.Create(p, map, EffectItem.DefaultDuration), 0x3789, 1, 40, 0x3F, 3, 9907, 0);

                                Timer.DelayCall(TimeSpan.FromSeconds(2.0), new TimerStateCallback(SummonDelay_Callback), new object[] { Caster, c, p, map, group });
                            }
                        }
                    }
                }
            }

            FinishSequence();
        }
        private static void SummonDelay_Callback(object state)
        {
            object[] states = (object[])state;

            Mobile        caster = (Mobile)states[0];
            Corpse        corpse = (Corpse)states[1];
            Point3D       loc    = (Point3D)states[2];
            Map           map    = (Map)states[3];
            CreatureGroup group  = (CreatureGroup)states[4];

            if (corpse.ItemID != 0x2006)
            {
                return;
            }

            Mobile owner = corpse.Owner;

            if (owner == null)
            {
                return;
            }

            double necromancy  = caster.Skills[SkillName.Necromancy].Value;
            double spiritSpeak = caster.Skills[SkillName.SpiritSpeak].Value;

            int casterAbility = 0;

            casterAbility += (int)(necromancy * 30);
            casterAbility += (int)(spiritSpeak * 70);
            casterAbility /= 10;
            casterAbility *= 18;

            if (casterAbility > owner.Fame)
            {
                casterAbility = owner.Fame;
            }

            if (casterAbility < 0)
            {
                casterAbility = 0;
            }

            Type toSummon = null;

            SummonEntry[] entries = group.m_Entries;

            for (int i = 0; toSummon == null && i < entries.Length; ++i)
            {
                SummonEntry entry = entries[i];

                if (casterAbility < entry.m_Requirement)
                {
                    continue;
                }

                Type[] animates = entry.m_ToSummon;

                if (animates.Length >= 0)
                {
                    toSummon = animates[Utility.Random(animates.Length)];
                }
            }

            if (toSummon == null)
            {
                return;
            }

            Mobile summoned = null;

            try{ summoned = Activator.CreateInstance(toSummon) as Mobile; }
            catch {}

            if (summoned == null)
            {
                return;
            }

            if (summoned is BaseCreature)
            {
                BaseCreature bc = (BaseCreature)summoned;

                // to be sure
                bc.Tamable = false;

                if (bc is BaseMount)
                {
                    bc.ControlSlots = 1;
                }
                else
                {
                    bc.ControlSlots = 0;
                }

                Effects.PlaySound(loc, map, bc.GetAngerSound());

                BaseCreature.Summon((BaseCreature)summoned, false, caster, loc, 0x28, TimeSpan.FromDays(1.0));
            }

            if (summoned is SkeletalDragon)
            {
                Scale((SkeletalDragon)summoned, 50);                   // lose 50% hp and strength
            }
            summoned.Fame  = 0;
            summoned.Karma = -1500;

            summoned.MoveToWorld(loc, map);

            corpse.ProcessDelta();
            corpse.SendRemovePacket();
            corpse.ItemID = Utility.Random(0xECA, 9);               // bone graphic
            corpse.Hue    = 0;
            corpse.ProcessDelta();

            Register(caster, summoned);
        }
Beispiel #5
0
 public override void Deserialize(GenericReader reader)
 {
     base.Deserialize(reader);
     int version = reader.ReadInt();
     AllyOf = (CreatureGroup)reader.ReadInt();
 }
Beispiel #6
0
 public XmlAlly(CreatureGroup CreatureGroup)
 {
     m_AllyOf = CreatureGroup;
     Name = m_AllyOf.ToString();
 }
Beispiel #7
0
        private static void SummonDelay_Callback(object state)
        {
            object[] states = (object[])state;

            Mobile        caster = (Mobile)states[0];
            Corpse        corpse = (Corpse)states[1];
            Point3D       loc    = (Point3D)states[2];
            Map           map    = (Map)states[3];
            CreatureGroup group  = (CreatureGroup)states[4];

            if (corpse.Animated)
            {
                return;
            }

            Mobile owner = corpse.Owner;

            if (owner == null)
            {
                return;
            }

            double necromancy  = caster.Skills[SkillName.Necromancy].Value;
            double spiritSpeak = caster.Skills[SkillName.SpiritSpeak].Value;

            int casterAbility = 0;

            casterAbility += (int)(necromancy * 30);
            casterAbility += (int)(spiritSpeak * 70);
            casterAbility /= 10;
            casterAbility *= 18;

            if (casterAbility > owner.Fame)
            {
                casterAbility = owner.Fame;
            }

            if (casterAbility < 0)
            {
                casterAbility = 0;
            }

            Type toSummon = null;

            SummonEntry[] entries = group.m_Entries;

            BaseCreature creature = caster as BaseCreature;

            if (creature != null)
            {
                if (creature.AIObject is NecroMageAI)
                {
                    toSummon = typeof(FleshGolem);
                }
            }

            for (int i = 0; toSummon == null && i < entries.Length; ++i)
            {
                SummonEntry entry = entries[i];

                if (casterAbility < entry.m_Requirement)
                {
                    continue;
                }

                Type[] animates = entry.m_ToSummon;

                if (animates.Length >= 0)
                {
                    toSummon = animates[Utility.Random(animates.Length)];
                }
            }

            if (toSummon == null)
            {
                return;
            }

            BaseCreature summoned = null;

            try
            {
                summoned = Activator.CreateInstance(toSummon) as BaseCreature;
            }
            catch (Exception e)
            {
                Diagnostics.ExceptionLogging.LogException(e);
            }

            if (summoned == null)
            {
                return;
            }

            BaseCreature bc = (BaseCreature)summoned;

            // to be sure
            bc.Tamable = false;

            if (bc is BaseMount)
            {
                bc.ControlSlots = 1;
            }
            else
            {
                bc.ControlSlots = 0;
            }

            Effects.PlaySound(loc, map, bc.GetAngerSound());

            BaseCreature.Summon((BaseCreature)summoned, false, caster, loc, 0x28, TimeSpan.FromDays(1.0));

            if (summoned is SkeletalDragon dragon)
            {
                Scale(dragon, 50); // lose 50% hp and strength
            }
            summoned.Fame  = 0;
            summoned.Karma = -1500;

            summoned.MoveToWorld(loc, map);

            corpse.Hue      = 1109;
            corpse.Animated = true;

            Register(caster, summoned);
        }