Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

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).
Spoiler

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:

Spoiler

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

 

Instalação:

  • Sources > Luascript.cpp
    Spoiler
    
    //doTradeOrbs(cid, target, points)
    lua_register(m_luaState, "doTradeOrbs", LuaInterface::luaDoTradeOrbs);

    Coloque essas linhas próximo de linhas parecidas.

  • Sources > Luascript.cpp
    Spoiler
    
    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
    Spoiler
    
    static int32_t luaDoTradeOrbs(lua_State* L);

     

 

 

  • Server > Data > Lib > 050-function
    Spoiler
    
    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
    Spoiler
    
    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
    Spoiler
    
    <event type="tradeaccept" name="Points_Trade" event="script" value="Trade_Orbs.lua"/>

     

  • Server > Data > Creaturescripts > Scripts > Login.lua
    Spoiler
    
    registerCreatureEvent(cid, "Points_Trade")

     

  • Server > Data > Talkactions > Scripts > Points_Trade.lua
    Spoiler
    
    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
    Spoiler
    
    <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.

 

 

 

 

 

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

  • 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

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

Compre seus Scripts Agora totalmente seguro e de forma rápida, aceitamos também encomendas.

discord.gg/phJZeHa2k4

 

Projeto ATS (Naruto)

Informações Abaixo

Facebook

Youtube
Discord

 

Tutoriais / Conteúdos

Clique Aqui

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).

 

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 LuaScriptInterface::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);

     

 

Em luaScript.cpp a linha "


int32_t LuaInterface::luaDoTradeOrbs(lua_State* L)" troca por" int32_t LuaScriptInterface::luaDoTradeOrbs(lua_State* L)" caso de erro em alguma versão na compilação 
  • 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)
    		elseif 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.

 

 

 

 

 

 

 

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

Postado
  • Autor
38 minutes ago, Vinicius e Kamilla said:

 

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

Obrigado pela contribuição, poderá ajudar outros usuários que utilizem alguma versão diferente... =D
 

 

3 minutes ago, gabriel28 said:

Script deveras interessante. Muito bom conteúdo.

Muito Obrigado, espero que lhe seja útil =D

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