Ir para conteúdo

[C++] Unique Item System - ATUALIZADO! (No-bugs)


Posts Recomendados

[C++] Unique Item System

testado: TFS - 0.3.6 (porém acredito que funcione em outros)

autor: Tony Araújo (OrochiElf)

contribuição: gristony

 

 

Olá galera, beleza? Então, tem tanto tempo que eu não faço minhas contribuições e hoje eu resolvi postar um sistema bastante simples, porém de extrema necessidade e importância nos servidores que dão items iniciais aos jogadores, especialmente os poketibias. Então com esse sistema o jogador fica impossibilitado de jogar o item fora e também de fazer trocas com outros jogadores, sendo literalmente únicos. Eu criei ele em cima do código do TFS 0.3.6, porém é um sistema com o código completamente simples, então acredito que se instalado atentamente em outras versões, funcione sem problemas.

Bom, sem mais delongas vamos ao que interessa.

 

 

Vá ao game.cpp e procure por esta função:

bool Game::playerMoveItem(uint32_t playerId, const Position& fromPos,
	uint16_t spriteId, int16_t fromStackpos, const Position& toPos, uint8_t count)

 

Então, dentro desta mesma função, você procura por esta condição aqui.

	if(!player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere))
	{
		if((std::abs(playerPos.x - mapToPos.x) > item->getThrowRange()) ||
			(std::abs(playerPos.y - mapToPos.y) > item->getThrowRange()) ||
			(std::abs(mapFromPos.z - mapToPos.z) * 4 > item->getThrowRange()))
		{
			player->sendCancelMessage(RET_DESTINATIONOUTOFREACH);
			return false;
		}
	}

 

 E logo abaixo adicione esta condição:

	Item* tmpItem = NULL;
	Container* tmpContainer = NULL;
	if(tmpContainer = item->getContainer())
    {
        for(ContainerIterator it = tmpContainer->begin(); it != tmpContainer->end(); ++it)
        {
            if(tmpItem = (*it)->getItem())
            {
            	 boost::any value = tmpItem->getAttribute("unique");
            	 if(!value.empty() && getMap()->getTile(toPos))
            	 {
            	 	player->sendCancel("Has a unique item in this bag, you can't drop this item.");
            	 	return false;
            	 }
            }
        }
    }
	boost::any value = item->getAttribute("unique");
	if(!value.empty() && (!toCylinder->getItem() && toCylinder != player && toCylinder->getParent() != player || toCylinder->getItem() && toCylinder->getItem()->isGroundTile() || toCylinder->getItem() && toCylinder->getItem()->getContainer() && !toCylinder->getItem()->getContainer()->getDepot() && toCylinder->getItem()->getParent() != player))
	{
		player->sendCancel("It is a unique item, you can't drop this item.");
		return false;
	}

 

Certo. Continuando no game.cpp, você vai procurar pela função:

ReturnValue Game::internalMoveItem(Creature* actor, Cylinder* fromCylinder, Cylinder* toCylinder,
	int32_t index, Item* item, uint32_t count, Item** _moveItem, uint32_t flags /*= 0*/)

 

Dentro da função, você procura pela condição:

	//update item(s)
	if(item->isStackable())

 

E troque por esta:

	//update item(s)
	if(item->isStackable())
	{
		if(toItem && toItem->getID() == item->getID())
		{
			boost::any item_value = item->getAttribute("unique");
			boost::any toItem_value = toItem->getAttribute("unique");
			if(!item_value.empty() && !toItem_value.empty() || item_value.empty() && toItem_value.empty())
			{
				n = std::min((uint32_t)100 - toItem->getItemCount(), m);
				toCylinder->__updateThing(toItem, toItem->getID(), toItem->getItemCount() + n);
				updateItem = toItem;	
			}
		}

		if(m - n > 0)
		{
			moveItem = Item::CreateItem(item->getID(), m - n);

			boost::any value = item->getAttribute("unique");
			if(!value.empty())
				moveItem->setAttribute("unique", 1);
		}
		else
			moveItem = NULL;

		if(item->isRemoved())
			freeThing(item);
	}

 

Sem sair do game.cpp, você procura pela função:

bool Game::playerRequestTrade(uint32_t playerId, const Position& pos, int16_t stackpos,
	uint32_t tradePlayerId, uint16_t spriteId)

 

Dentro dela, você procura pela condição:

	if(!tradeItem || tradeItem->getClientID() != spriteId || !tradeItem->isPickupable() || (tradeItem->isLoadedFromMap() &&
		(tradeItem->getUniqueId() != 0 || (tradeItem->getActionId() != 0 && tradeItem->getContainer()))))
	{
		player->sendCancelMessage(RET_NOTPOSSIBLE);
		return false;
	}

 

E logo abaixo você adiciona a condição:

	boost::any value = tradeItem->getAttribute("unique");
	if(!value.empty())
	{
		player->sendTextMessage(MSG_INFO_DESCR, "It is a unique item, you can't trade this item.");
		return false;
	}
	Item* tmpItem = NULL;
	Container* tmpContainer = NULL;
	if(tmpContainer = tradeItem->getContainer())
    {
        for(ContainerIterator it = tmpContainer->begin(); it != tmpContainer->end(); ++it)
        {
            if(tmpItem = (*it)->getItem())
            {
            	 boost::any value = tmpItem->getAttribute("unique");
            	 if(!value.empty())
            	 {
            	 	player->sendTextMessage(MSG_INFO_DESCR, "Has a unique item in this bag, you can't trade this item.");
            	 	return false;
            	 }
            }
        }
    }

 

Pronto, seu sistema de unique está instalado e pronto para ser utilizado. Para você setar o item unique, basta:

doItemSetAttribute(item.uid, "unique", 1)

 

Algumas imagens

 

- NÃO PODE DAR TRADE COM ITEMS UNIQUES
image.png.d03a5ee10650f81188c472586e7ba3ad.png

 image.png.da19380e054e77e1f466dc1562bf83f0.png

 

- E TAMBÉM NÃO PODE DAR TRADE COM BAGS QUE TENHAM UNIQUE ID DENTRO

image.png.326bd69c7a48b53f4a57b97104010acf.png

 

-NÃO PODE JOGAR O ITEM NO CHÃO
image.png.8bd56891a9c0f5a4f8c50b32f23eb09c.png

 

- SE TENTAR JOGAR O ITEM NO CHÃO OU EM ALGUMA BAG NO CHÃO
image.png.0cb08c379eac5c2120f9a60bb41a25bd.png

 

- NEM MESMO SE TIVER DENTRO DE UMA BAG

image.png.7838d0f981a5d5213aa55c4f05198a5a.png

-

- SÓ É POSSÍVEL GUARDAR DENTRO DO DEPOT
image.png.62b5b8b87a1e9d28801fb1a08f7e3392.png

 

 

Bom, é isso galera, espero que gostem e façam bom proveito. ;D

 

image.png

Editado por Tony Araujo
Link para o comentário
Compartilhar em outros sites

29 minutos atrás, Brunds disse:

@Tony Araujo
caso o player dar trade com o item unique vai aparecer a mensagem que ele não pode negociar itens unique?

Muito bem lembrado, vou adicionar a condição pertencente a isso. Muito obrigado brow!

 

@Tópico

Editado e adicionado a condição.

Adicionado imagens do funcionamento.

Editado por Tony Araujo
Link para o comentário
Compartilhar em outros sites

@Tony Araujo

Se eu colocar um item unique em uma bag e joga-la, iria ser impedido ? Ou se eu colocar o item unique em um baú ou caixa pelo mapa, irá reconhecer que o container não está no meu inventario ?

 

Editado por XZero
Link para o comentário
Compartilhar em outros sites

2 horas atrás, XZero disse:

@Tony Araujo

Se eu colocar um item unique em uma bag e joga-la, iria ser impedido ? Ou se eu colocar o item unique em um baú ou caixa pelo mapa, irá reconhecer que o container não está no meu inventario ?

 

voce vai colocar pra quando o jogador ganhar o item ao abrir o bau vai ser unique assim ele não da trade e nem pode jogar fora

Link para o comentário
Compartilhar em outros sites

Eii professor no caso para você adicionar no script seria assim ??

 

function onUse(cid, item, frompos, item2, topos) -- Não mecha.

storage = 2353468
item = 15784
nomeitem = "teste"
quantidade = 1
level = 100

if getPlayerLevel(cid) >= level and getPlayerStorageValue(cid,storage) == -1 then
doPlayerSendTextMessage(cid,25,"Você achou a "..nomeitem.." escondida.")
doPlayerAddItem(cid, item, quantidade)
doItemSetAttribute(item.uid, "unique", 1)
-- setPlayerStorageValue(cid,storage,1)

 

elseif getPlayerLevel(cid) <= level then
doPlayerSendTextMessage(cid,25,"Você precisa ser level "..level.." ou mais.")

elseif getPlayerStorageValue(cid,storage) >= 1 then
doPlayerSendTextMessage(cid,25,"Você já fez está quest")
end
return true
end

Link para o comentário
Compartilhar em outros sites

11 horas atrás, XZero disse:

@Tony Araujo

Se eu colocar um item unique em uma bag e joga-la, iria ser impedido ? Ou se eu colocar o item unique em um baú ou caixa pelo mapa, irá reconhecer que o container não está no meu inventario ?

 

Testei aqui e acontece o seguinte:

 

se eu colocar o item que está como "unique" em um Bag estou conseguindo jogar ela e o item no chão, o mesmo ocorre quando eu coloco o item em um bau pelo map, estou conseguindo como se o item não fosse unique...

Link para o comentário
Compartilhar em outros sites

1 hora atrás, gabrielzika disse:

Testei aqui e acontece o seguinte:

 

se eu colocar o item que está como "unique" em um Bag estou conseguindo jogar ela e o item no chão, o mesmo ocorre quando eu coloco o item em um bau pelo map, estou conseguindo como se o item não fosse unique...

Hum.. 

Como pensei o sistema não está 100%, tenho um sistema unique aqui e ocorre o mesmo problema.

Link para o comentário
Compartilhar em outros sites

6 horas atrás, gabrielzika disse:

Testei aqui e acontece o seguinte:

 

se eu colocar o item que está como "unique" em um Bag estou conseguindo jogar ela e o item no chão, o mesmo ocorre quando eu coloco o item em um bau pelo map, estou conseguindo como se o item não fosse unique...

manda o script que da o item pelo bau

Link para o comentário
Compartilhar em outros sites

40 minutos atrás, Brunds disse:

manda o script que da o item pelo bau

Cara não é quest, é um baú qualquer pelo mapa, coloca o item unique la e qualquer pessoa pode pegar.

Link para o comentário
Compartilhar em outros sites

@XZero lógico que sim isso funciona com qualquer item. Esse sistema de unique só funciona com script action ou que faça ganhar o item ai da para setar o unique no item ganhado

Editado por Brunds
Link para o comentário
Compartilhar em outros sites

Agora, Brunds disse:

@XZero lógico que sim isso funciona com qualquer item só funciona com script action ou que faça ganhar o item ai da para setar o unique nele

Que script cara, esquece esse script, suponha que eu tenha um item unique coloque dentro de um recipiente pelo mapa uma box (caixa) outra pessoa pode ir la e pegar.

Link para o comentário
Compartilhar em outros sites

@XZero ata o vodkart tinha me dito uma vez que tinha que fazer um movement se baseando no unique ai qualquer item que seja unique seria impossivel de retirar da bag para qualquer outro lugar

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...