
Tudo que xWhiteWolf postou
-
Sprites Tibia, Dúvida.
vc tem que dividir o desenho por SQMs e fazer um por um os pisos que serão utilizados, daí com o auxilio do DatEditor, SprEditor e do ItemEditor você consegue colocar dentro do seu tibia, só que pros seus amiguinhos virem eles terão que ter o mesmo tibia.dat e tibia.spr que você (necessitando assim de um cliente próprio)
-
Comando !rank, HELP!
tem várias maneiras, pode fazer por uma string excluidora (se tiver god/gm no nome não aparece) ou colocar um if pra checar acess também
-
Proibir newtype de god,cm,gm
function onSay(cid, words, param, channel) if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires param.") return true end local t = string.explode(param, ",") t[1] = tonumber(t[1]) if(not t[1]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command requires numeric param.") return true end local pid = cid if(t[2]) then pid = getPlayerByNameWildcard(t[2]) if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player " .. t[2] .. " not found.") return true end end if(t[1] <= 1 or t[1] == 135 or (t[1] > 160 and t[1] < 192) or t[1] > 351) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Such outfit does not exist.") return true end local tmp = getCreatureOutfit(pid) tmp.lookType = t[1] doCreatureChangeOutfit(pid, tmp) return true end só mudar aqui: if(t[1] <= 1 or t[1] == 135 or (t[1] > 160 and t[1] < 192) or t[1] > 351) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Such outfit does not exist.") return true end vai adicionando os numeros que você não quer que dê pra transformar. if(t[1] <= 1 or t[1] == 135 or t[1] == NUMERO DO OUTFIT or (t[1] > 160 and t[1] < 192) or t[1] > 351)
-
(Resolvido)Sistema sobre attack de monstros
pra tirar sangue é só usar a função de criar item embaixo dele e colocar na pos = getPlayerPosition (cid) com o id da poça de sangue.. Essa magia que vc fez tá errada mas eu só vou conseguir arrumar pra ti depois de segunda
- Corpo do Player não fica no chão
-
(Resolvido)Sistema sobre attack de monstros
se tem a função getResets é mais fácil ainda: local percent = getPlayerMaxHealth(target)+(getResets*50)/10 -- tira 10% da vida + quantidade de resets *50. Se o cara tiver 10 resets vai ser 10% da vida+ 500. O do monstros muito que provavelmente é só pelas sources, a menos que você crie magias de ataque que removem % da vida e coloquem os monstros pra só usarem elas :DD; No caso de uma magia de healing vc pode criar as formulas de min e máximo e colocar pra multiplicar o math random disso por getResets+1 (o +1 serve pra não bugar caso o player tenha 0 resets)
-
Darkness Pact Quest
que estranho, nunca vi erro em dll '-' que server vc usa?
-
(Resolvido)Sistema sobre attack de monstros
o dos monstros eu não sei mas é só usar o sistema de reset por storage e na magia você multiplica o valor do storage pela fórmula de dano, de resto é só fazer formulas que pegam % da vida, usa como base esse script aqui --[[ -- You can use this spell and copy and modify it. -- -- Created By SailorMoonLive -- -- But pls don't remove this comment -- ]] function onCastSpell(cid, var) local CreatureMaxHealth = getCreatureMaxHealth(getCreatureTarget(cid)) if getCreatureTarget(cid) then local CreatureHealth = getCreatureHealth(getCreatureTarget(cid)) local critLife = math.floor(CreatureMaxHealth/3) local lifedraw = math.floor(CreatureHealth /10) if CreatureHealth >= critLife then local Target = getCreatureTarget(cid) local targetPos = getPlayerPosition(Target) doCreatureAddHealth(Target, -lifedraw, COMBAT_LIFEDRAIN) doSendAnimatedText(targetPos, "-"..lifedraw , TEXTCOLOR_WHITE) doSendMagicEffect(targetPos, 0) local pos = getPlayerPosition(cid) doCreatureAddHealth(cid, lifedraw, 1) doSendAnimatedText(pos, "+"..lifedraw , TEXTCOLOR_GREEN) doSendMagicEffect(pos, CONST_ME_MAGIC_BLUE) else doCreatureSay(getCreatureTarget(cid), "STOP", 1) doCreatureSay(cid, "I'm done draining your blood.", 1) end end return true end
-
(Resolvido)Ajuda Simples [doPlayerAddMana(cid, -mana)]
dessa eu não sabia, valeu por compartilhar!
-
[AJUDA] Creaturescript
se são dois monstros diferentes era pra funcionar porque aparentemente não tem nada de errado, oque me faz pensar que o erro é no storage mas eu precisaria fazer alguns testes e eu não entendi muito bem aquilo que vc colocou do zombie event.
-
(Resolvido)Ajuda Simples [doPlayerAddMana(cid, -mana)]
a unica forma é fazendo uma função que remova a condition infight e colocar um addEvent 200 milisegundos dps de remover a mana
-
Precisa estar perto de agua
é engraçado ver que os pedidos aqui do fórum são os mesmos de 5 anos atrás, magia que empurra, magia que corre, magia que precisa estar perto de água.. coisas que os caras já faziam em 7.9. Se ninguém tomar a iniciativa de compartilhar a gente vai ficar pra sempre preso na mesmice dos scripts padrões e vamos acabar trancando a evolução do Open Tibia (que tem esse nome justamente por ser um projeto que deveria promover a abertura de scripts); Eu lembro quando eu comecei scriptar que eu queria fazer um server igual ao AvaOT mas os caras foram tão evoluidos pro tempo deles que até hoje tem coisa que eu não sei fazer, espero que com um pouco mais de estudo eu consiga criar tudo e compartilhar com vocês a solução!
-
Glacier Set dando conditions em área
fico feliz que vc tenha gostado
-
Darkness Pact Quest
Hoje vou ensinar vocês a fazer uma quest com bastante RPG (e com um pouquinho de esforço talvez o melhor sistema já visto num OTSERV!!) É uma quest que você tem um determinado tempo pra matar um monstro e entrar num teleporte ou a passagem será bloqueada "tá, mas oque difere essa quest de qualquer script de arena que tenha aí pelo fórum?" na verdade nada, mas no meu server eu coloquei um tempo bem ridículo (8 segundos) e é tecnicamente impossível chegar do outro lado. "então você fez uma quest que não dá pra fazer, é isso mesmo?" não meu caro amigo, é uma quest que foi feita pra ser pensada. Um dos players entra na quest e termina ela, daí outro player ativa a alavanca e ele passa.. fazendo com que o pessoal só consiga passar com a ajuda de um amigo. Se você conseguir trabalhar em equipe em prol de um prêmio a sua recompensa é a oportunidade de fazer um pacto com as trevas. "masoque??" isso mesmo que você entendeu, você ganha a chance de abrir mão da sua vida (literalmente) pra receber uma spell nova. ~~ Hoje eu vou ensinar a reproduzirem esse sistema caralhudo no server de vocês: Tudo começa no map editor quando você vai fazer uma área + ou - igual a essa e colocar os seguintes actions/unique ids Agora vamos aos scripts: actions\scripts\newquest.lua Feito isso você vai precisar preparar uma sala aonde o player será teleportado caso ele consiga passar e coloque uma alavanca nessa sala. Na alavanca você deve colocar o actionid 6102 e uma plaquinha explicando sobre o pacto daí você adiciona isso no actions.xml <action actionid="6102" script="alavanca de magia.lua"/> e crie o script 'alavanca de magia.lua' que deverá conter o seguinte: Feito tudo isso agora só falta criar a magia Target Spell que no caso é essa daqui: e colocar no spells.xml: <instant name="Target Spell" words="exevo res" lvl="120" maglv="10" mana="500" exhaustion="3000" prem="0" needlearn="1" script="especiais/seguidor.lua"> <vocation id="6"/> <vocation id="7"/> <vocation id="5"/> <vocation id="8"/> </instant> FIM. Agora você só precisa editar as actions pra rodarem de acordo com as posições do seu server então vamos às explicações: SCRIPT1: local tempo = 8000 ---- tempo até a porta fechar local wall1 = {x=612, y=345, z=7, stackpos=1} -- local da primeira pedra local pos1 = getThingfromPos(wall1) local wall2 = {x=653, y=345, z=7, stackpos=1} --- local da segunda pedra local pos2 = getThingfromPos(wall2) local monster1 = {x=615, y=345, z=7, stackpos=1} --- local que cria o monstro, no caso eu uso o Juggernaut mas vc pode editar dentro do script local posmonster1 = getThingfromPos(monster1) local monster3 = {x=654, y=345, z=7, stackpos=1} --- Ultima posição antes do teleporte, serve pra remover o monstro local idparede = 9788 --- id do obstáculo q será criado local alavanca = {x=610, y=344, z=7, stackpos=1} -- POSIÇÃO DA ALAVANCA local alavancapos = getThingfromPos(alavanca) SCRIPT2: local topos = {x=609, y=345, z=7, stackpos=1} -- posição que vai ser teleportado caso clique na alavanca de 'FAIL QUEST' Espero que vocês tenham curtido Aqui tem mais duas imagens pra vocês Alavanca: Magia: EXPLICANDO A MAGIA: Os morcegos seguem a direção que você tá olhando, se vc tiver um target eles seguem o target.
-
Tanker Method
Fala galera do TibiaKing, vim trazer pra vocês uma magia bem simpleszinha mas que vai ajudar muita gente com aquelas dúvidas de funções que mudam outfit. Testado e funcionando em TFS 0.3.6 (8.54) Explicação: É uma spell que ao usar muda seu outfit para o de um warmaster (acho q é isso o nome), aumentando seu escudo e sua vida pelo preço de toda a sua mana. É uma spell excelente para servers com bastante RPG pois dá praticamente uma segunda vida ao player e permite que Knights virem exímios blockers nas quests da vida. Coloquei no meu server e graças a essa spell a galera conseguiu fazer a POI depois de quase 6 meses de server. Vale ressaltar que o player não ganha vida, apenas dobra a quantidade máxima e ele tem que healar a quantidade a mais que ele ganhou. spells\scripts\tanker.lua setConditionParam(condition, CONDITION_PARAM_TICKS, 60000) e doSetCreatureOutfit(cid, mtanker, 60000) e doSetCreatureOutfit(cid, ftanker, 60000) da mesma forma que você pode alterar a quantidade de shield e de vida que você ganha ao utilizá-la mas eu tenho razões pra acreditar que a forma atual dela é a ideal. Aqui no meu server ela tá definida para apenas Knights mas vocês podem editar isso a gosto. spells.xml <instant name="tanker" words="uteta gran vita" lvl="220" mana="300" prem="1" aggressive="0" selftarget="1" exhaustion="2000" needlearn="0" event="script" value="tanker.lua"> <vocation id="8"/> </instant> EDIT: Algumas imagens de como a magia funciona:
-
Magia que Empurra
Bom galera, a um tempo atrás um amigo pediu uma magia que empurrasse e minha primeira iniciativa foi dar uma procura por aí. A maioria dos scripts que eu achei não funcionava, o resto funcionava cheio dos mais variados bugs então eu decidi pegar um desses scripts como base e fazer a magia que empurra. Testado e funcionando em TFS 0.3.6 (Crying Damson). Não lembro de onde eu peguei e nem quem fez porque o autor não colocou créditos no script mas quero deixar bem claro de que 80% dos créditos vão pra esse pessoa, visto que eu apenas me baseei na metodologia dele pra fazer o script funcionar sem bugs Sem mais delongas, vamos ao script: OBS: Ele está 200% funcional, não empurra pra dentro de pz e nem buga de nenhuma forma. Agora no spells.xml adicione: <instant name="Get off here" words="exani grav" lvl="160" mana="500" prem="1" direction="1" exhaustion="2000" needlearn="0" event="script" value="empurrar.lua"> <vocation id="6"/> <vocation id="7"/> <vocation id="5"/> </instant> Faça bom proveito!! EDIT: Algumas imagens pra vocês PS: Dano adicionado pelo membro @Emersonssss ;]
-
Dash.
Uma magia que solta um dash, que é controlado ao mudar a direção que você está olhando (ctrl + seta) ~~~~Script baseado no AvaOT/Korelin dash.lua -- dash as it was in avaOT by Night Wolf local damage = 20 -- dano que toma qnd bate em algum obstáculo local speed = 910 -- velocidade do player ao usar o dash (vai de 0 a mil) local pzprotect = true -- nao deixa entrar em pz com a spell local distance = 15 -- quantos sqms anda local 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 onWalk(cid) if isCreature(cid) then local poslook = getCreatureLookPosition(cid) poslook.stackpos = STACKPOS_TOP_MOVEABLE_ITEM_OR_CREATURE if isWalkable(poslook, false, false, pzprotect) then if not isCreature(getThingfromPos(poslook).uid) then doMoveCreature(cid, getPlayerLookDirection(cid)) doSendMagicEffect(getPlayerPosition(cid), 14) else doCreatureAddHealth(cid, -damage) doSendMagicEffect(getPlayerPosition(cid), 31) doSendAnimatedText(getPlayerPosition(cid), "-"..damage , 180) end else doCreatureAddHealth(cid, -damage) doSendMagicEffect(getPlayerPosition(cid), 31) doSendAnimatedText(getPlayerPosition(cid), "-"..damage , 180) end end return true end function onCastSpell(cid, var) for i = 0, distance do addEvent(onWalk, (1001- math.min(speed, 1000)) *i, cid) end return true end no começo você edita o dano que recebe ao bater num obstáculo e aqui local distance = 15 você configura a distancia máxima que o player percorre antes do dash acabar. no Spells.xml você adiciona essa tag aqui <instant name="Dash" words="utani dash hur" direction="1" lvl="100" mana="200" prem="1" exhaustion="7000" event="script" value="dash.lua"> <vocation id="7"/> <vocation id="6"/> <vocation id="5"/> </instant> EDIT:: ALGUMAS IMAGENS
-
Glacier Set dando conditions em área
Eai galera, esse script eu fiz para um membro aqui do TibiaKing no suporte e achei que ficou bem legal então decidi postar. Explicação: Ao tomar um dano maior que 300, se o player tiver usando a glacier robe, uma área em volta dele vai ser congelada e todos dentro dessa área ficarão com slow. Caso o player estiver com o full glacier set, além do paralyze, as pessoas dentro da área receberão dano de freezing crie um arquivo em creaturescripts\scripts chamado glacierrobe.lua e adicione isso daqui dentro dele agora vá em creaturescripts\scripts e procure um arquivo chamado login.lua. dentro dele coloque isso (de preferencia embaixo dos outros registerCreatureEvent): registerCreatureEvent(cid, "glacierrobe") Lembre-se que se vc quiser repetir isso pra outros set's você tem que repetir todo o processo, tanto no creaturescripts.xml quanto no login.lua no meu server além do set glacier eu uso os outros 3 set's elementais, ficando assim: EDIT:: Algumas imagens pra vocês verem como o script funciona:
-
Precisa estar perto de agua
Fala galera do TibiaKing, pra quem não me conhece eu sou o White Wolf, antigo Night Wolf.. eu venho trazer pra vocês um script que eu to desenvolvendo nas minhas horas vagas e que vai trazer bastante RPG pro server de vocês. Servidor testado: The Forgotten Server 0.3.6 (Crying Damson) Versão do Cliente: 8.45 Explicação: Pra quem já jogou AvaOT/Korelin, deve ter notado que algumas magias da tribo da água necessitam estar perto de água para poderem ser usadas, e foi me baseando nisso que eu criei esse script. É uma magia que ataca os inimigos se estiver com a target e se não estiver com target ela adiciona vida à você, mas precisa estar perto da água para ser usada!! Sem mais delongas, vamos ao script: crie um arquivo chamado waterneeded.lua e coloque em spells\scripts\ --[[ Credits: 30% to Molinero because I used his telekinesis script as base 60% to me (Night Wolf) for doing the rest of the script 10% to the owner of AvaOT for giving me the idea of such thing ~~~FEEL FREE TO EDIT AS YOU WISH, THIS IS JUST A SIMPLE SCRIPT BUT DON'T REMOVE THE CREDITS.~~~ ]] local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, TRUE) function onCastSpell(cid, var) local water = {490, 491, 492, 493, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625} local spot = getPlayerPosition(cid) local nxp = spot.x - 3 local pxp = spot.x + 3 local nyp = spot.y - 3 local pyp = spot.y + 3 local k = 1 local target = getCreatureTarget(cid) for absice = nxp, pxp do for coordinate = nyp, pyp do local pos = {x = absice, y = coordinate, z = spot.z, stackpos = 0} local thing = getThingfromPos(pos) if thing.itemid > 0 then if isInArray(water, thing.itemid) == TRUE then k = k+1 if target == 0 then local CreatureHealth = getCreatureMaxHealth(cid) local lifedraw = math.floor(CreatureHealth /(20*k)) doCreatureAddHealth(cid, lifedraw, 1) doSendAnimatedText(spot, "+"..lifedraw, 18) doSendMagicEffect(pos, 1) doSendMagicEffect(spot, 12) else local tgtpos = getCreaturePosition(target) local life = math.random (200,1000) doCreatureAddHealth(target, -life, COMBAT_LIFEDRAIN) doSendAnimatedText(tgtpos, "-"..life, 89) doSendDistanceShoot(pos, tgtpos, 36) doSendMagicEffect(tgtpos, 53) doSendMagicEffect(pos, 1) return doCombat(cid, combat, var) end end end end end if k ~= nil and k < 2 then doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) doPlayerSendCancel(cid, "You need to be around water to cast this spell..") end return doCombat(cid, combat, var) end OBS1: Perceba que tá bem rudimentar esse script, até porque essa é a primeira versão dele, pretendo melhorar o script com o tempo OBS2: Se você quiser que o script ataque mais de uma vez pra cada water que tiver no mapa substitua na linha 42: return doCombat(cid, combat, var) por doCombat(cid, combat, var) E NÃO ESQUEÇA DE DIMINUIR DO DANO local life = math.random (200,1000) e no spells.xml adicione: <instant name="Water Need" words="utura grav vita" lvl="150" mana="300" prem="1" range="4" casterTargetOrDirection="1" blockwalls="1" exhaustion="3000" needlearn="0" event="script" value="waterneeded.lua"> <vocation id="5"/> <vocation id="6"/> <vocation id="7"/> <vocation id="8"/> </instant> Se você curtiu, não remova os créditos.. Sinta-se livre pra melhorar a magia do jeito que você quiser (uma primeira alteração que eu sugiro é mudar o dano e colocar como sendo um math.random do level do player x magicLevel dele, pra magia ter um dano que aumenta com o tempo, e não algo totalmente aleatório). Gostaria de salientar também que essa é a primeira versão de tal script, tem muita coisa pra melhorar e dá pra diminuir esse script consideravelmente, ficaria super feliz se vocês me ajudassem a melhorar isso e remover coisas desnecessárias EDIT: Trouxe algumas imagens pessoal:
-
(Resolvido)Premio para player antigo.
é um ano a partir da data que você implementou a tag no login.lua... nao sei como faz pra pegar o tempo que o char foi criado. Uma dica é você abaixar o tempo da quest pra 2 meses e depois aumentar pra um ano. Dai a galera consegue fazer a quest a primeira vez agora e na proxima vez só daqui a 1 ano.
-
(Resolvido)Erro no Script
data/actions/scripts/divulgue.lua:2: '=' expected near 'p' erro na linha dois esperado = próximo de 'p' LINHA 2: local texto = Curta nossa página no Facebook oque tem de errado aí? Os espaços e o á que não existe no teclado americano (teclado no qual foi feito o tibia) se for fazer um texto coloque entre aspas. doPlayerSendTextMessage(cid, 23, " "..texto..".") " ".. texto..". " isso é pra retornar o valor de texto mas texto é uma frase inteira. Arrumando fica assim: local strg = divulgue local texto = "Curta nossa pagina no Facebook." function onUse(cid, item, frompos, item2, topos) if getPlayerStorageValue(cid, strg) == 0 then setPlayerStorageValue(cid, strg, 1) doPlayerSendTextMessage(cid, 23, texto) else doPlayerSendCancel(cid, "Voce ja clicou, agora va pegar sua recompensa no NPC Rey.") end elseif getPlayerStorageValue(cid, strg) == 2 then doPlayerSendCancel(cid, "Voce ja pegou sua recompensa por ajudar na divulgacao.") return true end
-
NPC que dá um item e passa uma mensagem.
agora ta certo local strg = divulgue local texto = "Curta nossa pagina no Facebook." function onUse(cid, item, frompos, item2, topos) if getPlayerStorageValue(cid, strg) == 0 then setPlayerStorageValue(cid, strg, 1) doPlayerSendTextMessage(cid, 23, texto) else doPlayerSendCancel(cid, "Voce ja clicou, agora va pegar sua recompensa no NPC Rey.") end elseif getPlayerStorageValue(cid, strg) == 2 then doPlayerSendCancel(cid, "Voce ja pegou sua recompensa por ajudar na divulgacao.") return true end
-
(Resolvido)Premio para player antigo.
ok, me empolguei.. o script ficaria assim: abre seu creaturescripts\login.lua e adiciona isso daqui nele: if getPlayerStorageValue(cid, 5555) == -1 then setPlayerStorageValue(cid, 5555, os.time()) end function onUse(cid, item, fromPosition, itemEx, toPosition) local config = { uniqid = 17790, item = XXXXX, -- ID DO ITEM ano = 365*24*60*60, msg1 = "You have found a ".. getItemNameById(config.item)..".", -- mensagem ao fazer a quest msg2 = "You have to play for one year to get the prize.", -- mensagem pra quem não tem 1 ano de jogo } if item.uid == config.uniqid then if os.time() - getCreatureStorage(cid, 5555) >= config.ano then doPlayerSendTextMessage(cid,22,config.msg1) doPlayerAddItem(cid,config.item,1) setPlayerStorageValue(cid, 5555, os.time()) else doPlayerSendTextMessage(cid,22,config.msg2) doSendMagicEffect(cid, CONST_ME_POFF) end end return 1 end Nesse modo dá pra fazer a quest todo ano. Ao fazer a quest pela primeira vez ele zera a data e tem que esperar +1 ano pra fazer ela dnv
-
(Resolvido)[AJUDA] Ganhar addon com X item no inventário.
o outfit continua porque vc setou aquele outfit no player, pra remover vc tem que colocar um while item equipado ou colocar pra mudar pra outfit qnd remover
-
(Resolvido)Premio para player antigo.
respondendo sua dúvida: É possível sim. Coloca um creaturescript que salva a data que o player criou o char e na quest vc faz um script que utiliza os.date ou até mesmo a diferença entre os.time do dia que criou até o dia atual. Se for maior que 1 ano (em segundos) faz a quest. Um exemplinho de como fazer assim: doCreatureSetStorage(cid, 5555, os.time()) salva no storage a data atual em segundos if os.time() - getCreatureStorage(cid, 5555) >= TEMPO QUE PRECISA se o tempo atual - tempo que o player criou a conta for maior ou igual ao tempo que precisa, executar script da quest --------------------------------------------------------------------- Lembrando que se o tempo que vc quiser for um ano ficaria assim: local ano = 365*24*60*60 if os.time() - getCreatureStorage(cid, 5555) >= ano then do quest else return ERROR end só um exemplo, o resto é contigo amigão