|
|
|
Оверрайд элементального урона у мобайла с оружием |
|
|
Sergius Grey |
29.9.2015, 22:10
|
Apprentice
Сообщений: 149
Регистрация: 20.6.2011 Группа: Пользователи Наличность: 0
Пользователь №: 13.734
Возраст: 23
|
Есть мобайл, наемник, гуманоид. У него в руке может быть разное оружие, артовое к примеру, но нужно сделать так, чтобы элементальный урон (огнем колдом и тд) был всегда одинаковый и не брался с оружия.
Альтернативно, если это не получится сделать адекватно, прописать мобайлу постоянный эффект заклинания консекрус арма, типа weapon.Consecrated = true; Но как это прописать точно, я опять же не знаю из за незнания языка.
На счет первого варианта - нужно прописать следующее, но через оверрайд
SetDamageType( ResistanceType.Physical, 20 ); SetDamageType( ResistanceType.Fire, 20 ); SetDamageType( ResistanceType.Cold, 20 ); SetDamageType( ResistanceType.Poison, 20 ); SetDamageType( ResistanceType.Energy, 20 );
Но как бы оно не конфликтовало с оружием в руках моба =(
|
|
|
|
Aimed |
29.9.2015, 23:41
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8676
Пользователь №: 15.607
|
Цитата(Sergius Grey @ 29.9.2015, 21:10) Есть мобайл, наемник, гуманоид. У него в руке может быть разное оружие, артовое к примеру, но нужно сделать так, чтобы элементальный урон (огнем колдом и тд) был всегда одинаковый и не брался с оружия.
Альтернативно, если это не получится сделать адекватно, прописать мобайлу постоянный эффект заклинания консекрус арма, типа weapon.Consecrated = true; Но как это прописать точно, я опять же не знаю из за незнания языка. На счет первого варианта - нужно прописать следующее, но через оверрайд
SetDamageType( ResistanceType.Physical, 20 ); SetDamageType( ResistanceType.Fire, 20 ); SetDamageType( ResistanceType.Cold, 20 ); SetDamageType( ResistanceType.Poison, 20 ); SetDamageType( ResistanceType.Energy, 20 );
Но как бы оно не конфликтовало с оружием в руках моба =(
Тебе нужно в момент одевания оружия прописать оружию эти типы урона. Если сам не можешь то выложи код создания и одевания этого моба.
|
|
|
|
Sergius Grey |
30.9.2015, 11:29
|
Apprentice
Сообщений: 149
Регистрация: 20.6.2011 Группа: Пользователи Наличность: 0
Пользователь №: 13.734
Возраст: 23
|
Не понял на счет кода создания и одевания... Наемника можно одевать и раздевать как угодно. Ниже скину полный скрипт если это важно. А в момент снятия оружия? Наемников можно одевать и раздевать, то есть я например дам ему какой нибудь арт, у этого арта изменится тип урона, а при снятии надо заставить ранку возвращать нужный тип урона получается, и если бы у всех оружий был бы физ урон 100% то это ничего еще, но не будет ли геморно и много строк чтобы ранка считывала дефолтный тип урона? Может проще прописать наложение консекруса постоянное в руках моба? Меня устраивают оба варианта. Ниже код. На мусор в коде не обращаем внимание. Код using System; using System.Collections; using Server.Items; using Server.ContextMenus; using Server.Misc; using Server.Network;
using System.Collections.Generic; using Server; using Server.Mobiles;
namespace Server.Mobiles { public class Esquire : BaseCreature { public override bool ShowFameTitle{ get{ return false; } }
[Constructable] public Esquire() : base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.18, 0.36 ) { Title = "the esquire"; Hue = Utility.RandomSkinHue();
if ( this.Female = Utility.RandomBool() ) { Body = 0x191; Name = NameList.RandomName( "female" ); AddItem( new Doublet( Utility.RandomMetalHue() ) ); } else { Body = 0x190; Name = NameList.RandomName( "male" ); AddItem( new Surcoat( Utility.RandomMetalHue() ) ); }
SetStr( 150 ); SetDex( 150 ); SetInt( 150 );
SetSkill( SkillName.Fencing, 90 ); SetSkill( SkillName.Macing, 90 ); SetSkill( SkillName.MagicResist, 90 ); SetSkill( SkillName.Swords, 90); SetSkill( SkillName.Tactics, 90 ); SetSkill( SkillName.Wrestling, 90 );
Fame = 0; Team = 77; /*SetDamageType( ResistanceType.Physical, 20 ); SetDamageType( ResistanceType.Fire, 20 ); SetDamageType( ResistanceType.Cold, 20 ); SetDamageType( ResistanceType.Poison, 20 ); SetDamageType( ResistanceType.Energy, 20 );*/
AddItem( new ThighBoots()); AddItem( new FancyShirt( Utility.RandomMetalHue() )); AddItem( new Cloak( Utility.RandomMetalHue() )); AddItem( new LeatherGloves()); AddItem( new LongPants( Utility.RandomMetalHue() )); AddItem( new FeatheredHat( Utility.RandomMetalHue() )); AddItem( new LeatherChest());
switch ( Utility.Random( 14 )) { case 0: AddItem( new Longsword() ); break; case 1: AddItem( new Scimitar() ); break; case 2: AddItem( new Broadsword() ); break; case 3: AddItem( new Spear() ); break; case 4: AddItem( new VikingSword() ); break; case 5: AddItem( new Halberd() ); break; case 6: AddItem( new WarAxe() ); break; case 7: AddItem( new Maul() ); break; case 8: AddItem( new Mace() ); break; case 9: AddItem( new Pike() ); break; case 10: AddItem( new Cutlass() ); break; case 11: AddItem( new Katana() ); break; case 12: AddItem( new Kryss() ); break; case 13: AddItem( new HammerPick() ); break;
}
Utility.AssignRandomHair( this ); }
public override int GetMaxResistance( ResistanceType type ) { if ( AccessLevel > AccessLevel.Player ) return int.MaxValue;
int max = (type == ResistanceType.Physical) ? (( AccessLevel > AccessLevel.Player ) ? int.MaxValue : 80) : 70;
if ( type != ResistanceType.Physical && 60 < max && Spells.Fourth.CurseSpell.UnderEffect( this ) ) max = 60;
if( Core.ML && this.Race == Race.Elf && type == ResistanceType.Energy ) max += 5; //Intended to go after the 60 max from curse
return max; }
public override bool AllowEquipFrom( Mobile from ) { return ControlMaster == from || base.AllowEquipFrom(from);
}
#region Pack Animal Methods public override bool OnBeforeDeath() { if ( !base.OnBeforeDeath() ) return false;
PackAnimal.CombineBackpacks( this );
return true; }
public override DeathMoveResult GetInventoryMoveResultFor( Item item ) { return DeathMoveResult.MoveToCorpse; }
public override bool IsSnoop( Mobile from ) { if ( PackAnimal.CheckAccess( this, from ) ) return false;
return base.IsSnoop( from ); }
public override bool OnDragDrop( Mobile from, Item item ) { if ( CheckFeed( from, item ) ) return true;
if ( PackAnimal.CheckAccess( this, from ) ) { AddToBackpack( item ); return true; }
return base.OnDragDrop( from, item ); }
public override bool CheckNonlocalDrop( Mobile from, Item item, Item target ) { return PackAnimal.CheckAccess( this, from ); }
public override bool CheckNonlocalLift( Mobile from, Item item ) { return PackAnimal.CheckAccess( this, from ); }
public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list ) { base.GetContextMenuEntries( from, list );
PackAnimal.GetContextMenuEntries( this, from, list ); } #endregion
public Esquire( Serial serial ) : base( serial ) { }
public override void Serialize( GenericWriter writer ) { base.Serialize( writer );
writer.Write( (int) 0 ); // version }
public override void Deserialize( GenericReader reader ) { base.Deserialize( reader );
int version = reader.ReadInt(); } } }
|
|
|
|
Aimed |
1.10.2015, 1:34
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8676
Пользователь №: 15.607
|
Я кое что придумал, что попроще, но прийдётся маленько Mobile отредактировать. Найди в Mobile.cs вот эти два метода: Код public void AddItem( Item item ) { if( item == null || item.Deleted ) return;
if( item.Parent == this ) return; else if( item.Parent is Mobile ) ((Mobile)item.Parent).RemoveItem( item ); else if( item.Parent is Item ) ((Item)item.Parent).RemoveItem( item ); else item.SendRemovePacket();
item.Parent = this; item.Map = m_Map;
m_Items.Add( item );
if( !item.IsVirtualItem ) { UpdateTotal( item, TotalType.Gold, item.TotalGold ); UpdateTotal( item, TotalType.Items, item.TotalItems + 1 ); UpdateTotal( item, TotalType.Weight, item.TotalWeight + item.PileWeight ); }
item.Delta( ItemDelta.Update );
item.OnAdded( this ); OnItemAdded( item );
if( item.PhysicalResistance != 0 || item.FireResistance != 0 || item.ColdResistance != 0 || item.PoisonResistance != 0 || item.EnergyResistance != 0 ) UpdateResistances(); } И вот этот ( они рядом) Код public void RemoveItem( Item item ) { if( item == null || m_Items == null ) return;
if( m_Items.Contains( item ) ) { item.SendRemovePacket();
//int oldCount = m_Items.Count;
m_Items.Remove( item );
if( !item.IsVirtualItem ) { UpdateTotal( item, TotalType.Gold, -item.TotalGold ); UpdateTotal( item, TotalType.Items, -(item.TotalItems + 1) ); UpdateTotal( item, TotalType.Weight, -(item.TotalWeight + item.PileWeight) ); }
item.Parent = null;
item.OnRemoved( this ); OnItemRemoved( item );
if( item.PhysicalResistance != 0 || item.FireResistance != 0 || item.ColdResistance != 0 || item.PoisonResistance != 0 || item.EnergyResistance != 0 ) UpdateResistances(); } } Тебе нужно в Mobile сделать два виртуальных метода типа public virtual void AddItemBonuses(Item item) и public virtual void RemoveItemBonuses(Item item). И вместо строк item.OnAdded(this) и item.OnRemoved(this); Сделать вызов через эти новые методы, а в них уже прописать это старое, тоесть будет так, показываю на примере с одеванием: Код public void AddItem( Item item ) { if( item == null || item.Deleted ) return;
if( item.Parent == this ) return; else if( item.Parent is Mobile ) ((Mobile)item.Parent).RemoveItem( item ); else if( item.Parent is Item ) ((Item)item.Parent).RemoveItem( item ); else item.SendRemovePacket();
item.Parent = this; item.Map = m_Map;
m_Items.Add( item );
if( !item.IsVirtualItem ) { UpdateTotal( item, TotalType.Gold, item.TotalGold ); UpdateTotal( item, TotalType.Items, item.TotalItems + 1 ); UpdateTotal( item, TotalType.Weight, item.TotalWeight + item.PileWeight ); }
item.Delta( ItemDelta.Update );
AddItemBonuses(Item item);//вот вызов в наш новый метод. OnItemAdded( item );
if( item.PhysicalResistance != 0 || item.FireResistance != 0 || item.ColdResistance != 0 || item.PoisonResistance != 0 || item.EnergyResistance != 0 ) UpdateResistances(); }
public virtual void AddItemBonuses(Item item) //а вот и он сам { item.OnAdded( this ); } Теперь в своём Esquire.cs делаешь оверрайд и проверяешь на оружие: Код public override void AddItemBonuses(Item item) { if(!(item is BaseWeapon)) item.OnAdded( this ); } Тоесть, если не оружие - бонуса на наёмника добавятся, а если оружие - ничего не будет. Если тебе надо что-бы вообще никакая экипировка не добавляла бонус - просто этот метод пустым сделай и всё.
|
|
|
|
Sergius Grey |
1.10.2015, 2:19
|
Apprentice
Сообщений: 149
Регистрация: 20.6.2011 Группа: Пользователи Наличность: 0
Пользователь №: 13.734
Возраст: 23
|
Juzzver, setdamagetype перекрывает лишь в том случаи, когда на оружии ничего не прописано по элемент.урону и он по дефолту 100 физ. А если прописано через: Код public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy ) { phys = fire = cold = pois = 0; nrgy = 100; } , какую бы стихию (включая физ 100) тут не прописывать, урон эта хрень на оружии перекрывает мобайловский, увы. Aimed, мысль интересная, завтра опробую и отпишу, спасибо. А то сейчас уже спать пора. Буду так же рад, если подскажите как прописать постоянный эффект консекруса у моба, если в руках оружие. Это даже более лучшая идея (по концепции больше подходит).
|
|
|
|
Aimed |
1.10.2015, 2:40
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8676
Пользователь №: 15.607
|
Цитата(Sergius Grey @ 1.10.2015, 1:19) Juzzver, setdamagetype перекрывает лишь в том случаи, когда на оружии ничего не прописано по элемент.урону и он по дефолту 100 физ. А если прописано через: Код public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy ) { phys = fire = cold = pois = 0; nrgy = 100; } , какую бы стихию (включая физ 100) тут не прописывать, урон эта хрень на оружии перекрывает мобайловский, увы. Aimed, мысль интересная, завтра опробую и отпишу, спасибо. А то сейчас уже спать пора. Буду так же рад, если подскажите как прописать постоянный эффект консекруса у моба, если в руках оружие. Это даже более лучшая идея (по концепции больше подходит). Проблема в том, что этот эффект не у моба, а у оружия. Тоесть, если ты хочешь сделать через weapon.Consecrated = true; Тогда делаешь тоже самое что я тебе сказал и просто его выставляешь если item is BaseWeapon. Вот пример с одеванием и новым методом: Код public override void AddItemBonuses(Item item) { var weapon = item as BaseWeapon; if(weapon != null) { weapon.Consecrated = true; } item.OnAdded( this ); } Цитата(Juzzver @ 1.10.2015, 0:34) Имеется ввиду, чтобы на оружие вешался элементальный дамаг по фаеру к примеру, в момент одевания вепона, и в момент снятия - чтобы возвращались исходные дамаги на оружие. Сделать это можно через переопределение методов OnAdded и OnRemove. Но я бы не стал прибегать к такому варианту.
Если не ошибаюсь, SetDamageType перекрывает элементальные дамаги орудия. Какой урон прошел, скорее всего будет определяется в OnHit методе, соответственно там можно организовать проверку с броадкастом или выводом на консоль, куда будет выводится прошедший дамаг по мобайлу, ну и исходя из этого сделать выводы подходит такой вариант или нет.
Кстати да. Они перекрывают, просто у него они выставляются при создании персонажа, а потом он одевается и как итог от перекрытия толку 0. Нужно вывести выставление этих дамагов в отдельный метод и сделав оверрайд в самом Esquire.OnItemAdded(Item item)/OnItemRemoved(Item item) Уже в них выставлять вызывая этот новый метод. Эти методы вызываются после того как вещь оделась и добавила бонусы персонажу. Так легче сделать, правда получается что выполняется куча кода впустую. Сначало добавляем бонусы при одевании, потом их оверрайдим...
|
|
|
|
Aimed |
1.10.2015, 13:37
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8676
Пользователь №: 15.607
|
Цитата(Sergius Grey @ 1.10.2015, 12:11) Проблема. Мобайл.кс у меня нету. Ранка 2.0. Или оно в ядре? Я до сих пор экзешник не разбил на скрипты. Поясню - пробовал я это когда был совсем нубом, точнее большим нубом чем сейчас, я что то сделал не так и с тех пор я боюсь этого. А если мобайл.кс не в ядре, то где его аналог в моей ранке? Хотя по коду даже ничего похожего не находит, так что скорее всего оно в ядре... Может займусь разбиранием экзешника. А через оверрайд если в скрипте только наемника можно прописать консекрус?
Да, он в ядре. Я ж обьяснил как прописать (IMG: style_emoticons/default/smile.gif) Ладно, вот, просто добавь это в класс наёмника. Код public override void OnItemAdded(Item item) {
BaseWeapon weapon = item as BaseWeapon; if (weapon != null) { weapon.Consecrated = true; } }
Ещё можешь так-же добавить сюда выставление элементального урона. Короче, это тот оверрайд, который тебе был нужен.
|
|
|
|
Sergius Grey |
2.10.2015, 1:52
|
Apprentice
Сообщений: 149
Регистрация: 20.6.2011 Группа: Пользователи Наличность: 0
Пользователь №: 13.734
Возраст: 23
|
Если пропсом - то да. Но если это арт и в скрипте этого арта прописано, как на примере ниже, тогда при одевании этого арта оно берет значения арта. Именно если на арте прописан override void GetDamageTypes Если бы все было так просто, я бы этот вопрос и не писал бы, так как первым делом именно это и сделал. Тестил я если что с LifeSyphon мечом, а у него вписан через оверрайд физ дамаг 100, так как я делал массово арты из SA для ранки 2.0 по шаблону и случайно это там так и осталось. Но с другими оружиями так же... Код public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy ) { phys = 50; fire = 50; nrgy = 0; pois = 0; cold = 0; }
То
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|