Взаимодействие с серверными диалогами

Franchesko111

Новичок
Автор темы
20
18
Версия MoonLoader
.026-beta
Хочу сделать смену спавна командой, а не выбором в меню и настройках, но возникла проблема. По команде спавн выставляется каждую секунду и не перестает, пока не выйдешь из игры. Как это можно исправить или сделать по-другому? С lua только начал разбираться, возможно вопрос глупый, но нигде не могу найти как это пофиксить.

Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sp1", setspawn1)
    sampRegisterChatCommand("sp2", setspawn2)
    while true do
        wait(0)
    end
end


function setspawn1()
  sampSendChat("/mm")
  function sampev.onShowDialog(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
        if dialogId == 10411 then
            sampSendDialogResponse(10411, 1, 2, -1)
            return false
        end
        if dialogId == 10414 then
            sampSendDialogResponse(10414, 1, 18, -1)
            return false
        end
        if dialogId == 1701 then
            sampSendDialogResponse(1701, 1, 0, -1)
            return false
        end
    end
end

function setspawn2()
  sampSendChat("/mm")
  function sampev.onShowDialog(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
        if dialogId == 10411 then
            sampSendDialogResponse(10411, 1, 2, -1)
            return false
        end
        if dialogId == 10414 then
            sampSendDialogResponse(10414, 1, 18, -1)
            return false
        end
        if dialogId == 1701 then
            sampSendDialogResponse(1701, 1, 1, -1)
            return false
        end
    end
end
 
Решение
Спасибо, почти то, что нужно, но опять же проблема.
Если оставить так же, т.е. return false, то после установки спавна диалогов нет, но перестают работать любые серверные команды (/mm /members /inv и другие). Если вместо return false поставить sampCloseCurrentDialogWithButton, то ее как будто нет (остается открытым диалог с настройками, т.е. эта функция будто не работает, все точно так же, как и без последнего условия).
А если поставить закрытие через sampSendDialogResponse, то 1 диалог закрывается, а второй (/mm) остается все равно, даже если ставить sampSendDialogResponse и на него.

Прости, если туплю, но я не могу понять почему они не могут закрыться через функции или почему после закрытия с return false перестают работать...

Kolbasa241

Известный
213
57
Хочу сделать смену спавна командой, а не выбором в меню и настройках, но возникла проблема. По команде спавн выставляется каждую секунду и не перестает, пока не выйдешь из игры. Как это можно исправить или сделать по-другому? С lua только начал разбираться, возможно вопрос глупый, но нигде не могу найти как это пофиксить.

Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sp1", setspawn1)
    sampRegisterChatCommand("sp2", setspawn2)
    while true do
        wait(0)
    end
end


function setspawn1()
  sampSendChat("/mm")
  function sampev.onShowDialog(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
        if dialogId == 10411 then
            sampSendDialogResponse(10411, 1, 2, -1)
            return false
        end
        if dialogId == 10414 then
            sampSendDialogResponse(10414, 1, 18, -1)
            return false
        end
        if dialogId == 1701 then
            sampSendDialogResponse(1701, 1, 0, -1)
            return false
        end
    end
end

function setspawn2()
  sampSendChat("/mm")
  function sampev.onShowDialog(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
        if dialogId == 10411 then
            sampSendDialogResponse(10411, 1, 2, -1)
            return false
        end
        if dialogId == 10414 then
            sampSendDialogResponse(10414, 1, 18, -1)
            return false
        end
        if dialogId == 1701 then
            sampSendDialogResponse(1701, 1, 1, -1)
            return false
        end
    end
end
Скорее всего при отправке пакета (sampSendDialogResponse) серверу, о том, что выбрана такая-то строка в диалоге, сервер открывает тебе ещё раз диалог, попробуй закрывать диалог после отправки пакета.

sampCloseCurrentDialogWithButton(1)
 

Franchesko111

Новичок
Автор темы
20
18
Скорее всего при отправке пакета (sampSendDialogResponse) серверу, о том, что выбрана такая-то строка в диалоге, сервер открывает тебе ещё раз диалог, попробуй закрывать диалог после отправки пакета.

sampCloseCurrentDialogWithButton(1)

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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,281
Lua:
local sampev = require 'samp.events'
local spawn = nil
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sp1", function() sampSendChat("/mm"); spawn = 0 end)
    sampRegisterChatCommand("sp2", function() sampSendChat("/mm"); spawn = 1 end)
    while true do
        wait(0)
    end
end

function sampev.onShowDialog(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
    if spawn ~= nil then
        if dialogId == 10411 then
            sampSendDialogResponse(10411, 1, 2, -1)
            return false
        end
        if dialogId == 10414 then
            sampSendDialogResponse(10414, 1, 18, -1)
            return false
        end
        if dialogId == 1701 then
            sampSendDialogResponse(1701, 1, spawn, -1)
            spawn = nil
            return false
        end
    end
end
 
  • Нравится
Реакции: Franchesko111

Franchesko111

Новичок
Автор темы
20
18
Lua:
local sampev = require 'samp.events'
local spawn = nil
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sp1", function() sampSendChat("/mm"); spawn = 0 end)
    sampRegisterChatCommand("sp2", function() sampSendChat("/mm"); spawn = 1 end)
    while true do
        wait(0)
    end
end

function sampev.onShowDialog(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
    if spawn ~= nil then
        if dialogId == 10411 then
            sampSendDialogResponse(10411, 1, 2, -1)
            return false
        end
        if dialogId == 10414 then
            sampSendDialogResponse(10414, 1, 18, -1)
            return false
        end
        if dialogId == 1701 then
            sampSendDialogResponse(1701, 1, spawn, -1)
            spawn = nil
            return false
        end
    end
end

Примерно так же тоже пробовал, но так возникает другая проблема: после установки спавна остается открытым диалог 10414 (который идет до выбора спавна). Уже не знаю что сделать, чтоб и спавн поставился и все диалоги закрылись(

В /mm выбирается настройки, там выбор спавна, и уже в третьем сам спавн, но после выбора спавна открывается опять диалог с настройками, а после его закрытия /mm

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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,281
Примерно так же тоже пробовал, но так возникает другая проблема: после установки спавна остается открытым диалог 10414 (который идет до выбора спавна). Уже не знаю что сделать, чтоб и спавн поставился и все диалоги закрылись(

В /mm выбирается настройки, там выбор спавна, и уже в третьем сам спавн, но после выбора спавна открывается опять диалог с настройками, а после его закрытия /mm

Казалось бы такой простой скрипт, а никак не могу добиться, чтоб все работало как надо 😦
Если нужно именно отправить закрытие серверу - замени return false в последнем условии в хуке на sampCloseCurrentDialogWithButton/sampSendDialogResponse
Lua:
local sampev = require 'samp.events'
local spawn = nil
local lastd = false
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sp1", function() sampSendChat("/mm"); spawn = 0 end)
    sampRegisterChatCommand("sp2", function() sampSendChat("/mm"); spawn = 1 end)
    while true do
        wait(0)
    end
end

function sampev.onShowDialog(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
    if spawn ~= nil then
        if dialogId == 10411 then
            sampSendDialogResponse(10411, 1, 2, -1)
            return false
        end
        if dialogId == 10414 then
            sampSendDialogResponse(10414, 1, 18, -1)
            return false
        end
        if dialogId == 1701 then
            sampSendDialogResponse(1701, 1, spawn, -1)
            spawn = nil
            lastd = true
            return false
        end
    end
    if dialogId == 10414 and lastd then
        lastd = false
        return false
    end
end
 
  • Нравится
Реакции: Franchesko111

Franchesko111

Новичок
Автор темы
20
18
Если нужно именно отправить закрытие серверу - замени return false в последнем условии в хуке на sampCloseCurrentDialogWithButton/sampSendDialogResponse
Lua:
local sampev = require 'samp.events'
local spawn = nil
local lastd = false
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sp1", function() sampSendChat("/mm"); spawn = 0 end)
    sampRegisterChatCommand("sp2", function() sampSendChat("/mm"); spawn = 1 end)
    while true do
        wait(0)
    end
end

function sampev.onShowDialog(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
    if spawn ~= nil then
        if dialogId == 10411 then
            sampSendDialogResponse(10411, 1, 2, -1)
            return false
        end
        if dialogId == 10414 then
            sampSendDialogResponse(10414, 1, 18, -1)
            return false
        end
        if dialogId == 1701 then
            sampSendDialogResponse(1701, 1, spawn, -1)
            spawn = nil
            lastd = true
            return false
        end
    end
    if dialogId == 10414 and lastd then
        lastd = false
        return false
    end
end

Спасибо, почти то, что нужно, но опять же проблема.
Если оставить так же, т.е. return false, то после установки спавна диалогов нет, но перестают работать любые серверные команды (/mm /members /inv и другие). Если вместо return false поставить sampCloseCurrentDialogWithButton, то ее как будто нет (остается открытым диалог с настройками, т.е. эта функция будто не работает, все точно так же, как и без последнего условия).
А если поставить закрытие через sampSendDialogResponse, то 1 диалог закрывается, а второй (/mm) остается все равно, даже если ставить sampSendDialogResponse и на него.

Прости, если туплю, но я не могу понять почему они не могут закрыться через функции или почему после закрытия с return false перестают работать серверные команды 🙃
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,281
Спасибо, почти то, что нужно, но опять же проблема.
Если оставить так же, т.е. return false, то после установки спавна диалогов нет, но перестают работать любые серверные команды (/mm /members /inv и другие). Если вместо return false поставить sampCloseCurrentDialogWithButton, то ее как будто нет (остается открытым диалог с настройками, т.е. эта функция будто не работает, все точно так же, как и без последнего условия).
А если поставить закрытие через sampSendDialogResponse, то 1 диалог закрывается, а второй (/mm) остается все равно, даже если ставить sampSendDialogResponse и на него.

Прости, если туплю, но я не могу понять почему они не могут закрыться через функции или почему после закрытия с return false перестают работать серверные команды 🙃
sampCloseCurrentDialogWithButton - функция которая закрывает уже отрисованный диалог, onShowDialog же является входящим RPC, диалог рисует самп. Чтобы эта функция сработала нужно создать поток, в нем сделать задержку в 100-200мс и использовать sampCloseCurrentDialogWithButton
 
  • Нравится
Реакции: Franchesko111