Jump to content

Pickup Money


Recommended Posts

Eu Estou querendo desenvolver um sistema que e bem usado no samp, no caso seria assim.
Um Pickup que ficaria estocado dinheiro porém que daria pra pega esse dinheiro usando comando e esse dinheiro regenerar dnv depois de um tempo mais nunca mechi com algo do tipo alguem sabe me dizer do que eu precisaria para fazer algo igual ou do tipo?

Link to comment

Segue exemplo:

local x,y,z = 0,0,0 --- coloque a posição do pickup aqui
local dinheiroPorSegundos = 1
local tempo = getRealTime().timestamp
local pickup = createPickup(x, y, z, 3, 1274, 1000)
local playerPickup = {}

addEventHandler("onPickupHit", pickup,
	function(player)
		playerPickup[player] = true
		outputChatBox("*Digite /pegar para obter os $"..obterDinheiroPickup().." acumulados neste local",player)
	end
)

addEventHandler( "onPickupLeave", pickup,
	function(player)
		if playerPickup[player] then playerPickup[player] = nil end
	end
)

addEventHandler ( "onPlayerQuit", root,
	function()
		if playerPickup[source] then playerPickup[source] = nil end
	end
)

addCommandHandler("pegar",
	function(player)
		if playerPickup[player] then
			givePlayerMoney(player,obterDinheiroPickup())
			tempo = getRealTime().timestamp
		end
	end
)

function obterDinheiroPickup()
	return (getRealTime().timestamp - tempo)*dinheiroPorSegundos
end

A cada segundo o pickup acumula + 1$ e quando alguém pega o dinheiro esse valor é zerado e continua acumulando novamente...

Ficaria bem mais minimizado o código se fosse utilizado onPickupUse no lugar do comando para pegar o dinheiro do pickup.

Edited by MaligNos
  • Thanks 1
Link to comment
  • Other Languages Moderators
2 hours ago, danilin said:

teria alguma forma de limitar? quando chega aos 10K Parasse de acumular? :\

function obterDinheiroPickup()
	local grana = (getRealTime().timestamp - tempo)*dinheiroPorSegundos -- Calcula a quantidade de grana acumulada com base no tempo real.
	if grana >= 10000 then -- Se a grana acumulada for maior ou igual a 10 mil, então:
		grana = 10000 -- A grana acumulada é igual a 10 mil.
	end
	return grana -- Essa função retorna a grana acumulada, que nunca será mais que 10 mil.
end

Tente isso nessa função.

Edited by Lord Henry
Correção de indentação.
  • Thanks 1
Link to comment
    addCommandHandler("pegar",
	function (player, pColShape, pElement)
		if playerPickup[player] then
			givePlayerMoney(player, obterDinheiroPickup())
			tempo = getRealTime().timestamp    
			local pickup = createObject( 1550, fX, fY, fZ );
            local fX, fY, fZ = getElementPosition( pColShape );	
            exports.bone_attach:attachElementToBone( pickup, pElement, 4, 0, 0.4, - -0.4, -90, 40, 0 );	
end
end)
	
addEventHandler("onPickupHit", pickup,

Estou tendo poblema em criar o objeto nas costas do jogador, na linha 6, 7, 8 mais porém quando eu digito /pegar o objeto e criado e da WARNING na linha 7 qual seria o poblema? utilizei do modo errado?

On 08/08/2018 at 14:05, Lord Henry said:

function obterDinheiroPickup()
	local grana = (getRealTime().timestamp - tempo)*dinheiroPorSegundos -- Calcula a quantidade de grana acumulada com base no tempo real.
	if grana >= 10000 then -- Se a grana acumulada for maior ou igual a 10 mil, então:
		grana = 10000 -- A grana acumulada é igual a 10 mil.
	end
	return grana -- Essa função retorna a grana acumulada, que nunca será mais que 10 mil.
end

Tente isso nessa função.

 

Link to comment
  • Other Languages Moderators
15 hours ago, danilin said:

Estou tendo poblema em criar o objeto nas costas do jogador, na linha 6, 7, 8 mais porém quando eu digito /pegar o objeto e criado e da WARNING na linha 7 qual seria o poblema? utilizei do modo errado?

Sim, você fez bem errado.

Vc declarou as variáveis fX, fY e fZ depois de usá-las no createPickup. Você deve declará-las antes, caso contrário o script vai dizer que elas não existem.

Além disso, vc está tentando pegar a posição de pColShape, mas isso não é um elemento.

E já falei pra vc parar de usar palavras reservadas para dar nome às coisas. (pickup e player.) Em vez disso, use thePickup e thePlayer.

Edited by Lord Henry
  • Thanks 1
Link to comment
local Cifrao = createPickup(  -2180.62329, -232.94133, 36.77124, 3, 1550, 1000);
local fX, fY, fZ = getElementPosition( Cifrao ); 
local pColShapeGetBox = createColSphere( fX, fY, fZ, 2 );
    
addEventHandler( "onColShapeHit", pColShapeGetBox,
function( thePlayer )
    setPedAnimation(player, "ROB_BANK", "CAT_Safe_Rob",-1, true, false, false) 
setTimer( 
function( thePlayer, pColShape )
    setPedAnimation( thePlayer, nil );							
    local fX, fY, fZ = getElementPosition( pColShape );
    local ObjP = createObject( 1550, fX, fY, fZ );
    exports.bone_attach:attachElementToBone( ObjP, thePlayer, 4, 0, 0.4, - -0.4, -90, 40, 0 );		
end, 1000,1, thePlayer, source )
    end)
		
	

neste código funciona normalmente a bolsa etc, mas e direto como pode ver, e estou com dificuldade para adicionar addCommandHandler quando eu o adiciono na função ai da aquele WARNING na linha 11 e 12;

Link to comment
  • Other Languages Moderators

Os parâmetros de função do addCommandHandler são respectivamente:

  • Player que executou o comando. (elemento) [Se o script for server-side]
  • Comando utilizado. (texto)
  • Texto 1 após o comando. (texto)
  • Texto 2 após o comando. (texto)
  • E assim por diante.

Estude seu script e comente cada linha dele para saber como ele funciona, dessa forma:

local cifrao = createPickup (-2180.62329, -232.94133, 36.77124, 3, 1550, 1000) -- Cria um pickup personalizado, com o modelo 1550 que respawna após 1 segundo.
local fX, fY, fZ = getElementPosition (cifrao) -- fX, fY e fZ recebem as coordenadas do pickup.
-- local pColShapeGetBox = createColSphere (fX, fY, fZ, 2) -- Nulo, é só usar onPickupHit.
    
addEventHandler ("onPickupHit", cifrao, function (thePlayer) -- Executa essa função quando alguém colide no pickup cifrao.
	setPedAnimation (thePlayer, "ROB_BANK", "CAT_Safe_Rob", -1, true, false, false) -- Faz o player executar essa animação.
	local objPick = createObject (1550, fX, fY, fZ) -- Cria a bolsa de dinheiro.
	setTimer (function (thePlayer) -- Após 1 segundo:
		setPedAnimation (thePlayer, nil) -- Para a animação.
		exports.bone_attach:attachElementToBone (objPick, thePlayer, 4, -0.3, 0.2, 0, -125, 0, 0) -- Anexa a bolsa nas costas do player. (Não precisa colocar ; no fim de cada linha.)
	end, 1000, 1, thePlayer)
end)

 

  • Thanks 1
Link to comment
6 hours ago, Lord Henry said:

[...]

E já falei pra vc parar de usar palavras reservadas para dar nome às coisas. (pickup e player.) Em vez disso, use thePickup e thePlayer.

Eu não creio que as palavras (player, vehicle, object, pickup, marker, blip...) sejam palavras reservadas! Se fossem, qual é a utilidade/funcionalidade delas ? eu não consigo pensar em nenhuma, possivelmente a coloração "diferente" que é definida no editor de texto do fórum seja para destacar tais "tipos" de elementos/entidades.

Talvez essas palavras pudessem ser objetos na programação orientada a objeto, mas dei uma olhada e a nomenclatura deles começam com letra maiúscula, sendo assim, Vehicle é diferente de vehicle

Vehicle.create(411, 0, 0, 3) -- ok
vehicle.create(411, 0, 0, 3) -- fail

Por favor, me esclareça se eu estiver errado, pois sempre fui acostumado a usar essas palavras...

  • Thanks 1
  • Confused 1
Link to comment
  • Other Languages Moderators
24 minutes ago, MaligNos said:

Eu não creio que as palavras (player, vehicle, object, pickup, marker, blip...) sejam palavras reservadas! Se fossem, qual é a utilidade/funcionalidade delas ? eu não consigo pensar em nenhuma, possivelmente a coloração "diferente" que é definida no editor de texto do fórum seja para destacar tais "tipos" de elementos/entidades.

Talvez essas palavras pudessem ser objetos na programação orientada a objeto, mas dei uma olhada e a nomenclatura deles começam com letra maiúscula, sendo assim, Vehicle é diferente de vehicle

Por favor, me esclareça se eu estiver errado, pois sempre fui acostumado a usar essas palavras...

Realmente, não são reservadas... Chamar assim foi equívoco meu.
São nomes de entidades utilizadas pelos arquivos XML do MTA, por exemplo arquivos .map para que seja possível obtê-los do XML para usar diretamente em um script. De fato, se for em script isolado sem XML envolvido, creio que não há problema. Mas isso se torna um vício de programação e vícios devem ser evitados. Honestamente não sei o real motivo de se evitar seu uso em variáveis ou parâmetros, mas os exemplos da Wiki sempre evitam.

<vehicle id="vehicle (Patriot) (1)" sirens="false" paintjob="3" interior="0" alpha="255" model="470" plate="IPA0VWH" dimension="0" color="95,10,21,0,0,0,0,0,0,0,0,0" posX="2160.6001" posY="-2281" posZ="13.6" rotX="0" rotY="0" rotZ="225"></vehicle>

 

  • Like 1
  • Thanks 1
Link to comment

Acho que até com XML envolvido não tenha problema, pois via scripting essas entidades são tratadas como "string": getElementsByType ( "vehicle" )
Enfim, talvez até tenha um motivo maior, mas como você mesmo disse, já se tornou um "vício de programação" para mim kkkk, dificilmente vou abandonar o uso desses nomes em variáveis :D

Link to comment
  • Other Languages Moderators

Criei um tópico na sessão internacional perguntando o motivo da Wiki sempre evitar usar os nomes das entidades nas variáveis.

Espero que eles não me ignorem. (como sempre fazem)

  • Like 1
  • Thanks 1
Link to comment
2 minutes ago, Lord Henry said:

Criei um tópico na sessão internacional perguntando o motivo da Wiki sempre evitar usar os nomes das entidades nas variáveis.

Espero que eles não me ignorem. (como sempre fazem)

Boa!

Irei tentar acompanhar lá também :D (tomara que não lhe ignorem kk)

  • Thanks 1
Link to comment
  • Other Languages Moderators
20 minutes ago, danilin said:

Ops mais uma dúvida, como eu faço para que a quantidade de dinheiro  do cifrão aparece na frente do cifrão? sendo que o Dx funciona pelo lado do cliente?

É mais fácil criar o cifrão inteiro client-side e usar um triggerServerEvent para mandar o valor acumulado pro lado server e setar no player. Pois as funções de dxDraw são feitas usando onClientRender (a cada frame) e portanto ficaria inviável ficar recebendo esse valor do server para usar no client o tempo todo.

Edited by Lord Henry
Link to comment
  • Other Languages Moderators
14 minutes ago, danilin said:

tem como seta dinheiro no pickup tbm? 
EX: /entregar ai e setado tal quantidade no pickup.

 

Depende.

Onde está guardado o valor acumulado do pickup? Numa variável ou como elementData?

Edited by Lord Henry
Link to comment
  • Other Languages Moderators
10 hours ago, danilin said:

e possivel um marker ou pickup armazenar até 500k ? 
Ex: Gerar 10k e os outros 450 ser setado?

Não há limite de estoque. Você define isso.

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