Postado Agosto 20, 2018 6 anos Ando estudando lua e C++ devido a faculdade também, mas mais por interesse em servidores de games e tudo mais. Algumas dúvidas que se alguém puder responder eu serei bem grato! Quando eu crio uma função na lib, como eu usaria ela nos scripts normais? Adicionando a função que criei junto com o arquivo eu poderia usar ela de forma global no servidor? -- Core API functions implemented in Lua dofile('data/lib/core/core.lua') -- Compatibility library for our old Lua API dofile('data/lib/compat/compat.lua') -- Teste lib dofile('data/lib/clib/dclib.lua') Quais as vantagens de criar funções em lua? Quando eu devo utilizar uma função C++ direto nas sources e quando eu devo criar uma lib para isso? Procuro um mentor intelectual para que possa me encaminhar nessa jornada, no momento não tenho muito a oferecer alem da minha força de vontade e interesse, mas no futuro posso ser uma forte network devido ao curso da faculdade e tudo mais. Agradeço quem tiver disponibilidade para responder! Att RyoKami Editado Agosto 20, 2018 6 anos por Kamiz (veja o histórico de edições)
Postado Agosto 20, 2018 6 anos 15 minutos atrás, Kamiz disse: Quando eu crio uma função na lib, como eu usaria ela nos scripts normais? Quando você cria a função na lib, a função fica de forma global e você já pode acessar ela em qualquer outro arquivo apenas usando o nome Exemplo: Criei na lib a função: function isPlayerKnight(cid) if (getPlayerVocation(cid) == 4) then return true end return false end Agora quero usar a função em um script que verifica se o jogador é knight ao der "use" em um item, e se for, ele recebe uma mensagem: function onUse(cid, item, fromPosition, itemEx, toPosition) if (isPlayerKnight(cid)) then doCreatureSay(cid, "Sou um Knight!") end end 18 minutos atrás, Kamiz disse: Quais as vantagens de criar funções em lua? Praticidade, fácil manutenção. Imagine que você fez uma função qualquer, mas encontrou um pequeno erro nela, e aí? Recompilar seu servidor por causa de uma letra? Usando lua você apenas corrige o arquivo, salva, e não precisa nem reiniciar o servidor, um simples /reload no script já carrega ele in-game! 25 minutos atrás, Kamiz disse: Quando eu devo utilizar uma função C++ direto nas sources e quando eu devo criar uma lib para isso? Não entendi muito bem essa pergunta... Você quis dizer quando se deve usar uma função direto em C++ ou usar em lua/lib? Se for isso, funções em C++ devem ser usadas como algo mais interno, por exemplo, se você quiser usar a famosa "addon 3" que falta no tibia, você precisa fazer alterações no código C++. Agora o que vai acontecer quando você "equipar" a addon 3? Quer que ganhe uma vida adicional, velocidade, mana... Parece mais flexível, certo? Nesses casos se recomenda usar lua. Espero ter sido claro e ajudado em algo!
Postado Agosto 20, 2018 6 anos Autor 2 minutos atrás, Zanrix disse: Quando você cria a função na lib, a função fica de forma global e você já pode acessar ela em qualquer outro arquivo apenas usando o nome Exemplo: Criei na lib a função: function isPlayerKnight(cid) if (getPlayerVocation(cid) == 4) then return true end return false end Agora quero usar a função em um script que verifica se o jogador é knight ao der "use" em um item, e se for, ele recebe uma mensagem: function onUse(cid, item, fromPosition, itemEx, toPosition) if (isPlayerKnight(cid)) then doCreatureSay(cid, "Sou um Knight!") end end Praticidade, fácil manutenção. Imagine que você fez uma função qualquer, mas encontrou um pequeno erro nela, e aí? Recompilar seu servidor por causa de uma letra? Usando lua você apenas corrige o arquivo, salva, e não precisa nem reiniciar o servidor, um simples /reload no script já carrega ele in-game! Não entendi muito bem essa pergunta... Você quis dizer quando se deve usar uma função direto em C++ ou usar em lua/lib? Se for isso, funções em C++ devem ser usadas como algo mais interno, por exemplo, se você quiser usar a famosa "addon 3" que falta no tibia, você precisa fazer alterações no código C++. Agora o que vai acontecer quando você "equipar" a addon 3? Quer que ganhe uma vida adicional, velocidade, mana... Parece mais flexível, certo? Nesses casos se recomenda usar lua. Espero ter sido claro e ajudado em algo! Ah sim, sua resposta clareou minha mente hahah. Muito obrigado irei estudar mais a fundo isso e ir testando e testando. Muito Obrigado, mesmo!
Postado Agosto 20, 2018 6 anos @Kamiz Bem, respondendo de forma bem superficial e de maneira que seja mais fácil o entendimento: 1) Quando eu crio uma função na lib, como eu usaria ela nos scripts normais? As funções localizadas na lib estão acessíveis em qualquer outro script localizado em actions/movements/talkactions, nas demais pastas também. Usar uma função localizada na lib é da mesma forma que a função localizada no próprio script tanto declarada localmente quanto globalmente. O diferencial é que ela se torna 'visível' para as demais pastas de trabalho. 2) Adicionando a função que criei junto com o arquivo eu poderia usar ela de forma global no servidor? Sim, após declarar o diretório do arquivo localizado na lib, você poderá usar a função como falei na pergunta 1. 3) Quais as vantagens de criar funções em lua? As vantagens são as mesmas para que quase todas as linguagens. Organização do código, 'reunir' ações repetitivas em um bloco mais simples, conferir maior flexibilidade ao código (mais fácil ser editado, atualizado). 4) Quando eu devo utilizar uma função C++ direto nas sources e quando eu devo criar uma lib para isso? Na verdade a questão de utilizar uma função C++ direto nas sources ou criar uma lib não tem relação. O ponto é que em algumas situações não é possível criar um código utilizando Lua (independente de estar na lib ou não) com base nas funções já existentes e adicionadas à source. Nesse caso, você precisa adicionar/criar uma função C++ que atenda às suas necessidades. Com o tempo, ao se tornar um pouco mais experiente, você vai perceber que existem limitações que impedem certas ações nos scripts, falando de forma bem simplória. Aqui vai um exemplo genérico e simples que acredito ajudar a entender as vantagens de usar funções: Ao clicar em um item, enviar mensagem para todos os players em determinada área: - Em data/actions/scripts no arquivo sendmsg.lua: local area = {{x=1,y=1,z=1}, {x=2,y=2,z=2}} function onUse(cid, item, fromPosition, itemEx, toPosition) if getPlayerVocation(cid) == 1 then if getPlayerLevel(cid) < 100 then doPlayerSendCancel(cid, "Você possui level menor que 100.") return true end for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Sorcerer usou o item.") end end doCreatureSay(cid, "Sou um sorcerer.", TALKTYPE_SAY) elseif getPlayerVocation(cid) == 2 then doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Druid usou o item.") end end elseif getPlayerVocation(cid) == 3 then doCreateMonster("Demon", getPlayerPosition(cid)) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Paladin usou o item.") end end end return true end Perceba que o bloco que envia mensagem para os players que estão em uma área se repete várias vezes: for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Druid usou o item.") end end Poderia ser feita uma função para enviar mensagem para jogadores em uma área: function enviarMsgEmArea(msg, area_from, area_to) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area_from, area_from) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, msg) end end end E o script se tornaria algo como: local area = {{x=1,y=1,z=1}, {x=2,y=2,z=2}} function onUse(cid, item, fromPosition, itemEx, toPosition) if getPlayerVocation(cid) == 1 then if getPlayerLevel(cid) < 100 then doPlayerSendCancel(cid, "Você possui level menor que 100.") return true end enviarMsgEmArea("Um Sorcerer usou o item.", area[1], area[2]) doCreatureSay(cid, "Sou um sorcerer.", TALKTYPE_SAY) elseif getPlayerVocation(cid) == 2 then doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) enviarMsgEmArea("Um Druid usou o item.", area[1], area[2]) elseif getPlayerVocation(cid) == 3 then doCreateMonster("Demon", getPlayerPosition(cid)) enviarMsgEmArea("Um Paladin usou o item.", area[1], area[2]) end return true end function enviarMsgEmArea(msg, area_from, area_to) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area_from, area_from) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, msg) end end end Percebeu a diferença? Caso a função estivesse na lib, ela poderia ser usada em um script que ao usar um comando !msg (na pasta talkactions) envia certa mensagem para os players de uma área ou mesmo ao pisar em certo local e fazer a mesma coisa caso o script estivesse na pasta movements. Bem, foi algo muito superficial e em uma linguagem para que pudesse entender. Espero ter ajudado. Contato: Email: [email protected] Discord: Dwarfer#2715
Postado Agosto 21, 2018 6 anos Autor 23 horas atrás, Dwarfer disse: @Kamiz Bem, respondendo de forma bem superficial e de maneira que seja mais fácil o entendimento: 1) Quando eu crio uma função na lib, como eu usaria ela nos scripts normais? As funções localizadas na lib estão acessíveis em qualquer outro script localizado em actions/movements/talkactions, nas demais pastas também. Usar uma função localizada na lib é da mesma forma que a função localizada no próprio script tanto declarada localmente quanto globalmente. O diferencial é que ela se torna 'visível' para as demais pastas de trabalho. 2) Adicionando a função que criei junto com o arquivo eu poderia usar ela de forma global no servidor? Sim, após declarar o diretório do arquivo localizado na lib, você poderá usar a função como falei na pergunta 1. 3) Quais as vantagens de criar funções em lua? As vantagens são as mesmas para que quase todas as linguagens. Organização do código, 'reunir' ações repetitivas em um bloco mais simples, conferir maior flexibilidade ao código (mais fácil ser editado, atualizado). 4) Quando eu devo utilizar uma função C++ direto nas sources e quando eu devo criar uma lib para isso? Na verdade a questão de utilizar uma função C++ direto nas sources ou criar uma lib não tem relação. O ponto é que em algumas situações não é possível criar um código utilizando Lua (independente de estar na lib ou não) com base nas funções já existentes e adicionadas à source. Nesse caso, você precisa adicionar/criar uma função C++ que atenda às suas necessidades. Com o tempo, ao se tornar um pouco mais experiente, você vai perceber que existem limitações que impedem certas ações nos scripts, falando de forma bem simplória. Aqui vai um exemplo genérico e simples que acredito ajudar a entender as vantagens de usar funções: Ao clicar em um item, enviar mensagem para todos os players em determinada área: - Em data/actions/scripts no arquivo sendmsg.lua: local area = {{x=1,y=1,z=1}, {x=2,y=2,z=2}} function onUse(cid, item, fromPosition, itemEx, toPosition) if getPlayerVocation(cid) == 1 then if getPlayerLevel(cid) < 100 then doPlayerSendCancel(cid, "Você possui level menor que 100.") return true end for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Sorcerer usou o item.") end end doCreatureSay(cid, "Sou um sorcerer.", TALKTYPE_SAY) elseif getPlayerVocation(cid) == 2 then doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Druid usou o item.") end end elseif getPlayerVocation(cid) == 3 then doCreateMonster("Demon", getPlayerPosition(cid)) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Paladin usou o item.") end end end return true end Perceba que o bloco que envia mensagem para os players que estão em uma área se repete várias vezes: for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area[1], area[2]) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "Um Druid usou o item.") end end Poderia ser feita uma função para enviar mensagem para jogadores em uma área: function enviarMsgEmArea(msg, area_from, area_to) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area_from, area_from) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, msg) end end end E o script se tornaria algo como: local area = {{x=1,y=1,z=1}, {x=2,y=2,z=2}} function onUse(cid, item, fromPosition, itemEx, toPosition) if getPlayerVocation(cid) == 1 then if getPlayerLevel(cid) < 100 then doPlayerSendCancel(cid, "Você possui level menor que 100.") return true end enviarMsgEmArea("Um Sorcerer usou o item.", area[1], area[2]) doCreatureSay(cid, "Sou um sorcerer.", TALKTYPE_SAY) elseif getPlayerVocation(cid) == 2 then doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) enviarMsgEmArea("Um Druid usou o item.", area[1], area[2]) elseif getPlayerVocation(cid) == 3 then doCreateMonster("Demon", getPlayerPosition(cid)) enviarMsgEmArea("Um Paladin usou o item.", area[1], area[2]) end return true end function enviarMsgEmArea(msg, area_from, area_to) for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), area_from, area_from) then doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, msg) end end end Percebeu a diferença? Caso a função estivesse na lib, ela poderia ser usada em um script que ao usar um comando !msg (na pasta talkactions) envia certa mensagem para os players de uma área ou mesmo ao pisar em certo local e fazer a mesma coisa caso o script estivesse na pasta movements. Bem, foi algo muito superficial e em uma linguagem para que pudesse entender. Espero ter ajudado. Consegui bastante material para estudo com base no que você e o @Zanrix me disseram. Queria agradecer mais uma vez a comunidade carecê de pessoas assim.
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.