Показать сообщение отдельно
Старый 30.06.2017, 02:24  
g00dw1n
Эксперт
Аватар для g00dw1n
OFFLINE
Регистрация: 30.01.2016
Возраст: 32
Сообщений: 2,265
Благодарностей:
355 всего
Мнения: + 1104
Репутация: 1066
Отправить сообщение для g00dw1n с помощью Skype™

Почему в питере было тепло? Патамушта мой пукан горел от этой темы, точнее от того косяка который сделали.

Собственно с клиента данные приходят валидные, далее в функции:
Код:
CUnmannedTraderUserInfo::ReRegist
Заполняется "таска", которая будет выполнена в отдельном треде
Структура этой задачи такая:
Код:
struct _qry_case_unmandtrader_re_registsingleitem
{
struct __list
{
  char byProcRet;
  bool bRegist;
  unsigned __int16 wItemSerial;
  unsigned int dwTax;
  unsigned int dwListIndex;
  char byClass1;
  char byClass2;
  char byClass3;
  unsigned int dwPrice;
  unsigned int dwRegistSerial;
  char byUpdateState;
};
  char byType;
  unsigned __int16 wInx;
  char byNum;
  unsigned int dwOwnerSerial;
  __list List[10];
};
Как мы видим, в этой структуре нет ни одного поля, которое бы отвечало за кол-во предметов которое будет зарегистрировано. Смекаешь? Они не апдейтят кол-во предметов в стеке, они просто обновляют цену, время регистрации и стейт у зарегистрированного предмета.

Как это фиксить? Мне видится только 1 нормальный способ, это добавить инфу, о кол-ве предметов в стеке, в структуру задачи что выше, но для этого нужно восстановить не малое кол-во функций чтобы это поменять.

Но! У меня есть костыльные варианты решения:
Способ номер раз:
Вешаемся на функцию
Код:
CUnmannedTraderController::UpdateReRegist
И перед выполнением функции
Код:
CRFWorldDatabase::Update_UnmannedTraderReRegist
Дёргаем ячейку по серийнику с инвентаря и уже из ячейки берём сколько есть, но тут есть 1 грабля, на которую можно наступить - перс может быть уже не в онлайне в этот момент и тогда надо делать запрос в базу чтобы достать нужное кол-во. А после квеста с получением кол-ва предметов в стеке - делаем запрос в базу, чтобы это обновить
Способ номер два:
Вешаемся на функцию
Код:
CUnmannedTraderUserInfo::ReRegist
и делаем отмену регистрации, как это сделано вот в этой функции
Код:
CUnmannedTraderUserInfo::CancelRegist
Способ номер 3:
Вешаемся на функцию
Код:
CUnmannedTraderUserInfo::ReRegist
и не делаем нихуя, вообще, вот прям совсем

ибо, нету ручек - нет конфеток


Последний раз редактировалось g00dw1n; 30.06.2017 в 02:29.

Злобный программист
 
Ответить с цитированием
Сказали спасибо:
Devilry-PvP (30.05.2018), stopitsot (24.08.2017), AsteriaGame (07.07.2017)