Ir para conteúdo
  • 0

[Pedido] Ganhar Item quem Bater no Monstro


Farathor

Pergunta

Então, o script funciona assim, todos os jogadores que ajudarem a matar o monstro, ganham tal item. Mas para ganhar o item, você vai precisar ajudar o monstro, ou seja, teria que tirar no minimo 7k de life do bixo.

Outra coisa, todos que matarem o bixo, também recebem uma medalha, escrito:

You see a medal of honour.
Medalha de honra ganha por ..... por ajudar a derrotar o Monstro Doidao no dia ......

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

data/creaturescripts/scripts

local config = {
    name = "monster_name",           --Nome do monstro.
    minDamage = 7000,                --Dano mínimo para receber as recompensas.
    items = {
        prize = {itemid, count},     --{ID do item, quantidade}
        medal = xxx,                 --ID da medalha.
    },
    storage = 91828,
}
 
function onStatsChange(cid, attacker, type, combat, value)
    if isPlayer(attacker) and isMonster(cid) and getCreatureName(cid) == config.name and type == STATSCHANGE_HEALTHLOSS then
        local damage = getPlayerStorageValue(attacker, config.storage) < 1 and 0 or getPlayerStorageValue(attacker, config.storage)
        setPlayerStorageValue(attacker, config.storage, damage + value)
    end
    return true
end
 
function onDeath(cid, corpse, deathList)
    for _, pid in pairs(deathList) do
        local damage = getPlayerStorageValue(pid, config.storage)
        if damage >= config.minDamage then
            doPlayerSendTextMessage(pid, 27, "For helping killing "..config.name..", you received a medal and "..config.items.prize[2].."x "..getItemNameById(config.items.prize[1])..".")
            doPlayerAddItem(pid, config.items.prize[1], config.items.prize[2])
            doItemSetAttribute(doPlayerAddItem(pid, config.items.medal, 1), "description", "Medalha de honra ganha por "..getCreatureName(pid).." por ajudar a derrotar o "..config.name.." no dia "..os.date("%D")..".")
            setPlayerStorageValue(pid, config.storage, -1)
        end
    end
    db.executeQuery("UPDATE player_storage SET value = -1 WHERE key = "..config.storage)
    return true
end
Tags:
<event type="statschange" name="mDamage" event="script" value="nome_do_arquivo.lua"/>
<event type="death" name="mItems" event="script" value="nome_do_arquivo.lua"/>
Em login.lua:
registerCreatureEvent(cid, "mDamage")
No arquivo .xml do monstro:
<script>
    <event name="mItems"/>
</script>
Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0

@zipter98 Aproveitando esse tópico.. teria como adaptar para que a pessoa recebesse um premio variavel e de acordo com dano minimo atingido?

 

ex até 1000 de dano receber um item random entre xxx xxx xxx e xxx

entre 1000 e 2000 receber um item random entre xxx xxx xxx e xxx

[...] configurável para mais damos e items..

Link para o comentário
Compartilhar em outros sites

  • 0


local config = {

name = "monster_name", --Nome do monstro.

medal = xxx, --ID da medalha.

damagePrizes = {

--[{minDamage, maxDamage}] = {{itemid, count}, {itemid, count}, {itemid, count}, ...},

[{1, 1000}] = {{9281, 1}, {2160, 50}},

[{1001, 2000}] = {{9281, 1}, {2160, 50}, {2191, 100}, {9282, 1}},

},

storage = 91828,

}

 

function onStatsChange(cid, attacker, type, combat, value)

if isPlayer(attacker) and isMonster(cid) and getCreatureName(cid) == config.name and type == STATSCHANGE_HEALTHLOSS then

local damage = getPlayerStorageValue(attacker, config.storage) < 1 and 0 or getPlayerStorageValue(attacker, config.storage)

setPlayerStorageValue(attacker, config.storage, damage + value)

end

return true

end

 

function onDeath(cid, corpse, deathList)

for _, pid in pairs(deathList) do

local damage, prizes = getPlayerStorageValue(pid, config.storage), {}

for dmg, items in pairs(config.damagePrizes) do

if damage >= dmg[1] and damage <= dmg[2] then

prizes = items

break

end

end

if #prizes > 0 then

local prize = prizes[math.random(#prizes)]

doPlayerSendTextMessage(pid, 27, "For helping killing "..config.name..", you received a medal and "..prize[2].."x "..getItemNameById(prize[1])..".")

doPlayerAddItem(pid, prize[1], prize[2])

doItemSetAttribute(doPlayerAddItem(pid, config.medal, 1), "description", "Medalha de honra ganha por "..getCreatureName(pid).." por ajudar a derrotar o "..config.name.." no dia "..os.date("%D")..".")

setPlayerStorageValue(pid, config.storage, -1)

end

end

db.executeQuery("UPDATE player_storage SET value = -1 WHERE key = "..config.storage)

return true

end

 

Link para o comentário
Compartilhar em outros sites

  • 0
[...]

 

Testando agora, logo ao rodar o console recebo a msg, lembrando, meu tfs é 1.2

[Error - CreatureEvent::configureEvent] Invalid type for creature event: mDamage
[Warning - BaseEvents::loadFromXml] Failed to configure event
Editado por DeCarvalho
Link para o comentário
Compartilhar em outros sites

  • 0

Testando agora, logo ao rodar o console recebo a msg, lembrando, meu tfs é 1.2

[Error - CreatureEvent::configureEvent] Invalid type for creature event: mDamage
[Warning - BaseEvents::loadFromXml] Failed to configure event

 

Tenta assim:

local config = {
    name = "monster_name",           --Nome do monstro.
    medal = xxx,                     --ID da medalha.
    damagePrizes = {
        --[{minDamage, maxDamage}] = {{itemid, count}, {itemid, count}, {itemid, count}, ...},
        [{1, 1000}] = {{9281, 1}, {2160, 50}},
        [{1001, 2000}] = {{9281, 1}, {2160, 50}, {2191, 100}, {9282, 1}},
    },
    storage = 91828
}
 
function onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin)
	if attacker:isPlayer() and creature:isMonster() and creature:getName() == config.name and isInArray({ORIGIN_MELEE, ORIGIN_RANGED, ORIGIN_SPELL}, origin) and primaryType ~= COMBAT_HEALING then
		local damage = attacker:getStorageValue(config.storage) < 1 and 0 or attacker:getStorageValue(config.storage)
		attacker:setStorageValue(config.storage, damage + primaryDamage)
	end
	return primaryDamage, primaryType, secondaryDamage, secondaryType
end
 
function onDeath(cid, corpse, deathList)
    for _, pid in pairs(deathList) do
        local player = Player(pid)
        local damage, prizes = player:getStorageValue(config.storage), {}
        for dmg, items in pairs(config.damagePrizes) do
            if damage >= dmg[1] and damage <= dmg[2] then
                prizes = items
                break
            end
        end
        if #prizes > 0 then
            local prize = prizes[math.random(#prizes)]
            local item = Item(prize[1])
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Por ajudar matar o "..config.name..", voce recebeu uma medalha e " .. prize[2] .. "x " .. item:getName() .. ".")
            player:addItem(item, prize[2])
            local medalha = Item(config.medal)
            medalha:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, "Medalha de honra ganhada por " .. player:getName() .. " por ajudar a derrotar o " .. config.name .. " no dia " .. os.date("%D").. ".")
            player:addItem(medalha, 1)
            player:setStorageValue(config.storage, -1)
        end
    end
    db.query("UPDATE player_storage SET value = -1 WHERE key = "..config.storage)
    return true
end
Link para o comentário
Compartilhar em outros sites

  • 0

 

Tenta assim:

[...]

 

Obrigado, Erro anterior resolvido (só não dei like ainda pq to sem no momento).

 

Agora estou com o seguinte erro quando mato o monstro

Lua Script Error: [CreatureScript Interface]
data/creaturescripts/scripts/damageprizenb.lua:onDeath
data/creaturescripts/scripts/damageprizenb.lua:24: bad argument #1 to 'pairs' (table expected, got u
serdata)
stack traceback:
        [C]: at 0x013f5a0a90
        [C]: in function 'pairs'
        data/creaturescripts/scripts/damageprizenb.lua:24: in function <data/creaturescripts/scripts/damageprizenb.lua:23>

Segue a função

function onDeath(cid, corpse, deathList)
    for _, pid in pairs(deathList) do
        local player = Player(pid)
        local damage, prizes = player:getStorageValue(config.storage), {}
        for dmg, items in pairs(config.damagePrizes) do
            if damage >= dmg[1] and damage <= dmg[2] then
                prizes = items
                break
            end
        end
        if #prizes > 0 then
            local prize = prizes[math.random(#prizes)]
            local item = Item(prize[1])
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Por ajudar matar o "..config.name..", voce recebeu uma medalha e " .. prize[2] .. "x " .. item:getName() .. ".")
            player:addItem(item, prize[2])
            local medalha = Item(config.medal)
            medalha:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, "Medalha de honra ganhada por " .. player:getName() .. " por ajudar a derrotar o " .. config.name .. " no dia " .. os.date("%D").. ".")
            player:addItem(medalha, 1)
            player:setStorageValue(config.storage, -1)
        end
    end
    db.query("UPDATE player_storage SET value = -1 WHERE key = "..config.storage)
    return true
end
Editado por DeCarvalho
Link para o comentário
Compartilhar em outros sites

  • 0

Você não copiou metade do código.

 

estou usando código do bruno todo.. copiei só a funcção que estava apresentando o erro :p achei que só essa aprte servia, enfim

local config = {
    name = "Lost Earth Elemental",           --Nome do monstro.
    medal = xxx,                     --ID da medalha.
    damagePrizes = {
        --[{minDamage, maxDamage}] = {{itemid, count}, {itemid, count}, {itemid, count}, ...},
        [{1, 150}] = {{2152, 1}, {2152, 3}, {7620, 5}, {7618, 5}},
        [{151, 250}] = {{7620, 10}, {7618, 15}, {2152, 5}, {2152, 7}},
        [{251, 400}] = {{{2152, 10}}, {{2152, 15}}, {7620, 15}, {7618, 20}},
        [{401, 600}] = {{8301, 1}, {2160, 1}, {2152, 30}, {3940, 1}, {2152, 20}, {2152, 35}, {2530, 1}},
        [{601, 850}] = {{8300, 1}, {8301, 50}, {8298, 100}, {2160, 1}, {2152, 50}, {8298, 1}, {3940, 1}, {2152, 30}, {2152, 60}},
    },
    storage = 91828,
}
 
function onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin)
	if attacker:isPlayer() and creature:isMonster() and creature:getName() == config.name and isInArray({ORIGIN_MELEE, ORIGIN_RANGED, ORIGIN_SPELL}, origin) and primaryType ~= COMBAT_HEALING then
		local damage = attacker:getStorageValue(config.storage) < 1 and 0 or attacker:getStorageValue(config.storage)
		attacker:setStorageValue(config.storage, damage + primaryDamage)
	end
	return primaryDamage, primaryType, secondaryDamage, secondaryType
end
 
function onDeath(cid, corpse, deathList)
    for _, pid in pairs(deathList) do
        local player = Player(pid)
        local damage, prizes = player:getStorageValue(config.storage), {}
        for dmg, items in pairs(config.damagePrizes) do
            if damage >= dmg[1] and damage <= dmg[2] then
                prizes = items
                break
            end
        end
        if #prizes > 0 then
            local prize = prizes[math.random(#prizes)]
            local item = Item(prize[1])
            player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Por ajudar matar o "..config.name..", voce recebeu " .. prize[2] .. "x " .. item:getName() .. ".")
            player:addItem(item, prize[2])
--            local medalha = Item(config.medal)
--            medalha:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, "Medalha de honra ganhada por " .. player:getName() .. " por ajudar a derrotar o " .. config.name .. " no dia " .. os.date("%D").. ".")
--            player:addItem(medalha, 1)
            player:setStorageValue(config.storage, -1)
        end
    end
    db.query("UPDATE player_storage SET value = -1 WHERE key = "..config.storage)
    return true
end
Editado por DeCarvalho
Link para o comentário
Compartilhar em outros sites

  • 0

function onDeath(cid, corpse, deathList)

 

Essa função não é escrita assim no tfs 1.x

Vou tentar implementá-la, depois eu posto aqui.

Link para o comentário
Compartilhar em outros sites

  • 0

Passando para saber se há alguma novidade.. tentei procurar para ver se eu conseguiria resolver... mas não achei relação.

 

Grato

Vou ter que fazer e testar na minha maquina, agora estou no trabalho, sem condições confused.gif

Link para o comentário
Compartilhar em outros sites

  • 0


local config = {

name = "monster_name", --Nome do monstro.

minDamage = 7000, --Dano mínimo para receber as recompensas.

items = {

prize = {itemid, count}, --{ID do item, quantidade}

medal = xxx, --ID da medalha.

},

storage = 91828,

}

 

function onStatsChange(cid, attacker, type, combat, value)

if isPlayer(attacker) and isMonster(cid) and getCreatureName(cid) == config.name and type == STATSCHANGE_HEALTHLOSS then

local damage = getPlayerStorageValue(attacker, config.storage) < 1 and 0 or getPlayerStorageValue(attacker, config.storage)

setPlayerStorageValue(attacker, config.storage, damage + value)

end

return true

end

 

function onDeath(cid, corpse, deathList)

for _, pid in pairs(deathList) do

local damage = getPlayerStorageValue(pid, config.storage)

if damage >= config.minDamage then

local item = doCreateItemEx(config.items.prize[1], config.items.prize[2])

doPlayerSendTextMessage(pid, 27, "For helping killing "..config.name..", you received a medal and "..config.items.prize[2].."x "..getItemNameById(config.items.prize[1])..".")

doPlayerSendMailByName(getCreatureName(pid), item)

doItemSetAttribute(doPlayerAddItem(pid, config.items.medal, 1), "description", "Medalha de honra ganha por "..getCreatureName(pid).." por ajudar a derrotar o "..config.name.." no dia "..os.date("%D")..".")

setPlayerStorageValue(pid, config.storage, -1)

end

end

db.executeQuery("UPDATE player_storage SET value = -1 WHERE key = "..config.storage)

return true

end

 

Editado por zipter98
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...