Jump to content

Wakon

Hero
  • Content Count

    3174
  • Joined

  • Last visited

  • Days Won

    22

Reputation Activity

  1. Upvote
    Wakon reacted to Nolis in Anatomia Humana - Como criar outfits   
    Este tutorial estava numa área fechada do perspective45 (fórum), reescrevi e estruturei algumas partes, os créditos estão abaixo:
    Créditos pelo tutorial: Etchebeur.
     
    O corpo humano pode ser dividido nas seguintes partes:
    1. Cabeça e pescoço
    2. Membro superior: Mão, antebraço, braço, ombro, axila e região peitoral.
    3. Abdômen
    3. Costas
    5. Membro inferior: Coxa, perna e pé.

     
    Tendo em mente que o sprite precisa de todas essas partes, vamos lá:

    Cabeça e pescoço: É preciso definir o rosto, colocando feições humanas. O pescoço pode ser representado com um pequeno espaço abaixo do rosto.

     
     
    Membro superior: Mão, antebraço, braço, ombro, axila e região peitoral. É muito importante que cada parte seja feita e principalmente visível. E sempre em proporções similares (nunca peitoral ou braço mais fortes que outras areas). É representada pelo volume, por isso as bordas e areas mais claras.
    Obs: Os braços vem de encontro a um centro pré determinado abaixo da cintura dependendo da posição.

     
     
    Abdômen: Precisa representar os musculos da barriga/umbigo com volume. Mas cuidado, devido ao pouco espaço, é preciso muito cuidado aonde vai por os pixels (como qualquer area com pouco espaço).

     
    Membro inferior: Coxa, perna e pé. Ao contrario dos braços as pernas seguem uma direção opostas umas das outras.

     
  2. Upvote
    Wakon reacted to Nolis in Como criar arbustos   
    Encontrei esses arquivos num backup aqui no meu Pc, se alguém souber quem os fez me avise pra eu adicionar os créditos!
     
    As imagens abaixo mostram o processo de criação de arbustos, em top-down e perspective 45.
     

     

  3. Upvote
    Wakon reacted to Bruno Minervino in TibiaKing Map Shape v1.0.3   
    • •
     Introdução
    O projeto foi iniciado por Daniel para manter atualizado um recurso antigo que é muito utilizado, além de ser útil e criativo: o Bit Map To Map; baseando-se em sua estrutura, desenvolvemos um novo Map Shape, o Tibia King Map Shape, ou TK Map Shape; Esperamos pedidos de novas atualizações e opiniões sobre o projeto.
     
     Funções
    O TK Map Shape apresenta algumas funções a mais, tudo está sendo planejado para uma praticidade que envolva estética e funcionalidade: Você adiciona uma imagem, seleciona uma cor, essa cor selecionada será transformada em Mapa; você pode escolher várias cores e alguns grounds, assim como a versão que desejar.
    Também alterei a estrutura do programa ao salvar o arquivo, pra quem reclamava, agora está perfeito! Funções alteradas como a seleção de cor possibilitam um melhor manuseamento da ferramenta, o que antes produzia cor1 e cor2 agora pode ser listado como quantas cores você desejar.
     
     

     
     
     Como usar?
     
    https://www.youtube.com/watch?v=-nKwmVhg1qY
     
     
     Download
    TibiaKing Map Shape 1.0.3.rar
    Scan
     
     
     Changelog
      [07/02/2015] v1.0.1:
    - Carreção de possível crash ao salvar para .otbm
    - Novo Visual

    [31/01/2015] v1.0.0:
    - Lançamento do TibiaKing Map Shape
     
    [21/02/2015] v1.0.3:
     
    - Removido as opções xOff e Yoff;
    - Adicionado função para por ID custom;
    - Visual antigo adicionado, o novo estava causando lentidão na abertura do programa;
    - Adicionado opção de confirmação ao dar exit no programa.
     
     
     
     
     Créditos
    Bruno Minervino
    Daniel
    DarkstaR
  4. Upvote
    Wakon reacted to L3K0T in Deixando as Sprites mais Rápida no OTclient   
    Bom galera hoje vou ensinar a vocês como acelerar as Sprites do seu jogo pra ficar como do Tíbia Global, assista o vídeo abaixo que você vai entender.
     
     
     
    Primeiramente vá na source do seu OTClient 0.6.6 "otclient-0.6.6\src\client"ou superior e abre o game.cpp depois de aberto procure.
     
    if(version >= 1050) mude para 
    if(version <= 1050) Salve e Agora vá em const.h e procure.
     
    INVISIBLE_TICKS_PER_FRAME = 500, ITEM_TICKS_PER_FRAME = 500, mude para
    INVISIBLE_TICKS_PER_FRAME = 100, ITEM_TICKS_PER_FRAME = 100,  
    Feito isso salve e da Rebuild no compilador do otcliente que voce usa "recompilação limpa"
     

     
    Depois de compilar vá no seu Object Builder e compile seu cliente pra "Improved Animations"
     

     
    pronto, agora só usar  
     
     
    ATENÇÃO
    USE SOMENTE EM CASO DE ERROS DO OTCLIENT, CASO NÃO LER SEU CLIENTE;
     
    ache
    function load() local version = g_game.getClientVersion() em baixo coloca
     
    g_game.enableFeature(GameSpritesU32)  
  5. Upvote
    Wakon reacted to Nolis in Lista completa de Monstros e Looktypes   
    LISTA DE LOOKTYPES
    (Todas as Versões), Fonte: Otland
     
    Lista 0-1283
     
  6. Upvote
    Wakon reacted to Mathias Kenfi in [Novos Atributos] Critical/Dodge/Life e Mana Leech/Life e Mana Absorb   
    Hoje estarei ensinando a instalar os seguintes novos atributos/sistemas em sua source
    CriticalHitChance e DodgeChance -- (Funciona da mesma maneira que o critical básico de script, porém sem bugs de callstack) Life e Mana Absorb -- (Regenera, de acordo com a % atribuida, a partir de dano recebido) Life e Mana Leech -- (Regenera, de acordo com a % atribuida, a partir do dano causado) Exemplo de como vai ficar
    Primeiro e antes de tudo, você terá de desativar o critical padrão do Tibia (Você pode pular essa parte se quiser)
     
    Vamos lá! Vá em items.cpp e procure por:
    attackSpeed = 0; Abaixo coloque:
    criticalHitChance = dodgeChance = lifeAbsorb = manaAbsorb = lifeLeech = manaLeech = 0; Depois, ainda em items.cpp, procure por:
    else if(tmpStrValue == "extradefense" || tmpStrValue == "extradef") { if(readXMLInteger(itemAttributesNode, "chance", intValue)) it.extraDefenseChance = intValue; if(readXMLInteger(itemAttributesNode, "value", intValue)) it.extraDefense = intValue; if(readXMLInteger(itemAttributesNode, "random_min", intValue)) it.extraDefenseRndMin = intValue; if(readXMLInteger(itemAttributesNode, "random_max", intValue)) it.extraDefenseRndMax = intValue; } Abaixo coloque:
    else if(tmpStrValue == "criticalhitchance") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.criticalHitChance = intValue; } else if(tmpStrValue == "dodgechance") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.dodgeChance = intValue; } else if(tmpStrValue == "lifeabsorb") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.lifeAbsorb = intValue; } else if(tmpStrValue == "manaabsorb") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.manaAbsorb = intValue; } else if(tmpStrValue == "lifeleech") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.lifeLeech = intValue; } else if(tmpStrValue == "manaleech") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.manaLeech = intValue; } Agora vá em items.h e procure por:
    int32_t attack, extraAttack, defense, extraDefense, armor, breakChance, hitChance, maxHitChance, runeLevel, runeMagLevel, lightLevel, lightColor, decayTo, rotateTo, alwaysOnTopOrder; Abaixo coloque:
    int32_t criticalHitChance, dodgeChance, lifeAbsorb, manaAbsorb, lifeLeech, manaLeech;  
     
    Agora vá em item.cpp e procure por:
    case ATTR_ATTACK: { int32_t attack; if(!propStream.getLong((uint32_t&)attack)) return ATTR_READ_ERROR; setAttribute("attack", attack); break; } Acima coloque:
    case ATTR_CRITICALHITCHANCE: { int32_t criticalHitChance; if(!propStream.getLong((uint32_t&)criticalHitChance)) return ATTR_READ_ERROR; setAttribute("criticalhitchance", criticalHitChance); break; } case ATTR_DODGECHANCE: { int32_t dodgeChance; if(!propStream.getLong((uint32_t&)dodgeChance)) return ATTR_READ_ERROR; setAttribute("dodgechance", dodgeChance); break; } case ATTR_LIFEABSORB: { int32_t lifeAbsorb; if(!propStream.getLong((uint32_t&)lifeAbsorb)) return ATTR_READ_ERROR; setAttribute("lifeabsorb", lifeAbsorb); break; } case ATTR_MANAABSORB: { int32_t manaAbsorb; if(!propStream.getLong((uint32_t&)manaAbsorb)) return ATTR_READ_ERROR; setAttribute("manaabsorb", manaAbsorb); break; } case ATTR_LIFELEECH: { int32_t lifeLeech; if(!propStream.getLong((uint32_t&)lifeLeech)) return ATTR_READ_ERROR; setAttribute("lifeleech", lifeLeech); break; } case ATTR_MANALEECH: { int32_t manaLeech; if(!propStream.getLong((uint32_t&)manaLeech)) return ATTR_READ_ERROR; setAttribute("manaleech", manaLeech); break; } Procure por:
    if(it.attackSpeed || (item && item->getAttackSpeed())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "AS: " << (item ? item->getAttackSpeed() : it.attackSpeed); Abaixo coloque:
    if(it.criticalHitChance || (item && item->getCriticalHitChance())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Crit Chance:" << std::showpos << int32_t(item ? item->getCriticalHitChance() : it.criticalHitChance) << "%"<< std::noshowpos; } if(it.dodgeChance || (item && item->getDodgeChance())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Dodge Chance:" << std::showpos << int32_t(item ? item->getDodgeChance() : it.dodgeChance) << "%"<< std::noshowpos; } if(it.lifeAbsorb || (item && item->getLifeAbsorb())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Life Absorb:" << std::showpos << int32_t(item ? item->getLifeAbsorb() : it.lifeAbsorb) << "%"<< std::noshowpos; } if(it.manaAbsorb || (item && item->getManaAbsorb())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Mana Absorb:" << std::showpos << int32_t(item ? item->getManaAbsorb() : it.manaAbsorb) << "%"<< std::noshowpos; } if(it.lifeLeech || (item && item->getLifeLeech())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Life Leech:" << std::showpos << int32_t(item ? item->getLifeLeech() : it.lifeLeech) << "%"<< std::noshowpos; } if(it.manaLeech || (item && item->getManaLeech())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Mana Leech:" << std::showpos << int32_t(item ? item->getManaLeech() : it.manaLeech) << "%"<< std::noshowpos; } Procure por:
    int32_t tmp = it.armor; if(item) tmp = item->getArmor(); bool begin = true; if(tmp) { s << " (Arm:" << tmp; begin = false; } Abaixo coloque:
    if(it.criticalHitChance || (item && item->getCriticalHitChance())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Crit Chance:" << std::showpos << int32_t(item ? item->getCriticalHitChance() : it.criticalHitChance) << "%"<< std::noshowpos; } if(it.dodgeChance || (item && item->getDodgeChance())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Dodge Chance:" << std::showpos << int32_t(item ? item->getDodgeChance() : it.dodgeChance) << "%"<< std::noshowpos; } if(it.lifeAbsorb || (item && item->getLifeAbsorb())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Life Absorb:" << std::showpos << int32_t(item ? item->getLifeAbsorb() : it.lifeAbsorb) << "%"<< std::noshowpos; } if(it.manaAbsorb || (item && item->getManaAbsorb())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Mana Absorb:" << std::showpos << int32_t(item ? item->getManaAbsorb() : it.manaAbsorb) << "%"<< std::noshowpos; } if(it.lifeLeech || (item && item->getLifeLeech())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Life Leech:" << std::showpos << int32_t(item ? item->getLifeLeech() : it.lifeLeech) << "%"<< std::noshowpos; } if(it.manaLeech || (item && item->getManaLeech())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Mana Leech:" << std::showpos << int32_t(item ? item->getManaLeech() : it.manaLeech) << "%"<< std::noshowpos; } Agora vá em item.h e procure por:
    ATTR_DUALWIELD = 43, Abaixo coloque:
    ATTR_CRITICALHITCHANCE = 44, ATTR_DODGECHANCE = 45, ATTR_LIFEABSORB = 46, ATTR_MANAABSORB = 47, ATTR_LIFELEECH = 48, ATTR_MANALEECH = 49, Procure por:
    int32_t getExtraDefense() const; Abaixo coloque:
    int32_t getCriticalHitChance() const; int32_t getDodgeChance() const; int32_t getLifeAbsorb() const; int32_t getManaAbsorb() const; int32_t getLifeLeech() const; int32_t getManaLeech() const; Procure por:
    inline int32_t Item::getExtraDefense() const { bool ok; int32_t v = getIntegerAttribute("extradefense", ok); if(ok) return v; return items[id].extraDefense; } Abaixo coloque:
    inline int32_t Item::getCriticalHitChance() const { bool ok; int32_t v = getIntegerAttribute("criticalhitchance", ok); if(ok) return v; return items[id].criticalHitChance; } inline int32_t Item::getDodgeChance() const { bool ok; int32_t v = getIntegerAttribute("dodgechance", ok); if(ok) return v; return items[id].dodgeChance; } inline int32_t Item::getLifeAbsorb() const { bool ok; int32_t v = getIntegerAttribute("lifeabsorb", ok); if(ok) return v; return items[id].lifeAbsorb; } inline int32_t Item::getManaAbsorb() const { bool ok; int32_t v = getIntegerAttribute("manaabsorb", ok); if(ok) return v; return items[id].manaAbsorb; } inline int32_t Item::getLifeLeech() const { bool ok; int32_t v = getIntegerAttribute("lifeleech", ok); if(ok) return v; return items[id].lifeLeech; } inline int32_t Item::getManaLeech() const { bool ok; int32_t v = getIntegerAttribute("manaleech", ok); if(ok) return v; return items[id].manaLeech; }  
     
    Agora vá em player.cpp e procure por:
    int32_t Player::getArmor() const { int32_t i = SLOT_FIRST, armor = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) armor += item->getArmor(); } if(vocation->getMultiplier(MULTIPLIER_ARMOR) != 1.0) return int32_t(armor * vocation->getMultiplier(MULTIPLIER_ARMOR)); return armor; } Abaixo coloque:
    int32_t Player::getCriticalHitChance() const { int32_t i = SLOT_FIRST, crit = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) crit += item->getCriticalHitChance(); } return crit; } int32_t Player::getDodgeChance() const { int32_t i = SLOT_FIRST, dodge = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) dodge += item->getDodgeChance(); } return dodge; } int32_t Player::getLifeAbsorb() const { int32_t i = SLOT_FIRST, life = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) life += item->getLifeAbsorb(); } return life; } int32_t Player::getManaAbsorb() const { int32_t i = SLOT_FIRST, mana = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) mana += item->getManaAbsorb(); } return mana; } int32_t Player::getLifeLeech() const { int32_t i = SLOT_FIRST, life = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) life += item->getLifeLeech(); } return life; } int32_t Player::getManaLeech() const { int32_t i = SLOT_FIRST, mana = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) mana += item->getManaLeech(); } return mana; } Agora vá em player.h e procure por:
    virtual int32_t getDefense() const; Abaixo coloque:
    virtual int32_t getCriticalHitChance() const; virtual int32_t getDodgeChance() const; virtual int32_t getLifeAbsorb() const; virtual int32_t getManaAbsorb() const; virtual int32_t getLifeLeech() const; virtual int32_t getManaLeech() const;  
     
    Agora vá em luascript.cpp e procure por:
    //getCreatureHealth(cid) lua_register(m_luaState, "getCreatureHealth", LuaInterface::luaGetCreatureHealth); Abaixo coloque:
    //getPlayerCriticalHitChance(cid) lua_register(m_luaState, "getPlayerCriticalHitChance", LuaInterface::luaGetPlayerCriticalHitChance); //getPlayerDodgeChance(cid) lua_register(m_luaState, "getPlayerDodgeChance", LuaInterface::luaGetPlayerDodgeChance); //getPlayerLifeAbsorb(cid) lua_register(m_luaState, "getPlayerLifeAbsorb", LuaInterface::luaGetPlayerLifeAbsorb); //getPlayerManaAbsorb(cid) lua_register(m_luaState, "getPlayerManaAbsorb", LuaInterface::luaGetPlayerManaAbsorb); //getPlayerLifeLeech(cid) lua_register(m_luaState, "getPlayerLifeLeech", LuaInterface::luaGetPlayerLifeLeech); //getPlayerManaLeech(cid) lua_register(m_luaState, "getPlayerManaLeech", LuaInterface::luaGetPlayerManaLeech); Procure por:
    int32_t LuaInterface::luaGetCreatureMaxHealth(lua_State* L) { //getCreatureMaxHealth(cid[, ignoreModifiers = false]) bool ignoreModifiers = false; if(lua_gettop(L) > 1) ignoreModifiers = popBoolean(L); ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushnumber(L, creature->getPlayer() && ignoreModifiers ? creature->healthMax : creature->getMaxHealth()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } Abaixo coloque:
    int32_t LuaInterface::luaGetPlayerCriticalHitChance(lua_State* L) { //getPlayerCriticalHitChance(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getCriticalHitChance()); else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerDodgeChance(lua_State* L) { //getPlayerDodgeChance(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getDodgeChance()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerLifeAbsorb(lua_State* L) { //getPlayerLifeAbsorb(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getLifeAbsorb()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerManaAbsorb(lua_State* L) { //getPlayerManaAbsorb(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getManaAbsorb()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerLifeLeech(lua_State* L) { //getPlayerLifeLeech(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getLifeLeech()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerManaLeech(lua_State* L) { //getPlayerManaLeech(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getManaLeech()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } Agora vá em luascript.h e procure por:
    static int32_t luaGetPlayerSpentMana(lua_State* L); Abaixo coloque:
    static int32_t luaGetPlayerCriticalHitChance(lua_State* L); static int32_t luaGetPlayerDodgeChance(lua_State* L); static int32_t luaGetPlayerLifeAbsorb(lua_State* L); static int32_t luaGetPlayerManaAbsorb(lua_State* L); static int32_t luaGetPlayerLifeLeech(lua_State* L); static int32_t luaGetPlayerManaLeech(lua_State* L);  
    As funções Lua adicionadas foram
    getPlayerCriticalHitChance(cid) getPlayerDodgeChance(cid) getPlayerLifeAbsorb(cid) getPlayerManaAbsorb(cid) getPlayerLifeLeech(cid) getPlayerManaLeech(cid)  
    Agora a parte do game.cpp. (Esta é uma parte opcional, você pode optar por não adicioná-la)
    Créditos: ~Mathias Kenfi
  7. Thanks
    Wakon got a reaction from yamislayer in Retirando Bug Do Rme 8.60   
    @Dornellas, não lembro se baixei esse cliente no site do RME mas ele funciona perfeitamente aqui, testa ai:
    https://www.mediafire.com/?lvz8c12b8e0y09k
     
  8. Upvote
    Wakon reacted to Nolis in Técnica dos Cubos - Objetos, cenário e criaturas   
    TÉCNICA DOS CUBOS
     
    Inspirado nas ideias do Hawk (grupo academia de spriting), mostrarei como criar um cubo e o que pode ser feito com ele! Essa técnica é simples e pode ser feita até mesmo no paint!
     
    As imagens mostradas nesse tutorial não são de autoria minha, retirei da internet e algumas foram doadas pelo Hawk
     
     
     
    1 - Fazendo um Cubo
    Trace uma linha reta no tamanho desejado (exemplo verde) e desenhe a ponta inferior do cubo usando duas linhas na diagonal, com o distanciamento de 2 pixels.
     

     
    Agora faça as paredes verticais proporcional ao comprimento das linhas e refaça o mesmo processo, veja a imagem:
     

     

     
    Pronto, temos um cubo, você pode criar vários modelos e replicar para uso próprio. Se preferir, detalhe o cubo com sombra e cor e você obterá um resultado melhor, veja abaixo:
     

     

     
     
     
    2 - Usando cubos para criar itens de cenário!
    Tendo um cubo no tamanho proporcional ao cenário do Tibia, você pode copiar, colar e usar sua criatividade para formar outros objetos. Para mostrar como exemplo, usarei um cubo menor, veja abaixo:
     
    Objetos de Cenário
     --->  ---> 
    Criaturas
     --->  --->  --->  ---> 
     
     
     
    É isso! Agora é só praticar, mostre nos comentários o o resultado dos eu treino e até o próximo tutorial! 😀 
  9. Like
    Wakon reacted to luanluciano93 in Cargos, Ranks e a volta do sistema de Medalhas!   
    - No local em que esta "datapack", melhor deixar como "servidores", ou colocar junto, pq nem todo mundo sabe o que é um datapack.
    - Em "bots", acho bom criar uma subseção de "suporte para bots".
    - Poderia acrescentar em "Tutoriais Otserv" uma subseção para "tutorias de scripting" e retirar a seção "Codding Otserv" (a mesma coisa para "Design & Pixel Art", mudando para tutorial).
    - o "suporte de otserv" poderia estar em um local separado: mais acima e bem destacado (pq é a seção mais usada). 

    a questão do suporte estar separado em questões resolvidas e não resolvidas, se isso for automático sera realmente muitissimo bom!

    sobre o clube e o comercio? o que vai virar? sou totalmente a favor de retirar o comercio do fórum.

    Gostei bastante tbem da opção Recurso no menubar.

    a principio é isso, o resto esta legal!
  10. Like
    Wakon got a reaction from LeoTK in Spell incompleta   
    @narutomaniacos, é essa parte que tá dando o hit "desconhecido":
    return doCombat(cid, combat, var) se quiser que dê apenas os hits por addEvent, troque por return true 😄
  11. Like
    Wakon got a reaction from LeoTK in Spell incompleta   
    @narutomaniacos, é essa parte que tá dando o hit "desconhecido":
    return doCombat(cid, combat, var) se quiser que dê apenas os hits por addEvent, troque por return true 😄
  12. Like
    Wakon got a reaction from Marcos FeaR in Comandos GOD não funcionam   
    Tente colocar o type da account em 3 ou 5.
  13. Like
    Wakon reacted to Vodkart in Ajuda alguem porfavor   
    @isac001 de boa, vamos por por actionID então!!
     
    function doTpTime(cid, delay, pos, msg) if not isCreature(cid) then return LUA_ERROR end if delay > 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "{Teleport} "..delay.." segundos para se teletransportar para "..msg..".") addEvent(doTpTime, 1000, cid, delay-1, pos, msg) else doTeleportThing(cid, pos) doSendMagicEffect(getPlayerPosition(cid), 10) doPlayerSendTextMessage(cid, 22, "Voce foi teleportado para "..msg.."! DBO EVOLUTION") end end local store,exhausted = 756841,10 function onUse(cid, item, fromPosition, item2, toPosition) local items = { -- [actionID] [15872] = {pos = {x = 433, y = 992, z = 15}, msg = "Earth"}, [15873] = {pos = {x = 478, y = 992, z = 15}, msg = "Namek Planet"}, [15874] = {pos = {x = 500, y = 992, z = 15}, msg = "Vegeta Planet"} } local var = items[item.actionid] if not var then return true end if getPlayerStorageValue(cid, store) >= os.time() then doPlayerSendCancel(cid, "wait " .. getPlayerStorageValue(cid, store) - os.time() .. " seconds to use this item.") return true end setPlayerStorageValue(cid, store, os.time()+exhausted) doTpTime(cid, 5, var.pos, var.msg) return true end  
    FAVOR TROCAR O ACTIONID QUE ESTÃO DENTRO DAS CHAVES []
        local items = { -- [ACTIONID]         [15872] = {pos = {x = 433, y = 992, z = 15}, msg = "Earth"},          [15873] = {pos = {x = 478, y = 992, z = 15}, msg = "Namek Planet"},         [15874] = {pos = {x = 500, y = 992, z = 15}, msg = "Vegeta Planet"}     } ai no actions.xml coloca assim por exemplo:
     
    <action actionid="15872;15873;15874" script="nome do seu script.lua"/>
     

    ou se forem tudo em ordem os actionID, tbm pode ser assim:
     
    <action actionid="15872-15874" script="nome do seu script.lua"/>  
  14. Upvote
    Wakon reacted to DdJs in [12x+] Babylon Teleports Room   
    Baylon Teleports Room
    V 12.20+
     
    Download:
    TeleportsRoom_V12.otbm
    Position [X: 1089 Y: 1034 Z: 5]
     
     
    RME + Client:
    Remere's Map Editor (11-12+) + Client.rar
     
     
    Imagens:
     
  15. Upvote
    Wakon reacted to Pedriinz in Auto Loot Sytem for TFS 1.3 + revscripts   
    Depois de milhões de anos sem programar porcaria nenhuma... Eu desenvolvi este sistema como um método de estudo. (C++)
    Este sistema foi inspirado no Auto Loot System por @psychonaut. (OTland)
    Criei o mesmo na versão mais recente do tfs. 
     
    Auto Loot System for TFS 1.3

     
    Como funciona?
    Simples, quando você mata um monstro e abre o corpo (você precisa clicar no corpo), os itens vão para o seu personagem.

     
    Instalando
    em actions.cpp, encontre:
    if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) { return RETURNVALUE_YOUARENOTTHEOWNER; } e mude isso para:
     
    if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) { return RETURNVALUE_YOUARENOTTHEOWNER; } else { if (player->canOpenCorpse(corpseOwner) && player->autoLootList.size() != 0) { if (player->getCapacity() > 100 * 100) { //Minimum of Capacity for autoloot works. (100 CAP) for (Item* item : container->getItemList()) { if (player->getItemFromAutoLoot(item->getID())) { std::ostringstream msgAutoLoot; msgAutoLoot << "You looted a " << item->getItemCount() << "x " << item->getName() << "."; g_game.internalMoveItem(container, player, CONST_SLOT_WHEREEVER, item, item->getItemCount(), nullptr); player->sendTextMessage(MESSAGE_INFO_DESCR, msgAutoLoot.str()); } } } else { player->sendTextMessage(MESSAGE_INFO_DESCR, "Sorry, you don't have enough capacity to use auto loot, so it has been disabled. (100+ capacity is required)"); } } } em player.h, abaixo de:
    std::unordered_set<uint32_t> VIPList; adicione isso:
    std::set<uint32_t> autoLootList; ainda em player.h encontre:
    bool hasLearnedInstantSpell(const std::string& spellName) const; adicione em baixo:
    void addItemToAutoLoot(uint16_t itemId); void removeItemFromAutoLoot(uint16_t itemId); bool getItemFromAutoLoot(uint16_t itemId); em player.cpp no final do arquivo, adicione:
    void Player::addItemToAutoLoot(uint16_t itemId) { autoLootList.insert(itemId); } void Player::removeItemFromAutoLoot(uint16_t itemId) { autoLootList.erase(itemId); } bool Player::getItemFromAutoLoot(const uint16_t itemId) { return autoLootList.find(itemId) != autoLootList.end(); } em luascript.cpp encontre:
    registerMethod("Player", "getFightMode", LuaScriptInterface::luaPlayerGetFightMode); e adicione em baixo:
    registerMethod("Player", "addItemToAutoLoot", LuaScriptInterface::luaPlayerAddItemToAutoLoot); registerMethod("Player", "removeItemFromAutoLoot", LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot); registerMethod("Player", "getItemFromAutoLoot", LuaScriptInterface::luaPlayerGetItemFromAutoLoot); registerMethod("Player", "getAutoLootList", LuaScriptInterface::luaPlayerGetAutoLootList); ainda em luascript.cpp encontre essa função:
    int LuaScriptInterface::luaPlayerGetFightMode(lua_State* L) { // player:getFightMode() Player* player = getUserdata<Player>(L, 1); if (player) { lua_pushnumber(L, player->fightMode); } else { lua_pushnil(L); } return 1; }  
    abaixo dela, adicione:
    int LuaScriptInterface::luaPlayerAddItemToAutoLoot(lua_State* L) { // player:addItemToAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } player->addItemToAutoLoot(itemId); pushBoolean(L, true); return 1; } int LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot(lua_State* L) { // player:removeItemFromAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } player->removeItemFromAutoLoot(itemId); pushBoolean(L, true); return 1; } int LuaScriptInterface::luaPlayerGetItemFromAutoLoot(lua_State* L) { // player:getItemFromAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } if (player->getItemFromAutoLoot(itemId)) { pushBoolean(L, true); } else { pushBoolean(L, false); } return 1; } int LuaScriptInterface::luaPlayerGetAutoLootList(lua_State* L) { // player:getAutoLootList() Player* player = getUserdata<Player>(L, 1); if (player) { std::set<uint32_t> value = player->autoLootList; if (value.size() == 0) { lua_pushnil(L); return 1; } int index = 0; lua_createtable(L, value.size(), 0); for(auto i : value) { lua_pushnumber(L, i); lua_rawseti(L, -2, ++index); } } else { lua_pushnil(L); } return 1; }  
    em luascript.h encontre:
    static int luaPlayerGetFightMode(lua_State* L);  
    adicione a baixo:
    static int luaPlayerAddItemToAutoLoot(lua_State* L); static int luaPlayerRemoveItemFromAutoLoot(lua_State* L); static int luaPlayerGetItemFromAutoLoot(lua_State* L); static int luaPlayerGetAutoLootList(lua_State* L);  
    em iologindata.cpp encontre:
    //load storage map query.str(std::string()); query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { do { player->addStorageValue(result->getNumber<uint32_t>("key"), result->getNumber<int32_t>("value"), true); } while (result->next()); }  
    e adicione em baixo:
    query.str(std::string()); query << "SELECT `autoloot_list` FROM `player_autoloot` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { unsigned long lootlistSize; const char* autolootlist = result->getStream("autoloot_list", lootlistSize); PropStream propStreamList; propStreamList.init(autolootlist, lootlistSize); int16_t value; int16_t item = propStreamList.read<int16_t>(value); while (item) { player->addItemToAutoLoot(value); item = propStreamList.read<int16_t>(value); } }  
    acima de:
    //save inbox items adicione:
    query.str(std::string()); query << "DELETE FROM `player_autoloot` WHERE `player_id` = " << player->getGUID(); if (!db.executeQuery(query.str())) { return false; } PropWriteStream propWriteStreamAutoLoot; for (auto i : player->autoLootList) { propWriteStreamAutoLoot.write<uint16_t>(i); } size_t lootlistSize; const char* autolootlist = propWriteStreamAutoLoot.getStream(lootlistSize); query.str(std::string()); DBInsert autolootQuery("INSERT INTO `player_autoloot` (`player_id`, `autoloot_list`) VALUES "); query << player->getGUID() << ',' << db.escapeBlob(autolootlist, lootlistSize); if (!autolootQuery.addRow(query)) { return false; } if (!autolootQuery.execute()) { return false; }  
    em sua database, execute esta query
    CREATE TABLE player_autoloot ( id int NOT NULL AUTO_INCREMENT, player_id int NOT NULL, autoloot_list blob, PRIMARY KEY (id) );  
    agora vá em data/scripts/talkactions e crie esse arquivo LUA
     
    autoloot.lua
    local talk = TalkAction("!autoloot") function talk.onSay(player, words, param) local i = player:getAutoLootList() local cache = "Check your loot list: " local split = param:split(",") local action = split[1] if param == "list" then if i then for _, item in ipairs(i) do cache = cache .. (ItemType(item)):getName() .. ", " end else player:sendTextMessage(MESSAGE_INFO_DESCR, "Your list is empty! Add some item and try again.") return false end player:sendTextMessage(MESSAGE_INFO_DESCR, cache:sub(1, -3)) return false end if action == "add" then local item = split[2]:gsub("%s+", "", 1) local itemType = ItemType(item) if itemType:getId() == 0 then itemType = ItemType(tonumber(item)) if itemType:getName() == '' then player:sendCancelMessage("There is no item with that id or name.") return false end end if player:getItemFromAutoLoot(itemType:getId()) then player:sendCancelMessage("You're already autolooting this item.") return false end player:addItemToAutoLoot(itemType:getId()) player:sendTextMessage(MESSAGE_INFO_DESCR, "You're now auto looting " .. itemType:getName()) return false elseif action == "remove" then local item = split[2]:gsub("%s+", "", 1) local itemType = ItemType(item) if itemType:getId() == 0 then itemType = ItemType(tonumber(item)) if itemType:getName() == '' then player:sendCancelMessage("There is no item with that id or name.") return false end end if player:getItemFromAutoLoot(itemType:getId()) then player:removeItemFromAutoLoot(itemType:getId()) player:sendTextMessage(MESSAGE_INFO_DESCR, "You removed the " .. itemType:getName() .. " from your loot list.") else player:sendCancelMessage("This item does not exist in your loot list.") end return false end player:sendTextMessage(MESSAGE_EVENT_ORANGE, "Auto Loot commands (items are automatically moved to your bp if you open monster corpse):"..'\n'.."!addloot add, nameItem - add item to auto loot by name"..'\n'.."!autoloot remove, itemName - remove item from auto loot by name"..'\n'.."!autoloot list - list your current auto loot items") return false end talk:separator(" ") talk:register()  
     
    É isso, espero que gostem do sisteminha
    Se você encontrar algum bug, deixe-me saber.

    Falta fazer:
    Optimizar a mensagem de loot.
    Adicionar ModalWindow.
     
    Cheers~
     

  16. Upvote
    Wakon reacted to Yinz in Aldora Layout 1x   
    Olá, tava olhando aqui um antigo HD que por acaso não estava funcionando e acabei conseguindo recuperar algumas coisas, então como estou afastado do forum estarei disponibilizando aqui. 
     
     
    Version: TFS 1x+
     
    Download:
    Aldora
     
    Virustotal:
    AQUI
    Images:
     
     
     
     
     
  17. Upvote
    Wakon reacted to DdJs in [8.60] Mining Cave   
    Mining Cave
    V 8.60
     
    [pequena area para evento mining]
     
    Download:
    Mining_Cave8.60.rar
     
    Position: [X: 1010 Y: 1031 Z: 8]
     
    Imagens:
     
  18. Upvote
    Wakon reacted to DdJs in [8.60] Pumin Seal (Cave)   
    Pumin Seal (Cave)
    V 8.60
     
    [Cave inspirada no selo de Pumin da Ferumbras' Ascendant Quest]
    *Não se trata de uma réplica fiel do seal original.
     
    Download:
    Pumin_Seal8.60.rar
    Position: [X: 1006 Y: 1022 Z: 9]
     
    Imagens:
     
     
     
  19. Upvote
    Wakon reacted to WooX in Tutorial - Push cruzado e sua história   
    Push Cruzado

    Como prometido, hoje eu vou ensinar como implementar o push cruzado. Este tutorial é feito especificamente para a versão 2 do OTX, porem, devido a simplicidade do código (sério, é muito simples, você vai se surpreender), acredito que possa ser implementado em qualquer source code disponível atualmente.
    Antes do tutorial vou falar sobre como surgiu o "sistema" e de como o mesmo ficou popular entre os jogadores de Baiak, então senta que lá vem história.
    Se você não tem interesse na história de como surgiu e se popularizou e só está aqui pelo tutorial de como implementar, pule para o final do tópico.
     
    História

    Familiar para alguns e desconhecido para muitos outros, o que afinal é esse tal de push cruzado que alguns tanto falam?
    Para entender como surgiu, teremos que voltar alguns anos no tempo, em uma época que OTX não existia e o TFS 1.x ainda era um sonho distante, época essa em que a maioria dos servidores com protocolo 8.60 utilizavam como engine a velha TFS 0.3.6. Foi neste período que alguns jogadores de enforced descobriram este bug, isso mesmo que você leu, o push cruzado é na verdade um bug!
    Mas calma! é apenas um bug inofensivo, mesmo assim, não deixa de ser um bug, que hoje em dia é divulgado como feature nos servidores. Antes de entrar mais a fundo nessa questão, vou terminar de explicar como ele foi descoberto, como ele pode ser utilizado e as vantagens que ele concede aos jogadores que sabem como utiliza-lo.
     
    Nos saudosos dias em que o protocolo 8.60 estava no seu auge na comunidade OpenTibia (70% da Otserv List era composta por servidores 8.60), poucos tinham acesso para a até então recente TFS 0.4 (nesta época TFS 0.4 não era pública, e só podia ser obtida doando uma quantia aos desenvolvedores). Até então, era raro encontrar servidores rodando com TFS 0.4, mais raro ainda um servidor enforced/war, mas assim como uma agulha no palheiro, ele estava lá, Mega-War, o que eu acredito que tenha sido o primeiro servidor de war 8.60 a usar a recente distro.
     
    OTServList em 2011
     
    E foi neste servidor que o push cruzado foi descoberto, por jogadores dedicados a se aperfeiçoarem no PvP, estes foram os primeiros e os que deram origem ao que hoje se conhece como enforcedeiros (jogadores assíduos de servidores de war, com uma habilidade surreal no PvP). Mas algumas questões ficam no ar, TFS 0.4 era realmente recente, porem o protocolo 8.60 já existia há um bom tempo no TFS 0.3, então porque este bug não foi descoberto antes? porque neste servidor em especifico se outros servidores de war 8.60 já existiam?
     
    A resposta é: este bug surgiu justamente no TFS 0.4, para ser mais especifico na rev 3777, tanto é que a versão anterior do TFS (0.3) não continha este bug e nas revisões seguintes do TFS 0.4 ele foi corrigido, com isto o push cruzado se "perdeu", existindo somente no TFS 0.4 (Rev 3777). Devido a isto, os servidores privados de enforced (onde se encontra a maioria dos enforcedeiros hoje em dia) e alguns servidores baiaks utilizam TFS 0.4 até hoje, mesmo existindo opções excelentes em comparação, como TFS 1.x e OTX, tudo devido a este bugzinho que se popularizou muito entre alguns jogadores ao longo do anos. Mas como o push cruzado se popularizou tanto a ponto de chegar ao que é hoje?
     
    Os enforcedeiros tinham um estilo único de PvP, fazendo jogadas que para muitos até hoje não é possível sem o uso de bot. Com o tempo, estes jogadores foram gravando e postando vídeos no Youtube de suas jogadas, para muitos dos que assistiam, tal nível de habilidade só podia ser atingido com auxílio do bot, os mais humildes, aqueles que aceitavam que aquilo era possível sem o uso de bot, entravam nestes servidores de war com a intenção de aprender, não só o push cruzado, mas o push a distancia, a velocidade para realizar jogadas e a visão de jogo num geral.
     
    Alguns dos vídeos antigos da época do Mega-War.
     
    Neste ultimo vídeo em especial, é possivel ver o push cruzado sendo realizado por volta de 1:22 e 3:20 de vídeo.
     
    No inicio de 2013, sem motivo aparente o Mega-War simplesmente fechou. Mas onde há demanda, sempre haverá oferta, com isso surge o ainda mais famoso Total-War.
    O Mega-War foi o inicio para essas estrelas do PvP, mas foi no Total-War que a coisa realmente cresceu. Com cada vez mais vídeos de jogadores exibindo jogadas espetaculares, mais aparecia os chamados novatos (jogadores que admiravam os enforcedeiros e tinham interesse em aprender e praticar as técnicas usadas), na época do Mega-War, dava pra contar nos dedos a quantidade de pessoas que sabiam fazer o push cruzado, afinal, era uma coisa totalmente nova, com poucos meses do Total-War online esse numero cresceu exponencialmente, o servidor ficou no seu auge por cerca de 1 ano e alguns meses.
     
    Alguns vídeos de enforcedeiros no Total-War (incluindo o meu 😊).

    Poucos sabem disso, mas eu era GM no Total-War, ajudei no servidor por alguns meses até ter um desentendimento com o dono, nesse momento eu decidi abrir o meu próprio servidor enforced. Eu acompanho a comunidade brasileira de OpenTibia desde 2010, mas nunca tinha levado a sério a ideia de ter meu próprio servidor até então, foi nessa época que eu criei a minha conta aqui no TibiaKing, pois o antigo XTibia (lugar onde eu conheci o que era OpenTibia) havia fechado.
     
    No ano de 2014 encontrar as sources do TFS 0.4 já não era mais problema, estavam por todo lugar. Eu peguei um datapack com mapa de venore (assim como o Mega e Total-War) e coloquei online, nesse período eu comecei a estudar a fundo como funcionava OTServers. Devido a testes de diversas versões diferentes de source, já na época eu percebi que push cruzado era algo exclusivo do TFS 0.4 (isso explica porque o dono do Total-War se recusava a fazer um upgrade), era também tempo do inicio do repositório do OTX que se mostrava promissor em relação ao TFS 0.4.
     
    Cerca de 1 ano depois da abertura do meu servidor eu decidi tentar adicionar o cruzado nas sources do OTX2, uma pessoa dedicada com um objetivo, mas sem saber de nada, por semanas eu comparei o código de ambas as sources, arquivo por arquivo (haja dedicação), e por fim consegui adicionar ao OTX (quando eu descobri o que era, eu confesso que de imediato me arrependi de ter gasto tanto tempo com isso). Com essa alteração eu resetei e reinaugurei meu servidor, o servidor era chamado de Ultra-War, mas ficou mais conhecido por todos como Sv2 porque o servidor era hosteado em 3 locais diferentes, e 1 dos locais era aqui no Brasil, este era conhecido como Sv2.
     
    O Ultra-War foi o primeiro servidor a ter o push cruzado sem utilizar do TFS 0.4, na época OTX já estava se tornando muito popular pois dava uma sensação de ping menor ao jogar, rodando o servidor com OTX e em 3 hosts diferentes, os poucos players que sobraram no Total-War migraram para o Ultra-War, e assim como o Total-War ocupou o lugar do Mega-War no seu fim, o Sv2 passou a segurar esta tocha. Alem dos já antigos enforcedeiros, jogadores novos não paravam de vir de todos os lugares, muitos deles quando aprendiam e aperfeiçoavam as técnicas iam logo aplicar em servidores UP Level (principalmente Baiaks), foi ai que o push cruzado se popularizou fora do enforced, com os jogadores pedindo aos administradores para adicionarem algo que eles sequer tinham noção do que era.
     
    Vídeos do jogador que eu acredito ser o maior responsável pela popularidade do PvP no estilo enforced nos Baiaks.
     
    Enfim... a história acaba por aqui (até porque ficou longa pra kct), no final das contas a história não foi sobre o push cruzado em si, mas sobre o enforced e os enforcedeiros num geral. Agora vamos para a parte que todos querem ver.
     
    O que é e como utilizar

    O push cruzado nada mais é do que permitir que o jogador empurre (push) outros jogadores e criaturas enquanto se movimenta ao mesmo tempo, basicamente é apenas isso. O que isso proporciona ao jogador, ai já é outra historia (brincadeira, depois dessa ultima, chega de história), isso permite ao jogador executar jogadas que sem o push cruzado seriam executadas de maneira bem mais lenta, e até mesmo jogadas que seriam impossíveis de serem realizadas sem o uso do famoso cruzado.
     
    Veja abaixo alguns exemplos.
     
    Tutorial

    Como eu mencionei antes, o push cruzado é na verdade um bug, caso implementado, isso possibilita aos jogadores realizarem jogadas que sem ele seriam impossíveis. Se mesmo ciente disto você deseja seguir em frente, basta seguir os passos abaixo.
     
     
     
    Pronto, com isso você pode habilitar ou desabilitar o push cruzado diretamente pelo config.lua, sem a necessidade de recompilar a source.
     
    Créditos

    Me, myself and I.
  20. Upvote
    Wakon reacted to LeoTK in [Sistema 0.3.6 - 8.54] Chuva Editado por LeoTK & NightWolf   
    Salve galera bom tinha uns membros do fórum atrás do sistema de chuva porém estava confuso e totalmente configuravel apenas por math.random então com ajuda do @xWhiteWolf agora o script esta totalmente sem math.random e eu detalhei tudo dentro do script como configurar etc...
     
    tópico original
     
    Aviso 1º: Mude a tag do globalevents.xml para interval=1
    Aviso 2º: Todas as explicações estão dentro do script basta ler
     
    Vídeo demonstrativo

    2019-10-04 01-44-37.mp4  
     
    Vamos as modificações basicamente substitua o arquivo que fica em data/globalevents/scripts/rain.lua abra ele e cole esse código dentro
     
     
    Aproveitando fiz uma modificação na direção que a chuva cai caso quiser a modificação vá em data/globalevents/scripts/lib e abra o arquivo rain.lua e substitua tudo que tiver lá por esse código
     
     
     
    Créditos:
    @Guilherme.
    @xWhiteWolf
    @LeoTK
    Elexonic (Otland)
  21. Upvote
    Wakon reacted to Dwarfer in Barbarian Test Quest   
    MARAVILHOOOOOOSOS, como vocês estão? Espero que estejam bem. 😍
    Esses dias fuçando as profundezas sombrias do meu computador encontrei essa quest, a Barbarian Test Quest, do tibia global e agora compartilho-a com vocês. Para quem não conhece, é aquela quest que dá alguns acessos na cidade de Svargrond do tibia global.
    Mais informações, visite o link: https://www.tibiawiki.com.br/wiki/Barbarian_Test_Quest
    As falas do NPC estão 99% iguais ao do tibia global, salvo algumas pequenas modificações/adaptações feitas por mim dando o meu toque, é claro 🤗. (todos gostam do meu toque) Obviamente, a quest se aplica melhor para servidores de tibia clássico, mas deixei os id's dos itens facilmente editáveis para você adaptar para o seu servidor, seja ele de qual tipo for, para TFS 0.4 ou OTX 2.x.
     
    Configuração:
     
    1) Em data/lib, crie um arquivo chamado Barbarian Test Quest.lua e cole isto dentro:
     
     
    2) Em data/npc/scripts, crie um arquivo chamado Sven.lua e cole isto dentro:
     
     
    O arquivo.xml do NPC Sven, em data/npc é o seguinte:
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Sven" script="Sven.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="143" head="76" body="100" legs="132" feet="97" addons="3" mount="0"/> </npc> 3) Em data/actions/scripts, aconselho criar uma pasta chamada barbarian_test para colocar os arquivos referentes à quest. Dentro dessa pasta, um por um, coloque os arquivos com os nomes abaixo:
     
    bucketmead.lua
     
    meadhorn.lua
     
    mammothpushing.lua
     
    Em data/actions.xml adicione as tags abaixo: (caso altere os ids dos itens para adaptar ao seu servidor, lembre de alterá-los nas tags também)
    <action actionid="8952" script="barbarian_test/bucketmead.lua" /> <action itemid="7140;7141" script="barbarian_test/meadhorn.lua" /> <action itemid="7176" script="barbarian_test/mammothpushing.lua" /> Coloque o actionid 8952 (ou o valor que desejar, lembrando de modificar na tag no actions.xml) no balde de rum localizado próximo ao NPC.
     

     
    Lembre de colocar um NPC adicional ao lado do NPC Sven que venda "rum" para que o jogador possa ficar bêbado e realizar a última missão (missão do mammoth).
        
     
    OBS: Ao finalizar a quest, o jogador receberá a storage 87345 igual a 1. Essa informação pode ser útil para dar acesso a determinadas áreas somente após terminar a quest, por exemplo.
     
    É isso. Espero que seja útil ao servidores que desejam ter um pouquinho mais de RPG. GRANDE ABRAÇO! 😉
     
    Esse script faz parte de um conjunto de quests do tibia global que pretendo ir fazendo aos poucos a depender do feedback do pessoal.
    Veja também:
     
  22. Upvote
    Wakon reacted to Vodkart in [8.6] Task System 4.0! (Task system + Daily Task System)   
    Removido:
     
    *Boss Room
    *Rank Task
    *Prêmios para os 10 primeiros a terminar todas as tasks
     
    Adicionado:
     
    *Daily Task System (Sistema exclusivo de Task diario, podendo pegar 1x a cada 24 hrs, irei explicar mais depois.)
    *Task agora é por progresso, você não pode sair e voltar, terá que terminar a task 1 para avançar para a task  2, assim sucessivamente.
    *Task Points
    *Level para realizar a task
    *Nova talkaction que mostra uma janela de informações sobre o level da task, premios que irá receber, progresso, etc...
    *Items para entrega(Se o jogador deverá levar algum item junto com a quantidade de monstro morta) para finalizar a task
    *Sistema de look Task (Varia de acordo com a sua quantidade de Task Points, podendo ficar por exemplo como "Huntsman", "Ranger", etc...(alterável)
    *Mods e npc mais "clean", várias linhas removidas e o sistema está mais rápido
    *Vou Adicionar "scripts extras" Como:
    --> Tile que só passa quem tiver permissão depois de finalizar determinada quest
     --> Npc de Boss Room para entrar e enfrentar o monstro quem fez determinada quest
     
     
    [+] Resumo do Task system + Daily Task System [+]
     
    Task System: É o sistema de task "original", onde consiste em matar determinada quantidade de monstros(E entregar certo itens <- é configurável), para receber recompensas como Exp, Money e Items.
     
    Algumas mudanças do simple task 3.0 para o 4.0 foram:
     
    [+] O sistema agora é por progresso, isso quer dizer que você terá que ir terminando a quest para avançar para a seguinte.
    [+] O sistema Também recebeu uma alteração, fazendo com que as Tasks precisem que o jogador tenha um level determinado
    [+] A tabela para edição está mais fácil, fazendo com que você adicione ou remova monstros com mais tranquilidade, inclusive alterações das Rewards da Task.
     
    Daily Task System: É um sistema que desenvolvi para que os jogadores sempre estejam se comunicando com o npc de Task, no caso da Task Diaria, vária de acordo com o level do jogador, por exemplo:
     
    Jogadores entre level 6 ao 49 poderá cair em uma dessas 3 Task Diarias: Orcs, Tarantulas ou Wyverns
    Jogadores entre level 50 ao 79 poderá cair em uma dessas 3 Task Diarias: Dragons, Wailing Widows ou Ancient Scarabs
     
    E por ai vai, claro que você poderá aumentar as Task Diarias dependendo do level, eu fiz 3 para cada level que é pra postar, mas tudo isso você pode aumentar! Dependendo do seu servidor.
     
    E sim, você pode fazer a TASK "ORIGINAL" e a TASK "DIARIA" ao mesmo tempo! Ambas são distintas e possuem Rewards diferenciadas!
     
    No caso da Task diaria, levando em conta que você começou a fazer ela no dia 08/01 ás 20:00 Hrs, você tem até o dia 09/01 ás 20:00Hrs para termina-la e receber a recompensa, caso termine antes, a Task diaria só irá ficar disponível para repetição a partir desta mesma data 09/01 20:00 Hrs;
     
    [+] Caso você não termine a tempo, não tem problema, basta esperar este horário e começar uma nova Task.
    [+] Caso você começou a Daily Task e terminou antes desta data. mas por algum motivo esqueceu de entregar e a mesma passou do prazo, não tem importância, caso você tenha matado todos os monstros até 09/01 20:00 Hrs, você poderá entregar está Task em qualquer horário para receber suas Rewards e começar uma task a partir do momento em que você entregou! (INJUSTIÇA AQUI NÃO CARALHO).
     
    [+] Comandos Adicionais [+]
     
    /task -- Mostra as informações da sua Task Atual, como Nome da Task, Level, Rewards, Monstros que você poderá matar, Se tem que entregar algum Item junto, etc...
    /task daily -- É basicamente mostra a mesma informação da Task Principal, porém mostra também qual o prazo limite para entrega da task.
    /task counter -- É um comando que ATIVA ou DESATIVA o contador de monstros mortos na task no seu Channel.
     
    [+] Imagens [+]
     
    Cline neste link para ver algumas imagens da Task : http://imgur.com/a/eLIY3
     
     
     
    ------------------------------------------------ // --------------------------------------------------------------
     
    [+] Instalação do Sistema [+]
     
    Requisitos: Nível Médio de conhecimento em scripting LUA
     
    Pasta Mods
     
    Simple Task.xml
     
    https://pastebin.com/raw/P5hqMC3j
     
    NPC:
     
     
    Ludger.xml
     
    https://pastebin.com/raw/R56yLWHw
     
    simple_task.lua
     
    https://pastebin.com/raw/1mRzJ6aJ
     
    ---------------------------------------------- // ----------------------------------
     
    [+] configuração [+ ]
     
    Task System Principal
     
    task_sys = { [1] = {name = "Trolls", start = 176201, monsters_list = {"Troll","Troll champion"}, level = 8, count = 40, points = 0, items = {}, reward = {}, exp = 2000, money = 2000} }  
    [1]  --> O número entre os colchetes [] significa a ordem da Task, como a Task é por progresso sempre começará no 1 e irá pro [2], assim sucessivamente.
    name --> É o nome da task que o jogador irá fazer.
    start --> é a storage que indicará se o jogador começou a Task
    monster_list ={} --> É o nome dos monstros em que o jogador deverá caçar para completar a Task
    level --> É o level necessário para dar inicio á Task
    count --> É o número de monstros que o jogador tem que matar para completar a Task
    points --> Aqui determinada quantos Task points o jogador irá receber ao completar a Task
    items = {} --> Aqui determinada se além de matar os monstros, o jogador terá que entregar item também! Caso tenha só colocar o {ITEM_ID, QUANTIDADE} EX:
    items = {{2173,1},{2160,10},{2493,2}} rewad --> Aqui determinada se o jogador irá receber itens ao terminar a Task, mesma formula do items /\
    reward = {{2520,1},{2173,1}} exp --> Se o jogador irá receber Exp ao terminar a task. 0 ou quantidade de exp
    Money --> Se o jogador irá receber dinheiro ao terminar a task. 0 ou quantidade de dinheiro
     
     
    Daily Task System
     
    daily_task = { [1] = {name = "Orcs" ,monsters_list = {"Orc Berserker","Orc Rider","Orc Leader","Orc Warlord"}, count = 100, points = 0, reward = {}, exp = 5000, money = 10000} }  
    Segue o padrão da Task original, exceto que não precisa entregar items para o npc!
     
    Como funciona A randomização de level de acordo com a Daily task?
     
    Procure por está tabela em MODS
     
    local t = { [{6,49}] = {1,3}, [{50,79}] = {4,6}, [{80,129}] = {7,9}, [{130,math.huge}] = {10,12} }  
    entre as chaves e colchetes é o level do jogador para as Daily Task, Você pode adicionar quantas você quiser!
     
    Digamos que:
     
    [{6,49}] = {1,3}  --> Quer dizer que entre o level 6 ao 49 o jogador poderá cair na Daily Task número 1(Orcs), 2(Tarantulas) ou 3(Wyvern)!
    [{50,79}] = {4,6} --> Quer dizer que entre o level 50 ao 79 o jogador poderá cair na Daily Task número 4(Dragons), 5(Wailing Widows) ou 6(Ancient Scarabs)!
    ...
    [{130,math.huge}] = {10,12} --> Quer dizer que o jogador level 130 ou MAIS poderá cair na Daily Task número 10(Undead Dragons), 11(HydraS) ou 12(Ghastly Dragons)!
     
     
    Look Rank System
    Procure por está tabela em MODS
     
    local ranks = { [{1, 20}] = "Huntsman", [{21, 50}] = "Ranger", [{51, 100}] = "Big Game Hunter", [{101, 200}] = "Trophy Hunter", [{201, math.huge}] = "Elite Hunter" }  
    Entre 1-20 Task points o Rank será Huntsman
    Entre 21-50 Task posints o Rank será Ranger
    Entre 51-100 Task Points o rank será Big Game Hunter
    etc...
    Altere como quiser!
     
     
  23. Upvote
    Wakon got a reaction from Micael Pk in Sistema de Addon   
    Pra quem não entendeu a parte do goback.lua:
    Vá até o final do script, lá vocês encontrarão doPlayerSendCancel(cid, "This pokemon is fainted.") e logo acima um "else", ai é só colar o código acima do "else".
    local pk = getCreatureSummons(cid)[1] local pb = getPlayerSlotItem(cid, 8).uid local look = getItemAttribute(pb,"addon") if not look then doSetItemAttribute(pb,"addon",0) return false end if look > 0 then doSetCreatureOutfit(pk, {lookType = look}, -1) return true end  
  24. Like
    Wakon got a reaction from ericles in Modificar Client, Ajuda!   
    A única maneira de customizar o client do Tibia é editando pelo Hex Editor, creio eu.
    Para isso você pode utilizar o XVI32: 
    http://www.handshake.de/user/chmaas/delphi/download/xvi32.zip
     
    1 - Abra o XVI32, clique em File/Open... e selecione o executável do Tibia.
    2 - Aperte CTRL + F, selecione Text String e coloque o que você quer editar ( Exemplo: Magic Level )
    3 - Ai quando encontrar você tem que substituir as letras (Exemplo: Magia Level), para apagar o Level você deve apertar espaço, ou trocar o valor da esquerda na tabela de Hexadecimal por 00.
     
    Cuidados:
    Não pode deletar NADA, absolutamente NADA, se você apertar backspace e deletar algum character, vai bugar e o cliente não vai abrir mais!
    Você só pode substituir as letras, não pode dar um tamanho a mais, como não pode deletar não pode aumentar também!
    Exemplo: Magic Level para Magia do Personagem, vai bugar o cliente!
     
    É isso, tem um Tibia 8.60 meu que eu traduzi, se quiser tirar algumas ideias, apesar que as novas versões tem certas limitações se não me engano!
    http://www.tibiaking.com/forum/topic/51473-cliente-860-traduzido/
  25. Like
    Wakon got a reaction from ericles in Modificar Client, Ajuda!   
    A única maneira de customizar o client do Tibia é editando pelo Hex Editor, creio eu.
    Para isso você pode utilizar o XVI32: 
    http://www.handshake.de/user/chmaas/delphi/download/xvi32.zip
     
    1 - Abra o XVI32, clique em File/Open... e selecione o executável do Tibia.
    2 - Aperte CTRL + F, selecione Text String e coloque o que você quer editar ( Exemplo: Magic Level )
    3 - Ai quando encontrar você tem que substituir as letras (Exemplo: Magia Level), para apagar o Level você deve apertar espaço, ou trocar o valor da esquerda na tabela de Hexadecimal por 00.
     
    Cuidados:
    Não pode deletar NADA, absolutamente NADA, se você apertar backspace e deletar algum character, vai bugar e o cliente não vai abrir mais!
    Você só pode substituir as letras, não pode dar um tamanho a mais, como não pode deletar não pode aumentar também!
    Exemplo: Magic Level para Magia do Personagem, vai bugar o cliente!
     
    É isso, tem um Tibia 8.60 meu que eu traduzi, se quiser tirar algumas ideias, apesar que as novas versões tem certas limitações se não me engano!
    http://www.tibiaking.com/forum/topic/51473-cliente-860-traduzido/

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...