#DeltaSCR

[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?

Share this post


Link to post
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

 

Share this post


Link to post
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?

Share this post


Link to post
4 hours ago, #DeltaSCR said:

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

Quando passa no marker chama a função: MarkerHit (linha 17).

Share this post


Link to post
10 hours ago, MaligNos said:

Quando passa no marker chama a função: MarkerHit (linha 17).

Os markers não estão sendo criados, e o debug não acusa nada

 

Share this post


Link to post
9 hours ago, MaligNos said:

Mostre como ficou seu código.

Está exatamente do jeito que você mandou, apenas alterei as coordenadas 

Share this post


Link to post
37 minutes ago, #DeltaSCR said:

Está exatamente do jeito que você mandou, apenas alterei as coordenadas 

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

Share this post


Link to post
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

 

Share this post


Link to post

@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

 

Share this post


Link to post

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

Share this post


Link to post

Coloque DeltaSCR_Painel = true na função DeltaSCR_Abrir

  • Like 1

Share this post


Link to post
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

Share this post


Link to post

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?

Share this post


Link to post

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"

Share this post


Link to post

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

Share this post


Link to post
Posted (edited)
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

Share this post


Link to post

Criando uma table vazia e depois setando o timer com o jogador como índice.

local timers = {}

-- Dentro da função
timers[thePlayer] = setTimer ()...

 

  • Thanks 1

Share this post


Link to post
1 minute ago, Lord Henry said:

Criando uma table vazia e depois setando o timer com o jogador como índice.


local timers = {}

-- Dentro da função
timers[thePlayer] = setTimer ()...

 

Pode me explicar um pouco melhor? Não entendi muito bem...

@Lord HenryComo eu encaixaria esse setTimer no código?

 

Share this post


Link to post

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

Share this post


Link to post

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

Share this post


Link to post

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.