• Страница 1 из 1
  • 1
Модератор форума: Dimitro  
Форум » TrinityCore » [TrinityCore] Help » player_levelstats (Хайпоните:D)
player_levelstats
Borisov99
Сержант
Всем привет) Вопрос по существу:
как дать разрешение ядру на таблицу player_levelstats возможность выставлять значение больше 255, меньше работает, а ставишь больше ничего не работает, думал что-то наподобие статов, но что-то ничего не нашел в исходах, буду благодарен + в репу
Сообщение # 1 написано 16.11.2017 в 13:15
grasicco
Сержант
могу предположить, что там используется unsigned char, поменяй на другой тип
Сообщение # 2 написано 16.11.2017 в 13:44
Borisov99
Сержант
Цитата grasicco ()
что там используется unsigned char

Так вопрос то в этом и стоит, где ?
Сообщение # 3 написано 16.11.2017 в 16:03
Marzed
Скаут
Цитата Borisov99 ()
Так вопрос то в этом и стоит, где ?

В навикате изменить. Каждая колонка в таб имеет свой тип. Например: столбец ID - тип integer(целочисленный), text -тип char(символьный), float - с плавающей точкой и тд и тп. Следовательно Вам нужно изменить тип колонки в навикате.
SwiftCore Developer
Сообщение # 4 отредактировано Marzed - Четверг, 16.11.2017, 21:30
Borisov99
Сержант
Цитата Marzed ()
В навикате изменить.

я же написал, ставлю больше - не работает.
Сообщение # 5 написано 20.11.2017 в 18:19
Marzed
Скаут
Цитата Borisov99 ()
я же написал, ставлю больше - не работает.
Ещё раз напишу. Измени тип самой колонки в табл. что бы принимались значения больше 255
SwiftCore Developer
Сообщение # 6 отредактировано Marzed - Понедельник, 20.11.2017, 19:01
p620
Маршал
Цитата Marzed ()
Ещё раз напишу. Измени тип самой колонки в табл. что бы принимались значения больше 255

А Вы вообще в курсе, что поле читается ядром? И если ядро ждет байт, то изменение параметров таблицы никак не поможет, ибо из данных колонки все равно будет читаться лишь только один байт.
Сообщение # 7 написано 20.11.2017 в 20:52
Marzed
Скаут
Цитата p620 ()
А Вы вообще в курсе, что поле читается ядром? И если ядро ждет байт, то изменение параметров таблицы никак не поможет, ибо из данных колонки все равно будет читаться лишь только один байт.
Человек задал вопрос - ему ответили и ответ - это та сторона, куда ему надо копать в его проблеме. Если заморочиться, то ядро можно переписать под свои нужды как только угодно
SwiftCore Developer
Сообщение # 8 отредактировано Marzed - Понедельник, 20.11.2017, 21:38
Borisov99
Сержант
Цитата Marzed ()
Человек задал вопрос - ему ответили и ответ

Господи, я же написал ставлю больше не работает, что вы мне со своим навикатом приелись. Вопрос поставлен конкретно. Выше ставлю, но оно не работает. А то, что ты пытаешься мне сказать - это уж я наверняка знаю.
Цитата p620 ()
что поле читается ядром? И е

Прошу подсказать, в какую сторону копать?
Сообщение # 9 написано 21.11.2017 в 19:47
p620
Маршал
Цитата Borisov99 ()
Прошу подсказать, в какую сторону копать?

Когда Вы пытаетесь найти в комплексных программах, вроде TrinityCore, какой-то конкретный момент, не зная изначально, где в исходниках он находится - всегда начинайте распутывать логическую цепочку от интерфейса (т.е. ввода или вывода данных из программы в том или ином виде), а дальше просто следуйте за логикой. В настоящем случае, например, данные собираются программой из БД под управлением MySQL, следовательно, где-то в ядре присутствует соответствующий запрос на выборку этих данных, размещенный в виде обычной строки, в котором упоминается(ются) искомое(ые) поле(я), данные из которого(которых) записываются в некоторую переменную (в случае TrinityCore - в специальный объект результатов запроса). Следовательно, запрос можно найти обычным текстовым поиском по решению (где целью поиска будет название искомого поля или полей), а дальше просто следовать за кодом, который обрабатывает результаты запроса. В Вашем конкретном случае рекомендуется сначала просмотреть все места, в которых фигурируют интересующие Вас данные, а потом уже решаться на замену, а не менять на лету, т.к. может статься, что, например, предстоящий объем работы, выполнение которого требуется для достижения желаемого результата, Вас не устраивает, или же ограничение существует еще где-то в относительно недостижимом месте (например, когда значения отправляются на клиентскую сторону для визуализации).
Сообщение # 10 отредактировано p620 - Среда, 22.11.2017, 05:43
Borisov99
Сержант
Цитата p620 ()
В Вашем конкретном случае рекомендуется сначала просмотреть все места, в которых фигурируют интересующие Вас данные,

Спасибо! попробую! + в реп

https://pastebin.com/xrjGdBgz , ну нашёл часть кода что относится к моему вопросу. А вот как тут убрать ограничение я если честно не знаю как и где можно узнать?
Сообщение # 11 отредактировано Borisov99 - Среда, 22.11.2017, 10:22
p620
Маршал
Цитата Borisov99 ()
https://pastebin.com/xrjGdBgz , ну нашёл часть кода что относится к моему вопросу. А вот как тут убрать ограничение я если честно не знаю

Конкретно здесь - строка 56:

Код
for(int i = 0; i < MAX_STATS; i++)
{
    pLevelInfo->stats [i]= fields[i+3].GetUInt8();
}
/* В цикле перебираются все зарегистрированные характеристики, их порядковым номером индексируется контейнер характеристик `stats`, относящийся к информации о конфигурации параметров для текущего уровня (они перебираются на основании произведенной выборки из базы), которые в дальнейшем будут использоваться для обработки персонажей игроков. `fields` в данной ситуации идентифицирует одну строку результата произошедшей выборки (строки перебираются в родительском цикле). Первые три поля относятся к неинтересующей нас на данном этапе информации (уровень, идентификатор расы и класса), потому мы их пропускаем (`i + 3`), остальные же шесть полей хранят значения характеристик, следующих в таком же порядке, в котором они представлены и в `stats`, а потому одним индексом (`i`) мы можем индексировать сразу оба контейнера (первый - контейнер характеристик `stats`, второй - интерпретация текущей строки результатов выборки из БД). По определению из БД можно прочитать данные любого типа, соответственно нам необходимо обозначить, данные какого типа мы ждем в каждой конкретной ситуации. Здесь для этих целей используется метод `GetSmthng()`, применяемый к конкретному полю, где часть `Smthng` надлежит заменить на одну из предложенных разработчиком мнемоник, обозначающих конкретный тип (чем разработчика не устроили шаблоны - остается загадкой). В данной ситуации вызывается `GetUInt8()`, соответственно, вне зависимости от того, что было прочитано из базы, мы получаем только один байт каждого результата, о чем я уже писал ранее в этой теме. Замените `8` на, например, `16`, и учитываться станут уже два байта. */

После этого, разумеется, потребуется как минимум просмотреть определение `stats`, а также, вероятно, все ссылки на него. При необходимости адаптировать весь код для работы с большей разрядностью хранимых значений. Ну и, само-собой, исправить тип в самой таблице, хранящей значения, на ожидаемый ядром.
Цитата Borisov99 ()
как и где можно узнать?

А вот что до этого - читать книги по IT в целом (и по C++ - в частности), а также документацию к используемым в проектах библиотекам или их исходники.
Сообщение # 12 отредактировано p620 - Среда, 22.11.2017, 13:21
Borisov99
Сержант
Цитата p620 ()
Конкретно здесь - строка 56:

Код
for(int i = 0; i < MAX_STATS; i++)
{
    pLevelInfo->stats [i]= fields[i+3].GetUInt8();
}
свапнул на

Код
for(uint8 i = 0; i < MAX_STATS; i++)
            {
                pLevelInfo->stats [i]= uint32(fields[i+3].GetInt32());
            }

Собралось без ошибок, в бд выставил Float
Он в строке больше 9999 не ставит и стата в итоге не увеличивается. хмм

Добавлено (26.11.2017, 16:22)
---------------------------------------------
up

Сообщение # 13 написано 26.11.2017 в 16:22
p620
Маршал


Цитата Borisov99 ()
Код
for(int i = 0; i < MAX_STATS; i++)
{
    pLevelInfo->stats [i]= fields[i+3].GetUInt8();
}

свапнул на


Код
for(uint8 i = 0; i < MAX_STATS; i++)
            {
                pLevelInfo->stats [i]= uint32(fields[i+3].GetInt32());
            }

1) Тип переменной в цикле менять не было решительно никакого смысла. Если замену `int` -> `unsigned` еще понять можно чисто с семантической точки зрения (aka идентификатор/индекс в данном контексте отрицательным быть не может), то ужимать ее размер до одного байта - вредное излишество. Память Вы не сэкономите, т.к. скорее всего будет иметь место выравнивание, и после Вашего байта на стеке будет лежать еще не менее трех байтов педдинга (в зависимости от платформы, хотя конкретно в данном случае наиболее вероятно, что переменная будет исключительно регистровой и на стек никогда не попадет), повышенная скорость работы от искусственного уменьшения размерности тоже наблюдаться не будет, т.к. скорее всего все шины и регистры тоже работают в Вашем случае минимум с 4 байтами (опять же, зависит от разрядности целевой платформы), однако для выполнения любых арифметических операций, а также операции индексирования, теперь потребуется выполнение расширяющего приведения типов.
2) Старайтесь сохранять когерентность форматирования (т.е. заранее определяйтесь с тем, какое форматирование в каких случаях Вы используете, и следуете далее выбранным правилам везде). Например, у Вас здесь в одном случае квадратные скобки при индексировании разделены с идентификатором пробелом, а в другом (находящемся на той же строчке причем) - нет. Это нехорошо.
3) Хотя разработчики TrinityCore в большинстве случаев клали болты на эту практику, использование приведения типов в C-стиле по ряду объективных причин считается в C++ моветоном. В данном случае подошел бы static_cast. Кроме того, в данной ситуации явное приведение типов является излишним.
4) Выделение отдельного уровня индентации для фигурных скобок в большинстве случаев снижает читабельность кода, т.к. тот с каждым новым вложенным блоком очень сильно "съезжает" вправо.
5) Неужели там нет встроенного метода `GetUint32()`?

Цитата Borisov99 ()
в бд выставил Float

И зачем же Вы это сделали? Float - знаковое значение с плавающей точкой, Вам же здесь четырехбайтовое беззнаковое целое требуется, у них разительно отличные способы представления в памяти.

Цитата Borisov99 ()
Он в строке больше 9999 не ставит и стата в итоге не увеличивается. хмм

По этому поводу Вам придется уточнить, ибо я не понял, что Вы вообще имеете здесь в виду.
Сообщение # 14 отредактировано p620 - Воскресенье, 26.11.2017, 23:05
Borisov99
Сержант
Цитата p620 ()
5) Неужели там нет встроенного метода `GetUint32()`?
Я ставил и этот при компиле ошибку бьет. 
Код
\src\server\game\Globals\ObjectMgr.cpp(3531): error C2039: GetUint32: не является членом "Field"


Код
for(int i = 0; i < MAX_STATS; i++)
{
    pLevelInfo->stats [i]= fields[i+3].GetUint32();
}


Цитата p620 ()
По этому поводу Вам придется уточнить
Разобрался.

Добавлено (08.12.2017, 11:52)
---------------------------------------------
up

Сообщение # 15 отредактировано Borisov99 - Понедельник, 27.11.2017, 17:18
p620
Маршал
Цитата Borisov99 ()
Разобрался.

Цитата Borisov99 ()
up

Если вопрос еще актуален - продолжайте с того места, на котором мы остановились.
Сообщение # 16 написано 08.12.2017 в 18:54
Форум » TrinityCore » [TrinityCore] Help » player_levelstats (Хайпоните:D)
  • Страница 1 из 1
  • 1
Поиск: