Jump to content

Recommended Posts

=================================================================================================

Eae rapaziada, eu vou postar uma atualização do sistema original feito pelo Movie [Post Original], 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.

Link to comment
https://xtibia.com/forum/topic/260016-tfs-1x-adicionando-nova-moeda-1kk/
Share on other sites

×
×
  • Create New...