Postado Maio 8 Mai 8 ================================================================================================================ Eae rapaziada, eu vou postar uma atualização do sistema original feito pelo Movie , com algumas adições e explicações. ================================================================================================================ Testado no TFS 1.2 | OTC 10.98 ================================================================================================================ Source do Server Spoiler Em player.cpp, procure a função Player::updateSaleShopList Troque essa linha if (itemId != ITEM_GOLD_COIN && itemId != ITEM_PLATINUM_COIN && itemId != ITEM_CRYSTAL_COIN) { por essa if (itemId != ITEM_GOLD_COIN && itemId != ITEM_PLATINUM_COIN && itemId != ITEM_CRYSTAL_COIN && itemId != ITEM_GOLD_INGOT) { Em const.h, procure por ITEM_CRYSTAL_COIN = 2160 Abaixo dela, adicione isso ITEM_GOLD_INGOT = 9971, Sendo que o 9971 é o ID do item que gostariamos que seja a nova moeda. ================================================================================================================ Em item.cpp, procure pela função uint32_t Item::getWorth() const Troque ela toda por isso uint32_t Item::getWorth() const { switch (id) { case ITEM_GOLD_COIN: return count; case ITEM_PLATINUM_COIN: return count * 100; case ITEM_CRYSTAL_COIN: return count * 10000; case ITEM_GOLD_INGOT: return count * 1000000; default: return 0; } } Em luascript.cpp, procure por registerEnum(ITEM_CRYSTAL_COIN) Abaixo disso, coloque isso registerEnum(ITEM_GOLD_INGOT) ================================================================================================================ Server Spoiler Vá até actions/script/changegold.lua, e troque por isso local config = { [ITEM_GOLD_COIN] = {changeTo = ITEM_PLATINUM_COIN}, [ITEM_PLATINUM_COIN] = {changeBack = ITEM_GOLD_COIN, changeTo = ITEM_CRYSTAL_COIN}, [ITEM_CRYSTAL_COIN] = {changeBack = ITEM_PLATINUM_COIN, changeTo = ITEM_GOLD_INGOT}, [ITEM_GOLD_INGOT] = {changeBack = ITEM_CRYSTAL_COIN} } function onUse(player, item, fromPosition, target, toPosition, isHotkey) local coin = config[item:getId()] if coin.changeTo and item.type == 100 then item:remove() player:addItem(coin.changeTo, 1) player:say("$$$", TALKTYPE_MONSTER_SAY, true) elseif coin.changeBack then item:remove(1) player:addItem(coin.changeBack, 100) player:say("$$$", TALKTYPE_MONSTER_SAY, true) else return false end return true end ================================================================================================================ Essenciais ================================================================================================================ Spoiler Lembre-se de adicionar o item que vai representar a nova moeda ao servidor, adicionando a sprite no OBB e registrando ele em data/items/items.xml. Adicione a action changegold à moeda nova. Vá em data/actions/actions.xml e adicione isso: <action itemid="IDDOITEM" script="other/changegold.lua" /> ================================================================================================================ Melhorias ================================================================================================================ Spoiler Várias pessoas que pegaram esse sistema relataram que ao usar comandos de adicionar dinheiro ou usar o sistema de banco, a moeda nova não era entregue. Para resolver isso, eu fiz algumas alterações na source: Vá em game.cpp e procure a função void Game::addMoney Troque a função inteira por essa: void Game::addMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) { if (money == 0) { return; } // 1kk (1,000,000 gold) uint64_t goldIngot = money / 1000000; money -= goldIngot * 1000000; while (goldIngot > 0) { const uint16_t count = std::min<uint64_t>(100, goldIngot); Item* remaindItem = Item::CreateItem(ITEM_GOLD_INGOT, count); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } goldIngot -= count; } // Crystal Coins (10,000 gold) uint32_t crystalCoins = money / 10000; money -= crystalCoins * 10000; while (crystalCoins > 0) { const uint16_t count = std::min<uint32_t>(100, crystalCoins); Item* remaindItem = Item::CreateItem(ITEM_CRYSTAL_COIN, count); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } crystalCoins -= count; } // Platinum Coins (100 gold) uint16_t platinumCoins = money / 100; if (platinumCoins != 0) { Item* remaindItem = Item::CreateItem(ITEM_PLATINUM_COIN, platinumCoins); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } money -= platinumCoins * 100; } // Gold Coins (1 gold) if (money != 0) { Item* remaindItem = Item::CreateItem(ITEM_GOLD_COIN, money); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } } } Bom, é isso, espero que dê certo pra todos, qualquer dúvida pode mandar ai que eu tento ajudar a resolver. Crédito total ao Movie.
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.