NoX World - форум об игре NoX

 
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  
Сейчас онлайн стрима нет!
Сейчас на сервере никого нет!

Обязательно все ознакомьтесь с новыми Правилами Портала!

Актуальные новости:
IP сервера изменён! Новый IP: 45.144.64.229. Сервер также доступен через Westwood Online (XWIS, игру через сервер)


Важные темы:
Как играть по сети? Понятное руководство!
Правила Сервера NoxWorld.
Как помочь форуму финансово?

Автор Тема: Делимся скриптами  (Прочитано 43403 раз)

0 Пользователей и 4 Гостей смотрят эту тему.

2530

  • Гильдия The Pinnacle
  • Старожил
  • *
  • Карма: 79
  • Оффлайн Оффлайн
  • Сообщений: 665
  • Не вижу смысла в Nox 2
  • Awards Победитель конкурса "Угадай Автора Карты" 2015
    • Просмотр профиля
    • Awards
Делимся скриптами
« Ответ #0 : 21/05/2013 16:16:20 »

Решил обнародовать изменение уровня 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 пределы.) Также не рекомендуется писать разные значения для этих переменных. Меняйте оба места.

Я надеюсь что описал понятно. Если будет найдены ещё переменные\данные, то я опишу их здесь.
Записан
Карма рассчитана на индикацию среднего отношения к участнику, а не степень важности человека. Не гонитесь за ней.
Все мои видео и Twitch стримы
Расширенный поиск  
 

Страница сгенерирована за 0.059 секунд. Запросов: 23.