Ir para conteúdo

Featured Replies

Postado

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

Eae rapaziada, eu vou postar uma atualização do sistema original feito pelo Movie , com algumas adições e explicações.

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

Source do Server

  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

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

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

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

Melhorias

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

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.

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo