вопрос по скрипту.

  • Гость, поучаствуй в создании лаунчера! Напиши те скрипты, которые считаешь базой для удобной игры. Принять участие!
  • Привет! Если твой основной форумник заблокирован - ты можешь оставить заявку в этом разделе: Нажми на меня!, НЕ создавая новый форумный аккаунт.
  • Гость, командой модераторов был запущен летний конкурс на красивое оформление топиков!
    Принять участие можно по ссылке!
Статус
В этой теме нельзя размещать новые ответы.

ЕБАИНИН МАУ

андерграунд против чепухи
Автор темы
1,661
21,270
Всем кискам кис, всем пискам пис. Давеча колупался на форуме, наткнулся на такую вот темку:

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

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

1) во-первых, цикл почему-то выполняется только раза два или три. В дальнейшем, при выполнении условия chatTable==%количество строк% он отказывается выполняться, хотя лог мунлоадера пустой и скрипт продолжает работать.
2) во-вторых, появилось жгучее желание совместить этот скрипт, и /sss, чтобы при достижении N строк скрипт делал /blind и чистил чат. Причем желательно это реализовать через эмуляцию клавиши F8, а не триггером функции скриншота, потому что триггер этой функции почему-то не триггерит screenshot.asi.
3) ну и прикрутить менюшку с режимами (автофаст/автоблайнд), может быть еще и сделать (де-)активацию по кнопке.

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

Upd: чета я загнул. Хотя бы проблему с циклом решить
 
Решение
memory.setuint8(screenshotAddress, 1)
screenshot.asi предоставляет модуль для создания скриншотов, лучше его используй

1743617749894.png

кстати, эта строчка (в твоем коде) практически тоже самое что и reinterpret_cast<void(__stdcall*)()>(sampGetBase() + 0x63DA)()
1743617513851.png
(код выше выполняется в цикле, g_bTakeScreenshot = SAMP_BASE + 0x119CBC)

function clearChat() for i = 1, 99 do sampAddChatMessage('', -1) // короче, я так понимаю, основной затуп случается вот здесь, поскольку я забиваю пустыми сообщениями...

defaultzone

Постоянный
Game Admin
Game Helper's
256
1,652
потому что, вероятно, способ делания скриптов немного пугает игру, и она их не хочет делать.
скриншот там делается с помощью вызова функции из сампа напрямую, а в сампе (что использует функцию IDirect3DDevice9::GetFrontBufferData, которая по умолчанию выполняется очень медленно, и не должна использоваться ни в одном критическом для производительности пути) это сделано плохо (а еще, кстати, при каждом скриншоте происходит утечка памяти) и лучше использовать упомянутый тобой screenshot.asi или сделать свою функцию для создания скриншота

Если нужен будет измененный скрипт, скину свой говнокод ближе к вечеру. Там ничего интересного на самом деле, я просто вытащил пару функций из скрипта медведя🐻 и сделал так, чтобы они триггерились не по нажатию клавиши, а по достижении N строк в чате.
скинь код, посмотрю
 
Последнее редактирование:

ЕБАИНИН МАУ

андерграунд против чепухи
Автор темы
1,661
21,270
скриншот там делается с помощью вызова функции из сампа напрямую, а в сампе (что использует функцию IDirect3DDevice9::GetFrontBufferData, которая по умолчанию выполняется очень медленно, и не должна использоваться ни в одном критическом для производительности пути) это сделано плохо (а еще, кстати, при каждом скриншоте происходит утечка памяти) и лучше использовать упомянутый тобой screenshot.asi или сделать свою функцию для создания скриншота


скинь код, посмотрю
покни как код скинешь, поправим
короче я сделал таким макаром (взял отсюдова)

Код:
require("moonloader")

local sampev = require("samp.events")
local memory = require("memory")
local ffi = require("ffi")
local chatTable = {}

function sampev.onServerMessage(color, text)
    table.insert(chatTable, text)
end

function main()
    while not isSampAvailable() do wait(0) end

    while true do
        wait(0)
        if #chatTable == 12 then // поменял на 12 строк, мне так чуть удобнее
        disableHUDAndRadar()
            wait(200)
            takeScreenshot()
            wait(200)
            enableHUDAndRadar()
        clearChat()

            chatTable = {}
        end
    end
end

// представленные ниже функции, как и логика их применения взяты из скрипта медведя потому что он а) рабочий и б) совместим со
// screenshot.asi

function disableHUDAndRadar()
    displayHud(false)
    -- 2 - radar ne active
    writeMemory(12216172, 1, 2, true)
end

function enableHUDAndRadar()
    displayHud(true)
    -- 0 - radar active
    writeMemory(12216172, 1, 0, true)
end

function takeScreenshot()
    local screenshotAddress = sampGetBase() + 0x119CBC
    if screenshotAddress then
        memory.setuint8(screenshotAddress, 1)
    else
        sampAddChatMessage("Ошибка: невозможно создать скриншот.", 0xFF0000)
    end
end

function clearChat()
    for i = 1, 99
    do sampAddChatMessage('', -1) // короче, я так понимаю, основной затуп случается вот здесь, поскольку я забиваю пустыми сообщениями все 64 доступные строки
        end
end

Работает ли оно? Да, оно работает:




(( на этом скрине 12 строк. одну сожрал RPChat ))

Но работает только дважды-трижды. Дальше сколько не тереби -- ноль эффекта. Даже после чистки через чат++


надо понимать что я не бог весть какой программист, за плечами у меня семестр на плюсах, самоподготовка к ЕГЭ на паскале и сдача этого самого ЕГЭ на 40 баллов при проходных 40. только вот было сие 10 лет назад, поэтому сильно тапками не бейте.
 
Последнее редактирование:

ЕБАИНИН МАУ

андерграунд против чепухи
Автор темы
1,661
21,270
не особо понял что ты хочешь сделать, типо чтобы он скриншотил, вырубал худ, очищал чат, врубал худ и это нажатием по кнопке f8 или как?
смотри. я нашел скрипт, который дефолтзона сделал тыщу лет назад. работает он по принципу:
1) набирается X строчек в чате
2) делается скриншот (просто скриншот)
3) чистится чат
4) повторяется до бесконечности.

однако скрипт сделан несколько на иных переменных функциях и et cetera. я взял рабочий скрипт, абсолютно точно рабочий, и заменил функции оригинала, подставив функции нужные мне. по сути я попытался сделать авто-фаст СС, который будет работать не на кнопку, а автоматически, по достижении X строк, да еще и сам мне чат почистит.

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

причем затуп именно что где-то в районе чата. если его исправить, я смогу сделать не только авто-фаст СС, но и автоблайнд (или авто /sss), который при достижении X строк в чате выдаст нужный мне /pagesize, /fontsize (который я в него забью, вероятно ручками, потому что делать большой скрипт с ГУИ я абсолютно точно не вывезу), заскринит /blind, вернет все обратно и так по кругу.

оригинал если что вот: https://forum.gambit-rp.ru/threads/439364/post-5303080
 

defaultzone

Постоянный
Game Admin
Game Helper's
256
1,652
memory.setuint8(screenshotAddress, 1)
screenshot.asi предоставляет модуль для создания скриншотов, лучше его используй

1743617749894.png

кстати, эта строчка (в твоем коде) практически тоже самое что и reinterpret_cast<void(__stdcall*)()>(sampGetBase() + 0x63DA)()
1743617513851.png
(код выше выполняется в цикле, g_bTakeScreenshot = SAMP_BASE + 0x119CBC)

function clearChat() for i = 1, 99 do sampAddChatMessage('', -1) // короче, я так понимаю, основной затуп случается вот здесь, поскольку я забиваю пустыми сообщениями все 64 доступные строки end end
доступно 100 строк от сампа, проблем нет, но лучше использовать https://www.blast.hk/threads/13380/post-185493, что собственно используется мною тут https://forum.gambit-rp.ru/threads/439364/post-5303080

попробуй это:

JavaScript:
local screenshot_available, screenshot = pcall(require, "screenshot")
local memory = require("memory")
local messages = 0

local function set_gui_state(state)
    displayHud(state)
    writeMemory(0xBA676C, 1, state and 0 or 2, true)
end

local function clear_chat()
    memory.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
    memory.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
    memory.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
end

local function take_screenshot()
    set_gui_state(true)
    wait(200)
    screenshot.request()
    wait(200)
    set_gui_state(false)
    clear_chat()
end

require("samp.events").onServerMessage = function(color, text)
    messages = messages + 1
    if messages == 12 and screenshot_available then
        lua_thread.create(take_screenshot)
        messages = 0
    end
end
 
Последнее редактирование:

ЕБАИНИН МАУ

андерграунд против чепухи
Автор темы
1,661
21,270
Итак.
screenshot.asi предоставляет модуль для создания скриншотов, лучше его используй

Посмотреть вложение 4189250

кстати, эта строчка (в твоем коде) практически тоже самое что и reinterpret_cast<void(__stdcall*)()>(sampGetBase() + 0x63DA)()
Посмотреть вложение 4189247
(код выше выполняется в цикле, g_bTakeScreenshot = SAMP_BASE + 0x119CBC)


доступно 100 строк от сампа, проблем нет, но лучше использовать https://www.blast.hk/threads/13380/post-185493, что собственно используется мною тут https://forum.gambit-rp.ru/threads/439364/post-5303080

попробуй это:

JavaScript:
local screenshot_available, screenshot = pcall(require, "screenshot")
local memory = require("memory")
local messages = 0

local function set_gui_state(state)
    displayHud(state)
    writeMemory(0xBA676C, 1, state and 0 or 2, true)
end

local function clear_chat()
    memory.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
    memory.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
    memory.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
end

local function take_screenshot()
    set_gui_state(true)
    wait(200)
    screenshot.request()
    wait(200)
    set_gui_state(false)
    clear_chat()
end

require("samp.events").onServerMessage = function(color, text)
    messages = messages + 1
    if messages == 12 and screenshot_available then
        lua_thread.create(take_screenshot)
        messages = 0
    end
end

Оно в теории работает. Но только в теории. Как можно видеть из непонятно почему засвеченного видео, по какой-то причине GUI не работает, а появляется при триггере, то есть ровно наоборот от заданного. При этом сам триггер работает прекрасно.


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

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


по итогу вышел вот такой вот говнокод.

Код:
local memory = require("memory")
local vkeys   = require 'vkeys'
local sampev = require("samp.events")
local ffi = require("ffi")
local chatTable = {}

function sampev.onServerMessage(color, text)
    table.insert(chatTable, text)
end

function disableHUDAndRadar()
    displayHud(false)
    -- 2 - radar ne active
    writeMemory(12216172, 1, 2, true)
end

function enableHUDAndRadar()
    displayHud(true)
    -- 0 - radar active
    writeMemory(12216172, 1, 0, true)
end

function takeScreenshot()
    local screenshotAddress = sampGetBase() + 0x119CBC
    if screenshotAddress then
        memory.setuint8(screenshotAddress, 1)
    else
        sampAddChatMessage("Ошибка: невозможно создать скриншот.", 0xFF0000)
    end
end

local function clearChat()
    memory.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
    memory.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
    memory.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
end

function main()
    while not isSampAvailable() do wait(0) end

    while true do
        wait(0)
        if #chatTable == 12 then
            -- вот сюда надо воткнуть wait(500)
            -- а сюда вывод текста о том, что щас вылетит птичка. либо же наоборот.
            -- с этим думаю разберусб
            disableHUDAndRadar()
            wait(200)
            takeScreenshot()
            wait(200)
            enableHUDAndRadar()
            clearChat()

            chatTable = {}
        end
    end
end

но главное что рабочий. *где-то здесь должен заиграть гимн Индии*.

далее уже буду развивать идею с авто-/sss, пытаться реализовать какой-нибудь ГУЙ.

L&A, решение отмечу за дефзоной.
 
Статус
В этой теме нельзя размещать новые ответы.