Postado Novembro 9, 2012 12 anos Automatização e Simplificação de Scripts Bem, este é minha segunda "aula", a primeira foi sobre o comando addEvent, esta é um pouco mais complexa, vou demonstrar algumas possibilidades de automatização e simplificação de scripts, algo muito importante pra tornar um script mais simples e prático. Vamos a algumas definições: Automação: é um sistema automático de controle pelo qual os mecanismos verificam seu próprio funcionamento, efetuando medições e introduzindo correções, sem a necessidade da interferência do homem. Simplificar: tornar menos complicado (fiquei com preguiça de procurar mais). Situação 1: Fazendo um cardápio Temos um talkaction de fast food e queremos informar ao player quando ele disser !food cardápio todas as opções, elas estão disponiveis em uma tabela : local comidas = { ["Meat"] = {50, 1291}, ["Ham"] = {90, 1292}, ["Fish"] = {150, 1293}, ["Dragon Ham"] = {200, 1294} } Neste caso o valor literal é a comida, o primeiro valor numérico o preço e o segundo o id (não são reais). Bem, agora pense assim, cada comida que eu colocar eu vou ter que buscar o id dela ? Chato demais isso, e se eu utilizar uma função que já existe? OMG, SÉRIO? Isso mesmo , getItemIdByName(name), este é o primeiro exemplo de simplificação. print("Atendente: Aqui no Fast Food Delivery, vendemos: Meat por 50 golds, Ham por 90 golds, Fish por 150 golds, Dragom Ham por 200 golds.") OMG, tá pronto =D. Sim, mas e se você quiser mudar algo, vai ter que sempre lembrar de digitar isso? E se você tiver 200 scripts, vai lembrar dos detalhes de todos? Por que não utilizamos o comando for (note que agora, já que há apenas um valor não há a necessidade de uma tabela para os valores e ids separados, o que torna o script mais simples) local comidas = { ["Meat"] = 50, ["Ham"] = 90, ["Fish"] = 150, ["Dragon Ham"] = 200 } local cardapio = "Atendente: Aqui no Fast Food Delivery, vendemos:" for k,v in pairs(comidas) do cardapio = cardapio.." "..k.." ("..v..");" end print(cardapio) Bem, assim fica mais fácil não? Já foi então um exemplo de automatização e um de simplificação. Situação 2: Automatizando um NPC Bem, nós temos um NPC que executa três funções, as falas das três funções são as mesmas, vamos simular intao três funções (para utilizar em apenas lua, sendo assim, será apenas teoria, não tente colocar em seu servidor). Vamos supor que a fala é param e o estado da fala é estado, as três funções são comprar uma casa, um carro ou uma vaca (fiz pouco texto pra cada porque é cansativo): local param = "vaca" local estado = 0 local casa = "" local carro = "" local vaca = "" -- Simulação da casa if estado == 0 and param == "casa" then print("Qual casa deseja comprar?") estado = 1 elseif estado == 1 and param == "da esquina" then print("Tem certeza que deseja comprar a casa Da esquina?") estado = 2 casa = "da esquina" elseif estado == 1 and param == "do meio" then print("Tem certeza que deseja comprar a casa Do meio?") casa = "do meio" estado = 2 elseif estado == 2 and param == "sim" then print("Parabens pela aquisição da casa "..casa".") -- Note aqui uma pequena automação estado = 0 end -- Simulação do carro (copiei da casa e mudei o nome, já estava cansando disso) if estado == 0 and param == "carro" then print("Qual carro deseja comprar?") estado = 3 elseif estado == 3 and param == "ford" then print("Tem certeza que deseja comprar o carro Ford?") estado = 4 carro = "Chevrolet" elseif estado == 3 and param == "Chevrolet" then print("Tem certeza que deseja comprar o carro Chevrolet") -- Não sei escrever Chevrolet O.o carro = "Chevrolet" estado = 4 elseif estado == 4 and param == "sim" then print("Parabens pela aquisição da casa "..carro".") -- Note aqui uma pequena automação estado = 0 end -- Simulação da vaca (OMG, de novo, como é mais fácil automatizar :'() if estado == 0 and param == "vaca" then print("Qual vaca deseja comprar?") estado = 5 elseif estado == 5 and param == "Doida" then print("Tem certeza que deseja comprar a vaca Doida?") estado = 6 carro = "Doida" elseif estado == 5 and param == "Louca" then print("Tem certeza que deseja comprar a vaca Louca?") -- Não sei escrever Chevrolet O.o carro = "Louca" estado = 6 elseif estado == 6 and param == "sim" then print("Parabens pela aquisição da casa "..carro".") -- Note aqui uma pequena automação estado = 0 end Bem, agora faça você mesmo um de arroz, veja como é cansativo. Note que as falas são quase as mesmas, porque não fazer então um padrão e apenas uma tabela com alguns valores para cada um? Existe o Jiddo's NPC System para simplificar isto, mas é apenas um tutorial. function math.multiple(value, param) --> Verification of value and param and return TRUE or FALSE if type(value) == "number" and type(param) == "number" then if value % param == 0 then return TRUE else return FALSE end else return nil end end -- Inserir os objetos à venda seguidos pelos seus preços local venda = { {"Carro", "Chevrolet", 1000, "Ford", 1200}, {"Casa", "Da esquina", 3000, "Do meio", 2000}, {"Vaca", "Louca", 100, "Malhada", 200} } -- Valores padrões local param = "sim" local estado = 2 local objeto = 2 local desejo = 3 local custo = 1000 -- Padrão for all = 1, #venda do if estado == 0 and param == venda[all][1] then estado = 1 desejo = all print("Qual "..param.." deseja comprar?") break elseif estado == 1 and param == venda[desejo][all] and math.multiple(all, 2) == TRUE then estado = 2 objeto = all custo = venda[desejo][objeto + 1] print("Tem certeza que deseja comprar: "..venda[desejo][1].." "..param.." por "..custo.."?") break elseif estado == 2 and param == "sim" then estado = 0 print("Você perdeu "..custo.." de dinheiro.\nParabens pela aquisição de "..venda[desejo][1].." "..venda[desejo][objeto]..".") break end end Bem, ainda dá para implantar um "cardápio" hehe, tente, para praticar. Notem que o que fiz foi apenas avaliação de tabelas hehe, aconselho visitarem o setor de LIBs, sempre há funções legais criadas pos outros usuários. Situação 3: Melhor utilização de "ifs" Imaginem a seguinte situação, você precisa construir uma série de ifs, ond caso um não seja verificar o proximo. Vamos ver um modo: local param = "" if param == 1 then print("yes") end if param == 2 then print("no") end if param == 3 then print("faz") end Meio grande não? Por que não utilizamos o elseif? Podemos economizar end e com isso simplificar o script. Olhem: local param = "" if param == 1 then print("yes") elseif param == 2 then print("no") elseif param == 3 then print("faz") end Mais simples agora hehe. Agora vamos supor que temos uma função com dois parametros, param1 e param2, onde param2 é muito raro de ser diferente de nil. Podemos fazer assim: local param = "" local param2 = "" if param == 1 and param2 ~= nil then print("yes") elseif param == 2 and param2 == 2 then print("no") elseif param == 3 and param2 ~= 6 then print("faz") end Pronto UHUL. Pera aí, porque eu verifico primeiro o param1? Se eu verificar param2 primeiro, como é raro de ser diferente de nil, a opção será eliminada com apenas uma avaliação, logo, mais velocidade =D. Agora imagine a seguinte situação: local param = "" local param2 = "" if param2 ~= nil and param == 1 then print("yes") elseif param2 ~= nil and param == 2 then print("no") elseif param2 ~= nil and param == 3 then print("faz") elseif param2 ~= nil and param == 4 then print("faeez") elseif param2 ~= nil and param == 5 then print("faeeeeez") end Muito simples não é? Tente fazer de um jeito mais simples utilizando apenas if e elseif. Se você pensou como abaixo você acertou , se não, fica pra próxima . if param2 ~= nil then if param == 1 then print("yes") elseif param == 2 then print("no") elseif param == 3 then print("faz") elseif param == 4 then print("faeez") elseif param == 5 then print("faeeeeez") end end Bom, acho que assim é mais fácil escrever e mais fácil modificar . Agora temos a seguinte ocasião, param é uma variável local e caso ela seja 1 deve-se dar print em "yes", caso contrário em "no". Podemos escrever assim: local param = 2 if param == 1 then print("yes") else print("no") end Bacana né, já está bem curto, mas e se fizermos assim: local param = 2 print(param == 1 and "yes" or "no") OMG PeJuGe, 2 LINHAS o.O . Mais fácil né. Neste caso é possível economizar ifs e com isso simplificar. Bom pessoal, é isso, espero que tenham gostado, claro que há muitas outras formas de aproveitas os comandos, mas já vão algumas Creditos : Lwkass Editado Novembro 9, 2012 12 anos por GodMarini (veja o histórico de edições) Contato; god.marinii [email protected]
Postado Novembro 9, 2012 12 anos Amigo, por-favor poste os créditos do autor, essa não é a primeira vez que você foi informado a fazer isso ¬¬ @EDIT Agora sim. -"Supra Omnes Lux Lucis" - Acima de todos brilha a Luz -
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.