• TibiaFace

    Tibiaface | Una comunidad Open Tibia donde encontras : mapas, scripts, Otserver, npc y amigos etc ...

    .
    demo menumenu

    Afiliados



    Votar:

    [Sistema] Pet system Evolution + vocations (TFS )

    Compartir:

    Ver el tema anterior Ver el tema siguiente Ir abajo  Mensaje (Página 1 de 1.)

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    hola usuarios de tibiaface


    aqui les traigo el sistema de petsytem con evoluciones y vocacion

    texto:

       Level system. Pet gain level and experience.
       Pet gain ticks like players (Health, Mana) you can configure time and amount.
       Pet gain health/mana for each level, like players. You can configure how many.
       You can configure the pet's exp-rate.
       Pets can carry items. You can configure how many.
       You can block items, so pets won't carry these items.
       You can configure how much cost to revive a pet.
       You can add how many pets you want.
       You can configure level required for each pet.
       You can configure vocations that can use that pet.
       You can add/remove and configure attacks for each pet.
       This pet system supports area spells and distance spells.
       You can configure the level that a pet needs to use an attack.
       You can confugre the level that player needs to use an attack.
       You can configure range (Distance attacks) for each attack.
       For now, attacks works only with normal areas (Circles). Support for wave/beam areas will be added soon.
       You can move your pet with a command.
       You can make pets says the text you want.


    nos vamos a:


    Data/lib
    copiamos cualquier archivo y renombramos por pets.lua y pegamos esto dentro

    Código:
    --Circles
    AREA_CIRCLE2X2 =
    {
    {0, 1, 1, 1, 0},
    {1, 1, 1, 1, 1},
    {1, 1, 3, 1, 1},
    {1, 1, 1, 1, 1},
    {0, 1, 1, 1, 0}
    }

    AREA_CIRCLE3X3 =
    {
    {0, 0, 1, 1, 1, 0, 0},
    {0, 1, 1, 1, 1, 1, 0},
    {1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 3, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1},
    {0, 1, 1, 1, 1, 1, 0},
    {0, 0, 1, 1, 1, 0, 0}
    }

    -- Crosses
    AREA_CROSS1X1 =
    {
    {0, 1, 0},
    {1, 3, 1},
    {0, 1, 0}
    }

    AREA_CROSS5X5 =
    {
    {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
    {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
    {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
    {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1},
    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
    {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
    {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
    {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}
    }

    AREA_CROSS6X6 =
    {
    {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0},
    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
    {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
    {1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1},
    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
    {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
    {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
    {0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}
    }

    --Squares
    AREA_SQUARE1X1 =
    {
    {1, 1, 1},
    {1, 3, 1},
    {1, 1, 1}
    }

    -- Walls
    AREA_WALLFIELD = {
    {1, 1, 3, 1, 1}
    }

    AREADIAGONAL_WALLFIELD =
    {
    {0, 0, 0, 0, 1},
    {0, 0, 0, 1, 1},
    {0, 1, 3, 1, 0},
    {1, 1, 0, 0, 0},
    {1, 0, 0, 0, 0},
    }

    emoteAttack = true
    petEmoteAttack = true
    refillStatsAtLevel = true

    TYPE_NEAR = 1
    TYPE_DISTANCE = 2

    petExhaust = 3 --in seconds
    petSayExhaust = 3 --in seconds

    petGainTicks =
    {
    health = {func = doCreatureAddHealth, time = 3000, count = 1},
    mana = {func = doCreatureAddMana, time = 3000, count = 2}
    }

    petGainHealth = 30
    petGainMana = 30
    petExpRate = 1.3

    carryItems = 10

    petItemsBase = 1250
    petItems = {}
    blockedItems = {6132, 2195}

    for i = 1, carryItems do
    table.insert(petItems, petItemsBase + i)
    end

    petBase = 6120
    petStorages =
    {
    pet = petBase + 1000,
    level = petBase + 2000,
    exp = petBase + 3000,
    items = petBase + 4000,
    isPet = petBase + 5000,
    isDead = petBase + 6000,
    exhaust = petBase + 7000,
    sayExhaust = petBase + 8000,
    moveExhaust = petBase + 9000,
    health = petBase + 10000,
    mana = petBase + 11000,
    buyed = petBase + 12000
    }

    tables =
    {
    pet = {},
    level = {},
    exp = {},
    items = {},
    isDead = {},
    exhaust = {},
    health = {},
    mana = {},
    buyed = {}
    }

    reviveCost = 1000

    pets =
    {
    [1] =
    {
    monster = "orc spearman",
    vocations = {1, 2, 3, 4},
    level = 30,
    attacks =
    {
    [1] = {name = "", level = 30, petLevel = 30, mana = 50, type = TYPE_DISTANCE, range = 10, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_NONE, distEffect = CONST_ANI_SPEAR, damageMin = 0.7, damageMax = 1.0}
    }
    },
    [2] =
    {
    monster = "fire devil",
    vocations = {1, 2},
    level = 60,
    attacks =
    {
    [1] = {name = "Fire Strike", level = 60, petLevel = 60, mana = 100, type = TYPE_DISTANCE, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREDAMAGE, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0}
    }
    },
    [3] =
    {
    monster = "minotaur guard",
    vocations = {3, 4},
    level = 60,
    cost = 50,
    attacks =
    {
    [1] = {name = "Punch", level = 60, petLevel = 60, mana = 55, type = TYPE_NEAR, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_NONE, damageMin = 1.5, damageMax = 2.0}
    }
    },
    [4] =
    {
    monster = "water elemental",
    vocations = {2},
    level = 95,
    cost = 15000,
    attacks =
    {
    [1] = {name = "Ice Bomb", level = 100, petLevel = 100, mana = 250, type = TYPE_DISTANCE, range = 3, combat = COMBAT_ICEDAMAGE, effect = CONST_ME_ICEAREA, distEffect = CONST_ANI_ICE, damageMin = 1.5, damageMax = 2.0, area = AREA_CROSS1X1},
    [2] = {name = "Poison Strike", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, range = 8, combat = COMBAT_POISONDAMAGE, effect = CONST_ME_GREENRINGS, distEffect = CONST_ANI_POISON, damageMin = 1.2, damageMax = 1.8}
    }
    },
    [5] =
    {
    monster = "fire elemental",
    vocations = {1},
    level = 95,
    attacks =
    {
    [1] = {name = "Fire Bomb", level = 100, petLevel = 100, mana = 250, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIRE, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0, area = AREA_CROSS1X1},
    [2] = {name = "Fire Strike", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREDAMAGE, distEffect = CONST_ANI_FIRE, damageMin = 1.2, damageMax = 1.8}
    }
    },
    [6] =
    {
    monster = "orc warlord",
    vocations = {4},
    level = 95,
    attacks =
    {
    [1] = {name = "Throw Knife", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_THROWINGKNIFE, damageMin = 1.5, damageMax = 2.0}
    }
    },
    [7] =
    {
    monster = "golem",
    vocations = {3},
    level = 95,
    attacks =
    {
    [1] = {name = "Throw Stone", level = 95, petLevel = 95, mana = 80, type = TYPE_DISTANCE, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_BLOOD, distEffect = CONST_ANI_LARGEROCK, damageMin = 1.5, damageMax = 2.0}
    }
    },
    [8] =
    {
    monster = "wyrm",
    vocations = {1, 2, 3, 4},
    level = 135
    },
    [9] =
    {
    monster = "dragon lord",
    vocations = {1, 2, 3, 4},
    level = 200,
    attacks =
    {
    [1] = {name = "Fire Bomb", level = 200, petLevel = 200, mana = 300, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.0, area = AREA_CROSS1X1},
    [2] = {name = "Fire Storm", level = 205, petLevel = 220, mana = 700, type = TYPE_NEAR, range = 8, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_FIREAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.8, damageMax = 2.5, area = AREA_CROSS5X5},
    [3] = {name = "Fire Explosion", level = 203, petLevel = 210, mana = 450, type = TYPE_DISTANCE, range = 6, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_EXPLOSIONHIT, distEffect = CONST_ANI_FIRE, damageMin = 1.5, damageMax = 2.1, area = AREA_CIRCLE2X2},
    [4] = {name = "Scratch", level = 201, petLevel = 205, mana = 150, type = TYPE_NEAR, range = 1, combat = COMBAT_PHYSICALDAMAGE, effect = CONST_ME_HITAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.3, damageMax = 1.8},
    [5] = {name = "Fire Strike", level = 203, petLevel = 210, mana = 100, type = TYPE_DISTANCE, range = 3, combat = COMBAT_FIREDAMAGE, effect = CONST_ME_EXPLOSIONAREA, distEffect = CONST_ANI_FIRE, damageMin = 1.8, damageMax = 1.9}
    }
    }
    }

    for i = 1, #pets do
    table.insert(tables.pet, petStorages.pet + i)
    table.insert(tables.level, petStorages.level + i)
    table.insert(tables.exp, petStorages.exp + i)
    table.insert(tables.items, petStorages.items + i)
    table.insert(tables.isDead, petStorages.isDead + i)
    table.insert(tables.exhaust, petStorages.exhaust + i)
    table.insert(tables.health, petStorages.health + i)
    table.insert(tables.mana, petStorages.mana + i)
    table.insert(tables.buyed, petStorages.buyed + i)
    end

    function gainStat(pid, stat)

    if pid and pid > 0 and isMonster(pid) then
    stat.func(pid, stat.count)
    end
    addEvent(gainStat, stat.time, pid, stat)
    end

    function getLevelByExp(exp)
    return math.floor((math.sqrt(3) * math.sqrt(243*(exp+1)^2-48600*(exp+1)+3680000)+27 * (exp+1)-2700)^(1/3)/30^(2/3)-(5*10^(2/3))/(3^(1/3)*(math.sqrt(3)*math.sqrt(243*(exp+1)^2-48600*(exp+1)+3680000)+27*(exp+1)-2700)^(1/3))+2)
    end

    function getPetInfo(pet)
    if isNumber(pet) then
    return pets[pet] or false
    else
    for _, v in pairs(pets) do
    if pet:lower() == v.monster then
    return v
    end
    end
    end
    return false
    end

    function getPetByLevel(cid)
    local level = getPlayerLevel(cid)
    local pet
    for i = 1, #pets do
    v = pets
    if level >= v.level and isInArray(v.vocations, getPlayerVocation(cid)) then
    pet = v
    end
    end
    return (pet ~= nil and pet or false)
    end

    function getAttackFormula(pid, attack)
    return {
    min = ((getPetLevel(pid) * 2) * (1 + attack.damageMin) + getPetLevel(pid)) / 2.5,
    max = ((getPetLevel(pid) * 3) * (1 + attack.damageMax) + getPetLevel(pid)) / 2.5
    }
    end

    function doAttack(pid, target, param)

    local pet = getPetInfo(getCreatureName(pid))
    if pet then
    if pet.attacks and pet.attacks[param] then
    local attack = pet.attacks[param]
    if target > 0 and pid ~= getCreatureTarget(getCreatureMaster(pid)) then
    if attack.type and attack.type == TYPE_DISTANCE and getDistanceBetween(getCreaturePosition(pid), getCreaturePosition(target)) > (attack.range or 3) or attack.type == TYPE_NEAR and getDistanceBetween(getCreaturePosition(pid), getCreaturePosition(target)) > (attack.range or 1) then
    return doPlayerSendCancel(getCreatureMaster(pid), "Target is too far.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)
    end
    if not isSightClear(getCreaturePosition(pid), getCreaturePosition(target), true) then
    return doPlayerSendCancel(getCreatureMaster(pid), "There is not enough room.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)
    end
    else
    return doPlayerSendCancel(getCreatureMaster(pid), "Please select a target first.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)
    end
    if getPlayerLevel(getCreatureMaster(pid)) < attack.level then
    return doPlayerSendCancel(getCreatureMaster(pid), "You need level " .. attack.level .. " or higher to use this attack.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)
    end
    if getPetLevel(pid) < attack.petLevel then
    return doPlayerSendCancel(getCreatureMaster(pid), "Your pet needs level " .. attack.petLevel .. " or higher to use this attack.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)
    end
    if attack.mana and getCreatureMana(pid) < attack.mana then
    return doPlayerSendCancel(getCreatureMaster(pid), "Your pet does not have enough mana.") and doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)
    end
    if attack.area then
    doCastAreaAttack(pid, target, attack.area, attack)
    else
    doTargetCombatHealth(pid, target, attack.combat, -getAttackFormula(pid, attack).min, -getAttackFormula(pid, attack).max, attack.effect)
    end
    doCreatureAddMana(pid, -attack.mana)
    if attack.name ~= "" then
    if emoteAttack then
    doCreatureSay(getCreatureMaster(pid), getCreatureName(pid) .. ", use " .. attack.name .. "!", TALKTYPE_SAY)
    end
    if petEmoteAttack then
    doCreatureSay(pid, attack.name, TALKTYPE_MONSTER)
    end
    end
    return doSendDistanceShoot(getCreaturePosition(pid), (attack.type == TYPE_DISTANCE and getCreaturePosition(target) or getCreaturePosition(pid)), attack.distEffect)
    else
    return doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF)
    end
    else
    return doSendMagicEffect(getCreaturePosition(pid), CONST_ME_POFF) and doPlayerSendCancel(getCreatureMaster(pid), "There is a tecnical problem, please contact a gamemaster.")
    end
    end

    function callPet(cid, petId)

    for i = 1, #tables do
    for y = 1, #tables do
    if getCreatureStorage(cid, tables[y]) < 0 then
    doCreatureSetStorage(cid, tables[y], 0)
    end
    end
    end

    local pet = getPetInfoById(petId)
    if not pet then
    return doPlayerSendCancel(cid, "Something is wrong.")
    end

    if getPlayerLevel(cid) < pet.level then
    return doPlayerSendCancel(cid, "You need level " .. pet.level .. " or higher to call this pet.")
    end
    if pet.cost and pet.cost > 0 then
    if getCreatureStorage(cid, tables.buyed[petId]) < 1 then
    return doPlayerSendCancel(cid, "You need to buy this pet first.") and doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
    end
    end

    local ret = doCreateMonster(pet.monster, getCreaturePosition(cid))

    if getCreatureStorage(cid, tables.level[petId]) < 1 then
    doCreatureSetStorage(cid, tables.level[petId], pet.level)
    end

    if getCreatureStorage(cid, tables.exp[petId]) < 1 then
    doCreatureSetStorage(cid, tables.exp[petId], getExperienceForLevel(pet.level))
    end

    if getCreatureStorage(cid, tables.level[petId]) < pet.level then
    doCreatureSetStorage(cid, tables.level[petId], pet.level)
    elseif getPlayerLevel(cid) * 3 < getCreatureStorage(cid, tables.level[petId]) then
    doCreatureSetStorage(cid, tables.level[petId], pet.level)
    doCreatureSetStorage(cid, tables.exp[petId], getExperienceForLevel(pet.level))
    end

    if getLevelByExp(getCreatureStorage(cid, tables.exp[petId])) < getCreatureStorage(cid, tables.level[petId]) then
    doCreatureSetStorage(cid, tables.exp[petId], getExperienceForLevel(getCreatureStorage(cid, tables.level[petId])))
    end

    if getCreatureStorage(cid, tables.health[petId]) < 1 then
    doCreatureSetStorage(cid, tables.health[petId], getCreatureStorage(cid, tables.level[petId]) * petGainHealth)
    end

    if getCreatureStorage(cid, tables.mana[petId]) < 1 then
    doCreatureSetStorage(cid, tables.mana[petId], getCreatureStorage(cid, tables.level[petId]) * petGainMana)
    end

    doCreatureSetStorage(ret, tables.level[petId], getCreatureStorage(cid, tables.level[petId]))
    doCreatureSetStorage(ret, tables.exp[petId], getCreatureStorage(cid, tables.exp[petId]))

    doConvinceCreature(cid, ret)
    doCreatureSetStorage(ret, petStorages.isPet, 1)
    doSendMagicEffect(getCreaturePosition(ret), CONST_ME_TELEPORT)
    setCreatureMaxHealth(ret, getPetLevel(ret) * petGainHealth)
    doCreatureAddHealth(ret, -getCreatureHealth(ret) + getCreatureStorage(cid, tables.health[petId]))
    setCreatureMaxMana(ret, getPetLevel(ret) * petGainMana)
    doCreatureAddMana(ret, -getCreatureMana(ret) + getCreatureStorage(cid, tables.mana[petId]))
    for _, v in pairs(petGainTicks) do
    gainStat(ret, v)
    end
    return doCreatureSay(cid, "Go pet!", TALKTYPE_SAY)
    end

    function doCastAreaAttack(pid, target, area, attack)
    local center = {}
    local areaxx = {}
    center.y = math.floor(#area/2)+1
    for y = 1, #area do
    for x = 1, #area[y] do
    local number = area[y][x]
    if number > 0 then
    center.x = math.floor(table.getn(area[y])/2)+1
    if attack.type == TYPE_DISTANCE then
    table.insert(areaxx, {x = getCreaturePosition(target).x + x - center.x, y = getCreaturePosition(target).y + y - center.y, z = getCreaturePosition(target).z})
    else
    table.insert(areaxx, {x = getCreaturePosition(pid).x + x - center.x, y = getCreaturePosition(pid).y + y - center.y, z = getCreaturePosition(pid).z})
    end
    end
    end
    end
    for i = 1, #areaxx do
    doAreaCombatHealth(pid, attack.combat, areaxx, 0, -getAttackFormula(pid, attack).min, -getAttackFormula(pid, attack).max, attack.effect)
    end
    end

    function isPet(pid)
    local id = getPetIdByName(getCreatureName(pid))
    return getCreatureStorage(pid, petStorages.isPet) > 0 and true or false
    end

    function doPetAddExperience(pid, exp)

    local id = getPetIdByName(getCreatureName(pid))
    exp = math.ceil(exp)
    doCreatureSetStorage(getCreatureMaster(pid), tables.exp[id], getPetExperience(pid) + exp)
    doSendAnimatedText(getCreaturePosition(pid), exp, getConfigValue("gainExperienceColor"))
    return true
    end

    function getPetExperience(pid)
    local id = getPetIdByName(getCreatureName(pid))
    return getCreatureStorage(getCreatureMaster(pid), tables.exp[id])
    end

    function getPetLevel(pid)
    local id = getPetIdByName(getCreatureName(pid))
    return getCreatureStorage(getCreatureMaster(pid), tables.level[id])
    end

    function doPetSetLevel(pid, level)

    local id = getPetIdByName(getCreatureName(pid))
    doCreatureSetStorage(getCreatureMaster(pid), tables.level[id], level)
    setCreatureMaxHealth(pid, getPetLevel(pid) * petGainHealth)
    setCreatureMaxMana(pid, getPetLevel(pid) * petGainMana)
    return true
    end

    function getPlayerPet(cid)
    local pet
    if #getCreatureSummons(cid) < 1 then
    pet = false
    end

    for _, it in ipairs(getCreatureSummons(cid)) do
    if isPet(it) then
    pet = it
    break
    end
    end
    return pet
    end

    function getPetIdByName(name)

    local id = 0
    for k, it in pairs(pets) do
    if it.monster:lower() == name:lower() then
    id = k
    break
    end
    end
    return (id > 0 and id or false)
    end

    function getTopItem(p)
    p.stackpos = 0
    local v = getThingFromPos(p)
    repeat
    p.stackpos = p.stackpos + 1
    v = getThingFromPos(p)
    until v.itemid == 0
    p.stackpos = p.stackpos - 1
    return getThingFromPos(p)
    end

    function getPetInfoById(pet)
    for k, v in pairs(pets) do
    if k == pet then
    return v
    end
    end
    return false
    end

    if not getCreatureStorage then
    getCreatureStorage = getPlayerStorageValue
    doCreatureSetStorage = doPlayerSetStorageValue
    end


    ahora nos vamos a:

    data/talkactions/scripts
    copiamos cualquier archivo y renombramos por pet.lua y pagamos esto dentro

    Código:
    local l =
    {
    ["north"] = NORTH,
    ["east"] = EAST,
    ["south"] = SOUTH,
    ["west"] = WEST,
    ["southwest"] = SOUTHWEST,
    ["southeast"] = SOUTHEAST,
    ["northwest"] = NORTHWEST,
    ["northeast"] = NORTHEAST
    }

    function onSay(cid, words, param, channel)
    if(param == '') then
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
    return true
    end

    if param:lower() == "info" then
    local pet = getPlayerPet(cid)
    if pet then
    local pet_ = getPetInfo(getCreatureName(pet))
    local attacks = ""
    if pet_.attacks and #pet_.attacks > 0 then
    for i = 1, #pet_.attacks do
    attacks = attacks .. "Attack ID: " .. i .. "\n" .. (pet_.attacks.name ~= "" and " Name: " .. pet_.attacks.name .. "\n" or "") .. " Level: " .. pet_.attacks.level .. "\n Pet level: " .. pet_.attacks.petLevel .. "\n Pet mana: " .. pet_.attacks.mana .. "\n"
    end
    end
    return doShowTextDialog(cid, 1948, "Here is your pet info:\n" ..
    "\nName: " .. getCreatureName(pet) ..
    "\nHealth: " .. getCreatureHealth(pet) .. "-" .. getCreatureMaxHealth(pet) ..
    "\nMana: " .. getCreatureMana(pet) .. "-" .. getCreatureMaxMana(pet) ..
    "\nLevel: " .. getPetLevel(pet) ..
    "\nExperience: " .. getPetExperience(pet) ..
    "\n-----Attacks-----\n" .. (attacks ~= "" and attacks or "No attacks"))
    else
    return doPlayerSendCancel(cid, "Please call your pet first.")
    end
    elseif param:lower() == "take" then
    local pet = getPlayerPet(cid)
    if not pet then
    return doPlayerSendCancel(cid, "Please call your pet first.")
    end

    local slot = 0
    for i = 1, carryItems do
    if getCreatureStorage(cid, petItems) < 1 then
    slot = i
    break
    end
    end

    if slot == 0 then
    return doPlayerSendCancel(cid, "You only can carry " .. carryItems .. " items.")
    end

    local item = getTopItem(getCreaturePosition(pet))
    if getItemWeightById(item.itemid, 1) and getItemWeightById(item.itemid, 1) < 1 then
    return doPlayerSendCancel(cid, "There is no item to carry.")
    end

    if isInArray(blockedItems, item.itemid) then
    return doPlayerSendCancel(cid, "You cannot carry this item.")
    end
    doCreatureSetStorage(cid, petItems[slot], item.itemid * 1000 + (item.type > 0 and item.type or 1))
    doRemoveItem(item.uid)
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You take an item.")
    return true
    elseif param:lower() == "items" then
    local list = "Here is the list of items:\n"
    for i = 1, carryItems do
    if getCreatureStorage(cid, petItems) < 1 then
    list = list .. "\n" .. i .. ". Empty."
    else
    local thing = getCreatureStorage(cid, petItems)
    local item = math.floor(thing / 1000)
    local count = thing - item * 1000
    list = list .. "\n" .. i .. ". x" .. count .. " " .. getItemNameById(item) .. "."
    end
    end

    return doShowTextDialog(cid, 1948, list)
    elseif param:lower() == "back" then
    local pet = getPlayerPet(cid)
    if not pet then
    return doPlayerSendCancel(cid, "You don't have any pet released.")
    end
    local petId = getPetIdByName(getCreatureName(pet))
    doCreatureSetStorage(cid, tables.health[petId], getCreatureHealth(pet))
    doCreatureSetStorage(cid, tables.mana[petId], getCreatureMana(pet))
    doSendMagicEffect(getCreaturePosition(pet), CONST_ME_POFF)
    doRemoveCreature(pet)
    return doCreatureSay(cid, "It's enough!", TALKTYPE_SAY)
    else
    param = string.explode(param, ":")
    if param[1]:lower() == "call" then
    if not param[2] or param[2] == "" then
    return doPlayerSendCancel(cid, "No pet specified.")
    end
    if getTilePzInfo(getCreaturePosition(cid)) then
    return doPlayerSendCancel(cid, "You cannot call a pet in protection zone.")
    end
    if #getCreatureSummons(cid) > 0 then
    return doPlayerSendCancel(cid, "You only can call a pet.")
    end

    local pet = getPetIdByName(param[2])
    if pet then
    if getCreatureStorage(cid, tables.isDead[pet]) > 0 then
    return doPlayerSendCancel(cid, "You need to revive this pet first.")
    end

    return callPet(cid, pet)
    else
    return doPlayerSendCancel(cid, "There is not pet with that name.")
    end
    elseif param[1]:lower() == "attack" then
    local pet = getPlayerPet(cid)
    if not pet then
    return doPlayerSendCancel(cid, "Please call your pet first.")
    end
    if not param[2] or not isNumber(param[2]) or tonumber(param[2]) < 1 then
    return doPlayerSendCancel(cid, "No attack index specified.")
    end

    if exhaustion.get(cid, petStorages.exhaust) then
    return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)
    end

    doAttack(pet, getCreatureTarget(cid), tonumber(param[2]))
    exhaustion.set(cid, petStorages.exhaust, petExhaust)
    elseif param[1]:lower() == "give" then
    local pet = getPlayerPet(cid)
    if not pet then
    return doPlayerSendCancel(cid, "Please call your pet first.")
    end
    if not param[2] or not isNumber(param[2]) or tonumber(param[2]) < 1 then
    return doPlayerSendCancel(cid, "No slot specified.")
    end

    if getCreatureStorage(cid, petItems[tonumber(param[2])]) > 0 then
    local thing = getCreatureStorage(cid, petItems[tonumber(param[2])])
    local item = math.floor(thing/1000)
    local count = thing-item*1000
    doPlayerAddItem(cid, item, count)
    doCreatureSetStorage(cid, petItems[tonumber(param[2])], 0)
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You get an item.")
    else
    return doPlayerSendCancel(cid, "This slot is empty.")
    end
    elseif param[1]:lower() == "say" then
    local pet = getPlayerPet(cid)
    if not pet then
    return doPlayerSendCancel(cid, "Please call your pet first.")
    end
    if not param[2] or param[2] == "" then
    return doPlayerSendCancel(cid, "Command param required.")
    end

    if exhaustion.get(cid, petStorages.sayExhaust) then
    return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)
    end

    doCreatureSay(pet, param[2], TALKTYPE_MONSTER)
    exhaustion.set(cid, petStorages.sayExhaust, petExhaust)
    elseif param[1]:lower() == "move" then
    local pet = getPlayerPet(cid)
    if not pet then
    return doPlayerSendCancel(cid, "Please call your pet first.")
    end
    if not param[2] or param[2] == "" then
    return doPlayerSendCancel(cid, "Command param required.")
    end

    if exhaustion.get(cid, petStorages.moveExhaust) then
    return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)
    end

    local dir
    if l[param[2]:lower()] then
    dir = l[param[2]:lower()]
    local toPos = getPosByDir(getCreaturePosition(pet), dir, 1)
    local ret = queryTileAddThing(pet, toPos)
    if ret == RETURNVALUE_NOERROR then
    doMoveCreature(pet, dir)
    exhaustion.set(cid, petStorages.moveExhaust, petExhaust)
    else
    return doPlayerSendCancel(cid, "There is not enough room.") and doSendMagicEffect(getCreaturePosition(pet), CONST_ME_POFF)
    end
    else
    return doPlayerSendCancel(cid, "No direction specified.")
    end
    elseif isInArray({"mana", "health"}, param[1]:lower()) then
    if getPlayerGroupId(cid) < 3 then
    return false
    end
    local pet = getPlayerPet(cid)
    if not pet then
    return doPlayerSendCancel(cid, "Please call your pet first.")
    end
    if not param[2] or not isNumber(param[2]) then
    return doPlayerSendCancel(cid, "Command param required.")
    end

    if param[1]:lower() == "health" then
    doCreatureAddHealth(pet, tonumber(param[2]))
    elseif param[1]:lower() == "mana" then
    doCreatureAddMana(pet, tonumber(param[2]))
    end
    return doSendMagicEffect(getCreaturePosition(pet), (param[1]:lower() == "health" and CONST_ME_MAGIC_RED or CONST_ME_MAGIC_BLUE))
    end
    end
    return true
    end

    ahora en :

    Data/talkactions/talkactions.xml
    añadimos esta tag:

    Código:
    <talkaction words="!pet" event="script" value="pet.lua"/>


    Ahora nos vamos a:


    data/creaturescripts/scripts
    copiamos cualquier archivo y renombramos por  petkill.lua y pegamos esto dentro

    Código:
    function onKill(cid, target, lastHit)

    if not isMonster(target) or getConfigValue("rateExperience") < 0.1 or getMonsterInfo(getCreatureName(target)) and getMonsterInfo(getCreatureName(target)).experience < 1 then return true end

    local pet = getPlayerPet(cid)
    if pet then
    doPetAddExperience(pet, getMonsterInfo(getCreatureName(target)).experience * petExpRate)
    if getLevelByExp(getPetExperience(pet)) > getPetLevel(pet) then
    doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Your pet advanced from level " .. getPetLevel(pet) .. " to level " .. getLevelByExp(getPetExperience(pet)) .. ".")
    doPetSetLevel(pet, getLevelByExp(getPetExperience(pet)))
    if refillStatsAtLevel then
    doCreatureAddHealth(pet, getCreatureMaxHealth(pet) - getCreatureHealth(pet))
    doCreatureAddMana(pet, getCreatureMaxMana(pet) - getCreatureMana(pet))
    end
    end
    end
    return true
    end


    copiamos otro archivo ahi mismo y renombramos por petdeath.lua y pegamos dentro


    Código:
    function onDeath(cid, corpse, deathList)

    if not isPet(cid) then return true end

    local id = getPetIdByName(getCreatureName(cid))
    doCreatureSetStorage(getCreatureMaster(cid), tables.isDead[id], 1)
    doPlayerSendTextMessage(getCreatureMaster(cid), MESSAGE_STATUS_CONSOLE_BLUE, "Your pet is dead.")
    return true
    end


    ahi mismo copiamos otro archivo y renombramos por petstats.lua y pegamos dentro

    Código:
    function onStatsChange(cid, attacker, type, combat, value)

    if getPlayerPet(cid) and getPlayerPet(cid) == attacker then
    return false
    end
    return true
    end


    ahora buscamos en creatuscripts el archivo login.lua y registramos o añadimos esta lienas:

    Código:
    registerCreatureEvent(cid, "petKill")
    registerCreatureEvent(cid, "petDeath")
    registerCreatureEvent(cid, "petStats")


    ahora en :

    Data/creaturescripts/creaturescripts.xml
    añadismos estas tag:

    Código:
    <event type="kill" name="petKill" event="script" value="petkill.lua"/>
    <event type="death" name="petDeath" event="script" value="petdeath.lua"/>
    <event type="statschange" name="petStats" event="script" value="petstats.lua"/>


    ahora en los moustro que seran los pets añaden esta linea debajo de </flags>.

    Código:
    <script>
    <event name="petDeath"/>
    </script>


    ahora el npc que revivira su pet:

    Código:

            local keywordHandler = KeywordHandler:new()
            local npcHandler = NpcHandler:new(keywordHandler)
            NpcSystem.parseParameters(npcHandler)
            local talkState = {}

         
           
           
            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

            local dead = 0
            local pet
            function creatureSayCallback(cid, type, msg)

            if(not npcHandler:isFocused(cid)) then
            return false
            end
            local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE and 0 or cid
            if msgcontains(msg, 'offer') then
            local b = false
            local c = 0
            local response = "Here %s the following %s that you can buy:"
            for _, it in pairs(pets) do
            if it.cost and it.cost > 0 then
            c = c + 1
            b = true
            local voc, sep = "", ", "
            for i = 1, #it.vocations do
            if i == #it.vocations - 1 then
            sep = " and "
            elseif i == #it.vocations then
            sep = ""
            end
            voc = voc .. getVocationInfo(it.vocations).name .. sep
            end
            response = response .. "\n Name: " .. it.monster .. ", Cost: " .. it.cost .. ", Level: " .. it.level .. ", Vocations: " .. voc .. "."
            end
            end
            response = string.format(response, (c > 1 and "are" or "is"), (c > 1 and "pets" or "pet"))
            npcHandler:say(response, cid)


            elseif msgcontains(msg, 'revive') then

            for i = 1, #pets do
            if getCreatureStorage(cid, tables.isDead) > 0 then
            dead = dead + 1
            end
            end
            if dead > 0 then
            npcHandler:say('Do you want to revive ' .. dead .. ' of your pets for ' .. reviveCost * dead .. ' gold coins?.', cid)
            talkState[talkUser] = 1
            else
            npcHandler:say('Any of your pet is dead.', cid)
            talkState[talkUser] = 0
            end
            elseif msgcontains(msg, 'buy') then
            npcHandler:say('Please tell me the name of the pet that you can buy.', cid)
            talkState[talkUser] = 2
            elseif msgcontains(msg, 'yes') and talkState[talkUser] == 1 then
            if doPlayerRemoveMoney(cid, reviveCost * dead) then
            for i = 1, #tables.isDead do
            doCreatureSetStorage(cid, tables.isDead, 0)
            end
            npcHandler:say('Your pets has been revived.', cid)
            talkState[talkUser] = 0
            else
            npcHandler:say('You do not have enough money.', cid)
            talkState[talkUser] = 0
            end
            elseif talkState[talkUser] == 2 then
            pet = getPetIdByName(msg)
            if not pet then
            npcHandler:say('There is not any pet with that name.', cid)
            talkState[talkUser] = 0
            return true
            end

            if getCreatureStorage(cid, tables.buyed[pet]) > 0 then
            npcHandler:say('You already bought this pet.', cid)
            talkState[talkUser] = 0
            return true
            end

            if pets[pet].cost and pets[pet].cost > 0 then
            npcHandler:say('Do you want to buy ' .. pets[pet].monster .. ' [' .. pets[pet].level .. '] for ' .. pets[pet].cost .. ' gold coins?', cid)
            talkState[talkUser] = 3
            else
            npcHandler:say('This pet is not buyable, please tell me the name of the pet that you can buy.', cid)
            talkState[talkUser] = 2
            end
            elseif msgcontains(msg, 'yes') and talkState[talkUser] == 3 then
            if doPlayerRemoveMoney(cid, pets[pet].cost) then
            doCreatureSetStorage(cid, tables.buyed[pet], 1)
            npcHandler:say('Congratulations! you bought ' .. pets[pet].monster .. ' [' .. pets[pet].level .. '].', cid)
            talkState[talkUser] = 0
            else
            npcHandler:say('You do not have enough money to buy this pet.', cid)
            talkState[talkUser] = 0
            end
            end
            return true
            end

            npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
            npcHandler:addModule(FocusModule:new())



    Código:
    The pet system commands are:

        !pet call:pet_name // Call pet.
        !pet back // Call pet back.
        !pet info // It shows your pet info (Name, health, mana, level, experience and attacks)
        !pet take // It takes the item above the pet.
        !pet items // It shows the items you carry.
        !pet attack:index // Attack with your pet. Ex: !pet attack:2
        !pet give:index // Get a carried item. Ex: !pet give:4
        !pet say:text // Makes your pet says something. Ex: !pet say:Hello World
        !pet move:direction //Makes your moves. Ex: !pet move:northeast
        !pet mana/health:amount // Add/remove mana/health to your pet (Only for gamemasters)


    y eso es todo

    utilize nueva crituras para su pet no use la misma que tiene en sus respaw.



    Última edición por [Admin] God Maya el Miér Jun 26, 2019 10:37 pm, editado 1 vez



    [Sistema] Pet system Evolution + vocations (TFS ) YNU5B25
    Ver perfil de usuario https://www.tibiaface.com

    shuyin

    shuyin
    Miembro
    Miembro
    buenas, para que tfs sirve?

    Ver perfil de usuario

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:buenas, para que tfs sirve?

    testea



    [Sistema] Pet system Evolution + vocations (TFS ) YNU5B25
    Ver perfil de usuario https://www.tibiaface.com

    Humox

    Humox
    Miembro
    Miembro
    consulta donde modifico las criaturas?

    Ver perfil de usuario

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:consulta donde modifico las criaturas?

    en Data/lib humox



    [Sistema] Pet system Evolution + vocations (TFS ) YNU5B25
    Ver perfil de usuario https://www.tibiaface.com

    Fosfik

    Fosfik
    Miembro
    Miembro
    Hice todo los pasos, nada mas que el npc que hice no me funciona, no lo puedo crear me aparece este error.
    [Sistema] Pet system Evolution + vocations (TFS ) Errore10

    Ver perfil de usuario

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:Hice todo los pasos, nada mas que el npc que hice no me funciona, no lo puedo crear me aparece este error.
    [Sistema] Pet system Evolution + vocations (TFS ) Errore10


    primeramente tienes un gran error en tu login.lua en la linea 56 yo creo eso es el problema por el cual el sistema esta funcionando mal



    [Sistema] Pet system Evolution + vocations (TFS ) YNU5B25
    Ver perfil de usuario https://www.tibiaface.com

    Fosfik

    Fosfik
    Miembro
    Miembro
    El error de login.lua es porque no supe donde acomodar esto:
    registerCreatureEvent(cid, "petKill")
    registerCreatureEvent(cid, "petDeath")
    registerCreatureEvent(cid, "petStats")

    Lo puse al final nada mas, no se entre que lineas vaya.

    Ver perfil de usuario

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió: El error de login.lua es porque no supe donde acomodar esto:
    registerCreatureEvent(cid, "petKill")
    registerCreatureEvent(cid, "petDeath")
    registerCreatureEvent(cid, "petStats")

    Lo puse al final nada mas, no se entre que lineas vaya.


    dependiendo si usted esta usando un version arriba de tfs 1.0 no le servira este sistema pero si usa una version menor a lo mesionado usted busque en su login.lua un lineas paresidas que ya tiene establesida la login.lua las coloca debajo de ellas



    [Sistema] Pet system Evolution + vocations (TFS ) YNU5B25
    Ver perfil de usuario https://www.tibiaface.com

    Fosfik

    Fosfik
    Miembro
    Miembro
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:
    [Tienes que estar registrado y conectado para ver este vínculo] escribió: El error de login.lua es porque no supe donde acomodar esto:
    registerCreatureEvent(cid, "petKill")
    registerCreatureEvent(cid, "petDeath")
    registerCreatureEvent(cid, "petStats")

    Lo puse al final nada mas, no se entre que lineas vaya.


    dependiendo si usted esta usando un version arriba de tfs 1.0 no le servira este sistema pero si usa una version menor a lo mesionado usted busque en su login.lua un lineas paresidas que ya tiene establesida la login.lua las coloca debajo de ellas

    SI TIENE ESTAS LINEAS PARECIDAS:

    -- Events
    for i = 1, #events do
    player:registerEvent(events[i])
    player:registerEvent("AutoLoot")
    end

    Ver perfil de usuario

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:           El error de login.lua es porque no supe donde acomodar esto:
    registerCreatureEvent(cid, "petKill")
               registerCreatureEvent(cid, "petDeath")
               registerCreatureEvent(cid, "petStats")

    Lo puse al final nada mas, no se entre que lineas vaya.


    lo lamento amigo pero el sistema no es compatible para tu version de servidor esto solo es compatible para tfs 0.3.7 y 0.4.0

    dependiendo si usted esta usando un version arriba de tfs 1.0 no le servira este sistema pero si usa una version menor a lo mesionado usted busque en su login.lua un lineas paresidas que ya tiene establesida la login.lua las coloca debajo de ellas

    SI TIENE ESTAS LINEAS PARECIDAS:

    -- Events
       for i = 1, #events do
           player:registerEvent(events[i])
    player:registerEvent("AutoLoot")
       end



    lo lamento amigo pero el sistema no es compatible para tu version de servidor esto solo es compatible para tfs 0.3.7 y 0.4.0



    [Sistema] Pet system Evolution + vocations (TFS ) YNU5B25
    Ver perfil de usuario https://www.tibiaface.com

    Fosfik

    Fosfik
    Miembro
    Miembro
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:           El error de login.lua es porque no supe donde acomodar esto:
    registerCreatureEvent(cid, "petKill")
               registerCreatureEvent(cid, "petDeath")
               registerCreatureEvent(cid, "petStats")

    Lo puse al final nada mas, no se entre que lineas vaya.


    lo lamento amigo pero el sistema no es compatible para tu version de servidor esto solo es compatible para tfs 0.3.7 y 0.4.0

    dependiendo si usted esta usando un version arriba de tfs 1.0 no le servira este sistema pero si usa una version menor a lo mesionado usted busque en su login.lua un lineas paresidas que ya tiene establesida la login.lua las coloca debajo de ellas

    SI TIENE ESTAS LINEAS PARECIDAS:

    -- Events
       for i = 1, #events do
           player:registerEvent(events[i])
    player:registerEvent("AutoLoot")
       end



    lo lamento amigo pero el sistema no es compatible para tu version de servidor esto solo es compatible para tfs 0.3.7 y 0.4.0

    Gracias por aclarme bro, nimodo. (y)

    Ver perfil de usuario

    poncex

    poncex
    Miembro
    Miembro
    es normal que los "pets" ataquen a los dueños?, ya borre el respawn donde salen los pets.

    Ver perfil de usuario

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:es normal que los "pets" ataquen a los dueños?, ya borre el respawn donde salen los pets.


    si el pets no es conviseable en la flag de monsters te atacara y matara al player



    [Sistema] Pet system Evolution + vocations (TFS ) YNU5B25
    Ver perfil de usuario https://www.tibiaface.com

    poncex

    poncex
    Miembro
    Miembro
    los tengo asi y aun asi atacan a los players


    <?xml version="1.0" encoding="UTF-8"?>
    <monster name="Dragon Lord" nameDescription="a dragon lord" race="blood" experience="2100" speed="240" manacost="0">
    <health now="1900" max="1900"/>
    <look type="39" corpse="5984"/>
    <targetchange interval="5000" chance="8"/>
    <strategy attack="100" defense="0"/>
    <flags>
    <flag summonable="0"/>
    <flag attackable="1"/>
    <flag hostile="1"/>
    <flag illusionable="1"/>
    <flag convinceable="0"/>
    <flag pushable="0"/>
    <flag canpushitems="1"/>
    <flag canpushcreatures="1"/>
    <flag targetdistance="1"/>
    <flag staticattack="90"/>
    <flag runonhealth="300"/>
    </flags>
    <script>
    <event name="petDeath"/>
    </script>
    <attacks>
    <attack name="melee" interval="2000" min="-80" max="-250"/>
    <attack name="fire" interval="2000" chance="17" range="7" radius="4" target="1" min="-60" max="-180">
    <attribute key="shootEffect" value="fire"/>
    <attribute key="areaEffect" value="firearea"/>

    Ver perfil de usuario

    [Admin] God Maya

    [Admin] God Maya
    Administrador
    Administrador
    [Tienes que estar registrado y conectado para ver este vínculo] escribió:los tengo asi y aun asi atacan a los players


    <?xml version="1.0" encoding="UTF-8"?>
    <monster name="Dragon Lord" nameDescription="a dragon lord" race="blood" experience="2100" speed="240" manacost="0">
    <health now="1900" max="1900"/>
    <look type="39" corpse="5984"/>
    <targetchange interval="5000" chance="8"/>
    <strategy attack="100" defense="0"/>
    <flags>
    <flag summonable="0"/>
    <flag attackable="1"/>
    <flag hostile="1"/>
    <flag illusionable="1"/>
    <flag convinceable="0"/>
    <flag pushable="0"/>
    <flag canpushitems="1"/>
    <flag canpushcreatures="1"/>
    <flag targetdistance="1"/>
    <flag staticattack="90"/>
    <flag runonhealth="300"/>
    </flags>
    <script>
    <event name="petDeath"/>
        </script>
    <attacks>
    <attack name="melee" interval="2000" min="-80" max="-250"/>
    <attack name="fire" interval="2000" chance="17" range="7" radius="4" target="1" min="-60" max="-180">
    <attribute key="shootEffect" value="fire"/>
    <attribute key="areaEffect" value="firearea"/>

    <flag convinceable="0"/> ???????????????????????????? mira y eso, lea amigo



    aqui coloco una alternativa apra revivir el pet

    petdeath.lua

    Código:




        function onDeath(cid, corpse, deathList)

        if not isPet(cid) then return true end

        local stor = 55000
        setPlayerStorageValue(getCreatureMaster(cid), stor, 1)
        doPlayerSendTextMessage(getCreatureMaster(cid), MESSAGE_STATUS_CONSOLE_BLUE, "Your pet is dead.")
        return true
        end

    talkactions

    Código:


            local l =
            {
            ["north"] = NORTH,
            ["east"] = EAST,
            ["south"] = SOUTH,
            ["west"] = WEST,
            ["southwest"] = SOUTHWEST,
            ["southeast"] = SOUTHEAST,
            ["northwest"] = NORTHWEST,
            ["northeast"] = NORTHEAST
            }

            function onSay(cid, words, param, channel)
            if(param == '') then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
            return true
            end

            if param:lower() == "info" then
            local pet = getPlayerPet(cid)
            if pet then
            local pet_ = getPetInfo(getCreatureName(pet))
            local attacks = ""
            if pet_.attacks and #pet_.attacks > 0 then
            for i = 1, #pet_.attacks do
            attacks = attacks .. "Attack ID: " .. i .. "\n" .. (pet_.attacks.name ~= "" and " Name: " .. pet_.attacks.name .. "\n" or "") .. " Level: " .. pet_.attacks.level .. "\n Pet level: " .. pet_.attacks.petLevel .. "\n Pet mana: " .. pet_.attacks.mana .. "\n"
            end
            end
            return doShowTextDialog(cid, 1948, "Here is your pet info:\n" ..
            "\nName: " .. getCreatureName(pet) ..
            "\nHealth: " .. getCreatureHealth(pet) .. "-" .. getCreatureMaxHealth(pet) ..
            "\nMana: " .. getCreatureMana(pet) .. "-" .. getCreatureMaxMana(pet) ..
            "\nLevel: " .. getPetLevel(pet) ..
            "\nExperience: " .. getPetExperience(pet) ..
            "\n-----Attacks-----\n" .. (attacks ~= "" and attacks or "No attacks"))
            else
            return doPlayerSendCancel(cid, "Please call your pet first.")
            end
            elseif param:lower() == "take" then
            local pet = getPlayerPet(cid)
            if not pet then
            return doPlayerSendCancel(cid, "Please call your pet first.")
            end

            local slot = 0
            for i = 1, carryItems do
            if getPlayerStorageValue(cid, petItems) < 1 then
            slot = i
            break
            end
            end

            if slot == 0 then
            return doPlayerSendCancel(cid, "You only can carry " .. carryItems .. " items.")
            end

            local item = getTopItem(getCreaturePosition(pet))
            if getItemWeightById(item.itemid, 1) and getItemWeightById(item.itemid, 1) < 1 then
            return doPlayerSendCancel(cid, "There is no item to carry.")
            end

            if isInArray(blockedItems, item.itemid) then
            return doPlayerSendCancel(cid, "You cannot carry this item.")
            end
            setPlayerStorageValue(cid, petItems[slot], item.itemid * 1000 + (item.type > 0 and item.type or 1))
            doRemoveItem(item.uid)
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You take an item.")
            return true
            elseif param:lower() == "items" then
            local list = "Here is the list of items:\n"
            for i = 1, carryItems do
            if getPlayerStorageValue(cid, petItems) < 1 then
            list = list .. "\n" .. i .. ". Empty."
            else
            local thing = getPlayerStorageValue(cid, petItems)
            local item = math.floor(thing / 1000)
            local count = thing - item * 1000
            list = list .. "\n" .. i .. ". x" .. count .. " " .. getItemNameById(item) .. "."
            end
            end

            return doShowTextDialog(cid, 1948, list)
            elseif param:lower() == "back" then
            local pet = getPlayerPet(cid)
            if not pet then
            return doPlayerSendCancel(cid, "You don't have any pet released.")
            end
            local petId = getPetIdByName(getCreatureName(pet))
            setPlayerStorageValue(cid, tables.health[petId], getCreatureHealth(pet))
            setPlayerStorageValue(cid, tables.mana[petId], getCreatureMana(pet))
            doSendMagicEffect(getCreaturePosition(pet), CONST_ME_POFF)
            doRemoveCreature(pet)
            return doCreatureSay(cid, "It's enough!", TALKTYPE_SAY)
            else
            param = string.explode(param, ":")
            if param[1]:lower() == "call" then
            if not param[2] or param[2] == "" then
            return doPlayerSendCancel(cid, "No pet specified.")
            end
            if getTilePzInfo(getCreaturePosition(cid)) then
            return doPlayerSendCancel(cid, "You cannot call a pet in protection zone.")
            end
            if #getCreatureSummons(cid) > 0 then
            return doPlayerSendCancel(cid, "You only can call a pet.")
            end

            local pet = getPetIdByName(param[2])
            if pet then
            if getPlayerStorageValue(cid, 55000) > 0 then
            return doPlayerSendCancel(cid, "You need to revive this pet first.")
            end

            return callPet(cid, pet)
            else
            return doPlayerSendCancel(cid, "There is not pet with that name.")
            end
            elseif param[1]:lower() == "attack" then
            local pet = getPlayerPet(cid)
            if not pet then
            return doPlayerSendCancel(cid, "Please call your pet first.")
            end
            if not param[2] or not isNumber(param[2]) or tonumber(param[2]) < 1 then
            return doPlayerSendCancel(cid, "No attack index specified.")
            end

            if exhaustion.get(cid, petStorages.exhaust) then
            return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)
            end

            doAttack(pet, getCreatureTarget(cid), tonumber(param[2]))
            exhaustion.set(cid, petStorages.exhaust, petExhaust)
            elseif param[1]:lower() == "give" then
            local pet = getPlayerPet(cid)
            if not pet then
            return doPlayerSendCancel(cid, "Please call your pet first.")
            end
            if not param[2] or not isNumber(param[2]) or tonumber(param[2]) < 1 then
            return doPlayerSendCancel(cid, "No slot specified.")
            end

            if getPlayerStorageValue(cid, petItems[tonumber(param[2])]) > 0 then
            local thing = getPlayerStorageValue(cid, petItems[tonumber(param[2])])
            local item = math.floor(thing/1000)
            local count = thing-item*1000
            doPlayerAddItem(cid, item, count)
            setPlayerStorageValue(cid, petItems[tonumber(param[2])], 0)
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You get an item.")
            else
            return doPlayerSendCancel(cid, "This slot is empty.")
            end
            elseif param[1]:lower() == "say" then
            local pet = getPlayerPet(cid)
            if not pet then
            return doPlayerSendCancel(cid, "Please call your pet first.")
            end
            if not param[2] or param[2] == "" then
            return doPlayerSendCancel(cid, "Command param required.")
            end

            if exhaustion.get(cid, petStorages.sayExhaust) then
            return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)
            end

            doCreatureSay(pet, param[2], TALKTYPE_MONSTER)
            exhaustion.set(cid, petStorages.sayExhaust, petExhaust)
            elseif param[1]:lower() == "move" then
            local pet = getPlayerPet(cid)
            if not pet then
            return doPlayerSendCancel(cid, "Please call your pet first.")
            end
            if not param[2] or param[2] == "" then
            return doPlayerSendCancel(cid, "Command param required.")
            end

            if exhaustion.get(cid, petStorages.moveExhaust) then
            return doPlayerSendCancel(cid, "You are exhausted.") and doSendMagicEffect(getCreaturePosition(getCreatureSummons(cid)[1]), CONST_ME_POFF)
            end

            local dir
            if l[param[2]:lower()] then
            dir = l[param[2]:lower()]
            local toPos = getPosByDir(getCreaturePosition(pet), dir, 1)
            local ret = queryTileAddThing(pet, toPos)
            if ret == RETURNVALUE_NOERROR then
            doMoveCreature(pet, dir)
            exhaustion.set(cid, petStorages.moveExhaust, petExhaust)
            else
            return doPlayerSendCancel(cid, "There is not enough room.") and doSendMagicEffect(getCreaturePosition(pet), CONST_ME_POFF)
            end
            else
            return doPlayerSendCancel(cid, "No direction specified.")
            end
            elseif isInArray({"mana", "health"}, param[1]:lower()) then
            if getPlayerGroupId(cid) < 3 then
            return false
            end
            local pet = getPlayerPet(cid)
            if not pet then
            return doPlayerSendCancel(cid, "Please call your pet first.")
            end
            if not param[2] or not isNumber(param[2]) then
            return doPlayerSendCancel(cid, "Command param required.")
            end

            if param[1]:lower() == "health" then
            doCreatureAddHealth(pet, tonumber(param[2]))
            elseif param[1]:lower() == "mana" then
            doCreatureAddMana(pet, tonumber(param[2]))
            end
            return doSendMagicEffect(getCreaturePosition(pet), (param[1]:lower() == "health" and CONST_ME_MAGIC_RED or CONST_ME_MAGIC_BLUE))
            end
            end
            return true
            end

    npc

    Código:

    local keywordHandler = KeywordHandler:new()
        local npcHandler = NpcHandler:new(keywordHandler)
        NpcSystem.parseParameters(npcHandler)
        local talkState = {}

        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

      

        local playerReturnPosition = function(cid)
        doTeleportThing(cid.uid, returnPosition)
        doSendMagicEffect(returnPosition, CONST_ME_TELEPORT)
        return true
        end

        function creatureSayCallback(cid, type, msg)

        if(not npcHandler:isFocused(cid)) then
            return false
        end

        local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
        if msgcontains(msg, 'revivir') then
            selfSay('Usted Quiere revivir su PET?', cid)
            talkState[talkUser] = 1
        elseif talkState[talkUser] == 1 then
        if msgcontains(msg, 'yes') then
        
         if getPlayerStorageValue(cid, 55000) > 0 then    -------> storage de revivir
        
         if(getPlayerMoney(cid) >= 20000) then   ----------------> costo de revivir 2 cristales
        
         setPlayerStorageValue(cid, 55000, -1)

         doPlayerRemoveMoney(cid, 20000)  ------------> remueve el dinero
        
         selfSay('Su pet a vuelto a la vida!', cid)
        
         else
        
         selfSay('Usted no tiene dinero para revivir su PET!', cid)
        
         end
        
         else
            
            selfSay('Su pet no esta muerto!', cid)
            
            end
        else
            talkState[talkUser] = -1
            selfSay('come back later if you want a mission.', cid)
        end
        end

        return true
    end

    npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
    npcHandler:addModule(FocusModule:new())



    [Sistema] Pet system Evolution + vocations (TFS ) YNU5B25
    Ver perfil de usuario https://www.tibiaface.com

    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.

    Temas Recomendados×+

       

      BienvenidosTibiaFace es una comunidad de Open Tibia. Para participar debes estar registrado (click para Regístrate).