Jump to content

Script carregamento [ajuda]


Recommended Posts

Boa tarde pessoal! Tudo certo?

Então eu comecei a desenvolver uns trabalhos pra MTA, porém to enfrentando alguns problemas quando eu rodo eles em um servidor com mais de um jogador, por exemplo esse trabalho de carregador que eu estou desenvolvendo ainda, ele consiste em pegar a carga e levar para a balsa e dai em diante fazer a entrega do mesmo, mas na parte de fazer a entrega ainda não fiz, meu problema é o seguinte, quando o jogador pega a carga, é criado um marker aonde ele tem que levar a carga para ela aprecer em cima da balsa certo? Ok até aí beleza, o problema é se eu pegar a carga e outro player ir no mesmo lugar do marker que faz a carga ir para a balsa, ele ativa e a minha carga que eu ia levar some e aparece la sem eu ter ativado o marker, então meu problema é esse o script ele ta entendo como todos os players fossem um só (cada player que começa a trabalhar seja diferente que o outro), eu queria saber como eu faço pra bloquear isso abaixo está o código:

server-side

mCarregamento = createMarker(-2253.13, 2387.62, 3.95, "cylinder", 2, 255, 0, 0, 255, getRootElement())
balsa = createVehicle (454, -2224.43, 2432.65, 2.14, 0, 0, 45)

function criarObjeto(thePlayer)
	if getPedOccupiedVehicle(thePlayer) then return end
		if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then
			if source == mCarregamento then
				obj1 = createObject(964, -2260.14, 2382.28, 3.90, 0, 0, 0, true)
				setObjectScale (obj1, 0.5)
				ox, oy, oz = getElementPosition(obj1)
				mObjeto = createMarker(ox, oy, oz, "cylinder", 2.5, 255, 0, 0, 255, thePlayer)
				addEventHandler("onMarkerHit", mObjeto, carregarObjeto)
			end			
		end		
end
addEventHandler("onMarkerHit", mCarregamento, criarObjeto)

function carregarObjeto(thePlayer)
	if getPedOccupiedVehicle(thePlayer) then return end
		if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then
			if source == mObjeto then	
				setPedAnimation( thePlayer, "CARRY", "liftup", 1.0, false )
				setTimer(function()
					setPedAnimation( thePlayer, nil )
					setPedAnimation( thePlayer, "CARRY", "crry_prtial", 4.1, true, true, true )
					attachElementToElement(obj1, thePlayer, 0, 0.5, 0.3)
					toggleControl( thePlayer, "jump", false )
					toggleControl( thePlayer, "fire", false )
					destroyElement(mObjeto)
					mEntrega = createMarker(-2230.40, 2438.80, 1.49, "cylinder", 2, 255, 0, 0, 255, thePlayer)
					mEntrega2 = createMarker(-2230.40, 2438.80, 1.49, "cylinder", 2, 255, 0, 0, 0, thePlayer)
					bEntrega = createBlipAttachedTo(mEntrega, 0, 2, 255, 0, 0, 255, 0, 999, thePlayer)
					addEventHandler("onMarkerHit", mEntrega, entregarObjeto)
						end, 1000, 1)
			end			
		end		
end

function entregarObjeto(thePlayer)
	if getPedOccupiedVehicle(thePlayer) then return end
		if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then
			if source == mEntrega then
				setPedAnimation( thePlayer, "CARRY", "liftup", 1.0, false )
				setTimer(function ()
					setPedAnimation( thePlayer, "CARRY", "crry_prtial", 4.1, true, true, true )
					toggleControl( thePlayer, "jump", true )
					toggleControl( thePlayer, "fire", true )
					destroyElement(mEntrega)
					destroyElement(bEntrega)
				end, 1000, 1)
				addEventHandler("onMarkerHit", mEntrega2, carregarBalsa)
				destroyElement(mEntrega2)

			end			
		end		
end

function carregarBalsa(thePlayer)
	if getPedOccupiedVehicle(thePlayer) then return end
		if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then
			if source == mEntrega then	
				attachElementToElement(obj1, balsa, 0, 0, 0.3)
				createBlipAttachedTo(obj1, 0, 2, 255, 0, 0, 255, 0, 999, thePlayer)
			end
		end
end

E outra coisa se for possível, eu quero criar algo que tenha varias caixas para varias coordenadas por exemplo, quero que cada caixa que criar o jogador entregasse e ela ficasse em outra coordenada dentro da balsa. Eu teria que usar a condição FOR mas eu não entendo como ela funciona, se poder me ajudar fico muito grato pelo meu aprendizado.

Obs( o barco que estou utilizando está com textura modificada ).

Link to comment
  • Other Languages Moderators
1 hour ago, #Gubiani said:

Então eu comecei a desenvolver uns trabalhos pra MTA, porém to enfrentando alguns problemas quando eu rodo eles em um servidor com mais de um jogador

Sempre tive esse mesmo problema, hauahuahaua. Meus resources funcionam perfeitamente em server local, mas dai quando eu coloco em server público, entope de erros e bugs.

--------------

Quanto ao seu primeiro problema, sugiro que crie os markers client-side e dai verifique se o hitElement == localPlayer.
Caso não queira fazer isso, então sete uma data no marker identificando o jogador que criou aquele marker como "dono" usando setElementData  no marker, então crie uma condição que verifica se o hitElement == getElementData do marker.
O primeiro jeito tem melhor desempenho, mas você precisa tomar cuidado ao fazer o triggerClientEvent e depois o triggerServerEvent ao colidir naquele marker.

Quanto ao seu segundo problema, primeiro resolva o problema anterior antes de pensar em implementar ele. Mas já vou logo adiantando que você precisará criar uma table com todas as posições de caixas, por exemplo assim:

boxPositions = {
	[1] = {-1200.62, 522, 10}, -- Coordenadas x, y, z.
	[2] = {-1222.22, 530, 10},
	[3] = {-1224, 515, 10},
}

 

  • Thanks 1
Link to comment

Então eu fiz o esquema das datas porém ele continua bugando pra quem esta nas datas hehe, mas pra quem nao ta não buga segue a baixo:

mCarregamento = createMarker(-2253.13, 2387.62, 3.95, "cylinder", 2, 255, 0, 0, 255, getRootElement())
balsa = createVehicle (454, -2224.43, 2432.65, 2.14, 0, 0, 45)

function criarObjeto(thePlayer)
	if getPedOccupiedVehicle(thePlayer) then return end
		if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then 
			if not getElementData(thePlayer, "criar.objeto") or getElementData(thePlayer, "criar.objeto") ~= 1 then
				if source == mCarregamento then
					setElementData(thePlayer, "criar.objeto", 1)
					obj1 = createObject(964, -2260.14, 2382.28, 3.90, 0, 0, 0, true)
					setObjectScale (obj1, 0.5)
					ox, oy, oz = getElementPosition(obj1)
					mObjeto = createMarker(ox, oy, oz, "cylinder", 2.5, 255, 0, 0, 0, thePlayer)
					bObjeto = createBlipAttachedTo(mObjeto, 0, 2, 255, 0, 0, 255, 0, 999, thePlayer)
					addEventHandler("onMarkerHit", mObjeto, carregarObjeto)
				end			
			end	
		end		
end
addEventHandler("onMarkerHit", mCarregamento, criarObjeto)

function carregarObjeto(thePlayer)
	if getPedOccupiedVehicle(thePlayer) then return end
		if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then
			if not getElementData(thePlayer, "carregando.objeto") or getElementData(thePlayer, "carregando.objeto") ~= 1 then
				if source == mObjeto then	
					destroyElement(bObjeto)
					setElementData(thePlayer, "carregando.objeto", 1)
					setPedAnimation( thePlayer, "CARRY", "liftup", 1.0, false )
					setTimer(function()
						setElementData(thePlayer, "caixa.armas", 1)
						setPedAnimation( thePlayer, nil )
						setPedAnimation( thePlayer, "CARRY", "crry_prtial", 4.1, true, true, true )
						attachElements(obj1, thePlayer, 0, 0.5, 0.3)
						toggleControl( thePlayer, "jump", false )
						toggleControl( thePlayer, "fire", false )
						toggleControl( thePlayer, "sprint", false )
						toggleControl( thePlayer, "crouch", false )
						toggleControl( thePlayer, "enter_exit", false )
						destroyElement(mObjeto)
						mEntrega = createMarker(-2230.40, 2438.80, 1.49, "cylinder", 2, 255, 0, 0, 255, thePlayer)
						bEntrega = createBlipAttachedTo(mEntrega, 0, 2, 255, 0, 0, 255, 0, 999, thePlayer)
						addEventHandler("onMarkerHit", mEntrega, entregarObjeto)
							end, 1000, 1)
				end			
			end
		end			
end

function entregarObjeto(thePlayer)
	if getPedOccupiedVehicle(thePlayer) then return end
		if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then
			if getElementData(thePlayer, "caixa.armas") and getElementData(thePlayer, "caixa.armas") ~= 0 then
				if source == mEntrega then
					setPedAnimation( thePlayer, "CARRY", "liftup", 1.0, false )
					setTimer(function ()
						setPedAnimation( thePlayer, "CARRY", "crry_prtial", 4.1, true, true, true )
						toggleControl( thePlayer, "jump", true )
						toggleControl( thePlayer, "fire", true )
						toggleControl( thePlayer, "sprint", true )
						toggleControl( thePlayer, "crouch", true )
						toggleControl( thePlayer, "enter_exit", true )
						destroyElement(mEntrega)
						destroyElement(bEntrega)
						print("01")
							end, 1000, 1)
					carg1 = attachElements(obj1, balsa, 0, 0, 0.3)
					setElementData(thePlayer, "caixa.armas", 0)
					setElementData(thePlayer, "criar.objeto", 0)
					setElementData(thePlayer, "carregando.objeto", 0)
				end			
			end		
		end		
end

function teste( thePlayer, command )
	setElementData(thePlayer, "caixa.armas", 0)
	setElementData(thePlayer, "criar.objeto", 0)
	setElementData(thePlayer, "carregando.objeto", 0)
	outputChatBox("Desbugado", thePlayer, 255, 0, 0, true)
end
addCommandHandler("desbugar", teste, command)

Seria mais viável fazer o esquema dos markers e das cols na client?

Link to comment
  • Other Languages Moderators

Tente assim:

mCarregamento = createMarker(-2253.13, 2387.62, 3.95, "cylinder", 2, 255, 0, 0, 255, getRootElement())
balsa = createVehicle (454, -2224.43, 2432.65, 2.14, 0, 0, 45)

obj1 = {}
mObjeto = {}
bObjeto = {}
mEntrega = {}
bEntrega = {}

function criarObjeto (thePlayer)
	if getPedOccupiedVehicle(thePlayer) then return end
	if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then 
		if not getElementData (thePlayer, "criar.objeto") or getElementData (thePlayer, "criar.objeto") ~= 1 then
			if source == mCarregamento then
				setElementData (thePlayer, "criar.objeto", 1)
				obj1[thePlayer] = createObject(964, -2260.14, 2382.28, 3.90, 0, 0, 0, true)
				setObjectScale (obj1, 0.5)
				ox, oy, oz = getElementPosition(obj1)
				mObjeto[thePlayer] = createMarker (ox, oy, oz, "cylinder", 2.5, 255, 0, 0, 0, thePlayer)
				bObjeto[thePlayer] = createBlipAttachedTo (mObjeto, 0, 2, 255, 0, 0, 255, 0, 999, thePlayer)
				setElementData (mObjeto[thePlayer], "owner", thePlayer) -- SETA O PLAYER COMO DONO DAQUELE MARKER, assim só funciona pra esse player.
			end
		end
	end	
end
addEventHandler ("onMarkerHit", mCarregamento, criarObjeto)

function carregarObjeto (thePlayer)
	if getElementData (source, "owner") then -- Se o marker tem um dono, então:
		if getElementData (source, "owner") ~= thePlayer then return end -- Se o elemento que colidiu no marker não for o player dono dele, nada acontece.
		if getPedOccupiedVehicle (thePlayer) then return end
		if thePlayer and isElement(thePlayer) and getElementType(thePlayer) == "player" then
			if not getElementData(thePlayer, "carregando.objeto") or getElementData(thePlayer, "carregando.objeto") ~= 1 then
				if source == mObjeto[thePlayer] then
					destroyElement (bObjeto[thePlayer])
					setElementData (thePlayer, "carregando.objeto", 1)
					setPedAnimation (thePlayer, "CARRY", "liftup", 1.0, false)
					setTimer(function()
						setElementData (thePlayer, "caixa.armas", 1)
						setPedAnimation (thePlayer, nil)
						setPedAnimation (thePlayer, "CARRY", "crry_prtial", 4.1, true, true, true)
						attachElements (obj1, thePlayer, 0, 0.5, 0.3)
						toggleControl (thePlayer, "jump", false)
						toggleControl (thePlayer, "fire", false)
						toggleControl (thePlayer, "sprint", false)
						toggleControl (thePlayer, "crouch", false)
						toggleControl (thePlayer, "enter_exit", false)
						destroyElement (mObjeto[thePlayer])
						mEntrega[thePlayer] = createMarker(-2230.40, 2438.80, 1.49, "cylinder", 2, 255, 0, 0, 255, thePlayer)
						setElementData (mEntrega[thePlayer], "owner", thePlayer)
						bEntrega[thePlayer] = createBlipAttachedTo(mEntrega, 0, 2, 255, 0, 0, 255, 0, 999, thePlayer)
					end, 1000, 1)
				end
			end
		end
	end
end
addEventHandler ("onMarkerHit", getRootElement(), carregarObjeto)

function entregarObjeto(thePlayer)
	if getElementData (source, "owner") then -- Se o marker tem um dono, então:
		if getElementData (source, "owner") ~= thePlayer then return end -- Se o elemento que colidiu no marker não for o player dono dele, nada acontece.
		if getPedOccupiedVehicle (thePlayer) then return end
		if thePlayer and isElement (thePlayer) and getElementType (thePlayer) == "player" then
			if getElementData (thePlayer, "caixa.armas") and getElementData (thePlayer, "caixa.armas") ~= 0 then
				if source == mEntrega[thePlayer] then
					setPedAnimation (thePlayer, "CARRY", "liftup", 1.0, false)
					setTimer (function ()
						setPedAnimation (thePlayer, "CARRY", "crry_prtial", 4.1, true, true, true)
						toggleControl (thePlayer, "jump", true)
						toggleControl (thePlayer, "fire", true)
						toggleControl (thePlayer, "sprint", true)
						toggleControl (thePlayer, "crouch", true)
						toggleControl (thePlayer, "enter_exit", true)
						destroyElement (mEntrega[thePlayer])
						destroyElement (bEntrega[thePlayer])
						print("01")
					end, 1000, 1)
					attachElements (obj1[thePlayer], balsa, 0, 0, 0.3)
					setElementData (thePlayer, "caixa.armas", 0)
					setElementData (thePlayer, "criar.objeto", 0)
					setElementData (thePlayer, "carregando.objeto", 0)
				end
			end
		end
	end
end
addEventHandler ("onMarkerHit", getRootElement(), entregarObjeto)

Não testei. Mas deve funcionar.

Edited by Lord Henry
  • Thanks 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...