Histórico de Curtidas
-
narutomaniacos recebeu reputação de JuaumZzz em (Resolvido)Retirar Caixa de OTCLIENT (PROTOCOLO,IP,PORTA) POR IP FIXO.Otclient/modules/entergame.lua procure por:
if g_app.isRunning() and not g_game.isOnline() then enterGame:show()
end adicione em baixo: EnterGame.setUniqueServer(hostName, port, protocolVersion, windowWidth, windowHeight) EnterGame.setUniqueServer('127.0.0.1', 7171, 862, 270, 210) Server,porta,versão -
narutomaniacos deu reputação a Cat em Telhado Venore do Tibia Completo (81 peças)Veja também: • Telhado Clássico do Tibia Completo [191 peças]
TIBIA - TELHADO VENOREAN
Estou disponibilizando esse jogo de telhados do Tibia com as peças que faltam.
(ainda faltam algumas mas da pra usar de forma completa desse jeito).
Façam bom uso!
Download:
Venorean_roofs_by_nolis.rar
Conteúdo do pack:
-
narutomaniacos recebeu reputação de Gabrielx17 em [Dúvida] Mudar cor do heal das potionsMude o "doCreatureSay" por doSendAnimatedText :
doSendAnimatedText(getCreaturePosition(cid),'Aaaa..', TEXTCOLOR_PINK)
-
narutomaniacos deu reputação a Ramon RBN em (Resolvido)[Compilar com MSVS] Problema ao tentar compilar o TFS 1.3 & 8.60Eu usei as dll que gera a partir da compilação, joguei tudo na pasta e executei.
Testei com outro TFS e parece mesmo ser as dll porém não sei qual, vou procurar aqui.
#SOLUÇÃO
Consegui resolver por outro fórum, aqui algumas soluções que encontrei:
Meu tópico no outro fórum: aqui
É importante usar o CMD para executar o seu '.exe', é bem fácil.
Abra o CMD, coloque 'cd <destino do seu projeto>', logo após isso use '<seu executador>.exe' para iniciar.
Problema com dummy:
avoid name conflict from boost::variant Solução:
https://github.com/otland/forgottenserver/pull/2678/files/f51321dde4e9a40f23d3df4269849154395a4326
Problema após compilar (tela preta ao executar):
Vá em Propriedades do seu projeto -> Debugging -> Working Directory e mude para a pasta do seu projeto. Logo após isso edite as propriedades do projeto e alterne o Conjunto de Instruções Avançadas para SSE2.
https://otland.net/threads/illegal-instruction-on-compilling.259997/#post-2514777
Vai compilar sem problemas.
-
narutomaniacos deu reputação a Wakon em (Resolvido)Spell incompleta@narutomaniacos, é essa parte que tá dando o hit "desconhecido":
return doCombat(cid, combat, var) se quiser que dê apenas os hits por addEvent, troque por return true ?
-
narutomaniacos deu reputação a Spooky Ghost em (Resolvido)Spell incompletaEu tentei assim e funcionou aqui com a mesma versão do TFS.
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_HITCOLOR, COLOR_TEAL) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, 263) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 104) arr1 = { {3} } local area1 = createCombatArea(arr1) local function onCastSpell1(parameters) return isPlayer(parameters.cid) and doCombat(parameters.cid, combat, parameters.var) end function onGetFormulaValues(cid, level, maglevel) min = -((level*12) + (maglevel*60)) max = -((level*12) + (maglevel*60)) return min, max end setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") function onCastSpell(cid, var) local parameters = { cid = cid, var = var} addEvent(onCastSpell1, 1000, parameters) -- tempo em segundos para castar a proximo Hit 1000 = 1sg addEvent(onCastSpell1, 2000, parameters) -- se voce quiser mais Hits você copia essa parte e cola em baixo addEvent(onCastSpell1, 200, parameters) -- e se voce quiser Hits mais rápidos é só diminuir ao seu gosto xD eu recomendo colocar interval de 200 - 300 segundos para aparecer o Hit no monstro ou criatura return doCombat(cid, combat, var) end
-
narutomaniacos recebeu reputação de Soleister em (Resolvido)Retirar Caixa de OTCLIENT (PROTOCOLO,IP,PORTA) POR IP FIXO.Otclient/modules/entergame.lua procure por:
if g_app.isRunning() and not g_game.isOnline() then enterGame:show()
end adicione em baixo: EnterGame.setUniqueServer(hostName, port, protocolVersion, windowWidth, windowHeight) EnterGame.setUniqueServer('127.0.0.1', 7171, 862, 270, 210) Server,porta,versão -
narutomaniacos deu reputação a luanluciano93 em [8.60] Sistema de Recompensa Loot De Boss Compartilhado (reward chest)Olá pessoal, resolvi criar um sistema de recompensa parecido com o sistema do tibia global para a versão 8.60, mas tie que fazer varias "gambiarras" para ele funcionar nesta versão.
Para quem não conhece: http://www.tibiawiki.com.br/wiki/Loot#Sistema_de_Recompensas
Basicamente meu sistema funciona da seguinte forma:
• você determina as criaturas que irão funcionar com esse sistema (normalmente bosses).
• durante a batalha com a criatura o sistema conta pontos aos jogadores por ataque, bloqueio e suporte ("healar" quem esta na batalha).
• quando a criatura é morta o sistema cria um "loot" de acordo com os pontos e envia-o ao depot do jogador em uma bag determinada nas configurações.
Primeiramente vamos criar o arquivo das configurações gerais, crie uma pasta dentro do "data" com o nome de sistemas e dentro cria um arquivo rewardchest.lua:
Depois em creaturescript crie dois arquivos:
rewardchest_boss.lua:
e rewardchest_pontos.lua:
Lembrando que em todas as criaturas que forem adicionadas ao sistema além de coloca-las no rewarchest.lua você deve add isso no xml do monstro:
<script> <event name="RewardChestDeath"/> <event name="RewardChestMonster"/> </script> E isso no creaturescript.xml:
<!-- Sistema de recompensa criado por luanluciano93 --> <event type="login" name="RewardChestLogin" event="script" value="rewardchest_pontos.lua"/> <event type="statschange" name="RewardChestStats" event="script" value="rewardchest_pontos.lua"/> <event type="death" name="RewardChestDeath" event="script" value="rewardchest_boss.lua"/> <event type="statschange" name="RewardChestMonster" event="script" value="rewardchest_boss.lua"/>
Basicamente é isso, qualquer dúvida postem aqui ... abraços!
LINK DO SCRIPT NO GITHUB: https://github.com/luanluciano93/ESTUDOS/tree/master/LUA/REWARD_SYSTEM_860
-
narutomaniacos deu reputação a xWhiteWolf em (Resolvido)[PEDIDO] Item que da HPja sei como resolver seu problema!
local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, -1) setConditionParam(condition, CONDITION_PARAM_STAT_MAXHEALTH, 50) function onEquip(cid, item, slot) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Now that you're using this item you'll receive a special bonus...") doAddCondition(cid, condition) doSendMagicEffect(getCreaturePos(cid), 10) return true end function onDeEquip(cid, item, slot) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You're no longer receiving the special bonus..") doRemoveCondition(cid, CONDITION_ATTRIBUTES) return true end só criar uma condition que adicione pontos de vida.. nesse caso aí vai adicionar 50 pontos de vida.. o -1 no tempo é pra garantir que esse buff seja eterno. Daí ao remover o item do slot ele vai remover a condition.
Obs: isso é um movements
-
narutomaniacos deu reputação a matsantos em (Resolvido)Cortar spriteusa object builder? tem uma maneira muito simples de fazer isso, apenar vá em ferramentas/tools e depois clica em SLICER
abre a imagem no canto superior esquerdo, aumenta as colunas e linhas, corta e depois só é importar
-
narutomaniacos deu reputação a xWhiteWolf em OTserver da lucro?Sim e não,
Otserver dá muito dinheiro, mas o tempo que demora pra você ter lucro simplesmente não compensa, a menos que você ame o que você tá fazendo.
Um host é relativamente barato e é o único gasto que você vai ter quando tudo estiver pronto (e propagandas), o que ninguém te conta é o caminho até isso acontecer.
1- Se você tiver uma equipe, você vai ter que dividir grande parte dos ganhos
2- Se vc não tiver, bem, vai acabar saindo mais caro pq cada probleminha que você tiver vai ter que pagar alguem pra resolver, sem falar que se você não manjar, vc não vai ter nenhuma segurança sobre a qualidade do serviço que cada um está fazendo (principalmente pra scripting)
3- Se você realmente for querer inovar e fazer bem feito, vai levar uns bons anos pro seu projeto sair, todo esse tempo você vai ter que arcar com os gastos sem receber nada por isso e a equipe pode mudar muitas vezes, vc vai correr risco de alguém vender partes (ou todo seu projeto) ou até você mesmo acabar desistindo pela demora e pelo trabalho.
4- Após tudo isso, você vai ter um jogo 'relativamente pronto' é hora de começar os testes e descobrir se vai agradar o publico ou não.
4.1 - Se agradar, colete os feedbacks do que poderia melhorar, faça um panorama do que é critica válida e do que é choro e arrume as coisas, serão mais algumas semanas ou meses pra finalizar.
4.2 se não agradar vc tem um grande problema nas mãos, pq vc vai estar de volta no passo 2.
5- Considerando tudo isso, agora você precisa investir MUITO HARD em marketing. O grande pico da maioria dos otservers é no inicio, se seu servidor não bater 300 na primeira semana, tenho uma má notícia pra você... a chance de você conseguir conquistar mais público depois é MUITO pequena.
6- Chegou a data do lançamento, você precisa coordenar e coletar feedbacks, precisa ter muita gente para auxiliar os jogadores e resolver imediatamente quaisquer problemas. Vai ter muitas reclamações e muita gente falando ao mesmo tempo, essa é a parte em que geralmente as pessoas começam a surtar e pensar em abandonar o projeto. Tenha canais e pessoal suficiente para atender todos os jogadores, do contrário as pessoas vão desistir muito rápido.
6.5- Esteja preparado para inveja, ataques e bugs: isso é uma certeza absoluta no mundo de otserver. As pessoas vão achar bugs, explorar eles seja para lucro pessoal ou para acabar com seu jogo, você precisa ter maturidade suficiente para saber lidar com isso da melhor maneira possível. Ter uma boa equipe de prontidão é essencial aqui, principalmente se for um erro desconhecido. No meu servidor eu tive 4 problemas que foram 'críticos', o primeiro foi um GM que editou o mapa para colocar vários bags espalhados e escondidos no mapa com dinheiro e itens para ajudar os amigos dele (e a si próprio); O segundo foi um baú de potions que havia na cidade onde as pessoas ficavam criando infinitas contas para acumular e vender potions; o terceiro foi um crash na source que até hoje a gente não sabe porque ocorre (fizemos trace com o gdb e achamos a linha que ele ocorre, tentamos resolver e nada); um bug nas houses que fez muita gente perder a house (as vezes com todos os itens dentro). O tfs oficial tem muitos issues conhecidos que as pessoas corrigem e não contam pra ngm como, também tem muitos issues desconhecidos que ninguém reportou pra poder ficar derrubando o jogo alheio. Se previna e se prepare pro pior, talvez tenha até que desembolsar dinheiro para pagar alguém pra resolver.
7- Depois da primeiras semana, você precisa usar todo o dinheiro que você conseguir para dar a tacada final e investir pesado em marketing. Essa provavelmente vai ser a hora de você desembolsar alguns mils e pegar propaganda em youtube, facebook, otlists, foruns. O céu é o limite.
8- Quando finalmente você tiver feito tudo isso, tem duas possibilidades: seu servidor pode dar certo ou fracassar.
Por mais que você tenha se esforçado ou esteja disposto a melhorar, fracassar é sempre uma possibilidade. Tente estar aberto pra essa opção e saiba a hora de admitir que fracassou mas sem desistir. Se der certo continue mantendo uma média de investimento em propagandas razoável mas não precisa ser nada muito absurdo. Grande parte da sua divulgação agora vai ser o boca-a-boca e sua própria posição na otservlist.
Caso tudo falhe, não tenha medo de fechar o servidor e começar a corrigir tudo. Não tenha medo de atrasar mais alguns anos para garantir que tudo está perfeito e testar com diferentes públicos para ver se eles aprovam seu jogo. Lembre-se, um atraso é temporário, um jogo ruim é ruim para sempre.
Essa é a sabedoria que eu deixo aqui, e que eu aprendi na marra com o Empire.
-
narutomaniacos deu reputação a LeoTK em Sprites Dragon BallFala guys achei esse um client com sprites bem interessantes de dragon ball como meu projeto não é do mesmo quero compartilhar para ajudar quem tem um projeto de dragon ball tem sprites bem legais nesse client espero que gostem
Download
Scan
By: Brunds
-
narutomaniacos deu reputação a xWhiteWolf em Spell que muda Outfit!se baseia nesse script que eu fiz
--COISAS PARA DE UTILIZAR NESSE OU EM OUTROS SCRIPTS.. --doSetItemOutfit(getThingfromPos(poslook).uid, 2317, 1*15000) --doSetCreatureOutfit(cid, outfit, time) local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatParam(combat, COMBAT_PARAM_EFFECT, 61) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat, COMBAT_PARAM_DISPEL, 2) setCombatParam(combat, COMBAT_PARAM_DISPEL, 1) setCombatParam(combat, COMBAT_PARAM_DISPEL, 4) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, 15000) setConditionParam(condition, CONDITION_PARAM_SKILL_MELEEPERCENT, 140) setConditionParam(condition, CONDITION_PARAM_SKILL_DISTANCEPERCENT, 140) setConditionParam(condition, CONDITION_PARAM_STAT_MAGICPOINTSPERCENT, 140) setConditionParam(condition, CONDITION_PARAM_SKILL_SHIELDPERCENT, 140) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setCombatCondition(combat, condition) function onCastSpell(cid, var) local mninja = {lookType = 152, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 3} local fninja = {lookType = 156, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 3} local sex = getPlayerSex(cid) if sex == 0 then doSetCreatureOutfit(cid, fninja, 15000) local mana = getCreatureMaxMana(cid) doCreatureAddMana(cid, -mana) else doSetCreatureOutfit(cid, mninja, 15000) local mana = getCreatureMaxMana(cid) doCreatureAddMana(cid, -mana) end return doCombat(cid, combat, var) end -
narutomaniacos deu reputação a L3K0T em Teleporte Summon tfs 0.3.6TUTORIAL - TELEPORTE SUMMON
Introdução:
Fala pessoal, hoje vim aqui liberar um código para que futuros criadores de pokemon não usem GLOBALEVENTS ou MOVEMENTS para teleportar seus pokemons a distancia... hoje irei ensinar a você não usar mais esses scripts que aonde da maioria da vezes crash o servidores em WINDOWS em testes.
Sobre o Sistema:
Esse sistema tem a função de teleportar seu pokemon a certos sqm, tipo assim, você tem um pokemon e a distancia dele é 7 sqm, ao passar os 7 sqm ele teleporta para você, seja em qualquer lugar até de baixo da terra ou lugares super longe (Não se preocupe o problema do pokemon Morrer com source novas será removido e assim ele não vai morrer)
Creature.cp
Tutorial:
Vá em sua source procure por creature.cpp e abra com algum editor de texto e ache:
if(!summons.empty()) { std::list<Creature*>::iterator cit; std::list<Creature*> despawnList; for(cit = summons.begin(); cit != summons.end(); ++cit) { const Position pos = (*cit)->getPosition(); if((std::abs(pos.z - newPos.z) > 2) || (std::max(std::abs(( newPos.x) - pos.x), std::abs((newPos.y - 1) - pos.y)) > 30)) despawnList.push_back((*cit)); } for(cit = despawnList.begin(); cit != despawnList.end(); ++cit) g_game.removeCreature((*cit), true); } Mude para:
/*if(!summons.empty()) { std::list<Creature*>::iterator cit; std::list<Creature*> despawnList; for(cit = summons.begin(); cit != summons.end(); ++cit) { const Position pos = (*cit)->getPosition(); if((std::abs(pos.z - newPos.z) > 2) || (std::max(std::abs(( newPos.x) - pos.x), std::abs((newPos.y - 1) - pos.y)) > 30)) despawnList.push_back((*cit)); } for(cit = despawnList.begin(); cit != despawnList.end(); ++cit) g_game.removeCreature((*cit), true); }*/ Agora salve ctrl+s e feche.
Monster.cpp
Tutorial:
Agora procure por Monster.cpp e ache:
void Monster::onThink(uint32_t interval) abaixo de:
if(teleportToMaster && doTeleportToMaster()) teleportToMaster = false; coloque:
if(getMaster()){ if(!Position::areInRange<6,6,0>(getPosition(), getMaster()->getPosition())) doTeleportToMaster(); } salve ctrl+s e revompila no modo rebuilde não esqueça de habilitar as opções em config.lua
-- Summons maxPlayerSummons = 1 teleportAllSummons = true teleportPlayerSummons = true
lembre se de remover qualquer scripts que teleporta seu pokemon a distancia.
Créditos:
By L3K0T
-
narutomaniacos deu reputação a Deadpool em [C++] Cor das mensagens nos channelsBom, postarei como colocar para gm, adm, cm falar em red nos channels e tutores e senior tutores em orange.
testado em: tfs 0.3.6 |854| pl
Em chat.cpp procure por:
bool ChatChannel::talk(Player* player, SpeakClasses type, const std::string& text, uint32_t _time/* = 0 e vai ter uma linha assim: if(it == m_users.end()) return false; de 2 quebra de linhas e adicione em baixo:
SpeakClasses ntype = type; uint16_t channelId = getId(); if (channelId == 5) { if (player->getGroupId() == 6) { ntype = SPEAK_CHANNEL_RN; } else if (player->getGroupId() == 5) { ntype = SPEAK_CHANNEL_RN; } else if (player->getGroupId() == 4) { ntype = SPEAK_CHANNEL_RN; } else if(player->getGroupId() >= 2) { ntype = SPEAK_CHANNEL_O; } } Agora, um pouco em baixo disso que você adicionou, tem essa função:
it->second->sendToChannel(player, type, text, m_id, _time); troque por essa:
it->second->sendToChannel(player, ntype, text, m_id, _time); ou, é só adiciona um "n", no type da primeira linha rs
Como Editar os Groups ?
(player->getGroupId() == 5) "5" -> Grupo do player, no caso aqui seria CM
-
narutomaniacos deu reputação a rohfagundes em Variação de Dano Reformulada(Source)Ola, atualmente a variação de dano é enorme e não importa qual arma você usa e quanto de skill você tem, na formula o dano minimo é sempre 0. Então vou mostrar pra vocês onde pode ser editado para resolver esse problema
• Versão - Otx 2(final) -- Baseado na Tfs 0.3.7
• Em weapons.ccp procure por:
Nessa parte:
int32_t damage = -random_range(0, (int32_t)maxDamage, DISTRO_NORMAL); Troque por:
int32_t damage = -random_range((int32_t)maxDamage/2, (int32_t)maxDamage, DISTRO_NORMAL); Sendo assim o dano de fist tera uma variedade de danomaximo/2 a danomaximo
• Agora para editar o dano de arma, procure:
Nessa parte: return -random_range(0, ret, DISTRO_NORMAL); Troque por: return -random_range(ret/2, ret, DISTRO_NORMAL); Sendo assim o dano de (sword,axe e club) terá uma variedade de danomaximo/2 a danomaximo
• Agora dano de arma elemental, procure:
Nessa parte: return -random_range(0, ret, DISTRO_NORMAL); Troque por: return -random_range(ret/2, ret, DISTRO_NORMAL); Sendo assim o dano elemental de (sword,axe e club) terá uma variedade de danomaximo/2 a danomaximo • Agora distance, procure:
-
narutomaniacos recebeu reputação de FearWar em [Dúvida] Mudar cor do heal das potionsMude o "doCreatureSay" por doSendAnimatedText :
doSendAnimatedText(getCreaturePosition(cid),'Aaaa..', TEXTCOLOR_PINK)
-
narutomaniacos deu reputação a MaTTch em Monstro Ataca quem tem StorageVá em creaturescripts/scripts e crie um arquivo LUA, dentro você coloca isso:
local storage = 55555 function onTarget(cid, target) if(isPlayer(target) and getPlayerStorageValue(target, storage) == -1) then return false end return true end em creaturescripts.xml adicione a TAG:
<event type="target" name="EVENT_NAME" event="script" value="NOME_DO_ARQUIVO.lua"/> e finalmente vá no monstro que você quer que utilize o sistema e adicione:
<script> <event name="EVENT_NAME"/> </script> o resto você deve saber...
-
narutomaniacos deu reputação a Vodkart em [MODS] - [8.6] Perfect Zombie System [Automático] [V1.0]Qual dúvida ou erro poste no tópico que estarei respondendo.
Obs: Antes que me falem besteiras, coloquei para os GM'S, CM'S E GOD'S não contarem no evento, então testem apenas com jogadores.
Zombie.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <mod name="Perfect Zombie System" version="8.6" author="Vodkart" contact="tibiaking.com" enabled="yes"> <config name="zombie_config"><![CDATA[ zombie_config = { storages = {172100, 172101, 172102}, -- n edite players = {min = 2, max = 30}, -- min, max players no evento rewards = {items ={{2160,10},{2494,1}}, trophy = 5805}, timeToStartEvent = 30, -- segundos para começar o evento CheckTime = 5, -- tempo que o TP fica aberto para os jogadores adrentarem o evento teleport = {{x=147, y=55, z=7}, {x=125 , y=304, z=7}}, -- position do tp onde aparece, position para onde o jogador vai ao entrar no tp arena = {{x=110,y=297,z=7},{x=145,y=321,z=7}}, -- area positions monster_name = "Zombie Event", timeBetweenSpawns = 20, min_Level = 20 } zombie_days = { ["Monday"] = {"13:00","18:00","20:00","22:00"}, ["Tuesday"] = {"13:00","18:00","22:50","22:00"}, ["Wednesday"] = {"21:57","18:00","20:00","23:17"}, ["Thursday"] = {"13:00","18:00","20:00","22:00"}, ["Friday"] = {"13:00","18:00","21:45","22:00"}, ["Saturday"] = {"13:00","18:00","20:00","22:00"}, ["Sunday"] = {"13:00","18:00","20:00","22:00"} } function removeZombieTp() local t = getTileItemById(zombie_config.teleport[1], 1387).uid return t > 0 and doRemoveItem(t) and doSendMagicEffect(zombie_config.teleport[1], CONST_ME_POFF) end function ZerarStoragesZombie() for _, stor in pairs(zombie_config.storages) do setGlobalStorageValue(stor, 0) end end function getPlayersInZombieEvent() local t = {} for _, pid in pairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), zombie_config.arena[1], zombie_config.arena[2]) and getPlayerAccess(pid) < 3 then t[#t+1] = pid end end return t end function getZombieRewards(cid, items) local backpack = doPlayerAddItem(cid, 1999, 1) -- backpackID for _, i_i in ipairs(items) do local item, amount = i_i[1],i_i[2] if isItemStackable(item) or amount == 1 then doAddContainerItem(backpack, item, amount) else for i = 1, amount do doAddContainerItem(backpack, item, 1) end end end end function isWalkable(pos, creature, proj, pz)-- by Nord if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if getTopCreature(pos).uid > 0 and creature then return false end if getTileInfo(pos).protection and pz then return false, true end local n = not proj and 3 or 2 for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if tile.itemid ~= 0 and not isCreature(tile.uid) then if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then return false end end end return true end function HaveCreatureZombie(area, remove) for x = area[1].x - 1, area[2].x + 1 do for y = area[1].y - 1, area[2].y + 1 do local pos = {x=x, y=y, z=area[1].z} local m = getTopCreature(pos).uid if remove ~= false and m ~= 0 and isMonster(m) then doRemoveCreature(m) end end end end function spawnZombie() if #getPlayersInZombieEvent() > 1 then local pos = {x=math.random(zombie_config.arena[1].x, zombie_config.arena[2].x), y=math.random(zombie_config.arena[1].y,zombie_config.arena[2].y), z=zombie_config.arena[1].z} if not isWalkable(pos, false, false, false) then spawnZombie() else doSummonCreature(zombie_config.monster_name, pos) doSendDistanceShoot({x = pos.x - math.random(4, 6), y = pos.y - 5, z = pos.z}, pos, CONST_ANI_FIRE) addEvent(doSendMagicEffect, 150, pos, CONST_ME_HITBYFIRE) addEvent(doSendMagicEffect, 150, pos, CONST_ME_FIREAREA) doSendMagicEffect(pos, CONST_ME_MORTAREA) setGlobalStorageValue(zombie_config.storages[2], getGlobalStorageValue(zombie_config.storages[2]) <= 0 and 1 or getGlobalStorageValue(zombie_config.storages[2])+1) doBroadcastMessage("A zombie has spawned! There is currently " .. getGlobalStorageValue(zombie_config.storages[2]) .. " zombies in the zombie event!", MESSAGE_STATUS_CONSOLE_RED) addEvent(spawnZombie, zombie_config.timeBetweenSpawns *1000) end end end function CheckZombieEvent(delay) if getGlobalStorageValue(zombie_config.storages[1]) ~= (zombie_config.players.max+1) then if delay > 0 and getGlobalStorageValue(zombie_config.storages[1]) < zombie_config.players.max then doBroadcastMessage("Zombie event starting in " .. delay .. " minutes! The teleport will be closed when the event start!", MESSAGE_STATUS_WARNING) elseif delay == 0 and getGlobalStorageValue(zombie_config.storages[1]) < zombie_config.players.min then for _, cid in pairs(getPlayersInZombieEvent()) do doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT) end removeZombieTp() doBroadcastMessage("The Zombie event could not start because of to few players participating.\n At least " .. zombie_config.players.min .. " players is needed!", MESSAGE_STATUS_WARNING) ZerarStoragesZombie() elseif delay == 0 and getGlobalStorageValue(zombie_config.storages[1]) >= zombie_config.players.min then removeZombieTp() doBroadcastMessage("The Zombie event is now full [" .. getGlobalStorageValue(zombie_config.storages[1]) .. " players]! The event will soon start.") for _, var in pairs(getPlayersInZombieEvent()) do doPlayerSendTextMessage(var, MESSAGE_EVENT_ADVANCE, "The first zombie will spawn in " .. zombie_config.timeToStartEvent .. " seconds! Good luck!") end addEvent(spawnZombie, zombie_config.timeToStartEvent*1000) end addEvent(CheckZombieEvent, 60000, delay-1) end end]]></config> <event type="statschange" name="ZombieStats" event="script"><![CDATA[ domodlib('zombie_config') if isPlayer(cid) and isMonster(attacker) and getCreatureName(attacker) == zombie_config.monster_name then if isInRange(getPlayerPosition(cid), zombie_config.arena[1], zombie_config.arena[2]) then if #getPlayersInZombieEvent() > 1 then doBroadcastMessage(getPlayerName(cid) .. " have been eated by Zombies!", MESSAGE_STATUS_CONSOLE_RED) local corpse = doCreateItem(getPlayerSex(cid) == 1 and 3058 or 6081, 1, getPlayerPosition(cid)) doItemSetAttribute(corpse, "description", "You recognize " .. getCreatureName(cid) .. ". He was killed by "..(isMonster(attacker) and "a "..string.lower(getCreatureName(attacker)) or isCreature(attacker) and getCreatureName(attacker) or "a field item")..".") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), false) doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT) if #getPlayersInZombieEvent() == 1 then local winner = getPlayersInZombieEvent()[1] doBroadcastMessage(getCreatureName(winner)..' has survived at zombie event!') local goblet = doPlayerAddItem(winner, zombie_config.rewards.trophy, 1) doItemSetAttribute(goblet, "description", "Awarded to " .. getPlayerName(winner) .. " for winning the Zombie event.") getZombieRewards(winner, zombie_config.rewards.items) doTeleportThing(winner, getTownTemplePosition(getPlayerTown(winner)), false) doSendMagicEffect(getPlayerPosition(winner), CONST_ME_TELEPORT) doBroadcastMessage(getPlayerName(winner).." won the Zombie event! Congratulations!") HaveCreatureZombie(zombie_config.arena, true) ZerarStoragesZombie() end else doBroadcastMessage("No one survived in the Zombie Event.", MESSAGE_EVENT_ADVANCE) HaveCreatureZombie(zombie_config.arena, true) ZerarStoragesZombie() end return false end end return true]]></event> <globalevent name="Zombie_Start" interval="60000" event="script"><![CDATA[ domodlib('zombie_config') function onThink(interval, lastExecution) if zombie_days[os.date("%A")] then local hrs = tostring(os.date("%X")):sub(1, 5) if isInArray(zombie_days[os.date("%A")], hrs) and getGlobalStorageValue(zombie_config.storages[3]) <= 0 then local tp = doCreateItem(1387, 1, zombie_config.teleport[1]) doItemSetAttribute(tp, "aid", 45110) CheckZombieEvent(zombie_config.CheckTime) setGlobalStorageValue(zombie_config.storages[1], 0) setGlobalStorageValue(zombie_config.storages[2], 0) HaveCreatureZombie(zombie_config.arena, true) end end return true end]]></globalevent> <event type="login" name="Zombie_Login" event="script"><![CDATA[ domodlib('zombie_config') function onLogin(cid) registerCreatureEvent(cid, "ZombieBattle") registerCreatureEvent(cid, "ZombieStats") if isInRange(getPlayerPosition(cid), zombie_config.arena[1], zombie_config.arena[2]) then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) end return true end]]></event> <event type="combat" name="ZombieBattle" event="script"><![CDATA[ domodlib('zombie_config') if isPlayer(cid) and isPlayer(target) and isInRange(getPlayerPosition(cid), zombie_config.arena[1], zombie_config.arena[2]) then doPlayerSendCancel(cid, "You may not attack this player.") return false end return true ]]></event> <movevent type="StepIn" actionid ="45110" event="script"><![CDATA[ domodlib('zombie_config') function onStepIn(cid, item, position, fromPosition) if not isPlayer(cid) then return true end if getPlayerAccess(cid) > 3 then return doTeleportThing(cid, zombie_config.teleport[2]) end if getPlayerLevel(cid) < zombie_config.min_Level then doTeleportThing(cid, fromPosition, true) doPlayerSendCancel(cid, "You need to be at least level " .. zombie_config.min_Level .. ".") doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE) return true end if getGlobalStorageValue(zombie_config.storages[1]) <= zombie_config.players.max then doTeleportThing(cid, zombie_config.teleport[2]) setGlobalStorageValue(zombie_config.storages[1], getGlobalStorageValue(zombie_config.storages[1])+1) doBroadcastMessage(getPlayerName(cid) .. " entered the Zombie event! Currently " .. getGlobalStorageValue(zombie_config.storages[1]) .. " players have joined!", MESSAGE_STATUS_CONSOLE_RED) if getGlobalStorageValue(zombie_config.storages[1]) == zombie_config.players.max then setGlobalStorageValue(zombie_config.storages[1], getGlobalStorageValue(zombie_config.storages[1])+1) removeZombieTp() doBroadcastMessage("The Zombie event is now full [" .. getGlobalStorageValue(zombie_config.storages[1])-1 .. " players]! The event will soon start.") for _, var in pairs(getPlayersInZombieEvent()) do doPlayerSendTextMessage(var, MESSAGE_EVENT_ADVANCE, "The first zombie will spawn in " .. zombie_config.timeToStartEvent .. " seconds! Good luck!") end addEvent(spawnZombie, zombie_config.timeToStartEvent*1000) end end return true end]]></movevent> <talkaction words="/zombiestart;!zombiestart" access="5" event="buffer"><![CDATA[ domodlib('zombie_config') if getGlobalStorageValue(zombie_config.storages[3]) > 0 then doPlayerSendCancel(cid, "The event is already starting.") return true elseif not param or not tonumber(param) then doPlayerSendCancel(cid, "Use only numbers.") return true end local param = tonumber(param) <= 0 and 1 or tonumber(param) local tp = doCreateItem(1387, 1, zombie_config.teleport[1]) doItemSetAttribute(tp, "aid", 45110) CheckZombieEvent(tonumber(param)) ZerarStoragesZombie() setGlobalStorageValue(zombie_config.storages[3], 1) HaveCreatureZombie(zombie_config.arena, true) ]]></talkaction> <globalevent name="ZombieDebug-Start" type="start" event="buffer"><![CDATA[ domodlib('zombie_config') ZerarStoragesZombie() return true]]></globalevent> </mod>
OBS: Quem serve em milesegundos, mude essa parte:
<globalevent name="Zombie_Start" interval="60" event="script"><![CDATA[
para
<globalevent name="Zombie_Start" interval="60000" event="script"><![CDATA[
----------------------------------------------------- // --------------------------------------------------
o monstro você instala em data/monsters
zombie event.xml
<?xml version="1.0" encoding="UTF-8"?> <monster name="Zombie Event" nameDescription="an zombie event" race="undead" experience="280" speed="100" manacost="0"> <health now="500" max="500"/> <look type="311" corpse="9875"/> <targetchange interval="5000" chance="50"/> <strategy attack="100" defense="0"/> <flags> <flag summonable="0"/> <flag attackable="0"/> <flag hostile="1"/> <flag illusionable="0"/> <flag convinceable="0"/> <flag pushable="0"/> <flag canpushitems="1"/> <flag canpushcreatures="1"/> <flag targetdistance="1"/> <flag staticattack="90"/> <flag runonhealth="0"/> </flags> <attacks> <attack name="melee" interval="2000" min="-35000" max="-35000"/> </attacks> <defenses armor="15" defense="10"/> <immunities> <immunity paralyze="1"/> <immunity invisible="1"/> </immunities> <voices interval="5000" chance="10"> <voice sentence="You wont last long!"/> <voice sentence="Mmmmh.. braains!"/> </voices> <loot> <item id="2148" countmax="1" chance="100000"/><!-- gold coin --> </loot> </monster>
e a tag em monsters.xml
<monster name="Zombie Event" file="zombie event.xml"/>
Configuração
Sistema
zombie_config = {
storages = {172100, 172101}, -- não edite
players = {min = 2, max = 30}, -- número minimo e máximo para jogadores no evento
rewards = {items ={{2160,10},{2494,1}}, trophy = 5805}, -- premiações do jogador
timeToStartEvent = 30, -- segundos para começar o evento após dar start
CheckTime = 5, -- tempo que o TP fica aberto para os jogadores adrentarem o evento
teleport = {{x=145, y=50, z=7}, {x=176 , y=54, z=5}}, -- posiçãodo tp onde aparece, posição para onde o jogador vai ao entrar no tp
arena = {{x=173,y=52,z=5},{x=179,y=56,z=6}}, -- posição começo e final da area do evento
monster_name = "Zombie Event", -- nome do monstro que será sumonado
timeBetweenSpawns = 20, -- a cada quantos segundos é dado o respaw time do zombie no evento
min_Level = 20 -- level minimo para participar do evento
}
Dia e Horário
zombie_days = {
["Monday"] = {"13:00","18:00","20:00","22:00"},
["Tuesday"] = {"13:00","18:00","20:00","22:00"},
["Wednesday"] = {"13:00","18:00","20:00","22:00"},
["Thursday"] = {"13:00","18:00","20:00","22:00"},
["Friday"] = {"13:00","18:00","20:00","22:00"},
["Saturday"] = {"13:00","18:00","20:00","22:00"},
["Sunday"] = {"13:00","18:00","20:00","22:00"}
}
["Dia em inglês"] = {"horário do evento"}
Configurando a área:
zombie lua.rar
-
narutomaniacos deu reputação a Vodkart em [8.6][MODS] AutoLoot By Account! [+Item]Sistema removido.
Nova versão sem Bugs somente no Discord: vodkart#6090
-
narutomaniacos deu reputação a xWhiteWolf em Novo Sistema de Trainer [0.36~0.4]Olá meus caros do Tibia King, hoje vim trazer pra vocês um sistema que bolei pra um concurso em outro fórum mas acabei ficando descontente e nunca cheguei a disponibilizar.
Eu gostaria de agradecer inicialmente à três acontecimentos que sem eles não seriam possíveis a criação desse sistema.
- A otlist obrigar que os servidores utilizem anti idle
- Os mages do meu servidor reclamarem que não dava pra treinar ml nos trainers
- Ao @Storm Night, que embora tenha me irritado muito nesse tópico aqui , botou a sementinha dessa idéia na minha cabeça.
Explicação É a combinação de dois sistemas que eu ja havia feito, o primeiro escolhe entre todas as salas de treiner aquela que está vazia pra te alocar e o segundo te mantém alimentado e rodando pra simular o anti idle. (Nota: ele não impede o anti idle de fato, se vc quiser fazer isso vc vai precisar editar o script de anti idle que vc utiliza pra ignorar players com determinado storage e adicionar o storage no player quando ele entrar na sala e tirar ao sair.. mas não sei até que ponto isso pode provocar ban da OTservlist por isso decidi não ensinar isso aqui.)
Sem mais delongas, talk is cheap, show me the code.
Idéia Basicamente dá pra reduzir toda a idéia do código nessa foto aqui:
Você tem diversas salas com trainers nesse formato (pode ser em linha reta horizontal ou vertical tb, mas assim fica melhor distribuído). Você inclusive pode criar salas no meio do void de forma que a distancia de uma vc nao consiga ver a outra e vai ser uma experiencia muito amigável para o player ver que está treinando sozinho na paz. Ao entrar no tp ele te aloca na primeira sala vazia, se não houverem salas vazias ele retorna que não tem posições livres
Instalação Você precisa criar as salinhas dos trainers equidistantemente, ou seja, tendo a mesma distância A em X e mesma distância B em Y. Sério, se vc errar nessa parte é porque vc não sabe oque significa equidistante. Vai pesquisar preguiçoso!! Já aviso que não vou dar suporte quanto à isso.
Você vai precisar criar salas parecidas com isso daqui:
Perceba que não tem como ter acesso a essa sala, não tem como ser puxado pra fora do trainer, não tem dor de cabeça nenhuma e quando o player quiser sair ele só entra no tp e volta pro templo ou pra onde vc definir.
Nesse teleport da sala vc adiciona o actionid 14877 e não bota nenhuma posição nele.
Naquele tile que o player irá ficar que inclusive tem id diferente vc bota actionid 14878.
Agora seleciona a area dessa sala no rme e vai copiando e colando percebendo sempre se vc tá criando as salas com mesma distância em X. Se o ponto inicial de uma sala é 140 e vc quer que todas tenham 12 sqm de distancia vc cria em 152, 164, 178.. por aí vai.
Quando terminar as salas que quiser e tiver montado as linhas e colunas da forma que desejou, vc vai criar um tp principal pra alocar os players nessa sala:
Lembrando que ele não deve ter posição no rme, vc só bota o actionID 14876 e deixa a toPos dele 0, 0, 0. Ele não tem q te teleportar pra nenhum lugar pois a posição será decidida por script.
Se você fez tudo certo até agora vc deve ter algo +- assim:
O importante é manter a distancia certinha entre cada sala. Aí no caso eu fiz rX = 11 e rY = 8 (é a terceira ou quarta vez q eu to falando isso, se vcs errarem pqp eu vou ficar muito irritado);
Vc não bota os trainers, e ali embaixo do spawn vc tem que botar um outro obstáculo pra impedir que o player ande pra baixo e dê a sala como livre.
Feito isso só adicionar os scripts abaixo:
movements.xml
<movevent type="StepIn" actionid="14876" event="script" value="trainertp.lua"/> <movevent type="StepIn" actionid="14877" event="script" value="trainertp2.lua"/> <movevent type="StepIn" actionid="14878" event="script" value="foodtrainer.lua"/>
movements/scripts/trainertp.lua:
movements/scripts/trainertp2.lua:
movements/scripts/foodtrainer.lua:
FIM, qualquer dúvida ou comentário ou sugestão coloquem abaixo. Se gostou REP+, se não gostou REP+ pq deu trabalho e vai ser útil pra alguém, mesmo que de estudo.
Abraços do Lobo.
E ao cara do outro fórum que ficou falando que ia dar erro e quis ficar me corrigindo e mandando scripts sem noção pra "mostrar" que sabia de lua:
-
narutomaniacos deu reputação a Douglas Wanz em [Pedido] Tirando Level/skills Por ComandoEu tenho um script desse que uso eu meu otserv..
Mais ele não tira pocentegem apenas adciona level , e pode retira level .
exp: /level nome, 15 = o player ficara level 15
Se o player tive level 300 e vc usa esse comando ele tipo: /level nome, 15 ele ficara com level 15 intendeu? spero que sim...
Vai no seu data/talkactions/script/copie qualquer script e renomei para setplayerlevel.lua adcione isso dentro.
Depois em talkactions.xml adicione essa tag.
Ti ajudei .. me agradeça com um REP+