Jump to content
×
×
  • Create New...

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


Recommended Posts

  • Replies 33
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

[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,

em game.cpp em baixo de  if(!player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere)) { if((std::abs(playerPos.x - mapToPos.x) > item->getThrowRange()) || (std::abs(playerPos.y

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.

Posted Images

@Brunds Como falei unique é para ficar preso no personagem, com essa falha o sistema fica incompleto. Mas acho que sei um jeito de arrumar esse problema, qualquer coisa eu posto aqui.

Edited by XZero
Link to post
Share on other sites
9 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...

em game.cpp em baixo de 

    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;
		}
	}

coloque isso:

if(item->getContainer())
    {
        Container* container = item->getContainer();
        for(ContainerIterator sb = container->begin(), end = container->end(); sb != end; ++sb)
        {
            Item* ballSLot = (*sb)->getItem();
            boost::any valueU = (ballSLot)->getAttribute("unique");
            if(valueU.type() == typeid(int32_t))
            {
                if(boost::any_cast<int32_t>(valueU) == 1)
                {
                    Thing* thingT = internalGetThing(player, toPos, toIndex, spriteId, STACKPOS_MOVE);
                    if(getMap()->getTile(toPos))
                    { 
                        player->sendTextMessage(MSG_INFO_DESCR, "A item in this container is a Unique Item. You can't throw away this item!");
                        return false;
                    }
                }
            }          
        }
    }

OBS: isso é só para não poder rebolar a bag com item unique no chão, a outra parte estou com preguiça. quem sabe, mais tarde eu resolva fazer, se ninguém ainda tiver feito, até lá. kkkk

Edited by gristony
Link to post
Share on other sites
1 hora atrás, gristony disse:

em game.cpp em baixo de 


    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;
		}
	}

coloque isso:


if(item->getContainer())
    {
        Container* container = item->getContainer();
        for(ContainerIterator sb = container->begin(), end = container->end(); sb != end; ++sb)
        {
            Item* ballSLot = (*sb)->getItem();
            boost::any valueU = (ballSLot)->getAttribute("unique");
            if(valueU.type() == typeid(int32_t))
            {
                if(boost::any_cast<int32_t>(valueU) == 1)
                {
                    Thing* thingT = internalGetThing(player, toPos, toIndex, spriteId, STACKPOS_MOVE);
                    if(getMap()->getTile(toPos))
                    { 
                        player->sendTextMessage(MSG_INFO_DESCR, "A item in this container is a Unique Item. You can't throw away this item!");
                        return false;
                    }
                }
            }          
        }
    }

OBS: isso é só para não poder rebolar a bag com item unique no chão, a outra parte estou com preguiça. quem sabe, mais tarde eu resolva fazer, se ninguém ainda tiver feito, até lá. kkkk

Obrigado por contribuir brother, a outra parte eu fiz aqui e vou atualizar o tópico junto com sua contribuição. ;D

 

@TOPICO - ATUALIZADO!

Removido todos os bugs encontrados.

O personagem não pode negociar bags que contenham unique items dentro.

O personagem não pode por um unique tem dentro de uma bag que esteja no chão, só poderá guardar dentro do depot.

O personagem não pode jogar fora uma bag que contenham unique items dentro.

Adicionado imagens de todas as funções do sistema.

Edited by Tony Araujo
Link to post
Share on other sites

No 0.4 só deu um erro na hora de compilar, mas foi uma besteirinha e falta de atenção minha:
Na hora de substituir essa função: 

if(item->isStackable())

Você poem essa:

Código:

Spoiler

if(item->isStackable())
	{
        uint8_t n = 0; //acrescimo
		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);
	}

 


Também, na hora de copiar e colar, prestem atenção se não tem nenhum sinal de interrogação '?' no código.
Ainda não testei pra ver se está 100% funcional na versão 0.4, mas creio que está sem problema. Depois edito o comentário dizendo.

Edited by gabriel28
Link to post
Share on other sites
10 minutos atrás, gabriel28 disse:

No 0.4 só deu um erro na hora de compilar, mas foi uma besteirinha e falta de atenção minha:
Na hora de substituir essa função: 


if(item->isStackable())

Você poem essa:

Código:

  Ocultar conteúdo


if(item->isStackable())
	{
        uint8_t n = 0; //acrescimo
		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);
	}

 


Também, na hora de copiar e colar, prestem atenção se não tem nenhum sinal de interrogação '?' no código.
Ainda não testei pra ver se está 100% funcional na versão 0.4, mas creio que está sem problema. Depois edito o comentário dizendo.

Obrigado por contribuir com o código brother ❤️

Link to post
Share on other sites

@Tony Araujo
Nada, só precisou declarar um negocinho e pronto. :D

Testado e 100% funcional no 0.4 rev 3884. (Jogando diretamente no chão. Jogando a bp com o item dentro, jogando a bp, com uma bp, com outra bp com o item dentro. Dando trade direto no item. Dando trade com uma bp, com outra bp com o item dentro.)

Um scriptzin, pra quem não sabe fazer, de um baú que da um item unique:
Código:
 

Spoiler

function onUse(cid, item, frompos, item2, topos)
local item = doPlayerAddItem(cid, 2515, 1)
if getPlayerStorageValue(cid, 132800) < 1 then
doPlayerSendTextMessage(cid,22,"Conseguiu um item.")
setPlayerStorageValue(cid, 132800, 1)
doItemSetAttribute(item, "unique", 1)
else
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce ja abriu esse bau.")
end

return true
end

 

 

Link to post
Share on other sites
  • 4 weeks later...

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

Bom eu acabei achando um errom... Quando eu jogo um item dentro de um recipiente aleatório no mapa, outro jogador consegue pegar o item mas a função unique permanece, acho que ainda tem bugs rs

Link to post
Share on other sites
  • 4 weeks later...
Em 20/04/2019 em 02:55, Walox disse:

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

Bom eu acabei achando um errom... Quando eu jogo um item dentro de um recipiente aleatório no mapa, outro jogador consegue pegar o item mas a função unique permanece, acho que ainda tem bugs rs

Como assim? Tipo um baú que está no mapa?

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now