Jump to content

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


Recommended Posts

Скиньте пожалуйста полный код.

Вот полный код. Сам скрипт работает идеально без ошибок, но последние 2 функции не хотят.

on = 0 
  
function onEnterVehicle () 
bindKey ( source, "k", "down", create ) 
end 
addEventHandler ( "onPlayerVehicleEnter", getRootElement(), onEnterVehicle ) 
  
function create (player) 
      if on == 0 then 
      on = 1   
      local vehicle = getPedOccupiedVehicle(player) 
  
      timer1 = setTimer(function( playerVehicle )  
      setVehicleLightState ( playerVehicle, 0,  0 )  
      setTimer(function( playerVehicle ) setVehicleLightState ( playerVehicle, 0,  1 ) end, 50, 1, vehicle ) 
      resetTimer(timer1) 
      end, 500, 0, vehicle ); 
      else 
      on=0 
      killTimer(timer1); 
  
      end 
end 
  
function Exit () 
unbindKey ( source, "k", "down", create ) 
if on == 1 then 
on=0 
killTimer(timer1); 
end 
end 
addEventHandler ( "onPlayerVehicleExit", getRootElement(), Exit ) 
  
function Explode () 
        unbindKey ( source, "k", "down", create ) 
        if on == 1 then 
        on=0 
        killTimer(timer1) 
    end 
end 
addEventHandler ( "onVehicleExplode", getRootElement(), Explode ) 
  
function Destroy () 
    if getElementType(source) == "vehicle" and getPedOccupiedVehicle(getLocalPlayer()) == source then 
    unbindKey ( source, "k", "down", create ) 
        if on == 1 then 
        on=0 
        killTimer(timer1) 
    end 
    end 
end 
addEventHandler ("onElementDestroy", getRootElement(), Destroy ) 

Link to comment

В функции destroy ты получаешь транспорт localPlayer'а, замени на игрока. + ты анбиндишь source'у, но source авто, получи аккупанта через getVehicleOccupant и анбиндь ему.

Link to comment
В функции destroy ты получаешь транспорт localPlayer'а, замени на игрока. + ты анбиндишь source'у, но source авто, получи аккупанта через getVehicleOccupant и анбиндь ему.

Спасибо большое! Разобрался, все работает.

Но столкнулся с новой проблемой.

Функция работает только у одного игрока, то есть если у одного включено, включает другой, у первого пропадает. А так же если кто-то выходит с сервера то тоже таймер выключается. Это можно как-нибудь победить?

on = 0 
  
function onEnterVehicle () 
bindKey ( source, "k", "down", createStrab ) 
end 
addEventHandler ( "onPlayerVehicleEnter", getRootElement(), onEnterVehicle ) 
      
function create (player) 
          if on == 0 then 
          on = 1   
          local vehicle = getPedOccupiedVehicle(player) 
          timer1 = setTimer(function( playerVehicle ) 
          setVehicleLightState ( playerVehicle, 0,  0 ) 
          setTimer(function( playerVehicle ) setVehicleLightState ( playerVehicle, 0,  1 ) end, 50, 1, vehicle ) 
          resetTimer(timer1) 
          end, 500, 0, vehicle ); 
          else 
          on=0 
          killTimer(timer1); 
          end 
end 
      
function Exit () 
unbindKey ( source, "k", "down", create ) 
if on == 1 then 
on=0 
killTimer(timer1); 
end 
end 
addEventHandler ( "onPlayerVehicleExit", getRootElement(), Exit ) 
  
function Explode () 
        local driver = getVehicleOccupant ( source ) 
        unbindKey ( driver, "k", "down", create ) 
        if on == 1 then 
        on=0 
        killTimer(timer1) 
    end 
end 
addEventHandler ( "onVehicleExplode", getRootElement(), Explode ) 
  
function Destroy (  )      
        local driver = getVehicleOccupant ( source ) 
        unbindKey ( driver, "k", "down", create ) 
        if on == 1 then 
        on=0 
        killTimer(timer1) 
    end 
end 
addEventHandler ("onElementDestroy", getRootElement(), Destroy ) 
  

Link to comment

Это из-за переменной on. Ты переделал код с клиента на сервер, поэтому она изменяется теперь при каждом включении функции любым игроком. Используй setElementData, например, setElementData( thePlayer, "on", 1 или 0 ), и делай проверку соответственно через getElementData.

Link to comment
\ Используй setElementData, например, setElementData( thePlayer, "on", 1 или 0 ), и делай проверку соответственно через getElementData.

Так?

on = 0 
  
function onEnterVehicle () 
bindKey ( source, "k", "down", create ) 
end 
addEventHandler ( "onPlayerVehicleEnter", getRootElement(), onEnterVehicle ) 
  
  
function create ( thePlayer, player ) 
  
if getElementData( thePlayer, "on", 0 ) then 
setElementData( thePlayer, "on", 1 ) 
  
      local vehicle = getPedOccupiedVehicle(player) 
  
      timer1 = setTimer(function( playerVehicle )  
      setVehicleLightState ( playerVehicle, 0,  0 )  
      setTimer(function( playerVehicle ) setVehicleLightState ( playerVehicle, 0,  1 ) end, 50, 1, vehicle ) resetTimer(timer1) end, 500, 0, vehicle ); 
  
      else 
  
      setElementData( thePlayer, "on", 0 ) 
  
      killTimer(timer1); 
  
      end 
end 

это не работает..

вот такие ошибки получаю..

WARNING: Light\server.lua:11: Bad argument @ 'getElementData' [Expected bool at argument 3, got number '0']

Link to comment

Так?

on = 0 
  
function onEnterVehicle () 
bindKey ( source, "k", "down", create ) 
end 
addEventHandler ( "onPlayerVehicleEnter", getRootElement(), onEnterVehicle ) 
  
  
function create ( thePlayer, player ) 
  
if getElementData( thePlayer, "on", 0 ) then 
setElementData( thePlayer, "on", 1 ) 
  
      local vehicle = getPedOccupiedVehicle(player) 
  
      timer1 = setTimer(function( playerVehicle )  
      setVehicleLightState ( playerVehicle, 0,  0 )  
      setTimer(function( playerVehicle ) setVehicleLightState ( playerVehicle, 0,  1 ) end, 50, 1, vehicle ) resetTimer(timer1) end, 500, 0, vehicle ); 
  
      else 
  
      setElementData( thePlayer, "on", 0 ) 
  
      killTimer(timer1); 
  
      end 
end 

это не работает..

вот такие ошибки получаю..

WARNING: Light\server.lua:11: Bad argument @ 'getElementData' [Expected bool at argument 3, got number '0']

Оформляй код тегом lua, а не code.

Предупреждение там потому, что getElementData возвращает значение, и его нужно сравнивать с чем-нибудь, например, вот так

if getElementData( thePlayer, "on" ) == 0 then 

а не в третий аргумент сравниваемое пихать.

Link to comment

Так?

...

Зачем ты в create вставил ещё thePlayer, у тебя уже есть player.

Вобщем вот так должно быть. Вместо точек вставляй код, не стал разбираться с твоими таймерами.

function onEnterVehicle () 
     bindKey ( source, "k", "down", create ) 
     setElementData ( source, "on", 0 ) 
end 
addEventHandler ( "onPlayerVehicleEnter", getRootElement(), onEnterVehicle ) 
      
function create (player) 
     local state = getElementData ( player, "on" ) 
     if ( state == 0 ) then 
          setElementData ( player, "on", 1 )   
          ... 
      else 
          setElementData ( player, "on", 0 ) 
          ... 
     end 
end 
      
function Exit () 
     unbindKey ( source, "k", "down", create ) 
     if ( getElementData ( source, "on" ) == 1 ) then 
          setElementData ( source, "on", 0 ) 
          killTimer(timer1); 
     end 
end 
addEventHandler ( "onPlayerVehicleExit", getRootElement(), Exit ) 
  
function Explode () 
        local driver = getVehicleOccupant ( source ) 
        unbindKey ( driver, "k", "down", create ) 
        if ( getElementData ( driver, "on" ) == 1 ) then 
             setElementData ( driver, "on", 0 ) 
             killTimer(timer1) 
        end 
end 
addEventHandler ( "onVehicleExplode", getRootElement(), Explode ) 
  
function Destroy () 
   if ( getElementType(source) == "vehicle" ) then 
        local driver = getVehicleOccupant ( source ) 
        unbindKey ( driver, "k", "down", create ) 
        if ( getElementData ( driver, "on" ) == 1 ) then 
             setElementData ( driver, "on", 0 ) 
             killTimer(timer1) 
        end 
   end 
end 
addEventHandler ("onElementDestroy", getRootElement(), Destroy ) 

+ в фукнции Destroy не хватало проверки, что уничтоженный элемент является траспортом.

Link to comment
Как нарисовать текст, который будет показываться не на "экране", а в мире ( например на здании )?

С помощью dxCreateRenderTarget и dxDrawMaterialLine3D. Там кстати пример по твою душу, только dxDrawImage заменить.

А как сделать черный фон прозрачным?

Link to comment

А как получить element например дома Cj? Ты наверное подумал о объектах, которые создаются, а я имел ввиду объекты, которые уже находятся на карте со времен сингл-плеера

Link to comment

Вобщем вот так должно быть. Вместо точек вставляй код, не стал разбираться с твоими таймерами.

function onEnterVehicle () 
     bindKey ( source, "k", "down", create ) 
     setElementData ( source, "on", 0 ) 
end 
addEventHandler ( "onPlayerVehicleEnter", getRootElement(), onEnterVehicle ) 
      
function create (player) 
     local state = getElementData ( player, "on" ) 
     if ( state == 0 ) then 
          setElementData ( player, "on", 1 )   
          ... 
      else 
          setElementData ( player, "on", 0 ) 
          ... 
     end 
end 
      
function Exit () 
     unbindKey ( source, "k", "down", create ) 
     if ( getElementData ( source, "on" ) == 1 ) then 
          setElementData ( source, "on", 0 ) 
          killTimer(timer1); 
     end 
end 
addEventHandler ( "onPlayerVehicleExit", getRootElement(), Exit ) 
  
function Explode () 
        local driver = getVehicleOccupant ( source ) 
        unbindKey ( driver, "k", "down", create ) 
        if ( getElementData ( driver, "on" ) == 1 ) then 
             setElementData ( driver, "on", 0 ) 
             killTimer(timer1) 
        end 
end 
addEventHandler ( "onVehicleExplode", getRootElement(), Explode ) 
  
function Destroy () 
   if ( getElementType(source) == "vehicle" ) then 
        local driver = getVehicleOccupant ( source ) 
        unbindKey ( driver, "k", "down", create ) 
        if ( getElementData ( driver, "on" ) == 1 ) then 
             setElementData ( driver, "on", 0 ) 
             killTimer(timer1) 
        end 
   end 
end 
addEventHandler ("onElementDestroy", getRootElement(), Destroy ) 

+ в фукнции Destroy не хватало проверки, что уничтоженный элемент является траспортом.

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

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