• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

[TFS 1.3] Gain storage by killing monsters

Marco Oliveira

Well-Known Member
Joined
Jan 5, 2019
Messages
76
Solutions
3
Reaction score
78
Location
Minas Gerais - Brazil
GitHub
omarcopires
Twitch
omarcopires
I made the following script in order to get the storages when killing certain monster, but nothing happens when they are killed and the console does not return any errors.

Lua:
local bossesNames = {
    ['black vixen'] = Storage.CurseSpreads.killBlackVixen,
    ['shadowpelt'] = Storage.CurseSpreads.killShadowPelt,
    ['sharpclaw'] = Storage.CurseSpreads.killSharpClaw,
    ['darkfang'] = Storage.CurseSpreads.killDarkFang,
    ['bloodback'] = Storage.CurseSpreads.killBloodBack
}

function onKill(creature, target)
    local targetMonster = target:getMonster()
    if not targetMonster then
        return true
    end

    local bossStorage = bossesNames[targetMonster:getName():lower()]
    if not bossStorage then
        return true
    end

    local player = creature:getPlayer()
    if player:getStorageValue(bossStorage) == -1 or player:getStorageValue(bossStorage) < 1 then
        player:setStorageValue(bossStorage, 1)
        player:say('You slayed ' .. targetMonster:getName() .. '.', TALKTYPE_MONSTER_SAY)
    end
    return true
end

I hope someone can help me, I will be very grateful.
 
Solution
data/scripts/PlayerMonsterHunter.lua
Lua:
-- Boss names(lowercase) and storage key values
local monsterList = {
    ['black vixen'] = Storage.CurseSpreads.killBlackVixen,
    ['shadowpelt'] = Storage.CurseSpreads.killShadowPelt,
    ['sharpclaw'] = Storage.CurseSpreads.killSharpClaw,
    ['darkfang'] = Storage.CurseSpreads.killDarkFang,
    ['bloodback'] = Storage.CurseSpreads.killBloodBack
}

-- Code to be executed when a player kills something. 
local event = CreatureEvent("MonsterHunter")
function event.onKill(creature, target)
    -- This script only cares about kills against configured creature names in above list
    local storage = monsterList[target:getName():lower()]
    if target:isPlayer() or target:getMaster()  or not storage...
Check this one 🤔, not tested so tell me your results:
Lua:
local bossesNames = {
    ['black vixen'] = Storage.CurseSpreads.killBlackVixen,
    ['shadowpelt'] = Storage.CurseSpreads.killShadowPelt,
    ['sharpclaw'] = Storage.CurseSpreads.killSharpClaw,
    ['darkfang'] = Storage.CurseSpreads.killDarkFang,
    ['bloodback'] = Storage.CurseSpreads.killBloodBack
}

function onKill(creature, target)
    if not target:isMonster() or not creature:isPlayer() then
        return true
    end

    local bossStorage = bossesNames[target:getName():lower()]
    if not bossStorage then
        return true
    end

    if creature:getStorageValue(bossStorage) == -1 or creature:getStorageValue(bossStorage) < 1 then
        creature:setStorageValue(bossStorage, 1)
        creature:say('You slayed ' .. target:getName() .. '.', TALKTYPE_MONSTER_SAY)
    end
    return true
end
Also do remember to register the Creature script to the player.
Also as a tip, for future debuggin add
Lua:
print('something')
in the script in all the ifs to check where your error is
 
data/scripts/PlayerMonsterHunter.lua
Lua:
-- Boss names(lowercase) and storage key values
local monsterList = {
    ['black vixen'] = Storage.CurseSpreads.killBlackVixen,
    ['shadowpelt'] = Storage.CurseSpreads.killShadowPelt,
    ['sharpclaw'] = Storage.CurseSpreads.killSharpClaw,
    ['darkfang'] = Storage.CurseSpreads.killDarkFang,
    ['bloodback'] = Storage.CurseSpreads.killBloodBack
}

-- Code to be executed when a player kills something. 
local event = CreatureEvent("MonsterHunter")
function event.onKill(creature, target)
    -- This script only cares about kills against configured creature names in above list
    local storage = monsterList[target:getName():lower()]
    if target:isPlayer() or target:getMaster()  or not storage then
        return false
    end

    -- Increase killcount, and make player say it
    local kills = creature:getStorageValue(storage)
    if kills < 1 then
        kills = 1
        creature:say('You slayed ' .. target:getName() .. '.', TALKTYPE_MONSTER_SAY)
    else
        kills = kills + 1
        creature:say('You have slayed ' .. target:getName() .. ' '.. kills ..' times!', TALKTYPE_MONSTER_SAY)
    end

    -- Store killcount for further reference
    creature:setStorageValue(storage, kills)
    return true
end
event:register()

-- Register above MonsterHunter creature events to players when they login
local login = CreatureEvent("RegisterMonsterHunter")
function login.onLogin(player)
    player:registerEvent("MonsterHunter")
    return true
end
login:register()

Restart server after installation to make sure the script gets loaded.
 
Last edited:
Solution
data/scripts/PlayerMonsterHunter.lua
Lua:
-- Boss names(lowercase) and storage key values
local monsterList = {
    ['black vixen'] = Storage.CurseSpreads.killBlackVixen,
    ['shadowpelt'] = Storage.CurseSpreads.killShadowPelt,
    ['sharpclaw'] = Storage.CurseSpreads.killSharpClaw,
    ['darkfang'] = Storage.CurseSpreads.killDarkFang,
    ['bloodback'] = Storage.CurseSpreads.killBloodBack
}

-- Code to be executed when a player kills something.
local event = CreatureEvent("MonsterHunter")
function event.onKill(creature, target)
    -- This script only cares about kills against configured creature names in above list
    local storage = monsterList[target:getName():lower()]
    if target:isPlayer() or target:getMaster()  or not storage then
        return false
    end

    -- Increase killcount, and make player say it
    local kills = creature:getStorageValue(storage)
    if kills < 1 then
        kills = 1
        creature:say('You slayed ' .. target:getName() .. '.', TALKTYPE_MONSTER_SAY)
    else
        kills = kills + 1
        creature:say('You have slayed ' .. target:getName() .. ' '.. kills ..' times!', TALKTYPE_MONSTER_SAY)
    end

    -- Store killcount for further reference
    creature:setStorageValue(storage, kills)
    return true
end
event:register()

-- Register above MonsterHunter creature events to players when they login
local login = CreatureEvent("RegisterMonsterHunter")
function login.onLogin(player)
    player:registerEvent("MonsterHunter")
    return true
end
login:register()

Restart server after installation to make sure the script gets loaded.


If they kill him as a team, will he give everyone the storage?
 
Back
Top