Ir para conteúdo

Pesquisar na Comunidade

Mostrando resultados para as tags ''move''.

  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo


Fóruns

  • xTibia - Notícias e Suporte
    • Regras
    • Noticias
    • Soluções
    • Projetos Patrocinados
    • Tutoriais para Iniciantes
    • Imprensa
  • OTServ
    • Notícias e Debates
    • OTServlist
    • Downloads
    • Recursos
    • Suporte
    • Pedidos
    • Show-Off
    • Tutoriais
  • OFF-Topic
    • Barzinho do Éks
    • Design
    • Informática

Encontrar resultados em...

Encontrar resultados que contenham...


Data de Criação

  • Início

    FIM


Data de Atualização

  • Início

    FIM


Filtrar pelo número de...

Data de Registro

  • Início

    FIM


Grupo


Sou

Encontrado 8 registros

  1. Bom dia, eu gostaria de uma ajudinha nessa spell se possível: Ela é um move target que rouba a vida do alvo pro Pokémon que está usando. Eu gostaria de saber se é possível ajustar ela para curar uma determinada % da vida do Pokémon, eu tentei mudar colocando mais um "CreatureAddHealth" mas não faz tanta diferença na vida que o Pokémon recupera. Obrigada a todos pela atenção desde já. ❤️
  2. Sabem que quando nós jogamos um item sobre a bp ele entra? queria remover isso, queria que so entrasse ao jogar diretamente dentro creio que seja nesse arquivo container.cpp ////////////////////////////////////////////////////////////////////////// OpenTibia - an opensource roleplaying game////////////////////////////////////////////////////////////////////////// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.////////////////////////////////////////////////////////////////////////#include "otpch.h"#include "container.h"#include "game.h"#include "iomap.h"#include "player.h"extern Game g_game;ContainerContainer(uint16_t type) : Item(type){ maxSize = items[type].maxItems; serializationCount = 0; totalWeight = 0.0;}Container~Container(){ for(ItemListiterator cit = itemlist.begin(); cit != itemlist.end(); ++cit) { (*cit)->setParent(NULL); (*cit)->unRef(); } itemlist.clear();}Item* Containerclone() const{ Container* _item = static_cast<Container*>(Itemclone()); for(ItemListconst_iterator it = itemlist.begin(); it != itemlist.end(); ++it) _item->addItem((*it)->clone()); return _item;}Container* ContainergetParentContainer(){ if(Cylinder* cylinder = getParent()) { if(Item* item = cylinder->getItem()) return item->getContainer(); } return NULL;}void ContaineraddItem(Item* item){ itemlist.push_back(item); item->setParent(this);}Attr_ReadValue ContainerreadAttr(AttrTypes_t attr, PropStream& propStream){ switch(attr) { case ATTR_CONTAINER_ITEMS: { uint32_t count; if(!propStream.getLong(count)) return ATTR_READ_ERROR; serializationCount = count; return ATTR_READ_END; } default: break; } return ItemreadAttr(attr, propStream);}bool ContainerunserializeItemNode(FileLoader& f, NODE node, PropStream& propStream){ if(!ItemunserializeItemNode(f, node, propStream)) return false; uint32_t type; for(NODE nodeItem = f.getChildNode(node, type); nodeItem; nodeItem = f.getNextNode(nodeItem, type)) { //load container items if(type != OTBM_ITEM) return false; PropStream itemPropStream; f.getProps(nodeItem, itemPropStream); Item* item = ItemCreateItem(itemPropStream); if(!item) return false; if(!item->unserializeItemNode(f, nodeItem, itemPropStream)) return false; addItem(item); updateItemWeight(item->getWeight()); } return true;}void ContainerupdateItemWeight(double diff){ totalWeight += diff; if(Container* parent = getParentContainer()) parent->updateItemWeight(diff);}double ContainergetWeight() const{ return ItemgetWeight() + totalWeight;}stdstring ContainergetContentDescription() const{ stdstringstream s; return getContentDescription(s).str();}stdstringstream& ContainergetContentDescription(stdstringstream& s) const{ bool begin = true; Container* evil = const_cast<Container*>(this); for(ContainerIterator it = evil->begin(); it != evil->end(); ++it) { Container* tmp = (*it)->getContainer(); if(tmp && !tmp->empty()) continue; if(!begin) s << ", "; else begin = false; s << (*it)->getNameDescription(); } if(begin) s << "nothing"; return s;}Item* ContainergetItem(uint32_t index){ size_t n = 0; for(ItemListconst_iterator cit = getItems(); cit != getEnd(); ++cit) { if(n == index) return *cit; else ++n; } return NULL;}uint32_t ContainergetItemHoldingCount() const{ uint32_t counter = 0; for(ContainerIterator it = begin(); it != end(); ++it) ++counter; return counter;}bool ContainerisHoldingItem(const Item* item) const{ for(ContainerIterator it = begin(); it != end(); ++it) { if((*it) == item) return true; } return false;}void ContaineronAddContainerItem(Item* item){ const Position& cylinderMapPos = getPosition(); SpectatorVec list; SpectatorVeciterator it; g_game.getSpectators(list, cylinderMapPos, false, false, 2, 2, 2, 2); //send to client Player* player = NULL; for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->sendAddContainerItem(this, item); } //event methods for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->onAddContainerItem(this, item); }}void ContaineronUpdateContainerItem(uint32_t index, Item* oldItem, const ItemType& oldType, Item* newItem, const ItemType& newType){ const Position& cylinderMapPos = getPosition(); SpectatorVec list; SpectatorVeciterator it; g_game.getSpectators(list, cylinderMapPos, false, false, 2, 2, 2, 2); //send to client Player* player = NULL; for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->sendUpdateContainerItem(this, index, oldItem, newItem); } //event methods for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->onUpdateContainerItem(this, index, oldItem, oldType, newItem, newType); }}void ContaineronRemoveContainerItem(uint32_t index, Item* item){ const Position& cylinderMapPos = getPosition(); SpectatorVec list; SpectatorVeciterator it; g_game.getSpectators(list, cylinderMapPos, false, false, 2, 2, 2, 2); //send change to client Player* player = NULL; for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->sendRemoveContainerItem(this, index, item); } //event methods for(it = list.begin(); it != list.end(); ++it) { if((player = (*it)->getPlayer())) player->onRemoveContainerItem(this, index, item); }}ReturnValue Container__queryAdd(int32_t index, const Thing* thing, uint32_t count, uint32_t flags) const{ if(((flags & FLAG_CHILDISOWNER) == FLAG_CHILDISOWNER)) { //a child container is querying, since we are the top container (not carried by a player) //just return with no error. return RET_NOERROR; } const Item* item = thing->getItem(); if(!item) return RET_NOTPOSSIBLE; if(!item->isPickupable()) return RET_CANNOTPICKUP; if(item == this) return RET_THISISIMPOSSIBLE; if(const Container* container = item->getContainer()) { for(const Cylinder* cylinder = getParent(); cylinder; cylinder = cylinder->getParent()) { if(cylinder == container) return RET_THISISIMPOSSIBLE; } } if(index == INDEX_WHEREEVER && !((flags & FLAG_NOLIMIT) == FLAG_NOLIMIT) && full()) return RET_CONTAINERNOTENOUGHROOM; const Cylinder* topParent = getTopParent(); if(topParent != this) return topParent->__queryAdd(INDEX_WHEREEVER, item, count, flags | FLAG_CHILDISOWNER); return RET_NOERROR;}ReturnValue Container__queryMaxCount(int32_t index, const Thing* thing, uint32_t count, uint32_t& maxQueryCount, uint32_t flags) const{ const Item* item = thing->getItem(); if(!item) { maxQueryCount = 0; return RET_NOTPOSSIBLE; } if(((flags & FLAG_NOLIMIT) == FLAG_NOLIMIT)) { maxQueryCount = stdmax((uint32_t)1, count); return RET_NOERROR; } int32_t freeSlots = stdmax((int32_t)(capacity() - size()), (int32_t)0); if(item->isStackable()) { uint32_t n = 0; if(index != INDEX_WHEREEVER) { const Thing* destThing = __getThing(index); const Item* destItem = NULL; if(destThing) destItem = destThing->getItem(); if(destItem && destItem->getID() == item->getID()) n = 100 - destItem->getItemCount(); } maxQueryCount = freeSlots * 100 + n; if(maxQueryCount < count) return RET_CONTAINERNOTENOUGHROOM; } else { maxQueryCount = freeSlots; if(maxQueryCount == 0) return RET_CONTAINERNOTENOUGHROOM; } return RET_NOERROR;}ReturnValue Container__queryRemove(const Thing* thing, uint32_t count, uint32_t flags) const{ int32_t index = __getIndexOfThing(thing); if(index == -1) return RET_NOTPOSSIBLE; const Item* item = thing->getItem(); if(item == NULL) return RET_NOTPOSSIBLE; if(count == 0 || (item->isStackable() && count > item->getItemCount())) return RET_NOTPOSSIBLE; if(!item->isMovable() && !hasBitSet(FLAG_IGNORENOTMOVABLE, flags)) return RET_NOTMOVABLE; return RET_NOERROR;}Cylinder* Container__queryDestination(int32_t& index, const Thing*, Item** destItem, uint32_t&){ if(index == 254 /*move up*/) { index = INDEX_WHEREEVER; *destItem = NULL; Container* parentContainer = dynamic_cast<Container*>(getParent()); if(parentContainer) return parentContainer; else return this; } else if(index == 255 /*add wherever*/) { index = INDEX_WHEREEVER; *destItem = NULL; return this; } else { if(index >= (int32_t)capacity()) { /* if you have a container, maximize it to show all 20 slots then you open a bag that is inside the container you will have a bag with 8 slots and a "grey" area where the other 12 slots where from the container if you drop the item on that grey area the client calculates the slot position as if the bag has 20 slots */ index = INDEX_WHEREEVER; } if(index != INDEX_WHEREEVER) { Thing* destThing = __getThing(index); if(destThing) *destItem = destThing->getItem(); if(Cylinder* subCylinder = dynamic_cast<Cylinder*>(*destItem)) { index = INDEX_WHEREEVER; *destItem = NULL; return subCylinder; } } } return this;}void Container__addThing(Creature* actor, Thing* thing){ return __addThing(actor, 0, thing);}void Container__addThing(Creature*, int32_t index, Thing* thing){ if(index >= (int32_t)capacity()) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__addThing], index:" << index << ", index >= capacity()" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } Item* item = thing->getItem(); if(!item) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__addThing] item == NULL" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; }#ifdef __DEBUG_MOVESYS__ if(index != INDEX_WHEREEVER && size() >= capacity()) { stdclog << "Failure: [Container::__addThing] size() >= capacity()" << stdendl; return /*RET_CONTAINERNOTENOUGHROOM*/; }#endif item->setParent(this); itemlist.push_front(item); totalWeight += item->getWeight(); if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(item->getWeight()); //send change to client if(getParent() && getParent() != VirtualCylindervirtualCylinder) onAddContainerItem(item);}void Container__updateThing(Thing* thing, uint16_t itemId, uint32_t count){ int32_t index = __getIndexOfThing(thing); if(index == -1) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__updateThing] index == -1" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } Item* item = thing->getItem(); if(!item) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__updateThing] item == NULL" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } const ItemType& oldType = Itemitems[item->getID()]; const ItemType& newType = Itemitems[itemId]; const double oldWeight = item->getWeight(); item->setID(itemId); item->setSubType(count); const double diffWeight = -oldWeight + item->getWeight(); totalWeight += diffWeight; if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(diffWeight); //send change to client if(getParent()) onUpdateContainerItem(index, item, oldType, item, newType);}void Container__replaceThing(uint32_t index, Thing* thing){ Item* item = thing->getItem(); if(!item) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__replaceThing] item == NULL" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } uint32_t count = 0; ItemListiterator cit = itemlist.end(); for(cit = itemlist.begin(); cit != itemlist.end(); ++cit) { if(count == index) break; ++count; } if(cit == itemlist.end()) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__updateThing] item not found" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } totalWeight -= (*cit)->getWeight(); totalWeight += item->getWeight(); if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(-(*cit)->getWeight() + item->getWeight()); itemlist.insert(cit, item); item->setParent(this); //send change to client if(getParent()) { const ItemType& oldType = Itemitems[(*cit)->getID()]; const ItemType& newType = Itemitems[item->getID()]; onUpdateContainerItem(index, *cit, oldType, item, newType); } (*cit)->setParent(NULL); itemlist.erase(cit);}void Container__removeThing(Thing* thing, uint32_t count){ Item* item = thing->getItem(); if(!item) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__removeThing] item == NULL" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } int32_t index = __getIndexOfThing(thing); if(index == -1) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__removeThing] index == -1" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } ItemListiterator cit = stdfind(itemlist.begin(), itemlist.end(), thing); if(cit == itemlist.end()) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__removeThing] item not found" << stdendl;#endif return /*RET_NOTPOSSIBLE*/; } if(item->isStackable() && count != item->getItemCount()) { const double oldWeight = -item->getWeight(); item->setItemCount(stdmax(0, (int32_t)(item->getItemCount() - count))); const double diffWeight = oldWeight + item->getWeight(); totalWeight += diffWeight; //send change to client if(getParent()) { if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(diffWeight); const ItemType& it = Itemitems[item->getID()]; onUpdateContainerItem(index, item, it, item, it); } } else { //send change to client if(getParent()) { if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(-item->getWeight()); onRemoveContainerItem(index, item); } totalWeight -= item->getWeight(); item->setParent(NULL); itemlist.erase(cit); }}Thing* Container__getThing(uint32_t index) const{ if(index > size()) return NULL; uint32_t count = 0; for(ItemListconst_iterator cit = itemlist.begin(); cit != itemlist.end(); ++cit) { if(count == index) return *cit; else ++count; } return NULL;}int32_t Container__getIndexOfThing(const Thing* thing) const{ uint32_t index = 0; for(ItemListconst_iterator cit = getItems(); cit != getEnd(); ++cit) { if(*cit == thing) return index; else ++index; } return -1;}int32_t Container__getFirstIndex() const{ return 0;}int32_t Container__getLastIndex() const{ return size();}uint32_t Container__getItemTypeCount(uint16_t itemId, int32_t subType /*= -1*/) const{ uint32_t count = 0; for(ItemListconst_iterator it = itemlist.begin(); it != itemlist.end(); ++it) { if((*it) && (*it)->getID() == itemId && (subType == -1 || subType == (*it)->getSubType())) count += (*it)->getItemCount(); } return count;}stdmap<uint32_t, uint32_t>& Container__getAllItemTypeCount(stdmap<uint32_t, uint32_t>& countMap) const{ for(ItemListconst_iterator it = itemlist.begin(); it != itemlist.end(); ++it) countMap[(*it)->getID()] += (*it)->getItemCount(); return countMap;}void ContainerpostAddNotification(Creature* actor, Thing* thing, const Cylinder* oldParent, int32_t index, CylinderLink_t/* link = LINK_OWNER*/){ Cylinder* topParent = getTopParent(); if(!topParent->getCreature()) { if(topParent == this) { //let the tile class notify surrounding players if(topParent->getParent()) topParent->getParent()->postAddNotification(actor, thing, oldParent, index, LINK_NEAR); } else topParent->postAddNotification(actor, thing, oldParent, index, LINK_PARENT); } else topParent->postAddNotification(actor, thing, oldParent, index, LINK_TOPPARENT);}void ContainerpostRemoveNotification(Creature* actor, Thing* thing, const Cylinder* newParent, int32_t index, bool isCompleteRemoval, CylinderLink_t/* link = LINK_OWNER*/){ Cylinder* topParent = getTopParent(); if(!topParent->getCreature()) { if(topParent == this) { //let the tile class notify surrounding players if(topParent->getParent()) topParent->getParent()->postRemoveNotification(actor, thing, newParent, index, isCompleteRemoval, LINK_NEAR); } else topParent->postRemoveNotification(actor, thing, newParent, index, isCompleteRemoval, LINK_PARENT); } else topParent->postRemoveNotification(actor, thing, newParent, index, isCompleteRemoval, LINK_TOPPARENT);}void Container__internalAddThing(Thing* thing){ __internalAddThing(0, thing);}void Container__internalAddThing(uint32_t#ifdef __DEBUG_MOVESYS__ index#endif , Thing* thing){#ifdef __DEBUG_MOVESYS__ stdclog << "[Container::__internalAddThing] index: " << index << stdendl;#endif if(!thing) return; Item* item = thing->getItem(); if(item == NULL) {#ifdef __DEBUG_MOVESYS__ stdclog << "Failure: [Container::__internalAddThing] item == NULL" << stdendl;#endif return; } itemlist.push_front(item); item->setParent(this); totalWeight += item->getWeight(); if(Container* parentContainer = getParentContainer()) parentContainer->updateItemWeight(item->getWeight());}void Container__startDecaying(){ for(ItemListconst_iterator it = itemlist.begin(); it != itemlist.end(); ++it) (*it)->__startDecaying();}ContainerIterator Containerbegin(){ ContainerIterator cit(this); if(!itemlist.empty()) { cit.over.push(this); cit.current = itemlist.begin(); } return cit;}ContainerIterator Containerend(){ ContainerIterator cit(this); return cit;}ContainerIterator Containerbegin() const{ Container* evil = const_cast<Container*>(this); return evil->begin();}ContainerIterator Containerend() const{ Container* evil = const_cast<Container*>(this); return evil->end();}ContainerIteratorContainerIterator():base(NULL) {}ContainerIteratorContainerIterator(Container* _base):base(_base) {}ContainerIteratorContainerIterator(const ContainerIterator& rhs):base(rhs.base), over(rhs.over), current(rhs.current) {}bool ContainerIteratoroperator==(const ContainerIterator& rhs){ return !(*this != rhs);}bool ContainerIteratoroperator!=(const ContainerIterator& rhs){ assert(base); if(base != rhs.base) return true; if(over.empty() && rhs.over.empty()) return false; if(over.empty()) return true; if(rhs.over.empty()) return true; if(over.front() != rhs.over.front()) return true; return current != rhs.current;}ContainerIterator& ContainerIteratoroperator=(const ContainerIterator& rhs){ this->base = rhs.base; this->current = rhs.current; this->over = rhs.over; return *this;}Item* ContainerIteratoroperator*(){ assert(base); return *current;}Item* ContainerIteratoroperator->(){ return *(*this);}ContainerIterator& ContainerIteratoroperator++(){ assert(base); if(Item* item = *current) { Container* container = item->getContainer(); if(container && !container->empty()) over.push(container); } ++current; if(current == over.front()->itemlist.end()) { over.pop(); if(over.empty()) return *this; current = over.front()->itemlist.begin(); } return *this;}ContainerIterator ContainerIteratoroperator++(int32_t){ ContainerIterator tmp(*this); ++*this; return tmp;}
  3. Galera Muitos querem esse script de bike P: O que esse script faz? R: Esse script não deixa mover o item da bike quando ela esta no slot RING que o player está montado Em movements.xml adicione as tags abaixo: <movevent type="Equip" itemid="ID_BIKE" slot="ring" event="script" value="blockBike.lua"/> <movevent type="DeEquip" itemid="ID_BIKE" slot="ring" event="script" value="blockBike.lua"/> Em movements/scripts crie um arquilo lua chamado blockBike.lua e cole o código abaixo: local storage = 5700 -- Coloque a Storage Que Controla o Sistema de Bike function onDeEquip(cid, item, slot) if getPlayerStorageValue(cid, storage) > 0 then itemID = item.itemid doRemoveItem(item.uid, 1) doPlayerAddItem(cid, itemID, 1) doPlayerSendCancel(cid, "You cannot take out this item while you're mounted on the bike.") end return true end Créditos Pelo Script: Adriano SwaTT Eu por Editar o Script: Eduzinhonho Obs: Precisa ter o slot Ring só pro item da Bike pois só bloqueia o item se ele estiver lá Se Ajudei não esqueça de dar REP +
  4. Gente tenho uma duvida que atrapalha desenvolvimento de 1 script.... Essa função já tentei varias vezes e dar errado em Cantos de mapa...e água.... mais como o mapa que pretendo teria isso preciso disso resolvido... A quem conhece o jogo e bem conhecido atualmente... League of legend e o jogo Meus Fracos foi em tentar criar a função para os Minions.... exemplo o Minion sai de 1 lugar e anda ate a base inimiga...... no meio do caminho ao ver obstáculos inimigos ele para e ataca e volta ao seu percurso natural a base inimiga precisamente o Nexus..... os obstáculos são Torres,Players e ate Summon dos player em Caso do Inimigo ser 1 Annie e seu ursinho lindo ahauaha.. já fiz e já usei varias função de Posinicial e Posfinal e etc.. e sempre os cantos e águas ... ou aquelas lindas andadas como Robo , pulando de lugar em lugar em vês de dar passos normais..... Queria saber se alguém tem ou saberia ensinar ou apresentar algo se possa funcionar ou ate mesmo 1 Dica mais experiente.
  5. bom, meu servidor de base é o PDA ... porém os pokes estão com agilidade ou mehor velocidade normal quando está seguindo o jogador ou na hunt, mas quando o jogador da move com o poke ele vai super lento, tem como configurar esse move? obrigado!
  6. Booom Dia! Estou com problemas no seu servidor, dúvidas sobre speed relacionados a MOVES, speed embaixo da ÁGUA com outfit .... e no GELO. Bom, primeiro minha dúvida é como aumentar o movespeed, ou melhor a velocidade dos pokes quando se dâ o move, mesmo com os pokes com velocidades ajustadas apos da move eles ainda estão lentos., Segundo estou com querendo saber como aumenta o speed do jogador após usa o outfit de mergulhador, mas que o speed aumente apenas no fundo do mar. Terceiro que o outfit de Esquiador aumente a velocidade do jogador após andar na neve, apenas na neve.
  7. Ola pessoal do xtibia. Estou hoje a perguntar como poem pras moves dos pokemon do server "pokemon dash" serem pelo level do player não pelo level do pokemon. E como poem pra subir a vida e o ataque conforme o level do player.
  8. arturmove

    New Wallpaper X-Tibia

    Olá pessoal sou novo aqui esse é meu primeiro topico e vou postar para vocês um novo wallpaper que eu acabei de fazer aqui para o X-Tibia ta ai :
×
×
  • Criar Novo...