Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 08/13/20 em todas áreas
-
Spell que bloqueia o target do player
Spell que bloqueia o target do player
Lord Danilus e 3 outros reagiu a Lurk por uma resposta no tópico
4 pontosFiz essa spell a pedido de um usuário do fórum e logo depois outro usuário pediu uma versão onde o target do player afetado pela magia ficasse bloqueado por um tempo configurável, gostei da ideia e decidi postar em forma de tópico. Primeiro de tudo você vai precisar dessa função feita/disponibilizada pelo @WooX (não se esqueçam de passar no tópico dele e agradecer) Em data/spells.xml adicione <instant name="Cancel Enemy Target" words="Cancel Enemy Target" lvl="12" mana="20" range="3" blockwalls="1" needtarget="1" exhaustion="2000" needlearn="0" event="script" value="canceltargetlurk.lua"> <vocation id="1"/> <vocation id="2"/> </instant> em data/spells/scripts crie um arquivo chamado canceltargetlurk.lua e coloque isso dentro --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- local storage = 234512 -- tenha certeza de estar usando um numero que ainda não esteja em uso no seu servidor local tempo = 50 -- tempo em segundos para usar a magia novamente local tempo_block = 5 -- quanto tempo o player afetado pela magia vai ficar sem poder atacar OUTRO PLAYER local templo_cannot_be_blocked = 50 -- tempo em que o target vai ficar invuneravel a spell caso já tenha sido afetado por ela 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 = getCreatureTarget(cid) if isPlayer(target) and getPlayerStorageValue(cid, storage) < os.time() and getPlayerStorageValue(target, 234514) < os.time() then doPlayerTargetCreature(target, target) setPlayerStorageValue(target, 234513, tempo_block + os.time()) setPlayerStorageValue(target, 234514, templo_cannot_be_blocked + os.time()) setPlayerStorageValue(cid, storage, tempo + os.time()) return doCombat(cid, combat, var) elseif getPlayerStorageValue(target, 234514) > os.time() then doPlayerSendCancel(cid, "This player has been affect by this spell recently, you must wait ".. getPlayerStorageValue(target, 234514) - os.time() .." to block his attacks again.") return false elseif getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You must wait ".. getPlayerStorageValue(cid, storage) - os.time() .." seconds to use this spell again.") else doPlayerSendCancel(cid, "You may only cast this spell on players.") end return false end agora em data/creaturescripts.xml adicione <event type="attack" name="lurkBlockTarget" event="script" value="canceltargetlurk.lua"/> em data/creaturescripts/scripts crie um arquivo chamado canceltargetlurk.lua e cole isso dentro --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- function onAttack(cid, target) if getPlayerStorageValue(cid, 234513) > os.time() and isPlayer(target) then return doPlayerSendCancel(cid, "You're under effect of the cancel target spell, you must wait".. getPlayerStorageValue(cid, 234513) - os.time() .." seconds to attack again.") and false end return true end por ultimo, abre o arquivo login.lua que está na pasta data/creaturescripts/scripts e adicione isso ANTES DO ULTIMO RETURN TRUE registerCreatureEvent(cid, "lurkBlockTarget") Se você quer só E SOMENTE SÓ cancelar o target do inimigo uma unica vez, basta utilizar essa versão da spell --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- local storage = 234512 -- tenha certeza de estar usando um numero que ainda não esteja em uso no seu servidor local tempo = 50 -- tempo em segundos para usar a magia novamente 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 = getCreatureTarget(cid) if isPlayer(target) and getPlayerStorageValue(cid, storage) < os.time() then doPlayerTargetCreature(target, target) setPlayerStorageValue(cid, storage, tempo + os.time()) return doCombat(cid, combat, var) elseif getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You must wait ".. getPlayerStorageValue(cid, storage) - os.time() .." seconds to use this spell again.") else doPlayerSendCancel(cid, "You may only cast this spell on players.") end return false end Créditos: Eu pela spell e creaturescript @WooX pela criação da função se gostou, rep+ aqui e no post do @WooX pela função : p4 pontos -
Habdel Show-off
Habdel Show-off
luanluciano93 e 3 outros reagiu a Habdel por uma resposta no tópico
4 pontos4 pontos- SPELL/ Cancelar Target
SPELL/ Cancelar Target
leozincorsair e 3 outros reagiu a Lurk por uma resposta no tópico
4 pontos@BangxD EDITADO: versão mais trabalhada4 pontos- [CreatureScript] Sugestão de balanceamento
Fiz esse script, pra tentar "balancear" as vocations de uma maneira diferente: Melhorar oque eu acho fraco, sem piorar oque está "forte". Por exemplo: Sorcerers que deveriam ser a vocation de dano, bate menos que um druid, visto que ele tem o exevo gran frigo hur, então ao invés de eu editar o gran frigo hur, ou adicionar um "exevo gran flam hur", eu fiz com que os sorceres tenham uma % de chance de dar burn/electrify/curse quando bater com fire, energy e death (respectivamente). Aí deixei varias possibilidades de configurações, e cada um vai editando oq achar necessario até achar um ponto de "equilibrio" ? Oque cada vocation pode fazer: Adicionando o Script em data/creaturescripts/creaturescripts.xml adicione a tag: <event type="healthchange" name="balancevoc" script="vocation_balance.lua"/> em data/creaturescript/scripts/login.lua (ou login_events, depende do teu sv) coloque a tag: player:registerEvent("balancevoc) em data/creaturescript/scripts adicione o arquivo vocation_balance.lua, abra-o e coloque o seguinte script: Então vá até data/events/events.xml, procure por: <event class="Creature" method="onTargetCombat" enabled="0" /> E mude enabled="0" para enabled="1" Aí abra data/events/scripts/creature.lua, procure por function Creature:onTargetCombat(target) e abaixo, coloque a tag: target:registerEvent("balancevoc") E pronto, tá feito o sorvetinho ?2 pontos- [TFS 0.x] Função doPlayerTargetCreature
[TFS 0.x] Função doPlayerTargetCreature
Ackerzin e um outro reagiu a WooX por uma resposta no tópico
2 pontosdoPlayerTargetCreature(cid, target) Essa função adiciona um target ao jogador ou altera caso este já possua um target. Instalação No arquivo luascript.cpp da source procure por: //doPlayerFollowCreature(cid, target) lua_register(m_luaState, "doPlayerFollowCreature", LuaInterface::luaDoPlayerFollowCreature); Acima adicione: //doPlayerTargetCreature(cid, target) lua_register(m_luaState, "doPlayerTargetCreature", LuaInterface::luaDoPlayerTargetCreature); Depois procure por: int32_t LuaInterface::luaDoPlayerFollowCreature(lua_State* L) E adicione acima: int32_t LuaInterface::luaDoPlayerTargetCreature(lua_State* L) { //doPlayerTargetCreature(cid, target) ScriptEnviroment* env = getEnv(); Creature* creature = env->getCreatureByUID(popNumber(L)); if(!creature) { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); return 1; } Player* player = env->getPlayerByUID(popNumber(L)); if(!player) { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); return 1; } lua_pushboolean(L, g_game.playerSetAttackedCreature(player->getID(), creature->getID())); return 1; } Agora no arquivo luascript.h da source procure por: static int32_t luaDoPlayerFollowCreature(lua_State* L); E adicione acima: static int32_t luaDoPlayerTargetCreature(lua_State* L); Pronto, agora basta compilar e a função vai estar pronta pra ser usada.2 pontos- (Resolvido)[Creaturescript] Spam No Default
@Thony D. Serv deixa assim local cfg = { life = 20000, storage = 9999, tempo = 1 -- em segundos } function onCast(cid, target) local master = getCreatureMaster(cid) if exhaustion.check(master, cfg.storage) == false then local pos = getCreaturePosition(master) local pos2 = getCreaturePosition(target) doCreatureAddHealth(master, cfg.life) doCreatureAddMana(master, cfg.life) doSendAnimatedText(pos2, "Absorve", TEXTCOLOR_BLUE) exhaustion.set(master, cfg.storage,cfg.tempo*7) doSendMagicEffect(pos, 12) else -- exhaustion.set(master, cfg.storage,0) doPlayerSendTextMessage(master, MESSAGE_STATUS_WARNING, "Sua Mana E Seu Hp Encheram 20k Proximo Buff em " ..exhaustion.get(master, cfg.storage).." segundos.") end return true end2 pontos- [TFS 0.x] Função doPlayerTargetCreature
Essa função adiciona ou altera o alvo de um jogador, ou seja faz ele atacar quem você definir. A utilidade da função depende da sua criatividade, daria pra fazer uma talkaction onde o player pode escolher seu target "!attack Joaozinho" ou uma spell de Genjutsu para derivados de Naruto onde altera o target do alvo, fazendo ele pensar que está atacando alguém quando na verdade está atacando outro, o limite das possibilidades é sua criatividade. Sim, daria.2 pontos- Animated Outfits 12.31
1 pontoOla Tibianos!!!! Gesior tinha atualizado até a versão 10.92 com addons, monstros e mounts. Mas como ele não atualizou mais, decidi continuar nesse movimento, então sempre que possivel estarei trazendo as novidades do nosso querido e amado tibia. Meta é sempre estar atualizando com os novos looks do global. Adicionei o cache em todos os arquivos, então agora e so baixar e usar, claro que precisa ser configurado no site de vocês. Nessa ultima att ja vem com o incrivel Dragon Slayer e as montarias novas que a cip lançou para ajudar o pessoal com Covid-19. Download Créditos Tutorial Gerando Cache so se não souber mesmo.1 ponto- [novo] » Mapas do Nolis
1 pontoOlá, bem vindo ao meu portfolio. Decidi abandonar o anterior (este aqui) devido à quantidade de comentários e imagens quebradas. Este em vez, usarei para organizar e publicar imagens de mapas. Siga o tópico para receber notificações de novos mapas! » ↑ (clique no botão seguir) ↓ ↓ « « » » ↓ ↓ Mapas do Nolis | Mapas de Projetos | | Mapas de Eventos | ...1 ponto- [Lua & C++] getOtsysTime() + getPlayerPing(cid) + doPlayerSendPing(cid)
[Lua & C++] getOtsysTime() + getPlayerPing(cid) + doPlayerSendPing(cid)
Gustavo Castro reagiu a Yan Liima por uma resposta no tópico
1 ponto#Introdução Bom hoje estarei trazendo aqui o sistema de Ping feito pelo Mock, com uma pequena adaptação feita por mim para funcionar em TFS 0.4(talvez podendo funcionar em outras) Pois o que ele disponibilizou foi apenas para TFS 0.3.6 e nem foi muito utilizado pela comunidade. Muitos servidores daqui para download tem script no talk mas a lib está totalmente errada e não tem o code nas sources. Esse sistema tem varias utilizades, podendo usar o comando !ping para verificar seu ms ou até mesmo por para kikar jogadores com ms muito alto... Se você não sabe o cliente já tem um sistema de ping, e getOtsystime é como os.time () + os.clock (), você tem ano, mês, dia, hora, minutos, segundos, milisegundos... Enfim chega de enrolação e vamos lá! Code para TFS 0.4 e OTX: Code para TFS 0.3.6 LIB: Prontinho, agora seu servidor está pronto para utilizar as funções de Ping. Seja criativo! Ahh você é daqueles que quer tudo na mão né? Aqui vai um talkactions para ver o ping. Em talkactions/scripts crie um arquivo chamado playerping.lua, cole isto dentro: -- Script by Yan Liima(Night for tibiaking.com) function onSay(cid, words, param, channel) local ms = ping.CheckPing(cid) doPlayerSendTextMessage(cid,22,"Ping aproximado --> ["..ms.."].") return true end Em talkactions.xml <talkaction words="!ping" event="script" value="playerping.lua"/>1 ponto- Countdown horário dos próximos eventos
Peço desculpas caso esteja postando na área errada, por favor movam o tópico. Isso é um tutorial O script já existe na base que o @WooX postou aqui mas quando tentei passar pro meu sv 0.4 ficava dando debug dai eu desisti na época. Dai eu tava tentando ajudar nesse tópico, tentei mais uma vez e consegui fazer funcionar. Exemplo de como fica ingame Vamos a instalação em data/globalevents/scripts crie um arquivo chamado eventcheck.lua e cole isso dentro local EventsListalist = { {time = "01:00", name = "Snowball Event"}, {time = "02:00", name = "DesertWar Event"}, {time = "03:00", name = "Capture The Flag"}, {time = "04:00", name = "FireStorm Event"}, {time = "09:00", name = "Defend The Tower"}, {time = "10:00", name = "Snowball Event"}, {time = "11:00", name = "DesertWar Event"}, {time = "12:00", name = "Capture The Flag"}, {time = "13:00", name = "FireStorm Event"}, {time = "15:00", name = "Battlefield Event"}, {time = "16:00", name = "Defend The Tower"}, {time = "17:00", name = "Snowball Event"}, {time = "18:00", name = "DesertWar Event",}, {time = "19:00", name = "Capture The Flag",}, {time = "20:00", name = "FireStorm Event"}, {time = "21:00", name = "Real Castle"}, {time = "22:00", name = "Battlefield Event"}, {time = "23:00", name = "Defend The Tower"} } local position = {x = 129, y = 58, z = 7} -- posição do mapa onde o efeito vai sair function onThink(interval, lastExecution) local people = getPlayersOnline() if #people == 0 then return true end local Count = 0 for _, t in ipairs(EventsListalist) do local eventTime = hourToNumber(t.time) local realTime = hourToNumber(os.date("%H:%M:%S")) if eventTime >= realTime then doCreatureSay(people[1], "Proximo evento as {"..t.time.."h} "..t.name..", faltam "..timeString(eventTime - realTime)..".", TALKTYPE_ORANGE_1, false, 0, position) -- não use acentos aqui ou eles serão alterados por simbolos ingame return true end Count = Count + 1 end return true end Em data/globalevents/globalevents.xml adicione <globalevent name="eventos" interval="10000" event="script" value="eventcheck.lua"/> Depois adicione no fim de data/lib/050-function.lua function hourToNumber(str) -- By Killua local hour = (tonumber(str:sub(1,2))*3600) + (tonumber(str:sub(4,5)) * 60) if #str > 5 then hour = hour + tonumber(str:sub(7,8)) end return hour end function timeString(timeDiff,english) -- créditos: Killua local dateFormat = {} if english then dateFormat = { {"day", timeDiff / 60 / 60 / 24}, {"hour", timeDiff / 60 / 60 % 24}, {"minute", timeDiff / 60 % 60}, {"second", timeDiff % 60} } else dateFormat = { {"dia", timeDiff / 60 / 60 / 24}, {"hora", timeDiff / 60 / 60 % 24}, {"minuto", timeDiff / 60 % 60}, {"segundo", timeDiff % 60} } end local out = {} for k, t in ipairs(dateFormat) do local v = math.floor(t[2]) if(v > 0) then table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) end end return table.concat(out) end Créditos: @WooX que postou a base onde eu peguei o script Aparentemente o Killua que criou a função hourToNumber Seja lá quem criou o script, tem o nome de um tal "Henrique" no arquivo original, talvez tenha sido ele E eu por algumas pequenas alterações pra fazer o script funcionar em tfs 0.4 CASO VOCÊ QUEIRA O MESMO SISTEMA PARA OTX 2 PROVAVELMENTE O DA BASE POSTADO PELO WOOX VAI FUNCIONAR desde que você adicione o hourToNumber na lib1 ponto- [Retirado](Action Autoloot System) 2020
[Retirado](Action Autoloot System) 2020
Kyle Bellini reagiu a El Reverso por uma resposta no tópico
1 pontoCONTEUDO RETIRADO!1 ponto- Monstros não andam em corpses? Resolvendo isso! UPDATE: 14/06/2023
Monstros não andam em corpses? Resolvendo isso! UPDATE: 14/06/2023
Doidodepeda reagiu a L3K0T por uma resposta no tópico
1 pontoOlá pessoal! Vamos resolver esse problema dos monstros não passarem por cima de outros corpse para te atacarem... Trata-se de uma pequena modificação no rev3777 tfs 0.4, um bug comum nesse TFS. Aqui está a alteração que fiz para que funcione! Tile.cpp: if(!creature->canWalkthrough(*cit)) return NOTPOSSIBLE; //NOTPOSSIBLE Mude para: if (!creature->canWalkthrough(*cit) && (!cit->isCreature() || cit->isCorpse())) return NOTPOSSIBLE; // NOTPOSSIBLE Após isso, exclua todo o conteúdo da pasta "obj" e compile novamente. Pronto, o problema estará resolvido! Créditos para mim, @L3K0T1 ponto- (Resolvido)Preciso colocar um cooldown nessa spell.
(Resolvido)Preciso colocar um cooldown nessa spell.
Thensus Warrior reagiu a Jazz por uma resposta no tópico
1 pontolocal storageCoolDown = 6547 -- Valor da Storage, local storageTime = 5 -- Tempo em Segundos local time_between_hits = 0.3 --seconds local combat = Combat() combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) combat:setParameter(COMBAT_PARAM_EFFECT, 32) combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ETHEREALSPEAR) function onCastSpell(creature, var) local player = Player(creature:getId()) if player:getStorageValue(storageCoolDown) < os.time() then player:setStorageValue(storageCoolDown, os.time() + storageTime * 1000) combat:execute(creature, var) addEvent(function() combat:execute(creature, var) end, time_between_hits * 1000) else player:sendTextMessage(MESSAGE_STATUS_DEFAULT, "Você deve aguardar no mínimo " .. storageTime .. " segundos antes de utilizar esse feitiço.") return false end return true end Tenta agora, acho que vai, foi mal a demora kkk1 ponto- Spell que bloqueia o target do player
@Lurk como ficaria uma spell em área que tira o target de todos menos de quem esta em party ou da mesma guilda ficaria legal também usar magia em área não permitir atacar quem tomar essa spell tanto durante 5 segundos quanto remover apenas 1 vez1 ponto- (Resolvido)Preciso colocar um cooldown nessa spell.
(Resolvido)Preciso colocar um cooldown nessa spell.
Thensus Warrior reagiu a Jazz por uma resposta no tópico
1 pontolocal storageCoolDown = 6547, -- Valor da Storage, local storageTime = 5, -- Tempo em Segundos local time_between_hits = 0.3 --seconds local combat = Combat() combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) combat:setParameter(COMBAT_PARAM_EFFECT, 32) combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ETHEREALSPEAR) function onCastSpell(creature, var) local player = Player(creature:getId()) if player:getStorageValue(storageCoolDown) < os.time() then player:setStorageValue(storageCoolDown, os.time() + storageTime * 1000) combat:execute(creature, var) addEvent(function() combat:execute(creature, var) end, time_between_hits * 1000) else player:sendTextMessage(MESSAGE_STATUS_DEFAULT, "Você deve aguardar no mínimo " .. storageTime .. " segundos antes de utilizar esse feitiço.") return false end return true end @Thensus Warrior, Tenta ai, estou meio enferrujado com os.time e storage, eu nem testei antes de te enviar... Eu acho que vai funcionar, se não funcionar me avise que eu volto.1 ponto- SPELL/ Cancelar Target
1 ponto@diarmaint editei minha primeira resposta do tópico aqui, olha lá @RicK Sanchez @BangxD atualizem tb @leozincorsair atualizei dnv atualizado dnv, acessa aqui https://tibiaking.com/forums/topic/100214-spell-que-bloqueia-o-target-do-player/ @diarmaint @RicK Sanchez @BangxD1 ponto- SPELL/ Cancelar Target
1 ponto@BangxD @RicK Sanchez acabei de testar aqui, em spells.xml troca por isso aqui <instant name="Cancel Enemy Target" words="Cancel Enemy Target" lvl="12" mana="20" range="3" blockwalls="1" needtarget="1" exhaustion="2000" needlearn="0" event="script" value="canceltarget.lua"> </instant>1 ponto- [TFS 0.x] Função doPlayerTargetCreature
@BangxD comentei no seu tópico, da uma olhada lá1 ponto- [TFS 0.x] Função doPlayerTargetCreature
Daria sim, como mencionado acima seria só fazer o player targetar a si mesmo, a source faz o resto do trabalho e cancela o target dele.1 ponto- [8.60][OLD Client] Narutibia (NTO HARD) - Servidor Completo
[8.60][OLD Client] Narutibia (NTO HARD) - Servidor Completo
Stromber reagiu a allmarshall por uma resposta no tópico
1 pontoVocê só tem que apagar as samples (no MySQL) e fazer outros com os mesmos nomes e dados (Vocation, Looktype, Manamax, healthmax, etc). Se não souber como fazer, no meu perfil tem uma publicação sobre isso que tem uma explicação mais detalhada.1 ponto- [CreatureScript] Sugestão de balanceamento
Tem essa opção também, mas pegaria tecnicamente todas... Caso fosse somente a 1 e a 3, teria que ser pelo or mesmo. Mas boa observação!1 ponto- [CreatureScript] Sugestão de balanceamento
@Movie @Mor3nao @diarmaint acho q da p simplesmente fazer um if creature:isPlayer() and (creature:getVocation():getClientId()) >= 1 then q deve funfar pra todas1 ponto- ERRO NO TFS
ERRO NO TFS
Bruce Pereira reagiu a diarmaint por uma resposta no tópico
1 pontoFique sempre atento ao que o erro informa "Wrong vocation name" você mudou o nome das vocações em vocations.xml? Edit-- o server está lendo as magias e não encontrando as vocações ditas lá, visto que vc refez elas. Esse erro vai parar apenas se não tiver nenhum poder com vocação do tibia.1 ponto- Chest daily (Vip)
1 pontoThank you very much. It served me perfectly. Just tweak the messages a bit and i separated them. What do you think? ... Thank you! function onUse(cid, item, fromPosition, itemEx, toPosition) local daysvalue = 1 * 24 * 60 * 60 local daily = getPlayerStorageValue(cid, 13541) local rewards = { { item = 12832, count = 1 }, { item = 2160, count = 100 }, { item = 12227, count = 1 }, { item = 12331, count = 1 }, { item = 12618, count = 5 }, { item = 12242, count = 1 }, { item = 2145, count = 1 } } if (daily == -1) then daily = 0 end if getPlayerStorageValue(cid, 13540) - os.time() <= 0 and getPlayerLevel(cid) >= 300 then local random = math.random(1, #rewards) doPlayerAddItem(cid, rewards[random].item, rewards[random].count) time = os.time() + daysvalue setPlayerStorageValue(cid, 13540, time) setPlayerStorageValue(cid, 13541, daily+1) local daily = getPlayerStorageValue(cid, 13541) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You done your " .. daily .. " Daily Chest.") elseif getPlayerLevel(cid) < 300 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You must be at least level 300.") elseif getPlayerLevel(cid) < 300 or not isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need to have premium account to do this chest.") else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You must wait 24 Hours to get your daily chest. Next avaiable will be at: " .. os.date("%H:%M:%S", getPlayerStorageValue(cid, 13540)) .. ".") end return true end1 ponto- [CreatureScript] Sugestão de balanceamento
Só uma observação, mas nada demais... Esse tipo de verificação não é necessária if balance.canBlock == true then Você pode fazer apenas if balance.canBlock then Caso seja true, ele vai passar normalmente, caso for false ele para ali e nem termina de executar o código.1 ponto- Arrumando o ERRO UPTIME; 00:00:00
UPTIME 00:00:00 Olá pessoal tudo bem? espero que sim! Sou o(a) L3K0T e hoje irei ensinar, como remover aquele erro de uptime do servidor que sempre ficar em "00:00:00" toda vez que dissemos !uptime, algumas source tem esses problemas, uma forma que achei pra resolver foi seguindo o tutorial de explicação abaixo. vá em data\creaturescripts\scripts e abra o arquivo.lua chamado login.lua;; lá no final de login.lua, antes de;; return true end Adicione;; getWorldUpTime() feito isso é só salvar e reiniciar o servidor. Quando você entrar pela primeira vez e já vai conta o uptime no servidor. Parece tão simples né? pois é!!! algumas pessoas vivem quebrando a cabeça pra arrumar isso. *melhor você ser quem você é do que fingir que sabe alguma coisa e não sabe de nada, fica a dica.1 ponto- Lembram do NTO antigo sem sprites top down?
Ilustração perfeita, Léo. @Tópic, Creio que a hora de solicitar o fechamento do tópico em formações de equipe se aproxima. Uma boa noticia sobre o projeto, Woox e eu voltamos a trabalhar juntos nessa empreitada. Essa primeira semana eu conclui algumas coisas pequenas, nada muito grande mas me serviu como uma provação própria, fiquei feliz de fazer pois lembro-me que em dois mil e dezenove isso era totalmente impossível. Quando será que as coisas começaram a fazer sentido? ? Mas longe de querer bancar o babaca, essa semana que entra vou começar a trabalhar com modificações no sistema de NPC. O servidor está sendo arquitetado aos poucos e mesmo a ideia atual ser uma mecânica mais simples do que quando imaginado anteriormente, ainda sim contará com suas inovações e complexidades. Essa talvez seja uma das últimas postagens pois assim que o servidor contar com uma ou outra inovação pretendo criar um tópico na área de show-off.1 ponto- Modificando Extensions III - Doodads (montando objetos)
• Extensions Customizadas I - Grounds • Extensions Customizadas II - Walls > Extensions Customizadas III - Doodads (objetos montados) Os arquivos que serão editados serão estes abaixo, faça um backup antes de começar: • Mostrarei 4 tipos de Doodads que podem ser criados na paleta: 1 - Um item único simples. 2 - Itens que se conectam. 3 - Vários itens sortidos. 4 - Peças no andar superior e inferior, vertical e horizontal. Agora vou mostrar como funcionam os códigos desses doodads. Eles podem ser usados como modelo para criar outros. 1 - Item único. Em RME - data - versão - doddads.xml Usarei o item Lava Fountain como exemplo: <brush name="lava fountain" type="doodad" server_lookid="5074" draggable="true" on_blocking="false" thickness="100/100"> <alternate> -- south -- <item id="5074" chance="10"/> </alternate> <alternate> -- east -- <item id="5075" chance="10"/> </alternate> </brush> Brush Name: o nome que será identificado posteriormente em tilesets.xml, para ser cadastrado na paleta Type: Não mude. Server_lookid: Id do item que aparecerá na paleta. Draggable: Se o item é arrastável ou não. On_blocking: Se o item poderá ser colocado em cima de outros objetos ou void, ou apenas em um piso andável. Thickness: Não mude. • Para este item simples, veja que é possível adicionar outras versões do mesmo item, como por exemplo ele virado para outras direções, para isso você usa a tag: <alternate> conteúdo </alternate>. • No map editor, para alternar a direção do item utilize a tecla Z. Não precisa definir a direção do item no código, conforme você utilizar a tecla Z o item será alternado de acordo com a ordem que os objetos foram adicionados no código. 2 - Itens que se conectam: Em RME - data - versão - doddads.xml Usarei o item Stone Wall como exemplo: <brush name="stone railing2" type="wall" server_lookid="3481"> <wall type="pole"> <item id="3483" chance="1"/> </wall> <wall type="horizontal"> <item id="3481" chance="1"/> </wall> <wall type="vertical"> <item id="3482" chance="1"/> </wall> <wall type="corner"> <item id="3480" chance="1"/> </wall> </brush> • Type wall permite usar as tags "pole, horizontal, vertical e corner", para definir como os itens serão conectados, portanto não mude. Não esqueça de sempre fechar a tag corretamente <wall type...> ... </wall>. Wall type Pole id: Wall type Horizontal id: Wall type Vertical id: Wall type corner id: 3 - Itens sortidos: Em RME - data - versão - doddads.xml Usarei o item Stone Rocks como exemplo: <brush name="tiny stone rocks" type="doodad" server_lookid="3614" draggable="true" on_blocking="true" on_duplicate="true" thickness="50/100"> <item id="3610" chance="4"/> <item id="3611" chance="7"/> <item id="3613" chance="7"/> <item id="3614" chance="10"/> </brush> • Parecido com o código do Lava Fountain, a diferença é que nesse caso não tem a tag alternate, pois os itens não possuem uma direção específica. Mas possuem variedades, e isso pode ser feito simplesmente duplicando o código <item id..../> • Chance irá definir qual item aparecerá mais vezes e menos vezes. 4 - Peças no andar superior e inferior Em RME - data - versão - doddads.xml Usarei o item Waterfall como exemplo: <brush name="waterfall" type="doodad" server_lookid="3569" draggable="true" on_blocking="true" on_duplicate="true" thickness="100/100"> <alternate> <composite chance="10"> <tile x="0" y="0" z="0"> <item id="3569" chance="10"/> </tile> <tile x="0" y="1" z="0"> <item id="3573" chance="10"/> </tile> <tile x="0" y="0" z="-1"> <item id="3571" chance="10"/> </tile> </composite> </alternate> <alternate> <composite chance="10"> <tile x="0" y="0" z="0"> <item id="3570" chance="10"/> </tile> <tile x="1" y="0" z="0"> <item id="3574" chance="10"/> </tile> <tile x="0" y="0" z="-1"> <item id="3572" chance="10"/> </tile> </composite> </alternate> </brush> • Veja que para adicionar um item que contém uma parte dele no andar superior, usamos o esquema x, y, z dentro da tag <composite></composite>. Lembrando que: (o centro = 0 é o SQM onde for aplicado o conjunto de itens) - X representa a linha horizontal, positivo = vai para a direita, negativo = vai para a esquerda. - Y a vertical, positivo = vai para o sul, negativo = para o norte. - e Z floors (andares), sendo que Z negativo = para subir e Z positivo = para descer, Z = 0 representa o andar-centro (onde o item for aplicado). - Composite chance: mantenha o mesmo valor para ambas as opções • Nesse código foi usado a tag <Alternate></alternate> por que a cachoeira possui duas direções, e para alterná-las use a tecla Z. • Observando a primeira tag <alternate> veja a posição dos três itens: • Cadastre os doodads em tilesets.xml, use a ferramenta CTRL + F para procurar itens próximos ou paletas que você quer adicionar os itens e acrescente as tags: Exemplo: <brush name="lava fountain"/> • Use os códigos de modelo para criar novos itens. • O estilo de doodad (exemplo 4) pode ser usado para criar pontes, estátuas e outros objetos que possam ser montadas as partes. • Dúvidas? Comente.1 ponto- (Resolvido)Erro stamina system
(Resolvido)Erro stamina system
Joaogabriel reagiu a ikaroangelo21 por uma resposta no tópico
1 pontoeventsId = {} local function rechargeStamina(cid) if not isPlayer(cid) then eventsId[cid] = nil return end doPlayerAddStamina(cid, 1) eventsId[cid] = addEvent(rechargeStamina, 3 * 60 * 1000, cid) end function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if isPlayer(cid) then eventsId[cid] = addEvent(rechargeStamina, 3 * 60 * 1000, cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Bem vindo aos trainers VIP's " .. getCreatureName(cid) .."! Você receberá 1 minuto de stamina a cada 3 minutos nos trainers VIP's.") end return true end function onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor) if isPlayer(cid) then stopEvent(eventsId[cid]) eventsId[cid] = nil end return true end Onde tem 1 = ganho de stamina. Onde tem 3 = o tempo para ganhar 1 minuto. Somente modificar, testado em otx 8.60.1 ponto- [TFS 1.x] antiTheft para casas
[TFS 1.x] antiTheft para casas
Thensus Warrior reagiu a vankk por uma resposta no tópico
1 pontoQuem não está invitado na casa não pode jogar lixo na casa, ou pessoas que são "convidadas" não podem mexer nos items da casa. Vai em events/events.xml e ative o onMoveItem, trocando de 0 para 1. eg: <event class="Player" method="onMoveItem" enabled="1" /> Então vai em events/scripts/player.lua copia isso o code abaixo em baixo da funcão: function Player:onMoveItem(item, count, fromPosition, toPosition) local antiTrash = true local antiTheft = true if antiTrash then local tile = Tile(toPosition) if tile and tile:hasFlag(TILESTATE_HOUSE) then local house = tile:getHouse() if house then local accessList = House.getAccessList local playerName = self:getName():lower() if house ~= self:getHouse() and (playerName ~= accessList(house, GUEST_LIST):lower() or playerName ~= accessList(house, SUBOWNER_LIST):lower()) then self:sendTextMessage(MESSAGE_STATUS_SMALL, "You cannot throw items into players houses, which you are not invited to.") return false end end end end if antiTheft then local tile = Tile(fromPosition) if tile and tile:hasFlag(TILESTATE_HOUSE) then local house = tile:getHouse() if house then if house ~= self:getHouse() and self:getName():lower() ~= house:getAccessList(SUBOWNER_LIST):lower() then self:sendTextMessage(MESSAGE_STATUS_SMALL, "You cannot move items from house, which you are only guest to.") return false end end end end Voce configura o script na linha 1 e 2 do code acima. Créditos: Printer.1 ponto- (Resolvido)Preciso colocar um cooldown nessa spell.
(Resolvido)Preciso colocar um cooldown nessa spell.
Thensus Warrior reagiu a Jazz por uma resposta no tópico
0 pontosFico feliz por ajudar, o motivo de ser 1000 é que eu pensei que era milisegundos, fazia mais de ano que eu não mexia com a biblioteca os.time de Lua ?0 pontosLíderes está configurado para São Paulo/GMT-03:00 - SPELL/ Cancelar Target
Informação Importante
Confirmação de Termo