Перейти к содержанию

Три простых вопроса по Lua скриптам


Razi

Рекомендуемые сообщения

1) Как в нижеприведенный скрипт добавить условие что если адрес 00A3F3E5 равен 2, то делать заморозку адреса по названию? (адреса по 1 байту)
Lua скрипт по заморозке по названию:

Скрытый текст

[ENABLE]
{$LUA}
addresslist = getAddressList()
description1= [[control]]
memoryrec1 = addresslist_getMemoryRecordByDescription(addresslist, description1)
memoryrecord_freeze(memoryrec1)

[DISABLE]
{$LUA}
memoryrecord_unfreeze(memoryrec1)

 

 

 

2) Как сделать чтобы нижеприведенный скрипт работал при условии, что когда адрес 00A3F3E5 равен 2 происходит заморозка адреса 00A444E8 ? (адреса по 1 байту)

Lua скрипт по заморозке, но скрипт не работает почему-то:

Скрытый текст

[ENABLE]
{$LUA}
FreezingConditions = readInteger('00A3F3E5')
if (FreezingConditions == 2) then
memoryrecord_freeze('00A444E8')
end

[DISABLE]
{$LUA}

 

 

 

3) Как в нижеприведенный скрипт еще добавить , что если другой адрес 00A444E8 равен значению 88, то изменять значение в этом адресе на 72. И если этот же адрес 00A444E8 равен значению 24, то изменять значение в этом адресе на 8 ? (адреса по 1 байту, кроме 00A9D874 - 4 байта)

Скрытый текст

[ENABLE]
{$LUA}
PlaySound(findTableFile([[Activate]]))
timer = createTimer(true)
timer:setInterval(100)
timer.OnTimer = function()
value = readInteger('00A9D874')
if (value == 600000) then
writeInteger('00A9D874',10000)
end
end
[DISABLE]
{$LUA}
PlaySound(findTableFile([[Deactivate]]))
timer:setEnabled(false)

 

 

Ссылка на комментарий
Поделиться на другие сайты

1. Как я понял control - это название адреса, который нужно заморозить.

Тогда нужно добавить таймер (из 3 скрипта) для проверки условия (условие правильно написано во 2 скрипте), т.е. так:

Скрытый текст

[ENABLE]
{$LUA}
addresslist = getAddressList()
description1= [[control]]
memoryrec1 = addresslist_getMemoryRecordByDescription(addresslist, description1)
timer = createTimer(true)
timer:setInterval(100)
timer.OnTimer = function()
FreezingConditions = readInteger('00A3F3E5')
if (FreezingConditions == 2) then
memoryrecord_freeze(memoryrec1)
else
if (FreezingConditions ~= 2) then
memoryrecord_unfreeze(memoryrec1)  
end
end
end

{$ASM}

[DISABLE]
{$LUA}
memoryrecord_unfreeze(memoryrec1)
timer:setEnabled(false)

 

Проверь скрипт. (Возможно, что нужно будет добавить ещё один end. Мне к сожалению скрипт проверить не на чем.)  

PS: Ниже в видео проверил работу скрипта - скрипт работает. Действительно нужно было добавить один end. (Скрипт поправил здесь же.)

 

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

И как оказалось при проверке memoryrecord_freeze работает только с записью в таблице (а не с конкретным статичным или с указателями адресом), т.е. может заморозить адрес (или скрипт) по названию, ID или Index записи. 

 

На 3. вопрос пусть ещё кто-нибудь ответит.

Изменено пользователем Garik66
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Ты увидел то, чего не было. Подкалывать человека который помогает, не в моем стиле и это не логично с моей стороны, было бы.

По скриптам, к сожалению не работают предложенные варианты. Возможно дело в том, что адреса по одному байту, а команды в скрипте действуют как на 4-байтные адреса. И в 4-байтном адресе то, будет совсем другое число, а не 2 например, как в адресе 00A3F3E5.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Razi сказал:

Возможно дело в том, что адреса по одному байту

Когда смотрел твои скрипты, мне показалось, что под все адреса отводятся 4 байта.

Но на всякий случай тот же скрипт под одно-байтовый адрес.

Скрытый текст

[ENABLE]
{$LUA}
addresslist = getAddressList()
description1= [[control]]
memoryrec1 = addresslist_getMemoryRecordByDescription(addresslist, description1)
timer = createTimer(true)
timer:setInterval(100)
timer.OnTimer = function()
FreezingConditions = readBytes('00A3F3E5',1)
if (FreezingConditions == 2) then
memoryrecord_freeze(memoryrec1)
else
if (FreezingConditions ~= 2) then
memoryrecord_unfreeze(memoryrec1)  
end
end
end

{$ASM}

[DISABLE]
{$LUA}
memoryrecord_unfreeze(memoryrec1)
timer:setEnabled(false)

 

где readBytes('00A3F3E5',1) - readBytes - читать по адресу '00A3F3E5', а 1 -количество байт.

Отрывок из файла main.LUA 

Скрытый текст

readBytes(address,bytecount, ReturnAsTable ) : returns the bytes at the given address. If ReturnAsTable is true it will return a table instead of multiple bytes
  Reads the bytes at the given address and returns a table containing the read out bytes
 

 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Работает предыдущий скрипт, с командой readInteger('00A3F3E5'), просто эта команда считывает  4-байтные значения в адресе. Поменял условие в скрипте замораживать, не когда значение в адресе = 2, а на 4-байтное значение в адресе (00A3F3E5) в этом случае будет = 33686018. И после этого скрипт стал замораживать, так как надо. Подкорректировал под игру интервал обращений в скрипте до 500 (timer:setInterval(500)), а то слишком быстро замораживало.

Скрипт с командой readBytes('00A3F3E5',1) замораживает как раз так, как надо. То есть когда в адресе 00A3F3E5 значение становится = 2, происходит заморозка.

Ссылка на комментарий
Поделиться на другие сайты

Получается второй скрипт в заголовке темы, почти идентичен первому скрипту в заголовке темы. Но второй скрипт так и несмог сделать, чтоб он заработал.

Скрытый текст

[ENABLE]
{$LUA}
timer = createTimer(true)
timer:setInterval(500)
FreezingConditions = readInteger('00A3F3E5')
if (FreezingConditions == 33686018) then
memoryrecord_freeze('[[control]]')
end

timer:setEnabled(false)
[DISABLE]
{$LUA}

 

 

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

18 минуту назад, Razi сказал:

Получается второй скрипт в заголовке темы, почти идентичен первому скрипту в заголовке темы.

нет 1. скрипт морозит запись в таблице, 2. должен морозить конкретный адрес не зависимо находится он в таблице или нет.

В 14.02.2016в10:32, Garik66 сказал:

И как оказалось при проверке memoryrecord_freeze работает только с записью в таблице (а не с конкретным статичным или с указателями адресом), т.е. может заморозить адрес (или скрипт) по названию, ID или Index записи. 

Можно написать скрипт для конкретных (статичных) адресов игры. Но в этом случае вместо memoryrecord_freeze нужно будет использовать writeBytes и чуть-чуть изменить скрипт, плюс не будет крестика перед адресом, если он находится в таблице, но в игре адрес заморозится, так как write на LUA это тоже самое, что и mov на ассемблер. А про скрипт на ассемблер я уже тебе писал раньше в другой теме.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Вот проверь, писал в блокноте, не проверял:

Скрытый текст

[ENABLE]
{$LUA}
timer = createTimer(true)
timer:setInterval(100)
timer.OnTimer = function()
FreezingConditions = readBytes('00A3F3E5',1)
value = readBytes('00A444E8',1)
if (FreezingConditions == 2) then
writeBytes('00A444E8',value)
end
end

{$ASM}

[DISABLE]
{$LUA}
timer:setEnabled(false)

 

 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Хотя может не сработать, просто в файле main.LUA, для твоего случая, описания writeBytes нет.

Поэтому лучше сделать так:

Скрытый текст

[ENABLE]
{$LUA}
timer = createTimer(true)
timer:setInterval(100)
timer.OnTimer = function()
FreezingConditions = readBytes('00A3F3E5',1)
value = readInteger('00A444E8')              -- читать по 4 байта
if (FreezingConditions == 2) then
writeInteger('00A444E8',value)              -- и записывать 4 байта
end
end

{$ASM}

[DISABLE]
{$LUA}
timer:setEnabled(false)

 

 

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Проверил, предыдущий скрипт вставляется в таблицу, но не замораживает. А последний скрипт не вставляется в таблицу, пишет что ошибка в линии 2 и может быть в 6 линии, так как пишет неожиданный символ возле и т.д.

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

40 минуты назад, Razi сказал:

А последний скрипт не вставляется в таблицу

;)

Просто на LUA я обычно не пишу.

Забыл, что комментарии в скрипте  на LUA пишутся после -- а не // как на ассемблер.

Исправил второй скрипт.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Я видимо тоже подумал что коментарии такими и должны быть. Последний скрипт, не замораживает всеравно. В общем поэксперементировал со скриптами.  И в итоге оба скрипта предыдущий и последний замораживают, но замораживает, только если изменить слово "value" в обоих скриптах на цифру 72 и тогда адрес замораживается на значении 72 и остается таким без изменений, пока в адресе 00A3F3E5 значение = 2.

Заработали именно оба скрипта, потому что, когда в адресе 00A3F3E5 значение = 2, то в адресе 00A444E8 в это время значение всегда однобайтное, независимо от того однобайтный этот адрес или четырехбайтный (но чаще всего значение = 72). А вот когда в адресе 00A3F3E5 значение не равно 2, то в адресе 00A444E8 уже будет разное значение в зависимости от того какой это адрес однобайтный  или четырехбайтный. Это процедуру не очень легко обьяснить.

Ссылка на комментарий
Поделиться на другие сайты

34 минуты назад, Razi сказал:

В общем поэксперементировал со скриптами. 

Я специально сделал ошибку в скрипте - хотел посмотреть, научился ли ты читать скрипт, что он делает.

 

Помню, что у тебя, когда в адресе 00A3F3E5 значение = 2, то  в адресе 00A444E8 может быть 4 значения, поэтому ввёл переменную value и думал, что ты уже сможешь поправить скрипт, чтобы заработала заморозка на всех 4 значениях.

Ладно не буду томить,  Нужно эту строчку

value = readInteger('00A444E8')

Опустить ниже этой строчки

 

if (FreezingConditions == 2) then

и тогда всё заработает. А почему, сам закомментируй скрипт и поймёшь.

Короче скрипт, но я его не проверял мне не на чем:

Скрытый текст

[ENABLE]
{$LUA}
timer = createTimer(true)
timer:setInterval(100)
timer.OnTimer = function()
FreezingConditions = readBytes('00A3F3E5',1)
if (FreezingConditions == 2) then
value = readInteger('00A444E8')              
writeInteger('00A444E8',value)              
end
end

{$ASM}

[DISABLE]
{$LUA}
timer:setEnabled(false)

 

И ещё кое-чего не хватает в скрипте. Нужно дать понять компьютеру, что при [00A3F3E5]  = 2, значение value больше не нужно читать, а только записывать. Если сам не разберёшься как это сделать, завтра сделаю.

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

Та я считал что поскольку я новичек, то мне не нужно лезть в Lua скрипты. Считал что нужно сначала хоть немного разбираться в АА скриптах, а тогда изучать понемногу Lua скрипты. Читал только туториалы и курсы для новичков по АА скриптам. Но, поскольку мое любопытство приводит меня часто и к Lua, то мне еще нужно прочитать хотя бы туториалы по Lua скриптам. Скрипт еще не проверял и не смотрел, может успею до обеда посмотреть.

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Razi сказал:

Та я считал что поскольку я новичек, то мне не нужно лезть в Lua скрипты.

Я тоже так считаю и говорил тебе уже об этом.

Тогда зачем тебе скрипт на LUA, если я тебе его уже написал на СЕ ассемблер?

Тебе даже   AntonVitalievich (а он хорошо разбирается в LUA) написал по этому скрипту:

В 06.02.2016в18:59, AntonVitalievich сказал:

Razi

Я не знаю к сожалению как сделать на Lua.

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Garik66 сказал:

Тогда зачем тебе скрипт на LUA, если я тебе его уже написал на СЕ ассемблер?

Тебе даже   AntonVitalievich (а он хорошо разбирается в LUA) написал по этому скрипту

Именно скрипт с четырьмя значениями, мне уже не нужен потому что вы мне написали и на АА и впоследствии AntonVitalievich всетаки написал такой скрипт на Lua. Взял эти адреса в качестве примера, чтоб обучиться самому простому в Lua, такому как просто заморозка адреса. И если мне нужно будет заморозить другой адрес на Lua, то мне будет достаточно всего лишь изменить адрес в скрипте, на другой (получается скрипт будет, как шаблон). Сделал эту тему чтоб она была как азы по Lua скриптам. То есть обучение самому простому, но это оказывается не так-то просто на Lua.

 

15 час назад, Garik66 сказал:

поэтому ввёл переменную value

Но интересно, что говоришь что ввел value для того, чтобы заработала заморозка на всех 4 значениях.  У AntonVitalievich там такой скрипт совсем другой, чуть ли не на две страницы.

Сейчас только буду смотреть последний написанный скрипт.

Ссылка на комментарий
Поделиться на другие сайты

Где AntonVitalievich дал тебе скрипт на LUA для заморозки всех 4 значений, что-то я не увидел этого, может что пропустил?

Если есть такой скрипт, дай ссылку, хочу посмотреть.

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, Razi сказал:

чтоб обучиться самому простому в Lua, такому как просто заморозка адреса.

Так наверху кучу же уже примеров дал и для однобайтного адреса и для четырёхбайтного.

 

7 минут назад, Razi сказал:

но это оказывается не так-то просто на Lua.

Что это?

Ты свои условия почитай для этого скрипта в предыдущей теме. У тебя условия: при значении в [адресе1] = 2. нужно заморозить значение в  [адресе2], при этом в адресе2 могут проскакивать 4 значения. При таких условиях сложнее написать скрипт на LUA, гораздо проще его было написать на ассемблер, что я и сделал давно.

15 минуту назад, Razi сказал:

Сделал эту тему чтоб она была как азы по Lua скриптам.

Это уже не азы.

 

Ссылка на комментарий
Поделиться на другие сайты

Так там конкретно проставленны 4 значения 72, 104, 8 и 40.

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

А я хотел написать именно универсальный скрипт, чтобы морозил значения любое по второму адресу.

А это проще сделать с введением в скрипт переменной и флага (про флаг для этого скрипта я тебе ещё не писал).

И скрипт будет короче.

Ну ладно я его писать не буду. Так как для его проверки мне вначале нужно написать скрипт для эмуляции этих условий, а это ни кому не нужно ни тебе, ни мне тем более.

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

Цитата

А я хотел написать именно универсальный скрипт, чтобы морозил значения любое по второму адресу.

Тогда твое решение не менее интересно. Но я так понимаю написание такого скрипта(написать именно универсальный скрипт) займет немало времени? Незнаю стоит ли тратить, столько времени на написание такого скрипта.

Кстати в том скрипте с четырьмя значениями AntonVitalievich поставил заморозку на 1 милисекунду, я изменял эту заморозку на 100 милисекунд.

Изменено пользователем Razi
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.