BlackTibia

No estás conectado. Conéctate o registrate

 » Open Tibia » Pedido de Scripts » 

[Pedido] Npc donador, Chest diario, y No atacar al summon.

[Pedido] Npc donador, Chest diario, y No atacar al summon.

jukimanxxxxx


Novato
Hola!
1-Necesito un NPC Que te venda items a cambio de un donator coin, la id del dnt coin es :8839

2-Y tambien necesito un chest que se pueda abrir solo diariamente, que siempre dé la misma recompensa en ese chest, también no te dara 1 cosa te dará varias

3-Necesito que tu summon cualquier tipo de summon ya sea por un monster que se invoque mediante un actionid, este summon aunque haga spells de area necesito que no dañen al player (Que lo sumoneo) ni el player al summon !

Gracias :n.

magebbe


Aprendiz
[Tienes que estar registrado y conectado para ver este vínculo] escribió:
Hola!
1-Necesito un NPC Que te venda items a cambio de un donator coin, la id del dnt coin es :8839

2-Y tambien necesito un chest que se pueda abrir solo diariamente, que siempre dé la misma recompensa en ese chest, también no te dara 1 cosa te dará varias

3-Necesito que tu summon cualquier tipo de summon ya sea por un monster que se invoque mediante un actionid, este summon aunque haga spells de area necesito que no dañen al player (Que lo sumoneo) ni el player al summon !

Gracias :n.


Bueno para el npc descarga un programa que se llama npc maker ahí lo podras hacer facil y a tu gusto

2- Tu quieres es como un evento que se abra a una hora en específico trata de buscar en este mismo foro amigo ya eso esta publicado.

3- El monster invocarse por action id siempre se invoca por la magia y el summon no ataca a menos que el player lo haga pero para que el player no lo ataque creas un monster o copias uno de los ya creado y donde dice una tag dice attackable colocas 0 y tus users no le pueden pegar y ahí modificas tu monster que no tenga ningun ataque o el ataque que quieras.

jukimanxxxxx


Novato
-Lo del NPC Maker vende objetos pero por dinero, yo lo que quiero es que venda objetos por el itemid:8839

-Lo del chest no es un evento que se abra automático. es solo un chest que esté ahí y que se pueda abrir diariamente.

-Lo del monster si le pones ese flag NADA Lo podra atacar, yo solo quiero que todo menos YO lo pueda herir, tambien que cuando yo o el monster lanze una spell de AREA no nos afecte

Belerofonte


Administrador
[Tienes que estar registrado y conectado para ver este vínculo] escribió:1-Necesito un NPC Que te venda items a cambio de un donator coin, la id del dnt coin es :8839
Donator Npc:
El documento.xml del Npc con su nombre, saludo, despedida, lista de objetos, etc... lo creas tú a tu gusto.

Server\Data\Npc\Scripts\... DonatorNpc.lua
Código:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
   
local Topic = {}
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 Conf = {
    Offert = {
        Money = 8839, -- Donator coin usado como dinero,

        -- [Objeto a comprar] = {Count = Cantidad del objeto comprado, Cost = Cantidad del objeto usado como dinero},
        [9019] = {Count = 1, Cost = 5},
        [2538] = {Count = 5, Cost = 1},
        [3967] = {Count = 1, Cost = 1},
        [11349] = {Count = 1, Cost = 2},
        [7730] = {Count = 2, Cost = 1},
    },
}

function creatureSayCallback(cid, type, msg)
    if not npcHandler:isFocused(cid) then
        return false
    end
    if not ExistItemByName(msg) then
        return true
    end
    local v = Conf.Offert[getItemIdByName(msg)]
    if v then
        if doPlayerRemoveItem(cid, Conf.Offert.Money, v.Cost) then
            doPlayerAddItem(cid, getItemIdByName(msg), v.Count)
            npcHandler:say("Deal done! " .. (v.Count > 1 and "These " .. v.Count .. " " .. getItemPluralNameById(getItemIdByName(msg)) or "That " .. getItemNameById(getItemIdByName(msg))) .. " in exchange of " .. (v.Cost > 1 and v.Cost .. " " .. getItemPluralNameById(Conf.Offert.Money) or getItemNameById(Conf.Offert.Money)) .. ".", cid)
            Topic[cid] = 0
        else
            npcHandler:say((getPlayerItemCount(cid, Conf.Offert.Money) > 0 and "It seems you need " .. v.Cost - getPlayerItemCount(cid, Conf.Offert.Money) .. " " .. ((v.Cost - getPlayerItemCount(cid, Conf.Offert.Money)) > 1 and getItemPluralNameById(Conf.Offert.Money) or getItemNameById(Conf.Offert.Money)) or "You haven't " .. v.Cost .. " " .. (v.Cost > 1 and getItemPluralNameById(Conf.Offert.Money) or getItemNameById(Conf.Offert.Money))) .. ".", cid)
        end
    end
    return true
end

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



Zona (básica) a editar:
local Conf = {
Offert = {
Money = 8839, -- Donator coin usado como dinero,

-- [Objeto a comprar] = {Count = Cantidad del objeto comprado, Cost = Cantidad del objeto usado como dinero},
[9019] = {Count = 1, Cost = 5},
[2538] = {Count = 5, Cost = 1},
[3967] = {Count = 1, Cost = 1},
[11349] = {Count = 1, Cost = 2},
[7730] = {Count = 2, Cost = 1},
},
}

Para añadir más objetos duplica esas líneas y edita sus parámetros.
Ejemplo: [2520] = {Count = 7, Cost = 100},

Nota. Creo que no hay forma de ponerle vía trade si la moneda de cambio es un objeto y no Gold Coins.



[Tienes que estar registrado y conectado para ver este vínculo] escribió:2-Y tambien necesito un chest que se pueda abrir solo diariamente, que siempre dé la misma recompensa en ese chest, también no te dara 1 cosa te dará varias.
Chest Diario:
Server\Data\Actions\... Actions.xml
Código:
<action uniqueid="2379" event="script" value="ChestPerDay.lua"/>

Server\Data\Actions\Scripts\... ChestPerDay.lua
Código:
local Rewards = {
    Stor = 409368, -- Storage key que gustes.

    -- {ID del objeto entregado, Cantidad de ese objeto entregado},
        {2160, 10},
        {2159, 2},

    }

function onUse(cid, item, position, fromPosition, itemEx, toPosition)
    if exhaustion.get(cid, Rewards.Stor) == false then
        for _, items in ipairs(Rewards) do
            doPlayerAddItem(cid, items[1], items[2])
        end
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found ' .. getItemsFromList(Rewards) .. '.')
        exhaustion.set(cid, Rewards.Stor, 1 * 24 * 60 * 60)

    else
        if timeString(exhaustion.get(cid, Rewards.Stor)) ~= '' then
            doPlayerSendCancel(cid, "It's empty. It refilling in " .. timeString(exhaustion.get(cid, Rewards.Stor)) .. ".")
        end
    end
    return true
end

function timeString(timeDiff)
    local dateFormat = {
        {"day", timeDiff / 60 / 60 / 24},
        {"hour", timeDiff / 60 / 60 % 24},
        {"minute", timeDiff / 60 % 60},
        {"second", timeDiff % 60}
    }

    local out = {}
    for k, t in ipairs(dateFormat) do
        local v = math.floor(t[2])
        if(v > 0) then
            table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
        end
    end
    local ret = table.concat(out)
    if ret:len() < 16 and ret:find("second") then
        local a, b = ret:find(" and ")
        ret = ret:sub(b+1)
    end
    return ret
end

function getItemsFromList(items) -- by Vodka
  local str = ''
    if table.maxn(items) > 0 then
        for i = 1, table.maxn(items) do
            str = str .. (items[i][2] > 1 and items[i][2] .. " " .. getItemPluralNameById(items[i][1]) or getItemArticleById(items[i][1]) .. " " .. getItemNameById(items[i][1]))
            if i == table.maxn(items) - 1 then
                str = str .. ' and '
            elseif i ~= table.maxn(items) then
                str = str .. ', '
            end
        end
    end
    return str
end



Para añadir más objetos, duplica cada línea y edita sus parámetros.
Ejemplo: {2543, 100},

Sus nombres y cantidades saldrán automáticamente en el mensaje. Así como el tiempo restante diario que le queda tras accionarlo posteriormente.

Nota. Al God no le afectará el tiempo a esperar, solo a jugadores normales.



[Tienes que estar registrado y conectado para ver este vínculo] escribió:3-Necesito que tu summon cualquier tipo de summon ya sea por un monster que se invoque mediante un actionid, este summon aunque haga spells de area necesito que no dañen al player (Que lo sumoneo) ni el player al summon !
Summon:
Server\Data\Actions\... Actions.xml
Código:
<action actionid="2379" event="script" value="SummonByItem.lua"/>

Server\Data\Actions\Scripts\... SummonByItem.lua
Código:
local Monster = "Minotaur" -- Nombre del monstruo.

function onUse(cid, item, position, fromPosition, itemEx, toPosition)
    local getSummons = getCreatureSummons(cid)
    if #getSummons > 0 then
        for _, pid in ipairs (getSummons) do
            if getCreatureName(pid):lower() == Monster:lower() then
                return false
            end
        end
    end

    local position = getClosestFreeTile(cid, getThingPos(item.uid), true, false)
    if not position then
        return addEvent(doPlayerSendDefaultCancel, 0, cid, RETURNVALUE_NOTENOUGHROOM)
    end

    if not getTilePzInfo(position) then
        local friend = doSummonCreature(Monster, position, true)
        doConvinceCreature(cid, friend)
        doSendMagicEffect(getThingPos(friend), CONST_ME_TELEPORT)
        doSendDistanceShoot(getThingPos(cid), getThingPos(friend), CONST_ANI_EXPLOSION)
    else
        return doPlayerSendDefaultCancel(cid, RETURNVALUE_ACTIONNOTPERMITTEDINPROTECTIONZONE) and false
    end
    return true
end



Server\Data\Creaturescripts\... Creaturescripts.xml
Código:
<event type="combat" name="DontHitInvoked" event="script" value="DontHitInvoked.lua"/>

Server\Data\Creaturescripts\Scripts\... Login.lua
Código:
    registerCreatureEvent(cid, "DontHitInvoked")

Server\Data\Creaturescripts\Scripts\... DontHitInvoked.lua
Código:
local Monster = "Minotaur" -- Nombre del monstruo.

function onCombat(cid, target)
    if not isPlayer(target) and getCreatureName(target):lower() == Monster:lower() then
        if getCreatureMaster(target) and getCreatureName(getCreatureMaster(target)) == getCreatureName(cid) then
            return
        end
    end
    return true
end



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]

jukimanxxxxx


Novato
-Me puedes poner el archivo .xml del npc porfa?
No me funciona con ninguno de los que probe  :T

-Y el del summon, lo sumoneo, pero no lo puedo volver a meter, yo no lo puedo atacar a el, pero cuando mi summon hace un ataque de área me sigue haciendo daño ami

-Con el cofre, funciona muy bien pero, la gente empieza a crearse otros PJ's y funciona igual y ps, se petan de items xD



Última edición por jukimanxxxxx el Vie Mayo 27, 2016 6:56 pm, editado 1 vez

jukimanxxxxx


Novato
b U m P

jukimanxxxxx


Novato
Bump u.u

jukimanxxxxx


Novato
@BUMP

Belerofonte


Administrador
Respecto a los scripts, tranqui, que no me olvido de tí. He estado ocupado esta semana porque ya tengo vida social Friki..
Pero ya estoy con ello.


Al Npc le hice un par de cambios:
- Cuando el jugador le salude, el Npc le dirá un mensaje junto con la palabra clave que el jugador debe decir para que le muestre la lista de objetos en venta.
- Dicha lista, le saldrá ordenada alfabéticamente con sus respectivos nombres y precios expuestos en la tabla superior(Conf.Offert)
Donator Npc:

Server\Data\Npc\... DonatorNpc.xml
Código:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="LobeznOndaVital" script="data/npc/scripts/DonatorNpc.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_farewell" value="Bye bye then!" />
    </parameters>
</npc>
Si le vas a poner mensajes determinados tipo greet, farewell, walkaway, etc... no le pongas el de saludo(greet). Pues tendrás que editar ese en concreto en el siguiente DonatorNpc.lua

Server\Data\Npc\Scripts\... DonatorNpc.lua
Código:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
   
local Topic = {}
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 Conf = {
    Money = 8839, -- Donator coin usado como dinero,
    Offert = {
        -- {Item = Objeto a comprar, Cost = Cantidad del objeto usado como dinero},
        {Item = 9019, Cost = 5},
        {Item = 9811, Cost = 3},
        {Item = 3967, Cost = 1},
        {Item = 11349, Cost = 2},
        {Item = 7730, Cost = 1},
        -- 41 objetos es el tope aproximado en: doPlayerPopupFYI
    },
}

local function titleCase(first, rest)
    return first:upper()..rest:lower()
end
local function getMoneyName(uid, cost)
    local name = {}
    if cost > 1 then
        name = getItemPluralNameById(uid)
    else
        name = getItemNameById(uid)
    end
    return cost .. " " .. string.gsub(name, "(%a)([%w_']*)", titleCase)
end

npcHandler:setMessage(MESSAGE_GREET, "Greetings |PLAYERNAME|. I sell donator items, if you want see all with its prizes say me {list}.")
function creatureSayCallback(cid, type, msg)
    local Belero = ''
    local msg = msg:lower()
    if not npcHandler:isFocused(cid) then
        return false
    end
    if msgcontains(msg, 'list') then
        npcHandler:say("Take a look!", cid)
        table.sort(Conf.Offert, function(a, b) return getItemNameById(a.Item) < getItemNameById(b.Item) end)
        for i = 1, #Conf.Offert do
            Belero = Belero .. string.gsub(getItemNameById(Conf.Offert[i].Item), "(%a)([%w_']*)", titleCase) .. " x " .. getMoneyName(Conf.Money, Conf.Offert[i].Cost) .. ".\n"
        end
        doPlayerPopupFYI(cid, Belero)
    end
    if not ExistItemByName(msg) then
        return true
    end
    for _, var in ipairs(Conf.Offert) do
        if var.Item == getItemIdByName(msg) then
            if doPlayerRemoveItem(cid, Conf.Money, var.Cost) then
                doPlayerAddItem(cid, getItemIdByName(msg), 1)
                npcHandler:say("Deal done! " .. string.gsub(getArticle(msg), "(%a)([%w_']*)", titleCase) .. " {" .. string.gsub(getItemNameById(getItemIdByName(msg)), "(%a)([%w_']*)", titleCase) .."} in exchange of {" .. getMoneyName(Conf.Money, var.Cost) .. "}.", cid)
                Topic[cid] = 0
            else
                npcHandler:say(getPlayerItemCount(cid, Conf.Money) > 0 and "It seems you need {" .. getMoneyName(Conf.Money, var.Cost - getPlayerItemCount(cid, Conf.Money)) .."}." or "You haven't {" .. getMoneyName(Conf.Money, var.Cost) .. "}.", cid)
            end
            break
        end
    end
    return true
end

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


Ahora, también tuve que cambiar la cantidad de objetos otorgados. Se tendrá que comprar uno por uno, de todas formas... así es como en un principio lo pediste.

Zona (básica) a editar:
local Conf = {
Offert = {
Money = 8839, -- Donator coin usado como dinero,

-- {Item = Objeto a comprar, Cost = Cantidad del objeto usado como dinero},
{Item = 9019, Cost = 5},
{Item = 2538, Cost = 1},
{Item = 3967, Cost = 1},
{Item = 11349, Cost = 2},
{Item = 7730, Cost = 1},
},
}

Para añadir más objetos duplica esas líneas y edita sus parámetros.
Ejemplo: [2520] = {Cost = 100},

El saludo, en la línea número 38:
Código:
npcHandler:setMessage(MESSAGE_GREET, "Greetings |PLAYERNAME|. I sell donator items, if you want see all with its prizes say me {list}.")

Y la cantidad de objetos disponibles a poner en la tabla superior depende del número de letras que posean sus nombres, pero aproximadamente conté 41 objetos, como el límite para que salgan en el recuadro sin fallos. Un ejemplo de a lo que me refiero:
[Tienes que estar registrado y conectado para ver esa imagen]

Allí hay 40 objetos, procedentes de:
Código:
local Conf = {
    Money = 8839, -- Donator coin usado como dinero,
    Offert = {
        -- {Item = Objeto a comprar, Cost = Cantidad del objeto usado como dinero},
        {Item = 9019, Cost = 1},    {Item = 2556, Cost = 3},    {Item = 2546, Cost = 5},    {Item = 2535, Cost = 7}, 
        {Item = 9811, Cost = 1},    {Item = 2555, Cost = 3},    {Item = 2545, Cost = 5},    {Item = 2534, Cost = 7},
        {Item = 2540, Cost = 1},    {Item = 2554, Cost = 3},    {Item = 2544, Cost = 5},    {Item = 2533, Cost = 7},
        {Item = 11349, Cost = 1},  {Item = 2553, Cost = 3},    {Item = 2543, Cost = 5},    {Item = 2532, Cost = 7},
        {Item = 2560, Cost = 1},    {Item = 2552, Cost = 3},    {Item = 2542, Cost = 5},    {Item = 2531, Cost = 8},
        {Item = 2561, Cost = 2},    {Item = 2551, Cost = 4},    {Item = 2541, Cost = 1},    {Item = 2530, Cost = 8},
        {Item = 2562, Cost = 2},    {Item = 2550, Cost = 4},    {Item = 2540, Cost = 2},    {Item = 2529, Cost = 8},
        {Item = 2559, Cost = 2},    {Item = 2549, Cost = 4},    {Item = 2539, Cost = 3},    {Item = 2528, Cost = 8},
        {Item = 2558, Cost = 2},    {Item = 2548, Cost = 4},    {Item = 2537, Cost = 5},    {Item = 2527, Cost = 8},
        {Item = 2557, Cost = 2},    {Item = 2547, Cost = 4},    {Item = 2536, Cost = 7},    {Item = 2526, Cost = 8},
 -- 41 objetos es el tope en: doPlayerPopupFYI
    },
}
Si le añadiera 2 objetos más y le dijera al Npc "list": no funcionaría y al cliente le daría debug.

Nota. Creo que no hay forma de ponerle vía trade si la moneda de cambio es un objeto y no Gold Coins.



Ahora el cofre le afecta a los demás personajes que el jugador tenga en su account. Usé esa misma fórmula para que también se detecten los jugadores que procedan de una misma dirección Ip para que siga teniendo que esperar aun creándose diferentes accounts, aunque esta última no lo pude testear, tendrás que hacerlo tú y decirme si te va guay o no.
Chest Diario:
Server\Data\Actions\... Actions.xml
Código:
<action uniqueid="2379" event="script" value="DailyChest.lua"/>

Server\Data\Actions\Scripts\... DailyChest.lua
Código:
local Rewards = {
    Stor = 409368, -- Storage key que gustes.

    -- {ID del objeto entregado, Cantidad de ese objeto entregado},
        {2160, 10},
        {2159, 2},
    }

local function getItemsFromList(items) -- by Vodka
    local str = ''
    if table.maxn(items) > 0 then
        for i = 1, table.maxn(items) do
            str = str .. (items[i][2] > 1 and items[i][2] .. " " .. getItemPluralNameById(items[i][1]) or getItemArticleById(items[i][1]) .. " " .. getItemNameById(items[i][1]))
            if i == table.maxn(items) - 1 then
                str = str .. ' and '
            elseif i ~= table.maxn(items) then
                str = str .. ', '
            end
        end
    end
    return str
end

local function timeString(timeDiff)
    local dateFormat = {
        {"day", timeDiff / 60 / 60 / 24},
        {"hour", timeDiff / 60 / 60 % 24},
        {"minute", timeDiff / 60 % 60},
        {"second", timeDiff % 60}
    }

    local out = {}
    for k, t in ipairs(dateFormat) do
        local v = math.floor(t[2])
        if(v > 0) then
            table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
        end
    end
    local ret = table.concat(out)
    if ret:len() < 16 and ret:find("second") then
        local a, b = ret:find(" and ")
        ret = ret:sub(b+1)
    end
    return ret
end

local function getPlayersByAccount(id)
    local query = db.getResult("SELECT `id` FROM `players` WHERE `account_id` = " .. id .. ";")
    local players = {}
    if query:getID() ~= -1 then
        repeat
            table.insert(players, query:getDataInt("id"))
        until not query:next()
        query:free()
    end
    return players
end
local function getPlayersByIP(ip)
    local query = db.getResult("SELECT `name` FROM `players` WHERE `ip` =  '" .. ip .. "';")
    local players = {}
    if query:getID() ~= -1 then
        repeat
            table.insert(players, query:getDataString("name"))
        until not query:next()
        query:free()
    end
    return players
end

local function getPlayerDBStorageValue(guid, key)
    local result, ret = db.getResult("SELECT `value` FROM `player_storage` WHERE `player_id` = '" .. guid .. "' AND `key` = " .. key .. ";")
    if result:getID() == -1 then
        return nil
    end
    ret = result:getDataInt("value")
    result:free()
    return ret
end

local function SomePlayerGetExhaust(cid, storage) -- Searching by Account or Ip
    local playersAcc = getPlayersByAccount(getPlayerAccountId(cid))
    local playersIps = getPlayersByIP(doConvertIntegerToIp(getPlayerIp(cid)))
    for _, x in ipairs(playersAcc) do
        local exhaust = getPlayerDBStorageValue(x, storage)
        if exhaust ~= nil then
        local left = exhaust - os.time()
            if left > 0 then
                return doPlayerSendCancel(cid, "It's empty. It refilling in " .. timeString(left) .. ".")
            end
        end
    end
    for _, x in ipairs(playersIps) do
        local exhaust = getPlayerDBStorageValue(x, storage)
        if exhaust ~= nil then
            local left = exhaust - os.time()
            if left > 0 then
                return doPlayerSendCancel(cid, "It's empty. It refilling in " .. timeString(left) .. ".")
            end
        end
    end
    return false
end

function onUse(cid, item, position, fromPosition, itemEx, toPosition)
    if SomePlayerGetExhaust(cid, Rewards.Stor) == false then
        for _, Belero in ipairs(Rewards) do
            doPlayerAddItem(cid, Belero[1], Belero[2])
        end
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found ' .. getItemsFromList(Rewards) .. '.')
        setPlayerStorageValue(cid, Rewards.Stor, (os.time() + 1 * 24 * 60 * 60))
        doPlayerSave(cid)
    end
    return true
end


Para añadir más objetos, duplica cada línea y edita sus parámetros.
Ejemplo: {2543, 100},

Sus nombres y cantidades saldrán automáticamente en el mensaje al recibirlos. Así como el tiempo restante diario que le queda tras accionarlo posteriormente, desde el mismo personaje, o desde otro personaje de la misma cuenta, o desde otro personaje de una cuenta distinta pero con la misma dirección Ip.

Ahora creo que la única forma que habría de burarlo sería reseteando el router para cambiar la dirección Ip y creando otra nueva account... cosa que ya, no sabría cómo prevenir u.u

Nota. Ahora al God sí le afectará el tiempo a esperar, como a los jugadores normales.



Respecto al summon. Al principio no mencionaste nada acerca de que se vuelva a guardar. Aquí lo tienes:
Objeto invocador:
Server\Data\Actions\Scripts\... SummonByItem.lua
Código:
local Monster = "Minotaur"

function onUse(cid, item, position, fromPosition, itemEx, toPosition)
    local getSummons = getCreatureSummons(cid)
    if #getSummons > 0 then
        for _, pid in ipairs (getSummons) do
            if getCreatureName(pid):lower() == Monster:lower() then
                doSendDistanceShoot(getThingPos(pid), getThingPos(item.uid), CONST_ANI_EXPLOSION)
                doRemoveCreature(pid)
                return true
            end
        end
    end

    local position = getClosestFreeTile(cid, getThingPos(item.uid), true, false)
    if not position then
        return addEvent(doPlayerSendDefaultCancel, 0, cid, RETURNVALUE_NOTENOUGHROOM)
    end

    if not getTilePzInfo(position) then
        local friend = doSummonCreature(Monster, position, true)
        doConvinceCreature(cid, friend)
        doSendMagicEffect(getThingPos(friend), CONST_ME_TELEPORT)
        doSendDistanceShoot(getThingPos(item.uid), getThingPos(friend), CONST_ANI_EXPLOSION)
    else
        return doPlayerSendDefaultCancel(cid, RETURNVALUE_ACTIONNOTPERMITTEDINPROTECTIONZONE) and false
    end
    return true
end



Y, cierto. Olvidé que en algunos servidores el summon puede atacar al summoner, por lo que solamente lo configuré para que el summoner no pueda atacar a su propio summon la vez anterior.

En este script, de nuevo, no pude testearlo porque no poseo ningún server en el que el monstruo ataque a su invocador, por lo que, tendrás que testearlo también tú.
No atacarse:
Server\Data\Creaturescripts\Scripts\... DontHitInvoked.lua
Código:
local Monster = "Minotaur"

function onCombat(cid, target)
    if not isPlayer(target) and getCreatureName(target):lower() == Monster:lower() then
        if getCreatureMaster(target) and getCreatureName(getCreatureMaster(target)) == getCreatureName(cid) then
            return false
        end
    end
    if isPlayer(target) and getCreatureName(cid):lower() == Monster:lower() then
        if getCreatureMaster(cid) and getCreatureName(getCreatureMaster(cid)) == getCreatureName(target) then
            return false
        end
    end
    return true
end



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]

jukimanxxxxx


Novato
Da este error con el npc:l. me muesta la lista pero cuando digo el nombre del item, da este error

[31/5/2016 21:19:54] [Error - NpcScript Interface]
[31/5/2016 21:19:54] data/npc/scripts/Dntcoins.lua:onCreatureSay
[31/5/2016 21:19:54] Description:
[31/5/2016 21:19:54] data/npc/scripts/Dntcoins.lua:52: attempt to call global 'ExistItemByName' (a nil value)
[31/5/2016 21:19:54] stack traceback:
[31/5/2016 21:19:54] data/npc/scripts/Dntcoins.lua:52: in function 'callback'
[31/5/2016 21:19:54] data/npc/lib/npcsystem/npchandler.lua:424: in function 'onCreatureSay'
[31/5/2016 21:19:55] data/npc/scripts/Dntcoins.lua:8: in function

--

Y el summon me sigue atacando Dx, aqui una foto [Tienes que estar registrado y conectado para ver este vínculo]

Belerofonte


Administrador
[Tienes que estar registrado y conectado para ver este vínculo] escribió:Da este error con el npc:l. me muesta la lista pero cuando digo el nombre del item, da este error

[31/5/2016 21:19:54] [Error - NpcScript Interface]
[31/5/2016 21:19:54] data/npc/scripts/Dntcoins.lua:onCreatureSay
[31/5/2016 21:19:54] Description:
[31/5/2016 21:19:54] data/npc/scripts/Dntcoins.lua:52: attempt to call global 'ExistItemByName' (a nil value)
[31/5/2016 21:19:54] stack traceback:
[31/5/2016 21:19:54] data/npc/scripts/Dntcoins.lua:52: in function 'callback'
[31/5/2016 21:19:54] data/npc/lib/npcsystem/npchandler.lua:424: in function 'onCreatureSay'
[31/5/2016 21:19:55] data/npc/scripts/Dntcoins.lua:8: in function
Éxito

Ok. Try again with:
Código:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
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

local Conf = {
    Money = 8839, -- Donator coin usado como dinero,
    Offert = {
        -- {Item = Objeto a comprar, Cost = Cantidad del objeto usado como dinero},
        {Item = 9019, Cost = 5},
        {Item = 9811, Cost = 3},
        {Item = 3967, Cost = 1},
        {Item = 11349, Cost = 2},
        {Item = 7730, Cost = 1},
        -- 41 objetos es el tope aproximado en: doPlayerPopupFYI
    },
}

local function titleCase(first, rest)
    return first:upper()..rest:lower()
end
local function getMoneyName(uid, cost)
    local name = {}
    if cost > 1 then
        name = getItemPluralNameById(uid)
     else
        name = getItemNameById(uid)
    end
    return cost .. " " .. string.gsub(name, "(%a)([%w_']*)", titleCase)
end
function ExistItemByName(name) -- by vodka
    local items = io.open("data/items/items.xml", "r"):read("*all")
    local get = items:match('name="' .. name ..'"')
    if get == nil or get == "" then
        return false
    end
    return true
end

npcHandler:setMessage(MESSAGE_GREET, "Greetings |PLAYERNAME|. I sell donator items, if you want see all with its prizes say me {list}.")
function creatureSayCallback(cid, type, msg)
    local Belero = ''
    local msg = msg:lower()
    if not npcHandler:isFocused(cid) then
        return false
    end
    if msgcontains(msg, 'list') then
        npcHandler:say("Take a look!", cid)
        table.sort(Conf.Offert, function(a, b) return getItemNameById(a.Item) < getItemNameById(b.Item) end)
        for i = 1, #Conf.Offert do
            Belero = Belero .. string.gsub(getItemNameById(Conf.Offert[i].Item), "(%a)([%w_']*)", titleCase) .. " x " .. getMoneyName(Conf.Money, Conf.Offert[i].Cost) .. ".\n"
        end
        doPlayerPopupFYI(cid, Belero)
    end
    if not ExistItemByName(msg) then
        return true
    end
    for _, var in ipairs(Conf.Offert) do
        if var.Item == getItemIdByName(msg) then
            if doPlayerRemoveItem(cid, Conf.Money, var.Cost) then
                doPlayerAddItem(cid, getItemIdByName(msg), 1)
                npcHandler:say("Deal done! " .. string.gsub(getArticle(msg), "(%a)([%w_']*)", titleCase) .. " {" .. string.gsub(getItemNameById(getItemIdByName(msg)), "(%a)([%w_']*)", titleCase) .."} in exchange of {" .. getMoneyName(Conf.Money, var.Cost) .. "}.", cid)
             else
                npcHandler:say(getPlayerItemCount(cid, Conf.Money) > 0 and "It seems you need {" .. getMoneyName(Conf.Money, var.Cost - getPlayerItemCount(cid, Conf.Money)) .."}." or "You haven't {" .. getMoneyName(Conf.Money, var.Cost) .. "}.", cid)
            end
            break
        end
    end
    return true
end

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



[Tienes que estar registrado y conectado para ver este vínculo] escribió:Y el summon me sigue atacando Dx, aqui una foto [Tienes que estar registrado y conectado para ver este vínculo]

Al documento.xml del monster que vayas a usar le agregas esto:
Código:
   <script>
        <event name="DontHitInvoked"/>
    </script>

Al final, justo antes de la última llave:
Código:
</monster>



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]

jukimanxxxxx


Novato
Ahora sí funcionan todos gracias

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 0 usuarios en línea: 0 Registrados, 0 Ocultos y 0 Invitado

Usuarios navegando en este foro: Ninguno

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 .