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

Lua Intentialy reset level on death

fishie

fishies-war
Joined
Oct 27, 2016
Messages
78
Reaction score
2
Hello, ive been trying to get this to work for a while with no success. Ive created a custom war server and i need it so when a player dies his level resets back to basic (level 100) but nothing ive tried has worked.

I had a script created for me by xeraphus but sadly this only worked under basic conditions and eventurely didnt work at all.

local function getExperienceForLevel(lv)
lv = lv - 1
return ((50 * lv * lv * lv) - (150 * lv * lv) + (400 * lv)) / 3
end

deathStorage = 'EXPERIENCE'

function onPrepareDeath(creature, killer)
local player = creature:getPlayer()
if not player then
return true
end
player:setStorageValue(deathStorage, getExperienceForLevel(100) - player:getExperience())
return true
end

Also this i added to login.lua

function onLogin(player)
local exp = player:getStorageValue(deathStorage)
if exp ~= 0 then
if exp < 0 then
player:removeExperience(exp)
else
player:addExperience(exp)
end
player:setStorageValue(deathStorage, 0)
player:sendTextMessage(MESSAGE_INFO_DESCR, 'Your level has been reset.')
end
Can anyone make a new way of reseting a players level on death? Im using TFS 1.2

Thankyou. Anymore details ive missed please ask
 
Last edited:
Solution
Done it twice because I wasn't sure what you meant. First one I copied it into the script and it didn't work with no errors at all, second one which gave the error was because I made two scripts. :/
my bad i misspelled
Code:
function onPrepareDeath(creature, killer)
    local player = creature:getPlayer()
    if not player then
        return true
    end
    player:setStorageValue('death', 1)
    return true
end

Code:
local function getExpForLevel(lv)
    lv = lv - 1
    return ((50 * lv * lv * lv) - (150 * lv * lv) + (400 * lv)) / 3
end

function onLogin(player)
    local resetExperience = getExpForLevel(100)
    local currentExperience = player:getExperience()
    if player:getStorageValue('death') == 1 then
        if...
Is the level supposed to reset when you relog as well? then you only need an onLogin script
 
Id prefer if it didnt, prefer just on death.

Still not found a solultion and this is stopping me putting my server into beta testing
 
I haven't made any scripts for 1.2 before but if I'm not mistaken this should work
Code:
function onPrepareDeath(creature, killer)
    local player = creature:getPlayer()
    if not player then
        return true
    end
    --remove players current exp minus the exp needed for level 100
    player:removeExperience(player:getExperience() - getExpForLevel(100))
    return true
end
 
Last edited:
Just add that as a creature script?

added it as a creature script and it dosnt seem to work players levels dont reset on death
 
Last edited:
Added to login.lua
local events = {'PlayerDeath', 'DropLoot', 'PK Storage', 'resetlevel', ~~~

Added the creaturescripts.xml
<event type="death" name="resetlevel" script="resetlevel.lua" />

Still dosnt work. No errors in console either
 
Added to login.lua
local events = {'PlayerDeath', 'DropLoot', 'PK Storage', 'resetlevel', ~~~

Added the creaturescripts.xml
<event type="death" name="resetlevel" script="resetlevel.lua" />

Still dosnt work. No errors in console either
its type="preparedeath"
 
it turns out getExpForLevel() is a custom function
credits to @Xeraphus for pointing it out

Code:
local function getExpForLevel(level)
    level = level - 1
    return ((50 * level * level * level) - (150 * level * level) + (400 * level)) / 3
end

function onPrepareDeath(creature, killer)
   local player = creature:getPlayer()
    if not player then
        return true
    end
    --remove players current exp minus the exp needed for level 100
    player:removeExperience(player:getExperience() - getExpForLevel(100))
    return true
end
 
Fixed the type, now getting the error

Dec 13 19:31:07 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:7: attempt to call global 'getExpForLevel' (a nil value)
Dec 13 19:31:07 158-69-12-209 tfs[17603]: stack traceback:
Dec 13 19:31:07 158-69-12-209 tfs[17603]: [C]: in function 'getExpForLevel'
Dec 13 19:31:07 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:7: in function <data/creaturescripts/scripts/resetlevel.lua:1>
Dec 13 19:31:08 158-69-12-209 tfs[17603]: Lua Script Error: [CreatureScript Interface]
Dec 13 19:31:08 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:eek:nPrepareDeath
Dec 13 19:31:08 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:7: attempt to call global 'getExpForLevel' (a nil value)
Dec 13 19:31:08 158-69-12-209 tfs[17603]: stack traceback:
Dec 13 19:31:08 158-69-12-209 tfs[17603]: [C]: in function 'getExpForLevel'
Dec 13 19:31:08 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:7: in function <data/creaturescripts/scripts/resetlevel.lua:1>

and players are unable to die.
 
Fixed the type, now getting the error

Dec 13 19:31:07 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:7: attempt to call global 'getExpForLevel' (a nil value)
Dec 13 19:31:07 158-69-12-209 tfs[17603]: stack traceback:
Dec 13 19:31:07 158-69-12-209 tfs[17603]: [C]: in function 'getExpForLevel'
Dec 13 19:31:07 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:7: in function <data/creaturescripts/scripts/resetlevel.lua:1>
Dec 13 19:31:08 158-69-12-209 tfs[17603]: Lua Script Error: [CreatureScript Interface]
Dec 13 19:31:08 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:eek:nPrepareDeath
Dec 13 19:31:08 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:7: attempt to call global 'getExpForLevel' (a nil value)
Dec 13 19:31:08 158-69-12-209 tfs[17603]: stack traceback:
Dec 13 19:31:08 158-69-12-209 tfs[17603]: [C]: in function 'getExpForLevel'
Dec 13 19:31:08 158-69-12-209 tfs[17603]: data/creaturescripts/scripts/resetlevel.lua:7: in function <data/creaturescripts/scripts/resetlevel.lua:1>

and players are unable to die.
did you not fix the script after what he just posted
it has the function in it
 
it turns out getExpForLevel() is a custom function
credits to @Xeraphus for pointing it out

Code:
local function getExpForLevel(level)
    level = level - 1
    return ((50 * level * level * level) - (150 * level * level) + (400 * level)) / 3
end

function onPrepareDeath(creature, killer)
   local player = creature:getPlayer()
    if not player then
        return true
    end
    --remove players current exp minus the exp needed for level 100
    player:removeExperience(player:getExperience() - getExpForLevel(100))
    return true
end

Added this and i get the same situations as when @Xeraphus created the origional script. The player dies, at level 159 for example and before he dies he is downgraded to level 100. When he logs back in he is level 98. Its progress tho.
 
Believe i have fixed it, ive changed the

player:removeExperience(player:getExperience() - getExpForLevel(100))

too

player:removeExperience(player:getExperience() - getExpForLevel(102))

When players die they are downgraded to level 102 but log back in at 100. Seems to work tho im still testing different situations.
 
Added this and i get the same situations as when @Xeraphus created the origional script. The player dies, at level 159 for example and before he dies he is downgraded to level 100. When he logs back in he is level 98. Its progress tho.
preparedeath script:
Code:
function onPrepareDeath(creature, killer)
    local player = creature:getPlayer()
    if not player then
        return true
    end
    player:setStorageValue('death', 1)
    return true
end

login script:
Code:
local function getExperienceForLevel(lv)
    lv = lv - 1
    return ((50 * lv * lv * lv) - (150 * lv * lv) + (400 * lv)) / 3
end


function onLogin(player)
    local resetExperience = getExpForLevel(100)
    local currentExperience = player:getExperience()
    if player:getStorageValue('death') == 1 then
        if player:getLevel() > 100 then
            player:removeExperience(currentExperience - resetExperience)
        elseif player:getLevel() < 100 then
            player:addExperience(resetExperience - currentExperience)
        end
        player:setStorageValue('death', -1)
    end
    return true
end

try this
it should add experience to level 100 if player is below 100 on login, if they are over 100 it will remove experience for level 100
 
Well the reason is I'm guessing the script is setting the level on death and then the death% is also getting taken off after death. Im going to try the other way posted above later when I'm back home but currently I'm happy it's working as intended as the player isn't really aware he's been downgraded twice.

Thankyou for your help guys
 
Ok dosnt work as perfectly as i had first thought, when a player is killed he is downgraded to level 100 but he isnt dead, he survives and has to be killed again before its registered as a death.

Basicly, if i walk on fire at level 120 till death i dont die i just get downgraded to level 100.

Seems like players can only die when they are level 100, any other level they are just downgraded to level 100 again
 
Last edited:
Ok dosnt work as perfectly as i had first thought, when a player is killed he is downgraded to level 100 but he isnt dead, he survives and has to be killed again before its registered as a death.

Basicly, if i walk on fire at level 120 till death i dont die i just get downgraded to level 100.

Seems like players can only die when they are level 100, any other level they are just downgraded to level 100 again
did you ever test my script
it gives the player a storage value onPrepareDeath which is used onLogin to make sure that they died, (the natural experience loss will have already taken place), after that it will remove experience from the player if he/she is over level 100, if he/she is under 100 exp will be added to make them 100 just in case they get under 100 somehow
 
Back
Top