MX_Master

Общий мини "HELP ME" топик по скриптингу

Recommended Posts

Я создаю маркер и аттачу его к чему мне нужно, например, к машине.

Скрипт вида

  
function abcdefgh () 
for i,v in ipairs(getElementsByType("vehicle")) do 
     if getElementModel(v) == 411 then 
       local arrowMarker = createMarker ( x, y, z, "arrow", size, r, g, b, alpha ) 
       attachElements ( arrowMarker, v, x, y, z ) 
      end 
   end 
end 
addCommandHandler ( "test1", abcdefgh ) 
  

Как вы поняли, за место x, y, z, r, g, b, alpha и size - цифры.

Как мне убрать этот маркер? destroyElement, destroyElements, destroyMarker, setAlpha(чтобы не видно было) - Не работают. Всё время Warrning. Всё перепробовал.

Делаю по Wiki.

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

Надо именно на одну кнопку или на один и тот же CommanHandler назначит действие)

Помогите, пожалуйста.

Share this post


Link to post
Я создаю маркер и аттачу его к чему мне нужно, например, к машине.

Скрипт вида

  
function abcdefgh () 
for i,v in ipairs(getElementsByType("vehicle")) do 
     if getElementModel(v) == 411 then 
       local arrowMarker = createMarker ( x, y, z, "arrow", size, r, g, b, alpha ) 
       attachElements ( arrowMarker, v, x, y, z ) 
      end 
   end 
end 
addCommandHandler ( "test1", abcdefgh ) 
  

Как вы поняли, за место x, y, z, r, g, b, alpha и size - цифры.

Как мне убрать этот маркер? destroyElement, destroyElements, destroyMarker, setAlpha(чтобы не видно было) - Не работают. Всё время Warrning. Всё перепробовал.

Делаю по Wiki.

Вы создаёте маркер, заносите его в переменную у которой область видимости в пределах блока с условием "if getElementModel(v) == 411 then". Т.е. за пределами переменная с этим именем = nil. Поэтому два варианта - 1. заносить в массив игрока или 2. удалять по getAttachedElements

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

Надо именно на одну кнопку или на один и тот же CommanHandler назначит действие)

Помогите, пожалуйста.

  
actions = {}; 
  
local function toggle_action( player, key, state ) 
     actions[ player ] = not actions[ player ]; 
      
     if actions[ player ] then 
           -- начать действие 
     else 
          -- закончить действие 
     end 
end 
  
bindKey( player, "F1", "up" toggle_action ); 

Share this post


Link to post
function blowVehAfterTp() 
    local localPlayer = getLocalPlayer() 
    local playerVehicle = getPedOccupiedVehicle(localPlayer) 
    local playerInVehicle = isPedInVehicle(localPlayer) 
    local vehOnGroundCheck = isVehicleOnGround(playerVehicle) 
    local playerVehicleIsBlown = isVehicleBlown(playerVehicle) 
     
    if (spectatorMode == true) and  (playerInVehicle == true) and (vehOnGroundCheck) then 
        blowVehicle(playerVehicle) 
        --triggerEvent("blowVehAfterBlow", getRootElement()) 
        --debug 
        outputChatBox("blow - ok") 
        --debug end 
    else 
    end 
end 

Нужно повторять эту функцию, пока (local playerVehicleIsBlown) не станет true. Абсолютно не разбираюсь в repeat until, отредактируйте пожалуйста, кому не лень. Таймер не подходит.

Share this post


Link to post

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

Share this post


Link to post
язык сам по себе простой, иди покури учебник, там примеры есть для repeat

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

function blowVehAfterTp() 
    local localPlayer = getLocalPlayer() 
    local playerVehicle = getPedOccupiedVehicle(localPlayer) 
    local playerInVehicle = isPedInVehicle(localPlayer) 
    local vehOnGroundCheck = isVehicleOnGround(playerVehicle) 
    local playerVehicleIsBlown = isVehicleBlown(playerVehicle) 
     
    repeat  
    if (spectatorMode == true) and  (playerInVehicle == true) and (vehOnGroundCheck) then 
        blowVehicle(playerVehicle) 
     
        --triggerEvent("blowVehAfterBlow", getRootElement()) 
        --debug 
        outputChatBox("blow - ok") 
        --debug end 
    else 
    end 
    until (playerVehicleIsBlown == true) 
end 
addEvent("onVehTp", true) 
addEventHandler("onVehTp", getRootElement(), blowVehAfterTp) 

Дебаг ругается на 10 строку, а в 10 строке у нас тригер:

triggerEvent("onVehTp", getRootElement()) 

Ошибка:

\client.lua:10 Aborting, infinite running script in spectator

Share this post


Link to post

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

Share this post


Link to post
твоя петелька слишком частая и подвешивает клиент, поэтому клиент ее оборвал

Да это я понял, спасибо) Мне нужно повторять функцию, пока i не станет 1, но дебаг говорит, что это сильно долго... Что делать?

Share this post


Link to post

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

ну максимум можно поставить выполнение этой функции в событиях onClientRender / onClientPreRender, / onClientHUDRender

Share this post


Link to post

Kernell - Извините, пардон, но ничего не получается. Там пример слишком большой и запутанный. :oops:

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

Share this post


Link to post

Так я и дал малюсенький пример. Может тогда по конкретнее скажите что хотите?

Share this post


Link to post

А. Я имел ввиду про getAttachedElement...

Как мне из моего примера удалить маркер?

Мой чертеж, как я осмысливаю код, вида:

function delete_marker () 
for i,marker in ipairs(getElementsByType("corona")) do 
     if getElementByType(corona) == coronaMarker then 
       local arrowMarker = destroyElements 
       detachElements ( arrowMarker ) 
      end 
   end 
end 
addCommandHandler ( "deletemarker", delete_marker ) 

Что-то примерно такое, чтобы как Вы сказали, по таблице удаляло.

Можно и нужно ли в одном скрипте писать и создание и удаление элементов?

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

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

Share this post


Link to post

Строка 3:

  • переменной corona не существует, возможно Вы имели ввиду marker?
  • getElementsByType возвращает строку, а Вы сравниваете результат функции с какой-то непонятной переменной.
  • Зачем Вам проверять тип если вы на строке 2 берёте все элементы этого типа?

Строка 4:

  • функции destroyElements не существует. Есть только destroyElement и она возвращает bool (true - успешно, false - не успешно). Функции вызываются круглыми скобками, внутри скобок передаются аргументы (их ещё называют "параметры"). Конкретно этой функции, в аргумент нужно положить элемент, в Вашем случае это marker.

Строка 5:

  • детачить уже нечего, элемент удалён.

Создать легко, а удалить - трудно.

Просто не нужно терять переменную.

P.S. Соблюдайте отступы в коде.

Share this post


Link to post

Ура! Отлично Работает! Спасибо Огромное!

Код вида:

  
function delete_marker () 
  
for i,marker in ipairs(getElementsByType("marker")) do 
       local arrowMarker = destroyElement(marker) 
  end 
end 
addCommandHandler ( "deletemarker", delete_marker ) 
  

Ещё раз огромное Спасибо. :)

Не всегда получается самому сделать что-то без профессионалов.

Share this post


Link to post

Ребят, поясните по хардкору, как показать пользователю GUI когда он становится на маркер ?

Вообще с гуём очень всё непонятно. Может туториал есть какой(кроме того что на вики)?

Например я делаю так:

на клиенте

  
function GUISpawnVehicle(showCursorParam,guiSetVisibleParam) 
    showCursor(showCursorParam) 
    guiSetVisible(guiSetVisibleParam) 
    MainWindow = guiCreateWindow(0.10, 0.10, 0.25, 0.40, "Selecione um veiculo", true) 
    guiSetVisible(false) 
    outputChatBox ("Должно появится окно"),player) 
end 
  
addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()),  
    function () 
        GUISpawnVehicle() 
        outputChatBox("sdfsdfsdfsdf") 
        if (MainWindow ~= nil) then 
                 guiSetVisible(MainWindow, true) 
            end  
  
            showCursor(true) 
            guiSetInputEnabled(true) 
    end 
  

на сервере

  
BicycleRent = createMarker(1707.8544921875, -1849.412109375, 12.5, "cylinder", 2, 255, 0, 255, 150) 
  
function GUISpawnVehicle(player) 
    triggerClientEvent("CallGUISpawnVehicle", player,true,true) 
end 
addEventHandler("onMarkerHit", BicycleRent, GUISpawnVehicle) 
  
  

Что не так*?

____________________

Вопрос закрыт использовал onClientMarkerHit

Edited by Guest

Share this post


Link to post

Вечер добрый :)

Поведайте пожалуйста, каким образом можно выводить, например dxDrawRectangle на любом разрешении монитора в одном и том же месте?

К примеру, это создано на моём ноутбуке с разрешением 1600x900, в правом нижнем углу экрана.

dxDrawRectangle(1231.0,693.0,190.0,41.0,tocolor(0,0,0,100),false) 

На другом разрешении rectangle отображается совершенно неровно, ясное дело.

Пробовал совершать манипуляции с guiGetScreenSize() по такому типу:

local x,y = guiGetScreenSize() 
dxDrawRectangle(x-(x-1231.0),y-(y-693.0),190.0,41.0,tocolor(0,0,0,100),false) 

Не помогло :?

Share this post


Link to post
Вечер добрый :)

Поведайте пожалуйста, каким образом можно выводить, например dxDrawRectangle на любом разрешении монитора в одном и том же месте?

К примеру, это создано на моём ноутбуке с разрешением 1600x900, в правом нижнем углу экрана.

dxDrawRectangle(1231.0,693.0,190.0,41.0,tocolor(0,0,0,100),false) 

На другом разрешении rectangle отображается совершенно неровно, ясное дело.

Пробовал совершать манипуляции с guiGetScreenSize() по такому типу:

local x,y = guiGetScreenSize() 
dxDrawRectangle(x-(x-1231.0),y-(y-693.0),190.0,41.0,tocolor(0,0,0,100),false) 

Не помогло

local nBaseWidth, nBaseHeight = 1600, 900 -- базовые размеры экрана 
local nCurrentWidth, nCurrentHeight = guiGetScreenSize() -- текущие размеры экрана 
  
-- множители 
local nWidthMult, nHeightMult = nCurrentWidth / nBaseWidth, nCurrentHeight / nBaseHeight 

 

dxDrawRectangle( 
    1231.0 * nWidthMult, 693.0 * nHeightMult, 
    190.0  * nWidthMult, 41.0  * nHeightMult,  
    tocolor(0,0,0,100), false 
) 

Share this post


Link to post
Как можно узнать index элемента?

смотря какой индекс, поясни подробнее шо нада (:

Share this post


Link to post

getElementByIndex есть, а getElementIndex нету.

Не охото делать так:

function getElementIndex(element) 
  for index, element2 in ipairs(getElementByType(getElementType(element)) do 
    if element2 == element then 
      return index 
    end 
  end 
end 

Share this post


Link to post

такой фуньки нет, потому что она никому не нужна. А если нужна, то вот ты сам и написал. Так зачем индекс-то тебе?

Share this post


Link to post

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

for index, player in ipairs(getPlayersInTeam) do

индекс будет по положениу в таблице игроков в команде, а не индекс среди всех игрково.

Share this post


Link to post

Индекс среди всех игроков можно подсчитывать вручную скриптом при входах/выходах с сервера. Потом, когда надо, узнавать его.

Share this post


Link to post

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.