|
WeaponAttributes для армора и прочего |
|
|
Sergius Grey |
28.2.2015, 9:05
|
Apprentice
Сообщений: 149
Регистрация: 20.6.2011 Группа: Пользователи Наличность: 0
Пользователь №: 13.734
Возраст: 23
|
Снова стал возиться с сервером, хочу реализовать задумка, например, кольцо с хит лайтнингом или перчатки с мана личем.
Собственно вопрос - каким способом можно прописать артефакту WeaponAttributes, ссылаясь на бейс веапон или что то вроде того? В АОС.кс я добавлял из WeaponAttributes в просто АОСатрибутс свойства, они появлялись в пропсе, отображались на вещи, но не давали эффекта. И я понимаю почему. Просто хочется все это сделать с наименьшим количеством кода, это главная задача. А прописывать кучу строк в бейсАрмор и БейсДжевел не хочется, во избежании возможных конфликтов и косяков, которые могут всплыть со временем, так как я не уверен что смогу верно все расписать там. Проще говоря не хочется все это делать "брейнфаковским способом".
Может можно это сделать при помощи методов void OnAdded и void OnRemoved соответственно? Но в идеале хотелось бы, чтоб кольца например просто могли принимать WeaponAttributes при создании новых скриптов артефактов.
В общем если кто может подсказать, как сделать все аккуратненько, напишите пожалуйста способ.
Ранка 2.0
|
|
|
|
Aimed |
28.2.2015, 14:24
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 7818
Пользователь №: 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 +на армор, колчаны и талисманы тоже вепон свойства сможешь прописывать.
|
|
|
|
Sergius Grey |
28.2.2015, 22:46
|
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, хотя должно быть многоточие. Видимо туплю я где то =( Буду пытаться найти причину.
|
|
|
|
Aimed |
1.3.2015, 0:32
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 7818
Пользователь №: 15.607
|
Cтоп. Что ты конкретно сделал. Лучше б со скринами, где конкретно ты добавлял код. Возможно я что-то упустил, т.к. я очень быстро прошёлся по дефолтовой комбат системе ранки, потом вышел на BaseWapon, посмотрел как атрибуты вепов вычитываются и всё.
Тоесть, теоретически, в комбат системе всё работает, а вот при надевании, создании сервер крашит, потому что обработка этих свойств для BaseArmor & BaseJewel не сделана)
То что я тебе показал - это только для комбат системы.
|
|
|
|
Sergius Grey |
1.3.2015, 1:02
|
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(); } } } При попытке добавить этот браслет, он не добавляется и ранка выдает сообщение, что я привел выше. Краша при этом нету, все продолжает работать. Просто не добавляется. Собственно вот.
|
|
|
|
Sergius Grey |
1.3.2015, 2:32
|
Apprentice
Сообщений: 149
Регистрация: 20.6.2011 Группа: Пользователи Наличность: 0
Пользователь №: 13.734
Возраст: 23
|
Aimed, черт да, я тупанул я думал у меня там прописано. Дописал m_AosWeaponAttributes = new AosWeaponAttributes( this ); Теперь нету Нулл кстати, можно все прописывать. С этим разобрались. Шмотка добавляется, эффект на ней есть, не отображается правда при наведении но это не так важно, с этим я разберусь. С этим да, разобрались. Но в итоге щас имеем то же, что у меня и было но с моим кривым способом - эффект прописан, но он не работает, увы... =( Ни один параметр не работает - ни лич какой нибудь, ни фаерэрия, ни хитлайтнинг и все прочее соответственно. В этом то и проблема =(
|
|
|
|
Aimed |
1.3.2015, 2:41
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 7818
Пользователь №: 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 не позволяет выполнить блок. Если будет работать, прийдётся дальше возиться )
|
|
|
|
Juzzver |
1.3.2015, 3:10
|
Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008 Группа: Супермодераторы Наличность: 22559 Из: Северная Корея
Пользователь №: 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
--------------------
|
|
|
|
Aimed |
1.3.2015, 3:19
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 7818
Пользователь №: 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 идёт проверка фор лупом по всем айтемам что на мобайле. Не должно иметь роли какой вообще леер...
|
|
|
|
Sergius Grey |
1.3.2015, 3:47
|
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. Оно и отображалось, и в пропсе было, и в скрипте оно добавлялось и проходило. Но оно не работало, как собственно и сейчас =(
|
|
|
|
Aimed |
1.3.2015, 4:09
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 7818
Пользователь №: 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 заменить, а не одно из его свойств - тогда компилятор будет ругаться. И это не в моем случае, а в случае дефолтного ранУО кода)) Я и сам не знал что так будет работать, пока ты на это не обратил внимание.
|
|
|
|
Juzzver |
1.3.2015, 4:11
|
Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008 Группа: Супермодераторы Наличность: 22559 Из: Северная Корея
Пользователь №: 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);
--------------------
|
|
|
|
Aimed |
1.3.2015, 4:23
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 7818
Пользователь №: 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 не запускается, когда он тестирует свой браслет. Скорее всего тестировал с оружием и без браслета, а потом с браслетом и без оружия)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|