Я кое что придумал, что попроще, но прийдётся маленько 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 );
}
Тоесть, если не оружие - бонуса на наёмника добавятся, а если оружие - ничего не будет.
Если тебе надо что-бы вообще никакая экипировка не добавляла бонус - просто этот метод пустым сделай и всё.