Tudo que Mateus Robeerto postou
-
É possivel retirar sprites do tibia 12x?
É possível sim, mas não se preocupe, está aqui pronto para usar. Os sprites são do 13x que foi downgrage para o 8.6 e ainda estão junto com os items.otb e XML. Fique à vontade para usar, aproveite. Na verdade, peguei o link do cara lá da Otland. https://mega.nz/folder/5FQEnT4R#pAbmAAhpBhmcP1jaVkXm8Q Você precisa usar o programa ObjectBuilder na versão mais recente, ele está disponível aqui também. https://github.com/punkice3407/ObjectBuilder/releases/tag/v0.5.5 Espero ter ajudado. Não se esqueça de marcar como solução e deixar uma reputação positiva. Tenha um bom dia!
-
[OTX2 8.6] Script Trade Points com Erro.
local ItemID = 1964 -- ID do papel function PremmyPoints(item) local points = getItemAttribute(item, "points") if points then return tonumber(points) else return 0 end end function Success(fromplayer, toplayer, points) if getPlayerItemCount(toplayer, ItemID) >= 1 and getAccountPointsTrade(fromplayer) >= points then doAccountRemovePointsTrade(fromplayer, points) doPlayerRemoveItem(toplayer, ItemID, 1) doAccountAddPointsTrade(toplayer, points) doPlayerSendTextMessage(toplayer, MESSAGE_STATUS_WARNING, "Transfer successful, you can now use the " .. points .. " premium points in our site shop!") doPlayerSendTextMessage(fromplayer, MESSAGE_STATUS_WARNING, "Removed " .. points .. " premium points from your account.") return true end end function onTradeAccept(cid, target, item, targetItem) if isPlayer(cid) and isPlayer(target) then if item.itemid == ItemID and targetItem.itemid == ItemID then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You cannot trade points for points, close the current trade and try again.") doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "You cannot trade points for points, close the current trade and try again.") return false end if item.itemid == ItemID then local points = PremmyPoints(item) if getAccountPointsTrade(cid) >= points then addEvent(Success, 1, cid, target, points) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You do not have " .. points .. " premium points to perform this procedure.") doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "The buyer does not have " .. points .. " premium points to perform this procedure.") return false end end if targetItem.itemid == ItemID then local points = PremmyPoints(targetItem) if getAccountPointsTrade(target) >= points then addEvent(Success, 1, target, cid, points) else doPlayerSendTextMessage(target, MESSAGE_STATUS_WARNING, "You do not have " .. points .. " premium points to perform this procedure.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "The buyer does not have " .. points .. " premium points to perform this procedure.") return false end end end return true end function onTradeRequest(cid, target, item) local tabela = {} local black_list = {ItemID} scanContainer(item.uid, tabela) for i = 1, #black_list do if isInArray(tabela, black_list[i]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You cannot place the premmy trade document in this trade, this document can only be used in trades outside containers (bag, backpack, etc).") return false end end return true end tentar
-
Comandos Lua 10.98
Basta dar uma olhada em 'lib/compat/compat.lua'. Lá você encontrará todas as informações sobre as funções. Foi assim que aprendi muito e consegui converter um script do TFS 0.4 para as versões mais recentes do TFS 1x. aqui exemplo: function onUse(cid, item, fromPosition, itemEx, toPosition) local player = Player(cid) -- Obtém o jogador com base no ID passado para a função if player then local itemID = 1234 -- Substitua pelo ID do item que deseja adicionar local quantidade = 1 -- Substitua pela quantidade desejada if player:addItem(itemID, quantidade) then player:sendTextMessage(MESSAGE_INFO_DESCR, "Você recebeu " .. quantidade .. " do item.") else player:sendTextMessage(MESSAGE_INFO_DESCR, "Espaço insuficiente no inventário.") end end return true end
-
[pedido] NPC Refiler
local npcName = "Mercador Vip" local npc_refiller = Action() function npc_refiller.onUse(player, item, fromPosition, target, toPosition, isHotkey) local spawnPosition = player:getPosition() local npcCode = Game.createNpc(npcName, spawnPosition) if npcCode then local despawnTime = 2 * 60 * 1000 addEvent(removeNpc, despawnTime, npcName) end return true end function removeNpc(npcName) local npcTarget = Npc(npcName) if npcTarget then npcTarget:remove() end end npc_refiller:id(10227) npc_refiller:register()
- Baiak Hyper [8.60][TFS 0.3] ~ King-Baiak (atualizado 20/03/23)
-
[Spell] LIFESTEAL - útil
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) local pos = getCreaturePosition(cid) local creatures = getSpectators(pos, 3, 3, false) if creatures then local validTargets = {} for _, target in ipairs(creatures) do if isCreature(target) and (isPlayer(target) or isMonster(target)) then table.insert(validTargets, target) end end if #validTargets > 0 then doCreatureSay(cid, "Prepare to be drained!", TALKTYPE_MONSTER) for _, target in ipairs(validTargets) do local first = getCreatureHealth(target) doCreatureSay(target, "Uh-oh, I'm getting drained!", TALKTYPE_MONSTER) if doCombat(cid, combat, var) == LUA_NO_ERROR then local second = getCreatureHealth(target) local damage = first - second if damage > 0 then local addhealth = damage * 0.5 doCreatureAddHealth(cid, addhealth) doSendAnimatedText(getCreaturePosition(target), "+" .. addhealth, TEXTCOLOR_GREEN) doSendMagicEffect(getCreaturePosition(target), CONST_ME_MAGIC_GREEN) doSendDistanceShoot(getCreaturePosition(target), pos, 40) end end end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo válido encontrado.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo válido encontrado.") end return true end
-
Spell Lifesteal
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) local pos = getCreaturePosition(cid) local creatures = getSpectators(pos, 3, 3, false) if creatures then local validTargets = {} for _, target in ipairs(creatures) do if isCreature(target) and (isPlayer(target) or isMonster(target)) then table.insert(validTargets, target) end end if #validTargets > 0 then doCreatureSay(cid, "Prepare to be drained!", TALKTYPE_MONSTER) for _, target in ipairs(validTargets) do local first = getCreatureHealth(target) doCreatureSay(target, "Uh-oh, I'm getting drained!", TALKTYPE_MONSTER) if doCombat(cid, combat, var) == LUA_NO_ERROR then local second = getCreatureHealth(target) local damage = first - second if damage > 0 then local addhealth = damage * 0.5 doCreatureAddHealth(cid, addhealth) doSendAnimatedText(getCreaturePosition(target), "+" .. addhealth, TEXTCOLOR_GREEN) doSendMagicEffect(getCreaturePosition(target), CONST_ME_MAGIC_GREEN) doSendDistanceShoot(getCreaturePosition(target), pos, 40) end end end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo válido encontrado.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo válido encontrado.") end return true end agora sim... Se você não gostou dessa mensagem, pode remover essa linha xD
-
Spell Lifesteal
vamos tentar aqui: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) local pos = getCreaturePosition(cid) local creatures = {} for _, target in ipairs(getSpectators(pos, -1, -1, false)) do if isCreature(target) and (isPlayer(target) or isMonster(target)) then table.insert(creatures, target) end end if #creatures > 0 then doCreatureSay(cid, "Prepare to be drained!", TALKTYPE_MONSTER) for _, target in ipairs(creatures) do local first = getCreatureHealth(target) doCreatureSay(target, "Uh-oh, I'm getting drained!", TALKTYPE_MONSTER) if doCombat(cid, combat, var) == LUA_NO_ERROR then local second = getCreatureHealth(target) local damage = first - second if damage > 0 then local addhealth = damage * 0.5 doCreatureAddHealth(cid, addhealth) doSendAnimatedText(getCreaturePosition(target), "+" .. addhealth, TEXTCOLOR_GREEN) doSendMagicEffect(getCreaturePosition(target), CONST_ME_MAGIC_GREEN) doSendDistanceShoot(getCreaturePosition(target), pos, 40) end end end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo válido encontrado.") end return true end
-
Spell Lifesteal
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) local target = getCreatureTarget(cid) if target and (isPlayer(target) or isMonster(target)) then local first = getCreatureHealth(target) doCreatureSay(cid, "Prepare to be drained!", TALKTYPE_MONSTER) doCreatureSay(target, "Uh-oh, I'm getting drained!", TALKTYPE_MONSTER) if doCombat(cid, combat, var) == LUA_NO_ERROR then local second = getCreatureHealth(target) local damage = first - second if damage > 0 then local addhealth = damage * 0.5 doCreatureAddHealth(cid, addhealth) doSendAnimatedText(getCreaturePosition(target), "+" .. addhealth, TEXTCOLOR_GREEN) doSendMagicEffect(getCreaturePosition(target), CONST_ME_MAGIC_GREEN) doSendDistanceShoot(getCreaturePosition(target), getCreaturePosition(cid), 40) end end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Nenhum alvo válido encontrado.") end return true end tenta ai! deve funcionar
-
Spell Lifesteal
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) local area = createCombatArea(AREA_CROSS5X5) setCombatArea(combat, area) function onCastSpell(cid, var) local pos = getCreaturePosition(cid) local targets = getCreaturesInArea(pos, area) for _, target in ipairs(targets) do if isCreature(target) then if isPlayer(target) or isMonster(target) then local first = getCreatureHealth(target) doSetCreatureTarget(target, cid) if doCombat(target, combat, var) then local second = getCreatureHealth(target) local damage = first - second if damage > 0 then local addhealth = damage * 0.5 doCreatureAddHealth(cid, addhealth) -- doSendAnimatedText(getPlayerPosition(target), "+"..addhealth.."", TEXTCOLOR_GREEN) -- Você pode enviar um texto animado para cada alvo, se desejar. doSendMagicEffect(getThingPos(target), CONST_ME_MAGIC_GREEN) doSendDistanceShoot(getThingPos(target), getThingPos(cid), 40) end end end end end return true end
-
Spell Lifesteal
function onCastSpell(cid) local target = getCreatureTarget(cid) if target < 1 then doPlayerSendCancel(cid, "You need a target.") return false end local damage = 100 -- Defina aqui o valor do dano que você quer curar, por exemplo, 100 para curar 100% do dano causado. local healthToRestore = (damage / 100) * getCreatureDamage(cid, target) doCreatureAddHealth(cid, healthToRestore) doSendAnimatedText(getThingPos(cid), "+" .. healthToRestore, 25) doSendDistanceShoot(getThingPos(cid), getThingPos(target), 15) doAreaCombatHealth(cid, COMBAT_PHYSICALDAMAGE, getThingPos(target), 0, -damage, -damage * 0.5, CONST_ME_MAGIC_RED) return true end nao sei se vai funcionar kkk!
- [8.0] [TFS 1.2] - Server Global Full [Real Map com quest log em todas as quests e missoes]
-
(Resolvido)Mod Otc V8
game_titles.zip
-
Erro ao usar as eggs de experiência
local potions = { [6542] = {needLevel = 2000, rate = 2.0, duration = 1800}, [6543] = {needLevel = 3000, rate = 3.0, duration = 1800}, [6544] = {needLevel = 4000, rate = 4.0, duration = 1800}, [6545] = {needLevel = 5000, rate = 5.0, duration = 1800}, [2328] = {needLevel = 6000, rate = 6.0, duration = 1800}, [6541] = {needLevel = 7000, rate = 7.0, duration = 1800}, [12599] = {needLevel = 8000, rate = 8.0, duration = 1800}, [8300] = {needLevel = 10000, rate = 10.0, duration = 1800}, } if not expPotions then expPotions = {playerData = {}} end function expPotions:onUse(cid, item, fromPosition, itemEx, toPosition) local itemId = item.itemid local potion = potions[itemId] if not potion then return false end if getPlayerLevel(cid) < potion.needLevel then doPlayerSendCancel(cid, ('Você precisa ser level %d+ para usar esta potion.'):format(potion.needLevel)) return true end local guid = getPlayerGUID(cid) if not self.playerData then self.playerData = {} end local expData = self.playerData[guid][itemId] if not expData then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, 'É necessário relogar para atualizar.') return true end local now = os.time() if expData.duration > now then doCreatureSay(cid, 'Aguarde o bônus atual acabar para usar novamente.', TALKTYPE_ORANGE_1, false, cid) return true end expData.rate = expData.rate + potion.rate expData.duration = potion.duration + now doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_GREEN) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, ('Agora você tem +%d%% de experiência por %s.'):format( potion.rate * 100, string.diff(potion.duration, true) )) doRemoveItem(item.uid, 1) return true end function expPotions:onLogin(cid) local guid = getPlayerGUID(cid) self.playerData[guid] = {} for itemId in pairs(potions) do self.playerData[guid][itemId] = {rate = 0, duration = 0} end return true end function expPotions:getCombo(cid) local playerData = self.playerData[getPlayerGUID(cid)] local potionsCombo = 1 if playerData then for itemId, expData in pairs(playerData) do potionsCombo = potionsCombo + expData.rate end end return potionsCombo end function expPotions:onSay(cid, words, param) local str = 'Experience Potion Combos:\n' local playerData = self.playerData[getPlayerGUID(cid)] if playerData then for itemId, expData in pairs(playerData) do str = str .. ('\n%s - %d%%'):format(getItemInfo(itemId).name, expData.rate * 100) end end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, str) return true end Amigo, na próxima vez que for postar um script com erro ou qualquer outra coisa, é importante informar a versão da TFS para que possamos entender e ajudar mais rapidamente.
-
(Resolvido)[SQLite] -=[TFS]=- 0.4 8.60 Combat Weapon
local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_HOLYDAMAGE) setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_PHYSICALDAMAG) setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_FIREDAMAGE) setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat4 = createCombatObject() setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat4, COMBAT_PARAM_EFFECT, CONST_ME_ICEDAMAGE) setCombatParam(combat4, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat4, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat5 = createCombatObject() setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_POISONDAMAGE) setCombatParam(combat5, COMBAT_PARAM_EFFECT, CONST_ME_POISONDAMAGE) setCombatParam(combat5, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat5, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat6 = createCombatObject() setCombatParam(combat6, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) setCombatParam(combat6, COMBAT_PARAM_EFFECT, CONST_ME_DEATHDAMAGE) setCombatParam(combat6, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat6, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat7 = createCombatObject() setCombatParam(combat7, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat7, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYDAMAGE) setCombatParam(combat7, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat7, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat8 = createCombatObject() setCombatParam(combat8, COMBAT_PARAM_TYPE, COMBAT_DROWNDAMAGE) setCombatParam(combat8, COMBAT_PARAM_EFFECT, CONST_ME_DROWNDAMAGE) setCombatParam(combat8, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat8, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat9 = createCombatObject() setCombatParam(combat9, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) setCombatParam(combat9, COMBAT_PARAM_EFFECT, CONST_ME_LIFEDRAIN) setCombatParam(combat9, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat9, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local combat10 = createCombatObject() setCombatParam(combat10, COMBAT_PARAM_TYPE, COMBAT_MANADRAIN) setCombatParam(combat10, COMBAT_PARAM_EFFECT, CONST_ME_MANADRAIN) setCombatParam(combat10, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WHIRLWINDSWORD) setCombatFormula(combat10, COMBAT_FORMULA_LEVELMAGIC, -5.0, -1000000000, -5.0, -1000000000) local area = createCombatArea({ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0} }) setCombatArea(combat1, area) setCombatArea(combat2, area) setCombatArea(combat3, area) setCombatArea(combat4, area) setCombatArea(combat5, area) setCombatArea(combat6, area) setCombatArea(combat7, area) setCombatArea(combat8, area) setCombatArea(combat9, area) setCombatArea(combat10, area) function onUseWeapon(cid, var) local randomCombat = math.random(1, 10) if randomCombat == 1 then return doCombat(cid, combat1, var) elseif randomCombat == 2 then return doCombat(cid, combat2, var) elseif randomCombat == 3 then return doCombat(cid, combat3, var) elseif randomCombat == 4 then return doCombat(cid, combat4, var) elseif randomCombat == 5 then return doCombat(cid, combat5, var) elseif randomCombat == 6 then return doCombat(cid, combat6, var) elseif randomCombat == 7 then return doCombat(cid, combat7, var) elseif randomCombat == 8 then return doCombat(cid, combat8, var) elseif randomCombat == 9 then return doCombat(cid, combat9, var) else return doCombat(cid, combat10, var) end end
-
[SHOW-OFF] Sistema de Montaria 8.6
Hoje em dia, sem a necessidade de sistemas improvisados ou gambiarras, basta descomentar as linhas na source, e pronto, as montarias funcionam. Isso vale para o TFS 1.5 do Nekiro. Fiz um downgrade do 8.0 para o 7.92 e converti todos os sprites do 13x para o 7.92... TUDO ESTÁ LINDO E PERFEITO... hahaha O TFS 1.5 do Nekiro possui três versões diferentes, incluindo 7.7, 8.6 e 8.0. Para quem quer começar um projeto, recomendo pegar essa base do Nekiro, pois ela é um downgrade baseado na versão 12x para 8.0, 7.7 e 8.60. Espero ter ajudado.
-
Reset System OTX 2
TFS 0.4 combat.cpp procure esta linha. bool Combat::CombatHealthFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) Basta substituir todo o código aqui. bool Combat::CombatHealthFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) { int32_t change = 0; if (Combat2Var* var = (Combat2Var*)data) { change = var->change; if (!change) change = random_range(var->minChange, var->maxChange, DISTRO_NORMAL); } if (g_game.combatBlockHit(params.combatType, caster, target, change, params.blockedByShield, params.blockedByArmor)) return false; if (change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getPlayer()->getSkull() != SKULL_BLACK) change = change / 2; std::string value; caster->getStorage("14335", value); int32_t plus = (int32_t)(atoi(value.c_str())); double resetpower = plus * 2.5; if (plus > 0 && params.combatType != COMBAT_HEALING) { double changeModifier = 1.0 + (resetpower / 100.0); change = (int32_t)std::ceil(change * changeModifier); } if (!g_game.combatChangeHealth(params.combatType, caster, target, change, params.effects.hit, params.effects.color)) return false; CombatConditionFunc(caster, target, params, NULL); CombatDispelFunc(caster, target, params, NULL); return true; } mais uma vez procure essa linha. bool Combat::CombatManaFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) Basta substituir todo o código aqui. bool Combat::CombatManaFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) { int32_t change = 0; if (Combat2Var* var = (Combat2Var*)data) { change = var->change; if (!change) change = random_range(var->minChange, var->maxChange, DISTRO_NORMAL); } if (change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getPlayer()->getSkull() != SKULL_BLACK) change = change / 2; std::string value; caster->getStorage("14335", value); int32_t plus = (int32_t)(atoi(value.c_str())); double resetpower = plus * 2.5; if (plus > 0 && params.combatType != COMBAT_HEALING) { double changeModifier = 1.0 + (resetpower / 100.0); change = (int32_t)std::ceil(change * changeModifier); } if (!g_game.combatChangeMana(caster, target, change)) return false; CombatConditionFunc(caster, target, params, NULL); CombatDispelFunc(caster, target, params, NULL); return true; } Fiz também para TFS 0.4. Ambos têm códigos diferentes na source, mas estão funcionando normalmente.
-
Reset System OTX 2
Bom Dia. finalmente, encontrei uma solução para o aumento de dano por reset, sem precisar de muitas modificações na source ou libs adicionais. É simples de implementar, basta adicionar e usar um comando ou NPC com um storage. foi testado e está funcionando corretamente. OTX 2 ou 3. combat.cpp procure esta linha. bool Combat::CombatHealthFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) Basta substituir todo o código aqui. bool Combat::CombatHealthFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) { int32_t change = 0; if (Combat2Var* var = (Combat2Var*)data) { change = var->change; if (!change) change = random_range(var->minChange, var->maxChange, DISTRO_NORMAL); } if (g_game.combatBlockHit(params.combatType, caster, target, change, params.blockedByShield, params.blockedByArmor, params.itemId != 0)) return false; CombatParams _params = params; if (_params.element.damage && _params.element.type != COMBAT_NONE) g_game.combatBlockHit(_params.element.type, caster, target, _params.element.damage, params.blockedByShield, params.blockedByArmor, params.itemId != 0, true); if (g_config.getBool(ConfigManager::USE_BLACK_SKULL)) { if (caster && caster->getPlayer() && target->getPlayer() && target->getSkull() != SKULL_BLACK) { _params.element.damage /= 2; if (change < 0) change /= 2; } } else { if (caster && caster->getPlayer() && target->getPlayer()) { _params.element.damage /= 2; if (change < 0) change /= 2; } } { std::string value; caster->getStorage("14335", value); int32_t plus = (int32_t)(atoi(value.c_str())); double resetpower = plus * 2.0; if (plus > 0 && params.combatType != COMBAT_HEALING) change = (int32_t)std::ceil(change + change * resetpower / 100); } if (!g_game.combatChangeHealth(_params, caster, target, change, false)) return false; CombatConditionFunc(caster, target, params, NULL); CombatDispelFunc(caster, target, params, NULL); return true; } mais uma vez procure essa linha. bool Combat::CombatManaFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) Basta substituir todo o código aqui. bool Combat::CombatManaFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) { int32_t change = 0; if (Combat2Var* var = (Combat2Var*)data) { change = var->change; if (!change) change = random_range(var->minChange, var->maxChange, DISTRO_NORMAL); } if (g_game.combatBlockHit(COMBAT_MANADRAIN, caster, target, change, false, false, params.itemId != 0)) return false; if (g_config.getBool(ConfigManager::USE_BLACK_SKULL)) { if (change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getSkull() != SKULL_BLACK) change /= 2; } else { if (change < 0 && caster && caster->getPlayer() && target->getPlayer()) change /= 2; } { std::string value; caster->getStorage("14335", value); int32_t plus = (int32_t)(atoi(value.c_str())); double resetpower = plus * 2.0; if (plus > 0 && params.combatType != COMBAT_MANADRAIN) change = (int32_t)std::ceil(change + change * resetpower / 100); } if (!g_game.combatChangeMana(caster, target, change)) return false; CombatConditionFunc(caster, target, params, NULL); CombatDispelFunc(caster, target, params, NULL); return true; } Apenas compile, então vamos adicionar um npc reset. npc reset local config = { minlevel = 3500, --- initial level to reset price = 100000000, ---initial price to reset newlevel = 20, --- level after reset priceByReset = 100000000, --- price added per reset percent = 40, ---- percentage of health/mana you will have upon reset (relative to your old total health) maxresets = 20, levelbyreset = 100 --- how much more level will you need in the next reset } function getResets(uid) resets = getPlayerStorageValue(uid, 14335) if resets < 0 then resets = 0 end return resets end local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid function addReset(cid) if(npcHandler:isFocused(cid)) then npcHandler:releaseFocus(cid) end talkState[talkUser] = 0 resets = getResets(cid) setPlayerStorageValue(cid, 14335, resets+1) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) local hp = getCreatureMaxHealth(cid) local resethp = hp*(config.percent/100) setCreatureMaxHealth(cid, resethp) local differencehp = (hp - resethp) doCreatureAddHealth(cid, -differencehp) local mana = getCreatureMaxMana(cid) local resetmana = mana*(config.percent/100) setCreatureMaxMana(cid, resetmana) local differencemana = (mana - resetmana) doCreatureAddMana(cid, -differencemana) doRemoveCreature(cid) local description = resets+1 db.query("UPDATE `players` SET `description` = ' [Reset: "..description.."]' WHERE `players`.`id`= ".. playerid .."") db.query("UPDATE `players` SET `level`="..config.newlevel..",`experience`= 0 WHERE `players`.`id`= ".. playerid .."") return true end local newPrice = config.price + (getResets(cid) * config.priceByReset) local newminlevel = config.minlevel + (getResets(cid) * config.levelbyreset) if msgcontains(msg, 'reset') then if getResets(cid) < config.maxresets then selfSay('Voce gostaria de resetar? Isso vai custar '..newPrice..' gp\'s!', cid) talkState[talkUser] = 1 else selfSay('Voce ja atingiu o nivel maximo de resets!', cid) end elseif(msgcontains(msg, 'yes') and talkState[talkUser] == 1) then if getPlayerMoney(cid) < newPrice then selfSay('E necessesario ter '..newPrice..' gp\'s para resetar!', cid) elseif getPlayerLevel(cid) < newminlevel then selfSay('O level minimo para resetar e '..newminlevel..'!', cid) else doPlayerRemoveMoney(cid,newPrice) playerid = getPlayerGUID(cid) addEvent(function() if isPlayer(cid) then addReset(cid) end end, 3000) local number = getResets(cid)+1 local msg ="---[Reset: "..number.."]-- Voce resetou! Voce sera disconectado em 3 segundos." doPlayerPopupFYI(cid, msg) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) end talkState[talkUser] = 0 elseif(msgcontains(msg, 'no')) and isInArray({1}, talkState[talkUser]) == TRUE then talkState[talkUser] = 0 npcHandler:releaseFocus(cid) selfSay('Ok.', cid) elseif msgcontains(msg, 'quantity') then selfSay('You have a total of '..getResets(cid)..' reset(s).', cid) talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) #OBS: 2,0 é igual a duas vezes o valor original, não vinte vezes. Então quando você multiplica algo por 2,0 você está duplicando o valor original. double resetpower = plus * 2.0; Eu recomendo definir o valor para 1,5, pois aumentará o dano a cada reset. Qualquer reset do sistema que use storage, basta alterar o valor da reset do sistema. caster->getStorage("14335", value); Obs: Peguei o código do @Underwar e fiz algumas alterações, então compilei sem erro... https://tibiaking.com/forums/topic/104756-aumentar-dano-por-reset/ @MokkEste usuário do TibiaKing testou e aprovou..
-
AJUDA COM EFEITOS
Já existe um tutorial sobre como compilar essa base. Dê uma olhada no YouTube.
-
AJUDA COM EFEITOS
Você só adicionou no 'const.h' e compilou para funcionar? Não, você deve adicionar essa parte no 'const.h' e 'tools.cpp', e talvez seja necessário mexer em 'game.cpp' e 'player.cpp'. Eu recomendo que você baixe um servidor que já tenha esses efeitos. Depois, siga a source e faça uma cópia igual para implementar na sua source. Faça isso um por um.
-
AJUDA COM EFEITOS
esses poucos efeitos, porém ele é baseado no Nostalrius (TFS 1.2) downgrage. Quando eu baixei e examinei, notei muitas diferenças significativas em relação às TFS 0.4 e 1.x normais. Há alguns arquivos estranhos e ainda tem uns sistemas top, incluindo auras, wings, mercado e tudo mais... realmente não gostei, haha. Essa libs não existe. Basta verificar na fonte. https://github.com/ErikasKontenis/SabrehavenServer/blob/master/src/const.h @RAJADAO Você só precisa verificar na source deste link /\ e adicionar a magia que você deseja de forma simples.
-
Ajuda com sistema de Reset via NPC
chama PM
-
Ajuda com sistema de Reset via NPC
local config = { minlevel = 500, price = 100000000, newlevel = 20, priceByReset = 100000000, percent = 10, maxresets = 20, levelbyreset = 100, damagePercent = 5, } function getResets(uid) local resets = getPlayerStorageValue(uid, 378378) if resets < 0 then resets = 0 end return resets end local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function addReset(cid) if npcHandler:isFocused(cid) then npcHandler:releaseFocus(cid) end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid talkState[talkUser] = 0 local resets = getResets(cid) setPlayerStorageValue(cid, 378378, resets + 1) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) -- Ajustar HP local hp = getCreatureMaxHealth(cid) local resethp = hp * (config.percent / 100) setCreatureMaxHealth(cid, resethp) local differencehp = resethp - hp doCreatureAddHealth(cid, differencehp) -- Ajustar MP local mana = getCreatureMaxMana(cid) local resetmana = mana * (config.percent / 100) setCreatureMaxMana(cid, resetmana) local differencemana = resetmana - mana doCreatureAddMana(cid, differencemana) -- Ajustar dano local damage = getCreatureDamage(cid) if damage then local additionalDamage = damage * (config.damagePercent / 100) local newDamage = damage + additionalDamage setCreatureDamage(cid, newDamage) end local description = resets + 1 local playerid = getPlayerGUID(cid) db.query("UPDATE `players` SET `description` = ' [Reset: " .. description .. "]' WHERE `players`.`id`= " .. playerid .. "") db.query("UPDATE `players` SET `level`=" .. config.newlevel .. ",`experience`= 0 WHERE `players`.`id`= " .. playerid .. "") doRemoveCreature(cid) return true end function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid talkState[talkUser] = 0 local newPrice = config.price + (getResets(cid) * config.priceByReset) local newminlevel = config.minlevel + (getResets(cid) * config.levelbyreset) if msgcontains(msg, 'reset') then if getResets(cid) < config.maxresets then selfSay('Voce gostaria de resetar? Isso vai custar ' .. newPrice .. " gp's!", cid) talkState[talkUser] = 1 else selfSay('Voce ja atingiu o nivel maximo de resets!', cid) end elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 1) then if getPlayerMoney(cid) < newPrice then selfSay('E necessario ter ' .. newPrice .. " gp's para resetar!", cid) elseif getPlayerLevel(cid) < newminlevel then selfSay('O level minimo para resetar e ' .. newminlevel .. '!', cid) else doPlayerRemoveMoney(cid, newPrice) playerid = getPlayerGUID(cid) addEvent(function() if isPlayer(cid) then addReset(cid) end end, 3000) local number = getResets(cid) + 1 local msg = "---[Reset: " .. number .. "]-- Voce resetou! Voce ganhou " .. config.damagePercent .. "% de dano adicional. Voce sera desconectado em 3 segundos." doPlayerPopupFYI(cid, msg) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) end talkState[talkUser] = 0 elseif (msgcontains(msg, 'no')) and isInArray({ 1 }, talkState[talkUser]) == TRUE then talkState[talkUser] = 0 npcHandler:releaseFocus(cid) selfSay('Ok.', cid) elseif msgcontains(msg, 'quantity') then selfSay('You have a total of ' .. getResets(cid) .. ' reset(s).', cid) talkState[talkUser] = 0 end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
-
Ajuda com sistema de Reset via NPC
É só substituir nessa parte e fazer o teste. function addReset(cid) if npcHandler:isFocused(cid) then npcHandler:releaseFocus(cid) end talkState[talkUser] = 0 resets = getResets(cid) setPlayerStorageValue(cid, 378378, resets + 1) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) -- Ajustar HP local hp = getCreatureMaxHealth(cid) local resethp = hp * (config.percent / 100) setCreatureMaxHealth(cid, resethp) local differencehp = hp - resethp doCreatureAddHealth(cid, -differencehp) -- Ajustar MP local mana = getCreatureMaxMana(cid) local resetmana = mana * (config.percent / 100) setCreatureMaxMana(cid, resetmana) local differencemana = mana - resetmana doCreatureAddMana(cid, -differencemana) -- Ajustar dano local damage = getCreatureDamage(cid) if damage then local additionalDamage = damage * (config.damagePercent / 100) local newDamage = damage + additionalDamage setCreatureDamage(cid, newDamage) end doRemoveCreature(cid) local description = resets + 1 db.query("UPDATE `players` SET `description` = ' [Reset: " .. description .. "]' WHERE `players`.`id`= " .. playerid .. "") db.query("UPDATE `players` SET `level`=" .. config.newlevel .. ",`experience`= 0 WHERE `players`.`id`= " .. playerid .. "") return true end Se der erro nessa parte "getCreatureDamage", tente fazer uma alteração aqui. local damage = creature.damage local additionalDamage = damage * (config.damagePercent / 100) local newDamage = damage + additionalDamage creature.damage = newDamage
-
Problema com WOE (War Of Emperium)
Var.woe Var = { woe = {}, Castle = {}, woe_config = {}, stor = {} } --castle name (?) Var.Castle.name = 'Cyber Castle' --aid of entry. Var.Castle.tiles = 3131 --aid for created portals. Var.Castle.portals = 3132 --aid of flags in castle. Var.Castle.banderas = 3133 --aid of empes bases. Var.Castle.bases = 3134 --uids in case you have decorations with info. Var.Castle.decoraciones = {} --where you teleported from temple. Var.Castle.pos = {x = 55, y = 79, z = 7} --where players are teleported when finished or castle owner change. Var.Castle._exit = {x = 1028, y = 1024, z = 7} --where portal appears Var.Castle.desde = {x = 1023, y = 1026, z = 7, stackpos = 1} --true / false Var.woe.default_map = true --if you will not use default map you should config all the pos. --main empe pos => with this pos all castle pos will be calculated (default map only) Var.Castle.empePos = {x = 55, y = 34, z = 5, stackpos = 253} if Var.woe.default_map then local pos = Var.Castle.empePos --entry for guild by using flags. Var.Castle.guildEntry = {x = pos.x - 9, y = pos.y + 4, z = pos.z} --each floor should be all floor. Var.Castle.salas = { a = {fromx = pos.x - 18, tox = pos.x + 18, fromy = pos.y - 10, toy = pos.y + 28, z = pos.z + 2}, b = {fromx = pos.x - 18, tox = pos.x + 18, fromy = pos.y - 10, toy = pos.y + 28, z = pos.z + 1}, c = {fromx = pos.x - 18, tox = pos.x + 18, fromy = pos.y - 10, toy = pos.y + 28, z = pos.z} } --pre empes pos Var.Castle.PreEmpes = { {x = pos.x - 13, y = pos.y + 3, z = pos.z + 1, stackpos = 253}, {x = pos.x + 13, y = pos.y + 3, z = pos.z + 1, stackpos = 253} } --when you kill pre empes new portals appears. Var.Castle.PrePortalsPos = { {x = pos.x - 4, y = pos.y - 6, z = pos.z + 1, stackpos = 1}, {x = pos.x + 4, y = pos.y - 6, z = pos.z + 1, stackpos = 1} } Var.Castle.PreToPos = { [1] = {x = pos.x - 7, y = pos.y + 26, z = pos.z}, [2] = {x = pos.x + 7, y = pos.y + 26, z = pos.z} } else --edit those if not using default map --read above to know what is everything. --break this comment to use [...] --[[ Var.Castle.guildEntry = {x = 46, y = 38, z = 5} Var.Castle.salas = { a = {fromx=37, tox=73, fromy=24, toy=62, z=7}, b = {fromx=37, tox=73, fromy=24, toy=62, z=6}, c = {fromx=37, tox=73, fromy=24, toy=62, z=5} } Var.Castle.PreEmpes = { {x=42, y=37, z=6, stackpos=253}, {x=68, y=37, z=6, stackpos=253} } Var.Castle.PrePortalsPos = { {x=51, y=28, z=6, stackpos=1}, {x=59, y=28, z=6, stackpos=1} } Var.Castle.PreToPos = { [1] = {x = 48, y = 60, z = 5}, [2] = {x = 62, y = 60, z = 5} } ]] end --duration Var.woe_config.timeToEnd = 40 --bc type Var.woe_config.bcType = MESSAGE_EVENT_ADVANCE --days Var.woe_config.dias = {"tuesday", "thursday", "saturday"} --time to start Var.woe_config.horaPartida = 20 --access to start Var.woe_config.accessToStar = 4 --recall delay Var.woe_config.recallTime = 3 * 60 --rewards for winners Var.woe_config.premios = true --storage for register players Var.stor.register = 8589 --recall delay stor Var.stor.recall = 23155 --global stor started Var.stor.Started = 7801 --global stor [...] Var.stor.WoeTime = 7802