138 lines
3.3 KiB
Lua
138 lines
3.3 KiB
Lua
|
GM.VaultFolder = "zombiesurvival_vault"
|
||
|
GM.SkillTreeVersion = 1
|
||
|
|
||
|
function GM:ShouldSaveVault(pl)
|
||
|
-- Always push accumulated points in to the vault if we have any.
|
||
|
if pl:IsBot() then return false end
|
||
|
|
||
|
if self.PointSaving > 0 and pl.PointsVault ~= nil then
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
if pl:GetZSXP() > 0 or pl:GetZSSPUsed() > 0 or pl:GetZSRemortLevel() > 0 then
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function GM:ShouldLoadVault(pl)
|
||
|
return not pl:IsBot()
|
||
|
end
|
||
|
|
||
|
--[[function GM:ShouldUseVault(pl)
|
||
|
return not self.ZombieEscape and not self:IsClassicMode()
|
||
|
end]]
|
||
|
|
||
|
function GM:GetVaultFile(pl)
|
||
|
local steamid = pl:SteamID64() or "invalid"
|
||
|
|
||
|
return self.VaultFolder.."/"..steamid:sub(-2).."/"..steamid..".txt"
|
||
|
end
|
||
|
|
||
|
function GM:SaveAllVaults()
|
||
|
for _, pl in pairs(player.GetAll()) do
|
||
|
self:SaveVault(pl)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function GM:InitializeVault(pl)
|
||
|
pl.PointsVault = 0
|
||
|
pl:SetZSXP(0)
|
||
|
end
|
||
|
|
||
|
function GM:LoadVault(pl)
|
||
|
if not self:ShouldLoadVault(pl) then return end
|
||
|
|
||
|
local filename = self:GetVaultFile(pl)
|
||
|
if file.Exists(filename, "DATA") then
|
||
|
local contents = file.Read(filename, "DATA")
|
||
|
if contents and #contents > 0 then
|
||
|
contents = Deserialize(contents)
|
||
|
if contents then
|
||
|
pl.PointsVault = contents.Points
|
||
|
|
||
|
if contents.RemortLevel then
|
||
|
pl:SetZSRemortLevel(contents.RemortLevel)
|
||
|
end
|
||
|
if contents.XP then
|
||
|
pl:SetZSXP(contents.XP)
|
||
|
end
|
||
|
if contents.UnlockedSkills then
|
||
|
pl:SetUnlockedSkills(util.DecompressBitTable(contents.UnlockedSkills), true)
|
||
|
end
|
||
|
if contents.DesiredActiveSkills then
|
||
|
pl:SetDesiredActiveSkills(util.DecompressBitTable(contents.DesiredActiveSkills), true)
|
||
|
end
|
||
|
if contents.NextSkillReset then
|
||
|
pl.NextSkillReset = contents.NextSkillReset
|
||
|
end
|
||
|
if not contents.Version or contents.Version < self.SkillTreeVersion then
|
||
|
pl:SkillsReset()
|
||
|
pl.SkillsRefunded = true
|
||
|
end
|
||
|
|
||
|
pl.SkillVersion = self.SkillTreeVersion
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
pl.PointsVault = pl.PointsVault or 0
|
||
|
end
|
||
|
|
||
|
function GM:PlayerReadyVault(pl)
|
||
|
local unlocked = pl:GetUnlockedSkills()
|
||
|
local desired = pl:GetDesiredActiveSkills()
|
||
|
local active = pl:GetActiveSkills()
|
||
|
|
||
|
net.Start("zs_skills_init")
|
||
|
self:WriteSkillBits(unlocked)
|
||
|
self:WriteSkillBits(desired)
|
||
|
|
||
|
-- Send this if any key exists.
|
||
|
for k in pairs(active) do
|
||
|
net.WriteBool(true)
|
||
|
self:WriteSkillBits(active)
|
||
|
net.Send(pl)
|
||
|
|
||
|
return
|
||
|
end
|
||
|
|
||
|
net.WriteBool(false)
|
||
|
net.Send(pl)
|
||
|
|
||
|
if pl.NextSkillReset then
|
||
|
local time = os.time()
|
||
|
if time < pl.NextSkillReset then
|
||
|
net.Start("zs_skills_nextreset")
|
||
|
net.WriteUInt(pl.NextSkillReset - time, 32)
|
||
|
net.Send(pl)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function GM:SaveVault(pl)
|
||
|
if not self:ShouldSaveVault(pl) then return end
|
||
|
|
||
|
local tosave = {
|
||
|
Points = math.floor(pl.PointsVault),
|
||
|
XP = pl:GetZSXP(),
|
||
|
RemortLevel = pl:GetZSRemortLevel(),
|
||
|
DesiredActiveSkills = util.CompressBitTable(pl:GetDesiredActiveSkills()),
|
||
|
UnlockedSkills = util.CompressBitTable(pl:GetUnlockedSkills()),
|
||
|
Version = pl.SkillVersion or self.SkillTreeVersion
|
||
|
}
|
||
|
|
||
|
if pl.NextSkillReset and os.time() < pl.NextSkillReset then
|
||
|
tosave.NextSkillReset = pl.NextSkillReset
|
||
|
end
|
||
|
|
||
|
if tosave.Points and self.PointSavingLimit > 0 and tosave.Points > self.PointSavingLimit then
|
||
|
tosave.Points = self.PointSavingLimit
|
||
|
end
|
||
|
|
||
|
local filename = self:GetVaultFile(pl)
|
||
|
file.CreateDir(string.GetPathFromFilename(filename))
|
||
|
file.Write(filename, Serialize(tosave))
|
||
|
end
|