更新
This commit is contained in:
parent
587690b2fc
commit
2d612189d5
@ -97,6 +97,25 @@ function SwordWave:OnHit(Victim: TypeList.Character)
|
|||||||
Damage = 30,
|
Damage = 30,
|
||||||
Type = DamageProxy.DamageType.SKILL,
|
Type = DamageProxy.DamageType.SKILL,
|
||||||
Tag = DamageProxy.DamageTag.NORMAL,
|
Tag = DamageProxy.DamageTag.NORMAL,
|
||||||
|
ElementType = DamageProxy.ElementType.NONE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Damage = 5,
|
||||||
|
Type = DamageProxy.DamageType.SKILL,
|
||||||
|
Tag = DamageProxy.DamageTag.NORMAL,
|
||||||
|
ElementType = DamageProxy.ElementType.FIRE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Damage = 5,
|
||||||
|
Type = DamageProxy.DamageType.SKILL,
|
||||||
|
Tag = DamageProxy.DamageTag.NORMAL,
|
||||||
|
ElementType = DamageProxy.ElementType.ICE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Damage = 5,
|
||||||
|
Type = DamageProxy.DamageType.SKILL,
|
||||||
|
Tag = DamageProxy.DamageTag.NORMAL,
|
||||||
|
ElementType = DamageProxy.ElementType.SHADOW,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return false
|
return false
|
||||||
|
@ -24,17 +24,27 @@ local DamageTag = {
|
|||||||
NORMAL = "Normal", -- 普攻
|
NORMAL = "Normal", -- 普攻
|
||||||
CRIT = "Crit", -- 暴击
|
CRIT = "Crit", -- 暴击
|
||||||
}
|
}
|
||||||
|
local ElementType = {
|
||||||
|
NONE = "None", -- 无
|
||||||
|
FIRE = "Fire",
|
||||||
|
ICE = "Ice", -- 冰
|
||||||
|
SHADOW = "Shadow", -- 暗影
|
||||||
|
LIGHT = "Light", -- 光
|
||||||
|
}
|
||||||
|
|
||||||
export type DamageTag = "Normal" | "Critical"
|
export type DamageTag = "Normal" | "Critical"
|
||||||
export type DamageType = "Normal" | "Skill"
|
export type DamageType = "Normal" | "Skill"
|
||||||
|
export type ElementType = "Fire" | "Ice" | "Shadow" | "Light"
|
||||||
export type DamageInfo = {
|
export type DamageInfo = {
|
||||||
Damage: number,
|
Damage: number,
|
||||||
Type: DamageType,
|
Type: DamageType,
|
||||||
Tag: DamageTag,
|
Tag: DamageTag,
|
||||||
|
ElementType: ElementType,
|
||||||
}
|
}
|
||||||
|
|
||||||
DamageProxy.DamageType = DamageType
|
DamageProxy.DamageType = DamageType
|
||||||
DamageProxy.DamageTag = DamageTag
|
DamageProxy.DamageTag = DamageTag
|
||||||
|
DamageProxy.ElementType = ElementType
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -125,9 +135,13 @@ function DamageProxy:TakeDamage(Caster: TypeList.Character, Victim: TypeList.Cha
|
|||||||
clientDamageInfos.DamageInfos = Utils:DeepCopyTable(DamageInfos)
|
clientDamageInfos.DamageInfos = Utils:DeepCopyTable(DamageInfos)
|
||||||
|
|
||||||
for _, DamageInfo in DamageInfos do
|
for _, DamageInfo in DamageInfos do
|
||||||
|
if not Victim then continue end
|
||||||
|
if Victim:GetState("Died") then continue end
|
||||||
|
|
||||||
local Damage = DamageInfo.Damage
|
local Damage = DamageInfo.Damage
|
||||||
local DamageType = DamageInfo.DamageType
|
local DamageType = DamageInfo.DamageType
|
||||||
local DamageTag = DamageInfo.DamageTag
|
local DamageTag = DamageInfo.DamageTag
|
||||||
|
local ElementType = DamageInfo.ElementType
|
||||||
|
|
||||||
-- 伤害计算
|
-- 伤害计算
|
||||||
local VictimHealth = Victim:GetAttributeValue("hp")
|
local VictimHealth = Victim:GetAttributeValue("hp")
|
||||||
|
@ -98,7 +98,8 @@ task.defer(function()
|
|||||||
{
|
{
|
||||||
Damage = Mob.Config.attack,
|
Damage = Mob.Config.attack,
|
||||||
DamageType = DamageProxy.DamageType.PHYSICAL,
|
DamageType = DamageProxy.DamageType.PHYSICAL,
|
||||||
DamageTag = DamageProxy.DamageTag.NORMAL
|
DamageTag = DamageProxy.DamageTag.NORMAL,
|
||||||
|
ElementType = DamageProxy.ElementType.NONE,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
101
src/StarterPlayerScripts/Base/UIWindow.luau
Normal file
101
src/StarterPlayerScripts/Base/UIWindow.luau
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
local UIWindow = {}
|
||||||
|
UIWindow.__index = UIWindow
|
||||||
|
|
||||||
|
--> Services
|
||||||
|
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||||
|
|
||||||
|
--> Variables
|
||||||
|
local FolderWindows = ReplicatedStorage:WaitForChild("UI"):WaitForChild("Windows")
|
||||||
|
|
||||||
|
local LocalPlayer = game.Players.LocalPlayer
|
||||||
|
local FolderPlayerGui = LocalPlayer:WaitForChild("PlayerGui")
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- 递归查找
|
||||||
|
local function FindInDescendants(root, name)
|
||||||
|
if root:FindFirstChild(name) then
|
||||||
|
return root:FindFirstChild(name)
|
||||||
|
end
|
||||||
|
for _, child in ipairs(root:GetChildren()) do
|
||||||
|
local found = FindInDescendants(child, name)
|
||||||
|
if found then
|
||||||
|
return found
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 非递归查找
|
||||||
|
local function FindInRoot(root, name)
|
||||||
|
return root:FindFirstChild(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
function UIWindow:Init(Data: table?)
|
||||||
|
local self = {}
|
||||||
|
self.Data = Data
|
||||||
|
self.Variables = {}
|
||||||
|
self.UIRootName = nil
|
||||||
|
self.UIParentName = nil
|
||||||
|
|
||||||
|
|
||||||
|
self.UIRoot = nil
|
||||||
|
self.AutoInject = false
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function UIWindow:SetData(Data: table?)
|
||||||
|
self.Data = Data
|
||||||
|
self:OnDataChanged()
|
||||||
|
end
|
||||||
|
|
||||||
|
function UIWindow:OnOpenWindow()
|
||||||
|
|
||||||
|
if not self.UIRoot then
|
||||||
|
-- 创建UI根节点
|
||||||
|
self.UIRoot = FolderWindows:FindFirstChild(self.UIRootName):Clone()
|
||||||
|
self.UIRoot.Parent = FolderPlayerGui:FindFirstChild(self.UIParentName)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 自动注入
|
||||||
|
if not self.AutoInject then
|
||||||
|
for varName, _ in pairs(self.Variables) do
|
||||||
|
if typeof(varName) == "string" then
|
||||||
|
local firstChar = string.sub(varName, 1, 1)
|
||||||
|
local secondChar = string.sub(varName, 2, 2)
|
||||||
|
local target
|
||||||
|
|
||||||
|
if firstChar == "_" then
|
||||||
|
if secondChar == "_" then
|
||||||
|
-- __开头,只查根目录
|
||||||
|
target = FindInRoot(self.UIRoot, varName)
|
||||||
|
else
|
||||||
|
-- _开头,递归查找
|
||||||
|
target = FindInDescendants(self.UIRoot, varName)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not target then
|
||||||
|
error("自动注入失败:未找到UI节点 " .. varName)
|
||||||
|
end
|
||||||
|
|
||||||
|
self[varName] = target
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.AutoInject = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UIWindow:OnCloseWindow()
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
--> 覆盖用
|
||||||
|
function UIWindow:OnDataChanged() end
|
||||||
|
|
||||||
|
function UIWindow:Refresh() end
|
||||||
|
|
||||||
|
return UIWindow
|
@ -6,6 +6,21 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|||||||
--> Variables
|
--> Variables
|
||||||
local FolderDamageBoard = ReplicatedStorage.UI.DamageBoard
|
local FolderDamageBoard = ReplicatedStorage.UI.DamageBoard
|
||||||
|
|
||||||
|
local sort_order = {
|
||||||
|
["None"] = 1,
|
||||||
|
["Fire"] = 2,
|
||||||
|
["Ice"] = 3,
|
||||||
|
["Shadow"] = 4,
|
||||||
|
["Light"] = 5,
|
||||||
|
}
|
||||||
|
local element_color = {
|
||||||
|
["None"] = Color3.fromRGB(218, 218, 218),
|
||||||
|
["Fire"] = Color3.fromRGB(255, 65, 65),
|
||||||
|
["Ice"] = Color3.fromRGB(64, 217, 255),
|
||||||
|
["Shadow"] = Color3.fromRGB(165, 65, 252),
|
||||||
|
["Light"] = Color3.fromRGB(215, 215, 57),
|
||||||
|
}
|
||||||
|
|
||||||
local LocalPlayer = game.Players.LocalPlayer
|
local LocalPlayer = game.Players.LocalPlayer
|
||||||
|
|
||||||
local Boards = {}
|
local Boards = {}
|
||||||
@ -19,16 +34,35 @@ function DamageBoard:GetBoard(Name: string)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function DamageBoard:CreateNormalDamageBoard(DamageDetail: table)
|
function DamageBoard:CreateNormalDamageBoard(DamageDetail: table)
|
||||||
print(DamageDetail)
|
local DamageInitPos = DamageDetail.DamagePosition
|
||||||
|
local BiasPos = Vector3.new(0, 3, 0)
|
||||||
|
local MultPos = Vector3.new(0, 1, 0)
|
||||||
|
|
||||||
|
-- 根据元素类型排序
|
||||||
|
local DamageInfos = DamageDetail["DamageInfos"]
|
||||||
|
table.sort(DamageInfos, function(a, b)
|
||||||
|
local a_order = sort_order[a.ElementType] or 99
|
||||||
|
local b_order = sort_order[b.ElementType] or 99
|
||||||
|
return a_order < b_order
|
||||||
|
end)
|
||||||
|
|
||||||
|
local index = 0
|
||||||
local BoardInstance = Boards["Board1"]:Clone()
|
local BoardInstance = Boards["Board1"]:Clone()
|
||||||
|
for _, DamageInfo in DamageInfos do
|
||||||
|
local BoardCanvas = BoardInstance:FindFirstChild("BillboardGui"):FindFirstChild("Canvas")
|
||||||
|
local DamageInstance = BoardCanvas:FindFirstChild("Damage")
|
||||||
|
|
||||||
|
local ElementInstance = BoardCanvas:FindFirstChild("Element")
|
||||||
|
ElementInstance.ImageColor3 = element_color[DamageInfo.ElementType]
|
||||||
|
|
||||||
|
DamageInstance.Text = DamageInfo.Damage
|
||||||
|
DamageInstance.TextColor3 = element_color[DamageInfo.ElementType]
|
||||||
|
|
||||||
|
BoardInstance.Position = DamageInitPos + BiasPos + MultPos * index
|
||||||
BoardInstance.Parent = game.Workspace
|
BoardInstance.Parent = game.Workspace
|
||||||
-- local biasPos = (LocalPlayer.Character.HumanoidRootPart.Position - DamageDetail.DamagePosition).Unit * 2
|
|
||||||
BoardInstance.Position = DamageDetail.DamagePosition + Vector3.new(0, 3, 0)
|
|
||||||
|
|
||||||
local DamageInstance = BoardInstance:FindFirstChild("BillboardGui"):FindFirstChild("Canvas"):FindFirstChild("Damage")
|
|
||||||
DamageInstance.Text = DamageDetail["DamageInfos"][1].Damage
|
|
||||||
|
|
||||||
game.Debris:AddItem(BoardInstance, 1)
|
game.Debris:AddItem(BoardInstance, 1)
|
||||||
|
index = index + 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
0
src/StarterPlayerScripts/UI/UIManager.luau
Normal file
0
src/StarterPlayerScripts/UI/UIManager.luau
Normal file
Loading…
x
Reference in New Issue
Block a user