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

 
Ответить в эту темуОткрыть новую тему
> Оверрайд элементального урона у мобайла с оружием
Sergius Grey
сообщение 29.9.2015, 22:10
Сообщение #1


****

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 );

Но как бы оно не конфликтовало с оружием в руках моба =(
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 29.9.2015, 23:41
Сообщение #2


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8769
Пользователь №: 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 );

Но как бы оно не конфликтовало с оружием в руках моба =(


Тебе нужно в момент одевания оружия прописать оружию эти типы урона.
Если сам не можешь то выложи код создания и одевания этого моба.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 30.9.2015, 11:29
Сообщение #3


****

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();
        }
    }
}
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 1.10.2015, 1:34
Сообщение #4


**********

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



Цитата
Не понял на счет кода создания и одевания...

Имеется ввиду, чтобы на оружие вешался элементальный дамаг по фаеру к примеру, в момент одевания вепона, и в момент снятия - чтобы возвращались исходные дамаги на оружие. Сделать это можно через переопределение методов OnAdded и OnRemove. Но я бы не стал прибегать к такому варианту.

Если не ошибаюсь, SetDamageType перекрывает элементальные дамаги орудия.
Какой урон прошел, скорее всего будет определяется в OnHit методе, соответственно там можно организовать проверку с броадкастом или выводом на консоль, куда будет выводится прошедший дамаг по мобайлу, ну и исходя из этого сделать выводы подходит такой вариант или нет.


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


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8769
Пользователь №: 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 );
        }


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


****

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, мысль интересная, завтра опробую и отпишу, спасибо. А то сейчас уже спать пора.

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


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8769
Пользователь №: 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)
Уже в них выставлять вызывая этот новый метод.
Эти методы вызываются после того как вещь оделась и добавила бонусы персонажу.
Так легче сделать, правда получается что выполняется куча кода впустую. Сначало добавляем бонусы при одевании, потом их оверрайдим...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 1.10.2015, 13:11
Сообщение #8


****

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



Проблема. Мобайл.кс у меня нету. Ранка 2.0.
Или оно в ядре? Я до сих пор экзешник не разбил на скрипты. Поясню - пробовал я это когда был совсем нубом, точнее большим нубом чем сейчас, я что то сделал не так и с тех пор я боюсь этого.
А если мобайл.кс не в ядре, то где его аналог в моей ранке? Хотя по коду даже ничего похожего не находит, так что скорее всего оно в ядре... Может займусь разбиранием экзешника.
А через оверрайд если в скрипте только наемника можно прописать консекрус?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 1.10.2015, 13:37
Сообщение #9


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8769
Пользователь №: 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;
            }
        }


Ещё можешь так-же добавить сюда выставление элементального урона. Короче, это тот оверрайд, который тебе был нужен.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sergius Grey
сообщение 1.10.2015, 13:48
Сообщение #10


****

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



Черт, затупил =( Спасибо, работает.
Попробую пока разобрать ядро, давно это надо было сделать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Juzzver
сообщение 1.10.2015, 23:26
Сообщение #11


**********

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



Протестировал SetDamageType, элементальное оружие не перекрывает его значения.
При выводе типов урона, значения не изменяются, все равны 20%. Установив на орудии 100% элементальный урон произвольного типа, никаких изменений не последовало, все равно наносился 20% урон.


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


****

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;
            
        }

То
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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