Initial code push
This commit is contained in:
126
Example_StatPointUI/Server/StatPointUI.lua
Normal file
126
Example_StatPointUI/Server/StatPointUI.lua
Normal file
@ -0,0 +1,126 @@
|
||||
-- Require the Server Message Handler
|
||||
require("SMH")
|
||||
|
||||
local config = {
|
||||
Prefix = "StatPointUI",
|
||||
Functions = {
|
||||
[1] = "OnFullCacheRequest",
|
||||
[2] = "OnSpendPointRequest",
|
||||
[3] = "OnStatResetRequest"
|
||||
}
|
||||
}
|
||||
|
||||
local StatPointUI = {
|
||||
cache = {}
|
||||
}
|
||||
|
||||
function StatPointUI.LoadData(guid)
|
||||
local query = CharDBQuery("SELECT `str`, `agi`, `stam`, `int`, `spirit`, `points` FROM character_stats_extra WHERE `guid`="..guid..";");
|
||||
if(query) then
|
||||
StatPointUI.cache[guid] = {
|
||||
query:GetUInt32(0), -- Strength
|
||||
query:GetUInt32(1), -- Agility
|
||||
query:GetUInt32(2), -- Stamina
|
||||
query:GetUInt32(3), -- Intellect
|
||||
query:GetUInt32(4), -- Spirit
|
||||
query:GetUInt32(5) -- statpoints
|
||||
}
|
||||
else
|
||||
StatPointUI.cache[guid] = {0, 0, 0, 0, 0, 0};
|
||||
CharDBQuery("INSERT INTO character_stats_extra(`guid`, `str`, `agi`, `stam`, `int`, `spirit`, `points`) VALUES ("..guid..", 0, 0, 0, 0, 0, 0);");
|
||||
end
|
||||
end
|
||||
|
||||
function StatPointUI.OnLogin(event, player)
|
||||
if not(StatPointUI.cache[player:GetGUIDLow()]) then
|
||||
StatPointUI.LoadData(player:GetGUIDLow())
|
||||
end
|
||||
StatPointUI.SetStats(player:GetGUIDLow())
|
||||
end
|
||||
|
||||
function StatPointUI.SetStats(guid, stat)
|
||||
stat = stat or nil
|
||||
local player = GetPlayerByGUID(guid)
|
||||
local auras = {7464, 7471, 7477, 7468, 7474}
|
||||
if(player) then
|
||||
if stat == nil then
|
||||
for i = 1, 5 do
|
||||
local aura = player:GetAura(auras[i])
|
||||
if (aura) then
|
||||
aura:SetStackAmount(StatPointUI.cache[guid][i])
|
||||
else
|
||||
if(StatPointUI.cache[guid][i] > 0) then
|
||||
player:AddAura(auras[i], player):SetStackAmount(StatPointUI.cache[guid][i])
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
local aura = player:GetAura(auras[stat])
|
||||
if (aura) then
|
||||
aura:SetStackAmount(StatPointUI.cache[guid][stat])
|
||||
else
|
||||
if(StatPointUI.cache[player:GetGUIDLow()][stat] > 0) then
|
||||
player:AddAura(auras[stat], player):SetStackAmount(StatPointUI.cache[guid][stat])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function StatPointUI.ResetStats(guid)
|
||||
local player = GetPlayerByGUID(guid)
|
||||
local auras = {7464, 7471, 7477, 7468, 7474}
|
||||
for _, aura in pairs(auras) do
|
||||
player:RemoveAura(aura)
|
||||
end
|
||||
end
|
||||
|
||||
function StatPointUI.OnElunaStartup(event)
|
||||
-- Re-cache online players' data in case of a hot reload
|
||||
for _, player in pairs(GetPlayersInWorld()) do
|
||||
StatPointUI.LoadData(player:GetGUIDLow())
|
||||
end
|
||||
end
|
||||
|
||||
function StatPointUI.OnPointSpent(guid, stat)
|
||||
local inttostr = {"str", "agi", "stam", "int", "spirit"}
|
||||
CharDBQuery("UPDATE character_stats_extra SET `"..inttostr[stat].."` = `"..inttostr[stat].."` + 1, `points`=`points`-1 WHERE `guid`="..guid..";")
|
||||
StatPointUI.cache[guid][stat] = StatPointUI.cache[guid][stat]+1
|
||||
StatPointUI.cache[guid][6] = StatPointUI.cache[guid][6]-1
|
||||
StatPointUI.SetStats(guid, stat)
|
||||
end
|
||||
|
||||
function StatPointUI.OnPointsReset(guid)
|
||||
local total = 0
|
||||
for _, points in pairs(StatPointUI.cache[guid]) do
|
||||
total = total+points
|
||||
end
|
||||
CharDBQuery("UPDATE character_stats_extra SET `str`=0, `agi`=0, `stam`=0, `int`=0, `spirit`=0, `points`="..total.." WHERE `guid`="..guid..";");
|
||||
StatPointUI.cache[guid] = {0, 0, 0, 0, 0, total};
|
||||
StatPointUI.ResetStats(guid)
|
||||
end
|
||||
|
||||
function OnFullCacheRequest(player, argTable)
|
||||
player:SendServerResponse(config.Prefix, 1, StatPointUI.cache[player:GetGUIDLow()])
|
||||
end
|
||||
|
||||
function OnSpendPointRequest(player, argTable)
|
||||
if(StatPointUI.cache[player:GetGUIDLow()][6] > 0) then
|
||||
-- Double check that the stat requested is actually a valid number
|
||||
if(tonumber(argTable[2]) <= 5 and tonumber(argTable[2]) >= 0) then
|
||||
StatPointUI.OnPointSpent(player:GetGUIDLow(), argTable[2])
|
||||
end
|
||||
else
|
||||
player:SendBroadcastMessage("You have no points left!")
|
||||
end
|
||||
player:SendServerResponse(config.Prefix, 1, StatPointUI.cache[player:GetGUIDLow()])
|
||||
end
|
||||
|
||||
function OnStatResetRequest(player, argTable)
|
||||
StatPointUI.OnPointsReset(player:GetGUIDLow())
|
||||
player:SendServerResponse(config.Prefix, 1, StatPointUI.cache[player:GetGUIDLow()])
|
||||
end
|
||||
|
||||
RegisterPlayerEvent(3, StatPointUI.OnLogin)
|
||||
RegisterServerEvent(33, StatPointUI.OnElunaStartup)
|
||||
RegisterClientRequests(config)
|
||||
10
Example_StatPointUI/Server/character_stats_extra.sql
Normal file
10
Example_StatPointUI/Server/character_stats_extra.sql
Normal file
@ -0,0 +1,10 @@
|
||||
-- Dumping structure for table character.character_stats_extra
|
||||
CREATE TABLE IF NOT EXISTS `character_stats_extra` (
|
||||
`guid` int(11) DEFAULT NULL,
|
||||
`str` int(11) DEFAULT NULL,
|
||||
`agi` int(11) DEFAULT NULL,
|
||||
`stam` int(11) DEFAULT NULL,
|
||||
`int` int(11) DEFAULT NULL,
|
||||
`spirit` int(11) DEFAULT NULL,
|
||||
`points` int(11) DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
Reference in New Issue
Block a user