-
Posts
3,875 -
Joined
-
Days Won
67
Everything posted by DNL291
-
? Is that what you want?
-
So buying 2x XP will increase the experience you get when you kill a player? If so, you can use getAccountData to check if player has it stored when he kills other players.
-
Replace: setElementData( source,"experience",expvalue * m ) With: setElementData( source, "experience", (getElementData( source,"experience" ) or 0) + (expvalue * m) )
-
Like I said, you need to replace it with the default value of XP you will get.
-
Try this: addEvent("onRequestXP",true) addEventHandler("onRequestXP",root,function( m ) setElementData( source,"experience",expvalue * m ) local acc = getPlayerAccount(source) if isGuestAccount ( acc ) ~= true then setAccountData( acc, "tempEXPBoostTS", tostring(getRealTime().timestamp) ) end end) addEventHandler( "onResourceStop", resourceRoot, function() for i,p in pairs(getElementsByType("player")) do if not isGuestAccount ( getPlayerAccount(p) ) then local acc = getPlayerAccount(p) local eTimestamp = tonumber( (getAccountData( acc, "tempEXPBoostTS") or 0) ) if eTimestamp ~= 0 then setAccountData( acc, "tempEXPBoostTS", nil ) end; end end end ) function checkEXPTime() for i,p in pairs(getElementsByType("player")) do if not isGuestAccount ( getPlayerAccount(p) ) then local acc = getPlayerAccount(p) local eTimestamp = tonumber( (getAccountData( acc, "tempEXPBoostTS") or 0) ) if eTimestamp ~= 0 and (getRealTime().timestamp - eTimestamp) > 86400 then outputChatBox("Your exp boost has expired", p) setAccountData( acc, "tempEXPBoostTS", nil ) end end end end -- check every 10 mins setTimer(checkEXPTime, (60*10) *1000, 0) addEventHandler( "onPlayerLogin", root, function( _, acc ) local eTimestamp = tonumber( (getAccountData( acc, "tempEXPBoostTS") or 0) ) if eTimestamp ~= 0 and (getRealTime().timestamp - eTimestamp) > 86400 then outputChatBox("Your exp boost has expired", source) setAccountData( acc, "tempEXPBoostTS", nil ) end end) -- Make sure the player has enough money (do it client side) -- 'expvalue' : The default xp given -- You call it this way: triggerServerEvent( "onRequestXP", localPlayer, 2) -- 2: 2x and 3: 3x -- * You don't need to modify 'm' I haven't tested that code. Read the comments that are in the code so you can understand some things.
-
Use getRealTime().timestamp and store the value in player's account after he bought it. And you can set a timer to check when it's finished. You can calculate the Timestamp which the 2x/3x xp will expire by using the Timestamp stored with setAccountData + 86400 (which is one day in seconds).
-
You should use mult as parameter instead. Like this: addEvent("onRequestXP",true) addEventHandler("onRequestXP",root,function( m ) setElementData( source,"experience",expvalue * m ) end)
-
Nevermind about computer's time, it'll be the current Server time since that script is server-side.. Just create a function attached to the buttons and in the function parameter, checks if it's x2 or 3 then use setElementData( player, "experience", expvalue * mult). Thats the basic ofc.
-
I can't understand what you mean... What week system do you mean? Or you're setting 'day' to another day just to test it? It will depend on what 'day' variable returns, it should return 0 or 6 in order to messages be shown. BTW, this system isn't ideal since players can change their computer's date and it will give x3 XP even if it isn't weekend.
-
Try this: if killer and (getElementType(killer) == "player") and killer ~= source then if not getElementData(source,"bandit") then addPlayerStats (killer,"humanity",math.random(-2500,-1000)) else addPlayerStats (killer,"humanity",math.random(1000,2500)) end setElementData(killer,"murders", (getElementData(killer,"murders") or 0) +1) local modifier = 1 local day = getRealTime().weekday if day == 0 then modifier = 3 elseif day == 6 then -- 0 = sun 6 = sat modifier = 2 end local experiences = math.random(200,300)*modifier setElementData(killer,"experience", (getElementData(killer,"experience") or 0) + experiences) if getElementData(killer,"humanity") < 0 then setElementData(killer,"bandit",true) end if getElementData(source,"bandit") == true then setElementData(killer,"banditskilled", (getElementData(killer,"banditskilled") or 0) +1) end if headshot == true then setElementData(killer,"headshots", (getElementData(killer,"headshots") or 0) +1) end local xX,yY,zZ = getElementPosition(source) local xk,yk,zk = getElementPosition(killer) local Distancia = getDistanceBetweenPoints3D(xX,yY,zZ,xk,yk,zk) outputChatBox("@Distancia: "..tostring(Distancia)) if day == 0 or day == 6 then outputChatBox( "[INFO]#FFFFFF Você matou: #32FF32"..getPlayerName(source):gsub('#%x%x%x%x%x%x','').."#FFFFFF || Arma: #32FF32"..(weapon or "Unknown").."#FFFFFF || Distância: #32FF32"..tostring(math.floor(Distancia)).."m #FFFFFF || Exp: #32FF32"..tostring(experiences).." ".. (tostring(modifier).."x"),killer,0,128,255,true) outputChatBox("[INFO]#FFFFFF Você foi morto por: #32FF32"..getPlayerName(killer):gsub('#%x%x%x%x%x%x','').."#FFFFFF || Arma: #32FF32"..(weapon or "Unknown").."#FFFFFF || Distância: #32FF32"..tostring(math.floor(Distancia)).."m",source,0,128,255,true) end --setTimer(function(source,killer)end,6000,1,source) triggerClientEvent("onRollMessageStart",getRootElement(),getPlayerName(source):gsub('#%x%x%x%x%x%x','').." foi morto por "..getPlayerName(killer):gsub('#%x%x%x%x%x%x',''),255,255,255, "died") else triggerClientEvent("onRollMessageStart",getRootElement(),getPlayerName(source):gsub('#%x%x%x%x%x%x','').." morreu.",255,255,255, "died") end Show what debugscript says you if you have any errors.
-
I understood. But it wasn't what I said. @AnnaBelle said in his/her previous post, that these chat messages should be shown only during weekend, not sure though. @AnnaBelle show what debugscript (/debugscript 3) shows when you get bugs with the code. Edit: I don't understand why dividing 'experiences' with 'modifier' since the actual value isn't being that. Also, modifier will still return number and not "x2" or "x3"
-
Not sure, but from what I understood, the messages should only be during the weekend. So, outputChatBox should be like this: outputChatBox( "[INFO]#FFFFFF Você matou: #32FF32"..getPlayerName(source):gsub('#%x%x%x%x%x%x','').."#FFFFFF || Arma: #32FF32"..(weapon or "Unknown").."#FFFFFF || Distância: #32FF32"..tostring(math.floor(Distancia)).."m #FFFFFF || Exp: #32FF32"..experiences.." "..(day == 0 and "3x" or "2x"),killer,0,128,255,true)
-
Just use an if statement before outputChatBox, like this: if day == 0 or day == 6 then outputChatBox("[INFO]#FFFFFF Você matou: #32FF32"..getPlayerName(source):gsub('#%x%x%x%x%x%x','').."#FFFFFF || Arma: #32FF32"..(weapon or "Unknown").."#FFFFFF || Distância: #32FF32"..tostring(math.floor(Distancia)).."m #FFFFFF || Exp: #32FF32"..experiences,killer,0,128,255,true) outputChatBox("[INFO]#FFFFFF Você foi morto por: #32FF32"..getPlayerName(killer):gsub('#%x%x%x%x%x%x','').."#FFFFFF || Arma: #32FF32"..(weapon or "Unknown").."#FFFFFF || Distância: #32FF32"..tostring(math.floor(Distancia)).."m",source,0,128,255,true) end
-
Try this: if killer and (getElementType(killer) == "player") and killer ~= source then if not getElementData(source,"bandit") then addPlayerStats (killer,"humanity",math.random(-2500,-1000)) else addPlayerStats (killer,"humanity",math.random(1000,2500)) end setElementData(killer,"murders", (getElementData(killer,"murders") or 0) +1) local modifier = 1 local day = getRealTime().weekday if day == 0 then modifier = 3 elseif day == 6 then -- 0 = sun 6 = sat modifier = 2 end local experiences = math.random(200,300)*modifier setElementData(killer,"experience", (getElementData(killer,"experience") or 0) + experiences) if getElementData(killer,"humanity") < 0 then setElementData(killer,"bandit",true) end if getElementData(source,"bandit") == true then setElementData(killer,"banditskilled", (getElementData(killer,"banditskilled") or 0) +1) end if headshot == true then setElementData(killer,"headshots", (getElementData(killer,"headshots") or 0) +1) end local xX,yY,zZ = getElementPosition(source) local xk,yk,zk = getElementPosition(killer) local Distancia = getDistanceBetweenPoints3D(xX,yY,zZ,xk,yk,zk) outputChatBox("@Distancia: "..tostring(Distancia)) outputChatBox("[INFO]#FFFFFF Você matou: #32FF32"..getPlayerName(source):gsub('#%x%x%x%x%x%x','').."#FFFFFF || Arma: #32FF32"..(weapon or "Unknown").."#FFFFFF || Distância: #32FF32"..tostring(math.floor(Distancia)).."m #FFFFFF || Exp: #32FF32"..experiences,killer,0,128,255,true) outputChatBox("[INFO]#FFFFFF Você foi morto por: #32FF32"..getPlayerName(killer):gsub('#%x%x%x%x%x%x','').."#FFFFFF || Arma: #32FF32"..(weapon or "Unknown").."#FFFFFF || Distância: #32FF32"..tostring(math.floor(Distancia)).."m",source,0,128,255,true) --setTimer(function(source,killer)end,6000,1,source) triggerClientEvent("onRollMessageStart",getRootElement(),getPlayerName(source):gsub('#%x%x%x%x%x%x','').." foi morto por "..getPlayerName(killer):gsub('#%x%x%x%x%x%x',''),255,255,255, "died") else triggerClientEvent("onRollMessageStart",getRootElement(),getPlayerName(source):gsub('#%x%x%x%x%x%x','').." morreu.",255,255,255, "died") end If the distance still doesn't return what it should, you can see on chat what the variable returns.
-
It looks like 'Distancia' is returning nil for some reason. You'll need to debug your code until you find where it's wrong, if you don't want to show your code here. Compare killer with source and make sure the killer isn't the player who died (I'm assuming you're using it inside onPlayerWasted event).
-
What 'Distancia' is returning? Where is that defined?
-
Talvez editando o objeto a ser removido e tirando essa textura que permanece corrija? Não sei se funciona por que meu conhecimento nessa área é bem básico ;/
-
Alguem Pode Me Manda Esse Script Ou Se Tem Pra Mta
DNL291 replied to VeloxGr's topic in Programação em Lua
Como eu já disse pessoal, poderiam evitar essa troca de mensagens como se fosse chat e se comunicar enviando MP. -
Não poderiam usar a ferramenta de MP em vez de fazer chat no tópico? A propósito, caso o link do site tenha resources roubados/vazados por favor deixe-me informado (via MP). Tópico trancado.
-
Boa iniciativa. Serve até pra você mesmo progredir na programação. Eu pessoalmente aprendi mais ajudando por aqui e vendo a seção global Scripting - isso juntando com a prática é a melhor forma de aprender mais rápido e se aprofundar. Acho que ele quis dizer o próprio jogador definir sua posição pelo comando. Já respondendo @lordhenry, só vai mudar os argumentos (jogador, comando, argumento_do_comando), depois do segundo argumento que vem o(s) digitados no comando pelo jogador, é fácil: function tele (sourceP, cmd, x, y, z) x, y, z = tonumber(x), tonumber(y), tonumber(z) if x and y and z then setElementPosition( sourceP, x, y, z ) else outputChatBox("Sintaxe correta: /tp x y z", sourceP) end end addCommandHandler("tp",tele)
-
Eu não usaria setElementData só pra verificar o status do jogador. Vai ser uso de largura de banda desnecessária. O código de @xeon17 deve funcionar, só tem um pequeno erro na linha 3 - o parenteses de fechar a função tá depois do 0. Obs: Pra verificar o status do jogador é só usar getPedWalkingStyle().
-
Só desativar a parte de correr.
-
Acho que me entendeu mal. Eu vi que já resolveu usando: local playeraccount = getPlayerAccount ( source ). E nada contra sobre ter funcionado, se tá tudo OK, parabéns por conseguir arrumar o código, dessa forma que aprende Lua na verdade. Eu disse sobre aquele erro "Expected element at argument 1, got nil", era por causa do: setTimer(function()... Isso cria outra função, e source passa a ser inválido. Mas passando o elemento para a função criada em setTimer vai resolver, como eu disse. Evita definir uma variável que ocupa mais memória, a na verdade é a solução mais lógica.
-
Como posso inserir informações no arquivo internal.db?
DNL291 replied to threevictor's topic in Programação em Lua
Você pode usar Timestamp, só pegar o timestamp de quando logar e grava, se já tiver gravado só pega o valor, quando sair do server/deslogar compara com o atual e você vai ter o tempo em segundos e adiciona esse tempo ao anterior, aí só converter pra hrs, segs, mins pra usar no server... -
setpedanimation Impedir animação de ser cancelada
DNL291 replied to Lord Henry's topic in Programação em Lua
Já tentou cancelando esse evento: https://wiki.multitheftauto.com/wiki/OnClientKey ? Edit: addEventHandler( "onClientKey", root, function(button, press) if button == "" then cancelEvent() end end ) Só checar se a tecla é a que interrompe a animação, e usa cancelEvent(). Na mesma checagem você vai precisar de alguma variável, pra saber se essa animação tá ativa.