Ir para conteúdo

Líderes

Conteúdo Popular

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

  1. Alfa-Baiak mapa completo

    cs007 e 2 outros reagiu a Elitondeveloper por uma resposta no tópico

    3 pontos
    Venho disponibilizar para vocês gratuitamente o servidor Alfa-Baiak, que atualmente está online com 250+ players. Algumas imagens em anexo! Totalmente Completo e de graça !! Façam bom proveito para seus projetos !! Informações Várias Quests 4 sistemas de Vip 1 donate hunts para level 620+ Caves exclusivas novos itens! Muita jogabilidade Vocações balancedas Magias Balanceadas Sem Bugs Eventos Battle Field Capiture a Bandeira Defesa das torres Fire Storm Zombie Ataque SnowBall War War Anti-Entrosa Castle 24hrs Castle War Exp e Rates Exp inicial: 700x | (stages) Magic Rate: 10.0x | Skill Rate: 25.0x | Loot Rate: 8.0x Versão online para verificarem ! Site: http://alfa-baiak.com/ Ip: alfa-baiak.com Versão: 8.60 Download: Download COMPLETO+SOURCE Scan: Virus total Créditos: Gabriel Correa
  2. Esse sistema foi feito utilizando a source disponibilizada neste link Pode funcionar em TFS 0.4, OTX 2.X e, talvez, em TFS 0.4 só que a probabilidade erros é maior por ter diferentes nomes de funções e variáveis. Fiz um vídeo seguindo o passo a passo abaixo para facilitar o processo de instalação do sistema. 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.weaponType == WEAPON_DIST && it.ammoType != AMMO_NONE) { begin = false; s << " (Range:" << int32_t(item ? item->getShootRange() : it.shootRange); if(it.attack || it.extraAttack || (item && (item->getAttack() || item->getExtraAttack()))) { s << ", Atk " << std::showpos << int32_t(item ? item->getAttack() : it.attack); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; } if(it.hitChance != -1 || (item && item->getHitChance() != -1)) s << ", Hit% " << std::showpos << (item ? item->getHitChance() : it.hitChance) << std::noshowpos; } else if(it.weaponType != WEAPON_AMMO && it.weaponType != WEAPON_WAND) { if(it.attack || it.extraAttack || (item && (item->getAttack() || item->getExtraAttack()))) { begin = false; s << " (Atk:"; if(it.abilities.elementType != COMBAT_NONE && it.decayTo < 1) { s << std::max((int32_t)0, int32_t((item ? item->getAttack() : it.attack) - it.abilities.elementDamage)); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; s << " physical + " << it.abilities.elementDamage << " " << getCombatName(it.abilities.elementType); } else { s << int32_t(item ? item->getAttack() : it.attack); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; } } if(it.defense || it.extraDefense || (item && (item->getDefense() || item->getExtraDefense()))) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Def:" << int32_t(item ? item->getDefense() : it.defense); if(it.extraDefense || (item && item->getExtraDefense())) s << " " << std::showpos << int32_t(item ? item->getExtraDefense() : it.extraDefense) << std::noshowpos; } } 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
  3. OtClient V8 - Sources

    Bruno111111111111111 reagiu a Cat por uma resposta no tópico

    1 ponto
    OTClient V8 OTClientV8 é um mecanismo de jogo 2D altamente otimizado, baseado em blocos, construído com c ++, lua, physfs, OpenGL ES 2.0 e OpenAL. Funciona hem, mesmo em computadores com 12 anos de uso. Funciona em Windows (min. Windows 7), Linux e Android (min. 5.0). V8 NOVIDADES • Renderização reescrita e otimizada (60 fps em um computador de 11 anos) • Melhor suporte ao DirectX9 e DirectX11. • Renderização adaptável (otimizações gráficas automatizadas) • Renderização de luz reescrita e otimizada • "Path finding" e "auto walking" reescritos. • "Walking system" reescrito com animações. • HTTP/HTTPS lua API com suporte à JSON. • API WebSocket lua. • Auto updater com modo de recuperação. • Novo sistema de arquivos • Criptografia e compactação de arquivos • Sistema de diagnóstico automático • Interface atualizada • Novo manipulador de "crash" e "error". • Novo protocolo de login HTTP • Loja no jogo (mesma do tibia). • Gerenciador de "hotkeys" atualizado. • "Battle list" otimizada e atualizada. • "Crosshair" (mira), "floor fading", barras de hp/mp extras e painéis. • Muitas outras opções de clients. • Removido muitas coisas inúteis e desatualizadas • Bot Avançado • Versão Linux. • Suporte completo para tibia 11.00 • Layouts Download Oficial: Link Download Tk: otclientv8-master.rar Contribua no Github: https://github.com/OTCv8/otclientv8/issues IMAGENS: Créditos: Edubart
  4. Problema ao criar site

    luizjoy reagiu a Koetejiraya por uma resposta no tópico

    1 ponto
    O script tem que ser colocado dentro de código e spoiler para poder ver melhor. Porque o próprio site do tibia king as vezes remove alguns sinais como >;,.}{][)(< então fica impossivel trabalhar com o script assim. Coloca pra mim fazendo um favor, porque no final ficou bagunçado cortando partes do seu script.
  5. Alfa-Baiak mapa completo

    DiigooMix reagiu a Elitondeveloper por uma resposta no tópico

    1 ponto
    Qualquer gesior aqui do fórum, indico o do Natanael bem feito e com proteção anti sql injection, etc. Cast system na source
  6. Problema ao criar site

    luizjoy reagiu a Koetejiraya por uma resposta no tópico

    1 ponto
    Ok, nós vamos resolver seu problema. Poste o seu arquivo lastnews.php, fazendo um favor.
  7. (Resolvido)Erro item editor

    Kill of sumoners reagiu a Koetejiraya por uma resposta no tópico

    1 ponto
    Esse iten editor não suporta tibia.dat e tibia.spr extendido, tem qeu usar aqueles basicão mesmo. Faz um seguinte, baixa o tibia na versão do seu server, pega o dat e o spr joga na pasta e então abre o programa. Se o programa abrir você deixa o tibia.spr onde está e atualize apenas o tibia.dat pelo seu que funciona certinho.
  8. Problema ao criar site

    luizjoy reagiu a Aksz por uma resposta no tópico

    1 ponto
    Olá, bom dia tudo bem? Antes de mais nada, deixe-me perguntar, qual versão do xampp/php você está usando ?
  9. (Resolvido)SETAR STORAGE PHPMYADMIN

    Freitas Epilef reagiu a Koetejiraya por uma resposta no tópico

    1 ponto
    será setado no player declarado no script, você tem que declarar ele antes, seja sendo puxado pelo nome ou pelo id. exemplo de declaração. $playerteste = new Player(); $playerteste->setStorage(5000,1);
  10. Problema ao criar site

    luizjoy reagiu a Koetejiraya por uma resposta no tópico

    1 ponto
    Poste a Linha 11 do seu arquivo latestnews.php Fazendo um favor.
  11. Lista de personagens carregando, Linux!

    ITALOx reagiu a Balkalima por uma resposta no tópico

    1 ponto
    Hmm, interessante, vou dar uma olhada de novo, se tiver alguma dúvida posso te chamar aqui pelo TK? My bad! Obrigado pelo aviso, grato! ?
  12. Achei, deu certo. Caso alguém esteja vendo esse topico e com a mesma dúvida que eu, segue o link do tutorial. Credito todo do @Nolis Tutorial perfeito.
  13. @DiigooMix sim mas precisa ser editado manualmente entre no perfil do @Nolis ele tem diversos tutoriais de como editar e deixar as paletas do seus rme da maneira que desejar
  14. 1 ponto
    1 - Alguém sabe um server mais puro possível? para fazer a limpeza? - Como você está pensando em 8.6, pega um tfs 0.4 rev 3884. Não tem muitos scripts e é só você ir removendo. 2 - como adiciono o cliente OTC no server 8.6 - Basta criar uma pasta "860" dentro do diretório things do otclient e acessar. 3 - a adição de itens e sprites é feita pelo objectitem? - Vai precisar de um editor de tibia.dat e tibia.spr. Eu sugiro o ObjectBuilder. Da um google que você acha com scan e etc.., mas pode ficar tranquilo que não tem vírus. 4 - Tenho que fazer todas as edições e depois compilar o server (criar o tfs)? - A princípio o tfs já vem compilado para você. Só precisa compilar caso você queira fazer alguma edição que não seja possível fazer com as funções que o TFS proporciona. 5 - como adiciono tais coisas editadas no meu client (que eu quero q seja o OTC) - Eu acho bem chatinho de fazer e não tenho muito conhecimento. Confesso que encontrar conteúdo disso é meio chato, mas você pode ir estudando as estruturas dos componentes que já existem no OTC original e criar os seus a partir deles. 6 - Essa é uma boa versão para este tipo de coisa? se não qual recomendariam? - O tfs 0.4 rev 3884 é um dos mais completos que tem. Hoje em dia estou usando o TFS 1.2 e digo que sinto falta de algumas funções que tinham na versão antiga.
  15. GesiorACC 2019 8.60 UPDATE 29/06/2019

    Nerivalhs reagiu a brunonyyu por uma resposta no tópico

    1 ponto
    Use este latestnews, é o mesmo porem ja sem o bug, se continuar é alguma informação com a sua database que nao esta batendo latestnews.php
  16. 1 ponto
    @Fabian Marzan depende de alguns fatores mas pode ser por verificações de storage por tempo na spell e mudar a storage ou aumentar o valor de uma mesma storage no buff sendo assim Buff: a cada momento que troca o efeito/outfit ele aumenta o valor da storage para +1 ou troca para um outro valor de storage Spell: verificação de storage a cada storage diferente ele manda um efeito diferente ao usar a spell
  17. Erro com function IF

    gnomoffc reagiu a Storm por uma resposta no tópico

    1 ponto
    @gnomoffc function onCastSpell(cid, var) if getPlayerMaxMana(cid) == getPlayerMana(cid) then doPlayerSendCancel(cid, "Sua mana está cheia.") doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) return false else doPlayerAddMana(cid, 1) doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE) return true end end O erro estava nessa linha: if getPlayerMaxMana(cid) = getPlayerMana(cid) then Para comparar se dois valores são iguais, o correto a se usar é o "==". O correto seria: if getPlayerMaxMana(cid) == getPlayerMana(cid) then
  18. Spells- Troca do Outfit e Effects

    DATA Vinny reagiu a Stigal por uma resposta no tópico

    1 ponto
    Boa noite @Fabian Marzan , tudo bom? Segue o exemplo para estudo e utilização:
  19. Modificando Extensions I - Grounds (Terrain Palette)

    lusgo reagiu a Cat por uma resposta no tópico

    1 ponto
    Extensions Customizadas II - Walls Extensions Customizadas I - Grounds Extensions Customizadas III - Doodads (objetos montados) Sumário A. Escolha do item e arquivos que serão alterados. B. Edição do arquivo grounds.xml e adição da base para um novo brush. C. Explicação sobre o que modificar nas linhas adicionadas. D. Edição do arquivo borders.xml e adição da base para as bordas do brush anterior. E. Configuração dos Ids das bordas e do brush. F. Cadastramento do brush na paleta terrain, editando o arquivo tilesets.xml COMEÇAR (Dica: Utilize Notepad++) A. Tudo que está em azul nas imagens acima é onde você vai clicar e/ou editar. Recomendo backup. Cuidado para não modificar qualquer linha por acidente ou sem saber o que está fazendo, uma letra errada já é o suficiente pra dar erro na hora de abrir o mapa. Escolha o piso que você quer adicionar. Vou escolher o dark spikes para usar como exemplo, ok? (na imagem, ele já está pronto e adicionado na paleta) B. Abra grounds.xml. Repare que o documento começa com <materials> e termina com </materials> Desça até o final do código. Antes do </materials> há algum item cadastrado, um </brush> Alguma coisa ... </brush>. Após o último brush, e antes do </materials>, cole o seguinte código: <brush name="ITEMNOME" type="ground" server_lookid="ITEMID - ID PRA APARECER NA PALETA" z-order="NUMERO"> <item id="ID" chance="100"/> <item id="ID" chance="100"/> <item id="ID" chance="100"/> <item id="ID" chance="100"/> <border align="outer" id="NUMEROBORDA"/> </brush> C. Server_lookid é pra por o ID da sprite que vai aparecer na paleta, pra identificar o atalho. Coloque o ID do ground principal caso tenha mais versões do mesmo. Em Z-order, se o brush X tiver z-order maior que brush Y, a borda de brush X vai sobrepor a do Y. Item Id e chances, adicione os grounds e mude o valor da chance para definir qual deles vai predominar caso houver vários, como por exemplo o grass, que tem diversas sprites diferentes. Se for apenas uma sprite, pode deixar uma linha. Border align, tem outer e inner. São para as duas finalidades apresentadas nas imagens abaixo. (No inner dessa imagem, fora utilizado <border align="inner" to="none" id="1"/>, que é padrão para vários brushs) O codigo do Dark Spikes ficará assim: <brush name="dark spikes" type="ground" server_lookid="12234" z-order="3200"> <item id="12234" chance="2500"/> <item id="12235" chance="2500"/> <item id="12236" chance="2500"/> <item id="12237" chance="2500"/> <border align="outer" id="155"/> </brush> D. Revise o que você modificou e salve. Abra borders.xml. O esquema é o mesmo, desça até o final e depois de </border> e antes de </materials>, adicione o código abaixo: <border id="NUMEROBORDA"> -- NOME -- <borderitem edge="n" item="ID"/> <borderitem edge="e" item="ID"/> <borderitem edge="s" item="ID"/> <borderitem edge="w" item="ID"/> <borderitem edge="cnw" item="ID"/> <borderitem edge="cne" item="ID"/> <borderitem edge="csw" item="ID"/> <borderitem edge="cse" item="ID"/> <borderitem edge="dnw" item="ID"/> <borderitem edge="dne" item="ID"/> <borderitem edge="dsw" item="ID"/> <borderitem edge="dse" item="ID"/> </border> E. O número que estiver em border id vai servir para ligar essass bordas ao brush criado anteriormente. Identifique o nome do brush a qual essa borda pertence para ficar fácil encontrar mais tarde ( -- exemplo -- ) Siga a tabela abaixo para configurar as bordas, conforme a posição delas: O código das bordas do dark spikes ficará assim: <border id="155"> -- dark spikes border -- <borderitem edge="n" item="12255"/> <borderitem edge="e" item="12256"/> <borderitem edge="s" item="12254"/> <borderitem edge="w" item="12257"/> <borderitem edge="cnw" item="12264"/> <borderitem edge="cne" item="12265"/> <borderitem edge="csw" item="12263"/> <borderitem edge="cse" item="12262"/> <borderitem edge="dnw" item="12260"/> <borderitem edge="dne" item="12261"/> <borderitem edge="dsw" item="12259"/> <borderitem edge="dse" item="12258"/> </border> F. Agora que o ground foi criado e as bordas configuradas, é preciso adicionar o atalho na paleta, para poder usá-lo. Abra tilesets.xml. Dê um ctrl + f e procure por: <tileset name="Nature"> em terrain. Ou no local que você preferir. Também pode colocar na ordem que quiser, reinicie o editor e teste. Dúvidas? Comente.
  20. 1 ponto
    Vou dar uma breve explicação (se quiser mais detalhes pode vir pm): Antigamente, existiram dois grandes servidores de poketibia: SVKE e PAdventures. Não vou entrar muito em detalhes sobre eles porque tem controvérsias, mas resumindo: a comunidade participou e participa ativamente nas "ideias inovadoras" desses servidores de poketibias considerados grandes (as conversas com npc pelo botão direito, que foi popularizada pela pxg, por exemplo, pode ser encontrada disponível na otland). O que se tem na comunidade hoje em dia é: PDA: sem source, só tem a distro compilada (ou seja, bugs não poderão ser resolvidos), é a mais avançada em relação a sistemas, mas grande parte deles tem bugs ou foram implementados com gambiarras em lua que quase ninguém entende (nem tente entender elas, tu só vai ter dor de cabeça) Pokémon Dash: tem a source (pode resolver os bugs), muiiitas gambiarras em lua e sistemas defasados ou falta deles (tu consegue consertar tudo) Pokémon Flash: porra, isso é antigo demais SAHUSAHUSUHA, só ignora. Pra ti ter noção, algumas distros do pokémon flash nem moves (m1, m2 etc) tem. Tendo informação disso tudo, tu chega na seguinte conclusão: pra ti partir de qualquer base disponível na comunidade tu vai precisar estudar as gambiarras e sistemas dela na unha, já que grande parte da documentação foi perdida (por estar no xtibia ou pelos links terem ficado off). Outro comentário cabível é que: essas bases foram baseadas na versão 0.3.6 do theforgottenserver. Essa versão foi lançada em 2010. O código fonte em geral não usa açúcar sintático, é bagunçado, usa convenções antigas etc, além de ter vários bugs conhecidos (por ser antiga). Na minha singela opinião, se tu tiver conhecimento e quiser algo sério e que tu compreenda totalmente o funcionamento, faça o seguinte: vá no github do theforgottenserver, baixe a última versão (1.3), estude ela (tem a otland e a wiki no próprio github pra isso) e altere as sources para adaptar a um poketibia.
Líderes está configurado para São Paulo/GMT-03:00

Informação Importante

Confirmação de Termo