198 lines
4.7 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
BuffTable = {};
---@class EBuffTypeInfo
---@field AddHealth_Quick int32
---@field AddHealth_Slow int32
---@field AddSpeed int32
---@field AddBodySize int32
---@field AddHealthMax int32
---@field ReduceHealth_Quick int32
---@field ReduceHealthMax int32
---@field ReduceSpeed int32
---@field SmallBody int32
---@field AddJump int32
---@field ReduceJump int32
BuffTable.EBuffType = {
AddHealth_Quick = 1,
AddHealth_Slow = 2,
AddSpeed = 3,
AddBodySize = 4,
AddHealthMax = 5,
ReduceHealth_Quick = 6,
ReduceHealthMax = 7,
ReduceSpeed = 8,
SmallBody = 9,
ReduceHealth_Slow = 10,
AddJump = 11,
ReduceJump = 12,
--AddBodySize_Slow = 13,
}
--- 当添加 Buff 是否是一直持有的
BuffTable.DurableAdd = true;
BuffTable.BuffChangeInterval = 1;
---@class BuffInfoItem
---@field Chinese string
---@field Rate float
---@field ContinueTime float
---@field Value float
---@type table<EBuffTypeInfo, BuffInfoItem>
BuffTable.BuffInfo = {
[BuffTable.EBuffType.AddHealth_Quick] = {
Chinese = "快速加血",
Rate = 10,
ContinueTime = 0,
Value = 20,
},
[BuffTable.EBuffType.AddHealth_Slow] = {
Chinese = "缓慢回血",
Rate = 15,
ContinueTime = 5,
Value = 3,
},
[BuffTable.EBuffType.ReduceHealth_Quick] = {
Chinese = "快速扣血",
Rate = 0,
ContinueTime = 0,
Value = 20,
},
[BuffTable.EBuffType.AddHealthMax] = {
Chinese = "增加最大生命值",
Rate = 50,
ContinueTime = 0,
Value = 0.1,
},
[BuffTable.EBuffType.AddSpeed] = {
Chinese = "加速",
Rate = 10,
ContinueTime = 0,
Value = 0.1,
},
[BuffTable.EBuffType.AddBodySize] = {
Chinese = "增大体型",
Rate = 50,
ContinueTime = 0,
Value = 0.1,
},
[BuffTable.EBuffType.ReduceHealthMax] = {
Chinese = "降低最大生命值",
Rate = 0,
ContinueTime = 0,
Value = 0.1,
},
[BuffTable.EBuffType.ReduceSpeed] = {
Chinese = "减速",
Rate = 0,
ContinueTime = 0,
Value = 0.1,
},
[BuffTable.EBuffType.SmallBody] = {
Chinese = "减小体型",
Rate = 0,
ContinueTime = 0,
Value = 0.1,
},
[BuffTable.EBuffType.ReduceHealth_Slow] = {
Chinese = "缓慢扣血",
Rate = 0,
ContinueTime = 5,
Value = 3,
},
[BuffTable.EBuffType.AddJump] = {
Chinese = "跳跃增强",
Rate = 10,
ContinueTime = 0,
Value = 0.1,
},
[BuffTable.EBuffType.ReduceJump] = {
Chinese = "跳跃减弱",
Rate = 0,
ContinueTime = 0,
Value = 0.1,
},
}
---@type table<int32, int32>
BuffTable.BuffIdTable = {};
--- 初始化 BuffTable
function InitBuffTable()
BuffTable.LoadBuffIdTable()
end
---@param InIndex int32
function BuffTable.GetBuffName(InIndex)
for i, v in pairs(BuffTable.EBuffType) do
if InIndex == v then return i; end
end
return nil;
end
---@param BuffName string
function BuffTable.CheckBuffExist(BuffName)
return BuffTable.EBuffType[BuffName] ~= nil;
end
function BuffTable.LoadBuffIdTable()
BuffTable.BuffIdTable = {};
for i, v in pairs(BuffTable.EBuffType) do
BuffTable.BuffIdTable[#BuffTable.BuffIdTable + 1] = v;
end
end
---@type table<int32, any>
BuffTable.ValidBuffs = {};
BuffTable.ValidBuffCount = nil;
--- 获取可用的 Buff
function BuffTable.GetValidBuffIds()
BuffTable.ValidBuffs = {};
local Total = 0;
for i = 1, #BuffTable.BuffInfo do
local BuffInfo = BuffTable.BuffInfo[i]
if BuffInfo.Rate > 0 then
Total = Total + BuffInfo.Rate;
BuffTable.ValidBuffs[#BuffTable.ValidBuffs + 1] = {
Rate = BuffInfo.Rate;
Type = i;
};
end
end
BuffTable.ValidBuffCount = Total;
end
--- 随机选取一个 Buff
---@return EBuffType
function BuffTable.RandomBuff()
if table.isEmpty(BuffTable.ValidBuffs) then BuffTable.GetValidBuffIds(); end
--UGCLogSystem.LogTree(string.format("[BuffTable.RandomBuff] BuffTable.ValidBuffs ="), BuffTable.ValidBuffs)
local Num = math.random(BuffTable.ValidBuffCount)
--UGCLogSystem.Log("[BuffTable.RandomBuff] Num = %d", Num);
for i, v in pairs(BuffTable.ValidBuffs) do
Num = Num - v.Rate;
if Num <= 0 then return v.Type; end
end
return 1;
end
---@param InBuffItem FBuffAction
---@param IsAdd bool
function BuffTable.ApplyBuff(InBuffItem, IsAdd)
if IsServer then
local Simple = 1;
if IsAdd == false then Simple = -1; end
local Pawn = InBuffItem:GetOwnerPawn();
local Value = BuffTable.BuffInfo[InBuffItem:GetBuffType()].Value;
if BuffTable.DurableAdd then
UGCLogSystem.Log("[BuffTable.ApplyBuff] Value = %s", tostring(Value));
GameState:AddPlayerAttribute(Pawn.PlayerKey, InBuffItem:GetBuffKey(), Simple * Value);
else
-- 添加到玩家列表中
Pawn:AddBenefit(InBuffItem:GetBuffKey(), Simple * Value)
end
Pawn:UseOneBenefit(InBuffItem:GetBuffKey(), true);
end
end