Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Патчи на рассмотрении

Важная информация

Патчи на рассмотрении Рассматриваемые к принятию патчи

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.11.2010, 12:35   #1
Warlord123
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
Warlord123 Скоро придёт к известности
По умолчанию [fix] Ошибка клиента 132 при смене экипировки встроенным менеджером

При использовании встроенного в клиент менеджера экипировки
возникает проблема при следующих условиях:
1. Персонаж сохранил набор экипировки с 3 джевеловскими камнями (ItemLimitCategory=2).
2. Одевает другой набор вещей, тоже с двеловскими камнями.
3. При попытке переключиться на набор из п.1 происходит падение клиента с ошибкой 132.

Ошибка возникает при формировании пакета от сервера клиенту в процедуре
Код:
void Player::SendEquipError( uint8 msg, Item* pItem, Item *pItem2, uint32 itemid /*= 0*/ ) const       
.........
			case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS:
            case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS:
            case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS:
            {
                ItemPrototype const* proto = pItem ? pItem->GetProto() : sObjectMgr.GetItemPrototype(itemid);
                data << uint32(proto ? proto->ItemLimitCategory : 0);
                break;
            }
.........
Клиенту передается proto->ItemLimitCategory, что не всегда верно. При ошибке с камнями должен передаваться
не ItemLimitCategory предмета(который в большинстве случаев 0), а именно ItemLimitCategory камня, который не дает одеть предмет.

Патчик.
Код:
index 149aaa0..7b17437 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -12295,7 +12295,35 @@ void Player::SendEquipError( uint8 msg, Item* pItem, Item *pItem2, uint32 itemid
             case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS:
             {
                 ItemPrototype const* proto = pItem ? pItem->GetProto() : sObjectMgr.GetItemPrototype(itemid);
-                data << uint32(proto ? proto->ItemLimitCategory : 0);
+                uint32 LimitCategory=proto ? proto->ItemLimitCategory : 0;
+                if (pItem)
+                    // check unique-equipped on gems
+                    for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
+                    {
+                        uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
+                        if(!enchant_id)
+                            continue;
+                        SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
+                        if(!enchantEntry)
+                            continue;
+
+                        ItemPrototype const* pGem = ObjectMgr::GetItemPrototype(enchantEntry->GemID);
+                        if(!pGem)
+                            continue;
+
+                        // include for check equip another gems with same limit category for not equipped item (and then not counted)
+                        uint32 gem_limit_count = !pItem->IsEquipped() && pGem->ItemLimitCategory
+                            ? pItem->GetGemCountWithLimitCategory(pGem->ItemLimitCategory) : 1;
+
+                        if( msg == CanEquipUniqueItem(pGem, pItem->GetSlot(),gem_limit_count))
+                        {
+                            LimitCategory=pGem->ItemLimitCategory;
+                            break;
+                         
+                        }
+                    }
+
+                data << uint32(LimitCategory);
                 break;
             }
             default:
Реализация решает проблему, но явно "хаком", так как приходиться восстанавливать информацию
о том, какая именно ItemLimitCategory вызвала проблему.
Функция uint8 Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limit_count)возвращает
только код ошибки, без источника возникновения.
Варианты правильного решения:
1. из Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limit_count) как-то передавать данные о категории
из функции Player::SendEquipError( uint8 msg... через структуру или переменную.
2. Выделить из Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limit_count) код проверки
камней, который будет сообщать данные об ошибке и категории предмета, вызвавшего ошибку.
Выделенную функцию вызывать из Player::CanEquipUniqueItem(Item* pItem.. и из Player::SendEquipError.
Вложения
Тип файла: patch 132.patch (2.1 Кб, 2 просмотров)
Warlord123 вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Den (16.12.2010)
Старый 01.11.2010, 14:48   #2
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Можно добавить опциональный аругмент : , uint32* pProblematicItemId)
и предавать его по цепочке Can* функций в глубь до ошибки, где

if (pProblematicItemId)
*pProblematicItemId = gemid -- или собствеено itemId

тогда можно будет значение из него будет передать в
SendEquipError( uint8 msg, Item* pItem, Item *pItem2, uint32 itemid) -- как itemid

Фактически тогда это значение можно будет использовать во всех случаях дополнительных данных в SendEquipError

Только это видимо потребует кучу мест для выставлния значений
__________________
Так как устал объяснять знайте ICQ не пользуюсь

Последний раз редактировалось Vladimir; 01.11.2010 в 14:51.
Vladimir вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Den (16.12.2010)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пакеты от клиента к серверу acteros Опкоды, Формулы, Клиент 34 24.07.2014 09:15
[fix bug] невостановление скорости атаки при смене формы без оружия Chipleo MaNGOS 0.12 (2.4.3) 0 11.09.2010 15:59
вылет клиента astlan Корзина 1 28.04.2010 15:04
Ошибка клиента #134 pdx15 Флудильня 9 22.04.2010 09:04
Настройки клиента ВоВ tempura Tools 6 25.03.2010 01:44


Текущее время: 08:25. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot