Ir para conteúdo

Featured Replies

Postado

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 por Kamiz (veja o histórico de edições)

Postado
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
  • 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

@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:

 

Postado
  • 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. <3

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo