eluna-scripts-ornfelt/lua/WowEmulationScriptPack/Lua/StatAllo/Server2.lua
2024-09-23 07:59:23 +02:00

174 lines
No EOL
5 KiB
Lua

-- ___ ___ _ __ _____ ___ ___ ___ ___ ___ _ ___ _ __
-- | __| __| |\ \ / / _ \ / _ \| \ | _ \ __| _ \/_\ / __| |/ /
-- | _|| _|| |_\ \/\/ / (_) | (_) | |) | | / _|| _/ _ \ (__| ' <
-- |_| |___|____\_/\_/ \___/ \___/|___/ |_|_\___|_|/_/ \_\___|_|\_\
local AIO = AIO or require("AIO")
local MyHandlers = AIO.AddHandlers("Kaev", {})
local AttributesAuraIds = { 7464, 7471, 7477, 7468, 7474 } -- Strength, Agility, Stamina, Intellect, Spirit
local function GetStatTable(player)
local strength, agility, stamina, intellect, spirit = player:GetStatPoints()
return {strength, agility, stamina, intellect, spirit}
end
local function GetFreeStats(player)
local stats = GetStatTable(player)
local count = 0
for k, v in pairs(stats) do
--print("Count: "..tostring(count).." Free: "..v.."K "..k)
count = count + v
end
return player:GetLevel() - count
end
local function BuildModifierTable(statId, amount)
local modifier = {0, 0, 0, 0, 0}
modifier[statId] = amount
return modifier
end
local function AddAuras(player)
local stats = GetStatTable(player)
for k, v in pairs(stats) do
if v >= 1 then
player:AddAura(AttributesAuraIds[k], player)
if v > 1 then
local aura = player:GetAura(AttributesAuraIds[k])
aura:SetStackAmount(v)
end
end
end
end
local function AddPlayerStats(msg, player)
local guid = player:GetGUIDLow()
local spend = GetStatTable(player)
local left = GetFreeStats(player)
return msg:Add("Kaev", "SetStats", left, AIO.unpack(spend))
end
AIO.AddOnInit(AddPlayerStats)
local function UpdatePlayerStats(player)
AddPlayerStats(AIO.Msg(), player):Send(player)
end
local function OnLogin(event, player)
player:UpdateStatPoints()
AddAuras(player)
end
RegisterPlayerEvent(3, OnLogin)
for k,v in ipairs(GetPlayersInWorld()) do
OnLogin(3, v)
end
function MyHandlers.AttributesIncrease(player, statId)
if (player:IsInCombat()) then
player:SendBroadcastMessage("You can't modify your attributes while in combat.")
return
end
local guid = player:GetGUIDLow()
local stats = GetStatTable(player)
local left = GetFreeStats(player)
if not stats or not left then
--print("StatAllocationSystem#Server: "..player:GetName().." does not have any stats or points left")
return
end
if not statId or not stats[statId] then
--print("StatAllocationSystem#Server: "..player:GetName().." tried to modify invalid statId")
return
end
if left <= 0 then
player:SendBroadcastMessage("You don't have any points left to spend.")
return
end
local t = BuildModifierTable(statId, 1)
--print("Modifiers 1: "..tostring(t[1]).." 2: "..tostring(t[2]).." 3: "..tostring(t[3]).." 4: "..tostring(t[4]).." 5: "..tostring(t[5]))
player:ModifyStatPoints(t[1], t[2], t[3], t[4], t[5])
local aura = player:GetAura(AttributesAuraIds[statId])
if (aura) then
aura:SetStackAmount(stats[statId])
else
player:AddAura(AttributesAuraIds[statId], player)
end
UpdatePlayerStats(player)
player:SaveStatPoints()
end
function MyHandlers.AttributesDecrease(player, statId)
if (player:IsInCombat()) then
player:SendBroadcastMessage("You can't modify your attributes while in combat.")
return
end
local guid = player:GetGUIDLow()
local stats = GetStatTable(player)
local left = GetFreeStats(player)
if not stats or not left then
--print("StatAllocationSystem#Server: "..player:GetName().." does not have any stats or points to remove")
return
end
if not statId or not stats[statId] then
--print("StatAllocationSystem#Server: "..player:GetName().." tried to modify invalid statId")
return
end
if stats[statId] <= 0 then
player:SendBroadcastMessage("You don't have any points left to remove.")
return
end
local t = BuildModifierTable(statId, -1)
--print("Modifiers 1: "..tostring(t[1]).." 2: "..tostring(t[2]).." 3: "..tostring(t[3]).." 4: "..tostring(t[4]).." 5: "..tostring(t[5]))
player:ModifyStatPoints(t[1], t[2], t[3], t[4], t[5])
local aura = player:GetAura(AttributesAuraIds[statId])
if (aura) then
--print("New amount: "..tostring(stats[statId]-1))
aura:SetStackAmount(stats[statId]-1)
else
player:AddAura(AttributesAuraIds[statId], player)
end
UpdatePlayerStats(player)
player:SaveStatPoints()
end
local function AttributesOnCommand(event, player, command)
if(command == "stats") then
AIO.Handle(player, "Kaev", "ShowAttributes")
return false
end
end
RegisterPlayerEvent(42, AttributesOnCommand)
local function OnLevelChange(event, player, oldLevel)
UpdatePlayerStats(player)
player:RemoveAura(7464)
player:RemoveAura(7471)
player:RemoveAura(7477)
player:RemoveAura(7468)
player:RemoveAura(7474)
end
RegisterPlayerEvent(13, OnLevelChange)