Ir para conteúdo
Propaganda

Posts Recomendados

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

Eae rapaziada, eu vou postar uma atualização do sistema original feito pelo Movie 

This is the hidden content, please
, 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.

  • Like 32
  • Thanks 2
Link para o comentário
https://tibiadevs.com/forums/topic/1097-tfs-1x-adicionando-nova-moeda-1kk/
Compartilhar em outros sites

Worth no items.xml facilitaria um pouco o processo também!
<attribute key="worth" value="X" />
 

  • Like 1
Link para o comentário
https://tibiadevs.com/forums/topic/1097-tfs-1x-adicionando-nova-moeda-1kk/#findComment-5648
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
  • Criar Novo...