Postado Março 18, 2018 7 anos 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 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 Maio 17, 2018 7 anos por VitorSubhi .Pequenas correções (veja o histórico de edições)
Postado Março 18, 2018 7 anos 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 Março 23, 2018 7 anos 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 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 Março 23, 2018 7 anos 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... 3 minutes ago, gabriel28 said: Script deveras interessante. Muito bom conteúdo. Muito Obrigado, espero que lhe seja útil
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.