Ir para conteúdo

Featured Replies

Postado
Em 18/03/2018 em 05:37, VitorSubhi disse:

Apresentação: Olá galera do Tibia King, este é meu primeiro tutorial que desenvolvo após anos apenas sugando da comunidade, chegou a hora de compartilhar um pouco de conhecimento, rsrs...
Após ver que muitos usuários tinham interesse em um sistema de Trade de Points in-game resolvi trazer um sistema totalmente completo para vocês.

 

Funcionamento:

  • Player 1 após adquirir os Points, pode iniciar uma negociação com o Player 2 através do comando /tradepoints Player 2, Quantidade.
  • Será aberto uma Janela de Trade com o item referente aos Points.
  • Após ambos aceitarem a negociação será realizado a troca de Points pelo item requisitado.


Observações:

  • Necessário ter acesso às Sources de sua Distro.
  • Testado em servidor 8.6 (The Forgotten Server 0.4).
  • Antes que venham falar que possui sistemas parecidos, veja o diferencial (Item não aparece em nenhum inventário, e não é necessário usar/comprar qualquer item).
  Mostrar conteúdo oculto

Change Logs

  • Bugfix: Corrigido um bug em que ambos os usuários estavam negociando Points, mas apenas um dos jogadores recebia os Points.

 

Algumas Imagens:

  Mostrar conteúdo oculto

1.png.e90850158ce2ab4c8854e453eaba38fc.png2.png.81e32eb9f761397d221dac2630e895a3.png3.png.a9a2a41cdeebbe3c1383de71533c133e.png

 

Instalação:

  • Sources > Luascript.cpp
      Ocultar conteúdo
    
    
    int32_t LuaInterface::luaDoTradeOrbs(lua_State* L)
    {
        ScriptEnviroment* env = getEnv();
    
        int quantidade = popNumber(L);
    
        Player* target = env->getPlayerByUID(popNumber(L));
        Player* player = env->getPlayerByUID(popNumber(L));
        if(!player || !target)
        {
               errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND));
               lua_pushboolean(L, false);
    	   return 1;
        }
    
    	Item* Orb = new Item(7722);;
    	Orb->addRef();
    
    	char buffer[150];
    	sprintf(buffer, "You see %d Collapser Orbs.", quantidade);
    	Orb->setSpecialDescription(buffer);
    
    	Orb->setSubType(1);
    
    	player->transferContainer.__addThing(NULL, Orb);
    	player->transferContainer.setParent(player);
    	if(!g_game.internalStartTrade(player, target, Orb))
    		Orb->onTradeEvent(ON_TRADE_CANCEL, player, NULL);
    
    	g_game.addMagicEffect(player->getPosition(), MAGIC_EFFECT_WRAPS_BLUE);
    	return false;
    }

     

  • Sources > Luascript.h
      Mostrar conteúdo oculto
    
    
    static int32_t luaDoTradeOrbs(lua_State* L);

     

 

 

  • Server > Data > Lib > 050-function
      Mostrar conteúdo oculto
    
    
    function getAccountPoints(cid)
    	local res = db.getResult('select `premium_points` from accounts where name LIKE \''..getPlayerAccount(cid)..'\'')
    	return res:getDataInt("premium_points") < 0 and 0 or res:getDataInt("premium_points")
    end
    
    function doPlayerAddPoints(cid, quant)
    return db.query("UPDATE `accounts` SET `premium_points` = '".. getAccountPoints(cid) + quant .."' WHERE `name` LIKE '"..getPlayerAccount(cid).."'")
    end
    
    function doAccountRemovePoints(cid, count)
    	return db.query("UPDATE `accounts` SET `premium_points` = '".. getAccountPoints(cid) - count .."' WHERE `name` LIKE '"..getPlayerAccount(cid).."'")
    end

     

  • Server > Data > Creaturescripts > Scripts >Trade_Orbs.lua
      Mostrar conteúdo oculto
    
    
    function CompleteTrade(fromplayer, toplayer, points)
    	if getPlayerItemCount(toplayer, 7722) >= 1 and getAccountPoints(fromplayer) >= points then
        	doAccountRemovePoints(fromplayer, points)
    		doPlayerRemoveItem(toplayer, 7722, 1)
    		doPlayerAddPoints(toplayer, points)
    		doPlayerSendTextMessage(toplayer, MESSAGE_STATUS_WARNING, "You have received ".. points .." Collapser Orbs.")
    		return true
    	end
    end
    
    function CollapserOrbs(item)
    	return tonumber(string.match(getItemDescriptions(item.uid).special, "You see (%w+) Collapser Orbs."))
    end
    
    function onTradeAccept(cid, target, item, targetItem)
    	if isPlayer(cid) and isPlayer(target) then
    		if item.itemid == 7722 then
    			local points = CollapserOrbs(item)
    			addEvent(CompleteTrade, 1, cid, target, points)
    		end
    		if targetItem.itemid == 7722 then
    			local points = CollapserOrbs(targetItem)
    			addEvent(CompleteTrade, 1, target, cid, points)
    		end
    	end
    	return true
    end 

     

  • Server > Data > Creaturescripts > Creaturescripts.xml
      Mostrar conteúdo oculto
    
    
    <event type="tradeaccept" name="Points_Trade" event="script" value="Trade_Orbs.lua"/>

     

  • Server > Data > Creaturescripts > Scripts > Login.lua
      Mostrar conteúdo oculto
    
    
    registerCreatureEvent(cid, "Points_Trade")

     

  • Server > Data > Talkactions > Scripts > Points_Trade.lua
      Mostrar conteúdo oculto
    
    
    function onSay(cid, words, param, channel)
    
    local t = string.explode(param, ",")
    local target = getCreatureByName(t[1])
    local points = tonumber(t[2])
    
    if(param == '') then
    	return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.")
    end
    
    if (target ~= nil) and isPlayer(target) and not isPlayerGhost(target) then
    	if (points ~= nil) and (type(points) == 'number') and (points>0) then
    		if (getAccountPoints(cid) >= points) then
    			doTradeOrbs(cid, target, points)
    		else
    			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "You do not have enough points.")
    		end
    	else
    		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.")
    	end
    else
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.")
    end
    
    return true
    end

     

  • Server > Data > Talkactions > Talkactions.xml
      Mostrar conteúdo oculto
    
    
    <talkaction words="/tradepoints" log="yes" event="script" value="Trade_Points.lua"/>

     

Créditos:
Todo o sistema foi feito completamente por mim: Vítor Subhi.
The Forgotten Server (Pelas Sources)

Vodkart, White Wolf, Natanael Beckman, e a todos os demais membros do TK que não lembro o nome, que contribuíram indiretamente através de seus tutoriais.

 

 

 

 

 

Compilei tudo certinho, adicionou o script e aconteceu isso:

data/talkactions/scripts/tradepoint.lua:OnSay
description:
data/talkactions/scripts/tradepoint.lua:14: attempt to call global 'doTradeOrbs' <a nil value>
stack traceback:
data/talkactions/scripts/tradepoint.lua:14: in function <data/talkactions/scripts/tradepoint.lua:1>

O que há de errado?

  • Respostas 17
  • Visualizações 3.4k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • Vinicius e Kamilla
    Vinicius e Kamilla

    Caso alguem tenha erro ao compilar substitui a linha "int32_t LuaInterface::luaDoTradeOrbs(lua_State* L)" por "int32_t LuaScriptInterface::luaDoTradeOrbs(lua_State* L)"

  • Desculpe pela demora, realmente havia me esquecido de colocar a lua_register no tópico, referente ao arquivo luascript.cpp. Basta adicioná-lo que seu problema será resolvido.    

  • @Gabrieldsadaxas faz algum tempo que fiz esse script, e não me recordava como ele funcionava. Verificando aqui, notei que estou comparando a string "You see (numero) Collapser Orbs" para capturar os p

Posted Images

Postado
  • Autor
On 5/9/2018 at 8:35 PM, MarcosWalker said:

Compilei tudo certinho, adicionou o script e aconteceu isso:


data/talkactions/scripts/tradepoint.lua:OnSay
description:
data/talkactions/scripts/tradepoint.lua:14: attempt to call global 'doTradeOrbs' <a nil value>
stack traceback:
data/talkactions/scripts/tradepoint.lua:14: in function <data/talkactions/scripts/tradepoint.lua:1>

O que há de errado?

Desculpe pela demora, realmente havia me esquecido de colocar a lua_register no tópico, referente ao arquivo luascript.cpp. Basta adicioná-lo que seu problema será resolvido.
 

Spoiler

//doTradeOrbs(cid, target, points)
lua_register(m_luaState, "doTradeOrbs", LuaInterface::luaDoTradeOrbs);

Coloque essas linhas próximo de linhas parecidas.

 

Editado por VitorSubhi (veja o histórico de edições)

Postado

Funcionou!

Teria como configurar para conseguir negociar apenas se tiver mais de 2 pontos? E ter que ficar 2 na conta. [vou modificar para transferir dias de premium]

Ter um limite de SQM de no máximo 2 para que consiga negociar.

E aparecer como se o jogador estivesse conversando. E não em vermelho no default. Ex:

Fulado says:

!tradevip sicrano, 2

Desde já obrigado. REP+ No post e REP+ se ajudar.

  • 2 years later...
Postado
Citar

[23:49:21.336] [Error - CreatureScript Interface]
[23:49:21.342] In a timer event called from:
[23:49:21.344] data/creaturescripts/scripts/Trade_Orbs.lua:onTradeAccept
[23:49:21.347] Description:
[23:49:21.349] data/creaturescripts/scripts/Trade_Orbs.lua:2: attempt to compare nil with number
[23:49:21.355] stack traceback:
[23:49:21.356]  data/creaturescripts/scripts/Trade_Orbs.lua:2: in function <data/creaturescripts/scripts/Trade_Orbs.lua:1>

alguem?

Postado
  • Autor

@Gabrieldsadaxas 

7 minutes ago, Gabrieldsadaxas said:

alguem?

Pelo que verifiquei o seu problema, o software em algum momento está fazendo uma comparação entre um valor número e algum número, na linha 2 do arquivo Trade_Orbs.lua


[23:49:21.349] data/creaturescripts/scripts/Trade_Orbs.lua:2: attempt to compare nil with number
if getPlayerItemCount(toplayer, 7722) >= 1 and getAccountPoints(fromplayer) >= points then

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.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo