Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 05/18/10 em todas áreas
-
Inicialmente pensei em chamar esse artigo de "ambientação psicológica" ou algo do tipo. Quer bater um x1 de "psicológico", X-Man? Entendeu? X-Man, haha! Felizmente, percebi qeu não faria muito sentido, já que eu não tenho conhecimento algum em psicologia, fazendo com que qualquer coisa que viesse a ser dita não passasse de merda especulação. No final, fiquei com o título simples (KISS): os detalhes da ambientação. No artigo anterior, foram ressaltadas várias e várias vezes a parte geral da ambientação e como é necessário bom senso na criação do ambiente. Bom senso de novo, não! Não! NÃÃÃÃÃÃOOOO!!!!! Já nesse artigo será ressaltada a importância dos detalhes, e os problemas do excesso deles. Os detalhes são o principal diferencial em ambientes, reais ou virtuais. Imagine uma casa de um membro da família real inglesa. Agora imagine que essa casa é antiga, que está na família há gerações... Em um cenário como esse, é de se esperar que seja uma grande mansão, já que esse era e continua sendo o padrão arquitetônico dos nobres. Espera-se também que seja bem conservada, já que teoricamente a família real inglesa não está falida. No Hall de Entrada, onde também se realizam os bailes, um grande lustre de cristal está pendurado. Tudo isso é parte da ambientação geral, tudo fruto do bom senso. Sou um aristocrata milhonário - um de muito bom senso. Os detalhes nessa casa estariam não nas grandes demonstrações públicas de riqueza e poder, coisas esperadas na casa de um aristocrata, mas sim naquilo que contasse a história da casa e de seus habitantes: São os detalhes que contam histórias quando nada mais o faz. Os detalhes mexem com o imaginário da pessoa, fazem ela se perguntar "o que aconteceu para ter esse negócio aqui?" ou "o que será que essas pessoas dos retratos fizeram?". E mais importante que tudo, os detalhes são o acabamento final do portal que transporta o jogador para a pele do personagem. Acabamento final do portal? Que droga de analogia, hein!? Lembro-me até hoje de quando entrei na cripta do cemitério do segundo boss do Diablo II: Corpos torturados e dilacerados por todos os lados. Até esse momento eu jogava mais um jogo de RPG. Depois disso eu estava participando da salvação de um mundo decaído, corrompido, tomado pelo mal. No Tibia, esses detalhes são as caveirinhas bem posicionadas para dar um alerta aos intrusos, ou para demonstrar o "refeitório" de um monstro; as fogueiras onde os trolls se reunem; as aranhas fracas (filhotes) antes de se chegar às maiores. Guardas em uma fortaleza, portões que se fecham em horários determinados para simular dia e noite, NPCs que deixam de vender armas e armaduras por uma explosão em uma mina de ferro. Um túmulo no meio do nada, sem motivo aparente, que não faz nada senão dar respawn de um ghoul a cada 20 dias, que quando se fala a palavra secreta se transforma em uma banshee, devido a uma maldição antiga lançada sobre um rei antigo. Um rato que sempre surge em um local específico do esgoto onde só há rotworms (que deveriam comer todos os ratos dali), mostrando uma entrada secreta para um armazém que é o início de uma quest. "Sujeirinhas" e pedrinhas pelo chão, sangue e ossos onde se tem necromantes, rachaduras nas paredes de um edifício que está caindo por causa de uma explosão que aconteceu no subterrâneo. Não há limites para a imaginação, ou melhor, há. Deixa eu ver se consigo adivinhar... BOM SENSO. E o excesso, ao invés de dar o toque de mestre, polui e estraga tudo. Tome como exemplo a comidinha da mamãe: tem dias que está perfeita, e tem dias que ela exagera no sal. Sujeira demais no ambiente, estraga. Ossos por todos os lados, sem critério, tiram todo o drama da coisa. Os detalhes mexem sim com o psicológico da coisa, dão o ar de realidade, tiram um pouco da falsidade do jogo. E é isso. Só tente não se esquecer: Ah, tá me tirando já. O segredo está nos detalhes. AAAAAAAAAHHHHHHHHHHHH!!!!!3 pontos
-
Efeito De Tinta
Renato Ribeiro reagiu a fsg por um tópico no fórum
Vou ensinar hoje á vocês um tutorial bem simples. Efeitos de Tinta! Então começando: Para vocês fazerem o efeito de tinta basta usar uma Fonte que está disponível a Download ao lado Download. Como Instalar: Para instalar a Letra você tem que ir em "WINDOWNS" > "FONTS" e colar lá! Demonstração: Após instalar a fonte é só abrir o Fireworks, selecionar a ferramenta texto e começar a diversão. Créditos 100% - FezZinN @Edit Se alguem quiser mais dúvidas entra em contato comigo por PM1 ponto -
PokeBall System! Ola Xtibianos, Vim hoje postar um Famoso Script de Pokeball System feito pelo Genioso Nahruto, claro pedi a autorização dele para postar. A Todos que forem pegar Scripts de outras Pessoas, lembre-se de sempre pedir autorização e claro colocar os creditos. Para Tfs: 0.34 , 0.35 e 0.36 Essas Forao Testadas E Funfo. Versoes: 8.42 - 8.50 - 8.52 - 8.54 - 8.6. Ots Testados: Snowz Yurots - Alissow Server - Styller Yurots Primeiramente Vamos Fuçar em Function.lua, se voce nao Sabe onde fica vá em: Data>Lib>Function.lua Abra e Coloque Isto: _warpzone = 2147483648 -- start storing strings here (THIS IS THE ABSOLUTE MAXIMUM VALUE FOR THIS) _maxlength = 1024 -- multiply by 3 to get the true length. setPlayerStorageInteger = setPlayerStorageValue getPlayerStorageInteger = getPlayerStorageValue function setPlayerStorageString(cid, key, value) if #value > (_maxlength-1) * 3 - 1 then -- Last word is reserved for 0 termination of the string. error("Storage string is too long") end if key > _warpzone / _maxlength then error("Storage string key is too large (" .. key .. ")") end key = _warpzone + key * _maxlength local word = 0 local wordwrap = 0 local wordcount = 0 local i = 1 while i <= #value do local byte = string.byte(string.sub(value, i, i)) word = bit.bor(word, bit.lshift(byte, wordwrap)) wordwrap = wordwrap + 8 if wordwrap == 24 then --[[ In the ideal world we would be able to store 4 characters per word, however, as the default return value for getPlayerStorageValue is -1, we cant use the last bit. ]]-- setPlayerStorageInteger(cid, key + wordcount, word) word = 0 wordwrap = 0 wordcount = wordcount + 1 end i = i + 1 end -- store the last word setPlayerStorageInteger(cid, key + wordcount, word) end function getPlayerStorageString(cid, key) if key > _warpzone / _maxlength then error("Storage string key is too large (" .. key .. ")") end key = _warpzone + key * _maxlength local wordcount = 0 local str = "" while true do if wordcount >= _maxlength then break end local word = getPlayerStorageInteger(cid, key + wordcount) if word == -1 then -- end of string break else -- Extract the 3 characters from the value byte = bit.band(word, 255) if byte == 0 then break else str = str .. string.char(byte) end byte = bit.rshift(bit.band(word, 65280), 8) if byte == 0 then break else str = str .. string.char(byte) end byte = bit.rshift(bit.band(word, 16711680), 16) if byte == 0 then break else str = str .. string.char(byte) end end wordcount = wordcount + 1 end return str end E Isso! function doConvinceSummon(cid, creature, amount, pos) summonplayerpos = {x=pos.x, y=pos.y, z=pos.z, stackpos=253} summonplayer = getThingfromPos(summonplayerpos) if(summonplayer ~= nil and summonplayer.itemid > 0) then doPlayerSendCancel(cid,"There is not enough room to summon here.") ret = 0 else convince = doSummonCreature(creature, pos) doConvinceCreature(cid, convince) ret = 1 end return ret end Agora Vamos Fazer o Script Vá em Pasta do Seu Ot > Data > Actions > Scripts Crie uma Pasta chamada pokeball.lua e bote isso dentro local notAllowed = {"Ferumbras", "Demon"} local storage = { status = 25650, pokeName = 25651 } local actionid_used = 7510 function onUse(cid, item, fromPos, item2, toPos) local pokeballStatus = getPlayerStorageValue(cid, storage.status) local pokeName = getPlayerStorageString(cid, storage.pokeName) pos = getPlayerPosition(cid) pos.stackpos = 0 if pokeballStatus == -1 then toPos.stackpos = 253 local pokeThing = getThingfromPos(toPos) if isCreature(pokeThing.uid) == TRUE then if isPlayer(pokeThing.uid) == FALSE then local pokename_ = getCreatureName(pokeThing.uid) if item.actionid ~= actionid_used then -- local maxHealth = 400 -- local creatureHealth = getCreatureHealth(pokeThing.uid) -- local divNum = (string.len(maxHealth)-1)^2 -- local result = math.floor((creatureHealth/divNum)/10) -- local chance = math.random(1, math.random(4, math.random(7, math.max(result, 7)))) -- if chance == result then if isInTable(notAllowed, pokename_) == TRUE then doPlayerSendCancel(cid, "You cannot catch this creature") else setPlayerStorageString(cid, storage.pokeName, pokename_) doRemoveCreature(pokeThing.uid) doSendDistanceShoot(fromPos, toPos, 37) setPlayerStorageValue(cid, storage.status, 1) doSetItemSpecialDescription(item.uid, "it contains a " .. pokename_ .. ".") doSetItemActionId(item.uid, actionid_used) end -- else -- doSendMagicEffect(fromPos, 2) -- doPlayerSendCancel(cid, "The Pokemom Escaped") -- end elseif item.actionid == actionid_used and pokename_ == pokeName then doPlayerSay(cid, pokeName .. " Back!!", TALKTYPE_SAY) doRemoveCreature(pokeThing.uid) doSetItemSpecialDescription(item.uid, "it contains a " .. pokename_ .. ".") setPlayerStorageValue(cid, storage.status, 1) doSendDistanceShoot(fromPos, toPos, 37) else doSendMagicEffect(fromPos, 2) doPlayerSendCancel(cid, "This pokeball is already used") end else doPlayerSendCancel(cid, "You cannot catch this creature") end else doPlayerSendCancel(cid, "Creature not found") end elseif pokeballStatus == 1 then summons = getCreatureSummons(cid) -- if #summons >= 2 then -- doPlayerSendCancel(cid, "You cannot call more pokemons") -- else doConvinceSummon(cid, pokeName, 0, toPos) doSendDistanceShoot(fromPos, toPos, 37) doPlayerSay(cid, pokeName .. " Go!!", TALKTYPE_SAY) setPlayerStorageValue(cid, storage.status, -1) doSetItemSpecialDescription(item.uid, "it is empty.") -- end end else return 1 end function isInTable(t, val) for _, v in pairs(t) do if v == val then return TRUE end end return LUA_ERROR end para TFS local notAllowed = {"Ferumbras", "Demon"} local storage = { status = 15244, pokeName = 15212 } local actionid_used = 7510 function onUse(cid, item, fromPos, item2, toPos) local pokeballStatus = getPlayerStorageValue(cid, storage.status) local pokeName = getPlayerStorageString(cid, storage.pokeName) pos = getPlayerPosition(cid) pos.stackpos = 0 if pokeballStatus <= 0 then toPos.stackpos = 253 local pokeThing = getThingfromPos(toPos) if isCreature(pokeThing.uid) == TRUE then if isPlayer(pokeThing.uid) == FALSE then local pokename_ = getCreatureName(pokeThing.uid) if item.actionid ~= actionid_used then -- local maxHealth = 400 -- local creatureHealth = getCreatureHealth(pokeThing.uid) -- local divNum = (string.len(maxHealth)-1)^2 -- local result = math.floor((creatureHealth/divNum)/10) -- local chance = math.random(1, math.random(4, math.random(7, math.max(result, 7)))) -- if chance == result then if isInTable(notAllowed, pokename_) == TRUE then doPlayerSendCancel(cid, "You cannot catch this creature") else setPlayerStorageString(cid, storage.pokeName, pokename_) doRemoveCreature(pokeThing.uid) doSendDistanceShoot(fromPos, toPos, 37) setPlayerStorageValue(cid, storage.status, 1) doSetItemSpecialDescription(item.uid, "it contains a " .. pokename_ .. ".") doSetItemActionId(item.uid, actionid_used) end -- else -- doSendMagicEffect(fromPos, 2) -- doPlayerSendCancel(cid, "The Pokemom Escaped") -- end elseif item.actionid == actionid_used and pokename_ == pokeName then doCreatureSay(cid, pokeName .. " Back!!", TALKTYPE_SAY) doRemoveCreature(pokeThing.uid) doSetItemSpecialDescription(item.uid, "it contains a " .. pokename_ .. ".") setPlayerStorageValue(cid, storage.status, 1) doSendDistanceShoot(fromPos, toPos, 37) else doSendMagicEffect(fromPos, 2) doPlayerSendCancel(cid, "This pokeball is already used") end else doPlayerSendCancel(cid, "You cannot catch this creature") end else doPlayerSendCancel(cid, "Creature not found") end elseif pokeballStatus == 1 then -- summons = doCreatureSummons(cid) -- if #summons >= 2 then -- doPlayerSendCancel(cid, "You cannot call more pokemons") -- else doConvinceSummon(cid, pokeName, 0, toPos) doSendDistanceShoot(fromPos, toPos, 37) doCreatureSay(cid, pokeName .. " Go!!", TALKTYPE_SAY) setPlayerStorageValue(cid, storage.status, 0) doSetItemSpecialDescription(item.uid, "it is empty.") -- end end return 1 end function isInTable(t, val) for _, v in pairs(t) do if v == val then return TRUE end end return LUA_ERROR end Agora Vamos Adicionar as Tags, vá em Data>Actions.xml e Adicione as Tags Corretas´ <action itemid="xxxx" script="pokeball.lua" allowfaruse="1" blockwalls="1" /> [font-"Georgia"]em <action itemid="xxxx" nos 4 X voce coloca o Number Id Do seu Item que Será como uma "Pokeball"[/font] Oque o Script Faz Realmente: - Guarda monstros dentro de objetos e salva seu status, você pode colocar pra salvar em qlqr objeto.. seria ótimo para projetos pokemons.. Creditos: Nahruto Print Screen's: Snorlax Saindo da Pokeball: Snorlax Voltando para a Pokeball Look da Pokeball ( o Player so Ve assim You See a Pokeball , Have Snorlax )] Lembrando que eu nao Adicionei o Efeito da Pokeball Abrindo e Jogando o Monstro. Para fazer este Tipo de efeito voce vai ter que saber direitinho o LookType da Pokeball Fechando e Saindo, e transformar para um efeito e depois modificar no Script, aqui no xtibia Existe varios Tutoriais explicando isto, é so procurar! Gostou? Clica no Ali em Baicho para me Ajudar! Abraços..1 ponto
-
Bom ontem a noite em quanto eu tava cagando tive a idéia do DIVE SYSTEM que é o player chegar em uma area com Agua (Walkable) e falar o comando !dive e ser teletransportado para dentro do Mar... CREDITOS: modifiquei o Fly system do usuario Forcera... Link Original: CLIKE AKI Bom primeira coisa a fazer criar uma area com agua (Walkable) no Floor '7' e criar uma area Underwater no Floor '14', Depois adicione os seguintes Scripts na Pasta \data\talkactions\scripts COMANDO: !DIVE function onSay(cid, words, param, channel) flypos = getCreaturePosition(cid) npos = {x=flypos.x, y=flypos.y, z=flypos.z + 7} pos = getCreaturePosition(cid) if pos.z == 7 then if doTeleportThing(cid, npos) then doSendMagicEffect(npos, 14) else return 0 end end return TRUE end Esse comando faz voce ir para o fundo do Mar COMANDO: !BACK function onSay(cid, words, param, channel) flypos = getCreaturePosition(cid) npos2 = getPlayerMasterPos(cid) poszao = {x=flypos.x, y=flypos.y, z=flypos.z - 7} pos = getCreaturePosition(cid) if pos.z == 14 then doTeleportThing(cid, poszao) doSendMagicEffect(poszao, 14) end end Esse comando faz voce voltar para o Floor 7 TAGS: <talkaction words="!dive" event="script" value="dive.lua"/> <talkaction words="!back" event="script" value="backdive.lua"/> SS 01(Em cima da Agua Walkable): SS 02 (Fundo do Mar): Bom Esse Script nao precisa de Outfit propio pois no Tibia Global nao se usa outfit no fundo do mar (colocar o outfit do Swimmer nao presta porque nao combina com a agua)1 ponto
-
Bem-vindos, Ékstibianos. Este é um dos tutoriais que explicam os Advanced Systems que eu criei para um projeto de servidor alternativo que não se efetivou. Além de mostrar-lhes o sistema, explicarei cada função usada e como configurar cada magia no seu servidor. 1 - Requisitos Ékstibiano, você irá precisar de: - Uma dose de conhecimento em LUA. - Uma dose de funções. - E... senso de localização... os scripts das magias irão ficar grandes. 2 - O corpo do script Esse é o script mais básico de Spell System que criei, ele permite que a magia Ice Strike possa avançar do nível 1 (básico) ao nível 3 (ótimo) Irei explicar o script em blocos, exatamente abaixo: 3 - Explicações 3.1 - Bloco 1 local combat_lv1 = createCombatObject() setCombatParam(combat_lv1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat_lv1, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK) local combat_lv2 = createCombatObject() setCombatParam(combat_lv2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat_lv2, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK) local combat_lv3 = createCombatObject() setCombatParam(combat_lv3, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat_lv3, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK) Este é o bloco do script que irá determinar como é o "rosto" da sua magia, veja que eu criei três variáveis local nomeadas de combat_lv1, combat_lv2 e combat_lv3, o efeito delas é determinado pela função SetCombatParam, e as três tem efeitos idênticos com duas diferenças, uma é o dano e a outra é a área. 3.2 - Bloco 2, Áreas local area_lv1 = createCombatArea({ {3} }) local area_lv2 = createCombatArea({ {1}, {3} }) local area_lv3 = createCombatArea({ {0, 1, 0}, {1, 3, 1} }) setCombatArea(combat_lv1, area_lv1) setCombatArea(combat_lv2, area_lv2) setCombatArea(combat_lv3, area_lv3) Veja no Bloco 2, que eu crei três váriaveis local nomeadas de area_lv1, area_lv2 e area_lv3. Cada uma dessas variáveis, cria uma área pela função createCombatArea, perceba também que as três áreas são diferentes, é o nosso objetivo não, quanto mais nível, mas poder de magia! Ah, e a função setCombarArea é responsável por associar cada área ao seu respectivo combat. Vamos ao Bloco 3, de Danos. 3.3 Bloco 3, Danos. function onGetFormulaValues_lv1(cid, level, maglevel) local magDamage, levelDamage = maglevel, level / 5 return -(magDamage * 1 + levelDamage), -(magDamage * 2 + levelDamage) end function onGetFormulaValues_lv2(cid, level, maglevel) local magDamage, levelDamage = maglevel, level / 5 return -(magDamage * 1.5 + levelDamage), -(magDamage * 3 + levelDamage) end function onGetFormulaValues_lv3(cid, level, maglevel) local magDamage, levelDamage = maglevel, level / 5 return -(magDamage * 2.25 + levelDamage), -(magDamage * 4.5 + levelDamage) end setCombatCallback(combat_lv1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv1") setCombatCallback(combat_lv2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv2") setCombatCallback(combat_lv3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv3") Essa é uma parte complicadinha (hehe), agora não são mais variavéis locais e sim três funções onGetFormulaValues, elas são responsáveis por definir o dano que o jogador irá fazer quando utilizar a magia. A estrutura é a mesma, você pode criar quantos onGetFormulaValues quiser para cada nível de magia, mas deve colocar um sufixo _lvX para evitar erros, onde X é o level que cada função é relacionada. A magia Ice Strike causa dano conforme o level e o maglevel do usuário, as fórmulas de dano tem o prefixo return. Veja abaixo: return -(magDamage * 1 + levelDamage), -(magDamage * 2 + levelDamage) --Ice Strike Nv1, dano 40~60 return -(magDamage * 1.5 + levelDamage), -(magDamage * 3 + levelDamage) --Ice Strike Nv2, dano 30~80 return -(magDamage * 2.25 + levelDamage), -(magDamage * 4.5 + levelDamage) --Ice Strike Nv3, dano 45~110 Cada fórmula de cada função onGetFormulaValues faz danos diferentes. A função setCombatCallback, associa cada onGetFormulaValues ao seu respectivo combat. Ou seja, cada dano ao seu respectivo nível. Agora, vamos, ao último bloco e o mais complicadinho. Bloco 4, Avançando o nível local function onCastSpell1(parameters) doCombat(parameters.cid, combat_lv1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, combat_lv2, parameters.var) end local function onCastSpell3(parameters) doCombat(parameters.cid, combat_lv3, parameters.var) end function onCastSpell(cid, var) local parameters = { cid = cid, var = var} local SPELL_LEVEL_STORAGE = 70000 local SPELL_TRIES_STORAGE = 70001 local spell_level = getPlayerStorageValue(cid, SPELL_LEVEL_STORAGE) local spell_tries = getPlayerStorageValue(cid, SPELL_TRIES_STORAGE) if spell_level == -1 then spell_level = 1 end if spell_level == 1 then addEvent(onCastSpell1, 0, parameters) if spell_tries >= 1 then setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1) else setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1) end elseif spell_level == 2 then addEvent(onCastSpell2, 0, parameters) if spell_tries >= 1 then setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1) else setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1) end elseif spell_level == 3 then addEvent(onCastSpell3, 0, parameters) end if spell_tries >= ((spell_level)*12) then if spell_level < 3 then setPlayerStorageValue(cid, SPELL_LEVEL_STORAGE, spell_level + 1) setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 0) doPlayerSendTextMessage(cid, 22, "You advanced from level " .. spell_level .. " to level " .. spell_level + 1 .. " in Ice Strike spell") doSendMagicEffect(getCreaturePosition(cid),14) doSendAnimatedText(getCreaturePosition(cid), 'Advanced!', 18) end end return TRUE end Okay, você está saturado de informação se leu até aqui, descanse um pouco, respire e vamos lá: - Observe no Bloco 4, as funções locais onCastSpell1, onCastSpell2 e onCastSpell3, elas são responsáveis para que quando o personagem invocar a magia Ice Strike, ela seja realmente invocada. E há abaixo da última função local, a onCastSpell mais importante, ela que irá nos trazer a sintaxe geral do script de magia. - O código abaixo é responsável por duas coisas, ele irá determinar dois Storages onde serão armazenados os pontos de uso da magia e onde será armazenado o valor do nível da magia. LEMBRE-SE que os Storages que você usar aqui não deverão ser usadas em Quests e cada magia deve ter dois Storages distintos. local SPELL_LEVEL_STORAGE = 70000 local SPELL_TRIES_STORAGE = 70001 local spell_level = getPlayerStorageValue(cid, SPELL_LEVEL_STORAGE) local spell_tries = getPlayerStorageValue(cid, SPELL_TRIES_STORAGE) - Este outro código abaixo é responsável pela invocação da magia conforme o nível da magia que o personagem detêm. if spell_level == -1 then spell_level = 1 end if spell_level == 1 then addEvent(onCastSpell1, 0, parameters) if spell_tries >= 1 then setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1) else setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1) end elseif spell_level == 2 then addEvent(onCastSpell2, 0, parameters) if spell_tries >= 1 then setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1) else setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1) end elseif spell_level == 3 then addEvent(onCastSpell3, 0, parameters) end Veja que o verificador [if spell_level == -1 then] é necessário, porque todo Storage começa em -1, então se o Storage que você atribuiu para ser responsável pelo nível da magia em questão estiver em -1, então o script mudará seu valor para 1. O verificador [if spell_level == 1 then] faz a função de, SE o nível da magia é 1, invocar a sintaxe do nível 1 e adicionar 1 ponto de uso. O mesmo acontece para os dois outros verificadores [if spell_level == 2 then] e [if spell_level == 3 then], com exceção de quê quando a magia estiver no nível 3, você não ganhará mais pontos de uso. E o último código: if spell_tries >= ((spell_level)*12) then if spell_level < 3 then setPlayerStorageValue(cid, SPELL_LEVEL_STORAGE, spell_level + 1) setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 0) doPlayerSendTextMessage(cid, 22, "You advanced from level " .. spell_level .. " to level " .. spell_level + 1 .. " in Ice Strike spell") doSendMagicEffect(getCreaturePosition(cid),14) doSendAnimatedText(getCreaturePosition(cid), 'Advanced!', 18) end end return TRUE end Querendo ou não esse é o código mais importante do script, ele verifica que quando os pontos de uso forem maiores iguais a 12 vezes o nível atual da magia em questão, e se o nível da magia for menor que 3, eles adicionem +1 no SPELL_LEVEL_STORAGE e zerem o contador de pontos de uso da magia. Mandando uma mensagem de "Sua magia avançou de nível" com um "Advanced!" bonitinho em cor verde. Até mais, te vejo no próximo tutorial de Advanced System.1 ponto
-
qual o ID da sua Soft Boots NOVA? é 6132? ou 2640? ok esse vai:1 ponto
-
Sim, é a mesma coisa, mas muita gente não sabe e é sempre bom estar fazendo tutoriais identicos a oq eles irao encontar, se nao podem se perder. minha intenção foi só ajudar.1 ponto
-
[Encerrado] Super Grande Ajuda
Henrique Moura reagiu a Deuz por um tópico no fórum
esse ot ta com problema de junta, junta tudo e joga fora kkkkkkkkkkkkkkkkkkk /brincando ;\-1 pontos -
-1 pontos
Líderes está configurado para São Paulo/GMT-03:00