Jump to content
×
×
  • Create New...

PoRaI

Administrador
  • Posts

    121
  • Joined

  • Last visited

  • Days Won

    18

Posts posted by PoRaI

  1. E qual o problema? Copia um script pronto ou substitui ele e testa. De qualquer forma, um exemplo:

    Crie um arquivo em actions/scripts/test.lua com isso:

    function onUse(cid, item, fromPosition, itemEx, toPosition)
    print("Hello World")
    end

    Em actions/actions.xml adicione a linha em algum lugar:

    <action itemid="2402" event="script" value="test.lua" />

    2402 é o Item, quando você der use nele, vai executar o código. Recomendo por um item que não seja multiuse (que não seja item de Use With).

    Se deu tudo certo, quando você der use no item, vai aparecer no terminal do seu servidor a mensagem "Hello World".

  2. Você pelo visto nem abriu né? Você não precisa ler. Principalmente nesse manual, eu nunca o li. Ninguém aprende a programar lendo um livro (no máximo em linguagens de baixo nível), as pessoas aprendem com prática/experiência. É só você ir procurando oq você precisa. Você precisa no minimo entender: "COMO PROGRAMAR" o resto são apenas funções que você testa ou vai no manual que ele explica melhor oq cada uma faz, afinal, É UM MANUAL DE COMO PROGRAMAR EM LUA, não um livro de historinha. Os "LONGOS" textos desse manual são apenas explicações do que cada coisa faz na teoria, se você não entender na prática.

  3. Antes de tudo: Lua é Lua, ponto. A única coisa que pode mudar é a versão do Lua. Recomendo você estudar a linguagem.

    https://www.lua.org/manual/5.2/pt/

    Esse é o maior tutorial disponível na internet, rs. Se você quiser aprender a programar, é só ler isso e depois usar Lua com as funções do Tibia. Todas as funções que você pode usar estão no arquivo luascript.cpp da sua source. No caso do sistema de NPC, se você quiser entender ele a fundo, você precisa ler o código dele que foi parcialmente escrito em Lua na pasta data/npcs/lib.

  4. Como é algo simples, não muda nada. Na minha opinião, por na source só dificulta pra dar manutenção. A vantagem de programar em C++ puro é que no geral, em códigos complexos, o desempenho será melhor dependendo da maneira que você programa utilizando os ponteiros, variáveis, loops e afins. Códigos complexos que digo é tipo: se imagine criando um algoritmo A* em Lua puro para o servidor, você não vai conseguir a não ser que carregue todo o mapa e passe ele através de uma função Lua.

    --

    Correção só pra que não entenda errado: não é que você não vai conseguir carregar o mapa usando Lua puro, mas em questão de desempenho, o C++ é muito mais rápido.

  5. 0.4:

    local pokemons = {"Zapdos", "Moltres", "Articuno","Entei","Lugia","Ho-oh"}
    
    function onKill(cid, target, lastHit)
        if isInArray(pokemons, getCreatureName(target)) then
           for _, pid in pairs(getPlayersOnline()) do
              doPlayerSendTextMessage(pid, MESSAGE_TYPES["blue"], "O jogador "..getCreatureName(cid).." derrotou o passáro lendario "..getCreatureName(target).."!")
           end
        end
        return true
    end

    1.2:

    local pokemons = {"Zapdos", "Moltres", "Articuno","Entei","Lugia","Ho-oh"}
    
    function onKill(creature, target)
    	if isInArray(pokemons, target:getName()) then
    		for _, player in pairs(Game.getPlayers()) do
    			player:sendTextMessage(MESSAGE_TYPES["blue"], "O jogador "..player:getName().." derrotou o passáro lendario "..target:getName().."!")
    		end
    	end
    	return true
    end


    Caso dê algum erro de MESSAGE_TYPES (provavelmente na 1.2), adicione ao final do arquivo constant, na pasta data/lib do seu servidor, isso:

    local MESSAGE_TYPES = {
    	["advance"] = MESSAGE_EVENT_ADVANCE,
    	["event"]   = MESSAGE_EVENT_DEFAULT,
    	["white"]   = MESSAGE_EVENT_DEFAULT,
    	["orange"]  = MESSAGE_STATUS_CONSOLE_ORANGE,
    	["info"]    = MESSAGE_INFO_DESCR,
    	["green"]   = MESSAGE_INFO_DESCR,
    	["small"]   = MESSAGE_STATUS_SMALL,
    	["blue"]    = MESSAGE_STATUS_CONSOLE_BLUE,
    	["red"]     = MESSAGE_STATUS_CONSOLE_RED,
    	["warning"] = MESSAGE_STATUS_WARNING,
    	["status"]  = MESSAGE_STATUS_DEFAULT
    }


    Qualquer alteração, basta trocar no script "blue" para qualquer outro valor dessa tabela.

  6. Ah sim, nem tinha analisado o código, só o gif, rs. Pensei que você tava arrastando ele pra testar, awoejawei.

    Enfim, a função internalMoveCreature é usada para mover criaturas (quase igual a função internalTeleport) sem usar o algoritmo de Path Finding.
    Em C++:

    int LuaScriptInterface::luaGamePlayerMovePokemon(lua_State* L)
    {
    	// Game.playerMovePokemon(pokemon, toPosition)
    	Creature* pokemon = getCreature(L, 1);
            const Position& position = getPosition(L, 2);
    
    	if (pokemon->getMonster()) {
                    std::forward_list<Direction> dirList;
                    if(pokemon->getPathTo(position, dirList, 0, 0, true, true))
                          pokemon->startAutoWalk(dirList);
    	}
    
    	return 1;
    }        

     

    Lua: (Esse código ta mais elaborado do que o C++)

    local pokemonsMoveTo = {}
    
    function Player:movePokemonByList(pokemon, dirList, index)
    	if self and pokemon and #dirList >= index then
    		local speed = pokemon:getSpeed() * 3
    		pokemon:move(dirList[index], 16)
    		index = index + 1
    
    		pokemonsMoveTo[self:getId()] = addEvent(function()
    			self:movePokemonByList(pokemon, dirList, index)
    		end, speed)
    	end
    end
    
    function Player:movePokemon(pos)
    	local pokemon = self:getSummons()
    	if #pokemon == 0 then
    		return false
    	end
    
    	if pokemonsMoveTo[self:getId()] then
    		stopEvent(pokemonsMoveTo[self:getId()])
    		pokemonsMoveTo[self:getId()] = nil
    	end
    
    	local dirList = pokemon[1]:getPathTo(pos, 0, 0, true, true)
    	self:movePokemonByList(pokemon[1], dirList, 1)
    	return true
    end

     

  7. Coloca a versão quando for postar coisas do gênero.


    1.0.

    local TELEPORTED_CREATURES = {}
    local TELEPORT_LOW_HEALTH = {
        {name = "Demon", to = {x=1,y=1,z=7}, percent=80},
        {name = "Demon", to = {x=1,y=1,z=7}, percent=60},
        {name = "Demon", to = {x=1,y=1,z=7}, percent=40},
    }
    
    function onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin)
        if creature:isMonster() then
            for n, m in pairs(TELEPORT_LOW_HEALTH) do
                if m.name == creature:getName() and creature:getHealth() <= (creature:getMaxHealth() / 100) * m.percent then
                    local mid = creature:getId()
                    if not TELEPORTED_CREATURES[mid] or Position(TELEPORTED_CREATURES[mid]) ~= Position(m.to) then
                        TELEPORTED_CREATURES[mid] = m.to
                        creature:teleportTo(m.to, false)
                        break
                    end
                end
            end
        end
        return primaryDamage, primaryType, -secondaryDamage, secondaryType
    end


    0.3.6pl1.

    
    local TELEPORTED_CREATURES = {}
    local TELEPORT_LOW_HEALTH = {
    	{name = "Demon", to = {x=1,y=1,z=7}, percent=80},
    	{name = "Demon", to = {x=1,y=1,z=7}, percent=60},
    	{name = "Demon", to = {x=1,y=1,z=7}, percent=40},
    }
    
    function onStatsChange(cid, attacker, type, combat, value)
    	if isMonster(cid) then
    		for n, m in pairs(TELEPORT_LOW_HEALTH) do
    			if m.name == getCreatureName(cid) and getCreatureHealth(cid) <= (getCreatureMaxHealth(cid) / 100) * m.percent then
    				local pos = m.to.x..","..m.to.y..","..m.to.z
    				if not TELEPORTED_CREATURES[cid] or TELEPORTED_CREATURES[cid] ~= pos then
    					TELEPORTED_CREATURES[cid] = pos
    					doTeleportThing(cid, m.to, false)
    					break
    				end
    			end
    		end
    	end
    	return true
    end


    São creaturescripts. Basta configurar o script no creaturescripts.xml e colocar no xml da criatura:

    <script>
            <event name="nome_do_evento_q_vc_configurou"/>
    </script>

     

  • Recently Browsing   0 members

    • No registered users viewing this page.