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

> Оверрайд элементального урона у мобайла с оружием
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
сообщение 1.10.2015, 1:34
Сообщение #2


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 5689
Пользователь №: 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Отправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения



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

 

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