hellboy
Intermediate OT User
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
add inside data/lib/lib.lua
create data/creaturescripts/scripts/hunger.lua
add in data/creaturescripts/creaturescripts.xml
create in data/talkactions/scripts/hunger.lua
add in data/talkactions/talkactions.xml
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" />