Меню

Недопустимая таблица читов ошибка выполнения lua скрипта

Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Поскольку люди создают миллион тем с заголовком «Не работает мунлоадер» было решено создать эту тему.
Тут я разберу основные проблемы и как их убрать.

Что надо для работы мунлоадера?​

Для работы мунлоадера нужен лишь аси лоадер, не более. А вот у большинства скриптов есть зависимость от библиотек которые требуют наличия SAMPFUNCS. Либо же содержат функции которые требуют наличия SAMPFUNCS. SAMPFUNCS это дополнение к библиотеке CLEO 4, соответственно нам еще и клео надо.
Где же все его взять?
Cleo
— https://cleo.li/ru
SAMPFUNCS(R1) — https://www.blast.hk/threads/17/
SAMPFUNCS(R3) — https://www.blast.hk/threads/65247/
Moonloader — https://www.blast.hk/threads/13305/

1.Отсутствие какой-либо библиотеки.​

Ошибка выглядит следующим образом.

(error)    *НАЗВАНИЕ ФАЙЛА*.lua: ...*НАЗВАНИЕ СБОРКИ*moonloader*НАЗВАНИЕ ФАЙЛА*.lua:*НОМЕР СТРОКИ С ОШИБКОЙ*: module '*НАЗВАНИЕ БИБЛИОТЕКИ*' not found:    no field package.preload['*НАЗВАНИЕ БИБЛИОТЕКИ*']
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloaderlib*НАЗВАНИЕ БИБЛИОТЕКИ*.lua'
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloaderlib*НАЗВАНИЕ БИБЛИОТЕКИ*init.lua'
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloader*НАЗВАНИЕ БИБЛИОТЕКИ*.lua'
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloader*НАЗВАНИЕ БИБЛИОТЕКИ*init.lua'
    no file '.*НАЗВАНИЕ БИБЛИОТЕКИ*.lua'
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloaderlib*НАЗВАНИЕ БИБЛИОТЕКИ*.luac'
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloaderlib*НАЗВАНИЕ БИБЛИОТЕКИ*init.luac'
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloader*НАЗВАНИЕ БИБЛИОТЕКИ*.luac'
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloader*НАЗВАНИЕ БИБЛИОТЕКИ*init.luac'
    no file '.*НАЗВАНИЕ БИБЛИОТЕКИ*.luac'
    no file '*ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloaderlib*НАЗВАНИЕ БИБЛИОТЕКИ*.dll'
stack traceback:
    [C]: in function 'require'
    ...HACKmoonloader*НАЗВАНИЕ СКРИПТА*:*НОМЕР СТРОКИ С ОШИБКОЙ*: in main chunk
(error)    *НАЗВАНИЕ СКРИПТА*.lua: Script died due to an error. (*код который не надо*)

Если вы видите строку

module '*НАЗВАНИЕ БИБЛИОТЕКИ*' not found:

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

(error)    bypasser_2.lua: ...sEmilDesktopGTA BY SAMPHACKmoonloaderbypasser_2.lua:2: module 'neatjson' not found:    no field package.preload['neatjson']
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderlibneatjson.lua'
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderlibneatjsoninit.lua'
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderneatjson.lua'
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderneatjsoninit.lua'
    no file '.neatjson.lua'
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderlibneatjson.luac'
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderlibneatjsoninit.luac'
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderneatjson.luac'
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderneatjsoninit.luac'
    no file '.neatjson.luac'
    no file 'C:UsersEmilDesktopGTA BY SAMPHACKmoonloaderlibneatjson.dll'
stack traceback:
    [C]: in function 'require'
    ...sEmilDesktopGTA BY SAMPHACKmoonloaderbypasser_2.lua:2: in main chunk
(error)    bypasser_2.lua: Script died due to an error. (0F5F60BC)

Тут нам мунлоадер даёт понять что он не может найти библиотеку neatjson.lua, а это значит что её нету.
Как решить? Скачать и установить её в папку lib.

2. Несовместимый байт-код​

Рассмотрим следующую проблему. Вы посмотрели свой лог по первом пункте и ничего такого там не обнаружили. Это может быть не состыковка версий. Посмотрим как это выглядит.

(error) *НАЗВАНИЕ ФАЙЛА*.lua: *ПУТЬ К СБОРКЕ**НАЗВАНИЕ СБОРКИ*moonloader*НАЗВАНИЕ ФАЙЛА*.lua: cannot load incompatible bytecode
(error) *НАЗВАНИЕ ФАЙЛА*.lua: Script died due to an error. (*код который не над*)

Если у вас есть мозг либо вы не спали на уроках английского в школе, то вы уже поймете в чем проблема. Но я все же объясню. Мы видим строку

cannot load incompatible bytecode

Что же это значит? А то, что мунлоадер не может загрузить несовместимый байт-код. Что это я такое сморозил? Все просто. Ваш скрипт скомпилирован под другую версию мунлоадера. Пример: автор скомпилировал скрипт под 025 мунлоадер, на то время актуальный, но вот вышел 026 и все его используют, но скрипт уже на нем работать не будет, так как не та версия.
Как решить? У вас есть 2 варианта.

  1. Написать автору скрипта, чтобы он скомпилировал скрипт под новую версию муна.
  2. Конвертировать самому. https://www.blast.hk/threads/35380/ вам в помощь.

3. Отсутствие SAMPFUNCS

Такое тоже бывает, это может быть из-за отсутствия SAMPFUNCS. То есть библиотека просит сф, а его нету.
Ошибка выглядит следующим образом:

(error)    *НАЗВАНИЕ СКРИПТА*: ... *ПУТЬ К БИБЛИОТЕКЕ*: *БИБЛИОТЕКА* requires SAMPFUNCS
stack traceback:
    [C]: in function 'assert'
    ... *ПУТЬ К БИБЛИОТЕКЕ*: in main chunk
    [C]: in function 'require'
    ...*ПУТЬ К БИБЛИОТЕКЕ* : in main chunk
    [C]: in function 'require'
   *ПУТЬ К СБОРКЕ**НАЗВАНИЕ СКРИПТА*.lua: in function  *ПУТЬ К СБОРКЕ**НАЗВАНИЕ СКРИПТА*.lua:>

Рассмотрим на примере. Попытаемся загрузить samp.events без SAMPFUNCS.

(error)    Admin Tools: ... Andreas MultiPlayermoonloaderlibsampeventscore.lua:23: samp.events requires SAMPFUNCS
stack traceback:
    [C]: in function 'assert'
    ... Andreas MultiPlayermoonloaderlibsampeventscore.lua:23: in main chunk
    [C]: in function 'require'
    ...A San Andreas MultiPlayermoonloaderlibsampevents.lua:8: in main chunk
    [C]: in function 'require'
    E:GTA San Andreas MultiPlayermoonloaderAdmin Tools.luac: in function <E:GTA San Andreas MultiPlayermoonloaderAdmin Tools.luac:0>

Если вставить в переводчик строку samp.events requires SAMPFUNCS будет все понятно.
Как решить? Установить SAMPFUNCS и Cleo из ссылок в начале темы

4. Ошибка Moon ImGui​

Может возникнуть ошибка и с Moon ImGui. Возникает она когда версия мунлоадера ниже 026. Рассмотрим её вид:

(error)    *ПУТЬ К БИБЛИОТЕКЕ*:*СРОКА С ОШИБКОЙ*: Moon ImGui requires MoonLoader v.026 or greater.
stack traceback:
    [C]: in function 'assert'
    *ПУТЬ К БИБЛИОТЕКЕ*:*СБОРКА С ОШИБКОЙ* : in main chunk
    [C]: in function 'require'
    ...*ПУТЬ К СБОРКЕ*moonloader*НАЗВАНИЕ СКРИПТА*.lua: in function <...*ПУТЬ К СБОРКЕ*moonloader*НАЗВАНИЕ СКРИПТА*.lua:0>

Посмотрим на пример:

(error)    X:GamesARIZONA GAMESbinArizonamoonloaderlibimgui.lua:4: Moon ImGui requires MoonLoader v.026 or greater.
stack traceback:
    [C]: in function 'assert'
    X:GamesARIZONA GAMESbinArizonamoonloaderlibimgui.lua:4: in main chunk
    [C]: in function 'require'
    ...amesARIZONA GAMESbinArizonamoonloaderMHManager.luac: in function <...amesARIZONA GAMESbinArizonamoonloaderMHManager.luac:0>

Тут moonloader говорит нам что Moon ImGui требует MoonLoader v.026 или выше.
Как решить? Установить moonloader 026/027 из ссылки в начале теме.

5. Отсутствие шрифта​

Может возникнуть ошибка с загрузкой шрифта, например для имгуи. Она возникает если у вас в системе нету данного шрифта. Рассмотрим ошибку

*НАЗВАНИЕ СКРИПТА*: *ПУТЬ К ФАЙЛУ**ФАЙЛ*.lua:*НОМЕР СТРОКИ*: WTF: Font "*ПУТЬ К ШРИФТУ**НАЗВАНИЕ ШРИФТА*.ttf" doesn't exist
stack traceback:
    [C]: in function 'assert'
  *НАЗВАНИЕ СКРИПТА*: *ПУТЬ К ФАЙЛУ**ФАЙЛ*.lua:*НОМЕР СТРОКИ*: in function '*ФУНКЦИЯ*'
    *НАЗВАНИЕ СКРИПТА*: *ПУТЬ К ФАЙЛУ**ФАЙЛ*.lua:*НОМЕР СТРОКИ*: in function *НАЗВАНИЕ СКРИПТА*: *ПУТЬ К ФАЙЛУ**ФАЙЛ*.lua:*НОМЕР СТРОКИ*

Посмотрим на пример:

Moon ImGui Example: D:Гусиная Сборкаmoonloaderlibimgui.lua:1344: WTF: Font "C:WindowsFontstrebucbd.ttf" doesn't exist
stack traceback:
    [C]: in function 'assert'
    D:Гусиная Сборкаmoonloaderlibimgui.lua:1344: in function 'load_default_font'
    D:Гусиная Сборкаmoonloaderlibimgui.lua:1370: in function <D:Гусиная Сборкаmoonloaderlibimgui.lua:1367>

Как решить? Установить недостающий шрифт в C:WindowsFonts

p.s: Если я что-то забыл — напишите добавлю

Главная » Пользователи » s_mike@rambler.ru

Форум:

Дата создания:

Выбрать дату в календареВыбрать дату в календаре

Тема:

Сообщение:

Страницы:
1
2
След.

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

10.08.2022 15:36:13

В документации на Квик написано, что если указать метке цену и время, то там она и выставиться.

щас!

как водится, врут. Достаточно включить в терминале режим показа графиков в локальном времени и все, приехали.

в лучшем случае метка показывается не там где надо, в худшем не показывается вообще. Зависит от смешения локального времени от Москвы.

дедушку лечить бессмысленно. Дедушку дохлый, ему на кладбище. Да и доктора, судя по чехарде фамилий, временные гастарбайтеры.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

09.07.2022 10:02:00

> t=setmetatable({},{ __div = function(x,y) print(x,y) end})
> print (t/2)
table: 0000000000620d10 2
nil

Это работает
А это не работает. что в 5.3 что в 5.4

> t=setmetatable({},{ __bshl = function(x,y) print(x,y) end})
> print (t<<2)
stdin:1: attempt to perform bitwise operation on a table value (global ‘t’)
stack traceback:
       stdin:1: in main chunk
       [C]: in ?
> print (t>>2)
stdin:1: attempt to perform bitwise operation on a table value (global ‘t’)
stack traceback:
       stdin:1: in main chunk
       [C]: in ?

метод __bshl не видится почему то

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

06.07.2022 12:48:20

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

Есть библиотека для 5.3. Работает на ура. И в квике и в standalone

Пересобрал ее на 5.4. Работают все три десятка ее функций (и в квике и в standalone) без каких либо проблем, кроме одной. Она работает в standalone, но напрочь отказывется работать в квике.

Выкинул из нее все лишнее, оставил минимум для теста

Код
static int xx_test(lua_State *L)
{

   const char* buffer = luaL_checkstring(L, 1);

   if (luaL_loadbuffer(L, buffer, strlen(buffer), "test") == LUA_OK)
      MessageBox(0, "loadbuffer ok", "", MB_OK);
   else
   {
      MessageBox(0, "loadbuffer error", "", MB_OK);
   }
   
   if (lua_pcall(L, 0, 0, 0) == LUA_OK)
   {
      MessageBox(0, "pcall ok", "", MB_OK);
      lua_pushnil(L);
   }
   else
   {
      MessageBox(0, "pcall error", "", MB_OK);
   }



   return 1;
}

вызов из луа:
message(«result=» .. tostring(xx.test(«message(‘hello world!!’,3)»)))

И если в standalone мы получаем два сообщения OK, hello world и nil в качестве возврата, то в квике мы сразу получаем loadbuffer error и дальше, конечно мусор.

Может, кто то пальцем сможет указать направление в пустыне?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

19.05.2022 00:41:03

решил пересобрать  библиотеку с 5.3 на 5.4
Уткнулся в проблему

Функция в dll:

static int b4s_xxx(lua_State *L)
{
const char *buffer = «message(«hello world»)»;
int result = luaL_dostring(L, buffer, strlen(buffer));

lua_pushnil(L);
return 1;
}

Вызываем из standalone lua

require «testlib»
message = print
testlib.xxx()

Выводит hello world

Вызываем из квика

require «testlib»
testlib.xxx()

ничего не выводит.

Теряюсь в догадках. Кто может подсказать?  на 5.3 проблем не наблюдалось

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

17.05.2022 13:04:44

Еще одна блоха на теле в лучшего в мире ПО

Находим свой аккаунт в таблице trade_accounts
смотрим поле class_codes
Пробуем найти ВСЕ перечисленные классы в таблице classes

Удивляемся, что некоторых классов из class_codes нет в таблице classes

Удивляемся, удивляемся..

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

05.01.2022 18:55:55

Скрипт на луа, выставляющий 2 метки на один график

res = AddLabel(«ri»,
{ —IMAGE_PATH = «E:\GoogleDisk\ROBOT\__TEST\2-0.bmp»,
IMAGE_PATH = «E:\GoogleDisk\ROBOT\__TEST\2-0a.bmp»,
TEXT = «»,
DATE     = 20220105,
TIME = 150000,
YVALUE = 151550,
ALIGNMENT = «LEFT»
})
res1 = AddLabel(«ri»,
{ IMAGE_PATH = «E:\GoogleDisk\ROBOT\__TEST\2-0.bmp»,
—IMAGE_PATH = «E:\GoogleDisk\ROBOT\__TEST\2-0a.bmp»,
TEXT = «»,
DATE     = 20220105,
TIME = 150000,
YVALUE = 151650,
ALIGNMENT = «LEFT»
})
message(tostring(res).. » » .. tostring(res1))

Как видим, отличие лишь в бмп файле (yvalue изменены, чтобы видеть метки не друг на друге)

в результате выставляется всегда только вторая метка, при первая не выставляется. Терминал при исполнении этого скрипта выдает сообщение в окно сообщений: Произошла ошибка при загрузке файла чивотатам2-0.bmp

скрипт выдает message вида 23465.0 nil

Из чего можно сделать вывод, что файл 2-0.bmp битый, а файл 2-0a.bmp нормальный.

ok. Но раньше то все было нормально!

Запускали мы сейчас  скрипт на версии 9. Запустим его на версии 8.

Упс, обе метки выставляются.

А что у нас внутри bmp?

42 4В 22 00 00 00 00 00   |   00 00 1A 00 00 00 0С 00
00 00 02 00 01 00 01 00    |  18 00 32 FF 32 32 FF 32
00 00

Смотрим в этот бмп с помощью irfanview или чем нибудь еще — нет проблем.

size 2*1 pixels
colors 16.7 million
unique colors 1
Disk size 34
compression None, OS/2
point size from DPi 0.1 * 0.0 sm   0.03 * 0.01 inches

Если надо подержать в руках обе бмпшки :

https://dropmefiles.com/VH3Ks

Что изменилось в терминале?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

26.11.2021 14:48:25

Вопрос

Как отличить пустую свечу графика, получаемого по getcandlebyindex  от правых фантомных свечей в случае, если график сдвинут вправо от источника его данных?

Спасибо

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

04.10.2021 18:40:29

Settings={}
Settings.Name = «minimal»
getInfoParam(«VERSION»)
function Init()
return 1
end
function OnCalculate(index)
return 1
end

[3676] QLUA E:Quik-JuniorLuaIndicators1.lua:3: attempt to call a nil value (global ‘getInfoParam’)
Куда дели функцию getInfoParam, жители крайнего Севера?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

30.07.2021 19:42:26

function main()

message(tostring(
AddLabel(«gazp»,
{HINT=»zzzzz»,
TEXT=»тттт»,
TRANSPARENCY=0,
DATE=20210730,
IMAGE_PATH=»E:\GoogleDisk\ROBOT\add.bmp»,
TIME=170000,
YVALUE=285,
ALIGNMENT=»RIGHT»}
)))
end

Вот такой чудесный скрипт, выставляющий метку.

В 8.13 боевой выставляет картинку на диаграмму, а в 9.1 демо — нет. Оба терминала на одной машине, запущены одновременно, идентификаторы идентичны, проверено, скопировано через буфер обмена.

Как такое может быть? Отчего это может зависеть? Индусов в программисты наняли?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

30.07.2021 18:12:46

Ув. разработчики!

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

Свободной видеопамяти еще много гигабайт. Скрипт просто переставляет метки посредством SetLabel. Написать тест из 10 строчек кода вы должны суметь сами.

Почему вываливается если видеопамяти полно? Почему расходуется видеопамять при использовании SetLabel?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

30.07.2021 18:00:25

Уважаемые разработчики!

Я уже много раз вам указывал на эту ошибку (и не только я). Много раз она «будет исправлена в очередной версии ПО»

function main()
message(tostring(
AddLabel(«gazp»,
{HINT=»zzzzz»,TEXT=»»,TRANSPARENCY=0,DATE=20210730,IMAGE_PATH=»нет такого файла»,TIME=40500,YVALUE=284.51,ALIGNMENT=»RIGHT»}
)))
end

Эта функция возвращает успех, номер метки. А не должна. Ошибка тянется с 2013 года, но компания Арка не чешется абсолютно.

Отдельный привет Алексею Иванникову. У вас полно ошибок, которые вы не исправляете годами или не в состоянии исправить.. Открывайте ваши регистрации или куда вы все это пишете, ищите. Можете поискать по форуму.

Пообещайте еще раз, что ли….

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

03.05.2021 22:36:30

Каждая уважающая себя среда должна иметь кроме прочего, исполняемую в ней игрушку. Я таких для терминала quik не встречал.

Одно время была очень популярна игра 2048б мне заказывали ее написать для какого-то сайта. Вот ее вариант для quik, нарисовал под пиво:

Код
local stopped

game = {
   cell = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
   best = 0,
--   key = nil,
-- t = nil,
   colors =   {   [0]   = QTABLE_DEFAULT_COLOR,
               [2]   = RGB(248,248,255),
               [4]   = RGB(255,239,213),
               [8]   = RGB(255,222,173),
               [8]   = RGB(255,218,185),
               [16]   = RGB(205,92,92),
               [32]   = RGB(255,69,0),
               [64]   = RGB(238,238,0),
               [128]   = RGB(238,118,33),
               [256]   = RGB(255,160,122),
               [512]   = RGB(255,0,0),
               [1028]= RGB(238,18,137),
               [2048]= RGB(139,0,0)
            },
   
   create_table =
      function(self)
         self.t = AllocTable()
         for i = 1,4 do
            AddColumn(self.t, i, "", true, QTABLE_INT_TYPE, 10)
         end
         CreateWindow(self.t)
         SetWindowPos(self.t,100,100,300,130)
         for i = 1,4 do
            InsertRow(self.t,i)
         end
         SetTableNotificationCallback(self.t,       
                                      function(_t, msg, _p, key)
                                       if msg == QTABLE_VKEY then
                                          self.key = key
                                       elseif msg == QTABLE_CLOSE then
                                          stopped = true
                                       end
                                      end)
         SetWindowCaption(self.t, "2048 game by www.bot4sale.ru")
      end,
   
   draw = 
      function(self)
         local cell = self.cell
         for row=1,4 do
            for column=1,4 do
               local value = cell[(row-1)*4 + column]
               SetCell(self.t,row,column,value==0 and "" or tostring(value))
               SetColor(self.t,row,column,game.colors[value],0,game.colors[value],0)
            end
         end
     end,
  
   incr = 
      function(self)
         local t,open = self.cell,{}
         for i=1,16 do 
            if t[i]==0 then 
               open[#open+1]=i 
            end
         end
         t[open[math.random(#open)]] = math.random()<0.1 and 4 or 2
      end,
  
   pack = 
      function(self,ofr,oto,ost,ifr,ito,ist)
         local t = self.cell
         for outer=ofr,oto,ost do
            local skip = 0
            for inner=ifr,ito,ist do
               local i = outer+inner
               if t[i]==0 then 
                  skip=skip+1 
               else 
                  if skip>0 then 
                     t[i-skip*ist],t[i],self.diff = t[i],0,true 
                  end 
               end
            end
         end
      end,
  
   comb = 
      function(self,ofr,oto,ost,ifr,ito,ist)
         local t = self.cell
         for outer=ofr,oto,ost do
            for inner=ifr,ito-ist,ist do
               local i,j = outer+inner,outer+inner+ist
               if t[i]>0 and t[i]==t[j] then 
                  t[i],t[j],self.diff,self.best = t[i]*2,0,true,math.max(self.best,t[i]*2) 
               end
            end
         end
      end,
  
   move = 
      function(self,dir)
         local loopdata =   {   {0,12,4,1,4,1},
                              {0,12,4,4,1,-1},
                              {1,4,1,0,12,4},
                              {1,4,1,12,0,-4}
                           }
         local ofr,oto,ost,ifr,ito,ist = table.unpack(loopdata[dir])
         self:pack(ofr,oto,ost,ifr,ito,ist)
         self:comb(ofr,oto,ost,ifr,ito,ist)
         self:pack(ofr,oto,ost,ifr,ito,ist)
      end,
  
   full = 
      function(self)
         local t = self.cell
         for r=0,12,4 do
            for c=1,4 do
               local i,v = r+c,t[r+c]
               if (v==0) or (c>1 and t[i-1]==v) or (c<4 and t[i+1]==v) or (r>0 and t[i-4]==v) or (r<12 and t[i+4]==v) then
                  return false
               end
            end
         end
      return true
   end,
  
   play = 
      function(self)
         math.randomseed(os.time())
         self:incr()
         self:incr()
         while not stopped do
            self:draw()
            if self.best == 2048 then 
               message("Поздравляю!nnwww.bot4sale.ru") 
               break 
            end
            if self:full() then 
               message("Game Over!")
               break 
            end
            
            self.diff = false
            if       self.key==0x25 then       -- Left
               self:move(1)
            elseif self.key==0x27 then         -- Right
               self:move(2)
            elseif self.key==0x26 then       -- Up
               self:move(3)
            elseif self.key==0x28 then         -- Down
               self:move(4)
            end
            self.key = nil
            if self.diff then 
               self:incr() 
            end
            sleep(100)
         end
      end,
      
   rules = 
      function()
         message("Правила игры:nnВ каждом раунде появляется плитка номинала «2» или «4». Нажатием стрелки игрок может скинуть все плитки игрового поля в одну из 4 сторон. Если при сбрасывании две плитки одного номинала «налетают» одна на другую, то они превращаются в одну, номинал которой равен сумме соединившихся плиток. После каждого хода на свободной секции поля появляется новая плитка номиналом «2» или «4». Если при нажатии кнопки местоположение плиток или их номинал не изменится, то ход не совершается. Если в одной строчке или в одном столбце находится более двух плиток одного номинала, то при сбрасывании они начинают соединяться с той стороны, в которую были направлены.nЛевый столбец с номерами строк участия в игре не принимает.nns_mike@rambler.ru")
      end
}
local game = game

--------------------------------------------------

function main()
   game:create_table()
   game:rules()
   game:play()
end

Также можно взять

здесь

Не имею возражений, если разработчики включат игрушку в список своих демонстрационных скриптов ))))

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

30.04.2021 13:49:27

Добрый день

Что за тип данных такой

_dataline_data_metatablegc

у меня не получилось осознать и не смог найти в спецификации lua

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

03.04.2021 18:02:45

message(«

www.bot4sale.ru

«)

В сообщении на экране

www.bot4sale.ru

будет оформлена как ссылка, тут все в порядке. Но при нажатии на эту ссылку открывается проводник, а не браузер. Думаю, что и с другими типами (call-to и прочими будет то же самое)

По умолчанию приложением для открытия URL назначен Хром.

Поправьте.  

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

14.10.2020 18:12:23

Здравствуйте

возможна ли ситуация с получением данных графика, когда свеча уже имеется (учтена в  getnumcandles), но ее значение не заполнено и по getCandlesByIndex возвращаются ohlcv 0?

возникает при очень частом опросе графика, последующий запрос выдает то же количество свечей, но ohlcv уже реальные

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

30.09.2020 09:34:34

Уважаемые разработчики.

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

в таком случае у вас должно быть понимание, как необходимо при помощи языка луа принимать решение о возможности начала работы алгоритма после старта скрипта.

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

варианты:

1. Терминал давно запущен до запуска робота
2. Терминал и робот запущены одновременно , необходимые данные в терминале доступны
3. Терминал и робот запущены одновременно , необходимые данные в терминале пока недоступны
4. Смена сессии , нужные шлюзы доступны/недоступны, когда нибудь подключатся
5. У косого брокера на букву Ф опять понос и посреди дня он медленно и печально начал перезагружать всю историю с 1812 года
6. Инструмент неликвидный, много пропущенных свечей, в том числе последних

и так далее..

в общих словах вопрос.

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

я понимаю, что терминал сам не знает, последняя свеча ему пришла или непоследняя. Но луа в терминал вы же не по пьяни встраивали, а после «регистрации пожелания, постараемся его рассмотреть и сообщить» и далее по тексту.

вы же пробовали сами что то писать на луа, верно?)

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

04.09.2020 12:54:32

В версии 8.8 наблюдаю странную вещь.

в одних местах скрипта debug.getinfo(1) выдает таблицу , в которой есть поле name,

а других местах в получаемой таблице этого поля нет. Остальные поля вроде на месте.

вызов идёт из луа, си функций в последовательности вызова нет.

что может быть тому причиной?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

12.08.2020 13:05:28

Получаю source info в индикаторе:

{sec_code=»GAZP»,class_code=»QJSIM»,param=»»,interval=-1}

Откуда взялся interval -1?

Если это не ошибка, будьте любезны, объясните происходящее.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

06.08.2020 19:18:04

Что за зверь такой неизведанный?

Зачем я вижу ошибки исполнения от него?  Какие они бывают, откель они берутся и когда?

Спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

13.06.2020 12:33:21

https://www.lua.org/work/

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

09.06.2020 09:37:31

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

Подписка на инструмент сразу после смены сессии ошибок не возвращает, но и «мёд не носит» — свечи не приходят, колбек не дергается.

Как нужно делать правильно?

Спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

04.06.2020 12:07:26

Строим индикатор с гистограммами (первый рисунок)

Увеличиваем ширину гистограмм — второй рисунок

Враги  съели легенду. Если сделать ширину еще больше — они сожрут и таймлайн (третий рисунок)

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

30.05.2020 16:51:13

Перекомпилировал свои скрипты, наткнулся:

Открываем

https://www.lua.org/pil/22.1.html

,  Видим пример

print(os.time{year=1970, month=1, day=1, hour=0})      —> 10800

Не верим, проверяем.

print(os.time{year=1970, month=1, day=1, hour=0})
Console:1: time result cannot be represented in this installation

И правильно не верим, как выясняется. И в терминале и в стандалоне одинаково.

а вот

print(os.time{year=1970, month=1, day=1, hour=0})

Оказывается.

Теперь lua смотрит часовой пояс. У меня часовой пояс +1, и
print(os.time{year=1970, month=1, day=1, hour=1}) работает и дает 0

Смотрел в документацию на луа — ничего не нашел. На 5.1 в часовой пояс луа не смотрела.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

18.05.2020 12:59:20

Я правильно понимаю, что колонки пользовательских таблиц этих типов по прежнему уверенным домкратом выводят float циферки? )

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

08.05.2020 11:52:43

В последней версии терминала 8 5 2 11  наблюдаю падения приложения при переносе мышкой (drag&drop) пользовательских индикаторов между диаграммами. При переносе встроенных индикаторов проблемы нет.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

12.11.2019 21:55:18

То ли лыжи не едут….

Как остановить скрипт при закрытии терминала, чтобы при последующем запуске терминала он вы в состоянии «не запущен»?

Метод автогена с провокацией ошибки исполнения считаю недостойным для Программного Комплекса  QUIK )))

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

05.11.2019 21:55:57

Здравствуйте.

Каким образом из всего множества доступных в терминале классов НАДЕЖНО найти их подмножество, по которым идут торгисделки?

Вариант с заказом истории по инструментам класса не подходит.

Например, SPBFUT — торгуемый, а cross_rate — не торгуемый

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

31.10.2019 18:49:24

Добрый.

Что означают значения O,H, L, C на графике оборота в деньгах?

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

Попутно —  в какой валюте идет подсчет?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

10.09.2019 20:31:22

Что-то я сильно устал, пробуя пересобрать из исходников sqlite3.dll из пакета lua sql для работы с 8 квиком. Может, кто покажет указующим перстом, где это счастье можно взять в готовом виде?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

16.07.2019 10:33:49

Здравствуйте

В индикаторе необходимо сохранять определённые данные между запусками терминала

соответственно:

1. как отличить ручное удаление индикатора (или закрытие окна/диаграммы) от закрытия терминала?
2. как идентифицировать данный экземпляр индикатора, чтобы сохранить данные для него?

ну и попутно.

Третий параметр setvalue() может быть nil.  Всегда и всюду в lua правые параметры nil при вызове функций можно опускать, но не в случае этой функции. Я уже раз пятый наезжаю на эту граблю… Может, стоит привести в норму?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

05.07.2019 16:21:13

Если из lua выставить стоп заявку такую, что она не проходит проверку сервера, то

1. Она висит в таблице стоп-заявок
2. сделать с ней ничего нельзя.

Так и должно быть?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

02.05.2019 12:10:46

Здравствуйте

Существует ли способ однозначно определить тип актива Фьючерсы/акции/опционы без использования таблицы текущих торгов? ТТТ может быть не открыта и получить оттуда нужные поля далеко не всегда возможно.

По коду класса тоже ненадежно, классов много разных на разных площадках

По наличию в полном наименовании слова «Фьючерсы» или «Опционы» как то видится ненадежным.

Есть какие-то более стандартные варианты?

Спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

03.04.2019 12:34:31

Здравствуйте.

Как выгрузить библиотеку при завершении скрипта?

Вот пример

function main()

assert (package.loadlib(getScriptPath() .. «\sqlite3.dll», «luaopen_luasql_sqlite3»)) ()
env = luasql.sqlite3()

local db = env:connect(‘db.sqlite’)

db:execute[[
 CRE ATE   TABLE generic(
   key varchar(50),
   value varchar(150)
 )
]]

db:execute[[
 INS ERT INTO generic VALUES(‘11111’, ‘2222’)
]]
db:execute[[
 INS ERT IN TO generic VALUES(‘33333’, ‘4444’)
]]

local results = db:execute[[
 SEL ECT * FR OM generic
]]

local key,value = results:fetch()
while key do
 message(key ..’: ‘.. val ue)
 key,value = results:fetch()
end

results:close()
db:close()
env:close()

end

не выгружается.

перенос текста в поток терминала эффекта тоже нее дает.

спасибо

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

11.02.2019 11:40:44

здравствуйте

Эту стоп-заявку я могу выставить из луа (как)? в документации информации нет, в карман транзакций добавить ее не могу

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

31.01.2019 22:45:33

Здравствуйте.

1. Как я понимаю, за прошедшие несколько лет (5?   8?  10?) ошибка терминала, проявляющаяся в НЕРИСОВАНИИ на диаграмме маленьких меток, так и не решена? Тестовый пример, иллюстрирующий проблему, я приводил на форуме очень давно и «будет исправлена в очередной версии»

2. Другая проблема. Индикатор рисует метки на диаграмме. В момент запуска терминала с установленным индикатором все прекрасно, за исключением одного — метки не выводятся. Логирование результатов AddLabel свидетельствует об успешности операций, функция возвращает номера меток в инкрементальном порядке. Но на экране их нет.  
Перезапуск индикатора — и все рисуется прекрасно.
При обычном добавлении индикатора при уже запущенном терминале тоже все хорошо.

В чем причина?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

31.01.2019 18:04:01

Здравствуйте

Было бы очень неплохо иметь возможность получать в скрипте lua колбек при нажатии пользователем метки на графике по аналогии с SetTableNotificationCallback

спасибо

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

27.12.2018 15:17:00

Здравствуйте.

Задача.

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

Очевидная попытка решения

function OnCalculate(i)
  if i == Size() then do_it() end
end

к успеху не приводит, если на графике построен какой-либо индикатор, сдвинутый вправо.

При этом Size() показывает увеличенное на величину сдвига число свечей.

Узнать величину этого сдвига возможности нет.

Вопрос. Как решить поставленную задачу?

Спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

03.12.2018 21:22:37

Возможно я чего то не замечаю, но вижу следующее.

При попытке исполнить транзакцию kill_stop_order для неактивной стоп-заявки не приходит ответ ontransaction.

Мне это не кажется и так должно быть?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

04.06.2018 17:39:35

Сегодня установил новую версию терминала и оооо-паньки…Новый индикатор.

Цитата
Добавлен новый индикатор «Глубина рынка», отражающий объемы заявок в виде гистограммы. Подробное описание см. в п. 4.2.15 Раздела 4 «Работа с графиками» Руководства пользователя QUIK.

Что-то он мне  напоминает…

Даже помню что

. Написано в 2015 году было.

Практически один-в-один. Все режимы те же самые, тот же способ отображения из будущего по шкале времени, та же возможность отображать накопительные объемы.

Плагиат расцениваю как комплимент )

Всем, кто пытается писать какие-то вкусности для творений арка — на заметку — даже спасибы от этой компании не дождетесь, не то что бутылку пива.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

28.05.2018 14:34:31

Снова возвращаюсь к вопросу. о котором разработчики позабыли, как видится.

Вот эта функция крутится в цикле опроса:

Код
   -- Собирает из ТОС новые обезличенные сделки
   rescan =
      function()
         if database.need_rescan == false then
            return
         end
         database.need_rescan = false

         local num_trades = getNumberOf("all_trades") - 1
         local items = SearchItems("all_trades",
                                    database.tos + 1,
                                    num_trades,
                                    database.search_function,
                                    "class_code,sec_code,datetime.day,datetime.month,datetime.year"
                                  ) or {}
         database.tos = num_trades
         log.write("Получено ",`#'items," сделок")

         for _,n in ipairs(items) do         -- Всегда по возрастанию
            database.process_trade(getItem("all_trades",n))
         end

         database.save()
      end,

   ---------------------------------------------------------------
   -- Обработка одной сделки
   process_trade =
      function(trade)

         -- Костыль для фильтрации кривых обезличенных сделок, которые шлёт терминал
         if not trade or trade.datetime.year == 1601 then
            log.error("BS: Ошибка терминала. Недопустимая таблица обезличенной сделки ",trade)
            return
         end

20:09:22.057   Получено 151892 сделок
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.221   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.224   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.224   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.226   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.226   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil

Подписка на тиковые данные происходит по двум колбекам.

Код
oncleanup.subscribe(function()
                     repository.init()
                    end
                   )
onconnected.subscribe(function(flag)
                        if flag then
                           repository.init()
                        end
                      end
                   )

repository.init в частности исполняет следующее

Код
         local security = getSecurityInfo(_class,_code)
         if not security then
            log.write("Инструмент ",instrument_dir," не обнаружен")
            screen.add(_class,_code,INSTRUMENT_NOT_FOUND)
            return
         end

         local ds,err = CreateDataSource(_class,_code,INTERVAL_TICK)
         if not ds then
            log.write("Невозможно получить обезличенные сделки по инструменту ",instrument_dir)
            screen.add(_class,_code,INSTRUMENT_NOT_FOUND)
            return
         end
         table.insert(database.ds,ds)
         log.write("Подписка на инструмент ",instrument_dir," успешна")

Указанный эффект всегда происходит при первом включений терминала в пределах дня. Последующие включения такой эффект не несут.

Если я что-то делаю неправильно, было бы полезно понять. что именно. Иначе получается, что это грубая ошибка терминала.

Спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

18.04.2018 12:03:37

Здравствуйте.

я уже дважды поднимал вопрос об отсутствии вызова omdestroy в индикаторах в режиме связанных окон.

при смене инструмента в этом режиме функция ondrstroy не вызывается.

оба раза я получал ответ в виде » абажите, щаса напишем скрипт для проверки и саапчим».

Но не саапчили.

Что имеем то по вопросу?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

09.04.2018 19:39:43

Здравствуйте.

Вопрос скорее к разработчикам.

Есть индикатор, одновременно запущенный на несколшьких разных инструментах (или одинаковых), с разными или одинаковыми настройкками, на произвольных таймфреймах и т.п.

Необходимо:

Найти способ для каждой запущенной копии индикатора сгенерировать свой ключ (строка, число) для установления связи между этой конкретной копией индикатора и внешним ПО. Основная проблема — получение внешним ПО информации о закрытии индикатора (тем или иным способом), закрытии терминала и корректная работа при перезапуске индикатора (например в режиме связанных окон).

Допустимы любые быстрые способы — средства терминала, winapi и так далее. У меня не хватает фантазии пока.

Спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

02.04.2018 14:48:54

Здравствуйте.

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

насколько я могу предположить, что после обновления окна идентификатор остается тем же и функция Setlabelparams должна метку найти и переставить. если запрос setlabelparams происходит в момент обновления окна, там может произойти что-то неясное и, как я думаю, происходит. Но что?  

Каков должен быть алгоритм работы по перестановке метки из скрипта посредством setlabelparams? чтобы он работал в режиме связанных окон?

Напоминаю также о ошибке, заключающейся в отсутствии вызова ondestroy индикатора в том же режиме связанных окон. Это серьезная проблема — невозможно исполнить финализацию (закрыть процессы, удалить файлы, отвязаться от апишных дел и прочего)

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

19.03.2018 08:24:20

Здравствуйте.

Что обусловлено отсутствие колбеков от Createdate source при условии, что последний вернул код успеха? Эффект проявляется при запуске терминала с работающим скриптом.

Эффект никогда не проявляется при запуске  скрипта при уже работающем терминале.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

15.03.2018 17:38:18

Недавно был добавлен колбен OnChangeSettings

Посмотрел.

Или я чего-то не понял, или вы добавили его так, что он бесполезен

Во первых, он не вызывается при старте индикатора. Но это обойти еще можно

Главное — он не вызывается при смене таймфрейма, что приводит его полной бесполезности .

Или я неправ?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

27.12.2017 23:38:45

Добрый день.

манипуляции со стоп заявками из луа подразумевают неявное «сделать стоп заявку своей» или нужно выписывать это явно?

спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

13.12.2017 12:23:03

У меня ещё несколько вопросов по этой функции.

1. Что происходит, если в момент обращения к функции нет соединения с сервером?

2. Будут ли запрашиваться данные с сервера после установления связи в пункте 1?

3. Что происходит с подпиской после смены сессии?

4. Что происходит с подпиской после выключения и включения терминала с работающим скриптом?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

12.12.2017 19:24:43

Обращаюсь к разработчикам.

Как узнать в индикаторе (OnCalculate), что обрабатывается самая правая свеча?

Хотелось бы получить ответ, который работает всегда )))

Спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

02.11.2017 16:03:01

Здравствуйте

id метки уникален в пределах окна (панели), диаграммы или терминала?

Спасибо.

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

 

s_mike@rambler.ru


Пользователь

Сообщений: 1519
Регистрация: 30.01.2015

#

27.10.2017 11:22:09

Кусочек текста скрипта,занимающегося обработкой таблицы обезличенных сделок:

Код
-- Собирает из ТОС новые обезличенные сделки
   rescan =
      function()
         if not database.need_tos_rescan then
            return
         end

         local num_trades = getNumberOf("all_trades") - 1
         local items = SearchItems("all_trades",
                    database.tos + 1,
                    num_trades,
                    database.search_function,
                    "class_code,sec_code,datetime.day,datetime.month,datetime.year"
                   ) or {}
         database.tos = num_trades

         for _,n in ipairs(items) do
            database.process_trade(getItem("all_trades",n))
         end

         database.save()
      end,

   ---------------------------------------------------------------
   -- Обработка одной сделки
   process_trade =
      function(trade)
         log.write(trade)
         local trade_datetime = datetime(trade.datetime)

что мы тут имеем?

rescan() получает новые сделки из ТОС и для каждой вызывает обработчик process_trade
первое действие в process_trade есть вывод в лог самой сделки
следующее действие — превращение времени сделки в некий объект.

Время от времени (закономерность неясна) последнее действие приводит к развалу скрипта по причине недопустимых данных в datetime сделки.

Смотрим конец логфайла:

Код
8:44:57.500 {repoterm=0,price=111620,trade_num=1899010832,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010832,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440244}
18:44:57.562 {repoterm=0,price=111620,trade_num=1899010833,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010833,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440242}
18:44:57.703 {repoterm=0,price=111620,trade_num=1899010834,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010834,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240}
18:44:57.796 {repoterm=0,price=111610,trade_num=1899010835,yield=0,value=772272,qty=6,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010835,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240}
18:44:57.875 {repoterm=0,price=111620,trade_num=1899010836,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010836,flags=1025,datetime={week_day=4,hour=10,ms=405,mcs=405000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240}
18:44:58.093 {repoterm=0,price=0,trade_num=0,yield=0,value=0,qty=0,reporate=0,class_code=TQBR,repovalue=0,exchange_code=,accruedint=0,tradenum=0,flags=0,datetime={week_day=1,hour=0,ms=0,mcs=0,day=1,month=1,sec=0,year=1601,min=0},sec_code=ABRD,seccode=ABRD,settlecode=,period=0,repo2value=0,open_interest=0}

Все строчки абсолютно нормальные, а последняя выведенная очень интересна. Все поля нулевые, в том числе и datetime.
Соответственно, обработка datetime приводит к краху:

Код
E:quikLuaIndicatorsBS.lua:1085: Assert failed: /GoogleDisk/ROBOT/_LUA/datetime.lua : 106
Невозможно рассчитать Unix time: {week_day=1,hour=0,ms=0,mcs=0,year=1601,month=1,day=1,sec=0,min=0,isdst=false}
stack traceback:
   E:quikLuaIndicatorsBS.lua:1085: in function <E:quikLuaIndicatorsBS.lua:1074>
   (tail call): ?
   E:quikLuaIndicatorsBS.lua:1446: in function 'floor'
   E:quikLuaIndicatorsBS.lua:2563: in function 'process_trade'
   E:quikLuaIndicatorsBS.lua:2545: in function 'rescan'
   E:quikLuaIndicatorsBS.lua:2828: in function 'iterate'
   E:quikLuaIndicatorsBS.lua:1839: in function <E:quikLuaIndicatorsBS.lua:1802>

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

И собственно вопросы:

  1. Что это было?
  2. За что такое счастье?
  3. Как этого счастья избежать?

www.bot4sale.ru

Пасхалочка для Алексея Иванникова:

https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088

Перейти  
 

Страницы:
1
2
След.

pachela

    • Поделиться

Есть скрипт и этот скрипт косячит. А если быть точным, то он в упор отказывается видеть процесс. Вот код скрипта

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

function CEButton1Click(sender)

GameName = "notepad++.exe"
GameID = getProcessIDFromProcessName(GameName)


if(GemeID == nul) then
   showMessage("запустите процесс!")
   return
end

openProcess(GameName)


result = AOBScan(0xA0,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x86,0x01,0x00,0x00)
if(result == nul) then
   showMessage("сигнатура не рабочая!")
   return
end
cound = stringlist_getcount(result)
i = 0
while i~= cound do

address = stringlist_getcount(result,i)

writeBytes(address,0x60,0xE3,0x16,0x00)
end
showMessage("актевировано!")
end

Пока что не разбирал работоспособность скрипта дальше чем сообщение «Запустите процесс!». Что я делаю не так?

П.с. Как использовать фуркцию memrec_freeze? Мне нужно что бы запись байт происходила в цикле, т.е. заморожено =).

// Пользуемся тегами кода и спойлера (если код большой). Garik66. Пока устное предупреждение.

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

Garik66

    • Поделиться

2 часа назад, pachela сказал:

то он в упор отказывается видеть процесс

Попробуй первую часть скрипта переписать так:

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

function CEButton1Click(sender)

GameName = "notepad++.exe"
GameID = getProcessIDFromProcessName(GameName)


if(GemeID == nil) then
   showMessage("запустите процесс!")
   
   openProcess(GameName)
end

-- дальше код я не смотрел Garik66

result = AOBScan(0xA0,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x86,0x01,0x00,0x00)
if(result == nul) then
   showMessage("сигнатура не рабочая!")
   return
end
cound = stringlist_getcount(result)
i = 0
while i~= cound do

address = stringlist_getcount(result,i)

writeBytes(address,0x60,0xE3,0x16,0x00)
end
showMessage("актевировано!")
end

И второе — ты уверен в своей сигнатуре?

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

pachela

  • Автор
    • Поделиться

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

Попробуй первую часть скрипта переписать так:

  Скрыть содержимое

function CEButton1Click(sender)

GameName = "notepad++.exe"
GameID = getProcessIDFromProcessName(GameName)


if(GemeID == nil) then
   showMessage("запустите процесс!")
   
   openProcess(GameName)
end

-- дальше код я не смотрел Garik66

result = AOBScan(0xA0,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x86,0x01,0x00,0x00)
if(result == nul) then
   showMessage("сигнатура не рабочая!")
   return
end
cound = stringlist_getcount(result)
i = 0
while i~= cound do

address = stringlist_getcount(result,i)

writeBytes(address,0x60,0xE3,0x16,0x00)
end
showMessage("актевировано!")
end

И второе — ты уверен в своей сигнатуре?

1. Можно на русском, что делает openProcess()? Он создает процесс или переключается на него?

2. Сигнатура на 100% нужная. Первые 4 байта дублируются в конце сигнатуры всегда. Был бы код не на Луа, а на «С», при использовании патерна, я бы с 13 байта и по 0хА0 поставил бы «?», т.к. эти байты при определенных условиях могут изменяться. Но для начала нужно разобраться с «топорной» сигнатурой и не допускать изменения наличной сигнатуры. Т.е. пока я не захочу, эта сигнатура будет иметь именно такой вид.

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

SnedS91

    • Поделиться

53 минуты назад, pachela сказал:

1. Можно на русском, что делает openProcess()? Он создает процесс или переключается на него?

2. Сигнатура на 100% нужная. Первые 4 байта дублируются в конце сигнатуры всегда. Был бы код не на Луа, а на «С», при использовании патерна, я бы с 13 байта и по 0хА0 поставил бы «?», т.к. эти байты при определенных условиях могут изменяться. Но для начала нужно разобраться с «топорной» сигнатурой и не допускать изменения наличной сигнатуры. Т.е. пока я не захочу, эта сигнатура будет иметь именно такой вид.

Уважаемый pachela. Имею смелость заметить, что вы используете какой то заведомо «рабочий» код, изменив его под себя, не понимая сути. Мы лишь можем направить или указать на ошибки в общем случае.

Во-первых, советую ознакомиться с синтаксисом (в данном случае Lua) и обратить внимание на опечатки в коде.

Во-вторых, все инструкции CE используемые в Lua описываются подробно в файле main.lua, находящимся в корневой папке с Cheat Engine.

В-третьих, использовать «??» в сигнатуре до сих пор возможно. 


Изменено 7 февраля, 2017 пользователем SnedS91


  • Плюс


    2

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

pachela

  • Автор
    • Поделиться

2 минуты назад, SnedS91 сказал:

Уважаемый pachela. Имею смелость заметить, что вы используете какой то заведомо рабочий код, изменив его под себя, не понимая сути. Данный форум не является справочником, как это оговаривалось где-то ранее, мы лишь можем направить или указать на ошибки в общем случае.

Во-первых, советую ознакомиться с синтаксисом (в данном случае Lua) и обратить внимание на опечатки в коде.

Во-вторых, все инструкции CE используемые в Lua описываются подробно в файле main.lua, находящимся в корневой папке с Cheat Engine.

В-третьих, использовать «??» в сигнатуре до сих пор возможно. 

Уважаемый SnedS91 код приведенный мной ранее действительно взят как по идее рабочий из видеомануала по созданию сего именно кода. И потому то я понимаю, что в коде для чего нужно. Но вот беда в том, что работоспособность кода на видео не была показана!!!

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

По поводу возможности использовать в Луа сигнатуры с «??» нигде не встречал, посему и предположил что нельзя!

Ну и в конце концов: Почему на офф-форуме СЕ люди подсказывают, помогают и объясняют, а тут только предлагают платные услуги и тыкают носом?

Я не прошу написать мне сложную программу с кучей функций, GUI, БлекДжеком и проститутками, а всего навсего прошу подсказать где допущена ошибка, как ее исправить и как лучше внести коррекцию кода под себя. Человек который понимает в Луа, Си и хорошо знаком с СЕ, может решить эту задачку за 2 минуты! Я же возможно и могу решить эту задачку под посторонних подсказок, только на это уйдет уже не 2 минуты и скорее всего не 2 дня.

Я уже давно не школьник, имею жену и ребенка. У меня нет такой роскоши как безграничное время! Лучше же когда мне знающий человек подскажет, я погляжу где я был не прав, сделаю выводы, положу полученное знание на полочку и перейду на следующую ступень, со следующим заданием и новой трудностью, которую возможно я решу сам, а возможно буду снова спрашивать «гуру».

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

Vlad2

    • Поделиться

Можно поробовать так openProcess(GameID)

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

Vlad2

    • Поделиться
if(GemeID == nul) then

if (GameID == nil) then

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

SnedS91

    • Поделиться

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

Кроме того в Lua есть возможность использовать aobscan более удобным способом, т.е. не набором байт, а строкой, к примеру:

AOBScan('A0 86 01 ?? 00') //можно и без пробелов 

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

SnedS91

    • Поделиться

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

function CEButton1Click(sender)
	GameName = "notepad++.exe"
	
	if(openProcess(GameName) == nil) then
	   showMessage("запустите процесс!")
	   return
	end

	result = AOBScan('тут свои байты')
	if(result == nil) then
	   showMessage("сигнатура не рабочая!")
	   return
	end
	count = result.Count
	i = 0
	while i~= count do
		address = result.getString(i)
		writeBytes(address,{0x60,0xE3,0x16,0x00})
		i = i + 1
	end
	showMessage("активировано!")
end

Возможно в таком виде тебя устроит скрипт :)


Изменено 7 февраля, 2017 пользователем SnedS91

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

MasterGH

    • Поделиться

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

1. Можно на русском, что делает openProcess()? Он создает процесс или переключается на него?

Это подключение к процессу, как Attach to proccess. Процесс уже должен быть запущен.

Если нужно создать процесс и сразу подлючитья к нему, то

Цитата

createProcess(path, parameters OPTIONAL, debug OPTIONAL, breakonentrypoint OPTIONAL) : Creates a process. If debug is true it will be created using the windows debugger and if breakonentry is true it will cause a breakpoint to occur on entrypoint

Пример

createProcess('D:\test.exe')

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

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

pachela

  • Автор
    • Поделиться

В 07.02.2017в13:54, Vlad2 сказал:

if(GemeID == nul) then

if (GameID == nil) then

Спасибо. Действительно в исходнике который я выставил в начале темы было несколько недоделок. первая, это опечатки на которые как раз ты и указал. Сделал я эту ошибку т.к. когда просматривал видео, сразу пытался и писать код, а в видео автор сказал именно Нул! Это меня не удивило, т.к., по моему, в С+ есть Нул. Вторая недоделка это та, что автор видео в другом своем уроке сказал что в прошлом видео ошибся и забыл добавить openProcess(GameName).

В 07.02.2017в14:00, SnedS91 сказал:

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

Кроме того в Lua есть возможность использовать aobscan более удобным способом, т.е. не набором байт, а строкой, к примеру:

AOBScan('A0 86 01 ?? 00') //можно и без пробелов 

Это хорошо. И тут же сразу вопрос такой, имеет ли разница в скобочках? Двойные или одинарные ставятся? И еще, а можно ли в байтах обозначенных «??» ставить варианты, ну типа есть вариант что примерт такой вид или иной, но не совершенно иной? Возможно в виде переменной это обозначать? Ну это просто из любознательности, на последний вопрос можно ответить кратко: Да или Нет. И за это будет большое спасибо.

Представленный тобой скрипт работает отлично! Спасибо большое.

В 07.02.2017в18:14, MasterGH сказал:

Это подключение к процессу, как Attach to proccess. Процесс уже должен быть запущен.

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

Вот код который у меня вышел в результате, но я снова накосячил

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

function CEButton1Click(sender)
	GameName = "notepad++.exe"

	if(openProcess(GameName) == nil) then
	   showMessage("запустите процесс!")
	   return
	end

	result = AOBScan('A0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0 86 01 00')
	if(result == nil) then
	   showMessage("сигнатура не рабочая!")
	   return
	end
	count = result.Count
	i = 0
	while i~= count do
		address = result.getString(i)
		writeBytes(address,0xC0, 0x5C, 0x15, 0x00)
		i = i + 1
	end
	while true do
		res2 = readInteger(address)
		if(res2 == 1400000) then
		Sleep(50)
		end
		if not(res2 == 1400000) then
		writeBytes(address,0xC0, 0x5C, 0x15, 0x00)
		end
	end
end

Код работает нормально, если не считать того печального факта, что СЕ со скриптом виснет наглухо. Я так понимаю что в конце нужно оставить только условие If not, а просто if убрать?

// Читаем правила (особенно пункт 1.3 ) Garik66

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

pachela

  • Автор
    • Поделиться

Такс. Ну вот бороздя просторы большого ютубо-гугла я нашел причину почему трейнер вешается при активации, а точнее решение. Это запускать сканирование в потоки. Как я понял, то у меня должен быть 1 поток. Сначала 1 поток сканирует сигнатуру и записывает адрес. Далее поток освобождается и мы можем снова его использовать, что бы запустить цикл перезаписи, если изменяется значение в адресе.

Я все правильно понял?

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

horror113

    • Поделиться

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

function CEButton1Click(sender)
if (getProcessIDFromProcessName('notepad.exe')==nil) then
messageDialog("Запустите игру...",-1,0)
return end
openProcess('notepad.exe')
potok = createNativeThread(potokF)
end

function potokF(senderThread)
results=AOBScan("3F 00 00 00 00 00 00 E0"  ,"*W*C*X")
if (results==nil) then
messageDialog("Сигнатура не найдена...",-1,0)
return end
count=stringlist_getCount(results)
for i = 0, (count-1), 1 do
address =stringlist_getString(results,i)
writeBytes(address,0x20, 0xF2, 0x0F, 0x59, 0xC9, 0x90, 0x90, 0x90)
end
messageDialog("Чит активирован!.",-1,0)
end

такой код устроит с потоком?

// Читаем правила (особенно пункт 1.3 ) Garik66

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

SnedS91

    • Поделиться

2 часа назад, pachela сказал:

Это хорошо. И тут же сразу вопрос такой, имеет ли разница в скобочках? Двойные или одинарные ставятся? И еще, а можно ли в байтах обозначенных «??» ставить варианты, ну типа есть вариант что примерт такой вид или иной, но не совершенно иной? Возможно в виде переменной это обозначать? Ну это просто из любознательности, на последний вопрос можно ответить кратко: Да или Нет. И за это будет большое спасибо.

Представленный тобой скрипт работает отлично! Спасибо большое.

«??» или «xx» обозначение неизвестного байта. Переменную можно в принципе использовать, получится что-то вроде подстановки в шаблон.

36 минуты назад, pachela сказал:

Такс. Ну вот бороздя просторы большого ютубо-гугла я нашел причину почему трейнер вешается при активации, а точнее решение. Это запускать сканирование в потоки. Как я понял, то у меня должен быть 1 поток. Сначала 1 поток сканирует сигнатуру и записывает адрес. Далее поток освобождается и мы можем снова его использовать, что бы запустить цикл перезаписи, если изменяется значение в адресе.

Я все правильно понял?

Можно не использовать явно потоки, а создать таймер, например:

tmr = createTimer(nil,true)
function check()
 print('test') --тут свое сравнение и запись байт
end
tmr.setOnTimer(check)
tmr.setInterval(200)

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

Garik66

    • Поделиться

17 час назад, pachela сказал:

1. Можно на русском, что делает openProcess()? Он создает процесс или переключается на него?

Подключается к процессу, если тот уже запущен. 

Если хочешь, чтобы трейнер не только подключался к процессу, но и запускал ну например тот же блокнот, можно сделать например так:

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

GameName = "notepad++.exe"
GameID = getProcessIDFromProcessName(GameName)

if(GemeID == nil) then
   showMessage("Процесс не запущен!Нажмите ОК! - ЗАПУЩУ :)")
   shellExecute('D://Notepad++/notepad++.exe/')   -- здесь поменяй путь к икзешнику на свой.
   sleep '1000'

   openProcess(GameName)
   showMessage("Процесс подключен! Работайте.")
end

17 час назад, pachela сказал:

2. Сигнатура на 100% нужная.

Если твоя сигнатура рабочая, то должен работать простейший АА-скрипт:

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

[ENABLE]
aobscanmodule(INJECT,notepad++.exe,A0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0 86 01 00 00)
registersymbol(INJECT)
INJECT:
  db 60 E3 16 00 00 00 00 00

[DISABLE]
INJECT:
  db A0 86 01 00 00 00 00 00

unregistersymbol(INJECT)

который будет делать, то что ты хотел:

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

В 06.02.2017в13:43, pachela сказал:

4. Детальное описание работы:
Программа должна по нажатию на кнопку находить уникальный массив байт (A0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0 86 01 00 00) в приложении NotePad++ и внести изменения в начало найденого массива на (60 E3 16 00 00 00 00 00) Последние нули обязательны!!! Изменение должно быть заморожено, с частотой обновления заморозки 50-100мс.

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

Vlad2

    • Поделиться

Насколько я помню нужно везде ставить два слэша

shellExecute('D://Notepad++/notepad++.exe/')

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

srg91

    • Поделиться

3 hours ago, Vlad2 said:

Насколько я помню нужно везде ставить два слэша

shellExecute('D://Notepad++/notepad++.exe/')

Если я правильно понимаю про что вы, два слеша требуются только в случае обратного слеша — «» дабы экранировать символ экранирования:

shellExecute('D:\Notepad++\notepad++.exe')

В случае прямого слеша он требуется только один:

shellExecute('D://Notepad++/notepad++.exe')

Плюс можно использовать двойные квадратные скобки:

shellExecute([[D:Notepad++notepad++.exe]])


Изменено 8 февраля, 2017 пользователем srg91

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

pachela

  • Автор
    • Поделиться

На сегодня для меня самый подходящий код вышел вот такой вот:

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

function CEButton1Click(sender)
if (getProcessIDFromProcessName('notepad++.exe')==nil) then
messageDialog("Запустите игру...",-1,0)
return end
openProcess('notepad++.exe')
potok = createNativeThread(potokF)
end

function potokF(senderThread)
results=AOBScan("0000000050C30000000000000000000000000000000000000000000050C300000000000000000000002F4375"  ,"*W*C*X")
  if (results==nil) then
  messageDialog("Сигнатура не найдена...",-1,0)
  return end
count=stringlist_getCount(results)
for i = 0, (count-1), 1 do
address =stringlist_getString(results,i)
writeBytes(address,0xC0,0x5C,0x15,0x00,0x80,0xC3,0xC9,0x01)
end
   while true do
			writeBytes(address,0xC0,0x5C,0x15,0x00,0x80,0xC3,0xC9,0x01)
            sleep(250)
	end
end

Одна проблема у него. Когда я генерирую трейнер и закрываю СЕ, то он не может найти сигнатуру! Хотя во время проверки в СЕ все идеально работает.

Я предполагаю следующее: В СЕ включены инструменты ядра. В трейнере же я не включаю их. Может из-за этого быть косяк?

// Читаем правила (особенно пункт 1.3 ) Garik66

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

SnedS91

    • Поделиться

Не думаю что в этом проблема, попробуй убрать следующее

  ,"*W*C*X"

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

pachela

  • Автор
    • Поделиться

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

Не думаю что в этом проблема, попробуй убрать следующее

  ,"*W*C*X"

не. Не в этом дело. Оно как то сразу после нажатия на кнопку пишет что сигнатура не та. Даже не ищет, просто клац на кнопку, а он говорит фига! Попробовал вписать dbk_initialize(true). Но наверно эт не правильно. Хотя драйвер загрузило. Так же вместо OpenProcess использовал dbk_useKernelmodeOpenProcess(). Но походу тоже не правильно использовал. И я думаю что для полного набора инструментов нужно еще и dbk_useKernelmodeProcessMemoryAccess() использовать.

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

SnedS91

    • Поделиться

Раз говоришь, что обычный поиск дает результат, тогда скажи какая память сканируется? Т.е. каким образом выставлены флаги CgI6YQ_qBEY.jpg

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

pachela

  • Автор
    • Поделиться

2 минуты назад, SnedS91 сказал:

Раз говоришь, что обычный поиск дает результат, тогда скажи какая память сканируется? Т.е. каким образом выставлены флаги CgI6YQ_qBEY.jpg

Точно так как у тебя. Если зайти в настройки СЕ, «Дополнительно» и выключить нижние 3 галочки (первая у меня не включена, почему то включение этой галочки приводит к BSOD), то поиск вообще ничего не даст. Он не находит никаких значений вообще!!! Когда я пишу трейнер, то использую СЕ с включенными инструментами ядра и потому когда тестирую трейнер все пашет, а когда компилю, то инструменты ядра я не использую. Вот почему я думаю что из-за этого косяк.

Но опыта у меня в этом маловато, потому прислушиваюсь к вашим словам.

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

SnedS91

    • Поделиться

Попробуй убрать в настройках те галочки, перезапустить СЕ, потом убрать галку в главном окне с Writable (это для того чтобы не использовать CE Kernel). Найдется ли в таком случае сигнатура?

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

pachela

  • Автор
    • Поделиться

14 минуты назад, SnedS91 сказал:

Попробуй убрать в настройках те галочки, перезапустить СЕ, потом убрать галку в главном окне с Writable (это для того чтобы не использовать CE Kernel). Найдется ли в таком случае сигнатура?

Поиск сразу заканчивается и ничего не находит.

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

horror113

    • Поделиться

папробуй вставить этот скрипт

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

local FLAGS_OFFSET=0x450


dbk_initialize() 
dbk_useKernelmodeOpenProcess() 
dbk_useKernelmodeProcessMemoryAccess() 


openProcess(getOpenedProcessID())

local list=createStringlist() 
getThreadlist(list)

local i 
for i=0, list.count-1 do 
  local tid=tonumber('0x'..list[i]) 
 
  local PEThread=dbk_getPEThread(tid) 
  local PEThread_Flags=PEThread+FLAGS_OFFSET 

 
  local flags=readBytes(PEThread_Flags,1) 
  if bAnd(flags,4)==4 then

    flags=bAnd(flags,0xfb)
    writeBytes(PEThread_Flags, flags) 
  end 

end 

list.destroy() 

// Читаем правила (особенно пункт 1.3 ) Garik66

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

У меня есть следующая функция, которая отлично работает, пока я даю ей действительную команду для выполнения. Как только я даю ему несуществующую команду, сценарий прерывается с сообщением об ошибке.

#!/usr/bin/lua
function exec_com(com)
    local ok,res=pcall(function() return io.popen(com) end)
    if ok then
        local tmp=res:read('*a')
        res:close()
        return ok,tmp
    else
        return ok,res
    end
end
local st,val=exec_com('uptime')
print('Executed "uptime" with status:'..tostring(st)..' and value:'..val)
st,val=exec_com('zzzz')
print('Executed "zzzz" with status:'..tostring(st)..' and value:'..val)

Когда я запускаю скрипт выше, я получаю следующий вывод:

Executed "uptime" with status:true and value: 18:07:38 up 1 day, 23:00,  3 users,  load average: 0.37, 0.20, 0.20

sh: zzzz: command not found
Executed "zzzz" with status:true and value:

Вы можете ясно видеть выше, что функция pcall() по-прежнему сообщает об успехе при выполнении «zzzz», что странно.

Может ли кто-нибудь помочь мне разработать способ перехвата исключения при выполнении несуществующей или неправильно сформированной команды Linux с использованием сценария Lua? Спасибо.

Изменить: повторил мой запрос после получения разъяснения о том, что pcall() работает должным образом, и проблема связана с тем, что popen() не выдает ошибку.

4 ответа

Я использую метод, похожий на ваш «временный обходной путь», но который дает вам больше информации:

local cmd = "uptime"
local f = io.popen(cmd .. " 2>&1 || echo ::ERROR::", "r")
local text = f:read "*a"

if text:find "::ERROR::" then
  -- something went wrong
  print("error: " .. text)
else
  -- all is fine!!
  print(text)
end


3

Niccolo M.
15 Июн 2014 в 11:44

Если вы посмотрите на io.popen(), вы увидим, что он всегда возвращает дескриптор файла.

Запускает программу prog в отдельном процессе и возвращает дескриптор файла которые вы можете использовать для чтения данных из этой программы (если режим "r", по умолчанию) или для записи данных в эту программу (если режим "w").

Поскольку возвращаемый дескриптор файла по-прежнему является допустимым значением для lua, pcall(), ваша локальная функция внутри pcall возвращает истинное значение (и ошибка не распространяется); таким образом, давая вам истинный статус и никаких результатов.


2

hjpotter92
15 Июн 2014 в 05:26

Я придумал свой собственный временный обходной путь, который передает ошибку в /dev/null и определяет успех/неудачу выполненной команды на основе текста, полученного от команды io.popen():read('*a').

Вот мой новый код:

#!/usr/bin/lua
function exec_com(com)
    local res=io.popen(com..' 2>/dev/null')
    local tmp=res:read('*a')
    res:close()
    if string.len(tmp)>0 then
        return true,tmp
    else
        return false,'Error executing command: '..com
    end
end
local st,val=exec_com('uptime')
print('Executed "uptime" with status:'..tostring(st)..' and value:'..val)
st,val=exec_com('cat /etc/shadow')
print('Executed "cat /etc/shadow" with status:'..tostring(st)..' and value:'..val)

И соответствующий вывод теперь правильный:

Executed "uptime" with status:true and value: 00:10:11 up 2 days,  5:02,  3 users,  load average: 0.01, 0.05, 0.19
Executed "cat /etc/shadow" with status:false and value:Error executing command: cat /etc/shadow

В моем примере выше я создаю «общее» описание ошибки. Это промежуточное исправление, и мне все еще интересно увидеть альтернативные решения, которые могут возвращать более осмысленное сообщение об ошибке, описывающее, почему команду не удалось выполнить.


2

Temperage
15 Июн 2014 в 08:19

Вместо того, чтобы тратить время на чтение всего файла в переменную, почему бы просто не проверить, пуст ли файл с помощью f:read(0)?

Local f = io.popen("NotExist")

if not f:read(0) Then
    for l in st:lines() do
        print(l)
    end
else
    error("Command Does Not Exist")
end

Из руководства lua: В частном случае функция io.read(0) работает как проверка конца файла: она возвращает пустую строку, если нужно прочитать еще, или ноль в противном случае.


0

Bilgus
13 Авг 2017 в 17:35

Многие игроки World of Warcraft жалуются на появление ошибок LUA при запуске игры. В сообщении таких ошибок обычно указывается, что некоторые из аддонов работают не совсем корректно. Ошибки не препятствуют игровому процессу, однако их постоянное появление в чат-боксе может изрядно раздражать. Windows 7, 8 и 10 — от этих ошибок страдают пользователи всех современных версий ОС Майкрософт.

Содержание

  • Что такое LUA?
  • Как исправить LUA-ошибку в World of Warcraft
    • Метод №1 Перезагрузка игрового интерфейса WoW
    • Метод №2 Полный сброс интерфейса WoW и удаление аддон-менеджера
    • Метод №3 Сброс переменных кастомной консоли
    • Метод №4 Удаление аддона Cartographer (или любого другого устаревшего аддона)
    • Метод №5 Отключение сообщений ошибок LUA

Что такое LUA?

Прежде чем мы двинемся дальше, важно понять, что такое LUA и с чем его едят.

LUA — это скриптовый язык программирования, который привносит модулярность в самые разные приложения посредством эмбеддинга. LUA — излюбленный язык моддерского сообщества WoW, а все потому, что он относительно прост в освоении и с его помощью можно разрабатывать действительно впечатляющие модификации.

Ознакомившись с проблемой поближе, мы пришли к выводу, что LUA-ошибки в World of Warcraft могут возникать по следующему ряду причин:

  • Глитч/баг в работе аддона/файла интерфейса. Зачастую ошибки LUA возникают в результате некорректно работающих аддонов или файлов, относящихся к игровому интерфейсу WoW. Происходит это из-за «кривого» или неактуального кода модификаций. Начиная от перезагрузки интерфейса и заканчивая обновлением версии мода — решения самые разные.
  • «Битые» файлы аддон-менеджера. Если элементарная перезагрузка файлов не помогла, то можно попробовать осуществить полный сброс интерфейса WoW.
  • Остаточные переменные кастомной консоли. LUA-ошибку можно ожидать в том случае, если игрок запускает WoW с переменными кастомной консоли, относящимися с аддону, который давно был удален. Чтобы разрешить ситуацию, достаточно избавиться от этих переменных.
  • В WoW установлены устаревшие или более не поддерживаемые аддоны. Тут все довольно просто: в актуальной версии WoW установлены модификации, которые давно не обновлялись своими разработчиками или которые более не поддерживаются текущей версией игры. Либо обновляем аддоны, либо полностью удаляем их.

Как исправить LUA-ошибку в World of Warcraft

Метод №1 Перезагрузка игрового интерфейса WoW

Если ошибка возникла в результате бага или ситуации, когда не все аддоны загрузились вместе с WoW, вы должны легко избавиться от нее, выполнив перезагрузку интерфейса посредством консольной команды. Впрочем, стоит сразу предупредить, что ошибка практически наверняка является симптомом какой-то иной проблемы, например, устаревшего аддона, который отказывается нормально работать с текущей сборкой WoW.

Итак, чтобы перезагрузить интерфейс WoW, вам нужно просто открыть игровой чат (чат-бокс) и выполнить в нем следующую команду:

/reload

Заметка: этот метод не работает на самых последних версиях WoW, однако он должен сработать на «ванильной» версии.

Метод №2 Полный сброс интерфейса WoW и удаление аддон-менеджера

Если элементарная перезагрузка интерфейса не устранила ошибку LUA, то мы рекомендуем заняться полным сбросом интерфейса WoW, чтобы избавиться от всего ненужного кода, который мог остаться в вашей игре от ранее удаленного аддона или аддон-менеджера.

Также очень важно избавиться от используемого вами в данный момент (!) аддон-менеджера и файлов аддонов, расположенных в трех основных папках WoW.

  • Полностью закройте WoW и ее лаунчер (обязательно проверьте, не осталось ли процессов игры в диспетчере задач);
  • нажмите Win+R и выполните appwiz.cpl;
  • найдите в списке установленных программ аддон-менеджер WoW;
  • кликните ПКМ на менеджер и выберите «Удалить»;
  • выполняйте все инструкции перед вами, чтобы избавиться от аддон-менеджера;
  • перезагрузите компьютер;
  • перейдите в корневую папку World of Warcraft;
  • переименуйте следующие три папки:
    • Cache→Cache.Damaged
    • Interface→Interface.Damaged
    • WTF→WTF.Damaged
  • закройте все открытые окна и запустите WoW.

Проверьте, перестала ли появляться ошибка LUA или нет.

Метод №3 Сброс переменных кастомной консоли

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

Вот как производиться сброс переменных консоли WoW:

  • запустите WoW и откройте чат-бокс, когда это будет возможно;
  • выполните в чат-боксе следующие команды:
    • /console Cvar_reset
    • /console cvar_defaut

      Заметка: игнорируйте любые ошибки о правах после ввода этих команд — все нормально.

  • перезапустите WoW и проверьте, исчезла ли ошибка LUA.

Метод №4 Удаление аддона Cartographer (или любого другого устаревшего аддона)

Оказывается, LUA-ошибки можно получить в том случае, если вы запускаете WoW с устаревшими аддонами, которые больше не могут работать с текущей версией игры. Вам необходимо избавиться от всех устаревших аддонов, после чего снова зайти в игру и проверить, была ли решена проблема. Сразу хочется отметить, что каждый аддон удаляется по разному, а поэтому мы не сможем помочь вам с процессом деинсталляции. Интересный факт: зачастую ошибки LUA возникают из-за аддона Cartographer.

Метод №5 Отключение сообщений ошибок LUA

Если у вас не получается избавиться от надоедливых LUA-ошибок (или вы не можете определить причину их появления), то мы рекомендуем не заморачиваться и попросту отключить сообщения о них. Делается это следующим образом:

  • запустите WoW и откройте чат-бокс, когда появится такая возможность;
  • пропишите в чат-боксе команду /console scriptErrors 0 и нажмите Enter;
  • перезапустите WoW.

После этого вы гарантировано перестанете видеть ошибки LUA. Выполните команду /console scriptErrors 1, чтобы снова активировать функцию отображения сообщений об ошибках.

mam4939


    Автор темы

  • #1

ошибка
[ LUA ] Lua error: …ersamirZAppDataRoamingLegendwareScriptswwdwddd.lua:27: attempt to call field ‘register_callback’ (a nil value)
stack traceback:
…ersamirZAppDataRoamingLegendwareScriptswwdwddd.lua:27: in main chunk

XONCE1337


  • #2

Попробуй вместо Paint в калбеке on_paint

sublime_text


  • #3

Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

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

XONCE1337


  • #4

+ ты там не там функцию написал щас пк включу помогу

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

Тебе путь ошибки ничего не говорит?

elleqt


sublime_text


  • #6

Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Конкретно для лв — нет
Сам основной код — да хуй знает откуда он вообще

+ ты там не там функцию написал щас пк включу помогу

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

elleqt


  • #7

Портануть любой дурак сможет. Не принимай кредиты скрипта на себя если не ты его сделал

XONCE1337


  • #8

Конкретно для лв — нет
Сам основной код — да хуй знает откуда он вообще

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

Чел ты даже писал на какой софт когда в ошибке написано /Legendware

sublime_text


  • #9

Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Чел ты даже писал на какой софт когда в ошибке написано /Legendware

Чё, причем тут вообще код ошибки и надпись легендвар, когда вместо register_callback нужно написать add_callback и заменить paint на on_paint..

XONCE1337


  • #10

Попробуй вместо Paint в калбеке on_paint

Ладно так и расскажешь

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Недопустимая ссылка консолидации excel ошибка
  • Недопустимая операция ошибка доступа к административному ресурсу secret net