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

Tony Araujo

OrochiElf
avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 27/02/13Posts: 446Gênero: Masculino

[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

Tony Araújo :happy:

LeoTK

Leo
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/12/11Posts: 1249Gênero: Masculino

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

 ?️ Projeto NTO NS ?️

? Detalhes ?

?️ Mapa próprio em produção ?️

?️ Versão: 8.60 ?️

? War System ?

⚔️ Jutsus Próprios baseado no anime ⚔️

? Itens com as características e efeitos do anime ?

? Para mais detalhes acesse as redes sociais do servidor abaixo ?

? Usando como referencias Anime/Jogos/Wallpapers etc... para trazer algo mais próximo possível do universo de Naruto ?

 

? Redes Sociais ?

? Facebook ?

? Youtube ?
? Discord ?

 

? Tutoriais / Conteúdos ?

♨️ Clique Aqui ♨️

 

 

Tony Araujo

OrochiElf
avatar
Visconde
Visconde

INFOS

Grupo: ViscondeRegistrado: 27/02/13Posts: 446Gênero: Masculino
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.

Tony Araújo :happy:

XZero

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 04/03/17Posts: 164Gênero: Masculino

@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 ?

 

LeoTK

Leo
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/12/11Posts: 1249Gênero: Masculino
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

 ?️ Projeto NTO NS ?️

? Detalhes ?

?️ Mapa próprio em produção ?️

?️ Versão: 8.60 ?️

? War System ?

⚔️ Jutsus Próprios baseado no anime ⚔️

? Itens com as características e efeitos do anime ?

? Para mais detalhes acesse as redes sociais do servidor abaixo ?

? Usando como referencias Anime/Jogos/Wallpapers etc... para trazer algo mais próximo possível do universo de Naruto ?

 

? Redes Sociais ?

? Facebook ?

? Youtube ?
? Discord ?

 

? Tutoriais / Conteúdos ?

♨️ Clique Aqui ♨️

 

 

nociam

avatar
Conde
Conde

INFOS

Grupo: CondeRegistrado: 04/02/13Posts: 541Gênero: Masculino

O bichão apareceu.

Walox

Deetrax
avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 05/04/18Posts: 95Gênero: MasculinoChar no Tibia: Deetrax

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

gabrielzika

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 20/06/15Posts: 92Gênero: Masculino
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...

XZero

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 04/03/17Posts: 164Gênero: Masculino
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.

LeoTK

Leo
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/12/11Posts: 1249Gênero: Masculino
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

 ?️ Projeto NTO NS ?️

? Detalhes ?

?️ Mapa próprio em produção ?️

?️ Versão: 8.60 ?️

? War System ?

⚔️ Jutsus Próprios baseado no anime ⚔️

? Itens com as características e efeitos do anime ?

? Para mais detalhes acesse as redes sociais do servidor abaixo ?

? Usando como referencias Anime/Jogos/Wallpapers etc... para trazer algo mais próximo possível do universo de Naruto ?

 

? Redes Sociais ?

? Facebook ?

? Youtube ?
? Discord ?

 

? Tutoriais / Conteúdos ?

♨️ Clique Aqui ♨️

 

 

XZero

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 04/03/17Posts: 164Gênero: Masculino
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.

LeoTK

Leo
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/12/11Posts: 1249Gênero: Masculino

@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

 ?️ Projeto NTO NS ?️

? Detalhes ?

?️ Mapa próprio em produção ?️

?️ Versão: 8.60 ?️

? War System ?

⚔️ Jutsus Próprios baseado no anime ⚔️

? Itens com as características e efeitos do anime ?

? Para mais detalhes acesse as redes sociais do servidor abaixo ?

? Usando como referencias Anime/Jogos/Wallpapers etc... para trazer algo mais próximo possível do universo de Naruto ?

 

? Redes Sociais ?

? Facebook ?

? Youtube ?
? Discord ?

 

? Tutoriais / Conteúdos ?

♨️ Clique Aqui ♨️

 

 

XZero

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 04/03/17Posts: 164Gênero: Masculino
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.

LeoTK

Leo
avatar
Marquês
Marquês

INFOS

Grupo: MarquêsRegistrado: 05/12/11Posts: 1249Gênero: Masculino

@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

 ?️ Projeto NTO NS ?️

? Detalhes ?

?️ Mapa próprio em produção ?️

?️ Versão: 8.60 ?️

? War System ?

⚔️ Jutsus Próprios baseado no anime ⚔️

? Itens com as características e efeitos do anime ?

? Para mais detalhes acesse as redes sociais do servidor abaixo ?

? Usando como referencias Anime/Jogos/Wallpapers etc... para trazer algo mais próximo possível do universo de Naruto ?

 

? Redes Sociais ?

? Facebook ?

? Youtube ?
? Discord ?

 

? Tutoriais / Conteúdos ?

♨️ Clique Aqui ♨️

 

 

XZero

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 04/03/17Posts: 164Gênero: Masculino

@Brunds Sim, o meu unique é pelo onMoveItem, agora só não sei fazer identificar se o container está no inventario do player ou não.