Ir para conteúdo

brun123

Conde
  • Total de itens

    512
  • Registro em

  • Última visita

  • Dias Ganhos

    16

Histórico de Reputação

  1. Upvote
    brun123 recebeu reputação de notle2012 em Onequip Rodando Duas Vezes   
    Isso é um bug nas sources, mas dá pra bloquear que o evento aconteça 2x usando lua mesmo, teste:
     
     
     
     
    Eu to com muita preguiça de testar, então se esse não funcionar, talvez esse funcione:
     
     
     
     
    Mas sei lá, provável que os dois funcionem, testa ai pra mim
  2. Amei
    brun123 recebeu reputação de Coach Lord em [Spell] Empurrar Player.   
    Teste esse:
     
     
     
  3. Upvote
    brun123 recebeu reputação de M i s s em [Encerrado] PDA Poketele   
    é, tem que registrar no player, não tinha lido o script, só vi o nome na tag "pokemonidle" e fez sentido ser no summon...
    enfim, basta usar esse script:
     

    local efeito = 1 -- coloque 0 para remover o efeito quando o pokemon teleportar local max = 9 -- distancia max entre o pokemon e o player local function doIncreaseSpeed(cid) if not isCreature(cid) then return true end doChangeSpeed(cid, -getCreatureSpeed(cid)) doChangeSpeed(cid, 2.5*(getCreatureBaseSpeed(cid) + getSpeed(cid))) end function onLogin(cid) registerCreatureEvent(cid, "PokemonIdle") return true end function onThink(cid, interval) if not isCreature(cid) then return true end if getPlayerStorageValue(cid, 17000) >= 1 or getPlayerStorageValue(cid, 17001) >= 1 or getPlayerStorageValue(cid, 63215) >= 1 then return true end if #getCreatureSummons(cid) >= 1 and not isCreature(getCreatureTarget(cid)) then if getDistanceBetween(getThingPos(cid), getThingPos(getCreatureSummons(cid)[1])) > max then doTeleportThing(getCreatureSummons(cid)[1], getThingPos(cid), false) doSendMagicEffect(getThingPos(cid), 21) end end return true end
     
    e essas tags:
     

    <event type="think" name="PokemonIdle" event="script" value="poketele.lua"/> <event type="login" name="PokemonIdleLogin" event="script" value="poketele.lua"/>
  4. Amei
    brun123 recebeu reputação de junihp em Alavanca Teleporta E Tira Item   
    Ah, tava fazendo aqui e já responderam...
    bom, mesmo assim vou deixar aqui a script que fiz:
     
     
     
     
    Não tem checagem de level já que você não pediu.
    O script do Leoxtibia não está removendo os itens eu acho.
  5. Upvote
    brun123 recebeu reputação de maiconmnt em Boss+Drop   
    vá em data/creaturesripts/scripts e crie um arquivo chamado floordrop.lua e coloque isso dentro:
     

    function onDeath(monster, corpse, killers) if not isContainer(corpse.uid) then return true end local directions = {NORTH, EAST, SOUTH, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST} local slotId, maxLoops = 0, getContainerSize(corpse.uid) * 2 repeat local lootItem = getContainerItem(corpse.uid, slotId).uid slotId = slotId + 1 if lootItem > 1 then local random = math.random(#directions) local newDir = directions[random] table.remove(directions, random) doTeleportThing(lootItem, getPosByDir(getThingPos(monster), newDir)) if #directions == 0 then directions = {NORTH, EAST, SOUTH, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST} end else break end until slotId >= maxLoops return true end
     
    agora, adicione essa tag em creaturescripts.xml (data/creaturescripts):
     

    <event type="death" name="DropItemsOnFloor" event="script" value="floordrop.lua"/>
     
    agora vá no XML do monstro que você quer que os itens dropem no chão, e adicione isso antes do último </monster>:
     

    <script> <event name="DropItemsOnFloor"/> </script>
     
    Não testado, quaisquer erros você tem que postar aqui
    você configura o loot do seu monstro normal pelo XML dele, quando o monstro morrer, todos os itens dentro do corpo dele vão ser retirados do corpo e vão para no chão
  6. Upvote
    brun123 recebeu reputação de GokuBlack em Sistema Npc Gym Para Pokemon   
    • nome: Sistema de Ginásio / GYM para pokemon.
    • autor: brun123 (mastercraft)
    • versão testada: TFS 0.36 pl 1 (8.54)
     
     
     
     
    Detalhes: Como cada servidor de pokemon é bem diferente, acredito que muitos erros vão aparecer devido a diferença de IDs das pokebolas por exemplo, mas vou ajudar no que posso.
     
     
    Primeiro passo: crie um arquivo com o nome gymlib.lua na pasta data/lib/, e coloque isso dentro do arquivo:
     
     
     
    Segundo passo: crie um arquivo chamado gym.lua na pasta data/creaturescripts/scripts/ e coloque isso dentro:
     
     
     
    Terceiro passo: abra o arquivo creaturescripts.xml (localizado em data/creaturescripts) e adicione essas 4 tags:
     
    <event type="cast" name="Gym1" event="script" value="gym.lua"/> <event type="attack" name="Gym2" event="script" value="gym.lua"/> <event type="direction" name="Gym3" event="script" value="gym.lua"/> <event type="death" name="Gym4" event="script" value="gym.lua"/> Quarto passo: crie um arquivo chamado brock.xml em data/npc e crie um chamado brock.lua em data/npc/scripts e coloque isso dentro:
     
     
    Quinto passo: se você usar o pokemon dash, vá no arquivo playerattack.lua (data/creatureevents/scripts) e adicione esses códigos embaixo da linha "function onAttack(cid, target)":
     

    if getPlayerStorageValue(target, 201) ~= -1 then for a, b in pairs(ginasios) do if getPlayerStorageValue(target, ginasios[getPlayerStorageValue(target, 201)].storage) == 1 then if getPlayerStorageValue(cid, ginasios[getPlayerStorageValue(target, 201)].storage) ~= 1 then doPlayerSendCancel(cid, "You can't attack this pokemon.") return false end end end end end
    Se você não usa o pokemon dash, crie um arquivo chamado playerattack.lua na pasta data/creatureevents/scripts e coloque isso dentro:
     

    function onAttack(cid, target) if getPlayerStorageValue(target, 201) ~= -1 then for a, b in pairs(ginasios) do if getPlayerStorageValue(target, ginasios[getPlayerStorageValue(target, 201)].storage) == 1 then if getPlayerStorageValue(cid, ginasios[getPlayerStorageValue(target, 201)].storage) ~= 1 then doPlayerSendCancel(cid, "You can't attack this pokemon.") return false end end end end return true end
    e adicione essa tag no creaturescripts.xml (data/creaturescripts):
     

    <event type="attack" name="PlayerAttack" event="script" value="playerattack.lua"/>
    e ainda, abra o arquivo login.lua e embaixo dessa linha: "function onLogin(cid)" adicione esse código:
     

    registerCreatureEvent(cid, "PlayerAttack")  
    Último passo: vá em data/creaturescripts/scripts e abra o arquivo goback.lua (aqui por exemplo, pode ser que haja uma particulariedade de servidor para servidor), e procure pela linha:
    function onDeath(cid, deathList)
    e abaixo dela, adicione esse código:
     
    local owner = getCreatureMaster(cid) for x, y in pairs(ginasios) do if getPlayerStorageValue(owner, y.storage) == 1 then if getPlayerStorageValue(owner, 991) == 5 or not hasPokemon(owner) then setPlayerStorageValue(owner, 991, -1) else local number = tonumber(getPlayerStorageValue(owner, 991)) setPlayerStorageValue(owner, 991, number + 1) end end end Configuração dos NPCs:
    Abrindo o arquivo brock.lua na pasta data/npc/scripts, procure por esta linha:
    "doGymBattle("Brock", "Brock Geodude", cid, 1)"
    o "Brock" precisa ser o nome do NPC e o "Brock Geodude" precisa ser o nome do primeiro pokemon a ser usado.
     
    Agora nessa parte, no script do seu NPC, você também deve editar o nome do NPC no lugar de "brock".
    Se quiser que o player possa lutar com o NPC mesmo depois de tê-lo vencido, é só remover a mesma parte:
     

    if getPlayerStorageValue(cid, ginasios["Brock"].storage) >= 1 then return true end
     
    Ao abrir o arquivo gymlib.lua, você encontra essas duas linhas (são as primeiras):
     

    funcpokemon = {2220, 2222} -- ID das pokebolas (o pokemon tem que estar vivo nessas IDs) bpslot = CONST_SLOT_BACKPACK --em outros servers, pode ser que seja CONST_SLOT_AMMO o lugar onde fica a backpack no inventory Onde está funcpokemon, você coloca o ID de todas as pokebolas do seu server, mas esse ID tem que ser o ID da pokebola com algum pokemon vivo dentro, e esses IDs devem ser separados por vírgula.
    Onde está bpslot, você escreve onde fica a BACKPACK do seu server de pokemon. Se ficar no lugar normal de BPs, deixe como está, mas se sua BP fica no slot da munição (ammunition), você deve estar para CONST_SLOT_AMMO. Isso é tudo, agora vocês podem configurar os IDs e localização da BP facilmente, sem precisar conhecimentos mais avançados sobre scripting, e evitar erros no sistema.
     
    Abrindo o arquivo gymlib.lua, localizado em data/lib/ você encontra essa tabela:
     

    ginasios = { ["Brock"] = { storage = 900, msgdefeat = "You lost! You aren't strong enough yet, don't come back until you get stronger!", msgafk = "Go away if you don't have any pokemons!", msgwin = "Congratulations, you were strong enough to win this battle fairly! Take this Earth Badge as reward.", [1] = { msggo = "Lets fight then! I choose you, Geodude!", msgba = "That's enough, Geodude!", pokem = "Brock Geodude", nextp = "Brock Graveler"}, [2] = { msggo = "It's your turn, Graveler!", msgba = "Come back, Graveler!", pokem = "Brock Graveler", nextp = "Brock Golem"}, [3] = { msggo = "Crush'em, Golem!", msgba = "You did well, Golem!", pokem = "Brock Golem", nextp = "finish"} } } • storage significa a única storage que deve variar de NPC para NPC, tenha certeza de que essa storage não está sendo usada, é você não deve usar a storage 901 aqui, pois a mesma já está em uso pelo próprio sistema.
    • msgdefeat significa o que o NPC irá dizer quando o player perder o duelo.
    • msgafk significa o que o NPC irá dizer caso o player comece o duelo, mas não faça nada depois.
    • msgwin significa o que o NPC irá dizer quando o player vencer o duelo.
    • msggo / msgba significam os textos que o NPC irá dizer ao sumonar o pokemon dele, ou quando o mesmo morrer, respectivamente.• pokem / nextp significam o nome do pokemon que será utilizado, e o próximo pokemon a ser sumonado pelo NPC, respectivamente. Caso o nextp seja especificado como "finish", não haverá um próximo pokemon.
    • o número entre [] significa a ordem utilizada pelo líder para usar o tal pokemon, sendo 1 o primeiro pokemon, 2 o segundo e assim vai...
    Uma tabela detalhada sobre a configuração:
     
     
    Importante: caso for testar o sistema como foi postado aqui, é necessário criar antes os monstros Brock Geodude, Brock Graveler e Brock Golem, assim como adicioná-los no monsters.xml.
    Recomendações: é bom você impedir que o pokemon consiga retornar para a pokebola durante duelos (assim como foi feito no SvkE), para isso, basta adicionar esse código no arquivo goback.lua (data/actions) na parte inicial de retornar o pokemon:
     

    for a, b in pairs(ginasios) do if getPlayerStorageValue(cid, b.storage) == 1 then -- GYM doPlayerSendCancel(cid, "You can't return your pokemon during gym battles.") return true end end Aconselho fazer o mesmo caso seu server tenha script de revive.
     
    Deve-se também checar pelos storages usado em players, somente o 990 e o 991.
     
    No servidor testado, é utilizado apenas pokeballs e ultraballs, com IDs 2220 e 2222 (outra particularidade).
     
    Após ter instalado os arquivos, entre no jogo e use o comando /n Brock para testar o NPC.
     
    Último aviso: o prêmio ainda não foi adicionado (que seria a badge), pois esse sim é bem variado de servidor pra servidor.
    Já que nenhum servidor base já vem com os IDs das badges, cada um adicionou elas de modo diferente, por isso não pude fazer, mas existe uma parte sobre um prêmio no arquivo gym.lua (data/creaturescripts/scripts), procure por isso:
     

    --local item = getPlayerItemById(killer, true, 2307) --doTransformItem(item.uid, 2294) Você pode modificar para adicionar dinheiro ou outra coisa, e pode também desenvolver um sistema de badges.
    Eu não vou fazer badge aqui, mas se vocês tentarem, posso ajudar com problemas.
     
    Quaisquer erros, tentarei responder o mais rápido possível.
  7. Upvote
    brun123 recebeu reputação de 4sharedddd em Script de alavanca onde apareça monstro e gaste dinheiro   
    Fiz por direção, basta configurar a tabela "dirPref" e ver quais direções você quer dar prioridade pra sumonar:
     

    local delay = {} function onUse(cid, item, frompos, item2, topos) local maxSummons = 8 -- máximo de summons permitidos por player local timeForReuse = 5 -- segundos para usar novamente local cost = 1500 -- gold para sumonar local dirPref = {NORTHWEST, SOUTHEAST, NORTHEAST, SOUTHWEST, NORTH, SOUTH, EAST, WEST} local monsters = { -- tabela com monstros, e a quantidade que vai sumonar ["Rat"] = 3, ["Tiger"] = 2, } if delay[0] and delay[0] - os.time() > 0 then return doPlayerSendCancel(cid, "Espere "..(delay[0] - os.time()).." segundos para puxar a alavanca novamente.") end local monsterCount = 0 local guid = getPlayerGUID(cid) if delay[guid] then for _, mid in pairs(delay[guid]) do if isCreature(mid) then monsterCount = monsterCount + 1 else delay[guid][_] = nil end end else delay[guid] = {} end if monsterCount >= maxSummons then return doPlayerSendCancel(cid, "Há muitos monstros sumonados por você, mate-os primeiro!") end if not doPlayerRemoveMoney(cid, cost) then return doPlayerSendCancel(cid, "Você não tem dinheiro suficiente para pagar!") end delay[0] = os.time() + timeForReuse monsterCount = 0 local dir = 1 for monsterName, number in pairs(monsters) do for _ = 1, number do local range = 1 local pos = getPosByDir(getThingPos(cid), dirPref[dir], range) local loops = 0 while doTileQueryAdd(cid, pos, 0, false) ~= 1 and loops <= #dirPref * 2 do dir = (dir + 1) > #dirPref and 1 or dir + 1 if dir == 1 then range = range + 1 end pos = getPosByDir(getThingPos(cid), dirPref[dir], range) loops = loops + 1 end if doTileQueryAdd(cid, pos, 0, false) ~= 1 then pos = getClosestFreeTile(cid, getThingPos(cid), true) end local newMonster = doCreateMonster(monsterName, pos, false) if isCreature(newMonster) then monsterCount = monsterCount + 1 table.insert(delay[guid], newMonster) doSendMagicEffect(getThingPos(newMonster), CONST_ME_TELEPORT) if monsterCount >= maxSummons then return true end end end end return true end
  8. Upvote
    brun123 recebeu reputação de Napolitano em [Pedido] Como Fazer O Summon Não Roubar A Experiencia Do Player.   
    Faz assim:
    Cria um script chamado summonhit.lua em data/creaturescripts/scripts e coloca isso dentro:
     

    function onCombat(cid, target) registerCreatureEvent(target, "SummonDamage") return true end function onStatsChange(cid, attacker, type, combat, value) if isMonster(attacker) and isPlayer(getCreatureMaster(attacker)) and isInArray({0, 1}, type) then local damage = math.abs(value) * (type == STATSCHANGE_HEALTHGAIN and 1 or -1) doTargetCombatHealth(getCreatureMaster(attacker), cid, combat, damage, damage, 255) return false end return true end
     
    agora adicione essas tags no creaturescripts.xml:
     

    <event type="combat" name="PlayerSummonCombat" event="script" value="summonhit.lua"/> <event type="statschange" name="SummonDamage" event="script" value="summonhit.lua"/>
     
    e adicione essa linha no seu login.lua:
     

    registerCreatureEvent(cid, "PlayerSummonCombat")
  9. Upvote
    brun123 recebeu reputação de Soulviling em Sistema Npc Gym Para Pokemon   
    • nome: Sistema de Ginásio / GYM para pokemon.
    • autor: brun123 (mastercraft)
    • versão testada: TFS 0.36 pl 1 (8.54)
     
     
     
     
    Detalhes: Como cada servidor de pokemon é bem diferente, acredito que muitos erros vão aparecer devido a diferença de IDs das pokebolas por exemplo, mas vou ajudar no que posso.
     
     
    Primeiro passo: crie um arquivo com o nome gymlib.lua na pasta data/lib/, e coloque isso dentro do arquivo:
     
     
     
    Segundo passo: crie um arquivo chamado gym.lua na pasta data/creaturescripts/scripts/ e coloque isso dentro:
     
     
     
    Terceiro passo: abra o arquivo creaturescripts.xml (localizado em data/creaturescripts) e adicione essas 4 tags:
     
    <event type="cast" name="Gym1" event="script" value="gym.lua"/> <event type="attack" name="Gym2" event="script" value="gym.lua"/> <event type="direction" name="Gym3" event="script" value="gym.lua"/> <event type="death" name="Gym4" event="script" value="gym.lua"/> Quarto passo: crie um arquivo chamado brock.xml em data/npc e crie um chamado brock.lua em data/npc/scripts e coloque isso dentro:
     
     
    Quinto passo: se você usar o pokemon dash, vá no arquivo playerattack.lua (data/creatureevents/scripts) e adicione esses códigos embaixo da linha "function onAttack(cid, target)":
     

    if getPlayerStorageValue(target, 201) ~= -1 then for a, b in pairs(ginasios) do if getPlayerStorageValue(target, ginasios[getPlayerStorageValue(target, 201)].storage) == 1 then if getPlayerStorageValue(cid, ginasios[getPlayerStorageValue(target, 201)].storage) ~= 1 then doPlayerSendCancel(cid, "You can't attack this pokemon.") return false end end end end end
    Se você não usa o pokemon dash, crie um arquivo chamado playerattack.lua na pasta data/creatureevents/scripts e coloque isso dentro:
     

    function onAttack(cid, target) if getPlayerStorageValue(target, 201) ~= -1 then for a, b in pairs(ginasios) do if getPlayerStorageValue(target, ginasios[getPlayerStorageValue(target, 201)].storage) == 1 then if getPlayerStorageValue(cid, ginasios[getPlayerStorageValue(target, 201)].storage) ~= 1 then doPlayerSendCancel(cid, "You can't attack this pokemon.") return false end end end end return true end
    e adicione essa tag no creaturescripts.xml (data/creaturescripts):
     

    <event type="attack" name="PlayerAttack" event="script" value="playerattack.lua"/>
    e ainda, abra o arquivo login.lua e embaixo dessa linha: "function onLogin(cid)" adicione esse código:
     

    registerCreatureEvent(cid, "PlayerAttack")  
    Último passo: vá em data/creaturescripts/scripts e abra o arquivo goback.lua (aqui por exemplo, pode ser que haja uma particulariedade de servidor para servidor), e procure pela linha:
    function onDeath(cid, deathList)
    e abaixo dela, adicione esse código:
     
    local owner = getCreatureMaster(cid) for x, y in pairs(ginasios) do if getPlayerStorageValue(owner, y.storage) == 1 then if getPlayerStorageValue(owner, 991) == 5 or not hasPokemon(owner) then setPlayerStorageValue(owner, 991, -1) else local number = tonumber(getPlayerStorageValue(owner, 991)) setPlayerStorageValue(owner, 991, number + 1) end end end Configuração dos NPCs:
    Abrindo o arquivo brock.lua na pasta data/npc/scripts, procure por esta linha:
    "doGymBattle("Brock", "Brock Geodude", cid, 1)"
    o "Brock" precisa ser o nome do NPC e o "Brock Geodude" precisa ser o nome do primeiro pokemon a ser usado.
     
    Agora nessa parte, no script do seu NPC, você também deve editar o nome do NPC no lugar de "brock".
    Se quiser que o player possa lutar com o NPC mesmo depois de tê-lo vencido, é só remover a mesma parte:
     

    if getPlayerStorageValue(cid, ginasios["Brock"].storage) >= 1 then return true end
     
    Ao abrir o arquivo gymlib.lua, você encontra essas duas linhas (são as primeiras):
     

    funcpokemon = {2220, 2222} -- ID das pokebolas (o pokemon tem que estar vivo nessas IDs) bpslot = CONST_SLOT_BACKPACK --em outros servers, pode ser que seja CONST_SLOT_AMMO o lugar onde fica a backpack no inventory Onde está funcpokemon, você coloca o ID de todas as pokebolas do seu server, mas esse ID tem que ser o ID da pokebola com algum pokemon vivo dentro, e esses IDs devem ser separados por vírgula.
    Onde está bpslot, você escreve onde fica a BACKPACK do seu server de pokemon. Se ficar no lugar normal de BPs, deixe como está, mas se sua BP fica no slot da munição (ammunition), você deve estar para CONST_SLOT_AMMO. Isso é tudo, agora vocês podem configurar os IDs e localização da BP facilmente, sem precisar conhecimentos mais avançados sobre scripting, e evitar erros no sistema.
     
    Abrindo o arquivo gymlib.lua, localizado em data/lib/ você encontra essa tabela:
     

    ginasios = { ["Brock"] = { storage = 900, msgdefeat = "You lost! You aren't strong enough yet, don't come back until you get stronger!", msgafk = "Go away if you don't have any pokemons!", msgwin = "Congratulations, you were strong enough to win this battle fairly! Take this Earth Badge as reward.", [1] = { msggo = "Lets fight then! I choose you, Geodude!", msgba = "That's enough, Geodude!", pokem = "Brock Geodude", nextp = "Brock Graveler"}, [2] = { msggo = "It's your turn, Graveler!", msgba = "Come back, Graveler!", pokem = "Brock Graveler", nextp = "Brock Golem"}, [3] = { msggo = "Crush'em, Golem!", msgba = "You did well, Golem!", pokem = "Brock Golem", nextp = "finish"} } } • storage significa a única storage que deve variar de NPC para NPC, tenha certeza de que essa storage não está sendo usada, é você não deve usar a storage 901 aqui, pois a mesma já está em uso pelo próprio sistema.
    • msgdefeat significa o que o NPC irá dizer quando o player perder o duelo.
    • msgafk significa o que o NPC irá dizer caso o player comece o duelo, mas não faça nada depois.
    • msgwin significa o que o NPC irá dizer quando o player vencer o duelo.
    • msggo / msgba significam os textos que o NPC irá dizer ao sumonar o pokemon dele, ou quando o mesmo morrer, respectivamente.• pokem / nextp significam o nome do pokemon que será utilizado, e o próximo pokemon a ser sumonado pelo NPC, respectivamente. Caso o nextp seja especificado como "finish", não haverá um próximo pokemon.
    • o número entre [] significa a ordem utilizada pelo líder para usar o tal pokemon, sendo 1 o primeiro pokemon, 2 o segundo e assim vai...
    Uma tabela detalhada sobre a configuração:
     
     
    Importante: caso for testar o sistema como foi postado aqui, é necessário criar antes os monstros Brock Geodude, Brock Graveler e Brock Golem, assim como adicioná-los no monsters.xml.
    Recomendações: é bom você impedir que o pokemon consiga retornar para a pokebola durante duelos (assim como foi feito no SvkE), para isso, basta adicionar esse código no arquivo goback.lua (data/actions) na parte inicial de retornar o pokemon:
     

    for a, b in pairs(ginasios) do if getPlayerStorageValue(cid, b.storage) == 1 then -- GYM doPlayerSendCancel(cid, "You can't return your pokemon during gym battles.") return true end end Aconselho fazer o mesmo caso seu server tenha script de revive.
     
    Deve-se também checar pelos storages usado em players, somente o 990 e o 991.
     
    No servidor testado, é utilizado apenas pokeballs e ultraballs, com IDs 2220 e 2222 (outra particularidade).
     
    Após ter instalado os arquivos, entre no jogo e use o comando /n Brock para testar o NPC.
     
    Último aviso: o prêmio ainda não foi adicionado (que seria a badge), pois esse sim é bem variado de servidor pra servidor.
    Já que nenhum servidor base já vem com os IDs das badges, cada um adicionou elas de modo diferente, por isso não pude fazer, mas existe uma parte sobre um prêmio no arquivo gym.lua (data/creaturescripts/scripts), procure por isso:
     

    --local item = getPlayerItemById(killer, true, 2307) --doTransformItem(item.uid, 2294) Você pode modificar para adicionar dinheiro ou outra coisa, e pode também desenvolver um sistema de badges.
    Eu não vou fazer badge aqui, mas se vocês tentarem, posso ajudar com problemas.
     
    Quaisquer erros, tentarei responder o mais rápido possível.
  10. Upvote
    brun123 recebeu reputação de notle2012 em Statschange (Call Stack Overflow)   
    callstack overflow é significa que você realizou um loop infinito na mesma função, no caso a stats change, quando a criatura que tem esse evento registrado perde vida, a doTargetCombatHealth faz com que ela perca vida novamente ativando de novo o onstats change, que faz com que a doTargetCombatHealth seja executada de novo e assim vai até o servidor perceber que a mesma função não tem saída e indica o erro.
     
    o que o slicer falou está certo, mesmo que você tire esse erro, se deixar o return true, o monstro vai bater o dano normal, digamos que seja 100, mais o valor do doTargetCombatHealth, que seria 130, totalizando 230, colocando return false, você anula o dano de 100 e aí sim você vai ter a aparência de na verdade o monstro estar tirando 130.
     
    usa a script assim:
     

    local overflow_protection = {} function onStatsChange(cid, attacker, type, combat, value) if isSummon(attacker) and isMonster(cid) and getPlayerStorageValue(getCreatureMaster(attacker), 17823) >= 1 and type == STATSCHANGE_HEALTHLOSS and value >= 1 then if overflow_protection[attacker] then overflow_protection[attacker] = nil return true end local dmg = math.floor(value * 1.3) overflow_protection[attacker] = true doTargetCombatHealth(attacker, cid, COMBAT_PHYSICALDAMAGE, -dmg, -dmg, CONST_ME_NONE) doPlayerSendTextMessage(getCreatureMaster(attacker), MESSAGE_STATUS_CONSOLE_ORANGE, "Your "..getCreatureName(attacker).." deals "..dmg.." damage.") return false end return true end
  11. Upvote
    brun123 recebeu reputação de notle2012 em Duvida Facil   
    colocou a tag no creaturescripts.xml?
  12. Upvote
    brun123 recebeu reputação de Omega em Statschange (Call Stack Overflow)   
    callstack overflow é significa que você realizou um loop infinito na mesma função, no caso a stats change, quando a criatura que tem esse evento registrado perde vida, a doTargetCombatHealth faz com que ela perca vida novamente ativando de novo o onstats change, que faz com que a doTargetCombatHealth seja executada de novo e assim vai até o servidor perceber que a mesma função não tem saída e indica o erro.
     
    o que o slicer falou está certo, mesmo que você tire esse erro, se deixar o return true, o monstro vai bater o dano normal, digamos que seja 100, mais o valor do doTargetCombatHealth, que seria 130, totalizando 230, colocando return false, você anula o dano de 100 e aí sim você vai ter a aparência de na verdade o monstro estar tirando 130.
     
    usa a script assim:
     

    local overflow_protection = {} function onStatsChange(cid, attacker, type, combat, value) if isSummon(attacker) and isMonster(cid) and getPlayerStorageValue(getCreatureMaster(attacker), 17823) >= 1 and type == STATSCHANGE_HEALTHLOSS and value >= 1 then if overflow_protection[attacker] then overflow_protection[attacker] = nil return true end local dmg = math.floor(value * 1.3) overflow_protection[attacker] = true doTargetCombatHealth(attacker, cid, COMBAT_PHYSICALDAMAGE, -dmg, -dmg, CONST_ME_NONE) doPlayerSendTextMessage(getCreatureMaster(attacker), MESSAGE_STATUS_CONSOLE_ORANGE, "Your "..getCreatureName(attacker).." deals "..dmg.." damage.") return false end return true end
  13. Upvote
    brun123 recebeu reputação de Killua em Statschange (Call Stack Overflow)   
    callstack overflow é significa que você realizou um loop infinito na mesma função, no caso a stats change, quando a criatura que tem esse evento registrado perde vida, a doTargetCombatHealth faz com que ela perca vida novamente ativando de novo o onstats change, que faz com que a doTargetCombatHealth seja executada de novo e assim vai até o servidor perceber que a mesma função não tem saída e indica o erro.
     
    o que o slicer falou está certo, mesmo que você tire esse erro, se deixar o return true, o monstro vai bater o dano normal, digamos que seja 100, mais o valor do doTargetCombatHealth, que seria 130, totalizando 230, colocando return false, você anula o dano de 100 e aí sim você vai ter a aparência de na verdade o monstro estar tirando 130.
     
    usa a script assim:
     

    local overflow_protection = {} function onStatsChange(cid, attacker, type, combat, value) if isSummon(attacker) and isMonster(cid) and getPlayerStorageValue(getCreatureMaster(attacker), 17823) >= 1 and type == STATSCHANGE_HEALTHLOSS and value >= 1 then if overflow_protection[attacker] then overflow_protection[attacker] = nil return true end local dmg = math.floor(value * 1.3) overflow_protection[attacker] = true doTargetCombatHealth(attacker, cid, COMBAT_PHYSICALDAMAGE, -dmg, -dmg, CONST_ME_NONE) doPlayerSendTextMessage(getCreatureMaster(attacker), MESSAGE_STATUS_CONSOLE_ORANGE, "Your "..getCreatureName(attacker).." deals "..dmg.." damage.") return false end return true end
  14. Upvote
    brun123 recebeu reputação de Nerival em Teleport onde só um player pode passar, e liberar a entrada novamente depois de 3 min   
    local bloqueado = 0 function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) if os.time() - bloqueado < 0 then doTeleportThing(cid, fromPosition, false) doPlayerSendCancel(cid, "Deve esperar "..math.abs(os.time() - bloqueado).." segundos para entrar aqui.") return true end local teleportEntrada = {x = 1, y = 1, z = 1} local tempo = 3 * 60 -- em segundos, isso equivale a 3 minutos doTeleportThing(cid, teleportEntrada, false) doSendMagicEffect(teleportEntrada, CONST_ME_TELEPORT) bloqueado = os.time() + tempo return true end
     
    Um player entra, e durante 3 minutos a entrada é bloqueada. Após os 3 minutos, mesmo que o player antigo continue no lugar onde ele foi teleportado, outro player poderá entrar e a entrada será novamente fechada por 3 minutos. Se o player que entrou sair antes do tempo ter passado, a passagem continuará bloqueada até que o tempo passe.
     
    O problema do logout foi causado pela falta de um return true antes do último end no script do logout.
     
    A script é um movements, o tipo é StepIn, basta ver outra tag no movements.xml e copiar.
  15. Upvote
    brun123 recebeu reputação de ThatsRockBitch em [Ajuda] Spell De Clonagem [Ajuda]   
    Não deu pra entender direito o que você quis fazer... é isso?
     
     
     
     
    Se só quiser transformar a talkaction em spell, pode fazer dessa forma também:
     

    function onCastSpell(cid, var) doCreatureExecuteTalkAction(cid, "!clone", true) return true end
  16. Upvote
    brun123 recebeu reputação de craigmabbit em isWalkable   
    cid = creature identification, um número que referencia uma criatura, criaturas podem ser monstros, players ou npcs
    se quiser pegar o cid de algum player que está ativando alguma talkaction ou algo do tipo, você pode passar o cid como parâmetro pra sua função de isWalkable e executar a doPlayerSendMessage, se quiser mandar a mensagem pra criatura que está na posição que você está verificando, basta acessar o campo "uid" da tabela retornada por getTopCreature, assim:
     
     
    local creature = getTopCreature(position) if isPlayer(creature.uid) then -- end
  17. Upvote
    brun123 recebeu reputação de Roksas em [Resolvido] Efeito do heal   
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) function onGetFormulaValues(cid, level, maglevel) local min = ((level*45)+(maglevel*1.20)+2060) local max = ((level*45)+(maglevel*1.20)+2990) return min, max end setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") function onCastSpell(cid, var) local position = getThingPos(cid) position.x = position.x + 1 position.y = position.y + 1 doSendMagicEffect(position, 11) return doCombat(cid, combat, var) end se quiser que apareça em cima do target, troca o getThingPos(cid) por getThingPor(getCreatureTarget(cid)), e é bom colocar uma verificação acima pra ver se há algum target
    o efeito aparece na diagonal sentido sudeste do player
  18. Upvote
    brun123 recebeu reputação de trollfox em [Encerrado] Ajuda Error Evolu..   
    na tabela bem no início do código, você tem linhas assim:
     

    [heart] = {Nome dos pokemons que evoluem com heart stone}, [fire] = {...},
     
    esse heart/fire etc são variáveis declaradas no configuration.lua e tem o valor do ID das stones, você provavelmente deletou algumas stones (por exemplo, metal, king etc) do configuration.lua o que fez com que essas variáveis assumissem o valor "nil", e não se pode ter index de tabela (valor entre colchetes) como nil...
     
    ou você tira essas partes da tabela do nome dos pokemons que evoluem com uma stone que você tirou, ou então coloca alguns valores quaisquer, tipo 1, depois 2, depois 3 no lugar dessas variáveis que não existem no configuration.lua que não vai atrapalhar em nada seu script
  19. Upvote
    brun123 recebeu reputação de Killua em Script n funfa! Olhem aqui pf   
    tenta assim:
     
    function onLogin(cid) local name = getCreatureName(cid) local guid = getPlayerGUID(cid) local isvip, vipname = getPlayerStorageValue(cid, 13546) > 0, string.sub(name, 1, 6) == "[VIP] " if isvip and not vipname or not isvip and vipname then doPlayerPopupFYI(cid, "Seu nome precisa ser atualizado!\nVocê será kickado em 3 segundos.\nNão se esqueça de redigitar sua account e senha.") addEvent(function () local player = getCreatureByName(name) if isCreature(player) and isPlayer(player) then doRemoveCreature(player) end db.executeQuery("UPDATE `players` SET `name` = '".. (isvip and ("[VIP] " .. name) or name:sub(7)) .. "' WHERE `id`= " .. guid .. ";") end, 3000) end return true end
  20. Upvote
    brun123 recebeu reputação de Killua em Script n funfa! Olhem aqui pf   
    a script muda o nome do cara (adiciona [VIP]) se ele tiver o storage oou remove se ele tiver o [VIP] no nome e não possuir o storage
    se você tá testando com um char sem o storage e sem o [VIP] no nome ou então com o storage e com o [VIP] no nome, realmente, nada vai acontecer
     
    usa esse script:
     
    function onLogin(cid) local name = getCreatureName(cid) local guid = getPlayerGUID(cid) local isvip, vipname = getPlayerStorageValue(cid, 13546) > 0, string.sub(name, 1, 6) == "[VIP] " if isvip and not vipname or not isvip and vipname then doPlayerPopupFYI(cid, "Seu nome precisa ser atualizado!\nVocê será kickado em 3 segundos.\nNão se esqueça de redigitar sua account e senha.") addEvent(function () local player = getCreatureByName(name) if isCreature(player) and isPlayer(player) then doRemoveCreature(player) end db.executeQuery("UPDATE `players` SET `name` = '".. (isvip and ("[VIP] " .. name) or name:sub(7)) .. "' WHERE `id`= " .. guid .. ";") end, 3000) end return true end
  21. Upvote
    brun123 recebeu reputação de Krugerz em [Encerrado] PDA Poketele   
    é, tem que registrar no player, não tinha lido o script, só vi o nome na tag "pokemonidle" e fez sentido ser no summon...
    enfim, basta usar esse script:
     

    local efeito = 1 -- coloque 0 para remover o efeito quando o pokemon teleportar local max = 9 -- distancia max entre o pokemon e o player local function doIncreaseSpeed(cid) if not isCreature(cid) then return true end doChangeSpeed(cid, -getCreatureSpeed(cid)) doChangeSpeed(cid, 2.5*(getCreatureBaseSpeed(cid) + getSpeed(cid))) end function onLogin(cid) registerCreatureEvent(cid, "PokemonIdle") return true end function onThink(cid, interval) if not isCreature(cid) then return true end if getPlayerStorageValue(cid, 17000) >= 1 or getPlayerStorageValue(cid, 17001) >= 1 or getPlayerStorageValue(cid, 63215) >= 1 then return true end if #getCreatureSummons(cid) >= 1 and not isCreature(getCreatureTarget(cid)) then if getDistanceBetween(getThingPos(cid), getThingPos(getCreatureSummons(cid)[1])) > max then doTeleportThing(getCreatureSummons(cid)[1], getThingPos(cid), false) doSendMagicEffect(getThingPos(cid), 21) end end return true end
     
    e essas tags:
     

    <event type="think" name="PokemonIdle" event="script" value="poketele.lua"/> <event type="login" name="PokemonIdleLogin" event="script" value="poketele.lua"/>
  22. Upvote
    brun123 recebeu reputação de markindoot em Comando Para Abrir o Evento e Aparecer um teleport   
    Tag:
     
    <talkaction access="4" words="/bruxclose;/bruxoclose;/bruxopen;/bruxoopen" event="script" value="nome do script.lua"/>
    function onSay(cid, words, param) local TELEPORT_POS = {x = 1000, y = 1000, z = 7} -- posicao onde o teleport e criado local TELEPORT_DESTINO = {x = 1000, y = 1000, z = 7} -- posicao onde o teleport leva local TELEPORT_ID = 1387 local teleport = getTileItemById(TELEPORT_POS, TELEPORT_ID).uid if words == "/bruxoopen" or words == "/bruxopen" then if teleport > 1 then return doPlayerSendCancel(cid, "O evento já está aberto.") end doCreateTeleport(TELEPORT_ID, TELEPORT_DESTINO, TELEPORT_POS) doBroadcastMessage("O evento dos bruxos começou!", 21) elseif words == "/bruxoclose" or words == "/bruxclose" then if teleport < 1 then return doPlayerSendCancel(cid, "O evento não está aberto.") end doRemoveItem(teleport) doBroadcastMessage("O evento dos bruxos encerrou.", 21) end return true end
  23. Upvote
    brun123 recebeu reputação de fitaisolante em Comando criar pedra   
    function onSay(cid, words, param) local creature = getPlayerPosition(cid) if getTileItemById(creature, 1285).uid > 1 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Já existe uma pedra embaixo de você!") else doCreateItem(pedra, getCreaturePosition(cid)) end return true end
  24. Upvote
    brun123 recebeu reputação de subyth em [RESOLVIDO] Player Invisivel   
    tenta mudar isso:
     
    doSetCreatureOutfit(cid, {lookType = 0}, k.tempo*1000)
     
    para isso:
     
    doSetCreatureOutfit(cid, {lookTypeEx = 1548}, k.tempo*1000)
     
    e se não der certo, para isso:
     
    doSetItemOutfit(cid, 1548, k.tempo*1000)
  25. Upvote
    brun123 recebeu reputação de Vodkart em Preciso de um script(dificil pra mim)   
    Você provavelmente configurou errado então, verifique as posições e as alavancas se estão todas certas, teste somente com duas alavancas e uma pedra primeiro e deixe elas uma do lado da outra pra ficar mais fácil testar
     
    Eu rodei o script aqui e estava apenas com o problema de não recriar as pedras removidas depois, aqui está o script arrumado:
     
     
    local alavancas = { -- tabela com a posicao de cada alavanca e o id que ela precisa estar para abrir passagem {x = 1000, y = 1000, z = 7, correto = 1945}, {x = 1000, y = 1000, z = 7, correto = 1945}, {x = 1000, y = 1000, z = 7, correto = 1945}, {x = 1000, y = 1000, z = 7, correto = 1945}, {x = 1000, y = 1000, z = 7, correto = 1945}, {x = 1000, y = 1000, z = 7, correto = 1945}, } local pedras = { -- tabela com a posicao e os ids das pedras que vao sumir {x = 1000, y = 1000, z = 7, id = 1285}, {x = 1000, y = 1000, z = 7, id = 1285}, {x = 1000, y = 1000, z = 7, id = 1285}, } local EFEITO_AO_REMOVER_PEDRA = CONST_ME_POFF -- efeito que aparece quando as pedras sumirem local EFEITO_AO_RECRIAR_PEDRA = CONST_ME_POFF -- efeito que aparece quando as pedras reaparecerem local TEMPO_PARA_RECRIAR_PEDRAS = 12 * 1000 -- em ms, tempo para bloquear a passagem e resetar todas as alavancas -- nao modifique daqui para baixo local aberto = false function onUse(cid, item, frompos, item2, topos) if aberto then return doPlayerSendCancel(cid, "A passagem já está aberta.") end doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945) for i, a in pairs (alavancas) do if getTileItemById({x = a.x, y = a.y, z = a.z}, a.correto).uid < 1 then return doPlayerSendCancel(cid, "Parece que nada aconteceu...") end end aberto = true for i, a in pairs (pedras) do local uid = getTileItemById({x = a.x, y = a.y, z = a.z}, a.id).uid if uid > 1 then doRemoveItem(uid) doSendMagicEffect({x = a.x, y = a.y, z = a.z}, EFEITO_AO_REMOVER_PEDRA) end end addEvent(function () aberto = false for i, a in pairs (pedras) do local uid = getTileItemById({x = a.x, y = a.y, z = a.z}, a.id).uid if uid < 1 then doCreateItem(a.id, {x = a.x, y = a.y, z = a.z}) doSendMagicEffect({x = a.x, y = a.y, z = a.z}, EFEITO_AO_RECRIAR_PEDRA) end end for i, a in pairs (alavancas) do local uid = getTileItemById({x = a.x, y = a.y, z = a.z}, a.correto).uid if uid > 1 then doTransformItem(uid, 1945) end end end, TEMPO_PARA_RECRIAR_PEDRAS) return doPlayerSendCancel(cid, "Alguma passagem foi desbloqueada!") end
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...