Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 03/18/14 em todas áreas

  1. Bom como o título já diz eu decidi ajudar a vocês a como administrar o seu char, em questão de Stamina e Offline Training. Oque é importante saber: 1minuto in game = +1minuto de Off traning (em qualquer situação) 1minuto in game = 0 minutos de Stamina (caso upando será -1minuto de stamina) 1minuto Offline = +1minuto de Off traning. 1minuto Offline = +1/3minuto de Stamina (logo +1 minuto de stamina = 3minutos off) 1minuto Off Train = +1/3minuto de Stamina (logo +1 minuto de stamina = 3minutos off train) Administrando a tabela acima. Todo dia você deve utilizar as 12horas de Off training (ininterruptas, ou seja você não deve logar o seu char neste tempo); Logo durante estas 12horas de Off training sua Stamina irá se recuperar em 4horas. Seu char além das 4horas acima que ele necessariamente irá recuperar todo dia (pois todo dia você utilizará o seu Off Train) ainda deve descansar mais.. Logo você o deixa além das 12horas off mais 6 horas off (ou seja, seu char irá ficar 18horas off e irá recurar 6horas). O dia possui 24 horas, logo 18 + 6 = 24. Visando oque fora dito, você irá poder jogar 6horas/dias e não afetará em nada a sua stamina, pois o que você perderá de stamina durante o tempo jogado você irá recuperar estando offline. Tirando umas dúvidas > Sobre as camas: Dormir não ajuda na recuperação de stamina. > Premium e Free possuem a mesma regeneração de stamina. > Sobre as 2 horas de EXP extra (se você não sabe quando sua Stamina esta entre 40 à 42 horas você tem um bônus de EXP): A sua stamina irá se recuperar a cada 10minutos offline 1 minuto de stamina. Para recuperar estas 2 horas (120minutos) de stamina/bônus xp será necessário 1.200minutos offline ou seja 20horas. Aplicação do que fora dito no dia-a-dia (um mero exemplo): Situação da pessoa: Eu sou um garoto de ensino médio onde estudo na parte matutina e vespertina (7 ás 18horas). Dorme o normal (8horas/dia). Finais De Semana [FDS] -Favor considerar apenas sábado e domingo como FDS - tenho tempo livre. Aplicação do que fora ensinado: Horário de estudo (11horas) / horário de dormir (8horas). Utilizando a regra: as 18horas eu logo meu char, e saio as 23horas oque é o normal para um garoto de ensino médio. Logo meu char gastará 5 horas de stamina por dia e recuperará 06:20 de stamina. Ou seja, em dia de semana eu recuperarei 1hora e 20 a mais do que eu gasto. No FDS eu tenho mais tempo para jogar e gosto de jogar mais. Logo eu jogo 8 horas por dia, saio durante 8 horas (balada/festas/etc) e durmo 8 horas (8+8+8=24), ou seja meu char gastará 8 horas de stamina e recuperará 5:20horas (8+8=16/3=5:20), dando no FDS um total de 16horas jogadas e 10:40 horas recuperadas (deficit de 5:20horas) em dias de semana eu recupero por dia (1:20 hora a mais) dias de semana = 5 (5x1:20 = 6:40). Visando isto você possui ainda uma regeneração de Stamina por semana de +1:20horas (6:40-5:20=1:20), podendo assim usa-la da forma que você preferir. Importância de manter uma boa Stamina em seu char: Quando você atinge a marca de 14 horas de stamina, ao matar um monstro você receberá apenas 50% dos pontos de experiência da criaturas (Exemplo: se você mata um monstro que dá 100 de Exp ele passará a dar 50). Neste valor também (14 horas ou menos), se o personagem matar uma criatura, o loot será destruído.Espero que tenham gostado desta mini aula de lógica.
    3 pontos
  2. Shoguns

    Item Treiner

    Nome: Item Treiner Autor: Shoguns Tipo: Moveevents Oque ele faz? Quando o player equipar tal item, esse item vai servir como um treiner e ficara upando o skill de acordo com o item que tiver no seu Sloot Esquerdo e direito, que no caso é aonde se colocam a arma de atk e o shield Oque mas tem? O Player não poderá se mover enquanto estiver equipado com o item e ficara aparecendo uma mensagem "Treinando". Va em data/movements/scripts e crie um arquivo com nome de itemtreiner.lua e coloque isso lá dentro Agora em movements.lua cole essas 2 tags: <movevent type="Equip" itemid="1234" slot="feet" event="script" value="itemtreiner.lua"/> <movevent type="DeEquip" itemid="1234" slot="feet" event="script" value="itemtreiner.lua"/> Como configurar: No itemtreiner.lua local porcent = 4 Porcentagem que ira dar de skill local tempo = 3 * 1000 Intervalos para subir o skill local lock = 0 Se quiser colocar algo tipo um exausted antes de comecar nas tags: 1234 Id do item que ao equipar vai upar skill feet Tipo do item (usei feet = boots ) como um exemplo Alguma dúvida deixe um comentário que irei dar suporte.
    2 pontos
  3. O script de hoje eu não fiz sozinho. Fomos eu e o @zipter98 que fizemos e o @dalvorsn nos ajudou a solucioar um problema bem chato. Para ver os outros script de terça, clique aqui. Oq o script faz? A cada monstro que vc mata, os itens que vc está usando ganham 1 de exp. Quando seus itens alcançam números determinados de exp, eles upam ficam com o nome Demon Helmet + 1, etc e também são melhorados. Elmos, armaduras, calças e botas ganham 1 de arm por level, escudos, 1 de def e armas 1 de ataque. Crie itens upgrade.lua em data/creaturescripts/scripts e coloque: Em data/creaturescripts/creturescripts.xml, coloque essas duas TAGs: <event type="kill" name="Item level" event="script" value="itens upgrade.lua"/><event type="login" name="Item levell" event="script" value="itens upgrade.lua"/> Para configurar a seu gosto, basta alterar as tabelas conforme explicado nos comentários dentro do código. Abraços.
    2 pontos
  4. DuuhCarvalho

    System Multi Vip

    Bom com o system multi vip , você pode criar varias e varias vip em apenas um script ! esse script vem com o objetivo de facilitar a criação de vip's ! pois é muiiito fácil de editar ! Serve também para diminuir aquele monte de arquivos.lua que tem no seu serve por causa das vips . Versão 1.0 : Comando por talkactions (ex = !buy..) Versão 2.0 : por Actions (ao dar use em X item) Use o seguinte Script de Movements em ambos scripts de vip . É só configurar corretamente, colocando a storage de cada vip. MOVEMENTS. Agora Vá em data / movements / scripts... crie um arquivo.lua e cole isso dentro : É isso pessoal !
    2 pontos
  5. Tonynh

    [Life Thread] Lock Sano

    Resolvi criar um novo char só para fazer um LT de sua jornada.. =) Ele está no mesmo mundo do meu EK, então o chamarei de "maker", levando em consideração que não é o meu char mais forte, e está em outra account. Estarei jogando de uma maneira mais "old-school", sem muito rush-level, e sim role-play.. focando nos detalhes do game. Nome: Lock Sano Vocation: Knight Level: 8 World: Honera Status: Free Account SET ATUAL SKILL's ATUAIS IMAGENS O TÓPICO SERÁ ATUALIZADO COM AS PRÓXIMAS POSTAGENS. FIQUE A VONTADE PARA ACOMPANHAR.
    2 pontos
  6. Wend ll

    {Tutorial Básico Sobre .Lua}

    Oiie Pessoal do Xtibia. Venho Trazer Um Tutorial sobre ".Lua" que Achei em Outro Fórum Pois Não Pode citar o Nome AQ, Que é Fora das Regras Parte I – Básico do básico de Lua Começaremos por LUA porque é uma linguagem simples, que não precisa declarar variáveis e tudo mais. Aqui não explicarei as funções do otserver e sim como montar um script. Nessa primeira parte usarei o Português Estruturado que sinceramente não é útil quando você aprende a sintaxe da linguagem, porém é ótimo para você que está começando aprender o que está fazendo e não só copiando e colando. LEMBRANDO QUE PORTUGUÊS ESTRUTURADO NÃO É UMA LINGUAGEM É APENAS UM JEITO DE VOCÊ ENTENDER A SINTAXE DAS LINGUAGENS. Começando vamos explicar a sintaxe de um script bem básico mesmo. Aquele script que quando você da use em 100 gps ele vira 1 platinum coin Em português estruturado ele ficaria assim : Com português estruturado da para entender essa action Agora da para explicar melhor a estrutura de um arquivo lua de actions : ► Essa parte é a que diz ao servidor que essa função vai se ativar quando o player usar o item indicado no actions.xml. No caso é a função aoUsar ou seja quando o player clicar com o direito nesse item irá acontecer algo. ► O SE é uma condição, se estiver tudo certo dentro dele ele faz a condição contida no caso o id (numerodoitem) tem que ser 2148 (Gold Coin) e tem que ser do tipo 100 (No caso de itens juntáveis o tipo é a quantidade), faça remova ele e adicione UM item 2152 (platinum coin). ► Senão ou seja, se o item não for 2148 ou não ter tipo 100, não retorne ao começo do script e finalize. Espero que essa parte tenha esclarecido um pouquinho mais sobre actions. Agora vou explicar um pouco mais sobre algumas condições e suas sintaxes. Sintaxe do IF, Else e Elseif. A condição if de longe é a mais importante de todas as programações e é essencial para um script um pouco mais complexo ou para evitar que você faça 200 scripts para certas funções (comida do tibia por exemplo). Vocabulário do tio Ta4e Única coisa que o lua pede é que cada item tenha um end para cada if colocado tenha um end, você também tem que entender a questão do if encadeado que será tema da próxima aula aqui. Mais para ela se tem que saber o básico de um If normal. Esse é o script anterior com adição de uma condição que se o player tiver 100 platinum coin ele se transforme em uma crustal coin. Você percebe que eu alinhei o if e elseif a seu end, isso chama-se Estruturação, isso é muito importante já que para achar um erro será muito mais fácil E fica mais organizado seu script Você percebe que o IF tem um end no final da sua cadeia, pois todo IF tem que ter um end porém o ELSEIF se enquadra dentro do IF. O ELSEIF ajuda pois você diminui linhas de scripts e serve para outras funções mais avançadas que serão vistas nas próximas aulas. Lembrando também que a função toda função também tem seu END, isso ajuda no caso de você querer colocar duas funções no mesmo script (muito usado em movements). IF Encadeado O if encadeado ou cadeia de if, indica funções pouco mais complexas que o if solitário, porém não é nenhum bicho de 7 cabeças, se você fazer a estruturação do script. Aqui vai o script de exemplo, é um script muito mais complexo do que os do gps Esse script é o que eu uso para minhas quest. Esse é um ótimo exemplo de if encadeado. Perceba que ele está estruturado. Claro que colorido é muito simples identificar cada else e end Agora vou explicar a sintaxe. ►A primeira parte pede que o uniqueid (é um numero especial usado apenas uma vez no mapa inteiro), seja 2300. ►Essa parte do queststatus é uma variável que será explicado a parte ►Esse If, checa se o player tem o valor da variável listada acima, senão ele manda a mensagem o “the chest is empty”. ►Esse outro if checa se o player tem a capacidade 29.50, senão ele manda a mensagem “You have found a demon helmet. Weighing 29.50 oz it is too heavy”. ►Chama-se cadeia de if porque as funções em preto só serão executados se todos os IFS forem verdadeiros, se apenas um não for ele já acusa o erro. Seria mais ou menos como tirar um RG Perceba que você terá que ter tudo isso para fazer o RG senão tiver você não consegue tirar ►Voltando ao script perceba que todos tem seu respectivo end, isso é importantíssimo Variáveis Variáveis é uma parte da memoria na qual se guarda um valor ou informação, em outras linguagens elas tem tipos como de números inteiros, reais ou de letras, porém em lua não existe isso. O que facilita muito nossas vidas as variáveis são maneiras ou jeitos de você fazer scripts para outras pessoas ou por pura preguiça mesmo... São extremamente necessárias em scripts grandes na qual um item de mesmo id é repetido muitas vezes, e talvez depois seja necessário muda-lo Lembra do script anterior da quest a parte que da questatus A quest status é uma variável, que pergunta ao servidor se o player tem o valor nele Se não tiver faça, ou seja -1 é igual a negativo ou negação, no caso se o programador quisesse que ele tivesse colocava 1 Essa parte é bem simples de se entender, já que variáveis servem para simplificar a vida de não programadores, porém deixam seu servidor mais pesado, não é coisa grande, porém como já disse a variável ocupa memoria, em torno de 3kb cada uma, mais em um otserver básico possuem muitas variáveis Elas podem ser indicadas em qualquer parte do script, e elas sempre recebem dados ou perguntam. Pode se fazer cálculos nas variáveis ou usar outras variáveis dentro dela sem problema nenhum. Sinais Matemáticos e de comparação Aqui vai uma coisa que confunde muita gente : ►= - Faz o item anterior receber algo Exemplo : gold = 2148 ►== - Verificação. É para checar Exemplo : if item.itemid == 2555 then ► Os sinais matemáticos são +, -, / e * . ►E como toda linguagem não existe , entre números 1,5 é 1.5 virgula é só para separar variáveis ►Para se checar pode ser usar == (igual a ), >= (maior ou igual a ), <= (menor ou igual a ) o sinal de diferente é agora com certeza é ~=. ►Pode se calcular os itens dentro de variáveis ou até dentro de funções. IF com varias condições Você já deve entender um pouco mais de scripts portanto agora colocarei scripts cortados Vamos a um exemplo : Nesse caso o item.itemid é aqueles itens que você pode dar use with (vara de pescar por exemplo) e o item2.itemid é o local a ser clicado. Então seria Se o item for 2694 e o segundo item for 1381 ou 1382 ou 1383 ou 1384 faça. Ou seja qualquer um desses itens é considerado válido. Essa é a básica desse tipo porém pode-se fazer umas mais complexas como essa debaixo que não existe em actions e é só para explicar : Nesse caso o player teria que usar o item 1381 e o 1382 juntos ou o 1383 e 1384 juntos. É usado em movements, npcs e talk actions muito frequentemente. Parece fácil mais da para se confundir facinho ai. Quando usar IF e quando usar ELSEIF Essa parte é a final desse primeiro tutorial e serve apenas para dar uma idéia de como melhor seu script básico Como eu já disse o Elseif é uma é a junção de else + if e ele só vai executado depois se o if primário for falso. Ou seja ele é usado quando apenas uma das condicionais vai ser verdadeira , eu uso muito isso em npcs para o quests de npcs, mais podemos mostrar uns exemplos em actions. Já o if sempre será checado, bom para os ifs encadeados já que eles tem todos estarem certos ou errados. Exemplo de If e Elseif junto ►Perceba que nesse caso é usado o elseif porque é impossível que o mesmo bau tenha o mesmo uniqueid (Como disse anteriormente cada uniqueid é usado apenas 1 vez no mapa e um item só tem 1 uniqueid). Então ou é um ou é outro. E ELSEIF não tem end. ►Nesse caso todos tem que ser reais para poder se executar o script, então é necessários ser if e ter seus ENDS. Comentários Para inserir comentários na linguagem lua é necessário adicionar – 2 hifens. Pode ser em qualquer parte do script (pelo amor de deus não coloque dentro de um if) normalmente usado para explicar o script ou colocar créditos Siglas e Dicionario id – Identificador ou seja no caso de otserver é o numero do item para o tibia. cid – Creature Id :Identificador da criatura, no caso a criatura que executa a ação, no caso o player. uid – Unique Id : Identificador único usado uma vez no mapa (em algumas funções ele serve como para indicar um id. actionid – Identificador de ação pode ser usado varias vezes no mapa, usado principalmente para aquele chão que afunda perto do DP. Creditos: Achei em Outro Fórum Pois Não Mereço Creditos só Trouxe Para aqui Creio que irá ajudar Bastante GENTE QUE TA COMEÇANDO..
    2 pontos
  7. The Forgotten Server 0.3.7, versão 10.10 Atualizações: Client 10.10 suportado. Novas montarias. Removido salt do login, agora pode usar acc manager e acc maker normalmente. Adicionado projeto do Dev-Cpp. OBS.: as features novas 10.x não foram implantadas (browse field, etc). Downloads: Server (32-bit): http://www.mediafire.com/?aq9av842mwawf0g Server (64-bit): http://www.mediafire.com/?iqqv5c8cer5862g Source: http://www.mediafire.com/download/4z3aa9xjf8sjora/source1010.rar Scans: Server (32-bit): https://www.virustotal.com/pt/file/d2f539e9841685d900932615b0045e3cb09bb1576ea8ee7589d90594ae045768/analysis/1377354392/ Server (64-bit): https://www.virustotal.com/pt-br/file/1f522e02f702c644a4385113f241f0051d671230a19207234cee8e4589b65296/analysis/1377434735/ Source: https://www.virustotal.com/pt/file/099c0727c31ef9371661f7be8a34adcac71d2a7ad1a61f59bc2b36a8ae79cc68/analysis/1377354174/ Todos os créditos vão para a equipe do TFS (Elf, Talaturen, Dalkon, BeniS, Tryller e Kornholijo). server1010.rar source1010.rar server1010_64bit.rar
    1 ponto
  8. Oneshot

    Monstros Passivos

    Monstros Passivos Muito bom dia, galera. Sabe, eu estava estudando como funcionam os servidores de pokémons, aqueles que ainda estão começando, embriões de bons servidores, não grandes servidores como o Poke Brasil Online (PokeBro). O problema de todos esses servidores, é que todos são dependentes de sistemas criados pelo brun123 (se não me engano) dentro das sources, ou seja, esses servidores são dependentes do executável compilado do PDA, entre outros. A pedido de um amigo, eu desenvolvi o sistema de monstros passivos. Sim aquele sistema que dá um upgrade na inteligência artificial das criaturas, onde algumas podem atacar o jogador assim que o ver, outras podem atacar apenas quando for atacadas. É um sistema muito básico mesmo, eu fiz com C++ e Lua por puro comodismo, e pretendo deixar mais avançado apenas com C++ e uso de flags nos XMLs. Se você quiser usar, sinta-se a vontade. No seu arquivo monster.h, procure por: bool isHostile() {return mType->isHostile;} Substitua por: bool isHostile() const { std::string value; if(!getStorage("hostile", value)) return mType->isHostile; return booleanString(value); } No seu arquivo monster.cpp, procure por: Monster::selectTarget Dentro da função, procure por: if(!isTarget(creature)) return false; Adicione abaixo: if(!isHostile()) return false; No diretório creaturescripts/scripts, crie um novo arquivo com nome passive.lua e adicione: PASSIVE_BEHAVIOR = {"Deer", "Rabbit"} -- Aqui ficam os monstros que não atacam, mesmo que atacados. function onCombat(cid, target) if isMonster(target) then if not isInArray(PASSIVE_BEHAVIOR, getCreatureName(target)) then doCreatureSetStorage(target, "hostile", 1) end doMonsterSetTarget(target, cid) end return true end No mesmo diretório, abra o arquivo login.lua e adicione: registerCreatureEvent(cid, "PassiveSystem") No diretório creaturescripts/, abra o arquivo creaturescripts.xml e adicione: <event type="combat" name="PassiveSystem" event="script" value="passive.lua"/> Agora é só compilar seu servidor, sem a pasta obj, ou seja, dê um Rebuild All e correr pro abraço com seu sistema de monstros passivos. Abraços, Oneshot.
    1 ponto
  9. lSainty

    Função onSpawn(cid) para TFS 0.3.6

    Eae galera, estava passando aqui por essa seção e vi que só havia a função onSpawn para TFS 0.4, então resolvi trazer para 0.3.6 Primeiramente, va em Creatureevent.h e procure por: uint32_t executePrepareDeath(Creature* creature, DeathList deathList); E cole embaixo: uint32_t executeOnSpawn(Creature* creature); Procure por: CREATURE_EVENT_DEATH, E cole isso por cima da linha de baixo: CREATURE_EVENT_PREPAREDEATH, CREATURE_EVENT_SPAWN Agora va em creatureevent.cpp e procure por: else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; E cole embaixo: else if(tmpStr == "spawn") m_type = CREATURE_EVENT_SPAWN; Procure por: case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; E cole embaixo: case CREATURE_EVENT_SPAWN: return "onSpawn"; Procure por: case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; E cole embaixo: case CREATURE_EVENT_SPAWN: return "cid"; Va ao fim do arquivo e cole isso: uint32_t CreatureEvent::executeOnSpawn(Creature* creature) { //onSpawn(cid) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(creature->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(creature) << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ std::stringstream desc; desc << creature->getName(); env->setEvent(desc.str()); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(creature->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(creature)); bool result = m_interface->callFunction(1); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeCast] Call stack overflow." << std::endl; return 0; } } Va em monster.cpp e procure por: void Monster::onCreatureAppear(const Creature* creature) { Creature::onCreatureAppear(creature); if(creature == this) { //We just spawned lets look around to see who is there. if(isSummon()) isMasterInRange = canSee(master->getPosition()); Embaixo pressione enter 2x e cole: CreatureEventList spawn = getCreatureEvents(CREATURE_EVENT_SPAWN); for(CreatureEventList::iterator it = spawn.begin(); it != spawn.end(); ++it) (*it)->executeOnSpawn(this); E pronto, basta compilar agora Exemplos de como usar essa função: -- EDIT -- Para fazer com que o evento seja iniciado junto com o servidor ao invés de somente quando o monstro der RESPAWN, va em spawn.cpp e procure por: bool Spawn::spawnMonster(uint32_t spawnId, MonsterType* mType, const Position& pos, Direction dir, bool startup /*= false*/) { Monster* monster = Monster::createMonster(mType); if(!monster) return false; if(startup) { //No need to send out events to the surrounding since there is no one out there to listen! if(!g_game.internalPlaceCreature(monster, pos, false, true)) { delete monster; return false; } } else { if(!g_game.placeCreature(monster, pos, false, true)) { delete monster; return false; } } monster->setSpawn(this); monster->addRef(); monster->setMasterPosition(pos, radius); monster->setDirection(dir); spawnedMap.insert(SpawnedPair(spawnId, monster)); spawnMap[spawnId].lastSpawn = OTSYS_TIME(); return true; } e apague essa parte: { //No need to send out events to the surrounding since there is no one out there to listen! if(!g_game.internalPlaceCreature(monster, pos, false, true)) { delete monster; return false; } } else Pronto, agora a função é executada assim que o servidor inicia Se os monstros pararem de dar respawn, ao invés de apagarem a parte que citei acima, troquem isso: bool Spawn::spawnMonster(uint32_t spawnId, MonsterType* mType, const Position& pos, Direction dir, bool startup /*= false*/) { Monster* monster = Monster::createMonster(mType); if(!monster) return false; if(startup) { //No need to send out events to the surrounding since there is no one out there to listen! if(!g_game.internalPlaceCreature(monster, pos, false, true)) { delete monster; return false; } } else { if(!g_game.placeCreature(monster, pos, false, true)) { delete monster; return false; } } monster->setSpawn(this); monster->addRef(); monster->setMasterPosition(pos, radius); monster->setDirection(dir); spawnedMap.insert(SpawnedPair(spawnId, monster)); spawnMap[spawnId].lastSpawn = OTSYS_TIME(); return true; } Por isso: bool Spawn::spawnMonster(uint32_t spawnId, MonsterType* mType, const Position& pos, Direction dir, bool startup /*= false*/) { Monster* monster = Monster::createMonster(mType); if(!monster) return false; if(startup) { //No need to send out events to the surrounding since there is no one out there to listen! if(!g_game.internalPlaceCreature(monster, pos, false, true)) { delete monster; return false; } else { monster->onCreatureAppear(monster); } } else { if(!g_game.placeCreature(monster, pos, false, true)) { delete monster; return false; } } monster->setSpawn(this); monster->addRef(); monster->setMasterPosition(pos, radius); monster->setDirection(dir); spawnedMap.insert(SpawnedPair(spawnId, monster)); spawnMap[spawnId].lastSpawn = OTSYS_TIME(); return true; } Créditos: Doggynub por fazer a função (OTIlha) ArkSeyonet por adaptar para 0.3.6 (OTIlha) Eu por pequenas edições :3 Slicer
    1 ponto
  10. Jesteer

    Shinobi Adventure [narutibia]

    O que tem de novo? Vocações: 24 vocações (entre elas 4 obtidas atraves de quest) a naruto, a sasuke, a lee, a sakura, a gaara, a neji, a kiba, a Shikamaru, a hinata, a tenten, a itachi, a killer bee, a kakashi, a Madara [Quest], a Kankuro, a Minato [Quest], a Jiraya [Quest], a Obito, a Kisame, Raikage, Orochimaru, Temari, Yamato, Deidara Quest e sistemas: Todas as quests normais de NTO, e a de vocação que eu criei e uma outra( surpresa hihihi) sistemas novos de: Skull remover,bingo book,mega pill, (sistema que o personagem come uma pilula e fica com skill e ml maior por um determinado período de tempo), Max level mas é regulável e até da pra tirar. correção de todos os bugs existem apenas um que eu não consegui resolver: Avisos: A DB não aceita exclusão de algumas contas então basta você pegar uma DB de outro servidor limpa e coloca no lugar. Algumas SS's: Download Server: Link:http://www.mediafire.com/?7ade1ddhyybdgmu Download client(descompilado): Link:http://www.mediafire.com/download/men89ay90yysysj/SAinstall.exe Créditos: Jesteer -Edições No Servidor em Geral. Robinhood - Criador Do Servidor. Enself - Edições No Servidor em Geral. Bennyyw - Layout Web Site Junior001 - Algumas Sprites Massas. Darkheel -- Criou a outfit do Raikage. V2 update. adicionado: Download http://www.mediafire.com/download/c832fhv7i6r2kdc/naruto.sql (naruto DB MYSQL) http://www.mediafire.com/download/nd7hh0a0o1000ow/htdocs.rar (site) http://www.mediafire.com/download/m88n0z0klwtuzuz/Shinobi_Adventure_client.exe(client com musica) http://www.mediafire.com/download/g8z933186sntw2e/NtoShinobi.rar (servidor V2) http://www.mediafire.com/download/ocmhwgistkfw243/shinobi_adventure_option_2.exe(client comum) trocando de mysql para sqlite
    1 ponto
  11. caotic

    TV System by caotic

    Eae galeerrra xtibiana. Venho disponibilizar o famoso sistema de televisão poketibiano completo o sistema foi feito para ambos os clients tibianos. O sistema permite você assistir outro players jogando assim você fica sem usar itens,falar(so pm), se movimentar e etc... Vamos la: Vá em luascript.cpp e procure: int32_t LuaScriptInterface::luaGetTopCreature(lua_State* L) { //getTopCreature(pos) PositionEx pos; popPosition(L, pos); ScriptEnviroment* env = getEnv(); Tile* tile = g_game.getTile(pos); if(!tile) { pushThing(L, NULL, 0); return 1; } Thing* thing = tile->getTopCreature(); if(!thing || !thing->getCreature()) { pushThing(L, NULL, 0); return 1; } pushThing(L, thing, env->addThing(thing)); return 1; } E coloque embaixo: int32_t LuaScriptInterface::luaGetAllsTvs(lua_State* L) { //getAllsTvs(cid) ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } Tvlist::iterator it; it = player->tv.begin(); lua_newtable(L); uint32_t tableplayers = 1; for(uint32_t i = 1; it != player->tv.end(); ++it, ++i) { Player* players = env->getPlayerByUID(*it); if (players) { lua_pushnumber(L, tableplayers); lua_pushnumber(L, env->addThing(players)); pushTable(L); tableplayers = tableplayers+1; } } return 1; } int32_t LuaScriptInterface::luaSetPlayerTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player_tv = env->getPlayerByUID(popNumber(L)); Creature* creature = env->getCreatureByUID(popNumber(L)); if (!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } Player* player = creature->getPlayer(); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } if (!player_tv) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } player_tv->tv.push_back(player->getID()); SpectatorVec::iterator it; SpectatorVec list = g_game.getSpectators(player->getPosition()); Player* tmpPlayer = NULL; Condition* condition = NULL; if((condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_GAMEMASTER, -1, 0, false, GAMEMASTER_INVISIBLE))) { creature->setHideName(false); player->addCondition(condition); g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_DISAPPEAR); for(it = list.begin(); it != list.end(); ++it) { if((tmpPlayer = (*it)->getPlayer()) && !tmpPlayer->canSeeCreature(player)) tmpPlayer->sendMagicEffect(player->getPosition(), MAGIC_EFFECT_POFF); } for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit) { if(!pit->second->canSeeCreature(player)) pit->second->notifyLogOut(player); } IOLoginData::getInstance()->updateOnlineStatus(player->getGUID(), false); if(player->isTrading()) g_game.internalCloseTrade(player); player->clearPartyInvitations(); if(player->getParty()) player->getParty()->leave(player); g_game.internalTeleport(player, player_tv->getPosition(), true); } lua_pushboolean(L, true); } int32_t LuaScriptInterface::luaDoSendChannelsTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } player->sendChannelsDialog(true); lua_pushboolean(L, true); return 1; } int32_t LuaScriptInterface::luaDoRemovePlayerTv(lua_State* L) { ScriptEnviroment* env = getEnv(); Player* player = env->getPlayerByUID(popNumber(L)); Player* creature = env->getPlayerByUID(popNumber(L)); if (!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } for(std::list<uint32_t>::iterator it = player->tv.begin(); it != player->tv.end(); ++it) { if ((*it) == creature->getID()) { Tvlist tv = player->tv; if (!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); return 1; } Player* player_tv = creature->getPlayer(); if (!player) { return 1; } SpectatorVec::iterator its; SpectatorVec list = g_game.getSpectators(player_tv->getPosition()); Player* tmpPlayer = NULL; Condition* condition = NULL; creature->setHideName(false); if((condition = player_tv->getCondition(CONDITION_GAMEMASTER, CONDITIONID_DEFAULT, GAMEMASTER_INVISIBLE))) { IOLoginData::getInstance()->updateOnlineStatus(player_tv->getGUID(), true); for(AutoList<Player>::iterator pit = Player::autoList.begin(); pit != Player::autoList.end(); ++pit) { if(!pit->second->canSeeCreature(player_tv)) pit->second->notifyLogIn(player_tv); } for(its = list.begin(); its != list.end(); ++its) { if((tmpPlayer = (*its)->getPlayer()) && !tmpPlayer->canSeeCreature(player_tv)) tmpPlayer->sendMagicEffect(player_tv->getPosition(), MAGIC_EFFECT_TELEPORT); } player_tv->removeCondition(condition); g_game.internalCreatureChangeVisible(creature, VISIBLE_GHOST_APPEAR); *it = NULL; } } } lua_pushboolean(L, true); } Continuando em luascript.cpp procure: //doCreatureSay(uid, text[, type = SPEAK_SAY[, ghost = false[, cid = 0[, pos]]]]) lua_register(m_luaState, "doCreatureSay", LuaScriptInterface::luaDoCreatureSay); Coloque embaixo: //doRemovePlayerTv(cid, id) lua_register(m_luaState, "removePlayerTv", LuaScriptInterface::luaDoRemovePlayerTv); //getAllsTv() lua_register(m_luaState, "getTvs", LuaScriptInterface::luaGetAllsTvs); //setPlayerTv(cid, player) lua_register(m_luaState, "setPlayerTv", LuaScriptInterface::luaSetPlayerTv); //doSendChannelstTv(cid) lua_register(m_luaState, "doSendChannelsTv", LuaScriptInterface::luaDoSendChannelsTv); Em luascript.h procure: static int32_t luaGetPlayerParty(lua_State* L); Coloque embaixo: static int32_t luaGetAllsTvs(lua_State* L); static int32_t luaSetPlayerTv(lua_State* L); static int32_t luaDoSendChannelsTv(lua_State* L); static int32_t luaDoRemovePlayerTv(lua_State* L); Vamos agora em game.cpp: Procure: bool Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text) E substitua função por esta nova função: bool Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; std::string str; if (player->getStorage(34421, str) && str == "true") { if (type == SPEAK_SAY) { player->getStorage(292924, str); player->sendTextMessage(MSG_STATUS_SMALL, str.c_str()); return false; } switch(type) { case SPEAK_WHISPER: return playerWhisper(player, text); case SPEAK_YELL: return playerYell(player, text); case SPEAK_PRIVATE: case SPEAK_PRIVATE_RED: case SPEAK_RVR_ANSWER: return playerSpeakTo(player, type, receiver, text); case SPEAK_CHANNEL_O: case SPEAK_CHANNEL_Y: case SPEAK_CHANNEL_RN: case SPEAK_CHANNEL_RA: case SPEAK_CHANNEL_W: { if(playerTalkToChannel(player, type, text, channelId)) return true; return playerSay(playerId, 0, SPEAK_SAY, receiver, text); } case SPEAK_BROADCAST: return playerBroadcastMessage(player, SPEAK_BROADCAST, text); case SPEAK_RVR_CHANNEL: return playerReportRuleViolation(player, text); case SPEAK_RVR_CONTINUE: return playerContinueReport(player, text); default: break; } internalCreatureSay(player, SPEAK_SAY, text, false); return false; } uint32_t muteTime = 0; bool muted = player->isMuted(channelId, type, muteTime); if(muted) { char buffer[75]; sprintf(buffer, "You are still muted for %d seconds.", muteTime); player->sendTextMessage(MSG_STATUS_SMALL, buffer); return false; } if(player->isAccountManager()) { player->removeMessageBuffer(); return internalCreatureSay(player, SPEAK_SAY, text, false); } if(g_talkActions->onPlayerSay(player, type == SPEAK_SAY ? CHANNEL_DEFAULT : channelId, text, false)) return true; if(!muted) { ReturnValue ret = RET_NOERROR; if(!muteTime) { ret = g_spells->onPlayerSay(player, text); if(ret == RET_NOERROR || (ret == RET_NEEDEXCHANGE && !g_config.getBool(ConfigManager::BUFFER_SPELL_FAILURE))) return true; } player->removeMessageBuffer(); if(ret == RET_NEEDEXCHANGE) return true; } switch(type) { case SPEAK_SAY: return internalCreatureSay(player, SPEAK_SAY, text, false); case SPEAK_WHISPER: return playerWhisper(player, text); case SPEAK_YELL: return playerYell(player, text); case SPEAK_PRIVATE: case SPEAK_PRIVATE_RED: case SPEAK_RVR_ANSWER: return playerSpeakTo(player, type, receiver, text); case SPEAK_CHANNEL_O: case SPEAK_CHANNEL_Y: case SPEAK_CHANNEL_RN: case SPEAK_CHANNEL_RA: case SPEAK_CHANNEL_W: { if(playerTalkToChannel(player, type, text, channelId)) return true; return playerSay(playerId, 0, SPEAK_SAY, receiver, text); } case SPEAK_PRIVATE_PN: return playerSpeakToNpc(player, text); case SPEAK_BROADCAST: return playerBroadcastMessage(player, SPEAK_BROADCAST, text); case SPEAK_RVR_CHANNEL: return playerReportRuleViolation(player, text); case SPEAK_RVR_CONTINUE: return playerContinueReport(player, text); default: break; } return false; } Continuando em game.cpp procure a função: ReturnValue Game::internalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/) E substitua por esta função: ReturnValue Game::internalMoveCreature(Creature* creature, Direction direction, uint32_t flags/* = 0*/) { const Position& currentPos = creature->getPosition(); Cylinder* fromTile = creature->getTile(); Cylinder* toTile = NULL; Position destPos = getNextPosition(direction, currentPos); if(direction < SOUTHWEST && creature->getPlayer()) { Tile* tmpTile = NULL; if(currentPos.z != 8 && creature->getTile()->hasHeight(3)) //try go up { if((!(tmpTile = map->getTile(Position(currentPos.x, currentPos.y, currentPos.z - 1))) || (!tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position(destPos.x, destPos.y, destPos.z - 1))) && tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID)) { flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE; destPos.z--; } } else if(currentPos.z != 7 && (!(tmpTile = map->getTile(destPos)) || (!tmpTile->ground && !tmpTile->hasProperty(BLOCKSOLID))) && (tmpTile = map->getTile(Position( destPos.x, destPos.y, destPos.z + 1))) && tmpTile->hasHeight(3)) //try go down { flags = flags | FLAG_IGNOREBLOCKITEM | FLAG_IGNOREBLOCKCREATURE; destPos.z++; } } ReturnValue ret = RET_NOTPOSSIBLE; if((toTile = map->getTile(destPos))) ret = internalMoveCreature(NULL, creature, fromTile, toTile, flags); if(ret != RET_NOERROR) { if(Player* player = creature->getPlayer()) { player->sendCancelMessage(ret); player->sendCancelWalk(); } } Player* player = creature->getPlayer(); if (player) { Tvlist::iterator it; it = player->tv.begin(); for(uint32_t i = 1; it != player->tv.end(); ++it, ++i) { Player* players = getPlayerByID(*it); if (players) { internalTeleport(players, player->getPosition(), true, 0); } } } return ret; } Procure a função: bool Game::playerRequestChannels(uint32_t playerId) Substitua a função por: bool Game::playerRequestChannels(uint32_t playerId) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; player->sendChannelsDialog(false); return true; } Agora vamos a protocolgame.cpp e procure a função; void ProtocolGame::sendChannelsDialog(bool tv) E substitua por esta função: void ProtocolGame::sendChannelsDialog(bool tv) { NetworkMessage_ptr msg = getOutputBuffer(); std::string str; if(msg) { if (tv) { uint16_t bytes = 0; for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { bytes = bytes+1; } } if (bytes < 1) { player->sendCancel("Não há nenhuma tv online"); return; } TRACK_MESSAGE(msg); msg->AddByte(0xAB); msg->AddByte(bytes); uint16_t id = 200; for(AutoList<Player>::iterator it = Player::autoList.begin(); it != Player::autoList.end(); ++it) { it->second->getStorage(22120, str); if (str == "true") { id = id+1; it->second->getStorage(12121, str); msg->AddU16(id); msg->AddString(str); } } return; } TRACK_MESSAGE(msg); msg->AddByte(0xAB); ChannelList list = g_chat.getChannelList(player); msg->AddByte(list.size()); for(ChannelList::iterator it = list.begin(); it != list.end(); ++it) { if(ChatChannel* channel = (*it)) { msg->AddU16(channel->getId()); msg->AddString(channel->getName()); } } } } Procure em protocolgame.h a seguinta declaração: void sendChannelsDialog(); Substitua por: void sendChannelsDialog(bool tv); Agora vamos em player.h e procure: void sendChannelsDialog() {if(client) client->sendChannelsDialog();} E substitua por: void sendChannelsDialog(bool tv) {if(client) client->sendChannelsDialog(tv);} Procure denovo em player.h: typedef std::list<Party*> PartyList; E adicione embaixo: typedef std::list<uint32_t> Tvlist; Continuando em player.h procure: AttackedSet attackedSet; Coloque embaixo: Tvlist tv; Vamos denovo a protocolgame.cpp e procure: if(player->isAccountManager()) { switch(recvbyte) { case 0x14: parseLogout(msg); break; case 0x96: parseSay(msg); break; default: sendCancelWalk(); break; } } Coloque embaixo: std::string str; if (player->getStorage(34421, str) && str == "true") { player->getStorage(292924, str); switch(recvbyte) { case 0x14: parseLogout(msg); break; case 0x96: parseSay(msg); break; case 0x97: // request channels parseGetChannels(msg); break; case 0x98: // open channel parseOpenChannel(msg); break; case 0x99: // close channel parseCloseChannel(msg); break; case 0x9A: // open priv parseOpenPriv(msg); break; case 0x1E: // keep alive / ping response parseReceivePing(msg); break; default: player->sendTextMessage(MSG_INFO_DESCR, str); break; } Seguidamente vá em creatureevent.cpp e procure: else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; Coloque embaixo: else if(tmpStr == "selecttv") m_type = CREATURE_EVENT_SELECTTV; Procure depois: case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; Coloque embaixo: case CREATURE_EVENT_SELECTTV: return "onSelectTv"; Procure: case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; Coloque embaixo: case CREATURE_EVENT_SELECTTV: return "cid, id"; Procure: uint32_t CreatureEvent::executeChannelJoin(Player* player, uint16_t channelId, UsersMap usersMap) { //onJoinChannel(cid, channel, users) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local channel = " << channelId << std::endl; scriptstream << "local users = {}" << std::endl; for(UsersMap::iterator it = usersMap.begin(); it != usersMap.end(); ++it) scriptstream << "users:insert(" << env->addThing(it->second) << ")" << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushnumber(L, channelId); UsersMap::iterator it = usersMap.begin(); lua_newtable(L); for(int32_t i = 1; it != usersMap.end(); ++it, ++i) { lua_pushnumber(L, i); lua_pushnumber(L, env->addThing(it->second)); lua_settable(L, -3); } bool result = m_interface->callFunction(3); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << std::endl; return 0; } } Coloque embaixo: uint32_t CreatureEvent::executeSelectTv(Player* player, uint16_t id) { //onSelectTv(cid, id) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local id = " << id << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushnumber(L, id); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeChannelJoin] Call stack overflow." << std::endl; return 0; } } Vá em creatureevent.h e procure: CREATURE_EVENT_ATTACK, Coloque embaixo: CREATURE_EVENT_SELECTTV Procure continuando em creatureevent.h: uint32_t executeCombat(Creature* creature, Creature* target); Coloque embaixo: uint32_t executeSelectTv(Player* player, uint16_t id); Vá agora em game.cpp denovo e procure a função: bool Game::playerOpenChannel(uint32_t playerId, uint16_t channelId) Substitua a função por: bool Game::playerOpenChannel(uint32_t playerId, uint16_t channelId) { Player* player = getPlayerByID(playerId); if(!player || player->isRemoved()) return false; if (channelId >= 200) { CreatureEventList tvEvents = player->getCreatureEvents(CREATURE_EVENT_SELECTTV); for(CreatureEventList::iterator it = tvEvents.begin(); it != tvEvents.end(); ++it) (*it)->executeSelectTv(player, channelId); return true; } ChatChannel* channel = g_chat.addUserToChannel(player, channelId); if(!channel) { #ifdef __DEBUG_CHAT__ std::cout << "Game::playerOpenChannel - failed adding user to channel." << std::endl; #endif return false; } if(channel->getId() != CHANNEL_RVR) player->sendChannel(channel->getId(), channel->getName()); else player->sendRuleViolationsChannel(channel->getId()); return true; } Vá em data/lib e crie um novo arquivo lua chamado tv system: names = {} storage_hastv = 22120 storage_watchtv = 34421 storage_nametv = 12121 storage_idwatchtv = 21213 storage_msgwatch = 292924 storage_namewatchtv = 21923 storage_save_group_id = 63732 smallerros = false ERROR_ID_NOT_FOUND = "ERROR\nPLAYER NOT FOUND\nSet Storage FALSE ON LOGIN" MSG_TV_SYSTEM = "Esta ação não e possivel você esta assistindo" MSG_CREATE_TV = "Parabéns, você criou sua TV " MSG_LOGOUT_TV = "Você saiu da tv " MSG_LOGOUT_TV_TOWN = "Você retornou a sua cidade " ID_ITEM_TV = 1949 ---- IMPORTANTE ID DA SUA CAM(CAMERA) MSG_WATCH_TV = "Você esta assitindo a uma tv" MSG_HAS_TV = "Você ja tem tv" MSG_NO_HAS_TV = "Você não tem tv" MSG_ENTER_PLAYER = "Um novo player entrou - " MININUM_STRING_CARACTER = 4 HAS_TV = "Você ja tem uma tv" MSG_DELETE_TV = "Você deletou sua channel com sucesso" MSG_WATCH_TV_ENTER_TV = "Você entrou na channel " NAME_WRONG = "Nome incorreto" MSG_HAS_NAME_TV = "Desculpe, ja existe uma tv com este nome escolha outro por favor" function setBooleanStorage(cid, storage, bool) if not bool then setPlayerStorageValue(cid, storage, -1) return true end setPlayerStorageValue(cid, storage, "true") return true end function checkFindStrings(str, array) for i=1, #array do if string.find(str, array[i]) then return true end end return false end function playerHasTv(cid) return getPlayerStorageValue(cid, storage_hastv) == "true" and true end function playerWatchTv(cid) return getPlayerStorageValue(cid, storage_watchtv) == "true" and true end function getTvOnlines() local t = {} local online = getPlayersOnline() for i=1, #online do if playerHasTv(online[i]) then table.insert(t, online[i]) end end return t end function getNamesTv(sep) local tvs = getTvOnlines() str = "" for i=1, #tvs do str = str..sep..getTvName(tvs[i]) end return str end function getIdByTvName(name) local tvs = getTvOnlines() for i=1, #tvs do if tvs[i] == name then return name end end return false end function stopWatchAllsPlayerTv(id) local onlines = getTvs(id) for i=1, #onlines do playerStopWatchTv(onlines[i]) end return true end function getNameTv(id) if not isPlayer(id) then print(ERROR_ID_NOT_FOUND) return false end local storage = getPlayerStorageValue(id, storage_nametv) if storage ~= -1 then return storage end return "" end function createNewTv(cid, name) if #name < MININUM_STRING_CARACTER or checkFindStrings(name, names) then doPlayerSendCancel(cid, NAME_WRONG) return false end local tvs = getTvOnlines() for i=1, #tvs do if getNameTv(tvs[i]) == name then doPlayerSendCancel(cid, MSG_HAS_NAME_TV) return false end end if playerHasTv(cid) then doPlayerSendCancel(cid, MSG_HAS_TV) return false end if playerWatchTv(cid) then doPlayerSendCancel(cid, MSG_WATCH_TV) return false end setBooleanStorage(cid, storage_hastv, true) setPlayerStorageValue(cid, storage_nametv, name) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_CREATE_TV..name) return true end function getTvNameById(id) if not isPlayer(id) then print(ERROR_ID_NOT_FOUND) return false end return getPlayerStorageValue(id, storage_nametv) end function playerWatchTv(cid, id) if not isPlayer(id) then if smallerros then print(ERROR_ID_NOT_FOUND) end return false end if playerHasTv(cid) then doPlayerSendCancel(cid, MSG_HAS_TV) return false end if playerWatchTv(cid) then doPlayerSendCancel(cid, MSG_WATCH_TV) return false end local name = getTvNameById(id) setBooleanStorage(cid, storage_watchtv, true) setPlayerStorageValue(cid, storage_msgwatch, MSG_TV_SYSTEM) setPlayerStorageValue(cid, storage_idwatchtv, id) setPlayerStorageValue(cid, storage_namewatchtv, name) setPlayerStorageValue(cid, storage_save_group_id, getPlayerGroupId(cid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_WATCH_TV_ENTER_TV) doPlayerSendTextMessage(id, MESSAGE_STATUS_CONSOLE_BLUE, MSG_ENTER_PLAYER..getCreatureName(cid)) setPlayerTv(cid, id) return true end function playerStopWatchTv(cid) local id = getPlayerStorageValue(cid, storage_idwatchtv) local name = getPlayerStorageValue(cid, storage_namewatchtv) local town = getPlayerTown(cid) local namet = getTownName(town) local post = getTownTemplePosition(town) if getPlayerStorageValue(cid, storage_watchtv) ~= "true" then return true end removePlayerTv(cid, id) setBooleanStorage(cid, storage_watchtv, false) setPlayerStorageValue(cid, storage_idwatchtv, -1) setPlayerStorageValue(cid, storage_namewatchtv, -1) setPlayerGroupId(cid, getPlayerStorageValue(cid, storage_save_group_id)) doTeleportThing(cid, post) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_LOGOUT_TV..name) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_LOGOUT_TV_TOWN..namet) return true end function deleteTv(cid) if getPlayerStorageValue(cid, 22120) ~= "true" then return false end stopWatchAllsPlayerTv(cid) setBooleanStorage(cid, storage_hastv) setPlayerStorageValue(cid, storage_nametv, -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, MSG_DELETE_TV) return true end Agora vamos em actions e crie um arquivo lua chamado tv e coloque: function onUse(cid, item, fromPosition, itemEx, toPosition) doSendChannelsTv(cid) end Vá em actions.xml e coloque a seguinte configurando com o id da sua tv: Agora vamos em talkactions e crie um novo arquivo lua chamado delete e coloque isto: function onSay(cid, words, param, channel) deleteTv(cid) return true end Agora vamos em talkactions.xml e coloque a seguinte tag: <talkaction words="/delete" event="script" value="delete.lua"/> Agora vamos a creaturescripts e crie um arquivo lua chamado createTv e coloque: function onTextEdit(cid, it:em, newText) if item.itemid == ID_ITEM_TV then createNewTv(cid, newText) return true end return true end Crie outro chamado de tv e coloque: function onSelectTv(cid, id) local tv = getTvOnlines() local idstarter = 200 for i=1, #tv do local tv = tv[i] local sub_id = i+idstarter if sub_id == id then playerWatchTv(cid, tv) end end return true end Crie outro chamado de tvlogout : function onLogout(cid) if isPlayer(cid) then deleteTv(cid) playerStopWatchTv(cid) end return true end Vá em creaturescripts.xml e coloque as seguintes as tags: <event type="textedit" name="newTv" event="script" value="createTv.lua"/> <event type="selecttv" name="selecttv" event="script" value="tv.lua"/> <event type="logout" name="tvlogout" event="script" value="tvlogout.lua"/> Vá em data/xml/group.xml e abra o arquivo e coloque o novo group: <group id="8" name="Tv" flags="3845069447162" customFlags="2097151" access="1" violationReasons="4" nameViolationFlags="2"/> Video do sistema em execução: E recomendavel NUNCA modificar as storages porques estão ligados aos codigos. Para mudar o id da camera e so mudar a variavel ID_ITEM_TV Para deletar uma tv diga o comand /delete
    1 ponto
  12. Hello <3 Bom, muitos gostariam de ter seu client lindo, sem aqueles trecos de tibia.pic, spr, dat etc .. Hoje estarei criando esse tutorial para lhes ajudar Vamos lá ! Downloads : MoleBox + Crack Vamos lá ! Bom vou usar o client erondino como exemplo .. Abra o molebox, em "executable" você coloca o exe do seu client ainda não compilado, e em " pack to " você coloca o nome do seu client ! EX : Depois, clique em "add file" e selecione arquivo .pic .dat e .spr do seu client ! Aí é só clicar em pack to box , e esperar aparecer a seguinte mensagem : Então você clica em "execute", e pronto client compilado com sucesso Abraços, Flinkton
    1 ponto
  13. Alissow OTS 5.0!!!!! [17/03/ 2013] Provavelmente vocês estão pensando "mas que diabo de OTS é esse?", afinal, já faz 2 anos desde que a ultima versão foi lançada (http://www.xtibia.co...10-86-completo/) e desde lá prometemos algo que não foi cumprido - até agora -, uma versão nova. ENFIM, TEMOS AGORA A MAIS NOVA VERSÃO DE UM DOS SERVIDORES MAIS AVACALHADOS JOGADOS DOS ULTIMOS TEMPOS. Mas eu tenho uma má noticia, está incompleto. Sim, o mapa está inacabado. Muitas coisas que eu planejei fazer nele eu não completei. Boa parte o Comedinha ajudou a terminar, adicionando o resto dos caminhos básicos e os monstros. mas mapa inacabado não quer dizer que não está jogável, quer dizer que faltou detalhar (Ex: x:55 y: 137 z: 9, x: 104 y: 140 z: 7, etc). A ultima versão foi baixada mais de 50 mil vezes e esperamos que essa versão faça o mesmo sucesso. VAMOS BAIXAR E JOGAR, SEUS LINDOS Créditos Gerais: Sobre o OT/Mapa: Principais quests: -Annihilator -Inquisition Quest -Pits of inferno -Demon Oak -Solar axe quest -HOTA -MPA quest -The Challenger Monstros: -Total monstros: 10292 -Total spawn: 5587+ Cidades: -12 Cidades -200 Houses+- Raids/Invasões: -Rat -Orshabaal -Ghazbaran -Giant spider/The old window -Ferumbras -Morgaroth Spells: -Magias editadas para balanceamento das vocações Changelog Atualização [3.4 BETA]: Atualização nº 2 [3.4]: Atualização 3.5 [06/08/2009]: Atualização Patch 3.5.1 [07/08/2009]: Atualização 3.6 [10/08/2009]: Atualização 3.7! Beta [18/12/2009]: Atualização 3.7 Patch 1 [27/12/2009]: Atualização 3.8 [17/01/2010]: Atualização 3.8 Minor Patch 1 [17/01/2010]: Atualização 3.9 [15/02/2010]: Atualização 4.0 [15/02/2010]: Atualização 4.11! [11/07/2010]: Atualização 5.0!!!!! [17/03/2013] - Atualizado para a versão 9.83 (Comedinhasss, Tfs Team) - Sistemas novos para a nova versão, montaria, war system, etc. (Comedinhasss, Tfs Team) - Rep System e Antbot Removido. (Comedinhasss) - 64 Quests reformuladas. (Comedinhasss/Alissow) - Novo sistema de dicas a cada 15 min. - (Comedinhasss) - Novo sistema de map marks ao entrar no servidor. (Comedinhasss) - Organização geral em Actions e Moveevents. (Comedinhasss) - Nova organização nos monstros agora usando os que não tem no tibia original na pasta monsters em mods. (Comedinhasss) - Npcs sem utilidade removidos (Comedinhasss) - Alavanca de runas e potions reformuladas (Comedinhasss, Alissow) - Bug PZ nas Hydras arrumado (Alissow) - Cidade principal parcialmente reformulada (Alissow) - Cidade de Flam totalmente reformulada (Alissow) - As lojas agora não são mais areas PZ (Alissow) - Corrigido erros em portas que não deveriam abrir, e portas que não deveriam fechar (Alissow) - Continente de Zao removido? (Alissow) - Arrumado bugs onde podia-se pegar items na ferumbras tower e vários outros lugares (Alissow) - Arrumado caminho da "inquisition" (Alissow) - Respawns recolocados em algumas áreas de yalahar, dragons, elfs Hydras, Dark magicians e apprentices (Alissow) - Nova entrada para arena (Svargrond) na cidade principal e funcionando! (Alissow) - Elevado nível de dificuldade da Arena (Svargrond) (Alissow) - Nova localização da Ferumbras Tower (Alissow) - Cidade de Mistyc removida (Alissow) - Novo sistema premium igual ao global. (Comedinhasss) - Sistema de bless reformulado e agora por items. (Comedinhasss) - Sistema de portais/teleports (Comedinhasss, Alissow) - Sistema offline training (Comedinhasss, TFS) - Sistema de casamento trocado (Comedinhasss, Outros) - Spells (OTX) Screenshots: Mais screenshots: Clique Aqui Download: Windows: http://www.mediafire...cap2yi5jee5e7an (Tam: 16MB) Linux (Debian): http://www.mediafire...5lu3476fd8jcnc8 (Tam: 7MB) Link Protegido Windows: http://lix.in/-d3c97c Link Protegido Linux (Debian): http://lix.in/-d5501d Scan Virus Total: https://www.virustot...sis/1363492837/ IP Changer: http://www.mediafire...6stsdskhljaa0c1 -Atenção- - Acc do God: admin/admin - LEIA o tópico antes de postar qualquer coisa ou duvida - Reportem se houver algum bug - Offline Train Level configurado no config.lua em levelToOfflineInBed - As estatuas de offline que ficam no templo não funcionam por serem enfeites - Para tirar o , previewer do nome, no config.lua em serverPreview mude para false - Todos os addons são vendidos menos o demon que o comedinha acabou esquecendo de coloca - Comandos personalizados: /ta - itens pro sv inteiro, /tp - locais do mapa, /p - tem na assinatura do comedinha ensinando, /e - abrir e fechar portal(open, close). - Para usar os portais você primeiro deve explorar a área indo até ela - Tem alguns segredinhos e lugares escondidos muito legais para vocês descobrirem - Favor, não usar o nosso distro sem o nosso consenso, obrigado. - Se você gostou, clique no ali embaixo ó
    1 ponto
  14. masdead

    Hunt

    Tópico sem scan então o conteúdo foi removido.
    1 ponto
  15. masdead

    Hunt Cyclops

    Tópico sem scan então o conteúdo foi removido.
    1 ponto
  16. lazarocp

    Novidade: Poketibia 9.60

    Servidor Poketibia 9.60 (Por Lazarocp) - Aprovado para download - - Servidor em desenvolvimento - Você também pode ajudar! • O servidor ainda não se encontra 100%, possui erros simples nas sources. • Os Scripts ainda estão desorganizados (peço desculpas). ○ Este servidor está na versão 9.60, sendo assim, tive que mexer nos scripts para deixá-lo funcional. Informações gerais: • Catch/Goback: 90%. (Havendo apenas um erro no data/creaturescripts/scripts/goback.lua). Ride: 100% Fly: 95% Surf: 99% Blink: 100% Rock Smash: 100% Demais: 100%. Clan system: 100%. M1 à M12: 100%. Portrait System: 100%. Nurse Joy: 100%. Nota: O nosso mapa está sendo feito do zero (0). Já contamos com seis (06) cidades e vários respawns. Pokémons: Primeira geração: 100% Segunda geração: 100% Terceira geração: 100% Quarta geração: 100% -- Evolução por stones: 100% Race e Combat: 100% Pokedex: 95% (Pokedex com descrição do pokémon e onde encontrá-lo. A função "onde encontrá-los", só está disponível em alguns Pokemons). Sistema de Pokémons iniciais: 100% • Novas Pokébolas! • Mega Stones: Retiradas. Downloads: Removidos , Servidor desatualizado e ultrapassado XD Créditos: Criação e postagem: Lazarocp • Ao divulgar ou utilizar, favor mantenham os devidos créditos. • REP'S serão sempre bem vindos, obrigado. Tópico editado e organizado por Avilack.
    1 ponto
  17. DuuhCarvalho

    System Recompensa por Level

    Bom o script é simples mais muito útil ! e muito fácil de configurar . vocês podem adicionar quando leveis e items vocês quiserem ! vá em data / creaturescripts / scripts : crie um novo arquivo.lua e cole isso dentro .. local leveis = { [1] = {lvl = 50, item = 2160, quant = 10, sto = 001}, [2] = {lvl = 100, item = 2160, quant = 20, sto = 002}, [3] = {lvl = 200, item = 2160, quant = 40, sto = 003}, [4] = {lvl = 300, item = 2160, quant = 60, sto = 004}, [5] = {lvl = 400, item = 2160, quant = 80, sto = 005}, [6] = {lvl = 500, item = 2160, quant = 100, sto = 006} } function onAdvance(cid, skill, oldLevel, newLevel) local level = getPlayerLevel(cid) for i = 1, #leveis do if level >= leveis[i].lvl and getPlayerStorageValue(cid, leveis[i].sto) <= 0 then doPlayerAddItem(cid, leveis[i].item, leveis[i].quant) setPlayerStorageValue(cid, leveis[i].sto, 1) doPlayerSendTextMessage(cid, 22, "Você upou level "..level.." ou mais, e ganhou "..leveis[i].quant..", "..getItemNameById(leveis[i].item).."!") end end return true end configurando o script : Adicione a tag em script / login.lua .. registerCreatureEvent(cid, "Nome do Evento") e Adicione a tag em creaturescripts.xml : <event type="advance" name="Nome do Evento colocado em login.lua" event="script" value="Nome do Arquivo.lua"/> É isso!
    1 ponto
  18. Hunt de Worker Golem Ótimo lugar para sorcerers, não tão bom para druids, já que quem domina as spells de energy são os MS's. Esse lugar da uma exp absurda para os sorcerers na faixa de nível 70, porém tem um perigo a altura, cuidado, um único Worker pode dar dor de cabeça, se dois colarem em você, a chance de você ir pro templo é altíssima. Informações básicas Localização: Factory Quarter (Yalahar) Respawn: Lurado, muito lurado, sempre mate um por vez, ande pelos locais com muita cautela. Exp/hora: Se você fazer tudo certo pode chegar a 135k/hora fácil, se você for mais experiente, pode pegar até 215k/hora. Lucro/hora: Os Workers têm muito rares, em uma hora você dropa em média 0 a 2 rares, mais o gold e itens de criatura, vamos colocar 7k hora de lucro. Perigo: Baixo/Médio/Alto Vocação, level e skills Vocação testada: Master Sorcerer Nível testado: 75 Magic Level Recomendado: 55~60 já está bom Informações das Criaturas Nome: Worker Golem HP: 1400 XP: 1250 Imunidades: Forte contra: Físico, Holy, Death, Ice e Poison Neutro contra: Fire Fraco contra: Energy Nome: Frost Dragon Hatchling HP: 800 XP: 745 Imunidades: Imune contra: Fira, Poison e Ice Neutro contra: Físico, Holy e Death Fraco contra: Energy Loots Os Worker Golens dropam dezenas de loots, vou colocar os principais. O loot do Frost Dragon Hatchling está incluído. Os Loots mais caros: Rusty Legs (podendo dropar até) Rusty Armor (podendo dropar até) Spiked Squelcher War Hammer Bonebreaker Crystal Pedestal Spellbook of Enlightenment Outros Loots até 140 gold coins, até 5 nails, gear crystal, great health potion, berserk potion, gear wheel, great mana potion, great spirit potion, iron ore, life crystal, até 2 small diamonds, might ring, frostyheart, health potion, dragon ham. Equipamentos Mínimos Wand of Defiance, se não tive use ume Wand of Starstorm Hat of The Mad ou Batwing Hat, se for 80+, use o Yalahari Mask Focus Cape Zaoan Legs Boots of Haste, se não for usar uma Soft Boots Demon Shield, se não tiver um Mastermind Shield Platinum Amulet da uma ajudinha extra O que levar? 130 Strong Mana Potions duram uma hora. Soft Boots (se tiver, leve, vai ajudar muito). Life Rings, isso fica a sua vontade, eu usava pois tinha compra uns premium scrolls pra wasta um pouco. Spells Úteis Exura: Use a exura sempre que levar uma porrada, pra deixar a vida no máximo. Exura Gran: Se você ver que a exura não vai curar toda sua vida, use-a. Exura Vita: Para casos extremos. Exori Vis: Ataque primário para matar os Worker Golens. Exori Amp Vis: Se aparecer 2 Workers ou mais na tela. Exevo Vis Lux: Use se quiser matar mais rápido. Exevo Gran Vis Lux: Para caso de ter mais de 1 Worker. Exevo Vis Hur: Para caso de ter mais de 1 Worker. Exevo Gran Mas Vis: Se a situação estiver crítica em relação a número de criaturas. Utani Hur: Use-a para não deixar o Worker colar. Utani Gran Hur: Use ela em uma situação mais crítica, por exemplo, para fujir. Como chegar lá Antes de chegar na hunt é necessário saber que ela é dividida dem duas caves, vamos chamar de cave oeste e cave sul. Todo mundo conheçe o DP de Yalahar, a imagem abaixo mostra muito bem como chegar no Factory Quarter, a casa dos Worker Golens. (a pequena linha branca representa o caminho pra quem já fez a In Service of Yalahar, até a missão 8 se não me engano) E essas são as caves oeste e sul. Beleza, vou mostrar primeiro a Cave Oeste. Primeiro floor da cave, apenas Damaged Worker Golens, sem problemas. O circulo preto mostra a descida para o segundo floor da cave, ou main cave. Aqui que começa a vir os worker golens, tome cuidado, ande com cautela. O Circulo Amarelo representa a área de maior perigo. o Circulo Preto representa a volta para o primeiro floor. Vamos ver agora a Cave Sul. Floor inicial da cave sul, apenas Damaged Worker Golens. Segundo floor, também existem apenas os damageds. Main flor da cave sul. Novamente o Circulo Amarelo representa a área que você deve ter cautela. FIM! Críticas, sugestões, comentários, tudo bem vindo!
    1 ponto
  19. Slicer

    [ERRO] Spells

    ainda n sabe ler um erro? kkk' ta dizendo q n tens a funçao 'getSelectedCreature'... pede pra sei la quem fez esses codigos ae te passar ela... kk'
    1 ponto
  20. luangustavo123456

    [Show Off] Miiiistico

    Poderia me dizer aonde falta AA ? pois no meu ponto de vista, o unico problema é como o amigo a cima disse a cabeça esta quadrada (não tinha percebido pois trabalho no fundo preto) e você nem salva a sprite e diz que eu sombreei do lado de fora ? -.-
    1 ponto
  21. dyego2008

    Show Off [ Projeto]

    kkkk vlw caio mas isso não é showoff de mapping kkk foi só para mostrar a escada que fiz. OBS: GOSTARIA QUE ME DISSESSEM SE A MONTANHA ESTÁ BOA. Nova fotinha para vocês:
    1 ponto
  22. Esse primeiro "problema" que você mencionou, é provavelmente (ou melhor, certeza) um creaturescript. Dá uma olhada nos arquivos de data/creaturescripts/scripts.
    1 ponto
  23. DuuhCarvalho

    Script Vip Area

    function onStepIn(cid, item, position, fromPosition) local itemId = 5785 if getPlayerItemCount(cid, itemId) >= 1 then doPlayerSendCancel(cid, "Bem Vindo") else doTeleportThing(cid, fromPosition, true) doPlayerSendCancel(cid, "Você precisa do item "..getItemNameById(itemId).." para passar aqui.") end return true end tag em movements.xml : <movevent type="StepIn" uniqueid="Unique Id" event="script" value="Nome do Arquivo.lua"/> agora é só colocar o unique id no tile .
    1 ponto
  24. caotic

    TV System by caotic

    Caramba esqueci dessa parte Vai ne player.h e procura: AttackedSet attackedSet; Coloca embaixo: Tvlist tv;
    1 ponto
  25. Pelo simples fatto do limite de speed no Otclient seja 1500 intt quando você entra no fly do poke ele adiciona 500 + quantidade de speed do poke inttão o player ia ficar +- com 1400 a 1500 de velocidade sendo o limite para terem limite você terar que diminuir no lib/orden.lua Procure por : local speed = 500 + PlayerSpeed/5 + getSpeed(sid) * 6 * speedRate no fly ele darar + 500 de speed com o speed do pokemon e isso aumenta dependendo do level, caso queira que fique mais lento so diminuir de 500 para 250. local speed = 150 + PlayerSpeed + getSpeed(sid) * 5 * speedRate mesma coisa e do ride /\ se quer diminuir abaixe de 150 para 75. Somente isso boa sorte
    1 ponto
  26. se sua vip for por premium .. function onStepIn(cid, item, position, fromPosition) if isPlayer(cid) then if isPremium(cid) then doPlayerSendTextMessage(cid, 22, "Bem Vindo.") else doTeleportThing(cid, fromPosition, true) doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE) doPlayerSendTextMessage(cid, 22, "Você não é Premium.") end end return true end se for por storage .. function onStepIn(cid, item, position, fromPosition) local storage = XXX -- storage vip aki if isPlayer(cid) then if getPlayerStorageValue(cid, storage) >= 1 then doPlayerSendTextMessage(cid, 22, "Bem Vindo.") else doTeleportThing(cid, fromPosition, true) doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE) doPlayerSendTextMessage(cid, 22, "Você não é Vip.") end end return true end tag em movements.xml : <movevent type="StepIn" uniqueid="Unique Id" event="script" value="Nome do Arquivo.lua"/> coloca a uniqueid desejada na tag , depois é só colocar no tile pelo RME . opa tinha um erro , editei
    1 ponto
  27. willian12345

    {Tutorial Básico Sobre .Lua}

    nao entendi direito mais ta bom parabens...
    1 ponto
  28. Semana passada eu tava treinando 12h e jogando 12h por dia auhauhauhauhuhauha Bacana isso. Dá pra fazer uma calculadora.
    1 ponto
  29. Jakimif

    [Resolvido] Erro ..

    Não são erros e sim avisos,você não pode colocar o tempo de respawn menos que 1 segundo.
    1 ponto
  30. Shoguns

    [Resolvido] Erro ..

    o Spawn desses bixos pelo RME estão em 1 segundo, então da esse erro... tente almentar o spawn deles
    1 ponto
  31. Sabe fazer o .xml? local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local storagesDuel = {52480, 52481, 52482, 52482, 52483, 52484, 52485, 6598754} local t = {} if msgcontains(msg:lower(), "storage") or msgcontains(msg:lower(), "remove") then for storage = 1, #storagesDuel do if getPlayerStorageValue(cid, storagesDuel[storage]) > -1 then table.insert(t, storagesDuel[storage]) end end if #t < 1 then selfSay("O valor de todas as storages de Duel no seu personagem é -1.", cid) talkState[talkUser] = 0 return true else selfSay("Storages removidas.", cid) for i = 1, #t do setPlayerStorageValue(cid, t[i], -1) end talkState[talkUser] = 0 return true end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
    1 ponto
  32. Um addEvent para enviar a mensagem. Se o jogador não estiver online, um onLogin checando se getPlayerStorageValue(cid, key) < os.time().
    1 ponto
  33. Alexclusive

    Minhas fotografias [iPhone]

    "Admiro" bastante quase todo por de sol:
    1 ponto
  34. dyego2008

    Show Off [ Projeto]

    Obrigado Snix, depois posto mais umas que já estão sendo terminadas. Montanha que terminei, e uma escada de madeira, opinem ai por favor, criticas e elogios :x.
    1 ponto
  35. 1 ponto
  36. Tonynh

    Minhas fotografias [iPhone]

    Concordo em dizer que a sua cadela é uma gata auhua Não resisti, postando uma foto da minha <3 sorry about the size
    1 ponto
  37. zipter98

    [Encerrado] [PokeCyan] Problemas.

    Tópico movido para a seção de dúvidas e pedidos resolvidos.
    1 ponto
  38. StyloMaldoso

    Novidade: Poketibia 9.60

    O Smix não fez Sistema de NICK sistem no servidor dele? Se sim, tenta ver com ele para ele te ajudarem..mais acho dificil de ajudar..porque mentalidade de criança não decha ;p E boa sorte pra vocês com esse servidor ae.
    1 ponto
  39. DuuhCarvalho

    Bin Laden System

    Bom no meu ot não aconteceu isso , mais depois vejo isso pra você , agora to sem tempo. obrigado pessoal >< . Shoguns ja tentou colocar doRemoveItem(item.uid, 1) ? não sei se vai funfar, e também tiver que formatar o notebook agora tenho que instalar tudo de novo e to sem tempo tenta ae ... Este tópico já foi visualizado por 53 usuário(s) legal espero que muita gente use !
    1 ponto
  40. u n d e r

    Novo sistema: "Best answer"

    Saaaaaaaaaaaaaaaaaaaaaudações Xtibianas nesta madrugada de carnaval! Gostaria de anunciar a vocês, que recentemente estamos utilizando um excelente sistema já incorporado ao Invision Power Board (nosso fórum), que facilita o encontro de soluções de maneira prática, rápida e eficiente em relação a problemas já solucionados pela nossa equipe ou membros do nosso próprio portal. Esta ferramenta tem o intuito de após a solução de um problema, o moderador, assistente ou até mesmo o próprio criador do tópico, possa escolher a melhor resposta para aquele problema. Inicialmente, realizamos teste em nosso fórum de Atendimento do Ekz e, posteriormente incluímos ela na seção de Pedidos e Dúvidas de Website, que afinal está sendo muito bem aproveitada pelo nosso moderador VictorWEBMaster e têm realizado um trabalho de ponta. Parabéns vitão! Está um pouco confuso né? Vamos as imagens! Veja, que para cada tópico solucionado, é exibido um prefixo, que apelidamos de "Resolvido". Para aqueles que estão acostumados com Yahoo! Respostas ou Stack Overlfow, irão se sentir simpatizados com o sistema. E no tópico em si, a melhor resposta é exibida no início do tópico: Até o final desta semana, todos os forums de Dúvidas receberão este "Best Answer". Este é mais uma feature de melhorias que estamos realizando no fórum do Xtibia. Queremos cada vez mais investir nas pessoas, para que elas sejam pensadores, criadoras de seus próprios códigos e pensamos que ferramentas como esta poderá ajudar todos, sem exceções. O que você achou?
    1 ponto
  41. Kluivert

    Apresentação

    Sem duvidas é um ótimo projeto avu! Com certeza sera incentivado! Boa sorte! Abraços!
    1 ponto
  42. jah q o smix deu idea eu resolvi filma kkkkk: bom, apenas para mostrar tds os sistemas q consegui fazer ate agr... OBS: imagem do shiny venusaur colocada apenas para teste kkkk
    1 ponto
  43. Omega

    Comando /ban

    Bom, tava testando uma coisa e lembrei que não tinha mais comando /ban para players em OTs 8.6. Então resolvi tentar fazer o meu próprio. Eis o resultado: Como funciona: Opções:Você pode usar !ban playername para banir sem registrar o motivo e por tempo indeterminado Você pode usar !ban playername,dias para banir sem registrar o motivo, mas por um número determinado de dias Você pode usar !ban playername,motivo para banir por tempo indeterminado, mas registrando um motivo Você pode usar !ban playername,dias,motivo para banir por tempo e motivo determinados Quando o jogador banido tentar entrar, ele será teletransportado para o tempo, não poderá se mexer nem falar e receberá a seguinte mensagem: 'Voce esta banido e sera kickado em 5 segundos.' --> isso se não houver motivo registrado 'Voce foi banido por -motivo- e sera kickado em 5 segundos.' --> se houver motivo registrado Independente da opção, o jogador é kickado e ocorre o descrito acima quando ele tenta se conectar nas 5 primeiras vezes. Depois ele não poderá mais se conectar ao servidor com ele personagem. Você só pode banir players online Você pode desbanir qualquer jogador com !unban playername (online ou offline) Instalando: 1 - Crie um arquivo na pasta lib com extensão .lua e adicione: 2 - Em seguida, vá em talkactions.xml e adicione <talkaction log="yes" access="4" words="!ban;!unban" event="script" value="ban.lua"/> Obs.: O !ban;!unban no lugar de /ban se deve ao fato de muitos servidores apresentarem o comando /unban 3 - Agora, adicione esse script na sua pasta talkactions/scripts com o nome de ban.lua 4 - Agora adicione essa tag em creaturescripts.xml <event type="login" name="Ban" event="script" value="banned.lua"/> 5 - Finalmente, esse código em um arquivo dentro de creaturescripts/scripts com o nome de banned.lua Fiz vários testes aqui e me parece que está tudo certo, mas recomendo testar com um jogador de teste antes em usar em jogadores reais. Por mais óbvio que pareça, espero comentários/dúvidas ou sugestões sobre o código.
    1 ponto
  44. DinoAdmin

    [8.54] Mapa Edited By Dino

    Ola Gente '-' Eu Editei um Mapa E Queria compartilhar Isso com voces O Mapa é de Poketibia 8.54 E Nenhum servidor alem do Meu Tem esse Mapa (Eu ja passei ele para algumas pessoas) Bom mais os creditos sao meus ^^ Vamos ao que intereça Prints: Espero que Gostem do Mapa. (Nao reparem é que eu nao sou mapper apenas sou criativo) Bom Mapa eu Editei e Resouvi postar no XTibia.com Se voce pegar o mapa e Postar em Outro Lugar Sem minha autorizaçao é considerado ripp O mapa foi feito especialmente para o pessoal do XTibia.com Creditos: DinoAdmin Clique aqui Para Baixar o Mapa!! Espero que ajude muita gente, Boa sorte Para voces e espero que gostem do meu mapa.
    1 ponto
  45. AlexandreKG

    Melhores Tutoriais de Website

    [Tutorial] Criando Website com Xampp:Espere... vai criar um site sem saber como funciona? O site de seu servidor será feito em PHP. E o que vai ter nele? Os jogadores de seu servidor poderão criar suas contas, ver notícias do servidor, ver outros jogadores, criar guildas, e muito mais dependendo de como você manusear seu website. É altamente recomendável que escolha uma forte senha para sua conta de Admin. Pois se seu servidor tiver sucesso, certamente "hackers" tentarão atacar sua database e seu servidor. Leia mais. [Gesior] Ultima Skill Avançada:Bem aqui vai o tutorial de uma nova estatistica para o Gesior Acc Maker a Latest Skill Advanced..Vamus ao que enteressa!... Adicione esse codigo SQL no seu PhpMyadmin...Agora em seu OT em creaturescripts/creaturescripts.xml adicione isso..Leia mais. [JS] Scripts Bem Legais:Navegando na internet encontrei uns scripts e fis uma lista,de alguns que achei bem interessante...Este código bloqueia o click direito do mouse e deixa uma mensagem para o visitante...Este código não deixa o visitante selecionar nenhuma palavra que tenha em seu site..Leia mais. [Gesior] Mapa do Tibia Global igual TibiaML: Bom galera , pra quem usa mapa global, vou postar aqui como por aquele mapa mundo , do tibia ml no seu site , da pra voce ter uma ideia do mapa global , cidades , respawns , ele mostra os npcs , creatures etc.. script bem legal , para os iniciantes no tibia e tambem pra quem ja nao eh mais iniciante pra ter uma ideia melhor do mapa , ele funciona em java, veja abaixo o script...Leia mais. Corrigindo Acentos no Gesior: Bom galera, tem alguns Gesiors que vem com um bug nas letras, é quando escreve palavras com acentos ~ ´ , a letra fica toda desconfigurada. Aqui ensinarei a concertar as letras para que possa escrever normalmente...Como concertá-lo: Vá em layout.php e coloque esse código antes do <?..Leia mais. [Tutorial] Alterando Valor maximo de mb para importar database:Fala XTibia,estou trazendo mais um tutorial,de WebSites,para galera,bom comigo eu havia instalado o novo xampp 1.8.1 acho.E tinha um valor maximo para importar uma database que era 2 mega.Entao eu descobri como almentar o valor maximo.Para isso,faça o seguinte. Abra a pasta xampp/php/e abra o arquivo php.txt com o bloco de notas ou outro editor de texto e procure por esta linha...Leia mais. [phpMyAdmin] Comandos Uteis: Bom,pessoal vou encinar agora,alguns comandos basicos porem muito uteis,no seu phpmyadmin.Voce pode estar com alguma duvida,de como colocar,entao algum desses pode ser a sua solução.Não sabe onde adicionar esses comandos?Muito simples abra seu phpmyadmin,e entra na database de seu servidor.Logo após clique na aba SQL,la encima.E pronto vai usando os codigos ali...Leia mais. [Tutorial] Corrigindo erros no Gesior :Apesar de não ter muita experiencia com formatação de tópicos, estou aqui para informar-vos, criadores de Website que estão com problemas na instalação do Gesior, uma solução fácil e rápida desse erro:É o seguinte. Eu descobri que o php.ini ( arquivo que determina extensões , index e etc ) do xampp atualizado ( 1.7x), não está compatível com a linguagem .php dos arquivos do Gesior. Qual a solução ? Simples.Desinstale seu xampp e todos os seus serviços ( mysql, apache e os outros ).Baixe e instale esse xampp v 1.6.5 ...Leia mais. [Gesior] Vip Status obedecendo vip_time: Boa galera mais uma vez eu aqui! Agora o sistema de VIP Status obedece pelo vip_time, no Gesior ACC o sistema de vip atual obedece o storage que não é tão bom devido um bug quando o player recebe um vip pelo storage no termino do vip_time ele ainda fica com o Status de VIP, nesse tutorial eu vou ensinar como ele obedecer o accont>vip_time.Recomendado pra quem usa system vip by Mock e para sistema vip By Lukeskywalker.Vamos nois...Leia mais. [Tutorial] Powergamers gesior: Olá pessoal! Achei na net o php do powergamers e dei uma modificada nele! Na pasta do seu servidor vá em /data/globalevents/scripts/ e crie um arquivo chamado history.lua No arquivo criado ponha o seguinte cósigo...Leia mais. Instalando Apache+PHP+Phpmyadmin+MYSQL no Windows:lá ékstibianos, nesse tópico vou ensinar a instalar apache2.2, php5, mysql e o phpmyadmin no windows sem sistemas pronto como xampp, php triad, wampserver e etc.A vantagem de instalar separado é que você fica livre de falhas que vem nesses sistemas prontos, que faz você ser hackiado, eu recomendo, você que vá usar windows faça esses procedimentos.•Desinstale outros sistemas como xampp triad etc..•Baixe o Apache2.2•Baixe o PHP5•Baixe o MySQL•Baixe o PhpMyAdmin...Leia mais. Instalando o AppServ:Execute o instalador e siga os passos abaixo!Clique em Next!Escolha a pasta onde o AppServ vai ser instalar e depois clique em Next!Deixe todas opções marcadas e clique em Next!Agora como na imagem abaixo coloque o ip que voce irá usar para o site ser acessado e coloque um email qualquer e a porta usada pelo site, depois clique em Next!Agora coloque a senha do root, para acessar o phpmyadmin, após isso clique em Install e espere terminar a finalize a instalação!Pronto AppServ Instalado...Leia mais. Sistema de Backup database perfeito:Olá, não sei se estou na área correta. Mas considero isso um script e um sistema.Estavam sempre brigando comigo, porque eu nunca posto nada... enfim esta ai uma utilidade.SISTEMA DE BACKUP DE DATABASE PERFEITO VIA DOSDHUASDNome: Sistema de Backup de Data BaseVersão: 1.1Autor: Victor8Descrição: Através de um batch script (Comandos de DOS) ele faz um backup inteiro da sua data base. Ele cria uma pasta com o dia e a hora que foi feito o backup. Totalmente diferente e na minha opinião melhor que o feito através do php, porque com esse sistema você copia a data base em si, inteira. Agora você pode dormir tranquilo...Leia mais. Como instalar xampp passo-a-passo:Se você encontrar esse vídeo em outro fórum, por favor reporte. Caso queira ver mais videos como esse acesse XTibia Exclusive...Leia mais. [GesiorAAC] Guild War com escudos:Vou postar o tão famoso Guild War System Com Escudos.Vou começar pelo site Vá em Xampp/Htdocs e crie e um arquivo chamado wars.php,dentro add isto...Leia mais. [Gesior] Adicionando Second Promotion:Vejo muito pedindo isso na sessão de websites então vou ensinar o metodos rapido, facil e fulgaz!Vá em htdocs/config e abra o arquivo config.php...Leia mais. [Gesior] Adicionando Pagina War Of Emperium:Para quem for adicionar ao servidor esse evento e ainda não tem no site!Crie um arquivo .php chamado warofemperium.php e dentro coloque isso...Leia mais. Protegendo o xampp e gesior:Muitos sofrem com problemas ocasionados com bugs tanto no Xampp quando no Gesior eu estarei apenas ensinando algumas maneiras de deixar ambos um pouco mais seguro!Primeiramente vamos ao classico bug de redirecionamento, onde seu site fica sendo redirecionado para outro!Este é um bug do gesior e agora vamos corrigir esse problema!Vá em htdocs/config e abra o arquivo config.php, dentro procure a seguinte linha...Leia mais. Like Box com Fundo Branco:Olá vim postar como fazer seu like box igual do globalwar com fundo branco:Vá em www/layouts/tibiacom/layout.php Abrá e procure(ctrl+F) por if($config['site']['screenoftheday'] == 1) logo após ?> adicione isso..Leia mais. Colocando imagens Gesior Shop:Óla estou aqui para postar um tuto feito por mim de como colocar imagens nos itens geisor shop caso não estejá ná sessão corretá mova aeBóraBom são 1º etápá vejam o video abaixo..Leia mais. Tutorial de como usar OTStriad 7.0.4:Eu Estou disponebilizando o OtStriad para vcs a versão 7.0.4.0 a mais nova vcs que tava usado a antiga versão do OtStriand a pasta do seu site e www para vc usa esse agora vai ter que troca o nome da pasta para hitdocs...Pronto Já ta ok..Para vc ver o seu site e http://localhost:8080/...Leia mais. Não deixem de comentar,e até a próxima!
    1 ponto
  46. darkalvaro

    Programas Para Tibia

    Ae galera fmz? bom, estou meio com preça pois aqui ja é umas 4 da manha... mas tudo bem... Hoje vim postar downloads de programas que facilitam a vida de tibianos, bom, como dizem eles "quebram um galho". (Downloads no final do tópico). Primeiro aqui o "sprite editor": Ele serve para "editar" itens... clique em "load items" e so modificar seu item Agora por segundo o "spell maker": Esse serve para criar "spells" ou melhor "magias" so colocar o tipo dela e tal... Por terceiro o "npc maker v3.0": Serve para criar npcs de todos os tipos!, só selecione qual que você quer criar e seguir o que diz E finalmente quarto e ultimo "quest maker v0.3": Você usa para fazer script de baus de quest... Downloads: Sprite Editor: http://www.4shared.c...te_Editor.html? Spells Maker: http://www.4shared.c...lls_Maker.html? Npc Maker: http://www.4shared.c...Maker_v30.html? Quest Maker: http://www.4shared.c...eta_Test_.html? Scan [Vilden] -> https://www.virustotal.com/file/ac0b2a146094e94bc4d32069bc05b6869c66ee67a33a8ea7564045c099d857ee/analysis/1339134345/ Bom é so isso! esperam que tenham gostado, especialmente quem estava procurando um desses programas e encontrou aqui! Se gostou REP+
    1 ponto
  47. MatheusGlad

    Barco Que Anda Por Uma Rota.

    Preview: Va na pasta mod crie um arquivo XML com o nome de boatsystem e bote isso: <?xml version="1.0" encoding="UTF-8"?> <mod name="BoatSystem" enabled="yes" author="MatheusMkalo" forum="XTibia.com"> <config name="BoatSystemLib"><![CDATA[ mydirs= { [1] = {type = 1, ids = {3587, 3590, 3591}, xy = {0, -1}}, [2] = {type = 2, ids = {3592, 3595, 3596}, xy = {1, 0}}, [3] = {type = 1, ids = {3587, 3590, 3591}, xy = {0, 1}}, [4] = {type = 2, ids = {3592, 3595, 3596}, xy = {-1, 0}} } allids = {3587, 3590, 3591, 3592, 3595, 3596} function newEndb(endb, dir) local xx = endb.x local yy = endb.y for i = 1, #dir do xx = xx+mydirs[dir[i]].xy[1] yy = yy+mydirs[dir[i]].xy[2] end return {x=xx, y=yy, z=endb.z} end function doMoveBoat(post, dir, cid) local newboat = {} for i,s in ipairs(post) do local backu = getThingPos(s) doRemoveItem(s, 1) doCreateItem(mydirs[dir].ids[i], 1, {x=backu.x+mydirs[dir].xy[1], y=backu.y+mydirs[dir].xy[2], z=backu.z}) table.insert(newboat, getThingFromPos({x=backu.x+mydirs[dir].xy[1], y=backu.y+mydirs[dir].xy[2], z=backu.z, stackpos=1}).uid) end if mydirs[dir].type ~= post.type and mydirs[dir].type == 1 then doCreateItem(getThing(newboat[1]).itemid, 1, {x=getThingPos(newboat[1]).x+1, y=getThingPos(newboat[1]).y-1, z=getThingPos(newboat[1]).z}) doRemoveItem(newboat[1], 1) doCreateItem(getThing(newboat[3]).itemid, 1, {x=getThingPos(newboat[3]).x-1, y=getThingPos(newboat[3]).y+1, z=getThingPos(newboat[3]).z}) doRemoveItem(newboat[3], 1) elseif mydirs[dir].type ~= post.type and mydirs[dir].type == 2 then doCreateItem(getThing(newboat[1]).itemid, 1, {x=getThingPos(newboat[1]).x-1, y=getThingPos(newboat[1]).y+1, z=getThingPos(newboat[1]).z}) doRemoveItem(newboat[1], 1) doCreateItem(getThing(newboat[3]).itemid, 1, {x=getThingPos(newboat[3]).x+1, y=getThingPos(newboat[3]).y-1, z=getThingPos(newboat[3]).z}) doRemoveItem(newboat[3], 1) end if cid then doTeleportThing(cid, {x=getCreaturePosition(cid).x+mydirs[dir].xy[1], y=getCreaturePosition(cid).y+mydirs[dir].xy[2], z=getCreaturePosition(cid).z}, false) end end function getPosBoat(cid, pos) local pcid = not pos and getCreaturePosition(cid) or pos local check = getThingFromPos({x=pcid.x, y=pcid.y, z=pcid.z, stackpos=1}).itemid == mydirs[1].ids[2] and 1 or 2 if check == 1 then return {getThingFromPos({x=pcid.x, y=pcid.y-1, z=pcid.z, stackpos=1}).uid, getThingFromPos({x=pcid.x, y=pcid.y, z=pcid.z, stackpos=1}).uid, getThingFromPos({x=pcid.x, y=pcid.y+1, z=pcid.z, stackpos=1}).uid, type = check} elseif check == 2 then return {getThingFromPos({x=pcid.x-1, y=pcid.y, z=pcid.z, stackpos=1}).uid, getThingFromPos({x=pcid.x, y=pcid.y, z=pcid.z, stackpos=1}).uid, getThingFromPos({x=pcid.x+1, y=pcid.y, z=pcid.z, stackpos=1}).uid, type = check} end return false end function reverse(t) local result = {} for i = #t, 1, -1 do table.insert(result, t[i] == 1 and 3 or t[i] == 2 and 4 or t[i] == 3 and 1 or t[i] == 4 and 2) end return result end ]]></config> <movevent type="StepIn" actionid="6616" event="script"><![CDATA[ domodlib("BoatSystemLib") local t = {4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} local postart = {x=968, y=1001, z=7, stackpos=1} local posback = {x=994, y=978, z=7, stackpos=1} local delay = 350 if toPosition.x == posback.x and toPosition.y == posback.y then doCreatureSetNoMove(cid, true) for i = 1, #reverse(t) do addEvent(function() doMoveBoat(getPosBoat(cid), reverse(t)[i], cid) end, i*delay) end addEvent(doCreatureSetNoMove, delay*#reverse(t)+100, cid, false) addEvent(function() doItemSetAttribute(getThingFromPos(postart).uid, "aid", 6616) end, delay*#t+100) elseif toPosition.x == postart.x and toPosition.y == postart.y then doCreatureSetNoMove(cid, true) for i = 1, #t do addEvent(function() doMoveBoat(getPosBoat(cid), t[i], cid) end, i*delay) end addEvent(doCreatureSetNoMove, delay*#t+100, cid, false) addEvent(function() doItemSetAttribute(getThingFromPos(posback).uid, "aid", 6616) end, delay*#t+100) end ]]></movevent> <movevent type="StepIn" actionid="6617" event="script"><![CDATA[ domodlib("BoatSystemLib") if not isInArray(allids, getThingFromPos({x=toPosition.x, y=toPosition.y, z=toPosition.z, stackpos=1}).itemid) then doTeleportThing(cid, fromPosition, false) end ]]></movevent> </mod> Agora configurando o script: No local t, sao todas as direçoes que o barco vai andar, em sentido horario: 1 = norte 2 = leste 3 = sul 4 = oeste No local postart eh a posiçao que o meio do barco vai estar quando ele estiver indo para algum lugar. No local posback eh a posiçao que o meio do barco vai estar quando ele estiver voltando. O delay eh o tempo em milesegundos que demora pra o barco andar. Adicionando no Map editor: Faça 3 sqms do id 4820. Adicione o actionid 6617 nesses sqms. Faça 3 ids de barco, voce escolhe se eh o virado para cima ou para o lado. Bote o actionid 6616 no meio do barco. Fica assim: O vermemlho indica que tem o id 4820 e o actionid 6617. O verde indica o actionid 6616 Na pos que ele vai chegar soh faça o negocio na agua, nao precisa fazer outro bote. OBS: PONHA OS SQMS DA ROTA PARA NAO PODER LOGA SE ALGUEM LOGA NO BARCO VAI DAR BUG
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...