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

Привет фанатам NoX !!! => Картостроение, скриптинг и моддинг => Тема начата: 2530 от 06/05/2012 04:34:00

Название: Делимся скриптами
Отправлено: 2530 от 06/05/2012 04:34:00
Предлагаю выкладывать готовые (и рабочие, естественно :) )скрипты для Unimod'а и редактора карт, а также инструкцию по их эксплуатации здесь.

Начнём. Вот мой скрипт "записи игры". Сейчас он основан на записи скринов через определённый интервал в кадрах:

isRecording=false

function Rec()
isRecording=true
print('Запись началась')
RecEngine()
end
function RecEngine()
if isRecording == true then conExec('image');setTimeout(RecEngine,4) end
end
function StopRec()
isRecording=false
print('Запись остановлена')
end

На работу этого скрипта можно посмотреть, просмотрев ролик: http://www.youtube.com/watch?v=Sed315tMbgo (http://www.youtube.com/watch?v=Sed315tMbgo)

Разъясню функции:
Rec() запускает процесс записи. StopRec(), соответственно, останавливает.
RecEngine() - движок "съёмщика". В нём всего одна строка. В ней Вы можете настраивать плавность съёмки скринов:
setTimeout(RecEngine,4)Изменяйте выделенное число, чтобы увеличить или уменьшить плавность съёмки. Помните, что чем меньше это число, тем выше нагрузка на Ваш компьютер. Рекомендуемые пределы: 3-5 кадров. Если Вы выберите меньше 3х, то пойдёт бесполезная нагрузка на компьютер (да и места на Вашем HDD понадобится намного больше), а если выберите больше 5, то пропадёт плавность движения.
У меня на компьютере при съёмке данным скриптом FPS Nox'а прыгал на уровне 20. На задержке 5 - на уровне 30-35 FPS. Всё зависит от мощности Вашего компьютера.

P.S>Помните, что данный скрипт звуки не записывает! :) А это значит, что звук пока нужно записывать отдельным файлом.
Название: Делимся скриптами
Отправлено: Norten от 06/05/2012 16:46:31
Или озвучивать с прищепкой на носу  :)

Классная тема, спасибо, Герман!
Название: Делимся скриптами
Отправлено: TheSim от 12/05/2012 23:53:18
Кстати мне в голову пришла идеязаставить сервак скринить последний фраг на форум. Требуется небольшой скрипт на форуме, код для Post-отправки файла кажись внутри Unimod-а уже есть, если нет - могу добавить.
Название: Делимся скриптами
Отправлено: Evengard от 13/05/2012 02:07:45
На серваке отключена графическая часть (флаг serveronly), забыл?
Название: Делимся скриптами
Отправлено: 2530 от 14/05/2012 14:02:27
Для удобства тестирования новых текстур и скриптов связаных с FPS, перемещением NPC и прочего, я написал скрипт, который назвал "DebugMode".
Что же делает этот DebugMode? Если в консоли ввести setDebugMode(), то произойдёт следующее:
1. Включится показ экстентов;
2. Включится показ областей взаимодействия и путей перемещения NPC (команда show ai)
3. Включится показ FPS, Ping'а, информации о тайминге, информации о количестве рисуемых объектов на экране, количество отправляемых\принимаемых байт, номер кадра с момента старта сервера и прочая информация.
4. (Самое интересное) Включится FPS ограничитель на 30 FPS.
Функция unsetDebugMode() выключает этот кошмар и возвращает всё как было :)


Быстродействие:
Первое включение скрипта: 5-60 сек.
Последующие включения скрипта: 5-25 сек.
Выключение скрипта: менее 1 сек.


Системная информация:
setDebugMode() возвращает 0 (если режим уже запущен) или 1 (если режим запущен успешно)
unsetDebugMode() возвращает 0 (если режим уже выключен) или 1 (если режим выключен успешно)
Для выполнения требуется команда racoiaws!!!
P.S>Надо быть честным со всеми, поэтому распишу код, который будет наиболее полезным:
Команда "show extents" - включает показ экстентов
Команда "show ai" - включает показ ai
Команда "show gui" - включает\отключает игровую панель
Команда "show perfmon" - включает показ Debug информации.
Команда "set frameratelimiter" - включает ограничитель FPS. "unset frameratelimiter" - выключает его. Требуется много времени при 1м включении лимита. Последующие включения проходят намного быстрее

P.P.S>И закончу переделанной фразой Рексара из игры, название которой произносить здесь опасно для жизни :) :
Цитата: 2530
"Команды написал я, но за последствия, которые возникли после их использования, отвечаете Вы..."

UPD>Простите, забыл сказать. Скрипт был написан с учётом того, что у Вас есть флаг -nolimit на EXE'шнике!
Название: Делимся скриптами
Отправлено: Evengard от 14/05/2012 17:45:25
Спс что напомнил. Пора заканчивать эту лафу с нолимитом
Название: Делимся скриптами
Отправлено: Squall от 14/05/2012 18:12:45
Извините, товарищи, лафа лафой, только ничего, что моя ноутбучная система при всей свой крутизне выдает 20 фпс без нолимита? Я слайд-шоу смотреть не хочу. И не сказал бы, что жалкие 50 кадров, это то, что следует ограничивать. Тем более, что бытует у геймеров мнение, что в файтинги, шутеры и иные динамичные игры комфортней всего играть с фпс = 60. Другое дело, когда фпс под двести... Предлагаю тогда хоть повысить планку ограничителя до адекватного числа, если собираетесь запиливать его на сервер.
Название: Делимся скриптами
Отправлено: 2530 от 14/05/2012 18:29:45
Squall, параметр FPS лимитера можно настроить только переписав экзекушник. Я не встречал этот параметр в бинах или где-то ещё.
Evengard, собираешься вешать скрипт на onPlayerJoin? Имхо, тогда на него многие не зайдут (подумают, что зависли)
Название: Делимся скриптами
Отправлено: Evengard от 15/05/2012 07:50:31
Если ьы фпс были просто фпсом, я б мож ничего и не говорил. Но в Ноксе на ФПС завязана вся работа игры. 1 фпс Нокса - один проход цикла обработки. А это всё - и обработка пакетов, и нажатий на кнопки, и отсылка, и отрисовка.

Другое дело что оч странно что ограничитель занижает до 20. Должен поидее до 30... Надо будет поискать на досуге что ьпм да как.
Название: Делимся скриптами
Отправлено: TheSim от 17/05/2012 20:04:49
На серваке отключена графическая часть (флаг serveronly), забыл?
Пичаль!
Название: Делимся скриптами
Отправлено: Dio от 07/06/2012 07:58:42
В принципе можно выпилить флаг -nolimit из нокс нафиг, будет не сложно. А например на сервак нельзя будет зайти если версия < какой то)
Там нет такого определенного FPS лимитера как параметра. Нашел место где считается время и запускается следующая обработка, но разобраться с ней не смог.
Название: Делимся скриптами
Отправлено: Lаrboss от 07/06/2012 12:42:39
Ты хочешь сделать FPS лимитер? Пощади нас, продвинутых геймеров!
Название: Делимся скриптами
Отправлено: Evengard от 07/06/2012 15:06:44
Да, хочу.
Название: Делимся скриптами
Отправлено: Lаrboss от 07/06/2012 18:32:08
Никогда не пробовал играть в какуюнить игру с фпс 25-30? =)
Название: Делимся скриптами
Отправлено: Evengard от 07/06/2012 19:58:04
Я только на таких ФПСах и играю. А то и ниже. В т.ч. в Нокс.

А почему это столь критично для Нокса я уже объяснял.
Название: Делимся скриптами
Отправлено: Katarsis от 07/06/2012 21:21:59
Evengard, а идеи завышать всем пинг вплоть до некоей цифры (скажем, 120) не возникало? Предпосылки-то, по сути, те же самые...
Название: Делимся скриптами
Отправлено: Evengard от 07/06/2012 21:38:19
Мощности компов хватит не всем. Вот, например даже мне. Встроенная видюха - унылая штука...
Название: Делимся скриптами
Отправлено: Katarsis от 07/06/2012 22:41:15
Так с интернетом дела и того хуже :O
Название: Делимся скриптами
Отправлено: Perfect от 07/06/2012 23:12:26
Ребят, вы не туда пишете...

unseen: да и твоё сообщение не по теме.
Название: Делимся скриптами
Отправлено: 2530 от 22/04/2013 12:51:30
Тема уже давно не обновлялась, поэтому пора добавить пару скриптов для Unimod сюда:
1. Запись ника хоста. Ник можно будет получить через hostname. (вызов функции должен быть прописан в Autoexec.rul или в функции onFirstFrame() в autoexec.lua!!!)
hostname=nil
function getHost()
local pl = playerList()
hostname=playerInfo(pl[1]).name
end
2. Улучшенное создание объекта. Теперь если вы укажете ник игрока (nick), то предмет (x) будет создан в координатах его мыши. Также вы можете получить последний созданный объект через переменную lastCreatedObj
--Create Object At Player's Mouse
lastCreatedObj=nil
function cr(x,nick)
 if nick==nil then nick=hostname end
 local r
 r=createObject(x,playerMouse(playerGetByName(nick)))
 if r==nil then print('ERROR>Unable to create object "'..x..'" at '..nick..'\'s mouse. Invalid object.') else lastCreatedObj=r end
 return r
end
--
3. Скрипт, который я называю: "Как заставить камень\Урчина\Гекубу\Некроманта\Игрока "CrazyBrony"\Кого_угодно заговорить?".
function sayobj(text,obj)
if obj==nil then obj=playerGetByName(hostname) end
createBubble(obj,text)
end
В качестве аргументов передаётся текст (text) и объект-userdata (obj). Пример работы во вложении.

Здесь не используется слишком много хитрых функций. Только то, что заложено разработчиками Unimod 0.6 pre-beta.
В 1м коде достаётся 1 игрок из игровой таблицы и значение параметра name заносится в hostname переменную.

2я функция не намного сложнее. Здесь изменён источник с me на функцию возврата игрока(playerGetByName(nick)). Если код не сработал и в консоли появилось "Not found", значит игрока с заданным ником нет на сервере. Если ник не указан, то будет взят игрок-хост(см. 1й код)

3я функция это почти то же самое, что и просто createBubble, но в этой функции предотвращена передача пустого значения nil (вместо nil будет передан игрок-хост (см. 1й код)) Если как объект будет передан игрок, то над ним появится облако подобное сообщению в чате, но регистрации в логе консоли не будет, как в команде say.

Цитата: 2530
Скрипты сделал я, но за последствия, возникшие в ходе их использования, отвечаете Вы...
Название: Делимся скриптами
Отправлено: Evengard от 22/04/2013 13:43:20
Вообще ник хоста можно получить всегда (без необходимости onFirstFrame) при помощи playerInfo(playerGetById(31)).name
ID хоста всегда 31, нумерация всех остальных с нуля, по очереди кто заходит.
Название: Делимся скриптами
Отправлено: 2530 от 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 пределы.) Также не рекомендуется писать разные значения для этих переменных. Меняйте оба места.

Я надеюсь что описал понятно. Если будет найдены ещё переменные\данные, то я опишу их здесь.
Название: Делимся скриптами
Отправлено: Evengard от 22/05/2013 10:22:44
Вообще-то есть функции правки памяти в UniMod-е, но они отсутствуют намерено, чтобы такие изменения вносить непосредственно в сорцы ЮниМода - в основной репозиторий. Рекомендую обновить сам ЮниМод в этой связи скорее.
Попробую запилить в ЮниМод на досуге если кому-то это интересно.
Название: Делимся скриптами
Отправлено: 2530 от 28/05/2013 04:55:04
Работая с lua, я столкнулся с проблемой получения строки. Алгоритм непривычный, если сравнивать с VB. Поэтому я написал свои функции получения подстрок. Думаю, это может пригодится кому-нибудь.
Получение правой части строки:
function string.right(str,len)
return string.sub(str,#str+1 - len)
end
Инструкция:
string.right принимает 2 значения как в старом добром VB: строку и длину.

Получение левой части строки:
function string.left(str,len)
return string.sub(str,0,len)
end
Инструкция:
string.left также принимает 2 значения: строку и длину

Получение подстроки.
function string.mid(str,pos,len)
return string.sub(str,pos,pos+len-1)
end
Инструкция:
string.mid возвращает подстроку подобно string.sub, но запрашивает вместо индекса последнего индекса длину строки (подобно string.Substring в C# или Mid в VB). Иными словами:

string.mid("INTEGER",2,4) = string.sub("INTEGER",2,5) = "NTEG"
Название: Делимся скриптами
Отправлено: Evengard от 28/05/2013 09:24:57
string.sub аналогичен substr во многих ЯП (C/C++, PHP), честно говоря особо не переучивал бы людей. Впрочем, может кому и пригодится.
Название: Делимся скриптами
Отправлено: 2530 от 28/05/2013 11:31:23
Я не переучиваю. Мой код - решение проблемы для тех, кто не может приспособиться к стандартному string.sub
Название: Делимся скриптами
Отправлено: 2530 от 19/06/2014 18:04:41
Давненько я не пополнял эту тему. Надо исправить.

Мгновенное закрытие Nox'а (как если бы завершили процесс в диспетчере задач).
Код: (lua) [Выделить]
function close()
os.exit();
end

Узнать сколько времени ты играешь в Nox:
function NoxExecTime()
return os.clock()
end

Определение здоровья юнита в Unimod сейчас работает неправильно. Если вы запросите хп мага, то вполне можете получить 212341, вместо желаемых 75.

Данная обёртка это фиксит:
Код: (lua) [Выделить]
function getUnitHP(unit)
if unit==nil then return nil end
local fhp=unitHP(unit)
while (fhp - 65536)>=0 do
fhp=fhp - 65536
end
return fhp
end
Название: Делимся скриптами
Отправлено: Perfect от 19/06/2014 20:38:39
Название: Делимся скриптами
Отправлено: Dio от 19/06/2014 21:08:20
os.clock()
Returns an approximation of the amount in seconds of CPU time used by the program.

С lua.org. Фактически это не время, которое запущен Nox.
Название: Делимся скриптами
Отправлено: 2530 от 19/06/2014 21:48:42
Насколько я помню, время с момента хоста. Во всяком случае давно тестировал - совпадало.

Perfect, у тебя есть решение получше? Может опишешь, а не спойлерами кидаться будешь.
Название: Делимся скриптами
Отправлено: KirConjurer от 20/06/2014 08:09:52
function unitGetHPSafe(unit)
  local hd = getPtrPtr(unit, 0x22C) -- Health Data
  if not hd then return 0 end
  return getPtrShort(hd, 0)
end
Кстати, почти любой неразрушаемый юнит можно сделать разрушаемым
function unitNewHData(unit, hp)
  local hd = memAlloc(0x14)
  setPtrPtr(unit, 0x22C, hd)
  setPtrShort(hd, 0, hp) -- current hp
  setPtrShort(hd, 2, hp) -- prev hit hp
  setPtrShort(hd, 4, hp) -- max hp
  return true
end
 
Название: Делимся скриптами
Отправлено: Evengard от 20/06/2014 22:43:46
os.clock()

Не время это ни фига. А "сколько времени CPU обрабатывал ТОЛЬКО Нокс". Сложно объяснить. Процессор же ведь постоянно переключается между задачами (мультизадачность так и делается ж ведь) и эта функция показывает, сколько процессор уделил времени Ноксу.
Название: Делимся скриптами
Отправлено: Lаrboss от 21/06/2014 16:19:28
Цитировать
Фактически это не время, которое запущен Nox.
Конечно. Это процессорное время, уделенное Nox"у
Название: Делимся скриптами
Отправлено: Evengard от 21/06/2014 18:54:47
Я-то знаю. Пытаюсь объяснить, что такое "процессорное время".)
Название: Делимся скриптами
Отправлено: Lаrboss от 22/06/2014 07:48:36
Да, вроде, ничего сложного. 1 секунда 100% - ой загрузки 1 - го CPU = 1 секунда процессорного времени. 1 секунда 50% - ой загрузки 1 - го CPU = 0.5 секунды процессорного времени и тд.
Название: Делимся скриптами
Отправлено: 2530 от 06/11/2014 10:25:21
Надо подновить чутка тему. А то сильно увлёкся исследованиями, что этот тред совсем вылетел из головы.
Сегодня я выложу часть скриптов, используемые на моём сервере по сей день. В них вы не найдёте чего-то принципиально нового - эти функции просто удобные обёртки под Unimod функционал.

1. Мгновенное убийство игрока (даже под неуязвимостью бесконечной длительности). Функция "перегружена": если передано число, то будет убит игрок по индексу из таблицы игроков; иначе будет убит игрок по нику.
Код: (Lua) [Выделить]
function kill(nick)
local obj
local msg
if type(nick)=="number" then
obj=playerList()[nick]
else
obj=playerGetByName(nick)
end
buffApply(obj,16,1)
sendChat(32,'Slayed player '..playerInfo(obj).name,1,1)
end
2. Телепортация игрока в координаты. На вход функции подаётся 3 параметра: ник игрока, координата X, координата Y.
Код: (Lua) [Выделить]
function teleportToCoor(obj,x,y)
unitMove(playerGetByName(obj),x,y)
sendChat(32,'Player '..obj..' was teleported to ('..x..';'..y..')',1,1)
end
3. Телепортация игрока в точку его курсора. На вход подаётся ник этого игрока.
Код: (Lua) [Выделить]
function teleportToCur(obj)
x,y=playerMouse(playerGetByName(obj))
unitMove(playerGetByName(obj),x,y)
sendChat(32,'[SERVER]Player '..obj..' was teleported to ('..x..';'..y..')',1,1)
end
4. Телепортация игрока к игроку. На вход передаётся 2 строки: кого телепортировать и к кому телепортировать.
Код: (Lua) [Выделить]
function teleportToPlayer(pl1,target)
local x,y=unitPos(playerGetByName(target))
unitMove(playerGetByName(pl1),x,y)
sendChat(32,'[SERVER]Player '..pl1..' was teleported to player '..target,1,1)
end
5. Дать игроку предмет в инвентарь. На вход подаётся 2 строки: что дать(имя из thing.bin) и кому дать (ник).
Код: (Lua) [Выделить]
function give(obj, nick)
if nick==nil then nick=hostname end
if nick==nil then return 0 end
x=createObjectIn(obj,playerGetByName(nick))
print('Object "'..obj..'" now in '..nick.."'s inventory!")
return x
end

Мои скрипты становятся всё больше и мне всё труднее находить что-то более-менее завершенное и готовое к размещению. В данный момент я работаю над большой таблицей - она должна стать частью большой документации по Unimod (ибо нормальной документации по прежнему нет). Из запланированного пока есть только спецэффекты. Так что тема не будет пополняться в ближайшие месяца два как минимум.
А вообще, мне интересно, помогло ли кому-нибудь когда-нибудь то, что здесь выложено?
Название: Делимся скриптами
Отправлено: 2530 от 07/11/2014 13:24:12
Фикс для получения здоровья (выглядит криво, но работает):
Код: (Lua) [Выделить]
SYS_unitHP=unitHP
function unitHP(unit, amount)
if(amount==nil) then
local hpdata = getPtrPtr(unit, 0x22C)
if not hpdata then return nil end
return getPtrShort(hpdata, 0)
else
SYS_unitHP(unit,amount)
end
end
Внимание! Вызывать фикс нужно только один раз. Чтобы не вызвать наверняка, положите функцию в onFirstFrame.
По хорошему надо уже библиотеку фиксить.
Название: Делимся скриптами
Отправлено: Evengard от 07/11/2014 18:32:48
Кто тебе мешает сделать это? :) Сорцы юнимода открыты.
Название: Делимся скриптами
Отправлено: 2530 от 08/11/2014 01:29:24
Отсутствие комментариев и скачиваемости моих поделок. Это просто будет бесполезная трата времени.
Название: Делимся скриптами
Отправлено: Dio от 08/11/2014 11:18:48
Если ты сделаешь вещь, которой реально можно будет пользоваться, то тут можно будет найти пару человек, которых она заинтересует.
Ты не хочешь тратить время на фикс библиотеки, а кто-то не хочет смотреть кусочки кода для глючного мода. Кажется, круг замкнулся.
Можешь не фиксить, а переписать, там в бранче UniMod2 лежит.... Остановился на создании юнитов.
Название: Делимся скриптами
Отправлено: det от 18/06/2015 19:33:46
Здравствуйте.
Я снова поставил нокс, дабы пройти кампанию спустя много лет, еще раз.
Но на это траз мне хочется поиграться с конфигами, с этим проблем нет, все необходимое я нашел. Только редактор карт вылетает.
Юнимод установил (правда он не запускается через NoxPatched_UniMod.exe, только через NoCD_U.exe), но как использовать эти функции в кампании?
В autoexec.lua я добавил функцию добавления предмета в инвентарь, хотел добавить посох ярости сразу или что нибудь еще, но не знаю как вызывать эту функцию.
Название: Делимся скриптами
Отправлено: 2530 от 18/06/2015 22:14:25
Открываете консоль и в ней пишете:
give('oblivionorb','Jack')
(вместо Jack впишите имя вашего персонажа).
Далее жмёте Enter и получаете Посох Забвения к себе в карман.
Название: Делимся скриптами
Отправлено: det от 18/06/2015 22:44:00
Спасибо большое за такой быстрый ответ, я даже успел найти это же решение на другом источнике.
К сожалению ваш вариант мне не подошел, потому что умолчательное имя персонажа я оставил на русском, а в игре переключиться или скопипайстить русского "Джек" мне не удалось.


Другой вариант выглядит так.
В начале функцией в консоли игры
setMe()
x,y=playerMouse(me)
получаем координаты, а потом
createObject("OblivionOrb",x,y)
Эти три строчки я внес в пустой текстовый файл с расширением .lua а в игре просто выполняю
dofile('ИМЯ_ФАЙЛА.lua')
Вот список id (http://nox.wikia.com/wiki/Special:Categories) обьектов что мне удалось найти пока что.
А вот список id именно предметов (http://nox.wikia.com/wiki/Category:Items) .

Подскажите пожалуйста по еще нескольким вопросам:
1. Каким образом можно уменьшить затратность маны именно заклинанием молнии?
Потому что в конфигаг я находил только кол-во маны для обычных заклинаний.
2. Хотелось бы реализовать быстрое автоматическое восполнение маны, может луа скриптом? Но я не умею писать на нем к сожалению.
3. Можно ли сделать Посох молний самозаряжающимся?
4. Где можно найти наиболее полный список id предметов?
5. Как можно суммонить себе spellbooks, книги с заклинаниями? Потому что функция crSpell(spellN) конечно создает книги, например crSpell(SPELL_MAGIC_MISSILE), но игра говорит что я не могу ее использовать (при этом 2 уровня уже есть). Оказывается spellN означает номер, по этому книги не читабельны вообще. Но я не знаю где найти номера этих id получается.
Я сейчас подбором выписываю все заклинания, и отпишусь по результату.
Название: Делимся скриптами
Отправлено: 2530 от 19/06/2015 00:06:34
Раскладка переключается через Scroll lock.
Название: Делимся скриптами
Отправлено: det от 19/06/2015 00:13:08
Странно, у меня раскладка не переключается через скроллок.
На радостях возможности альттабится благодаря sdl фиксу из юнимода, я сделал для вас, товарищи, список всех книг заклятий что выдолбил из клавиатуры:

Появляются они у курсора, командой
Цитировать
crSpell(НОМЕР)

НЕ все цифры создают рабочую книгу, ниже список работающих, и приводящих к вылету из игры.



Остановился на 144, для воина способности видимо получаются по другому, как найду как - отпишусь.

На этом список закончился. Если нужно - переведу на англ и размещу в соответствующей теме.


Помогите мне пожалуйста с вопросами что я описал выше (кто может), уж очень хочется пройти одну из любимых игр с интересом "по-своему" ))
Название: Делимся скриптами
Отправлено: TheSim от 19/06/2015 14:56:13
Воинская книжка - другой предмет кажись
Название: Делимся скриптами
Отправлено: 2530 от 19/06/2015 16:06:20
Да уж. Сюда никто не глянул: http://forum.noxworld.ru/modding/kooto-o-mo/?message=121340.
Специально сделал, дабы сил не тратил лишних.
Название: Делимся скриптами
Отправлено: det от 19/06/2015 18:27:40
Увы, не нашел, плохо искал )
Зато теперь список отсортирован)
К стати мне не удалось найти id оружия для мага, которое зачаровано, например "посох полний перезарядки", обычный я спавнить могу, а вот перезарядки как то не нашел.

А вот где бы можно найти список функций по юнимоду, что бы написать функцию для постоянного контроля кол-ва маны, для ускорения ее восстановления, методом итерации, да любым способом. Нужны функции для работы с маной и жизнями, для управления ими, а код на луа я написать смогу, несмотря на то, что только начал осваивать этот язык. Примеров найду и адаптирую функцию, нужны только верные переменные, или функции, что бы подсмотреть методику.

То же с жизнями, что бы они восстанавливались оперативно, но при получении урона - реген прекращался, на некоторое время после получения урона, а потом восстанавливал постепенно.
Название: Делимся скриптами
Отправлено: TheSim от 24/06/2015 17:46:31
было получение и задание хитов юнита, unitHP(newValue)
https://github.com/Evengard/UniMod/blob/master/unit2.cpp
про ману - кажись нет, но тривиально написать
Название: Делимся скриптами
Отправлено: det от 24/06/2015 21:29:36
Спасибо, правда я надеялся это сделать возможностями юнимода, через lua, а с C++ я не знаком, увы)
Как альтернатива я смог вычислить значения в памяти через cheat engine, там на луа скрипт написать уже можно.
И естественно задать нужные параметры для скорости восстановления, модификаторы и пр.
Да и удобно, что можно воспользоваться встроенным генератором уже трейнера экзешника, своего, без вирей.
Название: Делимся скриптами
Отправлено: TheSim от 25/06/2015 16:51:13
А какой адрес для регена маны? его ж можно в сишник вписать и через юнимод вывести
Название: Делимся скриптами
Отправлено: Vteobitov от 08/09/2015 10:54:33
У меня на компьютере при съёмке данным скриптом FPS Nox'а прыгал на   уровне 20. На задержке 5 - на уровне 30-35 FPS. Всё зависит от мощности   Вашего компьютера.
Название: Делимся скриптами
Отправлено: 2530 от 08/09/2015 11:24:12
В принципе так оно и есть. Зависит от 2 вещей:
1. Скорость записи на диск
2. Скорость реагирования Nox'а на команду.

Можно попробовать поэкспериментировать с FPS лимитером...
Название: Делимся скриптами
Отправлено: det от 25/09/2016 22:39:49
А действительно, как можно соорудить реген маны?
Мне не доступно накодить это в С, но я массу уже наковырял через NXModSuite правя игровые файлы *.bin и играясь со спавном разных предметов с любыми параметрами, но вот регем маны пока не приобрел.

Я заметил, что чем выше макс ману ставлю в gamedata.bin, например 4000, тем быстрее она восстанавливается.
Но хочется поиграть с оригинальным колвом 170, но что бы был скрипт который ее регенит.

Как вот например мне скинул один хороший человек. Он мне сказал что без его версии юнимода работать не будет ибо нету AddMana.
У кого есть юнимод в котором это будет работать?
Или может весь нокс? Сбросьте пожалуйста.

local uc = getPtrPtr(owner, 0x2EC)
    local plrAction = getPtrByte(uc, 0x58)
    -- Если игрок не двигается, каждый третий фрейм добавляем единицу маны
    if (plrAction == 13 or plrAction == 10) then
        if (math.mod(getFrameCounter(), 3) == 2) then
            playerAddMana(owner, 1)
        end
    end
Название: Делимся скриптами
Отправлено: Perfect от 26/09/2016 11:09:21
В скрипте учтены действия эмоций (смех, точка, насмешка)?
Название: Делимся скриптами
Отправлено: det от 26/09/2016 20:19:55
Не думаю, в идеале хотелось бы просто регенить ману практически сразу после затраты, и регулировать таймаут и скорость ее итерации(регена).
Вот и спрашиваю что может понадобится что бы это реализовать, конечно для меня это трудновато пока, но если ни у кого нет готового решения, то прийдется делать самому, но пока не знаю как.
Название: Делимся скриптами
Отправлено: Lаrboss от 29/09/2016 01:36:07
Не думаю, в идеале хотелось бы просто регенить ману практически сразу после затраты, и регулировать таймаут и скорость ее итерации(регена).
Каким-нить cheat engine отмониторь ману на модификацию, и сделай ассемблеровскую вставку... решение готовое уже есть в сети.

Цель у тебя какая: написать свой скрипт на юнимоде или цель получить бесконечную ману?
Название: Делимся скриптами
Отправлено: det от 29/09/2016 20:20:52
Да, задача больше написать рабочий скрипт на юнимоде, что бы рабочий вариант, который можно расшарить для всех.
Если конкретнее, то нужно что бы мана регенелась так же как возле кристалла маны (но медленнее медленнее). Только без кристаллов)