Jump to content

Вопросы и ответы по MTA.


Recommended Posts

Локальные переменные одного скрипта ресурса не доступны другим скриптам этого же ресурса (поэтому у них в любых скриптах могут быть одинаковые имена). А вот глобальные переменные, созданные любым скриптом ресурса - доступны всем остальным скриптам ресурса.

Стессна, серверные переменные не видны клиентским скриптам и наоборот.

Link to comment

Итак, если у меня есть один файл ресурса:

x = 5 
y = 10 

то во втором файле, значение переменной x будет равно 5, а y 10.

А если я сделаю так:

local x = 5 
local y = 10 

то во втором файле, если я им предварительно не присвою значение, оба будут nil. Я правильно понял?

Link to comment

Во втором файле, после создания этих локальных переменных, везде будут читаться/изменяться уже не глобальные, а эти локальные значения. Но это не значит, что нельзя прочесть/изменить эти глобальные переменные. Все глобальные переменные хранятся в таблице _G и, чтобы прочесть/изменить глобальную переменную "x", нужно юзать ее имя так

_G['x'] -- или  _G.x  или  _G["x"] 

Link to comment

Я вот тут вот не совсем понял как работать с маркерами.

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

Как это сделать? Не буду же я делать так:

local marker1= createMarker( 376.870, -2241.505, 44.539, "corona", 2, 0, 255, 0 ) 
local marker2= createMarker( 372.126, -2480.029, 45.837, "corona", 2, 0, 255, 0 ) 
  
addEventHandler( "onPlayerMarkerHit", marker1, функция) 
addEventHandler( "onPlayerMarkerHit", marker2, функция) -- Функция одинаковая 

Link to comment

1 вариант

local mark1= createMarker ( 2, 2, 2, "cylinder", 1.5, 255, 255, 0, 170 ) 
local mark2= createMarker ( 2, 2, 2, "cylinder", 1.5, 255, 255, 0, 170 ) 
  
function MarkerHit ( hitPlayer, matchingDimension ) 
    if source == mark1 then 
-- действие при входе на 1 маркер 
    elseif source == mark2 then 
-- действие при входе на 2 маркер 
        end 
end 
addEventHandler ( "onClientMarkerHit", getRootElement(), MarkerHit ) 

2 вариант

local mark1= createMarker ( 2, 2, 2, "cylinder", 1.5, 255, 255, 0, 170 ) 
local mark2= createMarker ( 2, 2, 2, "cylinder", 1.5, 255, 255, 0, 170 ) 
  
function MarkerHit1 ( hitPlayer, matchingDimension ) 
-- действие при входе на 1 маркер 
end 
addEventHandler ( "onClientMarkerHit", mark1, MarkerHit1 ) 
  
  
function MarkerHit2 ( hitPlayer, matchingDimension ) 
-- действие при входе на 2 маркер 
end 
addEventHandler ( "onClientMarkerHit", mark2, MarkerHit2 ) 
  

Link to comment
    local myMarkers = 
    { createMarker( 0, 0, 4, 'cylinder', 1, 255, 0, 0, 150 ), 
    createMarker( 0, 2, 4, 'cylinder', 1, 255, 0, 0, 150 ), 
    createMarker( 0, 4, 4, 'cylinder', 1, 255, 0, 0, 150 ), 
    createMarker( 0, 6, 4, 'cylinder', 1, 255, 0, 0, 150 ), 
    createMarker( 0, 8, 4, 'cylinder', 1, 255, 0, 0, 150 ) 
    } 
      
    function PlayerMarkerHit( markerHit, matchingDimension ) 
          for k, marker in ipairs(myMarkers) do 
                  if marker == markerHit then 
                          функция 
                  end 
          end 
    end 
    addEventHandler( "onPlayerMarkerHit", root, PlayerMarkerHit ) 

Это правильно?

Link to comment

Нет, не в любой.

Допустим есть 5 маркеров зеленого цвета и 5 маркеров красного.

Если я вхожу в любой из 5 маркеров зеленого цвета, должна выполняться одна и та же функция.

Если я вхожу в любой из 5 маркеров красного цвета, должна выполняться одна и та же другая функция.

Link to comment

Набросок

  
-- пример 
local myMarkers = 
    {  
    createMarker( 0, 0, 4, 'cylinder', 1, 255, 0, 0, 150 ), 
    createMarker( 0, 2, 4, 'cylinder', 1, 255, 0, 0, 150 ), 
    createMarker( 0, 4, 4, 'cylinder', 1, 0, 255, 0, 150 ), 
    createMarker( 0, 6, 4, 'cylinder', 1, 0, 255, 0, 150 ), 
    createMarker( 0, 8, 4, 'cylinder', 1, 0, 255, 0, 150 ) 
} 
  
local markers = {} 
  
  
addEventHandler( "onPlayerMarkerHit", root, 
    function( markerHit, matchingDimension ) 
        if markerHit  == markers.color( myMarkers,255,0,0 ) then 
            -- ... 
        elseif  markerHit == markers.color( myMarkers,0,255,0 ) then 
            -- ... 
        end  
    end 
) 
  
function markers.color( t,colorCheck1,colorCheck2,colorCheck3 ) 
    local colorCheck1,colorCheck2,colorCheck3 
    if not colorCheck1 then 
        colorCheck1 = 0 
    end 
     
    if not colorCheck2 then 
        colorCheck2 = 0 
    end 
     
    if not colorCheck3 then 
        colorCheck3 = 0 
    end 
         
    for i,v in pairs( t ) do 
        local r,g,b,_ = getMarkerColor ( v ) 
        if r == colorCheck1 then 
            return v 
        elseif g == colorCheck2 then 
            return v 
        elseif b == colorCheck3 then 
            return v 
        end 
        return false 
    end  
end 
  

Link to comment

Короче, что я хочу.

Есть:

mymarker[1] = createMarker(bla-bla-bla) 
mymarker[2] = createMarker(bla-bla-bla) 
mymarker[3] = createMarker(bla-bla-bla) 
mymarker[4] = createMarker(bla-bla-bla) 

Надо чтобы:

Если игрок встал в маркер marker[1] или marker[2], то должна выполниться ф-ия function1, а если в marker[3] или marker[4], то function2.

Только я не хочу после каждого маркера делать так:

addEventHandler( "onPlayerMarkerHit", mymarker[1], function1) 
addEventHandler( "onPlayerMarkerHit", mymarker[2], function1) 
addEventHandler( "onPlayerMarkerHit", mymarker[3], function2) 
addEventHandler( "onPlayerMarkerHit", mymarker[4], function2) 

Значит надо циклом перебрать и проверить на какой маркер игрок встал.

Link to comment

Вот есть код:

local Markers1 = {} 
local Markers2 = {} 
  
Markers1[1] = createMarker(2120, 928.79, 9.80) 
Markers2[1] = createMarker(2120.89, 917.79, 9.80) 
  
function markerHit(hitPlayer, matchingDimension) 
    for index,markers in pairs(Markers1) do 
        if (source == markers) then 
            --[[Маркер, на который встал игрок из таблицы Markers1 
            Значит, выполним функцию function1()]] 
        end 
    end 
    for index,markers in pairs(Markers2) do 
        if (source == markers) then 
           --[[Маркер, на который встал игрок из таблицы Markers2 
            Значит, выполним функцию function2()]] 
        end 
    end 
    --Получается, что нужно создавать несколько циклов! Это правильно или есть более лучший способ? 
end 
  
addEventHandler ( "onClientMarkerHit", getRootElement(), markerHit ) 

Создаем одну таблицу для одной группы маркеров, а потом когда игрок наступает на маркер, перебираем все маркеры из таблицы и проверяем совпадает ли какой-то с тем, на который игрок наступил.

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

Link to comment

Можно для маркера сделать так:

local marker = createMarker(...) 
setElementData(marker, "mode", 1) 
marker = createMarker(...) 
setElementData(marker, "mode", 2) 

И в событие

function functionName(...) 
    if getElementData(source, "mode") == 1 then 
        -- code 
    elseif getElementData(source, "mode") == 2 then 
        -- code 
    end 
end 

Link to comment

Вопрос решил без

setElementData(...) 

Я прописал нужную мне информацию маркеров прямо в .map файле, а потом уже вытаскиваю их через

getElementData(...)  

и сравниваю с тем, что мне нужно.

Link to comment
function checkMarkerMode(hitElement, matchingDimension) 
  
    local markermode = getElementData(source, "mode") 
     
    if markermode == "gas station" then 
        local element = getElementType(hitElement) 
        if(element == "vehicle") then 
            local player = getVehicleOccupant(element) 
            outputChatBox("Это заправка, епт!!!", player) 
        end 
    end 
end 
  
addEventHandler("onMarkerHit", getRootElement(), checkMarkerMode) 

Почему пишет

WARNING: Bad argument @ 'getVehicleOccupant' 

если заехать на маркер на автомобиле?

И почему пишет всем игрокам? Ведь должно только водителю?

Edited by Guest
Link to comment
function checkMarkerMode(hitElement, matchingDimension) 
  
    local markermode = getElementData(source, "mode") 
     
    if markermode == "gas station" then 
        local element = getElementType(hitElement) 
        if(element == "vehicle") then 
            local player = getVehicleOccupant(hitElement) 
            outputChatBox("Это заправка, епт!!!", player) 
        end 
    end 
end 
  
addEventHandler("onMarkerHit", getRootElement(), checkMarkerMode) 

Link to comment
Вот у меня есть gui-window, если я на него прикреплю конпки, а после gui-window удалю через destroyElement, кнопки тоже удалятся? Ну и все что прикреплено было?

Правильно, все дочерние элементы удаляются вместе с родительским.

Link to comment
Вот у меня есть gui-window, если я на него прикреплю конпки, а после gui-window удалю через destroyElement, кнопки тоже удалятся? Ну и все что прикреплено было?

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

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...