Jump to content

Общий мини "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 назначит действие)

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

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

Скрипт вида

  
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 ); 

Link to comment
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, отредактируйте пожалуйста, кому не лень. Таймер не подходит.

Link to comment
язык сам по себе простой, иди покури учебник, там примеры есть для 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

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

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

Link to comment

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

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

Link to comment

А. Я имел ввиду про 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 ) 

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

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

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

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

Link to comment

Строка 3:

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

Строка 4:

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

Строка 5:

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

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

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

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

Link to comment

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

Код вида:

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

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

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

Link to comment

Ребят, поясните по хардкору, как показать пользователю 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
Link to comment

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

Поведайте пожалуйста, каким образом можно выводить, например 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) 

Не помогло :?

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

Поведайте пожалуйста, каким образом можно выводить, например 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 
) 

Link to comment

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

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

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

Link to comment

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

for index, player in ipairs(getPlayersInTeam) do

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

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