Keven Campos
Members-
Posts
11 -
Joined
-
Last visited
Keven Campos's Achievements
Square (6/54)
0
Reputation
-
Asuramaru started following Keven Campos
-
Keven Campos started following Lord Henry
-
deu certo, muito obrigado ?
-
Ignora a resposta acima, falei besteira. A Parte que salva a tunagem está na concessionaria, porém ela salva somente os upgrades, e eles não envolvem algumas coisas como por exemplo a handling do veiculo. Os Upgrades ta sendo salvo por sqlite, através do getVehicleUpgrades (https://wiki.multitheftauto.com/wiki/GetVehicleUpgrades) ele está salvando os upgrades porem tentei seguir o mesmo padrão para o getVehicleHandling e não obtive resultado, provavelmente porque ele retorna um tipo de tabela diferente --Servidor for _, upgradee in ipairs (getVehicleUpgrades(theVehicle)) do if upgrade == "" then upgrade = upgradee else upgrade = upgrade..","..upgradee end end handling = "" -- Essa parte foi minha tentativa frustada de tentar obter as Hand do veiculo for _, hand in ipairs (getVehicleHandling(theVehicle)) do if handling == "" then handling = hand else handling = handling..","..hand end end dbExec(db, "UPDATE VehicleList SET X = ?, Y = ?, Z = ?, RotZ = ?, Handling = ?, HP = ?, Colors = ?, Upgrades = ?, Paintjob = ?, new_hydr = ? WHERE Account = ? AND ID = ?", x, y, z, rz, handling, getElementHealth(theVehicle), color, upgrade, Paintjob, getElementData(theVehicle, "veh:fuel"), getAccountName(getPlayerAccount(Owner)), id) Tentei utilizar o getVehicleUpgrades no lugar onde esta o getVehicleHandling e retornou corretamente os Upgrades
-
Tenho um script de plotagem que enquanto o player ta no servidor funciona normalmente, porem depois que ele reconecta no servidor perde a plotagem, tentei usar um laço for para setar a mesma plotagem para todos os veiculo (somente para teste) porem não obtive resultados, somente quando a plotagem já tinha sido colocada antes do reconnect -- Lado Servidor addEvent("AddShaderToAllPlayer", true) addEventHandler("AddShaderToAllPlayer", root, function(vehicle, shader) triggerClientEvent(source, "AddShaderToAllPlayer", source, vehicle, shader) end) local markersPostos = { {city = "LS-1", x = 2750.817, y = -965.806, z = 59.815 -1, style = "cylinder", font = 1.5, r = 255, g = 165, b = 0, opaccity = 170}, -- ONDE O MARKER SERA CRIADO } function createBlipBuyVtr() for i,v in ipairs(markersPostos) do local m = createMarker(v.x, v.y, v.z, v.style, v.font, v.r, v.g, v.b, v.opaccity) addEventHandler("onMarkerHit", m, criarVeh) end end addEventHandler("onResourceStart", root, createBlipBuyVtr) local vtrs = { ["pcerj"] = {aclGroup = "PC", skinName = "PCERJ"}, ["bope"] = {aclGroup = "BOPE", skinName = "BOPE"}, ["core"] = {aclGroup = "Staff", skinName = "CORE"}, ["pmerj"] = {aclGroup = "PMERJ", skinName = "PMERJ"}, -- ["teste"] = {aclGroup = "pcerj", skinName = "ft"}, -- EXEMPLO < } -- TABELA COM AS INFORMACOES DO NOME DO GRUPO E NOME DA SKIN. PARA ADICIONAR, BASTA COPIAR E COLAR A ULTIMA LINHA E MUDAR OS NOMES QUE ESTAO DENTRO DAS ASPAS ("") local veh = {} function criarVeh(player) if getElementType(player) == "player" then if isPedInVehicle(player) == false then if veh[player] == nil then local accName = getAccountName(getPlayerAccount(player)) local x, y, z = getElementPosition(player) if (isObjectInACLGroup("user." .. accName, aclGetGroup(vtrs["bope"].aclGroup))) or (isObjectInACLGroup("user." .. accName, aclGetGroup(vtrs["core"].aclGroup))) or (isObjectInACLGroup("user." .. accName, aclGetGroup(vtrs["pmerj"].aclGroup))) or (isObjectInACLGroup("user." .. accName, aclGetGroup(vtrs["pcerj"].aclGroup))) then veh[player] = createVehicle(598, x, y, z, 0, 0, 180) -- POSICAO ONDE O CARRO VAI SPAWNAR warpPedIntoVehicle(player, veh[player]) -- VAI MOVER O PLAYER PARA DENTRO DO CARRO end end end end end function verifyGroupAcl(player, cmd, skinName) -- FUNCAO QUE VERIFICA E SETA A SKIN CASO O PLAYER TENHA PERMISSAO local accName = getAccountName(getPlayerAccount(player)) -- PEGA O NOME DA CONTA DO PLAYER local vehicle = getPedOccupiedVehicle(player) -- PEGA O VEICULO QUE O PLAYER ESTA DENTRO actualSkin = skinName .. ".png" -- A VARIAVEL actualSkin TERA O VALOR DE NOME-SKIN.PNG if not(getElementData(vehicle, "Shader:Vehicle") == actualSkin) then -- VERIFICA SE A ULTIMA SKIN USADA EH DIFERENTE DA OPCAO SOLICITADA ATUAL if (isObjectInACLGroup("user." .. accName, aclGetGroup(vtrs["bope"].aclGroup)) and skinName == vtrs["bope"].skinName) then -- bope setElementData(vehicle, "Shader:Vehicle", vtrs["bope"].skinName .. ".png") -- ATUALIZA NO GETELEMENTDATA QUAL A SKIN QUE ESTA SENDO UTILIZADA PELO PLAYER triggerClientEvent(player, "onPlayerGetAclName", player, actualSkin) -- CHAMA O EVENTO QUE VAI TROCAR A SKIN, PASSANDO O NOME DA SKIN elseif (isObjectInACLGroup("user." .. accName, aclGetGroup(vtrs["core"].aclGroup)) and skinName == vtrs["core"].skinName) then -- core setElementData(vehicle, "Shader:Vehicle", vtrs["core"].skinName .. ".png") -- ATUALIZA NO GETELEMENTDATA QUAL A SKIN QUE ESTA SENDO UTILIZADA PELO PLAYER triggerClientEvent(player, "onPlayerGetAclName", player, actualSkin) -- CHAMA O EVENTO QUE VAI TROCAR A SKIN, PASSANDO O NOME DA SKIN elseif (isObjectInACLGroup("user." .. accName, aclGetGroup(vtrs["pmerj"].aclGroup)) and skinName == vtrs["pmerj"].skinName) then -- pcerj setElementData(vehicle, "Shader:Vehicle", vtrs["pmerj"].skinName .. ".png") -- ATUALIZA NO GETELEMENTDATA QUAL A SKIN QUE ESTA SENDO UTILIZADA PELO PLAYER triggerClientEvent(player, "onPlayerGetAclName", player, actualSkin) -- CHAMA O EVENTO QUE VAI TROCAR A SKIN, PASSANDO O NOME DA SKIN elseif (isObjectInACLGroup("user." .. accName, aclGetGroup(vtrs["pcerj"].aclGroup)) and skinName == vtrs["pcerj"].skinName) then -- EXEMPLO PARA CRIACAO DE OUTROS CARROS setElementData(vehicle, "Shader:Vehicle", vtrs["pcerj"].skinName .. ".png") triggerClientEvent(player, "onPlayerGetAclName", player, actualSkin) else outputChatBox("Você não tem autorização para usar essa skin.", player, 255, 255, 255, true) -- CASO ELE NAO TENHA PERMISSAO PARA TROCAR A SKIN DA VTR end end end addCommandHandler("vtr", verifyGroupAcl) -- COMANDO PARA MUDAR A SKIN DA VTR /vtr [nome-skin] addCommandHandler("coremoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "CORE.png") end ) addCommandHandler("pcmoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "PCERJ.png") end ) addCommandHandler("bopemoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "BOPE.png") end ) addCommandHandler("choquemoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "chq.png") end ) addCommandHandler("coemoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "coe.png") end ) addCommandHandler("ftmoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "ft.png") end ) addCommandHandler("pmerjmoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "PMERJ.png") end ) addCommandHandler("rotamoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "rota.png") end ) addCommandHandler("tormoura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "tor.png") end ) addCommandHandler("tor2moura", function (player) local vehicle = getPedOccupiedVehicle(player) setElementData(vehicle, "Shader:Vehicle", "tor2.png") end ) addCommandHandler("getpmoura", function(player) local x, y, z = getElementPosition(player) outputChatBox(x .. ", " .. y .. ", " .. z) end ) function carregarVehLogin(_) for i, veh in ipairs(getElementsByType("vehicle")) do setElementData(veh, "Shader:Vehicle", "BOPE.png") -- VAI ATUALIZAR O NOME DA SKIN DENTRO DO getElementData end outputDebugString ( "Iniciado o shader" ) end addCommandHandler("vhs", carregarVehLogin) -- Comando para testar -- -- Client txd = engineLoadTXD ( "base.txd" ) engineImportTXD ( txd, 598 ) dff = engineLoadDFF ( "base.dff" ) engineReplaceModel ( dff, 598 ) addEvent("onPlayerGetAclName", true) -- CRIACAO DO EVENTO onPlayerGetACLName que e chamado no arquivo shader_s.lua addEventHandler("onPlayerGetAclName", root, -- DECLARACAO DO EVENTO EM FORMA DE FUNCAO ANONIMA function (skinName) -- A FUNCAO VAI RECEBER O NOME DA SKIN theTechnique = dxCreateShader( "shader.fx" ) -- VAI CARREGAR O ARQUIVO COM O SHADER local vehicle = getPedOccupiedVehicle(localPlayer) -- VAI PEGAR O VEICULO QUE O PLAYER ESTIVER DENTRO setElementData(vehicle, "Shader:Vehicle", skinName) -- VAI ATUALIZAR O NOME DA SKIN DENTRO DO getElementData end ) addEventHandler("onClientElementDataChange", root, function(key, old, new) if key == "Shader:Vehicle" then theTechnique = dxCreateShader( "shader.fx" ) terrain = dxCreateTexture(new) dxSetShaderValue(theTechnique, "gTexture", terrain) engineApplyShaderToWorldTexture(theTechnique, "MisticStore", source) engineApplyShaderToWorldTexture(theTechnique, "?emap*", source) end end)
-
Opa, tudo bom ? vou deixar uma parte abaixo if selectedSubCategory == 10 then -- Air-Ride if hoveredCategory == equippedTuning then giveNotification("error", getLocalizedText("notification.error.itemIsPurchased", loopTable[hoveredCategory]["categoryName"])) promptDialog["state"] = false else if hasPlayerMoney(loopTable[hoveredCategory]["tuningPrice"]) then setElementData(enteredVehicle, "tuning.airRide", loopTable[hoveredCategory]["tuningData"], true) if hoveredCategory == 1 then removeAirRide(enteredVehicle) end equippedTuning = hoveredCategory moneyChange(loopTable[hoveredCategory]["tuningPrice"]) promptDialog["state"] = false else giveNotification("error", getLocalizedText("notification.error.notEnoughMoney")) promptDialog["state"] = false end end elseif selectedSubCategory == 11 then -- Lamp color if hasPlayerMoney(loopTable[hoveredCategory]["tuningPrice"]) then savedVehicleColors["all"] = {getVehicleColor(enteredVehicle, true)} savedVehicleColors["headlight"] = {getVehicleHeadLightColor(enteredVehicle)} triggerServerEvent("tuning->Color", localPlayer, enteredVehicle, savedVehicleColors["all"], savedVehicleColors["headlight"]) equippedTuning = -1 moneyChange(loopTable[hoveredCategory]["tuningPrice"]) promptDialog["state"] = false else giveNotification("error", getLocalizedText("notification.error.notEnoughMoney")) promptDialog["state"] = false end elseif selectedSubCategory == 12 then -- Neon if hasPlayerMoney(loopTable[hoveredCategory]["tuningPrice"]) then saveNeon(enteredVehicle, loopTable[hoveredCategory]["tuningData"], true) equippedTuning = hoveredCategory moneyChange(loopTable[hoveredCategory]["tuningPrice"]) promptDialog["state"] = false else giveNotification("error", getLocalizedText("notification.error.notEnoughMoney")) promptDialog["state"] = false end end end Cara, confesso estar um tanto perdido nesse código, aparentemente ele salva em elementData ? eu necessitava setar as handling no veiculo após spawnar ele pelo painel da concessionaria, a concessionaria salva através de SQLite os veiculos, quando eu destruo o veiculo comprado e spawno ele novamente não acompanha tunagem
-
Gostaria de saber como eu poderia salvar a tunagem de um veiculo, quais funções eu poderia usar acredito que após tunar o veiculo ter uma verificação as alterações feitas e salvar em um elementdata ? faz um tempo que eu estou perdido nisso e não encontro nem um mod para estudo
-
Keven Campos started following Blaack
-
Realmente, nesta situação acho que não seria possível um sistema eficiente com os métodos que eu coloquei como exemplo ?
-
poderia criar uma Tabela para armazenar os valores, Exemplo: -- Lado servidor staffOnline = {} -- Uma tabela vazia, poderia ser qualquer nome --[[ QUANDO O JOGADOR ENTRAR ]] addEventHandler("onPlayerLogin", root, function() local conta = getAccountName ( getPlayerAccount ( source ) ) -- Pega if isObjectInACLGroup ("user."..tostring(conta), aclGetGroup ( "Staff" ) ) then -- Se o jogador estiver no Grupo staff table.insert(staffOnline, 1) -- Aqui adiciona um item na tabela, aumentando o tamanho dela toda vez que alguem do Grupo Staff entre end ) --[[ QUANDO O JOGADOR DESCONECTAR ]] function JogadorQuit ( quitType ) local conta = getAccountName ( getPlayerAccount ( source ) ) -- Pega if isObjectInACLGroup ("user."..tostring(conta), aclGetGroup ( "Staff" ) ) then -- Se o jogador estiver no Grupo staff table.remove(staffOnline) -- Remove o "usuario" da tabela end end addEventHandler ( "onPlayerQuit", getRootElement ( ), JogadorQuit ) Se usado "#staffOnline" Você consegue obter o tamanho desta tabela. realmente não sei se funcionaria, mais talvez seja algo que vale apena pensar Não testei o codigo acima
-
Qualquer painel buga dentro dos interiores do mta
Keven Campos replied to SrJhony's topic in Portuguese / Português
Também já tive o mesmo problema. Sugiro que você inicie somente um mod que tenha Painel e tente usa-lo, se o painel não ficar invisível então tem algum mod que está dando conflito, sendo assim sugiro que você inicie os Mod um por um até achar o "mod problemático" -
Bom, gostaria de saber como posso trocar a skin do CJ (ID 0), eu tentei usar uma skin que já tenho no servidor e dar replace no ID 0 porém sem sucesso, métodos como o abaixo não funcionou txd = engineLoadTXD ( "MinhaSkin.txd" ) engineImportTXD ( txd, 0 ) dff = engineLoadDFF ( "MinhaSkin.dff" ) engineReplaceModel ( dff, 0 ) Isso foi um exemplo, estou longe do meu computador no momento
-
Eu estou começando na programação e fiz um script que me parece um pouco "sujo", me da a impressão que ele pode acabar dando lag, vou deixar uma parte dele abaixo -- Lado Server: ----------------------------------------------- DAR PERMISSÕES -------------------------------- function SkinAdmin (thePlayer) -- Nome da função aleatoria, quando começei pensava em outro sistema local nomeConta = getPlayerName (thePlayer) local ID = getElementData ( thePlayer, "ID" ) or "N/C" local time = getRealTime() local hours = time.hour local minutes = time.minute local acc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..acc, aclGetGroup("Fundador")) then -- O Grupo "Fundador" permanece no player, é o que faz com que ele possa usar o comando /atender aclGroupAddObject (aclGetGroup("FundadorP"), "user."..acc) -- Este grupo tem as permissões do painel P e comandos externos setElementData(thePlayer,"onProt",true) -- "onProt" é o sistema de ivulnerabilidade (/pro) setElementModel(thePlayer, 140) -- skin de staff exports.webhook:sendDiscordMessage("O Fundador: "..nomeConta.."["..ID.."] entrou em modo atendimento. Horario: "..hours..":"..minutes.."") -- Aqui está mandando um log pro discord outputChatBox("#1e90ff[Servidor] #ffffffVocê entrou em modo atendimento.", thePlayer, 255, 255, 255,true ) -- Para mostrar que o comando funcionou triggerClientEvent(thePlayer, "FM_SkinAdmin", thePlayer) -- Aparece um painel pequeno em DX pra lembrar que ele está em "Modo Atendimento", se causar um lag significativo pelo triggerClientEvent eu posso tirar. ----------------------------------------------- elseif isObjectInACLGroup ("user."..acc, aclGetGroup("Organizador")) then aclGroupAddObject (aclGetGroup("OrganizadorP"), "user."..acc) setElementData(thePlayer,"onProt",true) setElementModel(thePlayer, 140) exports.webhook:sendDiscordMessage("O Organizador: "..nomeConta.."["..ID.."] entrou em modo atendimento. Horario: "..hours..":"..minutes.."") outputChatBox("#1e90ff[Servidor] #ffffffVocê entrou em modo atendimento.", thePlayer, 255, 255, 255,true ) triggerClientEvent(thePlayer, "FM_SkinAdmin", thePlayer) end end addCommandHandler ("atender", SkinAdmin) -- Tirar permissoões -- function TirarP (thePlayer) -- local nomeConta = getPlayerName (thePlayer) local ID = getElementData ( thePlayer, "ID" ) or "N/C" local time = getRealTime() local hours = time.hour local minutes = time.minute local acc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..acc, aclGetGroup("FundadorP")) then aclGroupRemoveObject (aclGetGroup("FundadorP"), "user."..acc) setElementModel (thePlayer, 230) exports.webhook:sendDiscordMessage("O Fundador: "..nomeConta.."["..ID.."] Saiu do modo atendimento. Horario: "..hours..":"..minutes.."") triggerClientEvent(thePlayer, "TirarAdmin", thePlayer) -- if hasObjectPermissionTo(thePlayer,"general.adminpanel",false) then -- if getElementData(thePlayer,"onProt") then setElementData(thePlayer,"onProt",false) outputChatBox("#1e90ff[Servidor] #ffffffVocê saiu do modo atendimento.", thePlayer, 255, 255, 255,true ) -- end -- end ------------------------------------------------- elseif isObjectInACLGroup ("user."..acc, aclGetGroup("OrganizadorP")) then aclGroupRemoveObject (aclGetGroup("OrganizadorP"), "user."..acc) setElementModel (thePlayer, 230) exports.webhook:sendDiscordMessage("O Organizador: "..nomeConta.."["..ID.."] Saiu do modo atendimento. Horario: "..hours..":"..minutes.."") triggerClientEvent(thePlayer, "TirarAdmin", thePlayer) -- if hasObjectPermissionTo(thePlayer,"general.adminpanel",false) then -- if getElementData(thePlayer,"onProt") then setElementData(thePlayer,"onProt",false) outputChatBox("#1e90ff[Servidor] #ffffffVocê saiu do modo atendimento.", thePlayer, 255, 255, 255,true ) end end addCommandHandler ("sair", TirarP) ---- Quando sair do servidor function JogadorQuit (quitType) local time = getRealTime() local hours = time.hour local minutes = time.minute ---------- local acc = getPlayerAccount ( thePlayer ) local conta = getAccountName ( getPlayerAccount ( source ) ) -------------------------------------------------------------------------------------------- if isObjectInACLGroup ("user."..tostring(conta), aclGetGroup("FundadorP")) then aclGroupRemoveObject (aclGetGroup("FundadorP"), "user."..tostring(conta)) exports.webhook:sendDiscordMessage("O Fundador portador o Login '"..tostring(conta).."' desconectou-se as "..hours..":"..minutes.."") setElementData(thePlayer,"onProt",false) -- elseif isObjectInACLGroup ("user."..tostring(conta), aclGetGroup("OrganizadorP")) then aclGroupRemoveObject (aclGetGroup("OrganizadorP"), "user."..tostring(conta)) exports.webhook:sendDiscordMessage("O Organizador portador o Login '"..tostring(conta).."' desconectou-se as "..hours..":"..minutes.."") setElementData(thePlayer,"onProt",false) end end addEventHandler ( "onPlayerQuit", getRootElement ( ), JogadorQuit ) O Código está funcionando como esperado pela logica, mais talvez um setElementData seria mais leve para dar as permissoes ? Eu tentei usar o setElementModel pra retirar a skin no onPlayerQuit mas não funcionou, talvez porque seja porque o Player desconecta primeiro do que o evento é acionado, isso não é importante, se eu estiver errado me corrige por favor. São 8 cargos na staff, deixei apenas dois pra não ficar muito longo, tem 16 Grupos reservados para Staff, sendo que 8 deles vai ficar entrando e saindo player toda hora, isso que me preocupa.
-
Eu queria saber se tem como eu verificar se um membro é de um Grupo no lado cliente, tenho a seguinte função do lado server function removeTag (player) local conta = getAccountName ( getPlayerAccount ( source ) ) if isGuestAccount(getPlayerAccount(source)) then return outputChatBox("#ACD773✘ #ffffffINFO #ACD773✘➺ #ffffffVocê não está logado, então não pode entrar em patrulha !" , source , 255, 255, 255, true) end if isObjectInACLGroup ("user."..tostring(conta), aclGetGroup ( Grupo ) ) then aclGroupRemoveObject (aclGetGroup(Grupo), "user."..tostring(conta)) outputChatBox("#ACD773✘ #ffffffINFO #ACD773✘➺ #ffffffVocê está Apaisana agora, bom descanso #ACD773 "..getPlayerName(source).." #ffffff!" , source , 255, 255, 255, true) else aclGroupAddObject (aclGetGroup(Grupo), "user."..(conta)) outputChatBox("#ACD773✘ #ffffffINFO #ACD773✘➺ #ffffffVocê entrou em Patrulha, Bom serviço !" , source , 255, 255, 255, true) end end Gostaria agora de poder verificar no lado Cliente se o source está na Acl que defini na variável Grupo, para poder executar um Dx para o cliente. perdão se ficou um pouco confuso, sou novo na programação.