Jump to content

[AJUDA] CreateMarker


Recommended Posts

Olá, estou com uma duvida em uma código que estou desenvolvendo... Teria de alguma forma eu meio que fazer uma tabela de markers? Por exemplo, se eum player passar em qualquer um desses markers execute uma, e essa função seria realizada em qualquer um desses markers... Pois são muitos markers, e se eu for fazer função por função ficaria muito longo o código; Como eu poderia fazer isso?

Link to comment
local markers = {
	{x,y,z}, -- coloque a posição do marker aqui
	{-2596.6, 579.3, 15.6}, -- exemplo1
	{1202.8, 1001.5, 808.7} -- exemplo2
}

addEventHandler ( "onResourceStart", resourceRoot,
	function()
		for _,pos in ipairs(markers) do
			local marker = createMarker(pos[1], pos[2], pos[3], 'cylinder', 2.0, 255, 0, 0, 150)
			addEventHandler( "onMarkerHit", marker, MarkerHit ) 
		end
	end
)

function MarkerHit( hitElement, matchingDimension )
    local elementType = getElementType( hitElement )
    outputChatBox( elementType.." inside myMarker", getRootElement(), 255, 255, 0 )
end

 

Link to comment
1 hour ago, MaligNos said:

local markers = {
	{x,y,z}, -- coloque a posição do marker aqui
	{-2596.6, 579.3, 15.6}, -- exemplo1
	{1202.8, 1001.5, 808.7} -- exemplo2
}

addEventHandler ( "onResourceStart", resourceRoot,
	function()
		for _,pos in ipairs(markers) do
			local marker = createMarker(pos[1], pos[2], pos[3], 'cylinder', 2.0, 255, 0, 0, 150)
			addEventHandler( "onMarkerHit", marker, MarkerHit ) 
		end
	end
)

function MarkerHit( hitElement, matchingDimension )
    local elementType = getElementType( hitElement )
    outputChatBox( elementType.." inside myMarker", getRootElement(), 255, 255, 0 )
end

 

Então o que eu quero que seja executado o player passar no marker deve ser na primeira função?

Link to comment
On 07/03/2019 at 18:57, MaligNos said:

Acabei de testar e funcionou para mim! Deixa eu ver como tú colocou as coordenadas.

OK, burrada minhas dos markers não aparecerem kkk, mas enfim... Agora estou com uma dúvida, quando o player passar no marker, vai chamar um evento client-side, porém não sei se os elementos e os parâmetros de função estão corretos...

addEventHandler ("onResourceStart", resourceRoot,
	function()
		for _,pos in ipairs(markers) do
			local marker = createMarker(pos[1], pos[2], pos[3], 'cylinder', 2.0, 255, 0, 0, 150)
			addEventHandler ("onPlayerMarkerHit", marker, MarkerHit) 
		end
	end
)

function MarkerHit (hitElement, matchingDimension)
    local elementType = getElementType(hitElement)
    triggerClientEvent (source, "DeltaSCR:Abrir", getRootElement())
end

 

Link to comment

@Lord Henry @MaligNos

client-side

local font1 = dxCreateFont("font/bebas.ttf", 13)
local screenW, screenH = guiGetScreenSize()

DeltaSCR_Painel = false

function DeltaSCR_Edits()
	editDenuncia = guiCreateEdit(0.38, 0.57, 0.29, 0.04, "", true)
	editID = guiCreateEdit(0.34, 0.63, 0.33, 0.04, "", true)
	guiSetVisible (editDenuncia, false)
	guiSetVisible (editID, false)
end
addEventHandler("onClientResourceStart", resourceRoot, DeltaSCR_Edits)

function DeltaSCR_DX ()
   -- @Essa parte do DX não importa
end

function DeltaSCR_Abrir ()
	if DeltaSCR_Painel == false then
		addEventHandler ("onClientRender", getRootElement(), DeltaSCR_DX)
		guiSetVisible (editDenuncia, true)
		guiSetVisible (editID, true)
	end
end
addEvent ("DeltaSCR:Abrir", true)
addEventHandler ("DeltaSCR:Abrir", getRootElement(), DeltaSCR_Abrir)

server-side

local markers = {
	{1474.9, -1334.2, 11.8 -1}, 
	{1446.0, -1376.6, 13.5 -1},
	{2009.7, -1458.1, 13.3 -1}
}

addEventHandler ("onResourceStart", resourceRoot,
	function()
		for _,pos in ipairs(markers) do
			local marker = createMarker(pos[1], pos[2], pos[3], 'cylinder', 2.0, 255, 0, 0, 150)
			addEventHandler ("onMarkerHit", marker, MarkerHit) 
		end
	end
)

function MarkerHit ()
    triggerClientEvent (source, "DeltaSCR:Abrir", getRootElement())
end

 

Link to comment

OK, A parte de abrir o painel funcionou, agora estou com outro problema neste mesmo código: Quando eu aperto um botão, ele não executa a função que era pra ser realizada, a seguir o código...

Client-Side:

editDenuncia = guiCreateEdit(0.38, 0.57, 0.29, 0.04, "", true)
editID = guiCreateEdit(0.34, 0.63, 0.33, 0.04, "", true)
	
guiSetVisible (editDenuncia, false)
guiSetVisible (editID, false)

guiEditSetMaxLength (editDenuncia, 30)
guiEditSetMaxLength (editID, 4)

function obterDados ()
	if DeltaSCR_Painel == true then
		data1 = guiGetText(editDenuncia)
		data2 = guiGetText(editID)
	end
end

DeltaSCR_Painel = false

function DeltaSCR_DX ()
	dxDrawRectangle(screenW * 0.5914, screenH * 0.6817, screenW * 0.0781, screenH * 0.0417, tocolor(0, 150, 0, 255), false)
end

function DeltaSCR_Abrir ()
	if DeltaSCR_Painel == false then
		addEventHandler ("onClientRender", getRootElement(), DeltaSCR_DX)
		guiSetVisible (editDenuncia, true)
		guiSetVisible (editID, true)
		showCursor (true)
	end
end
addEvent ("DeltaSCR:Abrir", true)
addEventHandler ("DeltaSCR:Abrir", getRootElement(), DeltaSCR_Abrir)

function sendDenuncia (button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement)
	if DeltaSCR_Painel == true then
		if state == "down" then
			if isCursorOnElement (screenW * 0.5914, screenH * 0.6817, screenW * 0.0781, screenH * 0.0417) then
				if guiGetText(editDenuncia) == "" or guiGetText(editID) == "" then
					outputChatBox ("#ff0000Erro: Verifique os campos preenchidos e tente novamente")
					return
				end
				outputChatBox ("#00ff00Sucesso: Você enviou sua denúncia, as autoridades estão resolvendo")
			end
		end
	end
end
addEventHandler ("onClientClick", getRootElement(), sendDenuncia)

-- @Cursor Functions

function cursorPosition (x, y, w, h)
	if (not isCursorShowing()) then
		return false
	end
	local mx, my = getCursorPosition()
	local fullx, fully = guiGetScreenSize()
	cursorx, cursory = mx*fullx, my*fully
	if cursorx > x and cursorx < x + w and cursory > y and cursory < y + h then
		return true
	else
		return false
	end
end

function isCursorOnElement (x, y, w, h)
	local mx,my = getCursorPosition ()
	local fullx,fully = guiGetScreenSize()
	cursorx,cursory = mx*fullx,my*fully
	if cursorx > x and cursorx < x + w and cursory > y and cursory < y + h then
		return true
	else
		return false
	end
end

Server-Side:

local markers = {
	{1474.9, -1334.2, 11.8 -1}, 
	{1446.0, -1376.6, 13.5 -1},
	{2009.7, -1458.1, 13.3 -1}
}

addEventHandler ("onResourceStart", resourceRoot,
	function()
		for _,pos in ipairs(markers) do
			local marker = createMarker(pos[1], pos[2], pos[3], 'cylinder', 2.0, 255, 0, 0, 150)
			addEventHandler ("onMarkerHit", marker, MarkerHit) 
		end
	end
)

function MarkerHit (hitElement)
	if (getElementType(hitElement)) == "player" then
		triggerClientEvent(hitElement, "DeltaSCR:Abrir", getRootElement())
	end
end

Acredito que a parte do Server-Side não esteja influenciando em nada...

Link to comment
10 hours ago, MaligNos said:

Coloque DeltaSCR_Painel = true na função DeltaSCR_Abrir

Como não pensei nisso antes ? Realmente era o que faltava; Quanto aos parâmetros de função da linha 34 acho que estão incorretos... Mas acho que consigo resolver aqui

Link to comment

Ainda restou-me uma dúvida neste mesmo código: Pretendo obter o texto da editBox, Juntamente com Nome do Player que utilizou o painel, porém eu queria que fosse exibido um outputChatBox para uma ACL Especifica, porém verificação de ACL se não me engano é somente em server-side, como eu poderia fazer isso?

Link to comment

Então, eu tentei fazer aqui usando o que o @Lord Henry me passou porém estou com os seguintes problemas:

  1. O outputChatBox não está sendo enviado para os policiais da ACL determinada;
  2. Quando eu aperto no botão de "enviar", aparece a seguinte mensagem no debugscript3:
Spoiler

WARNING: [SCR]PainelDenuncia\DeltaSCR_client:98 Bad argument @ 'triggerServerEvent' [Expected string at argument 1, got root]

A Seguir os códigos (server-side e client-side):

 

Client-Side

local font1 = dxCreateFont("font/bebas.ttf", 13)
local screenW, screenH = guiGetScreenSize()

editDenuncia = guiCreateEdit(0.38, 0.57, 0.29, 0.04, "", true)
editID = guiCreateEdit(0.34, 0.63, 0.33, 0.04, "", true)
	
guiSetVisible (editDenuncia, false)
guiSetVisible (editID, false)

guiEditSetMaxLength (editDenuncia, 30)
guiEditSetMaxLength (editID, 4)

function obterDados ()
	if DeltaSCR_Painel == true then
		data1 = guiGetText(editDenuncia)
		data2 = guiGetText(editID)
	end
end

DeltaSCR_Painel = false

function DeltaSCR_DX ()
	dxDrawRectangle(screenW * 0.5914, screenH * 0.6817, screenW * 0.0781, screenH * 0.0417, tocolor(0, 150, 0, 255), false) -- @Botão de Envio
end
-- addEventHandler ("onClientRender", getRootElement(), DeltaSCR_DX)

function DeltaSCR_Abrir ()
	if DeltaSCR_Painel == false then
		DeltaSCR_Painel = true
		addEventHandler ("onClientRender", getRootElement(), DeltaSCR_DX)
		guiSetVisible (editDenuncia, true)
		guiSetVisible (editID, true)
		showCursor (true)
	end
end
addEvent ("DeltaSCR:Abrir", true)
addEventHandler ("DeltaSCR:Abrir", getRootElement(), DeltaSCR_Abrir)

function sendDenuncia (button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement)
	if DeltaSCR_Painel == true then
		if state == "down" then
			if isCursorOnElement (screenW * 0.5914, screenH * 0.6817, screenW * 0.0781, screenH * 0.0417) then
				if guiGetText(editDenuncia) == "" or guiGetText(editID) == "" then
					outputChatBox ("Erro: Verifique os campos preenchidos e tente novamente")
					return
				end
				outputChatBox ("Sucesso: Você enviou sua denúncia, as autoridades estão resolvendo")
				triggerServerEvent(root, "DeltaSCR:ACL", getRootElement())
				DeltaSCR_Painel = false
				removeEventHandler ("onClientRender", getRootElement(), DeltaSCR_DX)
				guiSetVisible (editDenuncia, false)
				guiSetVisible (editID, false)
				showCursor (false)
			end
		end
	end
end
addEventHandler ("onClientClick", getRootElement(), sendDenuncia)

-- @Cursor Functions

function cursorPosition (x, y, w, h)
	if (not isCursorShowing()) then
		return false
	end
	local mx, my = getCursorPosition()
	local fullx, fully = guiGetScreenSize()
	cursorx, cursory = mx*fullx, my*fully
	if cursorx > x and cursorx < x + w and cursory > y and cursory < y + h then
		return true
	else
		return false
	end
end

function isCursorOnElement (x, y, w, h)
	local mx,my = getCursorPosition ()
	local fullx,fully = guiGetScreenSize()
	cursorx,cursory = mx*fullx,my*fully
	if cursorx > x and cursorx < x + w and cursory > y and cursory < y + h then
		return true
	else
		return false
	end
end

 

Server-Side

local markers = {
	{1474.9, -1334.2, 11.8 -1}, 
	{1446.0, -1376.6, 13.5 -1},
	{2009.7, -1458.1, 13.3 -1}
}

addEventHandler ("onResourceStart", resourceRoot,
	function()
		for _,pos in ipairs(markers) do
			local marker = createMarker(pos[1], pos[2], pos[3], 'cylinder', 2.0, 255, 0, 0, 150)
			addEventHandler ("onMarkerHit", marker, MarkerHit) 
		end
	end
)

function MarkerHit (hitElement)
	if (getElementType(hitElement)) == "player" then
		triggerClientEvent(hitElement, "DeltaSCR:Abrir", getRootElement())
	end
end

function verifyACL (thePlayer)
	local players = getElementsByType ("player")
	for _, thePlayer in ipairs (players) do
		local account = getAccountName (getPlayerAccount(thePlayer))
		if isObjectInACLGroup ("user."..account, aclGetGroup ("ComandosPolicia")) then
			outputChatBox ("Denuncia de furto em: "..edit1.." ID: "..edit2.."")
		end
	end
end
addEvent ("DeltaSCR:ACL", true)
addEventHandler ("DeltaSCR:ACL", getRootElement(), verifyACL)

 

Conclusão:

O que eu quero que aconteça é:

  1. O Player abre o Painel através de um Marker;
  2. Coloca sua denuncia na EditBox;
  3. Conclui a denuncia a partir do botão enviar e fecha o painel
  4. Essa denuncia deverá aparecer em forma de outputChatBox á todos os Players que estejam na ACL "ComandosPolicia"
Link to comment
  • Other Languages Moderators

Seu triggerServerEvent está errado. Nem na wiki ele faz assim. Da onde vc tirou que o primeiro argumento é um elemento root?

triggerServerEvent ( string event, element theElement, [arguments...] )

Além disso, você não passou nenhum parâmetro de player pelo triggerServerEvent. Isso significa que no server o parâmetro de função thePlayer não existe na função verifyACL.

Troque seu trigger no client por isso:

triggerServerEvent("DeltaSCR:ACL", localPlayer, guiGetText(editDenuncia), guiGetText(editID))

E lá na função server-side, troque a função inteira por essa:

function verifyACL (edit1, edit2) -- Parâmetros passados no trigger.
	local players = getElementsByType ("player")
	for _, thePlayer in ipairs (players) do
		local account = getAccountName (getPlayerAccount(thePlayer))
		if isObjectInACLGroup ("user."..account, aclGetGroup ("ComandosPolicia")) then -- Para cada jogador que está na ACL Group "ComandosPolicia", faça:
			outputChatBox ("Denúncia de furto em: "..edit1..". ID: "..edit2, thePlayer)
		end
	end
end
addEvent ("DeltaSCR:ACL", true)
addEventHandler ("DeltaSCR:ACL", getRootElement(), verifyACL)

 

  • Like 1
Link to comment
11 hours ago, Lord Henry said:

Seu triggerServerEvent está errado. Nem na wiki ele faz assim. Da onde vc tirou que o primeiro argumento é um elemento root?


triggerServerEvent ( string event, element theElement, [arguments...] )

Além disso, você não passou nenhum parâmetro de player pelo triggerServerEvent. Isso significa que no server o parâmetro de função thePlayer não existe na função verifyACL.

Troque seu trigger no client por isso:


triggerServerEvent("DeltaSCR:ACL", localPlayer, guiGetText(editDenuncia), guiGetText(editID))

E lá na função server-side, troque a função inteira por essa:


function verifyACL (edit1, edit2) -- Parâmetros passados no trigger.	local players = getElementsByType ("player")	for _, thePlayer in ipairs (players) do		local account = getAccountName (getPlayerAccount(thePlayer))		if isObjectInACLGroup ("user."..account, aclGetGroup ("ComandosPolicia")) then -- Para cada jogador que está na ACL Group "ComandosPolicia", faça:			outputChatBox ("Denúncia de furto em: "..edit1..". ID: "..edit2, thePlayer)		end	endendaddEvent ("DeltaSCR:ACL", true)addEventHandler ("DeltaSCR:ACL", getRootElement(), verifyACL)

 

OK, vou testar, agora outra dúvida, como eu poderia fazer para o player fazer uma denúncia , e quando ele fizer a mesma, só poderá fazer outra após 10m?

Edited by #DeltaSCR
Link to comment

Como ele mesmo disse, coloque dentro da função, tente assim:

 

local timers = {}

function verifyACL (edit1, edit2) -- Parâmetros passados no trigger.
	local players = getElementsByType ("player")
	for _, thePlayer in ipairs (players) do
		local account = getAccountName (getPlayerAccount(thePlayer))
		if isObjectInACLGroup ("user."..account, aclGetGroup ("ComandosPolicia")) then -- Para cada jogador que está na ACL Group "ComandosPolicia", faça:
			timers[thePlayer] = setTimer(function()
				outputChatBox ("Denúncia de furto em: "..edit1..". ID: "..edit2, thePlayer)
			end, 600000, 1)
		end
	end
end
addEvent ("DeltaSCR:ACL", true)
addEventHandler ("DeltaSCR:ACL", getRootElement(), verifyACL)

OBS: Não testei

Link to comment

Substitua a seguinte função no lado cliente:

local tempo = false
function DeltaSCR_Abrir ()
	if tempo then
		return outputChatBox("*Aguarde para poder fazer outra denúncia!",255,0,0)
	end

	if DeltaSCR_Painel == false then
		DeltaSCR_Painel = true
		addEventHandler ("onClientRender", getRootElement(), DeltaSCR_DX)
		guiSetVisible (editDenuncia, true)
		guiSetVisible (editID, true)
		showCursor (true)
		tempo = true
		setTimer(function()
			tempo = false
		end,600000,1)
	end
end
addEvent ("DeltaSCR:Abrir", true)
addEventHandler ("DeltaSCR:Abrir", getRootElement(), DeltaSCR_Abrir)

 

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