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

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> WeaponAttributes для армора и прочего
Sergius Grey
сообщение 28.2.2015, 9:05
Сообщение #1


****

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



Снова стал возиться с сервером, хочу реализовать задумка, например, кольцо с хит лайтнингом или перчатки с мана личем.

Собственно вопрос - каким способом можно прописать артефакту WeaponAttributes, ссылаясь на бейс веапон или что то вроде того?
В АОС.кс я добавлял из WeaponAttributes в просто АОСатрибутс свойства, они появлялись в пропсе, отображались на вещи, но не давали эффекта. И я понимаю почему. Просто хочется все это сделать с наименьшим количеством кода, это главная задача. А прописывать кучу строк в бейсАрмор и БейсДжевел не хочется, во избежании возможных конфликтов и косяков, которые могут всплыть со временем, так как я не уверен что смогу верно все расписать там. Проще говоря не хочется все это делать "брейнфаковским способом".

Может можно это сделать при помощи методов void OnAdded и void OnRemoved соответственно?
Но в идеале хотелось бы, чтоб кольца например просто могли принимать WeaponAttributes при создании новых скриптов артефактов.

В общем если кто может подсказать, как сделать все аккуратненько, напишите пожалуйста способ.

Ранка 2.0
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 28.2.2015, 14:24
Сообщение #2


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



Цитата(Sergius Grey @ 28.2.2015, 7:05) *

Снова стал возиться с сервером, хочу реализовать задумка, например, кольцо с хит лайтнингом или перчатки с мана личем.

Собственно вопрос - каким способом можно прописать артефакту WeaponAttributes, ссылаясь на бейс веапон или что то вроде того?
В АОС.кс я добавлял из WeaponAttributes в просто АОСатрибутс свойства, они появлялись в пропсе, отображались на вещи, но не давали эффекта. И я понимаю почему. Просто хочется все это сделать с наименьшим количеством кода, это главная задача. А прописывать кучу строк в бейсАрмор и БейсДжевел не хочется, во избежании возможных конфликтов и косяков, которые могут всплыть со временем, так как я не уверен что смогу верно все расписать там. Проще говоря не хочется все это делать "брейнфаковским способом".

Может можно это сделать при помощи методов void OnAdded и void OnRemoved соответственно?
Но в идеале хотелось бы, чтоб кольца например просто могли принимать WeaponAttributes при создании новых скриптов артефактов.

Ранка 2.0

Зайди в AOS.cs
Найди там вот это:
Код
        public static int GetValue( Mobile m, AosWeaponAttribute attribute )
        {
            if( !Core.AOS )
                return 0;

            List<Item> items = m.Items;
            int value = 0;

            for( int i = 0; i < items.Count; ++i )
            {
                Item obj = items[i];

                if( obj is BaseWeapon )
                {
                    AosWeaponAttributes attrs = ((BaseWeapon)obj).WeaponAttributes;

                    if( attrs != null )
                        value += attrs[attribute];
                }
                else if ( obj is ElvenGlasses )
                {
                    AosWeaponAttributes attrs = ((ElvenGlasses)obj).WeaponAttributes;

                    if( attrs != null )
                        value += attrs[attribute];
                }
            }

            return value;
        }


Видишь блок с BaseWeapon? Под ElvenGlasses блоком, добавь аналогичный блок с BaseJewel и не забудь в BaseJewel прописать такие-же вот свойства, как и в BaseWeapon.:
Код

        private AosWeaponAttributes m_AosWeaponAttributes;
        [CommandProperty( AccessLevel.GameMaster )]
        public AosWeaponAttributes WeaponAttributes
        {
            get{ return m_AosWeaponAttributes; }
            set{}
        }


Работы на минут 5, если ты понимаешь о чём я пишу и кода тут совсем не много, как видишь.

РанУО, конечно, такое РанУО...
Для проверки на вепонатрибуты фор луп по всем шмоткам проходится.... (IMG:style_emoticons/default/sad.gif)
Правда ТСу это только на руку, лол

П.С. ТС, если хочешь совсем как про быть:
Создай общий класс для BaseWeapon & BaseArmor & BaseJewel & BaseQuiver & BaseTalisman.

Например WearableItem, у него пускай эти пять классов наследуют, а он у Item.
А потом вытащи из BaseWeapon то свойство что я описал выше + переменную и засунть в WearableItem.
Метод GetValue можешь смело переделывать на такой лад:
Код
        public static int GetValue( Mobile m, AosWeaponAttribute attribute )
        {
            if( !Core.AOS )
                return 0;

            List<Item> items = m.Items;
            int value = 0;

            for( int i = 0; i < items.Count; ++i )
            {
                Item obj = items[i];
                    AosWeaponAttributes attrs = ((WearableItem)obj).WeaponAttributes;

                    if( attrs != null )
                        value += attrs[attribute];

            }

            return value;
        }


Это тебе достаточно серьёзно сэкономит ресурсы сервера.
+строчек кода ещё меньше.
+ничего не надо добавлять в BaseJewel
+на армор, колчаны и талисманы тоже вепон свойства сможешь прописывать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 28.2.2015, 21:34
Сообщение #3


****

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



Большое спасибо! Только проснулся, щас буду пробовать и разбираться. В целом ответ понял, первым способом думаю точно сделаю, но и попробую вторым. А то я конечно нуб в этом всем, но хочется делать все "чисто" и правильно. =)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 28.2.2015, 22:46
Сообщение #4


****

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



На счет первого способа.
Компиляция проходит, но при попытке добавить арт, с прописанными свойствами, он не добавляется, а ранка пишет следующее:
Код
System.Reflection.TargetInvocationException: Адресат вызова создал исключение. -
--> System.NullReferenceException: В экземпляре объекта не задана ссылка на объе
кт.
   в Server.Items.Qqq..ctor()
   --- Конец трассировки внутреннего стека исключений ---
   в System.RuntimeMethodHandle._InvokeConstructor(Object[] args, SignatureStruc
t& signature, IntPtr declaringType)
   в System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Bi
nder binder, Object[] parameters, CultureInfo culture)
   в Server.Commands.Add.Build(Mobile from, ConstructorInfo ctor, Object[] value
s, String[,] props, PropertyInfo[] realProps, Boolean& sendError)
   в Server.Commands.Add.Build(Mobile from, Point3D start, Point3D end, Construc
torInfo ctor, Object[] values, String[,] props, PropertyInfo[] realProps, List`1
packs)


Такое и с БейсАрмор и с БейсДжевел. То есть арт не добавляется.

А в пропсе на кольцах и арморе появляется меню с веапон аттрибутами, но в нем написано null, хотя должно быть многоточие. Видимо туплю я где то =( Буду пытаться найти причину.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 1.3.2015, 0:32
Сообщение #5


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



Cтоп.
Что ты конкретно сделал. Лучше б со скринами, где конкретно ты добавлял код.
Возможно я что-то упустил, т.к. я очень быстро прошёлся по дефолтовой комбат системе ранки, потом вышел на BaseWapon, посмотрел как атрибуты вепов вычитываются и всё.

Тоесть, теоретически, в комбат системе всё работает, а вот при надевании, создании сервер крашит, потому что обработка этих свойств для BaseArmor & BaseJewel не сделана)

То что я тебе показал - это только для комбат системы.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 1.3.2015, 1:02
Сообщение #6


****

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



Отрывок из БейсДжевел:
Код
{
        None,
        StarSapphire,
        Emerald,
        Sapphire,
        Ruby,
        Citrine,
        Amethyst,
        Tourmaline,
        Amber,
        Diamond
    }

    public abstract class BaseJewel : Item, ICraftable
    {
        private int m_MaxHitPoints;
        private int m_HitPoints;

        private AosAttributes m_AosAttributes;
        private AosElementAttributes m_AosResistances;
        private AosSkillBonuses m_AosSkillBonuses;
        private CraftResource m_Resource;
        private GemType m_GemType;
        private AosWeaponAttributes m_AosWeaponAttributes;

               [CommandProperty( AccessLevel.GameMaster )]
            public AosWeaponAttributes WeaponAttributes
            {
               get{ return m_AosWeaponAttributes; }
                set{}
               }

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

        [CommandProperty( AccessLevel.GameMaster )]
        public int HitPoints
        {
            get
            {
                return m_HitPoints;
            }
            set
            {
                if ( value != m_HitPoints && MaxHitPoints > 0 )
                {
                    m_HitPoints = value;


Отрывок из АОС:
Код
public AosWeaponAttributes( Item owner, GenericReader reader )
            : base( owner, reader )
        {
        }

        public static int GetValue( Mobile m, AosWeaponAttribute attribute )
        {
            if( !Core.AOS )
                return 0;

            List<Item> items = m.Items;
            int value = 0;

            for( int i = 0; i < items.Count; ++i )
            {
                Item obj = items[i];

                if( obj is BaseWeapon )
                {
                    AosWeaponAttributes attrs = ((BaseWeapon)obj).WeaponAttributes;

                    if( attrs != null )
                        value += attrs[attribute];
                }

                else if( obj is BaseJewel )
                {
                    AosWeaponAttributes attrs = ((BaseJewel)obj).WeaponAttributes;

                    if( attrs != null )
                        value += attrs[attribute];
                }
            }

            return value;
        }

        public int this[AosWeaponAttribute attribute]
        {
            get { return GetValue( (int)attribute ); }
            set { SetValue( (int)attribute, value ); }
        }


Есть тестовый скрипт ювы:
Код
using System;
using Server;

namespace Server.Items
{
    public class Qqq : GoldBracelet
    {
        public override int InitMinHits{ get{ return 255; } }
        public override int InitMaxHits{ get{ return 255; } }


        [Constructable]
        public Qqq()
        {
            Name = "QQQ";
            Hue = 1157;            
            WeaponAttributes.HitLightning = 30;
        }

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

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

            writer.Write( (int) 0 );
        }
        
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize( reader );

            int version = reader.ReadInt();
        }
    }
}


При попытке добавить этот браслет, он не добавляется и ранка выдает сообщение, что я привел выше. Краша при этом нету, все продолжает работать. Просто не добавляется.
Собственно вот.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 1.3.2015, 2:15
Сообщение #7


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



А конктрукторы BaseItem & BaseJewel ?
Код
        public BaseArmor( int itemID ) :  base( itemID )
        {
            m_Quality = ArmorQuality.Regular;
            m_Durability = ArmorDurabilityLevel.Regular;
            m_Crafter = null;

            m_Resource = DefaultResource;
            Hue = CraftResources.GetHue( m_Resource );

            m_Hits = m_MaxHits = Utility.RandomMinMax( InitMinHits, InitMaxHits );

            this.Layer = (Layer)ItemData.Quality;

            m_AosAttributes = new AosAttributes( this );
            m_AosArmorAttributes = new AosArmorAttributes( this );
            m_AosSkillBonuses = new AosSkillBonuses( this );
        }

Тут тоже добавить надо =)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 1.3.2015, 2:20
Сообщение #8


**********

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



Цитата

[CommandProperty( AccessLevel.GameMaster )]
public AosWeaponAttributes WeaponAttributes
{
get{ return m_AosWeaponAttributes; }
set{}
}

get указан, а set отсутствует - по этому в пропсе был Null, значение value не передалось.


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


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



Цитата(Juzzver @ 1.3.2015, 0:20) *

get указан, а set отсутствует - по этому в пропсе был Null, значение value не передалось.


То что ты пишешь - логично. Но, если глянуть в код ранки, допустим какой-то веп с атрибутами и в BaseWeapon - именно так всё и прописано, лол.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 1.3.2015, 2:32
Сообщение #10


****

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



Aimed, черт да, я тупанул я думал у меня там прописано.
Дописал
m_AosWeaponAttributes = new AosWeaponAttributes( this );
Теперь нету Нулл кстати, можно все прописывать. С этим разобрались.
Шмотка добавляется, эффект на ней есть, не отображается правда при наведении но это не так важно, с этим я разберусь.
С этим да, разобрались. Но в итоге щас имеем то же, что у меня и было но с моим кривым способом - эффект прописан, но он не работает, увы... =( Ни один параметр не работает - ни лич какой нибудь, ни фаерэрия, ни хитлайтнинг и все прочее соответственно. В этом то и проблема =(
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 1.3.2015, 2:41
Сообщение #11


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



Прям мистика какая-то с этим сеттером, я сам из гита ковыряю скрипты, т.к. у меня серьёзный форк стоит, но и там так-же. Как это понимать?))

Цитата(Sergius Grey @ 1.3.2015, 0:32) *

Aimed, черт да, я тупанул я думал у меня там прописано.
Дописал
m_AosWeaponAttributes = new AosWeaponAttributes( this );
Теперь нету Нулл кстати, можно все прописывать. С этим разобрались.
Шмотка добавляется, эффект на ней есть, не отображается правда при наведении но это не так важно, с этим я разберусь.
С этим да, разобрались. Но в итоге щас имеем то же, что у меня и было но с моим кривым способом - эффект прописан, но он не работает, увы... =( Ни один параметр не работает - ни лич какой нибудь, ни фаерэрия, ни хитлайтнинг и все прочее соответственно. В этом то и проблема =(


Вообще-то должно работать, т.к. GetValue по шмоткам перебирает и в методе OnHit в BaseWeapon(где он вызывается), проставляет шансы на твои веп атрибуты:

Код
if ( Core.AOS )
            {
                int lifeLeech = 0;
                int stamLeech = 0;
                int manaLeech = 0;
                int wraithLeech = 0;

                if ( (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitLeechHits ) * propertyBonus) > Utility.Random( 100 ) )
                    lifeLeech += 30; // HitLeechHits% chance to leech 30% of damage as hit points

                if ( (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitLeechStam ) * propertyBonus) > Utility.Random( 100 ) )
                    stamLeech += 100; // HitLeechStam% chance to leech 100% of damage as stamina

                if ( (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitLeechMana ) * propertyBonus) > Utility.Random( 100 ) )
                    manaLeech += 40; // HitLeechMana% chance to leech 40% of damage as mana

                if ( m_Cursed )
                    lifeLeech += 50; // Additional 50% life leech for cursed weapons (necro spell)

                context = TransformationSpellHelper.GetContext( attacker );

                if ( context != null && context.Type == typeof( VampiricEmbraceSpell ) )
                    lifeLeech += 20; // Vampiric embrace gives an additional 20% life leech

                if ( context != null && context.Type == typeof( WraithFormSpell ) )
                {
                    wraithLeech = (5 + (int)((15 * attacker.Skills.SpiritSpeak.Value) / 100)); // Wraith form gives an additional 5-20% mana leech

                    // Mana leeched by the Wraith Form spell is actually stolen, not just leeched.
                    defender.Mana -= AOS.Scale( damageGiven, wraithLeech );

                    manaLeech += wraithLeech;
                }

                if ( lifeLeech != 0 )
                    attacker.Hits += AOS.Scale( damageGiven, lifeLeech );

                if ( stamLeech != 0 )
                    attacker.Stam += AOS.Scale( damageGiven, stamLeech );

                if ( manaLeech != 0 )
                    attacker.Mana += AOS.Scale( damageGiven, manaLeech );

                if ( lifeLeech != 0 || stamLeech != 0 || manaLeech != 0 )
                    attacker.PlaySound( 0x44D );
            }

            if ( m_MaxHits > 0 && ((MaxRange <= 1 && (defender is SlimeOld || defender is AcidElementalOld)) || Utility.Random( 25 ) == 0) ) // Stratics says 50% chance, seems more like 4%..
            {
                if ( MaxRange <= 1 && (defender is SlimeOld || defender is AcidElementalOld) )
                    attacker.LocalOverheadMessage( MessageType.Regular, 0x3B2, 500263 ); // *Acid blood scars your weapon!*

                if ( Core.AOS && m_AosWeaponAttributes.SelfRepair > Utility.Random( 10 ) )
                {
                    HitPoints += 2;
                }
                else
                {
                    if ( m_Hits > 0 )
                    {
                        --HitPoints;
                    }
                    else if ( m_MaxHits > 1 )
                    {
                        --MaxHitPoints;

                        if ( Parent is Mobile )
                            ((Mobile)Parent).LocalOverheadMessage( MessageType.Regular, 0x3B2, 1061121 ); // Your equipment is severely damaged.
                    }
                    else
                    {
                        Delete();
                    }
                }
            }

            if ( attacker is VampireBatFamiliar )
            {
                BaseCreature bc = (BaseCreature)attacker;
                Mobile caster = bc.ControlMaster;

                if ( caster == null )
                    caster = bc.SummonMaster;

                if ( caster != null && caster.Map == bc.Map && caster.InRange( bc, 2 ) )
                    caster.Hits += damage;
                else
                    bc.Hits += damage;
            }

            if ( Core.AOS )
            {
                int physChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitPhysicalArea ) * propertyBonus);
                int fireChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitFireArea ) * propertyBonus);
                int coldChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitColdArea ) * propertyBonus);
                int poisChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitPoisonArea ) * propertyBonus);
                int nrgyChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitEnergyArea ) * propertyBonus);

                if ( physChance != 0 && physChance > Utility.Random( 100 ) )
                    DoAreaAttack( attacker, defender, 0x10E,   50, 100, 0, 0, 0, 0 );

                if ( fireChance != 0 && fireChance > Utility.Random( 100 ) )
                    DoAreaAttack( attacker, defender, 0x11D, 1160, 0, 100, 0, 0, 0 );

                if ( coldChance != 0 && coldChance > Utility.Random( 100 ) )
                    DoAreaAttack( attacker, defender, 0x0FC, 2100, 0, 0, 100, 0, 0 );

                if ( poisChance != 0 && poisChance > Utility.Random( 100 ) )
                    DoAreaAttack( attacker, defender, 0x205, 1166, 0, 0, 0, 100, 0 );

                if ( nrgyChance != 0 && nrgyChance > Utility.Random( 100 ) )
                    DoAreaAttack( attacker, defender, 0x1F1,  120, 0, 0, 0, 0, 100 );

                int maChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitMagicArrow ) * propertyBonus);
                int harmChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitHarm ) * propertyBonus);
                int fireballChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitFireball ) * propertyBonus);
                int lightningChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitLightning ) * propertyBonus);
                int dispelChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitDispel ) * propertyBonus);

                if ( maChance != 0 && maChance > Utility.Random( 100 ) )
                    DoMagicArrow( attacker, defender );

                if ( harmChance != 0 && harmChance > Utility.Random( 100 ) )
                    DoHarm( attacker, defender );

                if ( fireballChance != 0 && fireballChance > Utility.Random( 100 ) )
                    DoFireball( attacker, defender );

                if ( lightningChance != 0 && lightningChance > Utility.Random( 100 ) )
                    DoLightning( attacker, defender );

                if ( dispelChance != 0 && dispelChance > Utility.Random( 100 ) )
                    DoDispel( attacker, defender );

                int laChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitLowerAttack ) * propertyBonus);
                int ldChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitLowerDefend ) * propertyBonus);

                if ( laChance != 0 && laChance > Utility.Random( 100 ) )
                    DoLowerAttack( attacker, defender );

                if ( ldChance != 0 && ldChance > Utility.Random( 100 ) )
                    DoLowerDefense( attacker, defender );
            }


У тебя Core.AOS вообще?

Вот эта хрено-конструкция что выше, при каждом ударе вызывается)))

Попробуй ради теста сделай так:
Найди в OnHit:
Код

                int maChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitMagicArrow ) * propertyBonus);
                int harmChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitHarm ) * propertyBonus);
                int fireballChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitFireball ) * propertyBonus);
                int lightningChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitLightning ) * propertyBonus);
                int dispelChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitDispel ) * propertyBonus);

                if ( maChance != 0 && maChance > Utility.Random( 100 ) )
                    DoMagicArrow( attacker, defender );

                if ( harmChance != 0 && harmChance > Utility.Random( 100 ) )
                    DoHarm( attacker, defender );

                if ( fireballChance != 0 && fireballChance > Utility.Random( 100 ) )
                    DoFireball( attacker, defender );

                if ( lightningChance != 0 && lightningChance > Utility.Random( 100 ) )
                    DoLightning( attacker, defender );


Пропиши себе на на DoLightning, lightningChance 100% что-бы были, остальное можешь хоть закомментить, тоесть у тебя при любом ударе, даже без шмотки на лайт и т.д., всегда должен лайт вылетать.

Если не будет работать, значит у тебя if Core.AOS не позволяет выполнить блок. Если будет работать, прийдётся дальше возиться )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 1.3.2015, 2:59
Сообщение #12


****

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



У меня точно АОС, точнее СЕ, МЛ я вырубил только.

И еще, если взять меч к примеру, превратить его в браслет, изменить ему лейер и одеть - эффекты не работают. Может это как то связано?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 1.3.2015, 3:10
Сообщение #13


**********

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



попробуй добавить в тот блок с Core.AOS:
int laChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerAttack) * propertyBonus);
int ldChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerDefend) * propertyBonus);

BaseJewel bracelet = attacker.FindItemOnLayer(Layer.Bracelet) as BaseJewel;
if (bracelet != null && bracelet is Qqq )
ldChance += 100;


Если важно отображение свойства на предмете, то можно будет его вывести в GetProperties методе класса BaseJewel:
if (this is Qqq)
{
list.Add(1060425, "100"); // hit lower defense ~1_val~%
}


Но это лишь ленивое решение, проще раз и навсегда добавить раздел свойств AosWeaponAttributes в требуемые классы типа BaseArmor, BaseJewel и др. Или же как предложил Aimed, создать один независимый класс со всеми свойствами, а потом передавать его свойства всем подклассам.

Сообщение отредактировал Juzzver - 1.3.2015, 3:16


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


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



Цитата(Juzzver @ 1.3.2015, 0:20) *

get указан, а set отсутствует - по этому в пропсе был Null, значение value не передалось.


Походу там сеттер не нужен потому что AosWeaponAttributes является классом массивом. Ты просто запрашиваешь класс и редактируешь внутри класса уже, а не сам класс, поэтому сеттер, наверное, и не нужен.

Цитата(Juzzver @ 1.3.2015, 1:10) *

попробуй добавить в тот блок с Core.AOS:
int laChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerAttack) * propertyBonus);
int ldChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerDefend) * propertyBonus);

BaseJewel bracelet = attacker.FindItemOnLayer(Layer.Bracelet) as BaseJewel;
if (bracelet != null && bracelet is Qqq )
ldChance += 100;


Если важно отображение свойства на предмете, то можно будет его вывести в GetProperties методе класса BaseJewel:
if (this is Qqq)
{
list.Add(1060425, "100"); // hit lower defense ~1_val~%
}


Но это лишь ленивое решение, проще раз и навсегда добавить раздел свойств AosWeaponAttributes в требуемые классы типа BaseArmor, BaseJewel и др. Или же как предложил Aimed, создать один независимый класс со всеми свойствами, а потом передавать его свойства всем подклассам.


Будет мега странно, если с явным прописыванием на проверку браслета будет работать.
Ведь в GetValue методе из AOS.cs идёт проверка фор лупом по всем айтемам что на мобайле. Не должно иметь роли какой вообще леер...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 1.3.2015, 3:31
Сообщение #15


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



А как ты тестишь? С мечом и без кольца и с кольцом и без меча??
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 1.3.2015, 3:43
Сообщение #16


**********

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



Цитата
Будет мега странно, если с явным прописыванием на проверку браслета будет работать.
Ведь в GetValue методе из AOS.cs идёт проверка фор лупом по всем айтемам что на мобайле. Не должно иметь роли какой вообще леер...

В моем случае это работает с другими вещами (IMG:style_emoticons/default/smile.gif), соответственно должно сработать и для браслета.
Твой вариант без set тоже работает (IMG:style_emoticons/default/smile.gif)


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


****

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



Тестю во всех возможных вариантах!

Juzzver, а куда конкретно прописать, что то у меня башка уже кругом...
int laChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerAttack) * propertyBonus);
int ldChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerDefend) * propertyBonus);
у меня таких строк там вообще нет. Ранка 2.0 финал если что.

На счет отображения не нужно, я если что сделаю. Главное эффект, и чтоб можно было скриптам с артами просто прописывать строчки, а не в ста местах для каждого арта такого затычки делать.

https://drive.google.com/file/d/0B1QGeQJizp...iew?usp=sharing
если кому интересно вот файл АОС, чтоб сюда его не выкладывать кодом а то огромный очень.


Я изначально как сделал - просто скопировал в АОС.кс нужные свойства из AosWeaponAttribute в разделы AosAttribute, и например хитлайтнинг можно было пропсом вписать любой шмотке у которой был раздел AosAttribute. Оно и отображалось, и в пропсе было, и в скрипте оно добавлялось и проходило. Но оно не работало, как собственно и сейчас =(
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 1.3.2015, 4:09
Сообщение #18


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



Цитата(Sergius Grey @ 1.3.2015, 1:47) *

Тестю во всех возможных вариантах!

Juzzver, а куда конкретно прописать, что то у меня башка уже кругом...
int laChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerAttack) * propertyBonus);
int ldChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerDefend) * propertyBonus);
у меня таких строк там вообще нет. Ранка 2.0 финал если что.

На счет отображения не нужно, я если что сделаю. Главное эффект, и чтоб можно было скриптам с артами просто прописывать строчки, а не в ста местах для каждого арта такого затычки делать.

https://drive.google.com/file/d/0B1QGeQJizp...iew?usp=sharing
если кому интересно вот файл АОС, чтоб сюда его не выкладывать кодом а то огромный очень.
Я изначально как сделал - просто скопировал в АОС.кс нужные свойства из AosWeaponAttribute в разделы AosAttribute, и например хитлайтнинг можно было пропсом вписать любой шмотке у которой был раздел AosAttribute. Оно и отображалось, и в пропсе было, и в скрипте оно добавлялось и проходило. Но оно не работало, как собственно и сейчас =(


Конечно не работало, потому что шанс на удар лайтнингом высчитывается только в методе OnHit, который находится в BaseWeapon.
Высчитывается он только через AosWeaponAttribute.
Если ты сделал всё что я сказал - должно работать.
У меня есть вариант, что если ты тестишь с кольцом но без оружия, то OnHit не срабатывает, потому что у тебя нету оружия в руках.
Только внятного кода где видно как определяется оружие в руках, если у тебя в руках ничего нету, я не нашёл кроме:
Код
[CommandProperty( AccessLevel.GameMaster )]
        public virtual IWeapon Weapon
        {
            get
            {
                Item item = m_Weapon as Item;

                if( item != null && !item.Deleted && item.Parent == this && CanSee( item ) )
                    return m_Weapon;

                m_Weapon = null;

                item = FindItemOnLayer( Layer.OneHanded );

                if( item == null )
                    item = FindItemOnLayer( Layer.TwoHanded );

                if( item is IWeapon )
                    return (m_Weapon = (IWeapon)item);
                else
                    return GetDefaultWeapon();
            }
        }

        public virtual IWeapon GetDefaultWeapon()
        {
            return m_DefaultWeapon;
        }


И это:
Код
        private static IWeapon m_DefaultWeapon;

        public static IWeapon DefaultWeapon
        {
            get
            {
                return m_DefaultWeapon;
            }
            set
            {
                m_DefaultWeapon = value;
            }
        }


Это из Mobile.cs

Поэтому, если у тебя прописано призначение в конструкторах BaseItem & BaseJewel, если в методе GetValue в AosWeaponAttribute есть соответствующие иф блоки
и если прописаны свойства в сами артефакты - всё должно работать при наличии BaseWeapon на чаре, потому что именно он делает все вычисления и вызывает всякие личи и лайтнинги с ударов.

Цитата(Juzzver @ 1.3.2015, 1:43) *

В моем случае это работает с другими вещами (IMG:style_emoticons/default/smile.gif), соответственно должно сработать и для браслета.
Твой вариант без set тоже работает (IMG:style_emoticons/default/smile.gif)



Да, но это ведь бред, явным образом прописывать класс артефакта в том месте и делать для него отдельную проверку, если для этого уже есть метод проверки в GetValue.

Если через GetValue не работает, то и по твоему не будет и значит причина в чем-то совсем другом.
Например в неимении BaseWeapon на чаре, тоесть не запускается сам OnHit и т.д.

А без set почему работает, я уже обьяснил.
Свойство - обьект. Мы меняем не сам обьект на другой обьект, а свойство в этом обьекте.
Вот если попробовать сам обьект AosWeaponAttributes заменить, а не одно из его свойств - тогда компилятор будет ругаться.
И это не в моем случае, а в случае дефолтного ранУО кода)) Я и сам не знал что так будет работать, пока ты на это не обратил внимание.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 1.3.2015, 4:11
Сообщение #19


**********

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



Цитата
Juzzver, а куда конкретно прописать, что то у меня башка уже кругом...
int laChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerAttack) * propertyBonus);
int ldChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerDefend) * propertyBonus);
у меня таких строк там вообще нет. Ранка 2.0 финал если что.

эти блоки с чанасами я копировал из цитату сверху, то видимо ранка посвежее, чем твоя.

Можешь добавить целиком где то в блоке:
if (Core.AOS)
{
int physChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitPhysicalArea) * propertyBonus);
...


Код
                int laChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerAttack) * propertyBonus);
                int ldChance = (int)(AosWeaponAttributes.GetValue(attacker, AosWeaponAttribute.HitLowerDefend) * propertyBonus);

BaseJewel bracelet = attacker.FindItemOnLayer(Layer.Bracelet) as BaseJewel;
if (bracelet != null && bracelet is Qqq )
ldChance += 100;


                if (laChance != 0 && laChance > Utility.Random(100))
                    DoLowerAttack(attacker, defender);

                if (ldChance != 0 && ldChance > Utility.Random(100))
                    DoLowerDefense(attacker, defender);


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


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8676
Пользователь №: 15.607



Код, который запостил Juzzver из метода OnHit в BaseWeapon, только он отвечает за вообще левую атаку, а не лайтнинг.
Он тут добавил явную проверку на твой конкретный айтем и ставит шанс удара 100%.
После чего срабатывает другой иф блок и делает DoLowerAttack & DoLowerDefense.

В коде внизу высчитывается шанс на удар лайтнинга, как я уже и говорил.
Вот эти строчки за всё это отвечают, тоже из OnHit
Код
int maChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitMagicArrow ) * propertyBonus);
                int harmChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitHarm ) * propertyBonus);
                int fireballChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitFireball ) * propertyBonus);
                int lightningChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitLightning ) * propertyBonus);
                int dispelChance = (int)(AosWeaponAttributes.GetValue( attacker, AosWeaponAttribute.HitDispel ) * propertyBonus);

                if ( maChance != 0 && maChance > Utility.Random( 100 ) )
                    DoMagicArrow( attacker, defender );

                if ( harmChance != 0 && harmChance > Utility.Random( 100 ) )
                    DoHarm( attacker, defender );

                if ( fireballChance != 0 && fireballChance > Utility.Random( 100 ) )
                    DoFireball( attacker, defender );

                if ( lightningChance != 0 && lightningChance > Utility.Random( 100 ) )
                    DoLightning( attacker, defender );

                if ( dispelChance != 0 && dispelChance > Utility.Random( 100 ) )
                    DoDispel( attacker, defender );


Можешь тут тоже самое вписать в код, что тебе и показал Juzzver, но это не поможет

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

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

 

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