Jump to content

Система двигателя( не сохраняется вкл/выкл)


Recommended Posts

Привет всем,

Пытаюсь написать скрипт двигателя по кнопке вкл и выкл. При этом, когда садишься в машину она автоматически определяла машина заведена или нет. Это для того, если машина заглушина, то когда садишься она была по прежнему заглушина. (Надеюсь более менее изъяснился) 

Вот мой код:
 

function enterVehicle ( player )
	local car = getPedOccupiedVehicle( player )
if (getElementData(car, "engine") == 0 ) then
		setVehicleEngineState ( car , false )
else 
	setVehicleEngineState ( car , true )
end
end
addEventHandler ( "onVehicleEnter", getRootElement(), enterVehicle )

function engine()
bindKey (source,"1","down",
	function(player,key)
	local car = getPedOccupiedVehicle(player)
	if(car and getVehicleController(car) == player) then
		setVehicleEngineState(car,(not getVehicleEngineState(car))) 
	end
	end
)
end
addEventHandler ("onPlayerVehicleEnter",getRootElement(), engine)

И еще я почему то подозреваю, что тут можно обойтись без getElementData. Читал статейки, что нужно стараться обходить их. Но я до конца не уверен, менно здесь можно ли обойтись без него?

Link to comment
23 minutes ago, K1parik said:

getVehicleEngineState показывает включен двигатель или нет. зачем элементдата?

то есть посути я могу обойтись без элемент дата заменив на getVehicleEngineState?

function switchEngineState(player)
	local vehicle = getPedOccupiedVehicle(player)
	if isElement(vehicle) then
		setVehicleEngineState(vehicle, (not getVehicleEngineState(vehicle))) 
	end
end

addEventHandler("onPlayerVehicleEnter", getRootElement(), function(vehicle, seat)
	if seat == 0 then
		bindKey(source, "1", "down", switchEngineState)
	end
end)

addEventHandler("onPlayerVehicleExit", getRootElement(), function(vehicle, seat)
	if seat == 0 then
		unbindKey(source, "1", "down", switchEngineState)
	end
end)

Вот есть такой вариант, но когда садишься в машину она автоматически заводится. А мне нужно вручную.

Link to comment
5 minutes ago, K1parik said:

в ивенте когда игрок сел в машину выключай двигатель этой функцией setVehicleEngineState

вот так?
 

addEventHandler("onPlayerVehicleEnter", getRootElement(), function(vehicle)
	local engine = getVehicleEngineState(vehicle)
	if (engine == false) then
		setVehicleEngineState (vehicle , false )
      else
		bindKey(source, "1", "down", switchEngineState)
	end
end)

 

Link to comment

интересное условие: если двигатель выключен - выключить двигатель? + к этому бинд не сработает если двигатель выключен т.е потом не сможешь его включить

Edited by K1parik
Link to comment
3 minutes ago, K1parik said:

интересное условие: если двигатель выключен - выключить двигатель? + к этому бинд не сработает если двигатель включен т.е потом не сможешь его выключить

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

Edited by mehmet
Link to comment
2 minutes ago, K1parik said:

может быть вот так


addEventHandler("onPlayerVehicleEnter", getRootElement(), function(vehicle, seat)
	if seat == 0 then
		setVehicleEngineState (vehicle, false )
		bindKey(source, "1", "down", switchEngineState)
	end
end)

 

Спасибо за попытку. Но как я и говорил. Теперь когда двигатель включенный. При повторной посадке он выкл. Хотя должен работать.

Link to comment
  • Scripting Moderators

Если вдруг кто столкнется с подобной проблемой, как вариант:

local vehicleEngine = { }

function switchEngineState ( player )
	local vehicle = getPedOccupiedVehicle ( player )
	if ( vehicle ) then
		setVehicleEngineState ( vehicle, not getVehicleEngineState ( vehicle ) )
	end
end

addEventHandler ( "onVehicleEnter", root,
	function ( player, seat )
		if ( seat == 0 ) then
			setVehicleEngineState ( source, vehicleEngine [ source ] or false )
			bindKey ( player, "1", "down", switchEngineState )
		end
	end
)

addEventHandler ( "onVehicleExit", root,
	function ( player, seat )
		if ( seat == 0 ) then
			vehicleEngine [ source ] = getVehicleEngineState ( source )
			unbindKey ( player, "1", "down", switchEngineState )
		end
	end
)

addEventHandler ( "onElementDestroy", root,
	function ( )
		if getElementType ( source ) == "vehicle" then
			if vehicleEngine [ source ] then
				vehicleEngine [ source ] = nil
			end
		end
	end
)

 

  • Like 1
Link to comment
58 minutes ago, Sarrum said:

Если вдруг кто столкнется с подобной проблемой, как вариант:


local vehicleEngine = { }

function switchEngineState ( player )
	local vehicle = getPedOccupiedVehicle ( player )
	if ( vehicle ) then
		setVehicleEngineState ( vehicle, not getVehicleEngineState ( vehicle ) )
	end
end

addEventHandler ( "onVehicleEnter", root,
	function ( player, seat )
		if ( seat == 0 ) then
			setVehicleEngineState ( source, vehicleEngine [ source ] or false )
			bindKey ( player, "1", "down", switchEngineState )
		end
	end
)

addEventHandler ( "onVehicleExit", root,
	function ( player, seat )
		if ( seat == 0 ) then
			vehicleEngine [ source ] = getVehicleEngineState ( source )
			unbindKey ( player, "1", "down", switchEngineState )
		end
	end
)

addEventHandler ( "onElementDestroy", root,
	function ( )
		if getElementType ( source ) == "vehicle" then
			if vehicleEngine [ source ] then
				vehicleEngine [ source ] = nil
			end
		end
	end
)

 

Да, спасибо. Скажи пожалуйста чем isElement отличается от? getElementData?

И зачем нужна эта функция?
 

addEventHandler ( "onElementDestroy", root,
	function ( )
		if getElementType ( source ) == "vehicle" then
			if vehicleEngine [ source ] then
				vehicleEngine [ source ] = nil
			end
		end
	end
)

 

Link to comment
  • Scripting Moderators

@mehmet
isElement - проверяет валидность элемента (переданное значение элемент/ не элемент), getElementData - для получения даты элемента (которая задана до этого функцией setElementData) с определенным ключом. У них совершенно разные предназначения.
Так как мы добавляем данные в таблицу, нам нужно событие onElementDestroy, которое сработает при уничтожении элемента (у нас при удалении транспорта), чтобы удалить этот элемент (транспорт) из таблицы. В противном случае могут возникнуть проблемы с утечкой памяти.

Link to comment
15 hours ago, Sarrum said:

@mehmet
isElement - проверяет валидность элемента (переданное значение элемент/ не элемент), getElementData - для получения даты элемента (которая задана до этого функцией setElementData) с определенным ключом. У них совершенно разные предназначения.
Так как мы добавляем данные в таблицу, нам нужно событие onElementDestroy, которое сработает при уничтожении элемента (у нас при удалении транспорта), чтобы удалить этот элемент (транспорт) из таблицы. В противном случае могут возникнуть проблемы с утечкой памяти.

Я знаю что некоторые используют для этой системы setElementData. Но это плохо, если можно обойтись и сделать через  vehicleEngine = { }

Верно говорю? 

И последний вопрос: vehicleEngine = { } 
Это мы создали таблицу?

Link to comment
3 hours ago, mehmet said:

Я знаю что некоторые используют для этой системы setElementData. Но это плохо, если можно обойтись и сделать через  vehicleEngine = { }

Верно говорю? 

И последний вопрос: vehicleEngine = { } 
Это мы создали таблицу?

верно. таблицу с состоянием двигателя (вкл/выкл) для каждого автомобиля из которого выходят 

Edited by K1parik
  • Like 1
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...