BlackTibia

No estás conectado. Conéctate o registrate

 » Open Tibia » Pedido de Scripts » 

(Resuelto) [Pedido-Npc] Da spell al ganar mini-juego.

(Resuelto) [Pedido-Npc] Da spell al ganar mini-juego.

Acan


Miembro
1: npcs llamado "Sensei" learnd varios spell.

talk to npc sensei:
God [1]: hi
06:49 Sensei: Hello Bic Bass! I can "teach" you some spells (remember if you want learn jutsu write "learn spell name".
God [1]: "teach"
Speed : 20 Level , 30 Control
black strike : 35 Level , 40 Control
Masive Heal : 125 Level , 60 Control (Only Voc-1 and Voc-2)
Letras rojas los spells.

learnd spell:
("learn spell name")
learn speed      5 - palabra
learn black strike    5 - palabra
learn masive heal   7 - palabra

funcio para otener el spell:
God [1]: learn speed
Sensei: Use lobo!
God[1]: lobo

Sensei: Use serpiente!
God[1]: serpiente

y asi 3palabra mas secreta que te dira el npc. tiene q decirlo en un tiempo si no el npc te dira.
Sensei: To late!.... y tienes que empezar de nuevo con las palabra un tiempo de 3 segundo para decirle la palabra que el te dira en su orden. cada spell tiene diferente palara secreta...

bueno eso es todos amigos!

Belerofonte


Administrador
Síp. Ha sido todo un reto

Servidor/Data/Npc/... Sensei.xml
Código:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Sensei" script="data/npc/scripts/Sensei.lua" walkinterval="2000" floorchange="0">
    <health now="100" max="100"/>
    <look type="131" head="7" body="87" legs="7" feet="87" addons="2"/>
    <parameters>
        <parameter key="message_greet" value="Hello Bic Bass! I can {teach} you some spells (remember if you want learn jutsu write {learn spell name})"/>
    </parameters>
</npc>

Servidor/Data/Npc/Scripts/... Sensei.lua
Código:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
local Belerofonte = {} -- << -- << Script By << -- << -- Contact: www.blacktibia.org/u3171

  local Config = {
    Storage = 309826, -- Storage Key que gustes.

    Spells = {
        ['Speed'] = { -- 'NOMBRE del Spell'
            Infos = {level = 20, control = 30}, -- Obvio ;D
            Words = {'Wolf', 'Snake', 'Grulla', 'Duck', 'Rabbit'}, -- {'palabras', 'secretas', 'totales'}, // Cuantas más palabras pongas: mejor. Para así evitar en la medida de lo posible que hagan trampas usando hotkeys.
            Selected = 3, -- CANTIDAD de palabras extraídas al azar de la variable (Words) anterior, las que se tendrán que decir. // Un número menor o igual que el número de palabras totales que pusiste en (Words).
            Times = 3, -- SEGUNDOS del contrarreloj en los que se tendrá que decir CADA UNA.
        },

        ['Black Strike'] = { -- 'NOMBRE del Spell'
            Infos = {level = 35, control = 40}, -- Obvio ;D
            Words = {'pollo', 'pollo', 'polla'}, -- {'palabras', 'secretas', 'totales'}, // Cuantas más palabras pongas: mejor. Para así evitar en la medida de lo posible que hagan trampas usando hotkeys.
            Selected = 3, -- CANTIDAD de palabras extraídas al azar de la variable (Words) anterior, las que se tendrán que decir. // Un número menor o igual que el número de palabras totales que pusiste en (Words).
            Times = 1, -- SEGUNDOS del contrarreloj en los que se tendrá que decir CADA UNA.
        },

        ['Masive Heal'] = { -- 'NOMBRE del Spell'
            Infos = {level = 125, control = 60, vocation = {1, 2}}, -- Obvio, ¿no?
            Words = {'uno', 'dos', 'tres', 'cuatro', 'cinco'}, -- {'palabras', 'secretas', 'totales'}, // Cuantas más palabras pongas: mejor. Para así evitar en la medida de lo posible que hagan trampas usando hotkeys.
            Selected = 5, -- CANTIDAD de palabras extraídas al azar de la variable (Words) anterior, las que se tendrán que decir. // Un número menor o igual que el número de palabras totales que pusiste en (Words).
            Times = 3, -- SEGUNDOS del contrarreloj en los que se tendrá que decir CADA UNA.
        },

    },
  }

local function timeOut(cid)
    if isPlayer(cid) then
        setPlayerStorageValue(cid, Config.Storage, - 1)
        npcHandler:say('Too late...', cid) -- Mensaje del Npc si finaliza el tiempo expuesto en la variable (Times) de la tabla [config.Spells].
        Belerofonte[cid] = 0
    end
end

local function finishedQuiz(cid)
    setPlayerStorageValue(cid, Config.Storage, - 1)
    stopEvent(lateEvent)
    Belerofonte[cid] = 0
end

local function shuffleArray(count, array)
  local n, random, j = table.getn(array), math.random
    count = (count < 1 and 1 or 1)
    for i = count, n do
        j, k = random(n), random(n)
        array[j], array[k] = array[k], array[j]
    end
  return array
end

local function creatureFarewell(cid)
    if not(isPlayer(cid)) then return true end
    finishedQuiz(cid)
  return true
end

local function getVocationList(array)
  local vocs = ''
    if array then
        for voc = 1, table.maxn(array) do -- Para ordenar las posibles vocaciones en strings. Vocaciones expuestas en la variable del array {req.Infos.vocation}.
            vocs = vocs .. getVocationInfo(array[voc]).name
            if voc == table.maxn(array) - 1 then
                vocs = vocs .. ' and '
             elseif voc ~= table.maxn(array) then
                vocs = vocs .. ', '
            end
        end
    end
  return vocs
end

    --------------------------------------------------------------------------------------------------
NpcSystem.parseParameters(npcHandler)

function onCreatureAppear(cid)            npcHandler:onCreatureAppear(cid)            end
function onCreatureDisappear(cid)         npcHandler:onCreatureDisappear(cid)         end
function onCreatureSay(cid, type, msg)    npcHandler:onCreatureSay(cid, type, msg)    end
function onThink()                        npcHandler:onThink()                        end

function creatureSayCallback(cid, type, msg)
  local msg = msg:lower()

    if not npcHandler:isFocused(cid) then
        Belerofonte[cid] = 0
      return
    end

    if msgcontains(msg, 'teach') then -- 'Palabra' del jugador, que de paso a la lista de hechizos con sus requerimientos.
      local list = ''
        for spell, req in pairs(Config.Spells) do
            if req.Infos.vocation then
                list = list .. spell .. ': ' .. req.Infos.level .. ' Level, ' .. req.Infos.control .. ' Control. (Only for ' .. getVocationList(req.Infos.vocation) .. ')\n' -- Lista de HECHIZOS con su información de NIVEL, CONTROL, y VOCACIONES.
             else
                list = list .. spell .. ': ' .. req.Infos.level .. ' Level, ' .. req.Infos.control .. ' Control.\n' -- Lista de HECHIZOS con su información de NIVEL, y CONTROL.
            end
        end
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, '*~Spells to learn~*\n' .. list) -- Frase encima de la Lista de HECHIZOS anterior.

    --------------------------------------------------------------------------------------------------

     elseif msgcontains(msg, 'learn spell name') then -- 'Palabras' del jugador, que den paso a la lista de hechizos que aprender junto con la cantidad de palabras secretas requeridas.
      local knowledge = ''
        for spell, req in pairs(Config.Spells) do
            knowledge = knowledge .. '{learn ' .. spell .. '}     ' .. req.Selected .. ' - ' .. (req.Selected > 1 and 'words' or 'word') .. '.\n' -- HECHIZOS para APRENDER junto con la CANTIDAD de PALABRAS SECRETAS requeridas.
        end
        npcHandler:say('Choose one...\n' .. knowledge, cid) -- Frase del Npc encima de los HECHIZOS anteriores.
    end

    for spell, req in pairs(Config.Spells) do
        if msgcontains(msg, 'learn ' .. spell) and Belerofonte[cid] ~= 1 then -- "learn " .. spell = Nombre del hechizo extraído de la tabla [Config.Spells] = "learn spell name"

            if req.Infos.vocation and not isInArray(req.Infos.vocation, getPlayerVocation(cid)) then
                npcHandler:say('That is only suitable for ' .. getVocationList(req.Infos.vocation) .. '.', cid) -- Frase del Npc, si el jugador no posee la vocación/es necesaria.
              return
            end

            if getPlayerLearnedInstantSpell(cid, spell) == false then
                if getPlayerLevel(cid) >= req.Infos.level then

                    if getPlayerSkillLevel(cid, SKILL_FISHING) >= req.Infos.control then -- Skill Control = SKILL_FISHING
                        shuffleArray((#req.Words - req.Selected), req.Words)
                        npcHandler:say('Use {' .. req.Words[math.min(1, #req.Words)] .. '}.', cid) -- Primera palabra escogida al azar por el Npc.
                        Belerofonte[cid] = 1

                        lateEvent = addEvent(timeOut, req.Times * 1000, cid)
                        setPlayerStorageValue(cid, Config.Storage, spell) -- Para poder tener acceso más abajo a la variable Words de la tabla [Config.Spells].
                     else
                        npcHandler:say('Control ' .. req.Infos.control .. ' is required.', cid) -- Frase del Npc, si el jugador si no posee habilidad Control suficiente.
                    end

                 else
                    npcHandler:say('Level ' .. req.Infos.level .. ' is required.', cid) -- Frase del Npc, si el jugador no posee nivel suficiente.
                end
             else
                npcHandler:say('You already have the spell {' .. spell .. '} learned. Please, choose another one.', cid) -- Frase del Npc, si el jugador ya posee el hechizo aprendido.
            end

          break
        end
    end

    --------------------------------------------------------------------------------------------------

  local getSpell = getPlayerStorageValue(cid, Config.Storage)
  local isTryingToLearn = Config.Spells[getSpell]

    if isTryingToLearn then
        for k, v in pairs(isTryingToLearn.Words) do

            if (msgcontains(msg, v) and Belerofonte[cid] == k) then
                Belerofonte[cid] = k + 1

                if Belerofonte[cid] < isTryingToLearn.Selected + 1 then
                    npcHandler:say('Use {' .. isTryingToLearn.Words[(k + 1)] .. '}.', cid) -- Siguientes palabras secretas que dirá al azar el Npc.
                    stopEvent(lateEvent)
                    lateEvent = addEvent(timeOut, isTryingToLearn.Times * 1000, cid)

                 else
                    npcHandler:say('You have learned the spell {' .. getSpell .. '}. You can conjure with: {' .. getInstantSpellInfo(false, getSpell).words .. '}', cid) -- Mensaje del Npc, si el jugador acierta todas las palabras.
                    finishedQuiz(cid)
                    doSendMagicEffect(getThingPos(cid), CONST_ME_YELLOW_RINGS)
                    doPlayerLearnInstantSpell(cid, getSpell)
                end

              break
            end

            if not msgcontains(msg, v) and Belerofonte[cid] == k then -- Si el mensaje del jugador no es la palabra secreta requerida en ese momento.
                if not msgcontains(msg, 'learn ' .. getSpell) then -- Si el mensaje del jugador tampoco es la anterior 'learn spell name'
                    npcHandler:say('Wrong answer!', cid) -- Respuesta del Npc si el jugador no dijo la palabra secreta requerida.
                    finishedQuiz(cid)
                  break
                end
            end

        end
    end

  return true
end

npcHandler:setCallback(CALLBACK_FAREWELL, creatureFarewell)
npcHandler:setCallback(CALLBACK_CREATURE_DISAPPEAR, creatureFarewell)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())



Zona (básica) a editar:
local Config = {
   Storage = 309826, -- Storage Key que gustes.

   Spells = {
       ['Speed'] = { -- 'NOMBRE del Spell'
           Infos = {level = 20, control = 30}, -- Obvio ;D
           Words = {'Wolf', 'Snake', 'Grulla', 'Duck', 'Rabbit'}, -- {'palabras', 'secretas', 'totales'}, // Cuantas más palabras pongas: mejor. Para así evitar en la medida de lo posible que hagan trampas usando hotkeys.
           Selected = 3, -- CANTIDAD de palabras extraídas al azar de la variable (Words) anterior, las que se tendrán que decir. // Un número menor o igual que el número de palabras totales que pusiste en (Words).
           Times = 3, -- SEGUNDOS del contrarreloj en los que se tendrá que decir CADA UNA.
       },

       ['Black Strike'] = { -- 'NOMBRE del Spell'
           Infos = {level = 35, control = 40}, -- Obvio ;D
           Words = {'pollo', 'pollo', 'polla'}, -- {'palabras', 'secretas', 'totales'}, // Cuantas más palabras pongas: mejor. Para así evitar en la medida de lo posible que hagan trampas usando hotkeys.
           Selected = 3, -- CANTIDAD de palabras extraídas al azar de la variable (Words) anterior, las que se tendrán que decir. // Un número menor o igual que el número de palabras totales que pusiste en (Words).
           Times = 1, -- SEGUNDOS del contrarreloj en los que se tendrá que decir CADA UNA.
       },

       ['Masive Heal'] = { -- 'NOMBRE del Spell'
           Infos = {level = 125, control = 60, vocation = {1, 2}}, -- Obvio ;D
           Words = {'uno', 'dos', 'tres', 'cuatro', 'cinco'}, -- {'palabras', 'secretas', 'totales'}, // Cuantas más palabras pongas: mejor. Para así evitar en la medida de lo posible que hagan trampas usando hotkeys.
           Selected = 5, -- CANTIDAD de palabras extraídas al azar de la variable (Words) anterior, las que se tendrán que decir. // Un número menor o igual que el número de palabras totales que pusiste en (Words).
           Times = 3, -- SEGUNDOS del contrarreloj en los que se tendrá que decir CADA UNA.
       },

   },
 }



Para añadir más Spells solo tienes que duplicar esos párrafos y editar sus parámetros, por ejemplo:
     ['Light'] = { -- 'NOMBRE del Spell'
           Infos = {level = 2, control = 3, vocation = {5}}, -- Obvio ;D
           Words = {'esternocleidomastoirdeo', 'caleidoscopio', 'cuentakilometros', 'supercalifragilisticoespialidoso'}, -- {'palabras', 'secretas', 'totales'}, // Cuantas más palabras pongas: mejor. Para así evitar en la medida de lo posible que hagan trampas usando hotkeys.
           Selected = 4, -- CANTIDAD de palabras extraídas al azar de la variable (Words) anterior, las que se tendrán que decir. // Un número menor o igual que el número de palabras totales que pusiste en (Words).
           Times = 6, -- SEGUNDOS del contrarreloj en los que se tendrá que decir CADA UNA.
       },

Y ponerlo antes de los últimos corchetes que cierran Config y Spell:
Código:
   },
  }




Y en la línea de la variable "Infos", si no quieres que un spell tenga requerimiento de vocación, pues no la pongas.
Infos = {level = 2, control = 3, vocation = {5}},

Quedándose así:
Infos = {level = 2, control = 3},



Sugerencia para evitar futuros quebraderos de cabeza:
[Tienes que estar registrado y conectado para ver este vínculo] - [Tienes que estar registrado y conectado para ver este vínculo] - [Tienes que estar registrado y conectado para ver este vínculo]
[Tienes que estar registrado y conectado para ver esa imagen]

Acan


Miembro
Gracias [Tienes que estar registrado y conectado para ver este vínculo] muy buena tu ayuda

Contenido patrocinado


Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.

 

¿Quién está en línea?

En total hay 1 usuario en línea: 1 Registrado, 0 Ocultos y 0 Invitado

Usuarios navegando en este foro: vicente9908

Forum Statistics

Nuestros miembros han públicado un total de posts en temas.
Actualmente hay miembros registrados.
Démosle la bienvenida al miembro más reciente,
La mayor cantidad de usuarios en línea ha sido de .