Histórico de Curtidas
-
quemtuacha deu reputação a WooX em SPELL QUE BLOQUEIA MAGIAS DO TARGETNão testado.
--<event type="cast" name="blockSpell" event="script" value="block_spell.lua"/> function onCast(cid) if isPlayer(cid) and getPlayerStorageValue(cid, 4570) > os.time() then return false end return true end --[[ <instant name="Block Spell" words="petrificus totalus" lvl="50" mana="200" range="3" blockwalls="1" needtarget="1" exhaustion="2000" needlearn="0" event="script" value="block_spell.lua"> <vocation id="1"/> <vocation id="2"/> </instant> ]] local blockTime = 5 -- Segundos local function unregisterEvent(target) if isPlayer(target) then if getPlayerStorageValue(target, 4570) < os.time() then unregisterCreatureEvent(target, "blockSpell") else addEvent(unregisterEvent, (getPlayerStorageValue(cid, 4570) - os.time()) * 1000, target) end end end local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) function onCastSpell(cid, var) local target = isPlayer(var.number) and var.number or getCreatureTarget(cid) if not isPlayer(target) then doPlayerSendCancel(cid, "Somente jogadores sao afetados por essa spell.") return true end setPlayerStorageValue(target, 4570, os.time() + blockTime) registerCreatureEvent(target, "blockSpell") addEvent(unregisterEvent, blockTime * 1000, target) return doCombat(cid, combat, var) end
-
quemtuacha deu reputação a FeeTads em Correções gesior/myacc + configurações + proteções (ddos?)Salve rapaziada do TK e da comunidade de tibia Otserv.
Recentemente alguns invejosos estão atacando servidores (DDoS), bugando o guilds de varios sites (tirando o lider e membros), assim buga a guild e muita coisa no OT.
Eles vão até o teu servidor e se passam por "adm do deletebra", já ouvi a uns tempos algumas pessoas falando disso, mas como eu tinha contato isso caiu por terra facilmente, um deles foi o ADM brendo, dono do antigo strongerFusion, onde ele me contou toda essa história, essa foi a primeira vez que me foi relatado sobre isso, hoje vejo que está parecendo ser mais frequente.
Caso qualquer pessoa entre no seu OT se passando pelo ADM do deletebra, favor entrar em contato comigo via discord: FeeTads#0246 Te ajudarei a resolver problemas que eles exploram sem cobrar nada por isso, para provar que não necessito atacar outros OT's para ter algum publico. Já tenho em mente quem pode ser essas pessoas, caso alguém tenha numero de telefone, nome real, ou alguma informação a mais dessas pessoas atacando e se passando por mim ou meu sócio, favor enviar no discord, irei atrás de resolver isso.
Vou deixar aqui alguns tutoriais de coisas básicas para você conseguir proteger o seu site desses SQL injections, e mais algumas coisinhas, caso futuramente eu resolva outros bugs explorados, vou postar aqui as correções.
Configurando CloudFlare (SSL) E subDominio (sv.seuIP)
Após isso para que a pessoa não entre no site pelo (sv.seudominio.com.br)
abra o index.php da pasta raiz (está dentro da pasta html)
if($_SERVER['HTTP_HOST'] == 'sv.seuDominio.com.br') { header("Location: https://seuDominio.com.br"); } if($_SERVER['HTTP_HOST'] == 'IP NUMÉRICO') { header("Location: https://seuDominio.com.br"); }
Isso fará que quando a pessoa tente entrar no seu site usando meios não seguros (DNS only) ele redirecione pro seguro > proxiado pela cloudflare
_________________________________________________________________________________________________________________________________________
CORREÇÃO GUILDS.PHP / INJECTION SQL TIRANDO LIDER DA GUILD
PROTEÇÕES PARA DIMINUIR EFEITOS DE DDoS
Espero que isso ajude a muitos, a se prevenir de pessoas que tentam atacar OT's se passando por outros, ou até que vão la pedir pontos para jogar se não eles irão atacar, se prevenir de pessoas mal intencionadas.
PS: Caso você tenha no seu site a pagine "house" e "tickets" recomendo retirar do seu site, pois há maneira de injetar SQL por esses arquivos.
Vou postar em breve o tickets arrumado.
Boa sorte rapaziada, se cuidem, e caso alguém faça isso, por favor entre em contato comigo.
-
quemtuacha recebeu reputação de Maahzeera em Spell Fast Attack (Efeito no Target)deve funcionar:
local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, COLOR_LIGHTGREEN) setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, 70) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -35.0, 0, -40.5, 0) function onTargetCreature(cid, target) local position = {x = getThingPosition(target).x+0, y = getThingPosition(target).y+0, z = getThingPosition(target).z} -- aqui configura a posição do efeito doSendMagicEffect(position, 31) -- aqui muda o efeito ao acertar o player end setCombatCallback(combat1, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") local function onCastSpell1(parameters) if isCreature(parameters.cid) and getCreatureTarget(parameters.cid) then return isCreature(parameters.cid) and doCombat(parameters.cid, parameters.combat1, parameters.var) end end function onCastSpell(cid, var) local parameters = {cid = cid, var = var, combat1 = combat1} for k = 1, 7 do addEvent(function() if isCreature(cid) then addEvent(onCastSpell1, 1, parameters) end end, 1 + ((k-1) * 225)) end return true end
-
quemtuacha deu reputação a Movie em Gerenciador de Quests [TFS 0.X e TFS 1.X]Fala pessoal, como vocês estão?
Na academia de codding um usuário pediu ajuda para montar um "gerenciador" de quests, para que todas ficassem no mesmo arquivo sem ficar com aquele "spam" de quests nas actions.
Esse script foi feito para a TFS 1.X mas, usando a lib do @Mathias Kenfi, você consegue utilizar para TFS 0.X também.
O link para as libs: https://github.com/kenfi2/KenfiLib
Na pasta actions/scripts crie um arquivo chamado quests.lua
config = { quests = { [7172] = { -- ActionID que será colocado no baú name = "dos Crystal Coins", -- Nome da quest rewards = { {id = 2160, count = 100}, -- Prêmio: ID - Count }, level = { active = true, -- Level minimo para pegar? min = 150, -- Se true, qual o minimo }, storage = { active = true, -- Player poderá pegar somente uma vez? key = 91143, -- Apenas uma key por quest }, effectWin = 30, -- Efeito que vai aparecer quando fizer a quest }, [7171] = { -- ActionID que será colocado no baú name = "dos Coins", -- Nome da quest rewards = { {id = 2160, count = 100}, -- Prêmio: ID - Count {id = 2152, count = 100}, -- Prêmio: ID - Count }, level = { active = true, -- Level minimo para pegar? min = 150, -- Se true, qual o minimo }, storage = { active = true, -- Player poderá pegar somente uma vez? key = 91140, -- Apenas uma key por quest }, effectWin = 29, -- Efeito que vai aparecer quando fizer a quest }, }, messages = { notExist = "Essa quest não existe.", win = "Você fez a quest %s.", notWin = "Você já fez a quest %s.", level = "Você precisa de level %d ou maior para fazer a quest %s.", }, } function onUse(cid, item, fromPosition, target, toPosition, isHotkey) local player = Player(cid) local choose = config.quests[item.actionid] if not choose then player:sendCancelMessage(config.messages.notExist) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end if choose.level.active and player:getLevel() < choose.level.min then player:sendCancelMessage(config.messages.level:format(choose.level.min, choose.name)) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end if choose.storage.active and player:getStorageValue(choose.storage.key) >= 0 then player:sendCancelMessage(config.messages.notWin:format(choose.name)) player:getPosition():sendMagicEffect(CONST_ME_POFF) return true end for i = 1, #choose.rewards do player:addItem(choose.rewards[i].id, choose.rewards[i].count) end player:setStorageValue(choose.storage.key, 1) player:sendCancelMessage(config.messages.win:format(choose.name)) player:getPosition():sendMagicEffect(choose.effectWin) return true end Para configurar é só utilizar ler os comentários deixados e para adicionar mais quests apenas use o mesmo padrão que deixei aí
Utilize a tag no actions.xml desse forma
<action fromaid="7171" toaid="7172" script="quests.lua" /> Sendo que o "fromaid" é a actionid inicial, e o "toaid" é a última actionid registrada no arquivo.
Qualquer problema, relate nesse tópico.
-
quemtuacha recebeu reputação de vitinhoo96 em Alguem me ajuda com o Castcria uma conta com o nome de usuário 10, deixa ela sem nenhum personagem.
-
quemtuacha recebeu reputação de vitinhoo96 em Alguem me ajuda com o CastCria uma nova conta no seu ot, coloca o nome de usuario 10 e deixa ela sem nenhum personagem. O cast so vai funcionar depois que criar a conta.
-
quemtuacha recebeu reputação de vitinhoo96 em Alguem me ajuda com o Castdeixa qualquer coisa
-
quemtuacha recebeu reputação de luizsommer em [8.60][OLD Client] Narutibia (NTO HARD) - Servidor CompletoTheOTXServer.exe
-
quemtuacha deu reputação a Mathias Kenfi em [Novos Atributos] Critical/Dodge/Life e Mana Leech/Life e Mana AbsorbEsse 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
-
quemtuacha recebeu reputação de Victor Cain J em [8.60][OLD Client] Narutibia (NTO HARD) - Servidor Completoeu compilei em 64bits, vc vai precisar do pacote de dll 64bits para executar.
dll64.rar
-
quemtuacha recebeu reputação de chateadoagr em [8.60][OLD Client] Narutibia (NTO HARD) - Servidor Completoeu compilei em 64bits, vc vai precisar do pacote de dll 64bits para executar.
dll64.rar
-
quemtuacha recebeu reputação de Victor Cain J em [8.60][OLD Client] Narutibia (NTO HARD) - Servidor CompletoTheOTXServer.exe
-
quemtuacha recebeu reputação de leozincorsair em [8.60][OLD Client] Narutibia (NTO HARD) - Servidor CompletoTheOTXServer.exe
-
quemtuacha deu reputação a r0bert0lol em [8.60][OLD Client] Narutibia (NTO HARD) - Servidor CompletoOlá galera do TK !
Venho por meio deste tópico, publicar a ultima versão do meu servidor derivado de Tibia NTO Hard juntamente com todos os arquivos necessários para edições.
Confesso que não foi fácil tomar essa decisão, afinal de contas foram mais de 5 anos nessa vida de administrador de otserver e esses arquivos são de muita valia, tenho certeza de que muito do que conquistei e me tornei, é resultante dos servidores que pude administrar. Costumo dizer que não sou programador e que estou mais para um gerente de scripts, todos os meus servidores foram criados com base em arquivos disponibilizados em comunidades como esta, sendo assim, pensei comigo, seria interessante eu disponibilizar e de certa forma contribuir, acredito que esses arquivos ainda podem ser útil para muitos.
O que tem de diferente no NTO Hard ?
Foi feito com muito carinho ! Rs. Eu poderia fazer uma lista (BÍBLIA) do que tem no servidor porém estou sem tempo mas tenho certeza que esse é o servidor NTO mais completo, atual e disponível para ser baixado em qualquer comunidade de otserver.
Veja algumas Imagens !
O que tem nesse Pacote Full de Arquivos NTO Hard ?
Datapack mais recente e completa do servidor. Site Gesior com template própria + AntiDDOS. Client Descompilado + Estendido + DLL Manabar com ajuste na altura da Barra de Vida/Chakra + DLL Proteção para extensão.cab Source OTX compatível com o servidor CabCreator Item Editor que funciona com o item.otb do server Object Builder 0.4.1 Remeres Map Editor Estendido para funcionar com o client do server Pic Editor IP Changer
DOWNLOAD & SCAN
dbresetada.sql
-
quemtuacha recebeu reputação de DdJs em Client 8.6 sem limite spr-effect-shoteffectRequisitos para o uso certo:
-Necessário que sua distro já esteja com effects e shoteffecs em uint16.
-Necessário que seu tibia.spr e tibia.dat já esteja estendido.
-
quemtuacha deu reputação a Beeny em Extraindo sprite (pokepro, otpoke, etc)eae, se n me engano esse rolê não funciona no gla/pxg. mas, tem outros jeitos de pegar lá tb
links:
ninjaripper - https://gamebanana.com/tools/download/5638
dds converter - http://www.softsea.com/download/DDS-Converter.html
scan:
ninja ripper - https://www.virustotal.com/gui/file/60541e6a43661f0ee2e70c0a7cedb86d44a874e5376949db7a2e1f604fa5cdf1/detection
dds - https://www.virustotal.com/gui/file/611d6bbb534b8a3210b2ca1e7954d6abc3055c6f2995833fbb04b6093f418263/detection
-
quemtuacha recebeu reputação de ricksi2012 em Source 0.3.6SOURCE 0.3.6
Oque foi adicionado de novo nessa source:
* Attack speed baseado no skill Fist.
*Opcodes.
*Função onMoveItem.
*Fix House bug.
*Fix Elfbot clone Npc.
*Limite de efeitos em 681.
*aumentado limite de shooteffects.
*Vida e Mana em porcentagem.
*Fix doPlayerSave.
*Anti-divulgação.
Scan Sources: https://www.virustotal.com/#/file/f100fee1eb15106cf0e939728b40e49239c59953423fb98d241493dbda2b472e/detection
Scan distro: https://www.virustotal.com/#/file/6c80f3cf9327ff628015a218539ae2675a6f72a7589e6562ba590d8747b32ed5/detection
Download source: http://www.mediafire.com/file/68neltfwryn4b5x/source+0.3.6.rar
Downlaod distro compilada: https://mega.nz/#!rdAlTCAA!YNw2sR49zThaxVpwD7Tbl3Iw8HZ8gHrEnvQBWQ3woLw
creditos:
Crying Damson
Otland
-
quemtuacha recebeu reputação de Savage1G em Need Blue Aura Spritebom, se você reparar, essa de 7 animações estão com frames repetidos, faça a mesma coisa.
-
quemtuacha deu reputação a Nightz em OT Server Ready - Apache + MySQL + phpmyadmin + bibliotecasO OT Server Ready (OSR) é um software básico que desenvolvi juntamente com o apoio da 4YouStart feito para auxiliar aqueles que tem mais dificuldade com a parte de infraestrutura.
Veja funcionando:
Avisos:
O software está em BETA. Em caso de qualquer problema envie uma resposta nesse post. Quero lembrar que qualquer cópia dessa postagem sem a devida autorização não é permitida.
O OSR instala e configura os seguintes softwares/bibliotecas (visão geral):
- Apache2 - php5 - MySQL 5.5 - phpmyadmin - Todas bibliotecas para compilar/rodar um OT Server O sistema suporta os seguintes sistemas operacionais:
Debian 7.x Ubuntu 12.x Ubuntu 14.x Para instalar o OT Server Ready, utilize as seguintes instruções:
Lembrete: utilize-o apenas em um servidor novo, recém formatado.
Para instalar no Debian:
apt-get update apt-get install -y gcc wget http://scripts.4youstart.com/ot-server-ready-debian chmod 777 ot-server-ready-debian ./ot-server-ready-debian SENHA Para instalar no Ubuntu:
apt-get update apt-get install -y gcc wget http://scripts.4youstart.com/ot-server-ready-ubuntu chmod 777 ot-server-ready-ubuntu ./ot-server-ready-ubuntu SENHA Substitua a palavra "SENHA" na última linha da instalação pela senha que deseja utilizar no phpmyadmin e MySQL. Recomenda-se que utilize a mesma senha do que a senha do servidor, mas pode utilizar qualquer uma.
Versão atual do Software:
v0.2 [23/11/2015] Lista de bibliotecas instaladas:
v0.1: apache2 php5 libapache2-mod-php5 php5-mcrypt mysql-client-5.5 mysql-server-5.5 mysql-common libboost-all-dev libgmp3-dev liblua5.1-0 liblua5.1-0-dev liblua50 liblua50-dev liblualib50 liblualib50-dev lua50 lua5.1 libsqlite0-dev libsqlite3-dev sqlite3 libmysql++-dev libmysqlclient-dev libxml2-dev libxml++2.6-dev cpp gcc g++ make automake autoconf pkg-config subversion liblua5.1-sql-mysql-dev liblua5.1-sql-sqlite3-dev zlib1g-dev zlib1g libcrypto++-dev libcrypto++ libcurl4-openssl-dev phpmyadmin v0.2: zip unzip build-essential libboost-dev libwww-perl ccache libboost-filesystem-dev libboost-regex-dev libboost-system-dev libboost-thread-dev libssl-dev Façam bom proveito
Foi anexado ao post o script para ubuntu
ot-server-ready-ubuntu
-
quemtuacha deu reputação a Swiruseq69 em NRTN TemplatePreview
___________________________________________________
Créditos
Azuu
TenTypSwir
___________________________________________________
Scan
https://www.virustotal.com/#/file/580c501a5e3b2aa8f29888873a92660d7b6bdb94f99893cbf1eb73e17b9ade52/detection
Download
nrtn_layout.tgz
-
quemtuacha recebeu reputação de KR3 em [TFS] 0.4 Limite De Efeitos (AJUDA)Esta tendo um problema no fórum, quando você copia alguns texto daqui vem junto uns caracteres especiais, esses caracters estão causando o erro no seu protocolgame.cpp.
-
quemtuacha recebeu reputação de KotZletY em [TFS] 0.4 Limite De Efeitos (AJUDA)Esta tendo um problema no fórum, quando você copia alguns texto daqui vem junto uns caracteres especiais, esses caracters estão causando o erro no seu protocolgame.cpp.
-
quemtuacha recebeu reputação de Kevin Araujo em Taju Bunshinfunction onCastSpell(cid, var)
local from,to = {x=962, y=885, z=7},{x=973, y=892, z=7} -- começo e final do mapa
local from2,to2 = {x=979, y=901, z=7},{x=991, y=905, z=7} -- começo e final do mapa
local cloth = getCreatureOutfit(cid)
local health = getCreatureHealth(cid)
local maxhealth = getCreatureMaxHealth(cid)
local MaximoSummon = 3 --- Maximo de Monstros Sumonados!! No Caso So Posso Sumonar 5 Clones
local summons = getCreatureSummons(cid)
if isInRange(getPlayerPosition(cid), from, to) or isInRange(getPlayerPosition(cid), from2, to2) then
doPlayerSendCancel(cid, "Você não pode usar esse jutsu aqui!") return true
end
if(table.maxn(summons) < MaximoSummon) then -- no summons
local Clone = doCreateMonster("Clone Das Sombras", getThingPos(cid), false, true)
doConvinceCreature(cid, Clone)
setCreatureMaxHealth(Clone, maxhealth)
doCreatureAddHealth(Clone, health)
doSetCreatureOutfit(Clone, cloth, -1)
else
return doPlayerSendCancel(cid, "nao foi possivel!")
end
return doSendMagicEffect(getThingPos(cid), CONST_ME_POFF)
end
-
quemtuacha deu reputação a Swiruseq69 em DBRebirth TemplatePreview
__________________________________________________ _
Credits:
Prawdziwy
Partyzant
Azuu
Parnerzy GAO
__________________________________________________ _
Scan
https://www.virustotal.com/#/file/078300dc9a98f1047f3574020dd5230a933891fe7b20296938f4c7270e72688a/detection
Download
https://www50.zippyshare.com/v/M3Wm1lv5/file.html
-
quemtuacha deu reputação a xWhiteWolf em (Resolvido)Spell para ficar intocavel@skailord, você não pode dar up no tópico dos outros a não ser que tenha passado 24 hrs. Leia as regras
spells\scripts\especiais\invencible.lua
local config = { storage = 3482101, cooldown = 30, --- tempo entre um uso e outro duration = 5, --- duração effect1 = 29 -- efeito que sai ao falar a spell } local outfit = createConditionObject(CONDITION_INVISIBLE, config.duration * 1000, false) function onCastSpell(cid, var) if os.time() - getPlayerStorageValue(cid, 55695) >= config.cooldown then setPlayerStorageValue(cid, 55695, os.time()) doSendMagicEffect(getCreaturePosition(cid), config.effect1) setPlayerStorageValue(cid, config.storage, os.time() + config.duration) doCreatureSay(cid,"UNTOUCHABLE!!!", 19) doAddCondition(cid, outfit) doPlayerSendTextMessage(cid, 27, "You have now ".. config.duration .." seconds of invulnerability.") else doPlayerSendCancel(cid, "Your skill is in cooldown, you must wait "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, 55695))).." seconds.") return false end return true end spells.xml
<instant name="testeTK" words="naruto3" lvl="16" mana="500" prem="1" aggressive="0" exhaustion="1000" needlearn="0" event="script" value="especiais/invencible.lua"> </instant> creaturescripts\scripts\login.lua:
---------- Invencible ---------------- registerCreatureEvent(cid, "invencible") if getPlayerStorageValue(cid, 3482101) ~= 0 then setPlayerStorageValue(cid, 3482101, 0) end creaturescripts.xml:
<event type="statschange" name="invencible" event="script" value="invencible.lua"/> creaturescripts\scripts\invencible.lua
local config = { storage = 3482101, effect1 = 2 --- efeito ao ser atacado estando invulnerável } function onStatsChange(cid, attacker, type, combat, value) if value >= 1 and (type == STATSCHANGE_HEALTHLOSS or (getCreatureCondition(cid, CONDITION_MANASHIELD) and type == STATSCHANGE_MANALOSS)) then if getPlayerStorageValue(cid,config.storage) - os.time() > 0 and isCreature(attacker) then doSendMagicEffect(getCreaturePosition(cid), config.effect1) doSendAnimatedText(getCreaturePosition(cid), "0", 180) return false end end return true end Usei o mesmo storage da outra spell que fiz pra vc uchihagaeshi, mude o storage em todos os scripts ;]