Postado Maio 9, 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). 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 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?
Postado Maio 17, 2018 7 anos 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 Maio 17, 2018 7 anos por VitorSubhi (veja o histórico de edições)
Postado Maio 19, 2018 7 anos 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.
Postado Julho 15, 2020 4 anos 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 Julho 15, 2020 4 anos 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.