• 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!

CreatureEvent [TFS 1.2] Hunger system

hellboy

Intermediate OT User
Joined
Apr 6, 2008
Messages
544
Solutions
6
Reaction score
121
Location
player:getTown()
I rewrote my old hunger system from TFS 0.3.6 to TFS 1.2.
Old version for 0.3.6 (with aggresive dmg) https://otland.net/threads/hunger-system-tfs-mod-or-manual.60952/#post-657446

CHANGES
- added ignored players list
- rewrite to metatable (I know it's still could be better...)
- merged onThink function damaging player with function sending information about change "hunger status"
- fixed hunger dmg, now when you get dmg from hunger you can logout

HOW IT WORK?
- every x seconds (default it's set to 5) script check player feed lvl, and if it's in another "feed stage", then send message about new "feed stage" and if feed lvl is equel 0, then damage player (default by 1)
- new player on first login get free feed
- after death on login if feed lvl was lower than new player free feed, then set feed lvl to same value as used by new player

in data/lib/hunger.lua
Code:
-- Hunger System by Kronos
-- version="1.2"
-- author Hellboy aka Kronos (idea Nandonalt)
-- https://otland.net/threads/hunger-system-tfs-mod-or-manual.60952/#post-631368

-- CONFIG

hungerConfig = {
   FIRST_LOGIN = -1,

   storageStage = 3636,
   storageOnDeathFeed = 3637,
   storageDmgAndCheckTicks = 3638,

   dmgAmount = 1,
   dmgAndCheckTicks = 5,
   newPlayerFeed = 30,

   ignore = {
     "Account Manager"
   },

   stages = {
     [1] = {minFeed = 15, msg = "You will die if you don't eat something."},
     [2] = {minFeed = 90, msg = "You are very hungry."},
     [3] = {minFeed = 200, msg = "You are hungry."},
     [4] = {minFeed = 395, msg = "You can eat something."},
     [5] = {minFeed = 400, msg = "You are full."}
   }
}

-- /CONFIG


function Player.hungerIgnorePlayer(self)
   return isInArray(hungerConfig.ignore, self:getName())
end

function Player.hungerGetFeed(self)
   local feedCondition = self:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT)
   if feedCondition then
     return math.floor(feedCondition:getTicks() / 1000)
   end
   return 0
end

function Player.hungerGetFeedStorage(self)
   return self:getStorageValue(hungerConfig.storageOnDeathFeed)
end

function Player.hungerSetFeedStorage(self, value)
   self:setStorageValue(hungerConfig.storageOnDeathFeed, value)
end

function Player.hungerGetStage(self)
   return self:getStorageValue(hungerConfig.storageStage)
end

function Player.hungerSetStage(self)
   local feed = self:hungerGetFeed()
   local tmpStage = 0
   for stageNumber, stageInfo in ipairs(hungerConfig.stages) do
     tmpStage = stageNumber
     if stageInfo.minFeed >= feed then
       break
     end
   end
   self:setStorageValue(hungerConfig.storageStage, tmpStage)
end

function Player.hungerGetStageMsg(self)
   local stageId = self:getStorageValue(hungerConfig.storageStage)
   return hungerConfig.stages[stageId].msg
end

function Player.hungerDoDmg(self)
   self:addHealth(-hungerConfig.dmgAmount)
   return true
end

add inside data/lib/lib.lua
Code:
dofile('data/lib/hunger.lua')

create data/creaturescripts/scripts/hunger.lua
Code:
function onLogin(player)
   if player:hungerIgnorePlayer() then
     return true
   end

   local value = player:hungerGetFeedStorage()
   if value > 0 then
     player:feed(value)
   elseif value == hungerConfig.FIRST_LOGIN then
     player:feed(hungerConfig.newPlayerFeed)
   end

   player:hungerSetFeedStorage(0)
   player:setStorageValue(hungerConfig.storageDmgAndCheckTicks, 0)

   player:registerEvent("HungerDeath")
   player:registerEvent("Hunger")

   player:hungerSetStage()
   local msg = player:hungerGetStageMsg()
   player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, msg)
   return true
end

function onThink(player, interval)

   local counter = (player:getStorageValue(hungerConfig.storageDmgAndCheckTicks) +1) % hungerConfig.dmgAndCheckTicks
   if counter == 0 then
     -- status changed ? send msg : do nothing
     local stage = player:hungerGetStage()
     player:hungerSetStage()
     local newStage = player:hungerGetStage()

     if stage ~= newStage then
       local msg = player:hungerGetStageMsg()
       player:sendTextMessage(MESSAGE_STATUS_DEFAULT, msg)
     end

     if player:hungerGetFeed() == 0 then
       player:hungerDoDmg()
     end
   end

   player:setStorageValue(hungerConfig.storageDmgAndCheckTicks, counter)
   return true
end

function onDeath(player, corpse, killer, mostDamageKiller, unjustified, mostDamageUnjustified)
   local feedLvl = player:hungerGetFeed()
   if feedLvl < hungerConfig.newPlayerFeed then
     player:hungerSetFeedStorage(hungerConfig.newPlayerFeed)
   else
     player:hungerSetFeedStorage(feedLvl)
   end
   return true
end

add in data/creaturescripts/creaturescripts.xml
Code:
<event type="login" name="HungerLogin" script="hunger.lua" />
<event type="death" name="HungerDeath" script="hunger.lua" />
<event type="think" name="Hunger" script="hunger.lua" />

create in data/talkactions/scripts/hunger.lua
Code:
function onSay(player, words, param)
   local msg = player:hungerGetStageMsg()
   player:sendTextMessage(MESSAGE_STATUS_DEFAULT, msg)
   return true
end

add in data/talkactions/talkactions.xml
Code:
<talkaction words="/hunger" script="hunger.lua" />
 
As Enanthenone said, it works great!

got one question tho, Is it possible to do this with thirst aswell? like it decays mana if you dont drink anything..
 
As Enanthenone said, it works great!

got one question tho, Is it possible to do this with thirst aswell? like it decays mana if you dont drink anything..

It's possible. Use few storage id and edit fluids and potions lua scripts.
 
how make to player not receive damage in pz?
something like

Lua:
if not Tile(player:getPosition()):hasFlag(TILESTATE_PROTECTIONZONE) then
        if player:hungerGetFeed() == 0 then
            player:hungerDoDmg()
        end
    end
 
Back
Top