-
Posts
213 -
Joined
-
Last visited
-
Days Won
7
Posts posted by Boechat
-
-
Voce pode colocar um campo "tipo" na tabela e na hora de exibir fazer esse filtro.
-
Não recomendo que você faça com timer infinito, o desempenho não fica legal. Você pode usar a função onPlayerDamage e checar se o dano será fatal, se for, você cancela o dano, derruba o player e faz todo o resto...
function playerDamage ( attacker, weapon, bodypart, loss ) if ((getElementHealth(source) - loss) <= 0) then cancelEvent() --Faz a animação etc... end end addEventHandler ( "onPlayerDamage", root, playerDamage )
-
Então, difícil te ensinar como fazer do 0, recomendo que você passe por alguns tutoriais antes. Mas basicamente você usará a função addPedClothes para modificar a roupa e setElementModel para modificar a skin do personagem. Como você é iniciante, recomendo que comece fazendo com comandos no chat usando o addCommandoHandler e depois faça uma interface gráfica usando as funções dx ou GUI.
Vou dar um exemplo de como mudar a skin, depois você pode se aventurar aí
function mudarSkin ( player, comando, id ) --quando uma função é chamada com addCommandHandler é passado por parametro o player que a chamou, o comando e logo em seguida os parâmetros (o que você digitar depois do comando). Por exemplo: /skin 1 (player = jogador que deu o comando, comando = skin, id = 1) setElementModel(player, id) end addCommandHandler("skin", mudarSkin) --Ao dar o comando /skin vai executar a função "mudarSkin"
-
Use o evento onClientElementStreamIn nos players mortos para ativar a animação assim que ele for streamado. Esse evento é acionado quando o elemento (no caso o jogador morto) é carregado no client, ou seja, quando chega perto.
- 1
-
Salve rapaziada!
Estou criando um mod de minigun em cima de um veículo, para isso eu crio uma arma com o createWeapon mas o range está muito curtinho, pra tentar aumentar esse range eu usei a função setWeaponProperty aumentado o "weapon_range" mas o range não muda. Até muda teoricamente se eu der um output com o getWeaponProperity, mas na prática os tiros não pegam e somem ainda com um range pequeno... Alguém sabe como arrumar isso?
-
On 23/10/2021 at 09:57, MTS_LoneWolf said:
sempre que alguem abre o painel ele abre para todos os jogadores
Serverside
Arsenal = createMarker(1950.0999755859,-1444.0446777344,13.538549423218 -1, "cylinder", 1.5, 255, 10, 10, 144)
function AbrirPainel(player) --Abrir
if isObjectInACLGroup("user."..getAccountName(getPlayerAccount(player)),aclGetGroup("Policial")) then
if isElementWithinMarker(player,Arsenal) then
triggerClientEvent ("OpenPanel", getRootElement())
end
end
endaddCommandHandler("painel", AbrirPainel)
clientside
local exibindo_painel = false
function ArsenalP()
dxDrawRectangle(430, 300, 266, 215, tocolor(127, 127, 127, 100), false)dxDrawRectangle(436, 310, 250, 31, tocolor(0, 0, 0, 179), false)
dxDrawRectangle(436, 351, 250, 31, tocolor(0, 0, 0, 179), false)
dxDrawRectangle(436, 392, 250, 31, tocolor(0, 0, 0, 179), false)
dxDrawRectangle(436, 433, 250, 31, tocolor(0, 0, 0, 179), false)
dxDrawRectangle(436, 474, 250, 31, tocolor(0, 0, 0, 179), false)dxDrawText("M4A1", 532, 310, 590, 341, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
dxDrawText("Glock", 532, 351, 590, 382, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
dxDrawText("Sniper", 532, 392, 590, 423, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
dxDrawText("Taser", 532, 433, 590, 464, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
dxDrawText("Colete", 532, 474, 590, 505, tocolor(255, 255, 255, 255), 2.00, "default", "left", "top", false, false, false, false, false)
end--Abrir
function OpenP()
if exibindo_painel == false then
addEventHandler("onClientRender", getRootElement(), ArsenalP)
exibindo_painel = true
showCursor(true)
else
removeEventHandler("onClientRender", getRootElement(), ArsenalP)
exibindo_painel = false
showCursor(false)
end
endaddEvent( "OpenPanel", true )
addEventHandler( "OpenPanel", localPlayer, OpenP )Olá, boa tarde! Primeiramente, sempre que adicionar um código no fórum, use o botão <code> para facilitar a visualização.
O triggerClientEvent tem como 1° argumento opcional o client que você deseja acionar o evento. No caso, como você não definiu um destinatário, por padrão vai para todos os players (root).
Para corrigir, mude de:
triggerClientEvent ("OpenPanel", getRootElement())
Para:
triggerClientEvent (player, "OpenPanel", getRootElement())
Leia mais na página da wiki triggerClientEvent
- 1
-
No lugar de
setElementFrozen(targetPlayer, true)
coloque
setElementFrozen(targetPlayer, not isElementFrozen(targetPlayer))
Obs: pode ter ficado meio bagunçado pq opção <code> do fórum não está funcionando pra mim
- 1
-
Pra você criar uma conexão no banco de dados você deve fornecer o diretório do arquivo no 2° argumento. Veja mais detalhes do comando dbConnect na wiki.
exemplo:
conexao_teste = dbConnect( "sqlite", ":NomeDaResource/BancoDeDados.db" )
- 1
-
Acredito que não de um jeito tão simples, mas você pode usar o fileGetSize para ver o tamanho dos arquivos e o fileExists para checar os arquivos baixados.
- 1
-
15 hours ago, Archz said:
entendi e como eu poderia resolver isso? @Boechat
INTERFACE.blips é uma tabela que a posição deve ser o diretório da imagem dos blips, por exemplo: INTERFACE.blips[1] = ":ModDeMapa/blips/1.png"
Encontre onde essa tabela INTERFACE.blips é preenchida porque o erro pode estar nela...
- 1
-
Possivelmente é problema no INTERFACE.blips[ blip_icon ]. Acho que não tem uma imagem ou textura salva nessa posição da tabela, por isso o "got nil". A função esperava um material no argumento 5 porém obteve um valor nulo.
- 1
-
Desculpa mais um comentário, mas agora que me toquei que coloquei as funções mas não fiz o comando KKKK
Adicione esse código:
addCommandoHandler("setskin", function(playerSource, cmd, id, skin) --Quando der o comando setskin id = tonumber(id) --Por padrão, os comandos vem como string. Nós temos que converter para number (int) para funcionar corretamente. skin = tonumber(skin) setPlayerSkinByID (id, skin, playerSource) --Chamando a função de setar skin end)
Aproveitando o post, o 1° código que eu postei ele coloca um sistema de ID no seu servidor que facilita usos futuros, mas se quiser fazer de uma forma mais simples pode fazer assim:
Spoilerfunction setPlayerSkinByID (id, skin, adm) --Passa um int id, int skin e element(player) adm como parâmetro. local player = getPlayerByID(id) -- Chama outra função que retorna um player passando o ID do player como parâmetro. False se não achar o player. if not player then return outputChatBox("Player não encontrado.", adm) end --Se não encontrou o player mostra uma mensagem e para a função. setElementModel(player, skin) --Seta a skin desejada no player encontrado pelo ID. end function getPlayerByID(id) for i, player in ipairs(getElementsByType('player')) do --Um for que percorre todos os players online. if getAccountID(getPlayerAccount (player)) == id then --Se o ID for igual ao id passado por parâmentro, então... return player --Retorna o player e para a função. end end return false --Se percorrer todos os players e não achar o player com o ID indicado, retorna falso. end addCommandoHandler("setskin", function(playerSource, cmd, id, skin) --Quando der o comando setskin id = tonumber(id) --Por padrão, os comandos vem como string. Nós temos que converter para number (int) para funcionar corretamente. skin = tonumber(skin) setPlayerSkinByID (id, skin, playerSource) --Chamando a função de setar skin end)
-
15 hours ago, Lord Henry said:
Assim como lhe respondi no privado, o erro acontece pois ele não consegue modificar uma função nativa do MTA getServerPassword
Troque o nome da função por alguma que não seja nativa, por exemplo getServerPass e o script funcionará normalmente.
Mas não é possível sobrescrever funções nativas? Pelo que eu li nesse tópico sobre proteção de scripts achei que fosse possível...
-
Já notei um pequeno erro, corrija por favor (já que não dá para eu editar a resposta)
Troque "root" por "resourceRoot", senão vai executar o código sempre que qualquer resource iniciar, não somente a resource em questão.
Como está:
addEventHandler('onResourceStart', root, function() --Quando iniciar o mod...
Corrigido:
addEventHandler('onResourceStart', resourceRoot, function() --Quando iniciar o mod...
-
Eu postei a resposta acima sem querer antes de escrever o código, quando fui editar a resposta já tinha passado muito tempo... (acho um saco isso de ter limite de tempo para editar uma postagem)
E eu não testei o código, testa aí e traga possíveis problemas. Não esqueça de dar um /debugscript 3 para ver o erro.
function setPlayerSkinByID (id, skin, adm) --Passa um int id, int skin e element(player) adm como parâmetro. local player = getPlayerByID(id) -- Chama outra função que retorna um player passando o ID do player como parâmetro. False se não achar o player. if not player then return outputChatBox("Player não encontrado.", adm) end --Se não encontrou o player mostra uma mensagem e para a função. setElementModel(player, skin) --Seta a skin desejada no player encontrado pelo ID. end function getPlayerByID(id) for i, player in ipairs(getElementsByType('player')) do --Um for que percorre todos os players online. if getElementData(player, 'ID') == id then --Se o ID préviamente salvo no player for igual ao id passado por parâmentr, então... (!!!ATENÇÃO!!!) return player --Retorna o player e para a função. end end return false --Se percorrer todos os players e não achar o player com o ID indicado, retorna falso. end --ATENÇÃO: SE SEU SERVER JÁ TIVER UM SISTEMA DE ID PODE EXCLUIR TUDO DAQUI PRA BAIXO. E FIQUE ATENTO TAMBÉM AO NOME DO ELEMENTDATA DO ID, SE FOR DIFERENTE DE 'ID' VOCÊ DEVE MUDAR NA LINHA QUE EU COLOQUEI (!!!ATENÇÃO!!!) COMENTADO NA FRENTE. local function addPlayerDataID (player, id) setElementData(player, 'ID', id) --Seta o ID do player no elemento player (o ID a princípio é relacionado a account do player) end addEventHandler('onResourceStart', root, function() --Quando iniciar o mod... for i, player in ipairs(getElementsByType('player')) do --Um for que percorre todos os players online. local id = getAccountID(getPlayerAccount (player)) --Pega o ID da conta do player addPlayerDataID (player, id) --Chama a função para setar o ID no player. end end) addEventHandler('onPlayerLogin', root, function(thePreviousAccount, account) --Quando um player logar... local id = getAccountID(account) --Pega o ID da conta do player. addPlayerDataID (source, id) --Chama a função para setar o ID no player, que nesse caso é o source do evento.. end)
-
On 21/05/2021 at 14:09, keven said:
Estou tentando setar skin no player por ID.
alguém pode me ajudar???
exemplo de comando
/skin 1( player ) 16(ID SKIN)
Sou muito novo nessa de Script. Então me perdoe pelos erros...
----------------------------------------------------
function getSkinNameFromID(i)
local id = tonumber (i)
assert(id, "Bad argument 1 @ getSkinFromID [Number expected, got " .. type(i) .. "]")
local name = skinsTable[id]
assert(name,"Bad argument 1 @ getSkinFromID [Invaild skin ID]")
return name
endaddCommandHandler('skin',
function()
local name = getSkinNameFromID(getElementModel(localPlayer))
if name then
outputChatBox('SkinName : ('..name..') of ID ('..getElementModel(localPlayer)..')',255,255,0)
else
outputChatBox('Falha ao obter skin. ID errado ou não encontrado na tabela',255,255,0)
end
end)Para setar uma skin você deve usar a função setElementModel que recebe o elemento (no caso o player) e o ID do model (skin). Como você quer passar o ID do player, antes deve fazer uma lógica para buscar o player pelo ID.
Ficaria mais ou menos assim (observe os comentários):
-
On 25/08/2021 at 21:57, SciptNovato said:
ola sou novo no mta e gostaria que esse script fizesse com que eu ja spawnasse o carro, com o player que deu o comando dentro do carro, e se possivel, colocar pra spawnar carro em outras pessoas pelo id da pessoa, ex: /createvehicle (id da pessoa que quero que spawne o carro) (id do carro que vai spawnar)
local distance = 5 --units
-- define our handler (we'll take a variable number of parameters where the name goes, because there are vehicle names with more than one word)
function consoleCreateVehicle ( sourcePlayer, commandName, ... )
-- if a player triggered it, not the admin,
if ( sourcePlayer ) then
-- calculate the position of the vehicle based on the player's position and rotation:
local x, y, z = getElementPosition ( sourcePlayer ) -- get the player's position
local rotZ = getElementRotation ( sourcePlayer ) -- get the player's rotation around the Z axis in degrees
x = x + ( ( math.cos ( math.rad ( rotZ ) ) ) * distance ) -- calculate the X position of the vehicle
y = y + ( ( math.sin ( math.rad ( rotZ ) ) ) * distance ) -- calculate the Y position of the vehicle-- get the complete vehicle name by joining all passed parameters using Lua function table.concat
local vehicleName = table.concat({...}, " ")
-- get the vehicle's model ID from the name
local vehicleID = getVehicleModelFromName ( vehicleName )
-- if vehicle ID is valid,
if vehicleID then
-- create the vehicle using the information gathered above:
local newVehicle = createVehicle ( vehicleID, x, y, z, 0, 0, rotZ )
-- if vehicle creation failed, give the player a message
if not newVehicle then
outputConsole ( "Failed to create vehicle.", sourcePlayer )
end
end
end
end-- Attach the 'consoleCreateVehicle' function to the "createvehicle" command
addCommandHandler ( "createvehicle", consoleCreateVehicle )Cara, fiquei com preguiça de ler esse código dessa forma, da próxima vez faça como o @Lord Henry instruiu acima...
Mas basicamente você cria o veículo com o createVehicle e depois use a função warpPedIntoVehicle para colocar o player dentro do veículo.
-
20 hours ago, KiritoAguiar said:
to fazendo um script e preciso q ele pegue uma variavel q ta em outro script, outra resource msm, teria q pegar essa variavel exportando mas n to conseguindo fazer
Exemplo:
SERVER_PASSWORD = "Mw4U8Bq!##K%lBBXC0*BFLUgOTY!%Zkdv4MhD@CtP^D&ZUOfd3" function getServerPassword() -- Função q quero exportar exportada return SERVER_PASSWORD end
Meta:
<script src="SKServerIP.lua" type="server" /> <export function="getServerPassword" type="server" /> <min_mta_version server="1.5.6-9.18728" client="1.5.6-9.18728" /> <download_priority_group>2</download_priority_group>
E no outro script q quero pegar o SERVER_PASSWORD ta assim:
function teste () local senha = exports["SKServerIP"]:getServerPassword () or 0 if (senha ~= "Mw4U8Bq!##K%lBBXC0*BFLUgOTY!%Zkdv4MhD@CtP^D&ZUOfd3") then outputChatBox ("teste") end end addEventHandler ("onResourceStart", resourceRoot, teste)
E no debug da esse erro se referindo a linha 2 desse ultimo script:
Access denied @ "call" [string "?"]O nome do resource é SKServerIP? Pois percebi que é o mesmo nome do arquivo .lua, talvez você tenha confundido...
A sintaxe é assim: exports["NomeDoMod"]:getServerPassword () ou exports.NomeDoMod:getServerPassword ()
-
On 17/08/2021 at 09:43, Jaga said:
Opa funcionou para pegar o itens mas oque faz ele funcionar é eu retirando o...
if isElement(Lixeiras[i]) then destroyElement(Lixeiras[i]) end
Soque se eu retirar esse destroyElement e so colocar o setElementVisibleTo ele apenas vai fazer o marker sumir, mas mesmo assim vai continuar pegando os itens caso passe os cima, entao precisava fazer o destroyElement e dps fzr o Element voltar quando saisse e voltasse para o trabalho
É só checar se o marker está sendo exibido para o player, ou você pode mudar a lógica de criação do marker e criar eles client-side sempre que o player entrar no emprego. Da primeira forma é bem mais simples e é só colocar essa condição a mais na função "PegarLixo":
function PegarLixo(hitElement) if isElementVisibleTo ( source, hitElement ) and getElementData(hitElement, "Lixeiro") then ... ... ... ... end end
Obs: Não testei!
-
addEventHandler( "onPlayerDamage", root, function (attacker, damage, bodypart, loss) if getElementHealth(source) - loss < 80 then --Calcula se o player ficará com menos de 80 de vida com o dano. Se sim, já retira o dinheiro. takePlayerMoney( source, 100 ) --Tira 100 de dinheiro de quem sofreu dano end end)
Corrigi algumas coisinhas e diminui um pouco o código.
- 1
- 1
-
Não sei como está o funcionamento desse exports mas acho que assim vai funcionar
Mude essa linha: exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, RandomItens, random)
Para: exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, Itens[RandomItens][1], random)
*#Itens retorna um numero do tamanho do array, depois você pegou um número aleatório nesse intervalo e passou ele como referência. Você está passando o RandomItens como parâmetro, que é um número aleatório, talvez o correto não seria passar o nome do item? Já o [1] é porque você colocou os nomes dos itens dentro de outra tabela, n entendi o porquê disso já que só tem um conteúdo dentro da tabela, poderia salvar a string normal mesmo... Testa aí e me fala.
E sobre o marker, acho que se usar setElementVisibleTo como false seja mais fácil do que destruir o marker, você já está fazendo dessa forma...
-
Faltou a parte em que deixa os markers visíveis quando a pessoa entra no emprego né, mas você não postou essa parte... Mas acho que com o que eu já mandei você consegue se virar para implementar essa parte kkk
- 1
-
Você está passando o source como parâmetro, nunca faça isso! O source é o marker que foi "hitado", o 1° argumento é o hitElement (pode ser um carro, player, objeto etc...).
Você quer fazer uma função mais genérica né, eu estou meio sem tempo pra algo perfeitinho mas ficaria mais ou menos assim:
local posLixeiras = { [1] = {1983.001, -1744.44, 13.547}, [2] = {1993.668, -1738.607, 13.547}, } local Lixeiras = {} local blipLixeiras = {} addEventHandler('onResourceStart', resourceRoot, function () for i, pos in ipairs (posLixeiras) do Lixeiras[i] = createMarker(pos[1], pos[2], pos[3], "cylinder", 1.2, 70, 58, 88, 100) blipLixeiras[i] = createBlipAttachedTo(Lixeiras[i], 2) setBlipVisibleDistance(blipLixeiras[i], 2000) setElementVisibleTo(blipLixeiras[i], root, false) setElementVisibleTo(Lixeiras[i], root, false) setElementVisibleTo(Lixeiras[i], root, false) addEventHandler("onMarkerHit", Lixeiras[i], PegarLixo) end end) function getMarkerPositionInTable (marker) for i, m in ipairs (Lixeiras) do if marker == m then return i end end return false end function PegarLixo(hitElement) if getElementData(hitElement, "Lixeiro") then local i = getMarkerPositionInTable(source) if not i then return end local random = math.random(4, 20) exports["Bahamas_Inventory"]:BHM_GiveItem(hitElement, "dollars", random) setElementVisibleTo(Lixeiras[i], hitElement, false) setElementVisibleTo(blipLixeiras[i], hitElement, false) setElementFrozen(hitElement, true) setTimer(triggerClientEvent, 1100, 1, hitElement, "progressService", root, 6, "") setPedAnimation(hitElement, "uzi", "uzi_reload", 6500, true, false, false, false) setTimer(function() exports['infobox']:showInfobox(hitElement, "Você recolheu oque estava nessa lata de lixo", "success") setElementFrozen(hitElement, false) end, 6500, 1) end end
Para adicionar novas lixeiras é só colocar novas posições no posLixeiras, conforme os exemplos.
Obs: Mudei muita coisa no seu script e não testei, teste aí e traga possíveis erros que possam dar no console (digite "/debugscript 3" e fique de olho enquanto testa).
- 1
-
On 13/08/2021 at 18:51, 0Vítor said:
Estou querendo criar um script onde eu digite "/abrir" e ele abra a cela. No caso, um script que mova objeto por comando.
Use as funções createObject e moveObject para criar / mover o objeto e a função addCommandHandler para usar o comando para fazer tudo funcionar. Veja os exemplos da wiki e nos traga dúvidas / erros para que possamos ajudar
Obs: Você pode fazer isso client-side mas no seu caso talvez seja melhor fazer server-side, pois coisas no client-side só funcionaria para o player que deu o comando, já server-side a porta moveria para todos do servidor, não somente do cliente.
- 1
O que não pode faltar no RP
in Offtopic
Posted
Salve galera, gostaria da opinião de vocês das funcionalidades que não pode faltar em um bom RP.