|
|
Модератор форума: Dimitro |
Форум TrinityCore [TrinityCore] Help player_levelstats (Хайпоните:D) |
player_levelstats |
Всем привет) Вопрос по существу:
как дать разрешение ядру на таблицу player_levelstats возможность выставлять значение больше 255, меньше работает, а ставишь больше ничего не работает, думал что-то наподобие статов, но что-то ничего не нашел в исходах, буду благодарен + в репу
Сообщение # 1 написано 16.11.2017 в 13:15
|
В навикате изменить. Каждая колонка в таб имеет свой тип. Например: столбец ID - тип integer(целочисленный), text -тип char(символьный), float - с плавающей точкой и тд и тп. Следовательно Вам нужно изменить тип колонки в навикате.
SwiftCore Developer
|
Сообщение # 7 написано 20.11.2017 в 20:52
|
Человек задал вопрос - ему ответили и ответ - это та сторона, куда ему надо копать в его проблеме. Если заморочиться, то ядро можно переписать под свои нужды как только угодно
SwiftCore Developer
|
Господи, я же написал ставлю больше не работает, что вы мне со своим навикатом приелись. Вопрос поставлен конкретно. Выше ставлю, но оно не работает. А то, что ты пытаешься мне сказать - это уж я наверняка знаю. Прошу подсказать, в какую сторону копать?
Сообщение # 9 написано 21.11.2017 в 19:47
|
Когда Вы пытаетесь найти в комплексных программах, вроде TrinityCore, какой-то конкретный момент, не зная изначально, где в исходниках он находится - всегда начинайте распутывать логическую цепочку от интерфейса (т.е. ввода или вывода данных из программы в том или ином виде), а дальше просто следуйте за логикой. В настоящем случае, например, данные собираются программой из БД под управлением MySQL, следовательно, где-то в ядре присутствует соответствующий запрос на выборку этих данных, размещенный в виде обычной строки, в котором упоминается(ются) искомое(ые) поле(я), данные из которого(которых) записываются в некоторую переменную (в случае TrinityCore - в специальный объект результатов запроса). Следовательно, запрос можно найти обычным текстовым поиском по решению (где целью поиска будет название искомого поля или полей), а дальше просто следовать за кодом, который обрабатывает результаты запроса. В Вашем конкретном случае рекомендуется сначала просмотреть все места, в которых фигурируют интересующие Вас данные, а потом уже решаться на замену, а не менять на лету, т.к. может статься, что, например, предстоящий объем работы, выполнение которого требуется для достижения желаемого результата, Вас не устраивает, или же ограничение существует еще где-то в относительно недостижимом месте (например, когда значения отправляются на клиентскую сторону для визуализации). |
В Вашем конкретном случае рекомендуется сначала просмотреть все места, в которых фигурируют интересующие Вас данные, Спасибо! попробую! + в реп https://pastebin.com/xrjGdBgz , ну нашёл часть кода что относится к моему вопросу. А вот как тут убрать ограничение я если честно не знаю как и где можно узнать? |
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`, а также, вероятно, все ссылки на него. При необходимости адаптировать весь код для работы с большей разрядностью хранимых значений. Ну и, само-собой, исправить тип в самой таблице, хранящей значения, на ожидаемый ядром. А вот что до этого - читать книги по IT в целом (и по C++ - в частности), а также документацию к используемым в проектах библиотекам или их исходники. |
Код 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)
Сообщение # 13 написано 26.11.2017 в 16:22
|
Код 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()`? И зачем же Вы это сделали? Float - знаковое значение с плавающей точкой, Вам же здесь четырехбайтовое беззнаковое целое требуется, у них разительно отличные способы представления в памяти. По этому поводу Вам придется уточнить, ибо я не понял, что Вы вообще имеете здесь в виду. |
Я ставил и этот при компиле ошибку бьет.
Код \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(); } Разобрался. Добавлено (08.12.2017, 11:52) |
| |||
| |||