Tony Araujo 282 Postado Março 16, 2019 Share Postado Março 16, 2019 (editado) [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 - E TAMBÉM NÃO PODE DAR TRADE COM BAGS QUE TENHAM UNIQUE ID DENTRO -NÃO PODE JOGAR O ITEM NO CHÃO - SE TENTAR JOGAR O ITEM NO CHÃO OU EM ALGUMA BAG NO CHÃO - NEM MESMO SE TIVER DENTRO DE UMA BAG - - SÓ É POSSÍVEL GUARDAR DENTRO DO DEPOT Bom, é isso galera, espero que gostem e façam bom proveito. ;D Editado Março 21, 2019 por Tony Araujo Wase Wiss, LeoTK, Yan Liima e 8 outros reagiu a isso 7 4 Link para o comentário Compartilhar em outros sites More sharing options...
LeoTK 173 Postado Março 16, 2019 Share Postado Março 16, 2019 @Tony Araujo caso o player dar trade com o item unique vai aparecer a mensagem que ele não pode negociar itens unique? Tony Araujo reagiu a isso 1 Link para o comentário Compartilhar em outros sites More sharing options...
Tony Araujo 282 Postado Março 16, 2019 Autor Share Postado Março 16, 2019 (editado) 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 Março 16, 2019 por Tony Araujo jeanflamengo e LeoTK reagiu a isso 1 1 Link para o comentário Compartilhar em outros sites More sharing options...
XZero 68 Postado Março 16, 2019 Share Postado Março 16, 2019 (editado) @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 Março 16, 2019 por XZero Walox reagiu a isso 1 Link para o comentário Compartilhar em outros sites More sharing options...
LeoTK 173 Postado Março 16, 2019 Share Postado Março 16, 2019 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 More sharing options...
nociam 90 Postado Março 16, 2019 Share Postado Março 16, 2019 O bichão apareceu. Link para o comentário Compartilhar em outros sites More sharing options...
Walox 46 Postado Março 16, 2019 Share Postado Março 16, 2019 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 More sharing options...
gabrielzika 29 Postado Março 17, 2019 Share Postado Março 17, 2019 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 More sharing options...
XZero 68 Postado Março 17, 2019 Share Postado Março 17, 2019 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 More sharing options...
LeoTK 173 Postado Março 17, 2019 Share Postado Março 17, 2019 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 More sharing options...
XZero 68 Postado Março 17, 2019 Share Postado Março 17, 2019 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 More sharing options...
LeoTK 173 Postado Março 17, 2019 Share Postado Março 17, 2019 (editado) @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 Março 17, 2019 por Brunds Link para o comentário Compartilhar em outros sites More sharing options...
XZero 68 Postado Março 17, 2019 Share Postado Março 17, 2019 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 More sharing options...
LeoTK 173 Postado Março 17, 2019 Share Postado Março 17, 2019 @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 More sharing options...
XZero 68 Postado Março 17, 2019 Share Postado Março 17, 2019 @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. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados