Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Не работают атрибуты на колчане
Sergius Grey
сообщение 12.12.2018, 23:59
Сообщение #1


****

Apprentice
Сообщений: 149
Регистрация: 20.6.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.734
Возраст: 23



Пришел позориться...
Перенес с новой ранки на старую скрипты BaseQuiver. Проблема в том, что из атрибутов, навроде AttackChance или BonusMana не работает ничего, кроме бонусов к силе, ловкости и интеллекту. При этом колчан работает, в него можно класть стрелы, работают его особые бонусы WeightReduction и LowerAmmoCost.
Наставьте на пусть истины, где копать? Или мучить BaseWeapon?

Вот что сейчас со скриптом:
Код

using System;
using Server.Network;
using Server.Engines.Craft;

namespace Server.Items
{
    public class BaseQuiver : Container, ICraftable
    {
        public override int DefaultGumpID{ get{ return 0x108; } }
        public override int DefaultMaxItems{ get{ return 1; } }
        public override int DefaultMaxWeight{ get{ return 50; } }
        public override double DefaultWeight{ get{ return 2.0; } }

        private AosAttributes m_Attributes;
        private int m_Capacity;
        private int m_LowerAmmoCost;
        private int m_WeightReduction;
        private int m_DamageIncrease;

        [CommandProperty( AccessLevel.GameMaster)]
        public AosAttributes Attributes
        {
            get{ return m_Attributes; }
            set{}
        }

        [CommandProperty( AccessLevel.GameMaster)]
        public int Capacity
        {
            get{ return m_Capacity; }
            set{ m_Capacity = value; InvalidateProperties(); }
        }

        [CommandProperty( AccessLevel.GameMaster)]
        public int LowerAmmoCost
        {
            get{ return m_LowerAmmoCost; }
            set{ m_LowerAmmoCost = value; InvalidateProperties(); }
        }

        [CommandProperty( AccessLevel.GameMaster)]
        public int WeightReduction
        {
            get{ return m_WeightReduction; }
            set{ m_WeightReduction = value; InvalidateProperties(); }
        }

        [CommandProperty( AccessLevel.GameMaster)]
        public int DamageIncrease
        {
            get{ return m_DamageIncrease; }
            set{ m_DamageIncrease = value; InvalidateProperties(); }
        }

        private Mobile m_Crafter;
        private ClothingQuality m_Quality;

        [CommandProperty( AccessLevel.GameMaster )]
        public Mobile Crafter
        {
            get{ return m_Crafter; }
            set{ m_Crafter = value; InvalidateProperties(); }
        }

        [CommandProperty( AccessLevel.GameMaster )]
        public ClothingQuality Quality
        {
            get{ return m_Quality; }
            set{ m_Quality = value; InvalidateProperties(); }
        }
        
        public Item Ammo
        {
            get{ return Items.Count > 0 ? Items[ 0 ] : null; }
        }

        public BaseQuiver() : this( 0x2FB7 )
        {
        }

        public BaseQuiver( int itemID ) : base( itemID )
        {
            Weight = 2.0;
            Capacity = 500;
            Layer = Layer.Cloak;

            m_Attributes = new AosAttributes( this );

            DamageIncrease = 10;
        }

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

        public override void OnAfterDuped( Item newItem )
        {
            BaseQuiver quiver = newItem as BaseQuiver;

            if ( quiver == null )
                return;

            quiver.m_Attributes = new AosAttributes( newItem, m_Attributes );
        }

        public override void  UpdateTotal( Item sender, TotalType type, int delta )
        {
            InvalidateProperties();

            base.UpdateTotal(sender, type, delta);
        }

        public override int GetTotal( TotalType type )
        {
            int total = base.GetTotal( type );

            if ( type == TotalType.Weight )
                total -= total * m_WeightReduction / 100;

            return total;
        }

        private static Type[] m_Ammo = new Type[]
        {
            typeof( Arrow ), typeof( Bolt )
        };

        public bool CheckType( Item item )
        {
            Type type = item.GetType();
            Item ammo = Ammo;

            if ( ammo != null )
            {
                if ( ammo.GetType() == type )
                    return true;
            }
            else
            {
                for ( int i = 0; i < m_Ammo.Length; i++ )
                {
                    if ( type == m_Ammo[ i ] )
                        return true;
                }
            }

            return false;
        }

        public override bool CheckHold( Mobile m, Item item, bool message, bool checkItems, int plusItems, int plusWeight )
        {
            if ( !CheckType( item ) )
            {
                if ( message )
                    m.SendLocalizedMessage( 1074836 ); // The container can not hold that type of object.

                return false;
            }

            if ( Items.Count < DefaultMaxItems )
            {
                if ( item.Amount <= m_Capacity )
                    return base.CheckHold( m, item, message, checkItems, plusItems, plusWeight );

                return false;
            }
            else if ( checkItems )
                return false;

            Item ammo = Ammo;

            if ( ammo == null || ammo.Deleted )
                return false;

            if ( ammo.Amount + item.Amount <= m_Capacity )
                return true;

            return false;
        }

        public override void AddItem( Item dropped )
        {
            base.AddItem( dropped );

            InvalidateWeight();
        }
        
        public override void RemoveItem( Item dropped )
        {
            base.RemoveItem( dropped );

            InvalidateWeight();
        }
        
        public override void OnAdded( object parent )
        {
            if ( Core.AOS && parent is Mobile )
            {
                Mobile from = (Mobile)parent;

                int strBonus = m_Attributes.BonusStr;
                int dexBonus = m_Attributes.BonusDex;
                int intBonus = m_Attributes.BonusInt;

                if ( strBonus != 0 || dexBonus != 0 || intBonus != 0 )
                {
                    string modName = this.Serial.ToString();

                    if ( strBonus != 0 )
                        from.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );

                    if ( dexBonus != 0 )
                        from.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );

                    if ( intBonus != 0 )
                        from.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
                }

                from.CheckStatTimers();
            }
        }

        public override void OnRemoved( object parent )
        {
            if ( Core.AOS && parent is Mobile )
            {
                Mobile from = (Mobile)parent;

                string modName = this.Serial.ToString();

                from.RemoveStatMod( modName + "Str" );
                from.RemoveStatMod( modName + "Dex" );
                from.RemoveStatMod( modName + "Int" );

                from.CheckStatTimers();
            }
        }

        public override void GetProperties( ObjectPropertyList list )
        {
            base.GetProperties( list );
                
            if ( m_Crafter != null )
                list.Add( 1050043, m_Crafter.Name ); // crafted by ~1_NAME~

            if ( m_Quality == ClothingQuality.Exceptional )
                list.Add( 1063341 ); // exceptional

            Item ammo = Ammo;

            if ( ammo != null )
            {
                if ( ammo is Arrow )
                    list.Add( 1075265, "{0}\t{1}", ammo.Amount, Capacity ); // Ammo: ~1_QUANTITY~/~2_CAPACITY~ arrows
                else if ( ammo is Bolt )
                    list.Add( 1075266, "{0}\t{1}", ammo.Amount, Capacity ); // Ammo: ~1_QUANTITY~/~2_CAPACITY~ bolts
            }
            else
                list.Add( 1075265, "{0}\t{1}", 0, Capacity ); // Ammo: ~1_QUANTITY~/~2_CAPACITY~ arrows

            int prop;

            if ( (prop = m_DamageIncrease) != 0 )
                list.Add( 1074762, prop.ToString() ); // Damage modifier: ~1_PERCENT~%
            
            int phys, fire, cold, pois, nrgy, chaos, direct;
            phys = fire = cold = pois = nrgy = chaos = direct = 0;

            AlterBowDamage( ref phys, ref fire, ref cold, ref pois, ref nrgy, ref chaos, ref direct );

            if ( phys != 0 )
                list.Add( 1060403, phys.ToString() ); // physical damage ~1_val~%

            if ( fire != 0 )
                list.Add( 1060405, fire.ToString() ); // fire damage ~1_val~%

            if ( cold != 0 )
                list.Add( 1060404, cold.ToString() ); // cold damage ~1_val~%

            if ( pois != 0 )
                list.Add( 1060406, pois.ToString() ); // poison damage ~1_val~%

            if ( nrgy != 0 )
                list.Add( 1060407, nrgy.ToString() ); // energy damage ~1_val

            if ( chaos != 0 )
                list.Add( 1072846, chaos.ToString() ); // chaos damage ~1_val~%

            if ( direct != 0 )
                list.Add( 1079978, direct.ToString() ); // Direct Damage: ~1_PERCENT~%

            if ( (prop = m_Attributes.DefendChance) != 0 )
                list.Add( 1060408, prop.ToString() ); // defense chance increase ~1_val~%

            if ( (prop = m_Attributes.BonusDex) != 0 )
                list.Add( 1060409, prop.ToString() ); // dexterity bonus ~1_val~

            if ( (prop = m_Attributes.EnhancePotions) != 0 )
                list.Add( 1060411, prop.ToString() ); // enhance potions ~1_val~%

            if ( (prop = m_Attributes.CastRecovery) != 0 )
                list.Add( 1060412, prop.ToString() ); // faster cast recovery ~1_val~

            if ( (prop = m_Attributes.CastSpeed) != 0 )
                list.Add( 1060413, prop.ToString() ); // faster casting ~1_val~

            if ( (prop = m_Attributes.AttackChance) != 0 )
                list.Add( 1060415, prop.ToString() ); // hit chance increase ~1_val~%

            if ( (prop = m_Attributes.BonusHits) != 0 )
                list.Add( 1060431, prop.ToString() ); // hit point increase ~1_val~

            if ( (prop = m_Attributes.BonusInt) != 0 )
                list.Add( 1060432, prop.ToString() ); // intelligence bonus ~1_val~

            if ( (prop = m_Attributes.LowerManaCost) != 0 )
                list.Add( 1060433, prop.ToString() ); // lower mana cost ~1_val~%

            if ( (prop = m_Attributes.LowerRegCost) != 0 )
                list.Add( 1060434, prop.ToString() ); // lower reagent cost ~1_val~%    

            if ( (prop = m_Attributes.Luck) != 0 )
                list.Add( 1060436, prop.ToString() ); // luck ~1_val~

            if ( (prop = m_Attributes.BonusMana) != 0 )
                list.Add( 1060439, prop.ToString() ); // mana increase ~1_val~

            if ( (prop = m_Attributes.RegenMana) != 0 )
                list.Add( 1060440, prop.ToString() ); // mana regeneration ~1_val~

            if ( (prop = m_Attributes.NightSight) != 0 )
                list.Add( 1060441 ); // night sight

            if ( (prop = m_Attributes.ReflectPhysical) != 0 )
                list.Add( 1060442, prop.ToString() ); // reflect physical damage ~1_val~%

            if ( (prop = m_Attributes.RegenStam) != 0 )
                list.Add( 1060443, prop.ToString() ); // stamina regeneration ~1_val~

            if ( (prop = m_Attributes.RegenHits) != 0 )
                list.Add( 1060444, prop.ToString() ); // hit point regeneration ~1_val~

            if ( (prop = m_Attributes.SpellDamage) != 0 )
                list.Add( 1060483, prop.ToString() ); // spell damage increase ~1_val~%

            if ( (prop = m_Attributes.BonusStam) != 0 )
                list.Add( 1060484, prop.ToString() ); // stamina increase ~1_val~

            if ( (prop = m_Attributes.BonusStr) != 0 )
                list.Add( 1060485, prop.ToString() ); // strength bonus ~1_val~

            if ( (prop = m_Attributes.WeaponSpeed) != 0 )
                list.Add( 1060486, prop.ToString() ); // swing speed increase ~1_val~%

            if ( (prop = m_LowerAmmoCost) > 0 )
                list.Add( 1075208, prop.ToString() ); // Lower Ammo Cost ~1_Percentage~%

            double weight = 0;

            if ( ammo != null )
                weight = ammo.Weight * ammo.Amount;

            list.Add( 1072241, "{0}\t{1}\t{2}\t{3}", Items.Count, DefaultMaxItems, (int) weight, DefaultMaxWeight ); // Contents: ~1_COUNT~/~2_MAXCOUNT items, ~3_WEIGHT~/~4_MAXWEIGHT~ stones

            if ( (prop = m_WeightReduction) != 0 )
                list.Add( 1072210, prop.ToString() ); // Weight reduction: ~1_PERCENTAGE~%    
        }
        
        private static void SetSaveFlag( ref SaveFlag flags, SaveFlag toSet, bool setIf )
        {
            if ( setIf )
                flags |= toSet;
        }

        private static bool GetSaveFlag( SaveFlag flags, SaveFlag toGet )
        {
            return ( (flags & toGet) != 0 );
        }

        [Flags]
        private enum SaveFlag
        {
            None                = 0x00000000,
            Attributes            = 0x00000001,
            DamageModifier        = 0x00000002,
            LowerAmmoCost        = 0x00000004,
            WeightReduction        = 0x00000008,
            Crafter                = 0x00000010,
            Quality                = 0x00000020,
            Capacity            = 0x00000040,
            DamageIncrease        = 0x00000080
        }

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

            writer.Write( 0 ); // version

            SaveFlag flags = SaveFlag.None;

            SetSaveFlag( ref flags, SaveFlag.Attributes,        !m_Attributes.IsEmpty );
            SetSaveFlag( ref flags, SaveFlag.LowerAmmoCost,        m_LowerAmmoCost != 0 );
            SetSaveFlag( ref flags, SaveFlag.WeightReduction,    m_WeightReduction != 0 );
            SetSaveFlag( ref flags, SaveFlag.DamageIncrease,    m_DamageIncrease != 0 );
            SetSaveFlag( ref flags, SaveFlag.Crafter,            m_Crafter != null );
            SetSaveFlag( ref flags, SaveFlag.Quality,            true );
            SetSaveFlag( ref flags, SaveFlag.Capacity,            m_Capacity > 0 );

            writer.WriteEncodedInt( (int) flags );

            if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
                m_Attributes.Serialize( writer );

            if ( GetSaveFlag( flags, SaveFlag.LowerAmmoCost ) )
                writer.Write( (int) m_LowerAmmoCost );

            if ( GetSaveFlag( flags, SaveFlag.WeightReduction ) )
                writer.Write( (int) m_WeightReduction );

            if ( GetSaveFlag( flags, SaveFlag.DamageIncrease ) )
                writer.Write( (int) m_DamageIncrease );

            if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
                writer.Write( (Mobile) m_Crafter );

            if ( GetSaveFlag( flags, SaveFlag.Quality ) )
                writer.Write( (int) m_Quality );

            if ( GetSaveFlag( flags, SaveFlag.Capacity ) )
                writer.Write( (int) m_Capacity );
        }

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

            int version = reader.ReadInt();

            SaveFlag flags = (SaveFlag) reader.ReadEncodedInt();

            if ( GetSaveFlag( flags, SaveFlag.Attributes ) )
                m_Attributes = new AosAttributes( this, reader );
            else
                m_Attributes = new AosAttributes( this );

            if ( GetSaveFlag( flags, SaveFlag.LowerAmmoCost ) )
                m_LowerAmmoCost = reader.ReadInt();

            if ( GetSaveFlag( flags, SaveFlag.WeightReduction ) )
                m_WeightReduction = reader.ReadInt();

            if ( GetSaveFlag( flags, SaveFlag.DamageIncrease ) )
                m_DamageIncrease = reader.ReadInt();

            if ( GetSaveFlag( flags, SaveFlag.Crafter ) )
                m_Crafter = reader.ReadMobile();

            if ( GetSaveFlag( flags, SaveFlag.Quality ) )
                m_Quality = (ClothingQuality) reader.ReadInt();

            if ( GetSaveFlag( flags, SaveFlag.Capacity ) )
                m_Capacity = reader.ReadInt();
        }

        public virtual void AlterBowDamage( ref int phys, ref int fire, ref int cold, ref int pois, ref int nrgy, ref int chaos, ref int direct )
        {
        }

        public void InvalidateWeight()
        {
            if ( RootParent is Mobile )
            {
                Mobile m = (Mobile) RootParent;

                m.UpdateTotals();
            }
        }
        
        #region ICraftable
        public virtual int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue )
        {
            Quality = (ClothingQuality) quality;

            if ( makersMark )
                Crafter = from;

            return quality;
        }
        #endregion
    }
}

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 13.12.2018, 10:23
Сообщение #2


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22565
Из: Северная Корея
Пользователь №: 11.273



Посмотри AosAttributes на наличие проверки BaseQuiver в списке get/set value методах. Это в AOS.cs
И допиши соответственно по типу BaseArmor/BaseClothing и т.п.

Сообщение отредактировал Juzzver - 13.12.2018, 10:23


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 13.12.2018, 16:57
Сообщение #3


****

Apprentice
Сообщений: 149
Регистрация: 20.6.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.734
Возраст: 23



Спасибо. Года 2 ранкой не занимался, отупел... Что ж я сам то не допер туда заглянуть, ведь все очевидно... Разумеется все заработало.
Но возможно это еще не все, мои клешни добрались до сетовых комплектов, которых нет в моей ранке, с ServUO буду пытаться интегрировать. Но надеюсь не придется создавать новую тему, очень уж мне стыдно по такой ерунде писать вопросы. То я что то классное быстро сделаю для серва, аж сам радуюсь, то вот как сейчас на базе стал в ступор. Правда тут можно списать что я правда забыл, но это не отнимает клешнерукости... Ох еще раз спасибо )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 13.12.2018, 17:06
Сообщение #4


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22565
Из: Северная Корея
Пользователь №: 11.273



с переносом сетов тоже есть нюансы. В BaseArmor и прочей базе, к которым относятся сетовые вещи, надо прописать чтобы сетовые бонуса суммировались между основными.
К примеру сюда:
Код
        public override int PhysicalResistance{ get{ return BasePhysicalResistance + GetProtOffset() + GetResourceAttrs().ArmorPhysicalResist + m_PhysicalBonus; } }

и таких мест будет много.


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 13.12.2018, 17:12
Сообщение #5


****

Apprentice
Сообщений: 149
Регистрация: 20.6.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.734
Возраст: 23



Ага, это я уже вчера заметил. А вот с колчанами я даже не додумался в поиске ранки другой поискать где вообще фигурирует BaseQuiver...
Правда с сетами не все так просто в поиске, ведь set встречается всюду ) Но буду пытаться понемногу.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 13.12.2018, 18:16
Сообщение #6


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22565
Из: Северная Корея
Пользователь №: 11.273



там вроде все ветки кода помечены регионом:
Цитата
#region Mondain's Legacy Sets


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 13.12.2018, 19:18
Сообщение #7


****

Apprentice
Сообщений: 149
Регистрация: 20.6.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 13.734
Возраст: 23



Спасибо! Да, тоже подметил, но не знаю везде ли или нет. Ну посмотрим, справлюсь или нет. Очень хочется все сделать самому )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 29.3.2024, 2:52
Designed by Nickostyle