Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,936
  • Joined

  • Last visited

  • Days Won

    176

Everything posted by Lord Henry

  1. Estou vendo aqui, que o resource calcula a fome somente com base no tamanho da barra de fome e não salva esse valor em lugar nenhum. Se o resource for reiniciado ou o jogador reconectar no servidor, ele volta ao 100%. Além disso, pelo que entendi do código, ele come automaticamente o hamburger ao encostar no marker, e recarrega de graça toda a fome. Mas você quer q seja necessário apertar a tecla N depois que entrou no marker para comprar o lanche. Na última função do markerHit (client.lua), delete a função e cole isso tudo: function recarregaFome (key, state) if (getHungerState (localPlayer) < 60) then if getPlayerMoney () >= 10 then setHungerState (localPlayer,100) outputChatBox ("Você pagou $10 pelo hamburger.",255,255,0,false) outputChatBox ("Você está alimentado :D",0,255,0,false) triggerServerEvent ("take10money", localPlayer) -- Executa a função no server.lua else outputChatBox ("Você não tem dinheiro suficiente!",255,0,0,false) end else outputChatBox ("Você não está com fome!",255,0,0,false) end end addEventHandler ("onClientMarkerHit",getRootElement(), function(hitEle,dim) if (localPlayer == hitEle) and (getElementData (source,"HAMBURGUER!") == true) then bindKey ("n", "down", recarregaFome) guiSetVisible (windowMessage, true) -- Mostra a mensagem GUI que já foi criada antes. end end) addEventHandler ("onClientMarkerLeave",getRootElement(), function(leaveEle,dim) if (localPlayer == leaveEle) and (getElementData (source,"HAMBURGUER!") == true) then unbindKey ("n", "down", recarregaFome) guiSetVisible (windowMessage, false) -- Oculta a mensagem GUI. end end) Para fazer o jogador pagar, você deve fazer isso server-side, pois tirar dinheiro do jogador client-side não vai dar certo, já que vai tirar uma "grana falsa" e ele vai continuar com a mesma quantidade no servidor. Para isso, crie um script server.lua, declare-o no meta.xml e coloque isso no server.lua: function pagarHamburger () takePlayerMoney (client, 10) end addEvent ("take10money", true) addEventHandler ("take10money", getRootElement(), pagarHamburger) Declaração no meta.xml: <script src="server.lua" type="server"/> Para criar a mensagem GUI, informando para apertar a tecla N para comprar o hamburger, volte ao início do script client.lua, no começo da primeira função e crie o painel GUI com a mensagem lá, bem no início da função do onClientResourceStart. Coloque isso lá: windowMessage = guiCreateWindow (0.0260,0.6,0.1828,0.08, "Lanchonete", true) message = guiCreateLabel (0.05,0.5,1,1,"Pressione 'N' para comprar hamburger.",true, windowMessage) guiSetVisible (windowMessage, false)
  2. Dai depende do seu objetivo. Você quer fazer um painel mais bonito ou mais leve? (leve me refiro a código mais simples e fácil) Se vc quer fazer um painel bonito, sem se importar com performance nem manutenção, dai não há problema em fazer painel DX para interação. A vantagem do painel DX, é que ele é criado a cada Frame (diferente do GUI, que vc cria 1 vez e ele fica na tela), isso significa que é muito mais fácil colocar efeitos de movimento e animações em painéis DX e realmente, existem painéis DX com efeitos muito bonitos e não tão pesados, que passam realmente a impressão de um sistema mais profissional. Por se tratar tudo de funções client-side, não há qualquer problema de performance para outros jogadores do servidor que não estão com o painel aberto. Mas como eu falei anteriormente, os painéis DX são muito mais complexos de se fazer manutenção, uma vez que todos os seus elementos são totalmente configuráveis, nada é automático. (a GUI, já vem com o layout pronto) Se vc quer mudar a posição de um "botão" DX, você deve reconfigurar sua "área clicável", pois o elemento DX não é um botão (o botão GUI é um elemento clicável por padrão, então basta mover o botão e sua área clicável vai se mover junto). Vou refazer todo o exemplo anterior de GUI para DX. Note que os elementos DX não são relativos, isso significa que eles só aceitam tamanhos e posições em pixels. (os elementos GUI aceitam tanto posições relativas quanto posições por pixel, dá pra fazer gambiarra pra usar posição relativa em DX, mas isso é complexo demais e não quero lhe confundir ainda mais) function criarPainel () local screenX, screenY = guiGetScreenSize () -- Recebe a resolução atual do jogador. (no meu caso: screenX = 1366 e screenY = 768) ----------------- EXECUTA A JANELA NA TELA ------------------------------------------------------------------ local fonteInterativa = "default" local alphaInterativo = 150 function renderDx () dxDrawRectangle (screenX/2-140, screenY/2-80, 280, 160, tocolor (0, 0, 0, 150)) -- Cria o retângulo maior, que será a janela principal. To color (Red, Green, Blue, Alpha) determina sua cor e transparência. dxDrawRectangle (screenX/2-135, screenY/2-75, 270, 20, tocolor (0, 0, 0, 150)) -- Cria o retângulo do título da janela principal. dxDrawText ("Janela Qualquer", screenX/2-135, screenY/2-75, screenX/2+135, screenY/2-55, tocolor (255, 255, 255, 255), 1, "default-bold", "center", "center") -- Cria o título da janela principal dxDrawText ("Texto de informação qualquer aqui.\nOutra linha de informação aqui.", screenX/2-130, screenY/2-40, screenX/2+130, screenY/2, tocolor (255, 255, 255, 255), 1) end function renderButton () dxDrawRectangle (0, screenY/2, 30, 30, tocolor (0, 0, 0, alphaInterativo)) dxDrawText (">>", 0, screenY/2, 30, screenY/2+30, tocolor (255, 255, 255, 255), 1, fonteInterativa, "center", "center") end addEventHandler ("onClientRender", getRootElement(), renderButton) -- Começa a renderizar esse botão assim q inicia o resource. Chamando essa função a cada frame. ----------- MOSTRA/OCULTA A JANELA (clicando no botão da tela) ---------------------------------------- function mostraPainel (button, state, posX, posY, worldX, worldY, worldZ) if button == "left" and state == "up" then if (posX >= 0) and (posX <= 30) and (posY >= screenY/2) and (posY <= screenY/2+30) then -- Se a posição clicada na tela estiver dentro do retângulo >> então: if not isVisible then addEventHandler ("onClientRender", getRootElement(), renderDx) -- Começa a renderizar o painel DX na tela. Chamando a função renderDx a cada frame. else removeEventHandler ("onClientRender", getRootElement(), renderDx) -- Para de renderizar o painel DX na tela. theCursor () -- Executa a função de mostrar/ocultar o cursor. end isVisible = not isVisible -- Alterna entre visivel/invisivel a cada vez que clicar no botão. end end end addEventHandler ("onClientClick", getRootElement(), mostraPainel) -- Executa a função mostraPainel ao clicar em qualquer lugar da tela. --------------- ALTERNA A FONTE DO BOTÃO (passando o cursor em cima do botão)------------------------------- function mouseOnButton (x, y, pixelX, pixelY, worldX, worldY, worldZ) if (pixelX >= 0) and (pixelX <= 30) and (pixelY >= screenY/2) and (pixelY <= screenY/2+30) then -- Se o cursor estiver em cima do botão >> então: fonteInterativa = "default-bold" alphaInterativo = 255 else -- Faz o texto do botão >> ficar em negrito e seu retângulo opaco, enquanto o cursor estiver em cima dele e volta ao normal se não estiver. fonteInterativa = "default" alphaInterativo = 150 end end addEventHandler ("onClientCursorMove", getRootElement(), mouseOnButton) -- Executa a função mouseOnButton toda vez que o cursor se movimenta. -------------- EVITAR BUG ----------------------------------------------------------------------------- function theCursor () -- Por algum motivo, o cursor mostrado pelo T, ou Y ou F8 não funciona na função onClientClick. Então mostra/oculta o cursor pressionando Z. if not cursorVisible then showCursor (true) else showCursor (false) end cursorVisible = not cursorVisible end bindKey ("z", "down", theCursor) end addEventHandler ("onClientResourceStart", getRootElement(), criarPainel) -- Faz isso tudo ao iniciar o resource no jogador.
  3. Cara, a inteface DX não é recomendável para criar botões, a principal função dela é mostrar informações em tempo real (que devem ser atualizadas o tempo todo), para interfaces onde o usuário vai interagir (clicar, digitar, etc) é utilizada a interface nativa GUI. Mas respondendo a sua pergunta, quando vc clica na tela, é possível obter a coordenada X, Y da tela onde foi clicado. Sabendo disso, é possível determinar qual "botão" deve ser ativado. Para isso, usa-se OnClientGUIClick (que apesar de ser usado mais em GUI, funciona para DX também)
  4. Ah bom. Só criar o botão que vai ficar aparecendo sempre na tela e não ocultar ele ao iniciar o resource. Faça assim: function criarPainel () local screenX, screenY = guiGetScreenSize () -- Recebe a resolução atual do jogador. (no meu caso: screenX = 1366 e screenY = 768) ----------------- CRIA A JANELA ------------------------------------------------------------------ janelaPrincipal = guiCreateWindow (0.4, 0.4, 0.2, 0.2, "Janela Qualquer", true) -- Cria a janela. mensagem = guiCreateLabel (0.05, 0.2, 1, 0.2, "Texto de informação qualquer aqui.\nOutra linha de informação aqui.", true, janelaPrincipal) -- Cria o texto na janela. guiSetVisible (janelaPrincipal, false) -- Oculta a janela depois dela ser criada, para que ela não apareça ao iniciar o resource. botaoGeral = guiCreateButton (0, screenY/2, 30, 30, ">>", false) -- Cria o botão na tela. ----------- MOSTRA/OCULTA A JANELA (clicando no botão da tela) ---------------------------------------- function mostraPainel (button, state) if button == "left" then if not isVisible then guiSetVisible (janelaPrincipal, true) -- Torna o painel visivel. showCursor (true) -- Mostra o cursor na tela. else guiSetVisible (janelaPrincipal, false) -- Torna o painel invisivel. showCursor (false) -- Oculta o cursor da tela. end isVisible = not isVisible -- Alterna entre visivel/invisivel a cada vez que clicar no botão. end end addEventHandler ("onClientGUIClick", botaoGeral, mostraPainel, false) -- Executa a função mostraPainel ao clicar no botao >> end addEventHandler ("onClientResourceStart", getRootElement(), criarPainel) -- Faz isso tudo ao iniciar o resource no jogador. Obs: Para conseguir clicar no botão da tela, vc pode usar a tecla T ou o F8 (pra mostrar o cursor).
  5. Qual o resource em questão? Qual tecla será usada para abrir esse painel GUI? Isso deve funcionar em qualquer lugar? Ou somente em lugares específicos? (dentro de lanchonetes por exemplo) Você chegou a abrir o código do resource para estudar como ele funciona? (Se o resource estiver compilado, você não tem permissão para alterá-lo)
  6. Favor não usar formatação de fonte em tamanhos muito grandes, ninguém aqui é cego e isso pode ser considerado como Spam. Voltando a sua dúvida, sugiro que leia a Wiki na parte de GuiCreateWindow, já que vc precisa primeiramente criar uma janela GUI, com os botões e textos nela, depois vc configura uma tecla para fazer essa janela aparecer na tela. Fiz este exemplo para mostrar algumas funções principais, como o guiCreateWindow, guiCreateLabel, guiCreateButton, guiSetVisible, showCursor e onClientGUIClick function criarPainel () ----------------- CRIA A JANELA ------------------------------------------------------------------ janelaPrincipal = guiCreateWindow (0.4, 0.4, 0.2, 0.2, "Janela Qualquer", true) -- Cria a janela. mensagem = guiCreateLabel (0.05, 0.2, 1, 0.2, "Texto de informação qualquer aqui.\nOutra linha de informação aqui.", true, janelaPrincipal) -- Cria o texto na janela. botaoFechar = guiCreateButton (0.4, 0.7, 0.2, 0.2, "FECHAR", true, janelaPrincipal) -- Cria o botão na janela. guiSetVisible (janelaPrincipal, false) -- Oculta a janela depois dela ser criada, para que ela não apareça ao iniciar o resource. ------------- MOSTRA A JANELA (pela tecla K) ----------------------------------------------------- function mostraPainel (key, keystate) guiSetVisible (janelaPrincipal, true) -- Torna o painel visivel. showCursor (true) -- Mostra o ponteiro do mouse na tela. end bindKey ("k", "down", mostraPainel) -- Executa a função mostraPainel ao apertar a tecla K. ----------- OCULTA A JANELA (clicando no botão da janela) ---------------------------------------- function ocultaPainel (button, state) if button == "left" then -- Se o botão do mouse que clicou for o botão esquerdo, então: guiSetVisible (janelaPrincipal, false) -- Torna o painel invisivel. showCursor (false) -- Oculta o ponteiro do mouse. end end addEventHandler ("onClientGUIClick", botaoFechar, ocultaPainel, false) -- Executa a função ocultaPainel ao clicar no botaoFechar. end addEventHandler ("onClientResourceStart", getRootElement(), criarPainel) -- Faz isso tudo ao iniciar o resource no jogador. Sugiro que leia cada link mencionado acima para saber como funciona cada um. Deixei comentários pelo código para ficar mais fácil de entender.
  7. Já que vc está começando a estudar a linguagem Lua do MTA, sugiro que leia a Wiki: https://wiki.multitheftauto.com/wiki/PT-BR/Introdução_ao_Scripting Você precisa ser administrador do seu servidor para poder mexer nele. Ou então vc pode ir no Console (aquela espécie de Prompt de Comando que aparece quando vc liga seu servidor) e mandar o comando refresh nele. (não se usa a / ali) e depois usar start darGrana Mas de qualquer forma, você vai precisar ter acesso admin no seu servidor para fazer as coisas nele.
  8. Não use a função givePlayerMoney no lado Client, pois vai setar uma "grana falsa" na sua tela, mas no servidor vc vai continuar tendo a grana de antes. E isso não vai funcionar <resource src="ModsEmDesenvolvimento" startup="1" protected="0" /> Pois você deve colocar o nome do resource e não o nome da pasta principal. Faça assim: Na sua pasta [ModsEmDesenvolvimento], crie outra pasta dentro dela com o nome darGrana. (pode ser outro, é um exemplo) O nome desta sub-pasta será o nome do seu resource. Dentro da pasta darGrana, crie 2 arquivos.txt vazios. Depois renomeie 1 deles para server.lua (pode ser qualquer coisa.lua) e o outro para meta.xml (tem q ser exatamente assim) Abra o meta.xml e cole isso: (oq importa é a linha do script, mas é importante vc já saber colocar as infos no seu resource.) <meta> <info author="Leonardo" version="1.0.0" name="Dar dinheiro" description="Dá $500 para si mesmo ao usar o comando /grana." type="script" ></info> <script src="server.lua" type="server" /> </meta> Salve e feche o meta.xml, depois abra o server.lua e cole isso: function receberGrana (thePlayer) givePlayerMoney (thePlayer, 500) end addCommandHandler ("grana", receberGrana) Salve e feche o server.lua. Vá no seu servidor, e use /refresh. Abra o painel admin, na aba resources, dê refresh na lista de resources e procure por darGrana. Selecione-o e clique em Start. Feche o painel admin, e use o comando /grana E receba os $500 que vc programou no script. Não se esqueça de colocar o seu resource para iniciar automaticamente ao ligar o server. Coloque isso no mtaserver.conf: <resource src="darGrana" startup="1" protected="0" /> Para verificar se há problemas em seu script, deixe o /debugscript 3 ativado. Qualquer dúvida, volte a perguntar aqui mesmo. Espero ter ajudado, boa sorte.
  9. Exato. Só ir no Console e digitar upgrade nomeDoResource
  10. De nada. Que bom que lhes ajudei.
  11. Não tenho conhecimento com shaders. Já tentei aprender aqui mas o pessoal (pelo menos da área internacional) não quis me dar uma luz. Se tiver dúvidas quanto a programação Lua, dai posso te ajudar.
  12. Pesquise mais na Wiki antes de perguntar. Está tudo em onPlayerWasted. addEventHandler ("onPlayerWasted", getRootElement(), function (ammo, attacker, weapon, bodypart) if (attacker) and getElementType (attacker) == "player" then local wanted = getPlayerWantedLevel (attacker) if wanted < 6 then setPlayerWantedLevel (attacker, wanted + 1) end elseif (attacker) and getElementType (attacker) == "vehicle" then local driver = getVehicleController (attacker) if driver and getElementType (driver) == "player" then local wanted = getPlayerWantedLevel (driver) if wanted < 6 then setPlayerWantedLevel (driver, wanted + 1) end end end end) De nada.
  13. Resumindo todas as suas perguntas: Salvar dados entre as sessões dos jogadores, evitando que percam tudo ao deslogar. Depende do script, e da quantidade de acessos simultâneos que é feito no banco de dados. Acessar um banco de dados não é tão leve assim. O uso de banco de dados se deve com o objetivo de salvar dados entre as sessões, não para poupar processamento. É claro que, é muito mais viável e mais leve você salvar em um banco de dados do que ficar criando mil variáveis no seu script. Imagine salvar cada coordenada dos jogadores em uma variável do seu script, cada jogador iria consumir a memória de 3 variáveis só para salvar sua posição. Sim. Um grande exemplo disso é o sistema de casas. A staff cria as casas no servidor e elas ficam lá mesmo se o servidor for reiniciado. Para salvar as posições e configurações de cada casa, o script salva tudo no banco de dados. Ao ser iniciado, o script carrega os dados novamente e já cria as casas nas posições e configurações salvas. Além é claro, de salvar os proprietários das casas, para não ser necessário comprar novamente a casa após reiniciar o resource.
  14. Isso poderia ter sido perguntado na sessão de scripting. Um banco de dados é onde ficam salvos diversos tipos de dados que são usados entre as sessões dos jogadores e do servidor, isto significa que mesmo se o jogador relogar no servidor ou até mesmo o servidor reiniciar, os dados salvos no banco de dados não são perdidos. (se o script que salvou lá foi feito corretamente). O MTA já cria 2 bancos de dados padrão quando vc cria seu servidor, são eles: internal.db - Onde são salvos todos os dados das contas dos jogadores, login, senha, grana do bolso, posição do jogador quando deslogou, vida, colete, skin, armas, munição, etc. registry.db - Onde são salvos todos os dados que são utilizados pelos resources, como por exemplo melhores pontuações das corridas (race gamemode), proprietários das casas, dados bancários dos jogadores, saldo bancário dos jogadores, carros comprados pelos jogadores, roupas compradas pelos jogadores, empresas adquiridas pelos jogadores, etc. Estes dois banco de dados estão na pasta deathmatch do seu servidor, estão na linguagem SQLite. Você ainda pode criar outros bancos de dados, para serem usados pelos resources, mas na minha opinião isso não é recomendável, uma vez que vc usaria MySQL, que é mais complexo e exige certos cuidados de acesso e domínio, mas alguns servidores profissionais precisam fazer assim pois fizeram os bancos de dados ficarem fora do servidor em outro IP por segurança, dai é necessário ter bancos de dados externos. Para salvar alguma coisa na conta do jogador, isto é, no internal.db, você usa setAccountData, e para recuperar esses dados depois, use getAccountData. Para salvar alguma coisa no registry.db, é um pouco mais complicado, uma vez que vc vai precisar criar uma tabela nova para cada resource. Por exemplo, vc acabou de criar um resource de ranking por kills/deaths e você deseja salvar esse ranking no banco de dados para que ao reiniciar o resource ou o servidor, o ranking não seja perdido. Para isso vc vai precisar primeiramente criar uma tabela no banco de dados registry.db, essa tabela será acessada pelo resource, que irá salvar os dados dele lá. Para fazer qualquer coisa neste banco de dados (criar tabelas, inserir/alterar/remover valores em determinada tabela, deletar determinada tabela, inserir colunas em determinada tabela, etc) vc vai precisar usar isso: executeSQLQuery. (aqui, será necessário conhecimento em SQLite para fazer isso, mas é mais fácil do que aprender uma linguagem de programação nova, pois suas opções e sintaxes são menores do que uma linguagem inteira de programação, você não vai inventar nenhum sistema novo aqui, apenas criar e gerenciar tabelas e dados.) Criar tabela nova no banco de dados: (o Caps Lock não é uma regra, mas é melhor para entender oq é código e oq é nome) [Os seguintes códigos só funcionam server-side] executeSQLQuery ("CREATE TABLE IF NOT EXISTS nomedatabela (nomecoluna1 TEXT, nomecoluna2 REAL, nomecoluna3 INTEGER)") TEXT = Valores desta coluna serão textos. Podem ter símbolos, números e espaços. REAL = Valores desta coluna serão numéricos reais. (números com vírgula, positivos, negativos e 0.0) INTEGER = Valores desta coluna serão numéricos inteiros. (positivos, negativos e 0) (não existe tipo BOOLEAN, use TEXT e insira valor "false" ou "true") (existe valor NULL, é diferente de vazio, mas NULL não é um tipo de dado e sim um valor nulo. Você pode atribuir valor NULL a qualquer célula.) Deletar tabela do banco de dados: executeSQLQuery ("DROP TABLE nomedatabela") Todas as linhas, colunas, células e valores desta tabela são deletados junto. Deletar linhas da tabela: (as células não ficarão NULL) executeSQLQuery ("DELETE FROM nomedatabela WHERE colunaespecífica=?", valorDaCelulaEspecifica) O ? indica que o valor está após a declaração do SQL. Você poderia colocar o valor direto no lugar do ?. Mas por alguma razão, as vezes isso gera erro. Além disso, se o valor da célula estiver em uma variável no seu script, você não pode declarar a variável no lugar do ?. Ali só pode ser o valor direto, pois a declaração SQL inteira se trata de uma string. Por isso o uso do ?, que está recebendo o valor da variável que está depois da vírgula. Obs: Para verificar se uma célula tem valor nulo, não se usa os operadores lógicos de ==, <= >=. Para isso, usa-se IS NULL ou IS NOT NULL. Ex: executeSQLQuery ("DELETE nomecoluna1,nomecoluna2 FROM nomedatabela WHERE nomecoluna3 IS NULL") Isso vai deletar todas as células da linha onde a coluna 3 tem uma célula de valor NULL. Se a coluna 3 não tiver nenhuma célula de valor NULL, nada acontece. Inserir nova linha de valores: (ele vai criar automaticamente uma nova linha com novas células) executeSQLQuery ("INSERT INTO nomedatabela(nomecoluna1,nomecoluna2,nomecoluna3) VALUES(?,?,?)", valorCelulaColuna1, valorCelulaColuna2, valorCelulaColuna3) Neste caso, ele está inserindo 3 novos valores, cada valor em uma coluna. Se você não declarar os nomes das colunas, ele vai preencher na ordem das colunas automaticamente. Você pode deixar de declarar uma coluna se não quiser atribuir valor na célula daquela coluna. Se o tipo de valor da variável não for do tipo de dado daquela coluna, dará erro. Atualizar valores de células que já existem em uma tabela: (não é possível alterar os tipos de valores, é necessário editar o tipo da coluna se quiser fazer isso) executeSQLQuery ("UPDATE nomedatabela SET nomecoluna2=?,nomecoluna3=? WHERE nomecoluna1=?", valorCelulaColuna2, valorCelulaColuna3, valorCelulaColuna1) No caso acima, ele vai atualizar as células das colunas 2 e 3 onde o valor da célula da coluna 1 for igual ao valor de valorColunaCelula1. OBS: Nada impede que você coloque as primeiras variáveis junto à declaração SQL, mas para fazer isso você deve "cortar" a string, inserir as variáveis e depois continuar a string, Ex: executeSQLQuery ("UPDATE nomedatabela SET nomecoluna2= '".. valorCelulaColuna2 .."',nomecoluna3='".. valorCelulaColuna2 .."' WHERE nomecoluna1=?", valorCelulaColuna1) Lembrando que o valor destas variáveis também são strings na declaração, portanto use aspas simples antes e depois de cada corte para transformar os valores em string. Os dois pontos (..) significam que estes valores fazem parte do argumento SQL. Da mesma forma, se vc usar "1" .. "1", será igual a "11". (Por isso acho muito mais fácil deixar tudo ? na declaração SQL e colocar as variáveis todas após a string.) Selecionar determinadas células da tabela: (usado geralmente para obter os valores destas células para usar no script, você pode selecionar somente 1 célula ou várias) executeSQLQuery ("SELECT nomecoluna1,nomecoluna2 FROM nomedatabela WHERE nomecoluna3=?", valorCelulaColuna3) Neste exemplo, ele vai selecionar a célula da coluna 1 e a célula da coluna 2, na linha onde a célula da coluna 3 for igual a valorCelulaColuna3. Alterar a tabela (adicionar coluna nova) [SQLite não suporta deletar coluna nem editar tipo de coluna] executeSQLQuery ("ALTER TABLE nomedatabela ADD nomecoluna4 REAL") Devido a limitações do SQLite, ALTER TABLE não pode ser usado para deletar uma coluna nem para editar seu tipo. Para fazer isso é necessário recriar a tabela inteira com as novas alterações. No exemplo acima, ele vai adicionar uma nova coluna chamada "nomecoluna4". Fiz um código com vários testes de banco de dados. Cada comando faz alguma coisa. Espero ter ajudado. Boa sorte.
  15. Acho que pelo menos 1 estação em cada uma das 3 cidades principais já basta. Mas se vc já é mapper, não sei qual a dificuldade que vc está tendo. Vc está querendo criar um objeto novo? No caso a estação?
  16. Bom, vc postou isso na sessão Geral. Acho que está certo sim. A propósito, que tipo de mapa vc quer que o mapper faça? Base, condomínio, ruas, local específico? Outra coisa, dependendo do mapper, ele vai querer te cobrar por hora de serviço. Edit: Vi que vc mencionou o sistema BRT, poderia dar mais detalhes sobre como ele deve ser?
  17. Raramente alguém usa esse recurso, pois ele causa lag absurdo no servidor. Geralmente o pessoal usa rede social externa para contato por voz, como Discord, RaidCall, TeamSpeak ou Skype. A princípio não sei se é possível aumentar o volume do sistema de voz nativa do MTA, tente aumentar o volume de captação do seu microfone.
  18. Por enquanto não estou vendendo meus resources. Mas quem sabe no futuro.
  19. Use setPlayerHudComponentVisible para fazer isso. Os scripts de HUDs modificados geralmente vem com uma função que mostra/oculta quando vc aperta F10, pois quando o mapa está sendo mostrado, tanto a HUD original quando a HUD modificada devem ser ocultados, e quando apertar F10 novamente para desaparecer o mapa, a HUD original vai reaparecer, é nesse momento q vc deve ter uma função para ocultar a HUD original novamente e mostrar a HUD modificada.
  20. @BobGrik, favor não reviver os tópicos que são muito antigos.
  21. Parece ser erro de conexão, e não de servidor ou cliente. Verifique sua internet. Certifique-se de que o MTA possui permissão no firewall para acessar a rede.
  22. Não é possível fazer isso. Você pode compilar o script que muda a textura, mas nada impede a pessoa de roubar seu arquivo.txd e colocar em outro script. Além disso, os arquivos .txd pertencem a RockStar, você não pode ter direitos autorais sobre este arquivo. O mesmo vale para os arquivos.dff
×
×
  • Create New...