-
Posts
563 -
Joined
-
Last visited
-
Days Won
1
Everything posted by Stanley Sathler
-
Muito boa iniciativa, Ninguem. Gostei do tutorial. Acho apenas que você poderia ter se aprofundado mais em cada parte do código, como por exemplo, na questão do bindKey(). De qualquer forma, é isso aí! Vamos esperar agora pela colaboração dos demais membros. E estarei no aguardo de novos tutoriais seu.
-
Olá pessoal, Venho vendo que a comunidade brasileira/portuguesa presente aqui no fórum é um tanto quanto desunida. Mesmo assim, quando alguém tenta se manifestar, alguns usuários fanfarrões acabam por tornar todo um debate em uma fútil discussão. De qualquer forma, meu objetivo aqui não é empregar política de convivência entre os membros. Venho através deste proporcionar um primeiro tutorial de uma série que está por vir - ou pelo menos planejo isso, fazendo-os quando sobrar tempo. * Neste tutorial irei explicar sobre o conhecido (e comumente usado) in ipairs(), um "loop" que percorre todos os ítens de uma tabela (vetor). - 1 - Iniciando - Conhecendo as tabelas As tabelas (ou vetores, assim conhecido em outras linguagens) é uma variável que armazena um conjunto de valores que podem ser acessados através de um índice. Suponhamos que temos em um quarto um armário com 3 gavetas, onde cada gaveta possui um nome: • gaveta_1 = "cuecas" • gaveta_2 = "meias" • gaveta_3 = "camisas" Para evitar criar uma variável para cada gaveta, poderíamos simplesmente criar uma tabela: gavetas = {} Para atribuirmos valores a tabela, adicionamos cada valor separado por vírgula: gavetas = { "cuecas", "meias", "camisas" } Sendo assim, temos uma tabela com três índices: índice 1 (cuecas), índice 2 (meias), índice 3 (camisas). Para acessarmos cada índice, usamos o nome da variável seguido do valor respectivo ao índice entre colchetes (variavel[n_indice]): gavetas = { "cuecas", "meias", "camisas" } outputChatBox("Item 1: " .. gavetas[1] .. " | Item 2: " .. gavetas[2] .. " | Item 3: " .. gavetas[3]) O resultado seria: Item 1: cuecas | Item 2: meias | Item 3: camisas 2 - Percorrendo os valores da tabela utilizando in ipairs() O exemplo anterior poderia ter sido exemplificado. Imaginamos agora uma tabela com 50 índices. Se quiséssemos escrever TODOS os valores (do índice 1 ao índice 50), necessitaríamos de uma boa parte do tempo para escrever tudo (gavetas[1], gavetas[2], gavetas[3], gavetas[4], gavetas[5], etc). Para facilitar, poderíamos usar o in ipairs(). Este tem como finalidade percorrer, automaticamente, cada ítem da tabela jogando-a a uma variável (definida por você). Ou seja: ela percorre o primeiro ítem da tabela, joga na variável que você definiu e executa um bloco de instruções (no exemplo, escrever o valor no chat). Após isto, volta a realizar a mesma tarefa, porém percorrendo o segundo ítem e assim por diante. Escrevendo o exemplo acima usando in ipairs(), seria: gavetas = { "cuecas", "meias", "camisas" } -- Sintaxe: for i, v in ipairs(nome_tabela) do {} for i, dentro_gaveta in ipairs(gavetas) do outputChatBox("Item "..i..": " .. dentro_gaveta) end Resultado: Item 1: cuecas | Item 2: meias | Item 3: camisas Assim, no primeiro loop, "i" assumiria o valor "1" (número do índice em que está posicionado o in ipairs()); "dentro_gaveta" assumiria o valor "cuecas", que é o valor definido para o primeiro item da tabela; dentro do bloco temos a função outputChatBox(), responsável por escrever os valores na tela (chat). Após executar o bloco de instruções, o in ipairs() passa a apontar então para o próximo ítem (no caso, o segundo ítem), efetuando a mesma tarefa. 3 - Exercícios resolvidos 1) Crie uma tabela com 5 índices e atribua à cada índice o nome de uma fruta. Em seguida, apresente na tela o nome dessas frutas. Resolução) local frutas = { "maca", "laranja", "banana", "melancia", "ameixa" } for i, nome_fruta in ipairs(frutas) do outputChatBox(nome_fruta) end 4 - Exercícios para praticar 1) Crie uma tabela com 8 índices e atribua a cada índice o nome de uma pessoa. Em seguida, apresente na tela o nome de cada um deles. 2) Crie duas tabelas com 5 índices. Na primeira tabela, insira uma idade qualquer (número inteiro) para cada ítem. Em seguida, passe o valor do primeiro índice da primeira tabela para o primeiro índice da segunda tabela e assim por diante. Utilize in ipairs() para isso. --------------------------------------------------- 5 - Conclusão Bom pessoal, podemos ver que este é um tutorial básico, apresentando um conceito básico de programação em Lua. O objetivo deste é auxiliar os iniciantes que não conseguem entender ou manusear o recurso, a fim de aprimorá-los. Caso queiram praticar, podem resolver os dois exercícios propostos além claro de desenvolver o seu próprio desafio. O intuito é realmente aprender, compartilhar. Qualquer dúvida, sintam-se a vontade para debater neste mesmo tópico. Abraços, Stanley Sathler.
-
Aqui, quando explodem, somem automaticamente. O que eu acho estranho, porque eu sempre achei que eles permaneciam lá, mesmo explodidos. Se é este o seu caso, você pode usar o evento onVehicleExplode e a função destroyElement().
-
Ajuda. Oficina Mecanica MTA.
Stanley Sathler replied to Bruno_Winchester's topic in Programação em Lua
Sim, há uma regra contra postagens duplas. Você pode saber melhor sobre as regras clicando aqui: viewtopic.php?f=120&t=15740 Independente do intervalo de tempo entre duas mensagens, estas devem ser evitadas. Há o botão "EDIT" que serve para que você edite a sua última postagens evitando duplo posts exatamente nessa ocasião, onde você deseja complementar um post após alguns minutos. - A propósito, definir a propriedade "doublesided" para "true" não o torna colisível. Quanto ao Bruno, você pode tentar usar esta função: https://wiki.multitheftauto.com/wiki/Set ... onsEnabled Porém eu NÃO sei se ela serve exatamente para o seu caso. Mas tentar não arranca pedaço. (: A propósito, seja bem-vindo à comunidade MTA:SA. -
Can I use hexadecimal codes on GUI Label?
Stanley Sathler replied to Stanley Sathler's topic in Scripting
Oh, thank you Solid. It works now. -
Hi friends, I'm trying use hexadecimal codes (colors) in a label. Can I do it? Or is not possible in labels? Thx, Stanley Sathler.
-
Bom, então você precisa aprender. Nós não vamos criar o script pra você, precisa entender. Se vier com o script pronto mas este não funcionar, poderemos sanar dúvidas perante ao código... mas criar pra você, fora de questão.
-
Oh damn, thank you so much for answer, Karthik. I understood perfectly. (: - Solidsnake and Jaysds, thanks alot too, homies. You're always helping me here.
-
Solidsnake, and what is a "indexed tables"? When I use numbers (e.g: Button[1])?
-
Karthik184, in this example don't work. But the information is useful for me, but maybe I'll need it later. - Jaysds, working now. I was using "ipairs()", and not "pairs()". Can you say the difference? - Solidsnake, thanks you too, man. Thanks all you guys, for the constant help =)
-
Hi guys, I'm trying get all elements (gui-widgets) from a Window (like a getElementsByType()). I'm creating this code (resume): SATHLER_Button["btn_mute"] = guiCreateButton(170, 75, 100, 30, "Mute", false, ModPanelMainWindow) SATHLER_Button["btn_kick"] = guiCreateButton(275, 75, 100, 30, "Kick", false, ModPanelMainWindow) * Obs: I have many other buttons. It is just a part. I wanna set the font to all my buttons using: guiSetFont() I'm trying use a loop (in ipairs(), for example) to avoid much work. If I change the "btn_mute" and "btn_kick" (strings) to numbers (1 and 2), can I use: for i, v in ipairs(SATHLER_Label) do guiSetFont(SATHLER_Button[i], "default-bold-small") guiLabelSetColor(SATHLER_Button[i], 255, 0, 0) end But I'm not using numbers, I'm using strings to make easier identification. How can I set the font to all elements using a loop? Can I do it? Or to do it I'll use numbers (example: SATHLER_Button[1] and SATHLER_Button[2]) ? Thanks alot guys, Stanley Sathler.
-
Honda_aa, Antes de mais nada, devo lhe dizer: você precisa aprender a pesquisar um pouco mais, rapaz. Estamos praticamente criando o servidor para você. Qualquer problema que surge você recorre ao fórum. Se quer mesmo criar um servidor, precisa antes de mais nada aprender a programar em Lua. Se soubesse, você saberia resolver essa questão em minutos. A partir de agora serei o menos objetivo possível nas respostas, visando fazer você pensar um pouco mais e ter o mínimo de esforço na criação do seu servidor, sem simplesmente copiar e colar o que propomos aqui. E não me interprete mal, pois é para o seu próprio bem. - Respondendo a dúvida: Depende. Você quer mostrar no chat? Se sim, use a função: outputChatBox() Quer mostrar através de uma GUI personalizada? Se sim, use: guiCreateWindow() guiCreateMemo() guiCreateButton()
-
Oh, sem dúvidas. Eu não havia reparado nesse detalhe. Consertando a função, funciona?
-
Entendi. É porque tinha ficado meio perdido, rs. De qualquer forma, então tente este: * Obs: como não tenho a GUI, fica complicado testar. Se puder disponibilizá-la para nós (caso desta vez não funcione) addEventHandler("onClientMarkerHit", carrosMarker, function ( hitElement ) -- Mudei para "hitElement", pois estava "hitPlayer" if(getElementType(hitElement) == "player") then -- Se o tipo do elemento for um "player" e nao um veiculo if (not isPedInVehicle(hitElement)) then getSetVisible(carrosWindow,true) showCursor(true) end end end)
-
Quando você diz "não dá nenhum efeito", refere-se ao fato de que a GUI abre quando o jogador está no carro ou refere-se ao fato de que a GUI não abre de jeito nenhum (com o jogador dentro ou fora de um veículo)?
-
addEventHandler("onClientMarkerHit", carrosMarker, function ( hitPlayer ) if (not isPedInVehicle(hitElement)) then getSetVisible(carrosWindow,true) showCursor(true) end end) Veja se funciona.
-
Como assim dá muito trabalho? É um .lua com 4 linhas de código mais duas linhas no meta.xml (para cada veículo, claro). - De qualquer forma, não há como saber com exatidão o que o "Error #1" quer dizer. Talvez o arquivo seja grande demais, talvez estejam corrompidos, talvez você esteja trocando-os... existem diversas possibilidades.
-
My event handler doesn't call my function
Stanley Sathler replied to Stanley Sathler's topic in Scripting
Yes, and I can't find. I'm sure about event handler, because I tried make a second function (PlayerWannaFood2()) to use in Rodeo marker and was not called too. Strange, very strange... I can't find any error. -
Nick, yes, I'm a PHP programmer too. But I'm always with a little problem with Lua, hehe. Good luck with your server.
-
My event handler doesn't call my function
Stanley Sathler replied to Stanley Sathler's topic in Scripting
Hi Jaysds1, I've been completing my code (I adding more tents in the city). When I enter on mark of first tent (All Saints Hospital, Los Santos) the function is called. But when I enter on the others markers around the city (I added a tent in Rodeo and Commerce), the function isn't called. The function to be called is the same. -- Variables definitions HD_SaintHospital = { ["OpenHour"] = 18, ["Tent"] = nil, ["Marker"] = nil, ["Object_1"] = nil, ["Object_2"] = nil, ["PedVendor"] = nil, ["WasCreated"] = false } -- Hot Dog Tent (Local: All Saint Hospital, Los Santos) HD_Rodeo = { ["OpenHour"] = 9, ["CloseHour"] = 18, ["Tent"] = nil, ["Marker"] = nil, ["PedVendor"] = nil, ["WasCreated"] = false -- Hot Dog Tent (Local: Rodeo, Los Santos) } HD_Commerce = { ["OpenHour"] = 9, ["CloseHour"] = 18, ["Tent"] = nil, ["Marker"] = nil, ["Object_1"] = nil, ["PedVendor"] = nil, ["WasCreated"] = false -- Hot Dog Tent (Local: Rodeo, Los Santos) } function PlayerWannaFood(player) setElementFrozen(player, true) setPlayerMoney(player, getPlayerMoney(player) - 5) setPedAnimation(player, "FOOD", "EAT_Burger", 5000, false, false, true, false) setElementHealth(player, getElementHealth(player) + 20) setElementFrozen(player, false) end function TentDamageProof(carTarget) --Only for vehicle tents setVehicleLocked(carTarget, true) --setVehicleFuelTankExplodable(carTarget, false) setVehicleDamageProof(carTarget, true) end function VendorInvencible() cancelEvent() end addEventHandler("onClientPedDamage", getRootElement(), VendorInvencible) function OpenFoodTents() GameTimeHour, GameTimeMinute = getTime() -- Get the current game time -- All Saint Hospital if( GameTimeHour >= HD_SaintHospital["OpenHour"] ) then -- If the current game time is more that the open hour, so open the tent if(HD_SaintHospital["WasCreated"] == false) then HD_SaintHospital["Object_1"] = createObject(643, 1281.20, -1383.30, 12.80, 0, 0, 52) -- Chairs #01 HD_SaintHospital["Object_2"] = createObject(643, 1282.60, -1379.80, 12.80, 0, 0, 326) -- Chairs #02 HD_SaintHospital["Tent"] = createObject(1340, 1285.19, -1382.40, 13.69, 0, 0, 180) -- HotDog Tent HD_SaintHospital["Marker"] = createMarker(1284, -1382.4, 12.5, "cylinder", 1, 255, 0, 0, 255) addEventHandler("onMarkerHit", HD_SaintHospital["Marker"], PlayerWannaFood) HD_SaintHospital["PedVendor"] = createPed(168, 1286, -1382.4, 14, 90.0) HD_SaintHospital["WasCreated"] = true end else if(HD_SaintHospital["WasCreated"] == true) then destroyElement(HD_SaintHospital["Object_1"]) destroyElement(HD_SaintHospital["Object_2"]) destroyElement(HD_SaintHospital["Tent"]) destroyElement(HD_SaintHospital["Marker"]) destroyElement(HD_SaintHospital["PedVendor"]) HD_SaintHospital["WasCreated"] = false end end -- Rodeo if( GameTimeHour >= HD_Rodeo["OpenHour"] ) then -- If the current game time is more that the open hour, so open the tent if(HD_Rodeo["WasCreated"] == false) then HD_Rodeo["Tent"] = createObject(1340, 408, -1563.69, 27.7, 0, 0, 0) -- HotDog Tent HD_Rodeo["Marker"] = createMarker(409.20, -1563.69, 26.5, "cylinder", 1, 255, 0, 0, 255) addEventHandler("onMarkerHit", HD_Rodeo["Marker"], PlayerWannaFood) HD_Rodeo["PedVendor"] = createPed(168, 407, -1563.69, 28, 270.0) HD_Rodeo["WasCreated"] = true end else if(HD_Rodeo["WasCreated"] == true) then destroyElement(HD_Rodeo["Tent"]) destroyElement(HD_Rodeo["Marker"]) destroyElement(HD_Rodeo["PedVendor"]) HD_Rodeo["WasCreated"] = false end end -- Commerce if( GameTimeHour >= HD_Commerce["OpenHour"] ) then -- If the current game time is more that the open hour, so open the tent if(HD_Commerce["WasCreated"] == false) then HD_Commerce["Tent"] = createVehicle(588, 1098.30, -1775.5, 13.30, 0, 0, 90, "SARC 000") -- HotDog Van TentDamageProof(HD_Commerce["Tent"]) HD_Commerce["Object_1"] = createObject(643, 1100.9, -1771.59, 12.80, 0, 0, 0) HD_Commerce["Marker"] = createMarker(1098.59, -1773.09, 12.30, "cylinder", 1, 255, 0, 0, 255) addEventHandler("onMarkerHit", HD_Commerce["Marker"], PlayerWannaFood) HD_Commerce["WasCreated"] = true end else if(HD_Commerce["WasCreated"] == true) then destroyElement(HD_Commerce["Tent"]) destroyElement(HD_Commerce["Object_1"]) destroyElement(HD_Commerce["Marker"]) HD_Commerce["WasCreated"] = false end end end addEventHandler("onResourceStart", root, function () setTimer(OpenFoodTents, 60000, 0) end) Can you help me again? Or another member, please? I'm not being lazy, I tried yesterday all night, but nothing. I'm not experienced on Lua but I'm trying learn. Hugs, Stanley Sathler. -
Bom, então eu estava certo. Vá até o arquivo "freeroam.zip" (localizado na pasta /resources/[gameplay]) e modifique-o desta forma: 1) Abra o meta.xml e adicione a linha: <map src="seu_mapa.map" /> 2) Adicione junto aos arquivos o seu mapa (seu_mapa.map) (no mesmo diretório do meta.xml) Depois basta compactá-lo novamente (em formato .zip, não em .rar) e substituir o freeroam original.
-
Veículos: setVehicleLocked() --Tranca um determinado veículo Armas: -- Considerando que voce quer bloquear uma arma atraves de um pickup (um exemplo de "pickup" é quando o pedestre morre e sua arma fica no chao) function BlockWeaponOnPickup() if(getPickupType(source) == 2) -- Se o pickup for uma arma (weapon) if(getPickupWeapon(source) == "31") --Se o ID da arma for 31 (M4) outputChatBox("Voce nao pode pegar esta arma.", thePlayer) end end end addEventHandler("onPickupHit", seuPickup, BlockWeaponOnPickup) -- "seuPickup" é a variável que armazena a pickup (por exemplo: seuPickup = createPickup() * Obs: eu deixei PROPOSITALMENTE alguns erros no código, para que você não pegue-o sem sequer ler. Você precisa pelo menos tentar entender as funções e ver o que o código faz em cada linha. * Obs2: eu não testei, portanto, pode haver um ou outro detalhe no código que não funcione, visto que não sou um programador assíduo. Porém, um código nessa mesma estrutura sana o seu problema. Teste e retorne com os resultados.
-
And Tim260... I'm not a moderator, but remember bro: use titles well explained. Avoid titles like "Someone can help me", "My script doesn't work" and something like it. If you use objective titles, we will be more interested on click on your topic. Good luck with your codes. Stanley Sathler.
-
My event handler doesn't call my function
Stanley Sathler replied to Stanley Sathler's topic in Scripting
Yes, you're right! Thank you so much again, Jaysds. You always helping me.. thanks, really. -
DNL, acho que ele deseja inserir um novo .map para seu recurso 'freeroam'.
