Решил обнародовать изменение уровня Nox Quest. Код здесь:
SYS_MEMDATA_BUFFER=nil
function getQuestLevel()
getMemData("5997868","int")
end
function getMemData(address, datatype)
local gamedir=getGameDirectory()
os.execute(gamedir.."\\memeditor\\nox_mem.exe get "..datatype.." "..address.." "..gamedir.."\\memeditor\\buffer.dat")
setTimeout(continueGettingData,90)
end
function continueGettingData()
local gamedir=getGameDirectory()
f = io.open(gamedir.."\\memeditor\\buffer.dat","r")
while true do
line = f.read(f)
if not line then break end
print (line)
end
end
function setIntMemData(address, value)
local gamedir=getGameDirectory()
os.execute(gamedir.."\\memeditor\\nox_mem.exe set int "..address.." "..value)
end
function setQuestLevel(level)
if type(level)~="number" then return end
setIntMemData("5997868",level)
setIntMemData("6945128",level)
end
Инструкция:1. Создайте новый lua файл и скопируйте код туда.
2. Скачайте архив с программой memeditor (8 KB) и распакуйте его в корневую папку Nox.
Убедитесь, что nox_mem.exe лежит в папке memeditor!3. Запустите Unimod. Загрузите ваш файл lua. Для установки левела используйте функцию setQuestLevel(новый уровень в виде числа). Для его чтения: getQuestLevel(). Значение функции будет лежать в SYS_MEMDATA_BUFFER в виде числа - текущего уровня
Примечание:Поскольку в Unimod 0.6 нет работы с памятью напрямую (только через некие юнитконтроллеры), мне пришлось реализовать программу memeditor. Она просто меняет\читает данные из памяти. Существенный недостаток программы: сервер альтабается.
Также я полный нуб в плане кодинга для юнимода и несмотря на то что вышенаписанное работает, я не могу сказать, что код получился удачный. Если кто реализует лучше (а ещё лучше, если это добавят в Unimod) буду только рад.
Дополнительная техническая информация:Уровень Nox Quest определяется двумя DWORD переменными.
Смещение в памяти | Что означает |
0x005B852C | Определяет "следующий" уровень Nox Quest. Он будет увеличен на 1 по достижению выхода и игрока кинет на следующий уровень, после указанного. Пример: Сейчас 10й уровень. Если вы задали уровень 100, то команду, по достижении всеми её игроками выхода, кинет на 101й уровень. Если задали 1000й, то кинет на 1001 и т.п. |
0x0069F968 | Определяет текущий уровень Nox Quest. Если изменить эту переменную, то мобы и обелиски сразу изменят свои показатели здоровья, а также изменится урон по игроку. Проблемы данной переменной:
1. Уже играющим клиентам новый текущий номер уровня не приходит. Придёт только после смены карты или после переприсоединения. То есть, если был уровень 10, а вы сменили на 100, то на сервере будет написано "Level 100", а у клиентов (которые были до момента смены переменной) написано "Level 10". Любой присоединившийся после смены переменной получит правильный уровень. 2. Качество вещей и количество поднимаемого золота не меняется, так как они сгенерированы до смены уровня. |
Несмотря на то, что переменные DWORD типа,
не рекомендую поднимать уровень выше 65535 (переменная отображаемого лвла обнуляется + моя программа поддерживает только INT пределы.) Также не рекомендуется писать разные значения для этих переменных. Меняйте оба места.
Я надеюсь что описал понятно. Если будет найдены ещё переменные\данные, то я опишу их здесь.