Jump to content

Валидность кода


Recommended Posts

Можете, пожалуйста, проверить валидность кода на спавн автомобиля через GUI?

Клиент:

GUIEditor = { 
    button = {}, 
    window = {}, 
} 
  
function createWindowCarSpawn() 
        GUIEditor.window[1] = guiCreateWindow(1098, 194, 166, 93, "Вызвать машину", false) 
        guiWindowSetSizable(GUIEditor.window[1], false) 
  
        GUIEditor.button[1] = guiCreateButton(10, 30, 66, 19, "Bullet", false, GUIEditor.window[1]) 
        guiSetFont(GUIEditor.button[1], "default-bold-small") 
        guiSetProperty(GUIEditor.button[1], "NormalTextColour", "FFAAAAAA") 
            addEventHandler ( "onClientGUIClick", GUIEditor.button[1], spwnbullet, false ) 
        GUIEditor.button[2] = guiCreateButton(91, 30, 67, 19, "NRG-500", false, GUIEditor.window[1]) 
        guiSetFont(GUIEditor.button[2], "default-bold-small") 
        guiSetProperty(GUIEditor.button[2], "NormalTextColour", "FFAAAAAA") 
            addEventHandler ( "onClientGUIClick", GUIEditor.button[2], spwnnrg500, false ) 
        GUIEditor.button[3] = guiCreateButton(76, 49, 15, 15, "x", false, GUIEditor.window[1]) 
        guiSetProperty(GUIEditor.button[3], "NormalTextColour", "FFAAAAAA") 
            addEventHandler ( "onClientGUIClick", GUIEditor.button[3], spwnguioff, false ) 
        GUIEditor.button[4] = guiCreateButton(10, 64, 66, 19, "Infernus", false, GUIEditor.window[1]) 
        guiSetFont(GUIEditor.button[4], "default-bold-small") 
        guiSetProperty(GUIEditor.button[4], "NormalTextColour", "FFAAAAAA") 
            addEventHandler ( "onClientGUIClick", GUIEditor.button[4], spwninfernus, false ) 
        GUIEditor.button[5] = guiCreateButton(91, 64, 66, 19, "Hunter", false, GUIEditor.window[1]) 
        guiSetFont(GUIEditor.button[5], "default-bold-small") 
        guiSetProperty(GUIEditor.button[5], "NormalTextColour", "FFAAAAAA")   
            addEventHandler ( "onClientGUIClick", GUIEditor.button[5], spwnhunter, false ) 
  
        guiSetVisible(GUIEditor.window[1], false)        
end 
addEventHandler("onClientResourceStart", resourceRoot, createWindowCarSpawn)  
--Открываем GUI по комманде < 
function carspawnguion(thePlayer, command) 
    createWindowCarSpawn() 
    if (GUIEditor.window[1] ~= nil) then 
            --outputChatBox("dobre.", client) 
            guiSetVisible(GUIEditor.window[1], true) 
            showCursor(true) 
            guiSetInputEnabled(true) 
        else 
            outputChatBox("Возникла непредвиденная ошибка и GUI входа не был создан.") 
    end  
end 
addCommandHandler("spwcar", carspawnguion) 
--Открываем GUI по комманде > 
--Закрываем GUI по кнопке < 
function spwnguioff ( button ) 
    if button == "left" then 
        if (GUIEditor.window[1] ~= nil) then 
            --outputChatBox("guiclos", client) 
            guiSetVisible(GUIEditor.window[1], false) 
            showCursor(false) 
            guiSetInputEnabled(false) 
        else 
            outputChatBox("Возникла непредвиденная ошибка и GUI входа не был закрыт.") 
        end  
    end 
end 
-- Закрываем GUI по кнопке >aaaa 
---- Спавн каров < 
-- Bullet < 
function spwnbullet ( button ) 
    if button == "left" then 
        local px, py, pz = getElementPosition ( localPlayer ) 
        triggerServerEvent("zaspwnbullet", getRootElement(),px,py,pz) 
         
        if (GUIEditor.window[1] ~= nil) then 
            guiSetVisible(GUIEditor.window[1], false) 
            showCursor(false) 
            guiSetInputEnabled(false) 
        else 
            outputChatBox("Возникла непредвиденная ошибка и GUI входа не был закрыт.") 
        end  
    end 
end 
-- Bullet > 
-- NRG-500 < 
function spwnnrg500 ( button ) 
    if button == "left" then 
        local px, py, pz = getElementPosition ( localPlayer ) 
        triggerServerEvent("zaspwnnrg", getRootElement(),px,py,pz) 
         
        if (GUIEditor.window[1] ~= nil) then 
            guiSetVisible(GUIEditor.window[1], false) 
            showCursor(false) 
            guiSetInputEnabled(false) 
        else 
            outputChatBox("Возникла непредвиденная ошибка и GUI входа не был закрыт.") 
        end  
    end 
end 
-- NRG-500 > 
-- Infernus < 
function spwninfernus ( button ) 
    if button == "left" then 
        local px, py, pz = getElementPosition ( localPlayer ) 
        triggerServerEvent("zaspwninfernus", getRootElement(),px,py,pz) 
         
        if (GUIEditor.window[1] ~= nil) then 
            guiSetVisible(GUIEditor.window[1], false) 
            showCursor(false) 
            guiSetInputEnabled(false) 
        else 
            outputChatBox("Возникла непредвиденная ошибка и GUI входа не был закрыт.") 
        end  
    end 
end 
-- Infernus > 
-- Hunter < 
function spwnhunter ( button ) 
    if button == "left" then 
        local px, py, pz = getElementPosition ( localPlayer ) 
        triggerServerEvent("zaspwnhunter", getRootElement(),px,py,pz) 
         
        if (GUIEditor.window[1] ~= nil) then 
            guiSetVisible(GUIEditor.window[1], false) 
            showCursor(false) 
            guiSetInputEnabled(false) 
        else 
            outputChatBox("Возникла непредвиденная ошибка и GUI входа не был закрыт.") 
        end  
    end 
end 
-- Hunter > 
---- Спавн каров > 

Сервер:

function zaspwnbulletto(px,py,pz) 
    px = px + 5 
    local createdVehicle = createVehicle(541,px,py,pz) 
    if (createdVehicle == false) then 
        -- если да, то выводим сообщение в чат, но только для игрока, который спавнил ТС. 
        outputChatBox("Bullet не заспавнен.",thePlayer) 
    else 
        outputChatBox("Bullet заспавнен.",thePlayer) 
    end 
end 
  
addEvent("zaspwnbullet",true) 
addEventHandler("zaspwnbullet",root,zaspwnbulletto) 
  
function zaspwnnrgto(px,py,pz) 
    px = px + 5 
    local createdVehicle = createVehicle(522,px,py,pz) 
    if (createdVehicle == false) then 
        -- если да, то выводим сообщение в чат, но только для игрока, который спавнил ТС. 
        outputChatBox("NRG-500 не заспавнен.",thePlayer) 
    else 
        outputChatBox("NRG-500 заспавнен.",thePlayer) 
    end 
end 
  
addEvent("zaspwnnrg",true) 
addEventHandler("zaspwnnrg",root,zaspwnnrgto) 
  
function zaspwninfernusto(px,py,pz) 
    px = px + 5 
    local createdVehicle = createVehicle(411,px,py,pz) 
    if (createdVehicle == false) then 
        -- если да, то выводим сообщение в чат, но только для игрока, который спавнил ТС. 
        outputChatBox("Infernus не заспавнен.",thePlayer) 
    else 
        outputChatBox("Infernus заспавнен.",thePlayer) 
    end 
end 
  
addEvent("zaspwninfernus",true) 
addEventHandler("zaspwninfernus",root,zaspwninfernusto) 
  
function zaspwnhunterto(px,py,pz) 
    px = px + 5 
    local createdVehicle = createVehicle(425,px,py,pz) 
    if (createdVehicle == false) then 
        -- если да, то выводим сообщение в чат, но только для игрока, который спавнил ТС. 
        outputChatBox("Hunter не заспавнен.",thePlayer) 
    else 
        outputChatBox("Hunter заспавнен.",thePlayer) 
    end 
end 
  
addEvent("zaspwnhunter",true) 
addEventHandler("zaspwnhunter",root,zaspwnhunterto) 

И мне кажется, что его можно сделать куда меньше.. Не подскажите как ?

Link to comment

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

Сервер

  
addEvent( 'Server:SpawnVehicle', true ) 
  
addEventHandler( 'Server:SpawnVehicle', root, 
    function( iModel, fX, fY, fZ ) 
        fX = fX + 5 
        local pVehicle = createVehicle( iModel, fX, fY, fZ ) 
        outputChatBox( getVehicleName( pVehicle ) .. ( not pVehicle and ' не ' or ' ' ) .. 'заспавнен', source ) 
    end 
) 
  

И у вас кстати thePlayer не определен на сервере в событиях. Вам его и не нужно будет определять если у вас source = игрок, но в вашем коде на клиенте вы этого не делаете и у вас source = корню всех элементов.

Ну и ещё, раз вы делаете спавнер тачек, то зачем вам кнопки если вы можете это сделать в гридлисте? Так намного проще. Вы будете передавать данные серверу получая эти данные из гридлиста, что ещё легче для реализации.

Link to comment

Спасибо, что ответили.

Не очень понял то, что вы написали, но сейчас попробую сделать через gridlist и потом как-то :D передать id строки gridlist'a на сервер и через case (из pascal'я, надеюсь в lua такое есть) или же через if создавать машину..

Вопрос: почему в guiGridListSetItemText нельзя использовать просто числа ?

text: The text you want to put in (does NOT accept numbers, use tostring() for that)

У меня стоят числа и все работает...

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

Еще вопрос: как определить этого thePlayer ? Если просто дописать

function zaspwnbulletto(thePlayer,px,py,pz) то работать не будет, это понятно.. Но как его определить ?

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

И еще один вопрос:

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

addEventHandler ( "onClientGUIClick", GUIEditor.button[1], spwnbullet,) 

как правильно, после функции:

function spwnbullet ( button ) 
    if button == "left" then 
        local px, py, pz = getElementPosition ( localPlayer ) 
        triggerServerEvent("zaspwnbullet", getRootElement(),px,py,pz) 
        
        if (GUIEditor.window[1] ~= nil) then 
            guiSetVisible(GUIEditor.window[1], false) 
            showCursor(false) 
            guiSetInputEnabled(false) 
        else 
            outputChatBox("Возникла непредвиденная ошибка и GUI входа не был закрыт.") 
        end 
    end 
end 
addEventHandler ( "onClientGUIClick", GUIEditor.button[1], spwnbullet,) 

То работать перестает, ссылаясь на то, что GUIEditor.button[1] - nill..

Почему так ?

Link to comment
Не очень понял то, что вы написали, но сейчас попробую сделать через gridlist и потом как-то передать id строки gridlist'a на сервер и через case (из pascal'я, надеюсь в lua такое есть) или же через if создавать машину..

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

Можете прочитать про switch в Lua:

http://lua-users.org/wiki/SwitchStatement

https://wiki.multitheftauto.com/wiki/Switch

Вопрос: почему в guiGridListSetItemText нельзя использовать просто числа ?

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

tonumber( '1' )  

ну и через tostring в строку соответственно.

Еще вопрос: как определить этого thePlayer ? Если просто дописать

function zaspwnbulletto(thePlayer,px,py,pz) то работать не будет, это понятно.. Но как его определить ?

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

https://wiki.multitheftauto.com/wiki/Event

Link to comment

И все же не могу понять..

Сервер:

function zaspwncarto(source, idspwcar) 
    local px,py,pz = getElementPosition(source) 
    px = px + 5 
    local createdVehicle = createVehicle(idspwcar,px,py,pz) 
    if (createdVehicle == false) then 
        -- если да, то выводим сообщение в чат, но только для игрока, который спавнил ТС. 
        outputChatBox(getVehicleName( idspwcar ).." не заспавнен.",thePlayer) 
    else 
        outputChatBox(getVehicleName( idspwcar ).." заспавнен.",thePlayer) 
    end 
end 
  
addEvent("idspwcar",true) 
addEventHandler("idspwcar",source,zaspwncarto) 

Клиент:

local allcars = { 
--{ID,Название,Скорость,Тип}; 
{400,"Landstalker","none","Внедорожник"}; 
{401,"Bravura","123","Седан"}; 
{402,"Buffalo","none","Спортивный"}; 
} 
GUIEditor = { 
    gridlist = {}, 
    window = {}, 
    addcol = {}, 
    button = {}, 
} 
    function createWindowCarSpawn() 
        GUIEditor.window[1] = guiCreateWindow(1032, 174, 315, 340, "Spawn car", false) 
        guiWindowSetSizable(GUIEditor.window[1], false) 
  
        GUIEditor.gridlist[1] = guiCreateGridList(10, 28, 294, 237, false, GUIEditor.window[1]) 
        GUIEditor.addcol[1] = guiGridListAddColumn(GUIEditor.gridlist[1], "ID", 0.15) 
        GUIEditor.addcol[2] = guiGridListAddColumn(GUIEditor.gridlist[1], "Название", 0.23) 
        GUIEditor.addcol[3] = guiGridListAddColumn(GUIEditor.gridlist[1], "Скорость", 0.2) 
        GUIEditor.addcol[4] = guiGridListAddColumn(GUIEditor.gridlist[1], "Тип", 0.35) 
  
        for i,allcars in ipairs(allcars) do 
            guiGridListAddRow(GUIEditor.gridlist[1]) 
            guiGridListSetItemText(GUIEditor.gridlist[1], i-1, 1, allcars[1], false, true) 
            guiGridListSetItemText(GUIEditor.gridlist[1], i-1, 2, allcars[2], false, false) 
            guiGridListSetItemText(GUIEditor.gridlist[1], i-1, 3, allcars[3], false, true) 
            guiGridListSetItemText(GUIEditor.gridlist[1], i-1, 4, allcars[4], false, false) 
        end 
         --guiGridListAutoSizeColumn (GUIEditor.gridlist[1],GUIEditor.addcol[4]) 
          
        GUIEditor.button[1] = guiCreateButton(20, 277, 124, 53, "Закрыть", false, GUIEditor.window[1])  
        guiSetProperty(GUIEditor.button[1], "NormalTextColour", "FFAAAAAA") 
            addEventHandler ( "onClientGUIClick", GUIEditor.button[1], carspawnguioff, false ) 
        GUIEditor.button[2] = guiCreateButton(170, 277, 124, 53, "Вызвать", false, GUIEditor.window[1]) 
        guiSetProperty(GUIEditor.button[2], "NormalTextColour", "FFAAAAAA") 
            addEventHandler ( "onClientGUIClick", GUIEditor.button[2], carspawnguispw, false ) 
  
        guiGridListSetSelectedItem ( GUIEditor.gridlist[1], 0, 1) 
    end 
  
--Открываем GUI по комманде < 
function carspawnguion(thePlayer, command) 
    createWindowCarSpawn() 
    if (GUIEditor.window[1] ~= nil) then 
            guiSetVisible(GUIEditor.window[1], true) 
            showCursor(true) 
--          guiSetInputEnabled(true) 
        else 
            outputChatBox("Возникла непредвиденная ошибка и GUI входа не был создан.") 
    end  
end 
addCommandHandler("spwcar", carspawnguion) 
--Открываем GUI по комманде > 
--Закрываем GUI < 
function carspawnguioff ( button ) 
    if button == "left" then 
        guiSetVisible(GUIEditor.window[1], false) 
        showCursor(false) 
--      guiSetInputEnabled(false) 
    end 
end 
--Закрываем GUI > 
--Передаем id на серв < 
function carspawnguispw ( button ) 
    if button == "left" then 
        selectgridlist = guiGridListGetSelectedItem (GUIEditor.gridlist[1]) 
        idspwcar = guiGridListGetItemText (GUIEditor.gridlist[1], selectgridlist, GUIEditor.addcol[1]) 
        triggerServerEvent("zaspwcar", source, idspwcar) 
--      outputChatBox(idspwcar) 
        guiSetVisible(GUIEditor.window[1], false) 
        showCursor(false) 
--      guiSetInputEnabled(false) 
    end 
end 
--Передаем id на серв > 

Как передать этого игрока на сервер ?????

Link to comment
Как передать этого игрока на сервер ?????
triggerServerEvent("zaspwcar", source, idspwcar) 

Вы передаёте гуи элемент кнопки серверу, а надо игрока. Используйте предопределенную переменную

localPlayer 

или функцию

getLocalPlayer 

И ещё это событие "zaspwcar" не существует на сервере, у вас есть событие "idspwcar". И ещё не помешало бы конвертировать строку с идом модели в число перед отправкой на сервер.

function zaspwncarto(source, idspwcar) 
    local px,py,pz = getElementPosition(source) 
    px = px + 5 
    local createdVehicle = createVehicle(idspwcar,px,py,pz) 
    if (createdVehicle == false) then 
        -- если да, то выводим сообщение в чат, но только для игрока, который спавнил ТС. 
        outputChatBox(getVehicleName( idspwcar ).." не заспавнен.",thePlayer) 
    else 
        outputChatBox(getVehicleName( idspwcar ).." заспавнен.",thePlayer) 
    end 
end 
  
addEvent("idspwcar",true) 
addEventHandler("idspwcar",source,zaspwncarto) 

Аргумент thePlayer к функции outputChatBox не определен, вам нужно использовать source.

И я вам писал, что source вам не нужно определять, он уже определен в функции-обработчике.

Если вы не понимаете, то вот небольшой пример:

addEventHandler( 'onPlayerJoin', root, 
    function() 
        outputChatBox( getPlayerName( source ) .. ' joined.', root, 255, 0, 0, false ) 
    end 
) 

Будет выводить в чат игрока, которой зашёл на сервер. Источник( source ) в этом событии - игрок.

Также это не верно.

addEventHandler("idspwcar",source,zaspwncarto) 

Используйте предопределенную переменную root или функцию

getRootElement 

Link to comment

Блин.. 2й день жду ответа, а вопрос у меня не отправился -_-

Cервер:

function zaspwncarto(idspwcar, localPlayer) 
    local spwcarid = tonumber(idspwcar) 
    local px,py,pz = getElementPosition(localPlayer) 
    px = px + 5 
    local createdVehicle = createVehicle(spwcarid,px,py,pz) 
    local vehicleNamespw = getVehicleName (spwcarid)  
    if (createdVehicle == false) then 
        outputChatBox(vehicleNamespw.." не заспавнен.",localPlayer) 
    else 
        outputChatBox(vehicleNamespw.." заспавнен.",localPlayer) 
    end 
end 
  
addEvent("zaspwcar",true) 
addEventHandler("zaspwcar",root,zaspwncarto) 

Кар спавнится, отлично, но сообщение не выводится.. По-моему, говорит, что это Boolean..

Link to comment

Вы не читаете мои посты, или вы просто плохо читаете их не вникая в суть. Поэтому у вас ничего и не получается .. Я вам писал много раз, в предыдущем посте я писал, что thePlayer не определен, вам нужно использовать source. Тут вы уже пишете localPlayer, для чего? Это клиентская предопределенная переменная, она не будет работать на сервере. Используйте source. Также я давал ссылку про систему событий и даже пример использования, но вы это видимо тоже не читали. И ещё я заметил, что вы хотите получить имя машины из ида, у вас не получится т.к чтобы узнать имя машины аргументом должна быть машина, а не её ид т.к вы используте функцию getVehicleName. Если вы хотите получить имя машины из ида, то используйте функцию

getVehicleNameFromModel 

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

Link to comment

У меня код работал, не работал лишь вывод имени автомобиля из-за того, что я искал через id модели getVehicleName..

getVehicleNameFromModel - должен мне помочь (сейчас проверить не могу)..

А так, этот код у меня работает и автомобиль спавнится..

А использую localPlayer только потому, что не могу понять что такое root, source, getRootElement...

Благодаря предыдущему посту я понял, что localPlayer - это клиент, который выполняет этот скрипт (ну в общем я понял), а что такое root, source, getRootElement и в каких случаях их использовать я пока не понимаю..

А скрипт у меня работает (насколько я понимаю) потому, что я передал этого localPlayer через триггер:

triggerServerEvent("zaspwcar", localPlayer, idspwcar) 

Секунду.. Получается, что source - это тот, кто передал переменную "idspwcar" через триггер ?? Так ?

Надо тогда писать:

function zaspwncarto(source, idspwcar) 

?

Тогда ж когда использовать root и getRootElement в addEventHandler ?..

Link to comment

root - указатель на самый первый (корневой) элемент в дереве элементов

getRootElement - функция, возвращающая root (уже не используется).

source - указатель на элемент, который вызвал событие

Russian / Русский ‹ Скриптинг ‹ Глобальные переменные в MTA (root,resourceRoot,..,source,..)

Надо тогда писать:

function zaspwncarto(source, idspwcar) 

?

Тогда ж когда использовать root и getRootElement в addEventHandler ?..

Не надо, source передаётся "невидимым" как бы

root и т.д. это просто глобальные переменные

Link to comment

Я уже раз 25 прочитал ту статью...

Я не знаю.. На примере, пожалуйста, покажите что-ли...

root надо использовать со всеми евентами типа Старт сервера и т.п. ?

Link to comment

Представьте, что три шарика подвязаны к одной нити.

  
------------ 
|     |     | 
O    O    O 
  

Мы можем качнуть один шарик не затрагивая другие. Вот этот один шарик — это обычный элемент.

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

Link to comment

Что такое дерево я понимаю..

Только что посмотрел множество примеров с евентами - всюду использовать root ?? (Кроме всяких GUIroot)..

Если нет, то покажите, пожалуйста, пример, где евент с root'ом и где евент с другим значением и почему там другое значение..

P.s. getRootElement и root - одно и тоже же ?

Link to comment

Клиент:

--Передаем id на серв < 
function carspawnguispw ( button ) 
    if button == "left" then 
        selectgridlist = guiGridListGetSelectedItem (GUIEditor.gridlist[1]) 
        idspwcar = guiGridListGetItemText (GUIEditor.gridlist[1], selectgridlist, GUIEditor.addcol[1]) 
        triggerServerEvent("zaspwcar", getRootElement(), localPlayer, idspwcar) 
--      outputChatBox(idspwcar) 
        guiSetVisible(GUIEditor.window[1], false) 
        showCursor(false) 
--      guiSetInputEnabled(false) 
    end 
end 
--Передаем id на серв > 

Сервер:

function zaspwncarto(localPlayer, idspwcar) 
    outputChatBox(source)   -- 00000001 
    outputChatBox(localPlayer)  -- 0000002F 
    local spwcarid = tonumber(idspwcar) 
    local px,py,pz = getElementPosition(source) 
    px = px + 5 
    local createdVehicle = createVehicle(spwcarid,px,py,pz) 
    local vehicleNamespw = getVehicleNameFromModel (spwcarid)  
    if (createdVehicle == false) then 
        outputChatBox(vehicleNamespw.." не заспавнен.",source) 
    else 
        outputChatBox(vehicleNamespw.." заспавнен.",source) 
    end 
end 
  
addEvent("zaspwcar",true) 
addEventHandler("zaspwcar",root,zaspwncarto) 

source выводит 00000001, а localPlayer - 0000002F..

Координаты у source выходят 0 0 0

Link to comment

Сейчас с телефона, поэтому пока без примеров с кодом. У меня к вам один вопрос: что вы хотели увидеть в вате когда выводили переменные source и localPlayer? Кстати, localPlayer на сервере нет и не может быть (подумайте почему), вы Вики вообще читаете? Там есть прекрасные пояснения на английском языке, последний обязателен, если вы хотите программировать. Посмотрите мои первые сообщения здесь, я таких вопросов как вы не задавал, я просто работал с Wiki. Позже объясню все с кодом, но все таки советую вам попробовать разобраться самому, иначе по чужим примерам вы ничего не поймете, раз вам даже пояснения на Wiki непонятны.

Link to comment

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

Клиент

function carspawnguispw (button) 
    if(button == "left") then 
        local selectgridlist = guiGridListGetSelectedItem (GUIEditor.gridlist[1]) 
        local idspwcar = guiGridListGetItemText (GUIEditor.gridlist[1], selectgridlist, GUIEditor.addcol[1]) 
        triggerServerEvent("zaspwcar", root, idspwcar) 
        guiSetVisible(GUIEditor.window[1], false) 
        showCursor(false) 
    end 
end 

Сервер

function zaspwncarto(idspwcar) 
    local px,py,pz = getElementPosition(client) 
    px = px + 5 
    local vehicleNamespw = getVehicleNameFromModel(idspwcar) 
    if (not createVehicle(idspwcar,px,py,pz)) then 
        outputChatBox(vehicleNamespw.." не заспавнен.", client) 
    else 
        outputChatBox(vehicleNamespw.." заспавнен.", client) 
    end 
end 
addEvent("zaspwcar",true) 
addEventHandler("zaspwcar",root,zaspwncarto) 

Небольшая оговорка: этот код "верен" только для вашего случая, я бы так не делал, в плане архитектуры.

Link to comment
Короче говоря, просто пишу вам верный, с моей точки зрения, код:

Клиент

function carspawnguispw (button) 
    if(button == "left") then 
        local selectgridlist = guiGridListGetSelectedItem (GUIEditor.gridlist[1]) 
        local idspwcar = guiGridListGetItemText (GUIEditor.gridlist[1], selectgridlist, GUIEditor.addcol[1]) 
        triggerServerEvent("zaspwcar", root, idspwcar) 
        guiSetVisible(GUIEditor.window[1], false) 
        showCursor(false) 
    end 
end 

Сервер

function zaspwncarto(idspwcar) 
    local px,py,pz = getElementPosition(client) 
    px = px + 5 
    local vehicleNamespw = getVehicleNameFromModel(idspwcar) 
    if (not createVehicle(idspwcar,px,py,pz)) then 
        outputChatBox(vehicleNamespw.." не заспавнен.", client) 
    else 
        outputChatBox(vehicleNamespw.." заспавнен.", client) 
    end 
end 
addEvent("zaspwcar",true) 
addEventHandler("zaspwcar",root,zaspwncarto) 

Небольшая оговорка: этот код "верен" только для вашего случая, я бы так не делал, в плане архитектуры.

Откуда localPlayer ? Я его через триггер передал, сколько раз писать...

Kenix предлагал мне использовать source - его то я и использовал, но он не работает..

По идее, если source - это игрок который передал через триггер переменные, то source должен быть равен localPlayer..

На клиенте вы дописали local ..

На сервере:

Как же

tonumber(idspwcar) 

, он же в текстовом виде передается..

vehicleNamespw вы убрали..

В итоге вы просто уменьшили код (я, как любой начинающий растянул код) и убрали переменную vehicleNamespw..

Спасибо за "client" (если работает..), так как source не работает..

Ужасного кода у себя я не вижу..

Link to comment
Зря ты ему весь код написал, он его просто копипастнет ..

Не копипастну, ибо этот спавн каров начал лишь для того, чтобы учить lua, а так он мне не нужен -_- ..

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

И что все же ужасного в моем коде ?-_-

Link to comment

source должен работать если source = игроку в данном случае.

У вас же

triggerServerEvent("zaspwcar", root, idspwcar) 

Т.е source = root, корень всех элементов. А client - клиент, в котором было вызвано событие. Если событие вызвано не клиентом - не используется

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

https://wiki.multitheftauto.com/index.ph ... ement_tree

Link to comment
source должен работать если source = игроку в данном случае.

У вас же

triggerServerEvent("zaspwcar", root, idspwcar) 

Т.е source = root, корень всех элементов. А client - клиент, в котором было вызвано событие. Если событие вызвано не клиентом - не используется

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

https://wiki.multitheftauto.com/index.ph ... ement_tree

Что нужно указать вместо root, чтобы source был клиентом ?

ЧТо такое дерево я понимаю, но в каком случае использовать root, а в каком что-то иное - не очень..

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...