diff --git a/.gitignore b/.gitignore index 43f79fa6..98db78bc 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,7 @@ Template* remain_template_project.py # 公司项目 -GZJ +# GZJ # 移除日志脚本 #rmdir.bat diff --git a/BoltGods/Script/Global/Tool/ItemTool.lua b/BoltGods/Script/Global/Tool/ItemTool.lua index dd622a95..6cdced07 100644 --- a/BoltGods/Script/Global/Tool/ItemTool.lua +++ b/BoltGods/Script/Global/Tool/ItemTool.lua @@ -239,7 +239,7 @@ function ItemTool.AddWeaponParts(InPawn, Weapon, IsAppend) if WeaponSuits[WeaponId] then TheList = WeaponSuits[WeaponId][EWeaponPartType.Best]; if not table.isEmpty(TheList) then - Items = TheList[math.random(#TheList)]; + Items = TheList[1]; end end local AccountInfo = UGCPlayerStateSystem.GetPlayerAccountInfo(InPawn.PlayerKey) diff --git a/GZJ/Asset/Animation/CS/JGSL1/M_UGC_JGSL1_Running_v01.uasset b/GZJ/Asset/Animation/CS/JGSL1/M_UGC_JGSL1_Running_v01.uasset new file mode 100644 index 00000000..9ff01a3f Binary files /dev/null and b/GZJ/Asset/Animation/CS/JGSL1/M_UGC_JGSL1_Running_v01.uasset differ diff --git a/GZJ/Asset/Animation/CS/JGSL1/M_UGC_JGSL1_Walking_v01.uasset b/GZJ/Asset/Animation/CS/JGSL1/M_UGC_JGSL1_Walking_v01.uasset new file mode 100644 index 00000000..69ca181b Binary files /dev/null and b/GZJ/Asset/Animation/CS/JGSL1/M_UGC_JGSL1_Walking_v01.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Attacking.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Attacking.uasset new file mode 100644 index 00000000..13008153 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Dying.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Dying.uasset new file mode 100644 index 00000000..e82d2089 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Dying.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Hit.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Hit.uasset new file mode 100644 index 00000000..733331ea Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Hit.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Idle.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Idle.uasset new file mode 100644 index 00000000..c6281aad Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Idle.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Running.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Running.uasset new file mode 100644 index 00000000..130df2c0 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Running.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Stun.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Stun.uasset new file mode 100644 index 00000000..78b9b4d1 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Stun.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Walking.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Walking.uasset new file mode 100644 index 00000000..686a1e24 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/A_UGC_CCJJG_Walking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Attacking.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Attacking.uasset new file mode 100644 index 00000000..d11d1fe2 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Attacking_Montage.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Attacking_Montage.uasset new file mode 100644 index 00000000..c717cd9d Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying.uasset new file mode 100644 index 00000000..5f534fa3 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying_Loop.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying_Loop.uasset new file mode 100644 index 00000000..1fbaa8c4 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying_Loop.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying_Montage.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying_Montage.uasset new file mode 100644 index 00000000..a2da2a61 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Hit.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Hit.uasset new file mode 100644 index 00000000..c13e6bdb Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Hit.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Idle.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Idle.uasset new file mode 100644 index 00000000..288e5414 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Idle.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Running.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Running.uasset new file mode 100644 index 00000000..893f97f8 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Running.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Stun.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Stun.uasset new file mode 100644 index 00000000..7058e3eb Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Stun.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Walking.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Walking.uasset new file mode 100644 index 00000000..a8672dab Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/M_UGC_CCJJG_Walking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/SK_CCJJG.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/SK_CCJJG.uasset new file mode 100644 index 00000000..a92adf6f Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/SK_CCJJG.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/SK_UGC_CCJJG.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/SK_UGC_CCJJG.uasset new file mode 100644 index 00000000..2e614e01 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/SK_UGC_CCJJG.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/1/Animation/SM_UGC_CCJJG_WUQI.uasset b/GZJ/Asset/Animation/JinGong/1/Animation/SM_UGC_CCJJG_WUQI.uasset new file mode 100644 index 00000000..2ff852a4 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/1/Animation/SM_UGC_CCJJG_WUQI.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Attacking.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Attacking.uasset new file mode 100644 index 00000000..f89d029d Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Attacking_Montage.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Attacking_Montage.uasset new file mode 100644 index 00000000..e995a3ed Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Dying.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Dying.uasset new file mode 100644 index 00000000..bedb785e Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Dying.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Dying_Montage.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Dying_Montage.uasset new file mode 100644 index 00000000..14cd9033 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Hit.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Hit.uasset new file mode 100644 index 00000000..98b6218c Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Hit.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Idle.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Idle.uasset new file mode 100644 index 00000000..eca8bb8f Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Idle.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Running.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Running.uasset new file mode 100644 index 00000000..72cc436a Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Running.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Stun.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Stun.uasset new file mode 100644 index 00000000..064ace72 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Stun.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Walking.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Walking.uasset new file mode 100644 index 00000000..b9001390 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/A_UGC_DJTPG_Walking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/SK_DJTPG.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/SK_DJTPG.uasset new file mode 100644 index 00000000..885e3778 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/SK_DJTPG.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/SK_UGC_DJTPG.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/SK_UGC_DJTPG.uasset new file mode 100644 index 00000000..3090742a Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/SK_UGC_DJTPG.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/SM_UGC_DJTPG_WUQI_1.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/SM_UGC_DJTPG_WUQI_1.uasset new file mode 100644 index 00000000..4b67a51e Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/SM_UGC_DJTPG_WUQI_1.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/2/Animation/SM_UGC_DJTPG_WUQI_2.uasset b/GZJ/Asset/Animation/JinGong/2/Animation/SM_UGC_DJTPG_WUQI_2.uasset new file mode 100644 index 00000000..43345964 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/2/Animation/SM_UGC_DJTPG_WUQI_2.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attack_shifa.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attack_shifa.uasset new file mode 100644 index 00000000..ae50c382 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attack_shifa.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attack_shifa_Montage.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attack_shifa_Montage.uasset new file mode 100644 index 00000000..1a24956d Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attack_shifa_Montage.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attacking.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attacking.uasset new file mode 100644 index 00000000..d16a7a7d Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attacking_Montage.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attacking_Montage.uasset new file mode 100644 index 00000000..3251a5e9 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Dying.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Dying.uasset new file mode 100644 index 00000000..fb610f24 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Dying.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Dying_Montage.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Dying_Montage.uasset new file mode 100644 index 00000000..21df1ee5 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Hit.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Hit.uasset new file mode 100644 index 00000000..1982d1da Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Hit.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Idle.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Idle.uasset new file mode 100644 index 00000000..3d74b959 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Idle.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Running.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Running.uasset new file mode 100644 index 00000000..252752e2 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Running.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Stun.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Stun.uasset new file mode 100644 index 00000000..158378e3 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Stun.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Walking.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Walking.uasset new file mode 100644 index 00000000..be58887b Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/A_UGC_FYG_Walking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/SK_FYG.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/SK_FYG.uasset new file mode 100644 index 00000000..71672358 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/SK_FYG.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/SK_UGC_FYG.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/SK_UGC_FYG.uasset new file mode 100644 index 00000000..22fe95f0 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/SK_UGC_FYG.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/SM_UGC_FYG_WUQI_1.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/SM_UGC_FYG_WUQI_1.uasset new file mode 100644 index 00000000..7e0dff75 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/SM_UGC_FYG_WUQI_1.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/3/Animation/SM_UGC_FYG_WUQI_2.uasset b/GZJ/Asset/Animation/JinGong/3/Animation/SM_UGC_FYG_WUQI_2.uasset new file mode 100644 index 00000000..e71747cd Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/3/Animation/SM_UGC_FYG_WUQI_2.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Attack.uasset b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Attack.uasset new file mode 100644 index 00000000..9663a979 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Attack.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Dying.uasset b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Dying.uasset new file mode 100644 index 00000000..349e8372 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Dying.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Hit.uasset b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Hit.uasset new file mode 100644 index 00000000..56cb429b Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Hit.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Idle.uasset b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Idle.uasset new file mode 100644 index 00000000..3943ea3c Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Idle.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Running.uasset b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Running.uasset new file mode 100644 index 00000000..2eae85fb Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Running.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Walking.uasset b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Walking.uasset new file mode 100644 index 00000000..9d41229f Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/4/Animation/A_UGC_JGXG_Walking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/4/Animation/SK_UGC_JGXG.uasset b/GZJ/Asset/Animation/JinGong/4/Animation/SK_UGC_JGXG.uasset new file mode 100644 index 00000000..53b59960 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/4/Animation/SK_UGC_JGXG.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_Attacking.uasset b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_Attacking.uasset new file mode 100644 index 00000000..37af0778 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_dying.uasset b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_dying.uasset new file mode 100644 index 00000000..fdbf3257 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_dying.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_hit.uasset b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_hit.uasset new file mode 100644 index 00000000..ad4d769f Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_hit.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_idle.uasset b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_idle.uasset new file mode 100644 index 00000000..76de34c1 Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_idle.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_running.uasset b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_running.uasset new file mode 100644 index 00000000..c0c56cde Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/5/Animation/A_UGC_LGFGW_running.uasset differ diff --git a/GZJ/Asset/Animation/JinGong/5/Animation/SK_UGC_LGFGW.uasset b/GZJ/Asset/Animation/JinGong/5/Animation/SK_UGC_LGFGW.uasset new file mode 100644 index 00000000..316870ce Binary files /dev/null and b/GZJ/Asset/Animation/JinGong/5/Animation/SK_UGC_LGFGW.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_CCJJG.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_CCJJG.uasset new file mode 100644 index 00000000..cfc0a1aa Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_CCJJG.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_DJTPG.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_DJTPG.uasset new file mode 100644 index 00000000..390bad4f Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_DJTPG.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_FYG.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_FYG.uasset new file mode 100644 index 00000000..65d56482 Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_FYG.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_GFGW.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_GFGW.uasset new file mode 100644 index 00000000..7de0c07a Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_GFGW.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_01.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_01.uasset new file mode 100644 index 00000000..c0b7ee0a Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_01.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_02.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_02.uasset new file mode 100644 index 00000000..a208cb07 Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_02.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_03.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_03.uasset new file mode 100644 index 00000000..e8308337 Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_03.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_04.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_04.uasset new file mode 100644 index 00000000..9d775750 Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_04.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_05.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_05.uasset new file mode 100644 index 00000000..905705d2 Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_05.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_06.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_06.uasset new file mode 100644 index 00000000..dba1ad4e Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_JGSL_06.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_JGXG.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_JGXG.uasset new file mode 100644 index 00000000..2aadc4af Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_JGXG.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_01.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_01.uasset new file mode 100644 index 00000000..eb5dccea Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_01.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_02.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_02.uasset new file mode 100644 index 00000000..5d47738b Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_02.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_03.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_03.uasset new file mode 100644 index 00000000..0853b254 Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_03.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_04.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_04.uasset new file mode 100644 index 00000000..3f5d1282 Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_04.uasset differ diff --git a/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_05.uasset b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_05.uasset new file mode 100644 index 00000000..c3199c4c Binary files /dev/null and b/GZJ/Asset/Animation/Material/Mi_UGC_TiaoZhan_05.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking.uasset new file mode 100644 index 00000000..858de29c Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_Montage.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_Montage.uasset new file mode 100644 index 00000000..70b97185 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_fenshen.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_fenshen.uasset new file mode 100644 index 00000000..96cebe8e Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_fenshen.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_fenshen_Montage.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_fenshen_Montage.uasset new file mode 100644 index 00000000..451a4ee1 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_fenshen_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_shanshuo.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_shanshuo.uasset new file mode 100644 index 00000000..4ac338a7 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Attacking_shanshuo.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Dying.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Dying.uasset new file mode 100644 index 00000000..920ec148 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Dying.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Dying_Montage.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Dying_Montage.uasset new file mode 100644 index 00000000..b0953d65 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Hit.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Hit.uasset new file mode 100644 index 00000000..8e0fea91 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Hit.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Idle.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Idle.uasset new file mode 100644 index 00000000..4a9a7773 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Idle.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Running.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Running.uasset new file mode 100644 index 00000000..c9309dec Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Running.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Stun.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Stun.uasset new file mode 100644 index 00000000..12c2c92f Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Stun.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Walking.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Walking.uasset new file mode 100644 index 00000000..46a29e27 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/A_UGC_JGSL1_Walking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/SK_JGSL1.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/SK_JGSL1.uasset new file mode 100644 index 00000000..9cb6894c Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/SK_JGSL1.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/SK_UGC_JGSL1.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/SK_UGC_JGSL1.uasset new file mode 100644 index 00000000..55d08043 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/SK_UGC_JGSL1.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/SM_UGC_JGSL1_WUQI_1.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/SM_UGC_JGSL1_WUQI_1.uasset new file mode 100644 index 00000000..9992a5aa Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/SM_UGC_JGSL1_WUQI_1.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/1/Animation/SM_UGC_JGSL1_WUQI_2.uasset b/GZJ/Asset/Animation/ShouLing/1/Animation/SM_UGC_JGSL1_WUQI_2.uasset new file mode 100644 index 00000000..1b5f172f Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/1/Animation/SM_UGC_JGSL1_WUQI_2.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking.uasset new file mode 100644 index 00000000..f5db1c17 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_01.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_01.uasset new file mode 100644 index 00000000..211d4540 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_01.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_01_Montage.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_01_Montage.uasset new file mode 100644 index 00000000..4bc20a61 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_01_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_Montage.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_Montage.uasset new file mode 100644 index 00000000..7357bb45 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Dying.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Dying.uasset new file mode 100644 index 00000000..840b89c5 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Dying.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Dying_Montage.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Dying_Montage.uasset new file mode 100644 index 00000000..8430e101 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Hit.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Hit.uasset new file mode 100644 index 00000000..c94a22ee Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Hit.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Idle.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Idle.uasset new file mode 100644 index 00000000..5809c302 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Idle.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Running.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Running.uasset new file mode 100644 index 00000000..da1ba09d Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Running.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Stun.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Stun.uasset new file mode 100644 index 00000000..bef1e0aa Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Stun.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Walking.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Walking.uasset new file mode 100644 index 00000000..77806859 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/A_UCG_JGSL2_Walking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/SK_JGSL2.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/SK_JGSL2.uasset new file mode 100644 index 00000000..a51bdec1 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/SK_JGSL2.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/SK_UGC_JGSL2.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/SK_UGC_JGSL2.uasset new file mode 100644 index 00000000..733d836e Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/SK_UGC_JGSL2.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/2/Animation/SM_UGC_JGSL_WUQI.uasset b/GZJ/Asset/Animation/ShouLing/2/Animation/SM_UGC_JGSL_WUQI.uasset new file mode 100644 index 00000000..413821db Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/2/Animation/SM_UGC_JGSL_WUQI.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking.uasset new file mode 100644 index 00000000..35bc645d Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking_shifa.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking_shifa.uasset new file mode 100644 index 00000000..445a1ce5 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking_shifa.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking_shifa_Montage.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking_shifa_Montage.uasset new file mode 100644 index 00000000..9c813e28 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Attacking_shifa_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Dying.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Dying.uasset new file mode 100644 index 00000000..5d1d19b1 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Dying.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Dying_Montage.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Dying_Montage.uasset new file mode 100644 index 00000000..a6d6e1c4 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Hit.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Hit.uasset new file mode 100644 index 00000000..e376d81d Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Hit.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Idle.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Idle.uasset new file mode 100644 index 00000000..6b86cf77 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Idle.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Running.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Running.uasset new file mode 100644 index 00000000..4d4ebc80 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Running.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Stun.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Stun.uasset new file mode 100644 index 00000000..41ea9ba1 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Stun.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Walking.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Walking.uasset new file mode 100644 index 00000000..07de1b24 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/A_UGC_JGSL3_Walking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/3/Animation/SK_JGSL3.uasset b/GZJ/Asset/Animation/ShouLing/3/Animation/SK_JGSL3.uasset new file mode 100644 index 00000000..24291d70 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/3/Animation/SK_JGSL3.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking.uasset new file mode 100644 index 00000000..c0f371ec Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Montage.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Montage.uasset new file mode 100644 index 00000000..df1b4e53 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Spin.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Spin.uasset new file mode 100644 index 00000000..8e4dbd7a Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Spin.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Spin_Montage.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Spin_Montage.uasset new file mode 100644 index 00000000..29c6d8fe Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Attacking_Spin_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Dying.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Dying.uasset new file mode 100644 index 00000000..61ff20ec Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Dying.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Dying_Montage.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Dying_Montage.uasset new file mode 100644 index 00000000..cc420c8d Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Idle.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Idle.uasset new file mode 100644 index 00000000..8f4db81b Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Idle.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Running.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Running.uasset new file mode 100644 index 00000000..43639220 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Running.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Stun.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Stun.uasset new file mode 100644 index 00000000..3d186855 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Stun.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Walking.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Walking.uasset new file mode 100644 index 00000000..aa3b1775 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_Walking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_hit.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_hit.uasset new file mode 100644 index 00000000..b41f7b6b Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/A_UGC_JGSL4_hit.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/SK_JGSL4.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/SK_JGSL4.uasset new file mode 100644 index 00000000..67696a64 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/SK_JGSL4.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/SK_UGC_JGSL4.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/SK_UGC_JGSL4.uasset new file mode 100644 index 00000000..0a54b28a Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/SK_UGC_JGSL4.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/4/Animation/SM_UGC_JGSL4_WUQI.uasset b/GZJ/Asset/Animation/ShouLing/4/Animation/SM_UGC_JGSL4_WUQI.uasset new file mode 100644 index 00000000..246a8c1c Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/4/Animation/SM_UGC_JGSL4_WUQI.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking.uasset new file mode 100644 index 00000000..83ff7bc2 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking01.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking01.uasset new file mode 100644 index 00000000..d27bc2c4 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking01.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking01_Montage.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking01_Montage.uasset new file mode 100644 index 00000000..04c64349 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking01_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking_Montage.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking_Montage.uasset new file mode 100644 index 00000000..51941e36 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Hit.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Hit.uasset new file mode 100644 index 00000000..cd188130 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Hit.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Running.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Running.uasset new file mode 100644 index 00000000..3247f118 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Running.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Walking.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Walking.uasset new file mode 100644 index 00000000..30b004fb Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_JGSL5_Walking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Casting.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Casting.uasset new file mode 100644 index 00000000..decd7237 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Casting.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Dying.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Dying.uasset new file mode 100644 index 00000000..9952fe8f Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Dying.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Dying_Montage.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Dying_Montage.uasset new file mode 100644 index 00000000..62271729 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Standing.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Standing.uasset new file mode 100644 index 00000000..4951c401 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_Standing.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_dizzy_ue.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_dizzy_ue.uasset new file mode 100644 index 00000000..98f33ca5 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/A_UGC_JGSL05_dizzy_ue.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/SK_JGSL5.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/SK_JGSL5.uasset new file mode 100644 index 00000000..6663a25a Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/SK_JGSL5.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/SM_UGC_JGSL5_WUQI.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/SM_UGC_JGSL5_WUQI.uasset new file mode 100644 index 00000000..1eb162fd Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/SM_UGC_JGSL5_WUQI.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/5/Animation/Sk_UGC_JGSL5.uasset b/GZJ/Asset/Animation/ShouLing/5/Animation/Sk_UGC_JGSL5.uasset new file mode 100644 index 00000000..01d1da56 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/5/Animation/Sk_UGC_JGSL5.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking.uasset new file mode 100644 index 00000000..d11194bc Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking02.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking02.uasset new file mode 100644 index 00000000..2686ca49 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking02.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking02_Montage.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking02_Montage.uasset new file mode 100644 index 00000000..a1d9618f Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking02_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking_Montage.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking_Montage.uasset new file mode 100644 index 00000000..05167222 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Hit.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Hit.uasset new file mode 100644 index 00000000..ec34a0d4 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_Hit.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump.uasset new file mode 100644 index 00000000..857dfbba Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump_02.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump_02.uasset new file mode 100644 index 00000000..54834183 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump_02.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump_02_Montage.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump_02_Montage.uasset new file mode 100644 index 00000000..ef6a5eb4 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UCG_JGSL6_RIG_Attacking_jump_02_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Dying.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Dying.uasset new file mode 100644 index 00000000..ff60a890 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Dying.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Dying_Montage.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Dying_Montage.uasset new file mode 100644 index 00000000..496888b8 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Runing.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Runing.uasset new file mode 100644 index 00000000..af46ed07 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Runing.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Standing.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Standing.uasset new file mode 100644 index 00000000..eb02e5d8 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Standing.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Walking.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Walking.uasset new file mode 100644 index 00000000..8e16fef8 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC_JGSL6_Walking.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC__JGSL06_dizzy_ue.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC__JGSL06_dizzy_ue.uasset new file mode 100644 index 00000000..6b98b6f5 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/A_UGC__JGSL06_dizzy_ue.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/SK_JGSL06.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/SK_JGSL06.uasset new file mode 100644 index 00000000..477fc53d Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/SK_JGSL06.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/SK_UGC_JGSL06.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/SK_UGC_JGSL06.uasset new file mode 100644 index 00000000..09d8bbcc Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/SK_UGC_JGSL06.uasset differ diff --git a/GZJ/Asset/Animation/ShouLing/6/Animation/SM_UGC_JGSL06_WUQI.uasset b/GZJ/Asset/Animation/ShouLing/6/Animation/SM_UGC_JGSL06_WUQI.uasset new file mode 100644 index 00000000..83c4f4c7 Binary files /dev/null and b/GZJ/Asset/Animation/ShouLing/6/Animation/SM_UGC_JGSL06_WUQI.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_D.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_D.uasset new file mode 100644 index 00000000..c1bb7088 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_N.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_N.uasset new file mode 100644 index 00000000..2c5c58e6 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_RMA.uasset new file mode 100644 index 00000000..2d07bf05 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL2_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_D.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_D.uasset new file mode 100644 index 00000000..051487c5 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_N.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_N.uasset new file mode 100644 index 00000000..2ef172b5 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_RMA.uasset new file mode 100644 index 00000000..7a9341d9 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL5_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_D.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_D.uasset new file mode 100644 index 00000000..c146bf46 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_N.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_N.uasset new file mode 100644 index 00000000..3d340d05 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_RMA.uasset new file mode 100644 index 00000000..532e7fed Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UCG_JGSL6_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_D.uasset new file mode 100644 index 00000000..52bbd086 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_N.uasset new file mode 100644 index 00000000..7ec965dd Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_RMA.uasset new file mode 100644 index 00000000..7c361555 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_CCJJG_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_D.uasset new file mode 100644 index 00000000..2ba4a0ba Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_N.uasset new file mode 100644 index 00000000..aa419a0e Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_RMA.uasset new file mode 100644 index 00000000..ea64fbd6 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_DJTPG_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_FYG_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_FYG_D.uasset new file mode 100644 index 00000000..2fdf2acf Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_FYG_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_FYG_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_FYG_N.uasset new file mode 100644 index 00000000..72e7e429 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_FYG_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_FYG_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_FYG_RMA.uasset new file mode 100644 index 00000000..bddba159 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_FYG_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_D.uasset new file mode 100644 index 00000000..e6288046 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_N.uasset new file mode 100644 index 00000000..cd46fdf4 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_RMA.uasset new file mode 100644 index 00000000..719129af Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL1_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_D.uasset new file mode 100644 index 00000000..f9a221ce Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_N.uasset new file mode 100644 index 00000000..bfca7ad0 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_RMA.uasset new file mode 100644 index 00000000..bac45415 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL3_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_D.uasset new file mode 100644 index 00000000..b3046075 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_N.uasset new file mode 100644 index 00000000..730ea74e Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_RMA.uasset new file mode 100644 index 00000000..bd7057c5 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGSL4_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGXG_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGXG_D.uasset new file mode 100644 index 00000000..b6482f67 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGXG_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGXG_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGXG_N.uasset new file mode 100644 index 00000000..6ebd84f5 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGXG_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_JGXG_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_JGXG_RMA.uasset new file mode 100644 index 00000000..01dbf391 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_JGXG_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_D.uasset new file mode 100644 index 00000000..5b34db46 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_N.uasset new file mode 100644 index 00000000..05fd94f7 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_RMA.uasset new file mode 100644 index 00000000..f7fd61a4 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_LGFGW_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG1_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG1_D.uasset new file mode 100644 index 00000000..8e5ac6eb Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG1_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG1_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG1_N.uasset new file mode 100644 index 00000000..45e07a42 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG1_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG1_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG1_RMA.uasset new file mode 100644 index 00000000..c9c9fad7 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG1_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG2_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG2_D.uasset new file mode 100644 index 00000000..c20699d9 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG2_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG2_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG2_N.uasset new file mode 100644 index 00000000..9373dfb3 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG2_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG2_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG2_RMA.uasset new file mode 100644 index 00000000..340a32f3 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG2_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG4_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG4_D.uasset new file mode 100644 index 00000000..fc965c7a Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG4_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG4_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG4_N.uasset new file mode 100644 index 00000000..9ae1bfd3 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG4_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG4_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG4_RMA.uasset new file mode 100644 index 00000000..da217ae4 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG4_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG5_D.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG5_D.uasset new file mode 100644 index 00000000..33542314 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG5_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG5_N.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG5_N.uasset new file mode 100644 index 00000000..afb099f1 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG5_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/T_UGC_TZG5_RMA.uasset b/GZJ/Asset/Animation/Textures/T_UGC_TZG5_RMA.uasset new file mode 100644 index 00000000..a90449a3 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/T_UGC_TZG5_RMA.uasset differ diff --git a/GZJ/Asset/Animation/Textures/UGC_TZG3_D.uasset b/GZJ/Asset/Animation/Textures/UGC_TZG3_D.uasset new file mode 100644 index 00000000..c31884b9 Binary files /dev/null and b/GZJ/Asset/Animation/Textures/UGC_TZG3_D.uasset differ diff --git a/GZJ/Asset/Animation/Textures/UGC_TZG3_N.uasset b/GZJ/Asset/Animation/Textures/UGC_TZG3_N.uasset new file mode 100644 index 00000000..90916cdc Binary files /dev/null and b/GZJ/Asset/Animation/Textures/UGC_TZG3_N.uasset differ diff --git a/GZJ/Asset/Animation/Textures/UGC_TZG3_RMA.uasset b/GZJ/Asset/Animation/Textures/UGC_TZG3_RMA.uasset new file mode 100644 index 00000000..c9a37d1c Binary files /dev/null and b/GZJ/Asset/Animation/Textures/UGC_TZG3_RMA.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_Standing_ue.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_Standing_ue.uasset new file mode 100644 index 00000000..39035eac Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_Standing_ue.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_Walking.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_Walking.uasset new file mode 100644 index 00000000..1b7d52c6 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_Walking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_dizzy.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_dizzy.uasset new file mode 100644 index 00000000..c85be456 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG01_dizzy.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking.uasset new file mode 100644 index 00000000..fe11d89f Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking02.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking02.uasset new file mode 100644 index 00000000..2eb45de3 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking02.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking02_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking02_Montage.uasset new file mode 100644 index 00000000..5c0292c6 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking02_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking03.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking03.uasset new file mode 100644 index 00000000..e6adb9ac Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking03.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking_Montage.uasset new file mode 100644 index 00000000..f7f6c23f Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Dying.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Dying.uasset new file mode 100644 index 00000000..016e8070 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Dying.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Dying_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Dying_Montage.uasset new file mode 100644 index 00000000..7dbc1c65 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Hit.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Hit.uasset new file mode 100644 index 00000000..8b3a8e92 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Hit.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Running.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Running.uasset new file mode 100644 index 00000000..7ebe9bcd Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/A_UGC_TZG1_Running.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/SK_TZG1_2.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/SK_TZG1_2.uasset new file mode 100644 index 00000000..4bfee836 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/SK_TZG1_2.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/SK_TZG1_3.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/SK_TZG1_3.uasset new file mode 100644 index 00000000..6ad94526 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/SK_TZG1_3.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/SM_UGC_TZG1_WUQI_1.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/SM_UGC_TZG1_WUQI_1.uasset new file mode 100644 index 00000000..3cdb7f9d Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/SM_UGC_TZG1_WUQI_1.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/1/Animation/SM_UGC_TZG1_WUQI_2.uasset b/GZJ/Asset/Animation/TiaoZhan/1/Animation/SM_UGC_TZG1_WUQI_2.uasset new file mode 100644 index 00000000..5dcc7578 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/1/Animation/SM_UGC_TZG1_WUQI_2.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_ci.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_ci.uasset new file mode 100644 index 00000000..b5cb3627 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_ci.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_hui.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_hui.uasset new file mode 100644 index 00000000..efe35219 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_hui.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_hui_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_hui_Montage.uasset new file mode 100644 index 00000000..9ecaaa77 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Attacking_hui_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Dying.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Dying.uasset new file mode 100644 index 00000000..578ff928 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Dying.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Dying_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Dying_Montage.uasset new file mode 100644 index 00000000..e5974750 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Hit.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Hit.uasset new file mode 100644 index 00000000..d2590555 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Hit.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Idle.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Idle.uasset new file mode 100644 index 00000000..1f026187 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Idle.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Running.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Running.uasset new file mode 100644 index 00000000..be4c0638 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Running.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Stun.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Stun.uasset new file mode 100644 index 00000000..8e291d3b Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Stun.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Walking.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Walking.uasset new file mode 100644 index 00000000..4facf322 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/A_UGC_TZG2_Walking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/SK_TZG2.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/SK_TZG2.uasset new file mode 100644 index 00000000..7cfea5d4 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/SK_TZG2.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/SK_UGC_TZG2.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/SK_UGC_TZG2.uasset new file mode 100644 index 00000000..26d2e368 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/SK_UGC_TZG2.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/2/Animation/SM_UGC_TZG2_WUQI.uasset b/GZJ/Asset/Animation/TiaoZhan/2/Animation/SM_UGC_TZG2_WUQI.uasset new file mode 100644 index 00000000..82ad42c1 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/2/Animation/SM_UGC_TZG2_WUQI.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attack_shifa.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attack_shifa.uasset new file mode 100644 index 00000000..dcd61866 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attack_shifa.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attack_shifa_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attack_shifa_Montage.uasset new file mode 100644 index 00000000..9ee54068 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attack_shifa_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attacking.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attacking.uasset new file mode 100644 index 00000000..2dfbb6d4 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attacking_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attacking_Montage.uasset new file mode 100644 index 00000000..24571e4e Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Dying.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Dying.uasset new file mode 100644 index 00000000..78e0719e Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Dying.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Dying_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Dying_Montage.uasset new file mode 100644 index 00000000..1a496a76 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Hit.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Hit.uasset new file mode 100644 index 00000000..935ff012 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Hit.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Idle.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Idle.uasset new file mode 100644 index 00000000..53ee5fee Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Idle.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Running.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Running.uasset new file mode 100644 index 00000000..827f810c Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Running.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Stun.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Stun.uasset new file mode 100644 index 00000000..080c83c6 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Stun.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Walking.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Walking.uasset new file mode 100644 index 00000000..a90232b7 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/A_UGC_TZG3_Walking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/SK_TZG3.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/SK_TZG3.uasset new file mode 100644 index 00000000..7b673e3b Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/SK_TZG3.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/SK_UGC_TZG3.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/SK_UGC_TZG3.uasset new file mode 100644 index 00000000..fd5996b7 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/SK_UGC_TZG3.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/3/Animation/SM_UGC_TZG3_WUQI.uasset b/GZJ/Asset/Animation/TiaoZhan/3/Animation/SM_UGC_TZG3_WUQI.uasset new file mode 100644 index 00000000..0a76b1d4 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/3/Animation/SM_UGC_TZG3_WUQI.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking.uasset new file mode 100644 index 00000000..e4f3b44b Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking01.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking01.uasset new file mode 100644 index 00000000..e7b86cc7 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking01.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking02.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking02.uasset new file mode 100644 index 00000000..3b8c59e6 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking02.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking03.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking03.uasset new file mode 100644 index 00000000..b6967b72 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking03.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking03_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking03_Montage.uasset new file mode 100644 index 00000000..bc669967 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking03_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking_putong.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking_putong.uasset new file mode 100644 index 00000000..fa0f3701 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Attacking_putong.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Dying.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Dying.uasset new file mode 100644 index 00000000..e38609bd Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Dying.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Dying_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Dying_Montage.uasset new file mode 100644 index 00000000..616c88f1 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Hit.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Hit.uasset new file mode 100644 index 00000000..91231a5f Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Hit.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Idle.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Idle.uasset new file mode 100644 index 00000000..2b9b0a6e Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Idle.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Running.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Running.uasset new file mode 100644 index 00000000..b80db6d6 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Running.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Stun.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Stun.uasset new file mode 100644 index 00000000..a58fd294 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Stun.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Walking.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Walking.uasset new file mode 100644 index 00000000..cd8c3e55 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/A_UGC_TZG4_Walking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/M_UGC_TZG4_Attacking02.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/M_UGC_TZG4_Attacking02.uasset new file mode 100644 index 00000000..dad9326b Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/M_UGC_TZG4_Attacking02.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/4/Animation/SK_UGC_TZG4.uasset b/GZJ/Asset/Animation/TiaoZhan/4/Animation/SK_UGC_TZG4.uasset new file mode 100644 index 00000000..c1c06567 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/4/Animation/SK_UGC_TZG4.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Attacking.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Attacking.uasset new file mode 100644 index 00000000..bad87d88 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Attacking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Attacking_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Attacking_Montage.uasset new file mode 100644 index 00000000..d390df4d Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Attacking_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Dying.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Dying.uasset new file mode 100644 index 00000000..1dbd1a77 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Dying.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Dying_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Dying_Montage.uasset new file mode 100644 index 00000000..ae4beb79 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Dying_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Hit.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Hit.uasset new file mode 100644 index 00000000..3660c967 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Hit.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Idle.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Idle.uasset new file mode 100644 index 00000000..d4fcb17d Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Idle.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Running.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Running.uasset new file mode 100644 index 00000000..e71f24ea Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Running.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Stun.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Stun.uasset new file mode 100644 index 00000000..29def413 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Stun.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Walking.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Walking.uasset new file mode 100644 index 00000000..83f9e869 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG5_Walking.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_ci.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_ci.uasset new file mode 100644 index 00000000..bb562042 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_ci.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_ci_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_ci_Montage.uasset new file mode 100644 index 00000000..670b92df Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_ci_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_hui.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_hui.uasset new file mode 100644 index 00000000..99cf4a14 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_hui.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_hui_Montage.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_hui_Montage.uasset new file mode 100644 index 00000000..d3876df2 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/A_UGC_TZG6_Attacking_hui_Montage.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/SK_TZG5.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/SK_TZG5.uasset new file mode 100644 index 00000000..b21bb765 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/SK_TZG5.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/SK_UGC_TZG5.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/SK_UGC_TZG5.uasset new file mode 100644 index 00000000..c7ed6f6c Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/SK_UGC_TZG5.uasset differ diff --git a/GZJ/Asset/Animation/TiaoZhan/5/Animation/SM_UGC_TZG5_WUQI.uasset b/GZJ/Asset/Animation/TiaoZhan/5/Animation/SM_UGC_TZG5_WUQI.uasset new file mode 100644 index 00000000..a7cd0111 Binary files /dev/null and b/GZJ/Asset/Animation/TiaoZhan/5/Animation/SM_UGC_TZG5_WUQI.uasset differ diff --git a/GZJ/Asset/Animation/wuqi.uasset b/GZJ/Asset/Animation/wuqi.uasset new file mode 100644 index 00000000..7f9d8a30 Binary files /dev/null and b/GZJ/Asset/Animation/wuqi.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_BossBoorish.uasset b/GZJ/Asset/Blueprint/AI/AIC_BossBoorish.uasset new file mode 100644 index 00000000..ae7e6b85 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_BossBoorish.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_BossCareful.uasset b/GZJ/Asset/Blueprint/AI/AIC_BossCareful.uasset new file mode 100644 index 00000000..9c527396 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_BossCareful.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_BossCharm.uasset b/GZJ/Asset/Blueprint/AI/AIC_BossCharm.uasset new file mode 100644 index 00000000..ac9dcf3e Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_BossCharm.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_BossMagical.uasset b/GZJ/Asset/Blueprint/AI/AIC_BossMagical.uasset new file mode 100644 index 00000000..1e3b7297 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_BossMagical.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_BossMoment.uasset b/GZJ/Asset/Blueprint/AI/AIC_BossMoment.uasset new file mode 100644 index 00000000..b71424bf Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_BossMoment.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_BossSpring.uasset b/GZJ/Asset/Blueprint/AI/AIC_BossSpring.uasset new file mode 100644 index 00000000..befccb68 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_BossSpring.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_DullMonster.uasset b/GZJ/Asset/Blueprint/AI/AIC_DullMonster.uasset new file mode 100644 index 00000000..9c0b43dc Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_DullMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_IceZodiaca.uasset b/GZJ/Asset/Blueprint/AI/AIC_IceZodiaca.uasset new file mode 100644 index 00000000..2a2953fa Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_IceZodiaca.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterAccessoryMonster.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterAccessoryMonster.uasset new file mode 100644 index 00000000..fd5bcc82 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterAccessoryMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterBaseAttack.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterBaseAttack.uasset new file mode 100644 index 00000000..775a0e38 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterBaseAttack.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterExerciseRoom.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterExerciseRoom.uasset new file mode 100644 index 00000000..fbdc52d1 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterExerciseRoom.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterGoldEfficiencyMonster.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterGoldEfficiencyMonster.uasset new file mode 100644 index 00000000..cc615425 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterGoldEfficiencyMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterGoldMonster.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterGoldMonster.uasset new file mode 100644 index 00000000..ea81266b Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterGoldMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterGradeBreakthrough.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterGradeBreakthrough.uasset new file mode 100644 index 00000000..9b5f5e72 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterGradeBreakthrough.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterInherit_1.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterInherit_1.uasset new file mode 100644 index 00000000..b86a5c37 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterInherit_1.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterInherit_2.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterInherit_2.uasset new file mode 100644 index 00000000..012291a9 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterInherit_2.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterSkillMonster.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterSkillMonster.uasset new file mode 100644 index 00000000..0b0dca8b Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterSkillMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterUnseal.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterUnseal.uasset new file mode 100644 index 00000000..20e0edc4 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterUnseal.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_MonsterWeaponRecasting.uasset b/GZJ/Asset/Blueprint/AI/AIC_MonsterWeaponRecasting.uasset new file mode 100644 index 00000000..b373db66 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_MonsterWeaponRecasting.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_NormalMonster.uasset b/GZJ/Asset/Blueprint/AI/AIC_NormalMonster.uasset new file mode 100644 index 00000000..16c06d5d Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_NormalMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/AIC_TyrantMonster.uasset b/GZJ/Asset/Blueprint/AI/AIC_TyrantMonster.uasset new file mode 100644 index 00000000..11244690 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/AIC_TyrantMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_BossBoorish.uasset b/GZJ/Asset/Blueprint/AI/BB_BossBoorish.uasset new file mode 100644 index 00000000..4588cb2c Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_BossBoorish.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_BossCharm.uasset b/GZJ/Asset/Blueprint/AI/BB_BossCharm.uasset new file mode 100644 index 00000000..19daf6b8 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_BossCharm.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_BossMagical.uasset b/GZJ/Asset/Blueprint/AI/BB_BossMagical.uasset new file mode 100644 index 00000000..82cf8e6e Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_BossMagical.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_BossMoment.uasset b/GZJ/Asset/Blueprint/AI/BB_BossMoment.uasset new file mode 100644 index 00000000..0e16d7fa Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_BossMoment.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_BossSpring.uasset b/GZJ/Asset/Blueprint/AI/BB_BossSpring.uasset new file mode 100644 index 00000000..82347c39 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_BossSpring.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_BossUnseal.uasset b/GZJ/Asset/Blueprint/AI/BB_BossUnseal.uasset new file mode 100644 index 00000000..b0500e0b Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_BossUnseal.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_DullMonster.uasset b/GZJ/Asset/Blueprint/AI/BB_DullMonster.uasset new file mode 100644 index 00000000..d647e9ec Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_DullMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_MonsterAccessoryMonster.uasset b/GZJ/Asset/Blueprint/AI/BB_MonsterAccessoryMonster.uasset new file mode 100644 index 00000000..18a38f85 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_MonsterAccessoryMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_MonsterBaseAttack.uasset b/GZJ/Asset/Blueprint/AI/BB_MonsterBaseAttack.uasset new file mode 100644 index 00000000..7e63374f Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_MonsterBaseAttack.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_MonsterBreach.uasset b/GZJ/Asset/Blueprint/AI/BB_MonsterBreach.uasset new file mode 100644 index 00000000..abdcc2da Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_MonsterBreach.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_MonsterChallenge.uasset b/GZJ/Asset/Blueprint/AI/BB_MonsterChallenge.uasset new file mode 100644 index 00000000..2b48c7df Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_MonsterChallenge.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_MonsterExerciseRoom.uasset b/GZJ/Asset/Blueprint/AI/BB_MonsterExerciseRoom.uasset new file mode 100644 index 00000000..8e80f819 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_MonsterExerciseRoom.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_MonsterGoldMonster.uasset b/GZJ/Asset/Blueprint/AI/BB_MonsterGoldMonster.uasset new file mode 100644 index 00000000..61c034b3 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_MonsterGoldMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_MonsterWeaponRecasting.uasset b/GZJ/Asset/Blueprint/AI/BB_MonsterWeaponRecasting.uasset new file mode 100644 index 00000000..0a274e11 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_MonsterWeaponRecasting.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_NormalMonster.uasset b/GZJ/Asset/Blueprint/AI/BB_NormalMonster.uasset new file mode 100644 index 00000000..b530172f Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_NormalMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BB_TyrantMonster.uasset b/GZJ/Asset/Blueprint/AI/BB_TyrantMonster.uasset new file mode 100644 index 00000000..6752ebc0 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BB_TyrantMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTAttachment_FindExerciseRoomPlayer.uasset b/GZJ/Asset/Blueprint/AI/BTAttachment_FindExerciseRoomPlayer.uasset new file mode 100644 index 00000000..4c780a37 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTAttachment_FindExerciseRoomPlayer.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTAttachment_FindTarget.uasset b/GZJ/Asset/Blueprint/AI/BTAttachment_FindTarget.uasset new file mode 100644 index 00000000..61552433 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTAttachment_FindTarget.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTC_BlackboardBool.uasset b/GZJ/Asset/Blueprint/AI/BTC_BlackboardBool.uasset new file mode 100644 index 00000000..a3cbf2ef Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTC_BlackboardBool.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTC_EquationInt.uasset b/GZJ/Asset/Blueprint/AI/BTC_EquationInt.uasset new file mode 100644 index 00000000..941777e0 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTC_EquationInt.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTT_AccessoryMonster_Whirlwind.uasset b/GZJ/Asset/Blueprint/AI/BTT_AccessoryMonster_Whirlwind.uasset new file mode 100644 index 00000000..9e2451d8 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTT_AccessoryMonster_Whirlwind.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTT_BossBoorishBaseSkill.uasset b/GZJ/Asset/Blueprint/AI/BTT_BossBoorishBaseSkill.uasset new file mode 100644 index 00000000..b50ffe62 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTT_BossBoorishBaseSkill.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTT_BossCharmPlayCurseSkill.uasset b/GZJ/Asset/Blueprint/AI/BTT_BossCharmPlayCurseSkill.uasset new file mode 100644 index 00000000..97397156 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTT_BossCharmPlayCurseSkill.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTT_BossCharmPlayMarshSkill.uasset b/GZJ/Asset/Blueprint/AI/BTT_BossCharmPlayMarshSkill.uasset new file mode 100644 index 00000000..b1b9bfe4 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTT_BossCharmPlayMarshSkill.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTT_BossMomentPlayStormWind.uasset b/GZJ/Asset/Blueprint/AI/BTT_BossMomentPlayStormWind.uasset new file mode 100644 index 00000000..6fea3a4e Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTT_BossMomentPlayStormWind.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTT_BossSpringSkill.uasset b/GZJ/Asset/Blueprint/AI/BTT_BossSpringSkill.uasset new file mode 100644 index 00000000..9c217600 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTT_BossSpringSkill.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTT_SelectSkill.uasset b/GZJ/Asset/Blueprint/AI/BTT_SelectSkill.uasset new file mode 100644 index 00000000..ca3c0a15 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTT_SelectSkill.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BTT_SkillCount.uasset b/GZJ/Asset/Blueprint/AI/BTT_SkillCount.uasset new file mode 100644 index 00000000..18670a74 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BTT_SkillCount.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_BossBoorish.uasset b/GZJ/Asset/Blueprint/AI/BT_BossBoorish.uasset new file mode 100644 index 00000000..d7f4ca60 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_BossBoorish.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_BossCareful.uasset b/GZJ/Asset/Blueprint/AI/BT_BossCareful.uasset new file mode 100644 index 00000000..2bd0d3af Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_BossCareful.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_BossCharm.uasset b/GZJ/Asset/Blueprint/AI/BT_BossCharm.uasset new file mode 100644 index 00000000..6ec19f64 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_BossCharm.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_BossMagical.uasset b/GZJ/Asset/Blueprint/AI/BT_BossMagical.uasset new file mode 100644 index 00000000..61b6d675 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_BossMagical.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_BossMoment.uasset b/GZJ/Asset/Blueprint/AI/BT_BossMoment.uasset new file mode 100644 index 00000000..30fdcb22 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_BossMoment.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_BossSpring.uasset b/GZJ/Asset/Blueprint/AI/BT_BossSpring.uasset new file mode 100644 index 00000000..eb507e6b Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_BossSpring.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_BossUnseal.uasset b/GZJ/Asset/Blueprint/AI/BT_BossUnseal.uasset new file mode 100644 index 00000000..ae38ff6c Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_BossUnseal.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_DullMonster.uasset b/GZJ/Asset/Blueprint/AI/BT_DullMonster.uasset new file mode 100644 index 00000000..c68cfda8 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_DullMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_IceZodiacaMonster.uasset b/GZJ/Asset/Blueprint/AI/BT_IceZodiacaMonster.uasset new file mode 100644 index 00000000..eff0394c Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_IceZodiacaMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterAccessoryMonster.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterAccessoryMonster.uasset new file mode 100644 index 00000000..eb3fbfeb Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterAccessoryMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterBaseAttack.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterBaseAttack.uasset new file mode 100644 index 00000000..af2a9aee Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterBaseAttack.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterExerciseRoom.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterExerciseRoom.uasset new file mode 100644 index 00000000..39a72206 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterExerciseRoom.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterGoldEfficiencyMonster.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterGoldEfficiencyMonster.uasset new file mode 100644 index 00000000..180136c2 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterGoldEfficiencyMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterGoldMonster.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterGoldMonster.uasset new file mode 100644 index 00000000..11898820 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterGoldMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterGradeBreakthrough.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterGradeBreakthrough.uasset new file mode 100644 index 00000000..2d692a9d Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterGradeBreakthrough.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterInherit_1.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterInherit_1.uasset new file mode 100644 index 00000000..735f3cc5 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterInherit_1.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterInherit_2.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterInherit_2.uasset new file mode 100644 index 00000000..8f226f2a Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterInherit_2.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterSkillMonster.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterSkillMonster.uasset new file mode 100644 index 00000000..636b0967 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterSkillMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_MonsterWeaponRecasting.uasset b/GZJ/Asset/Blueprint/AI/BT_MonsterWeaponRecasting.uasset new file mode 100644 index 00000000..0619f6e4 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_MonsterWeaponRecasting.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_NormalMonster.uasset b/GZJ/Asset/Blueprint/AI/BT_NormalMonster.uasset new file mode 100644 index 00000000..b3ca56d1 Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_NormalMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/AI/BT_TyrantMonster.uasset b/GZJ/Asset/Blueprint/AI/BT_TyrantMonster.uasset new file mode 100644 index 00000000..986a8e6e Binary files /dev/null and b/GZJ/Asset/Blueprint/AI/BT_TyrantMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Item/BP_ItemActorBase.uasset b/GZJ/Asset/Blueprint/Item/BP_ItemActorBase.uasset new file mode 100644 index 00000000..202b71d8 Binary files /dev/null and b/GZJ/Asset/Blueprint/Item/BP_ItemActorBase.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Anim/NewAnimMontage.uasset b/GZJ/Asset/Blueprint/Monster/Anim/NewAnimMontage.uasset new file mode 100644 index 00000000..48bbd119 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Anim/NewAnimMontage.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_ActiveMonsterBase.uasset b/GZJ/Asset/Blueprint/Monster/BP_ActiveMonsterBase.uasset new file mode 100644 index 00000000..640d730a Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_ActiveMonsterBase.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_BossBoorish.uasset b/GZJ/Asset/Blueprint/Monster/BP_BossBoorish.uasset new file mode 100644 index 00000000..23368d15 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_BossBoorish.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_BossCareful.uasset b/GZJ/Asset/Blueprint/Monster/BP_BossCareful.uasset new file mode 100644 index 00000000..6e4accbb Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_BossCareful.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_BossCharm.uasset b/GZJ/Asset/Blueprint/Monster/BP_BossCharm.uasset new file mode 100644 index 00000000..82f571fe Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_BossCharm.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_BossMagical.uasset b/GZJ/Asset/Blueprint/Monster/BP_BossMagical.uasset new file mode 100644 index 00000000..65a6c483 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_BossMagical.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_BossMoment.uasset b/GZJ/Asset/Blueprint/Monster/BP_BossMoment.uasset new file mode 100644 index 00000000..a64eaa30 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_BossMoment.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_BossSpring.uasset b/GZJ/Asset/Blueprint/Monster/BP_BossSpring.uasset new file mode 100644 index 00000000..42b235b7 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_BossSpring.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_DelaySpawnActor.uasset b/GZJ/Asset/Blueprint/Monster/BP_DelaySpawnActor.uasset new file mode 100644 index 00000000..24386ce0 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_DelaySpawnActor.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_DullMonster1.uasset b/GZJ/Asset/Blueprint/Monster/BP_DullMonster1.uasset new file mode 100644 index 00000000..467368f3 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_DullMonster1.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_IceZodiacaBase.uasset b/GZJ/Asset/Blueprint/Monster/BP_IceZodiacaBase.uasset new file mode 100644 index 00000000..0d55dc95 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_IceZodiacaBase.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterAccessoryMonster.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterAccessoryMonster.uasset new file mode 100644 index 00000000..0782d27a Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterAccessoryMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterAttack.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterAttack.uasset new file mode 100644 index 00000000..d6417d80 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterAttack.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterBase.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterBase.uasset new file mode 100644 index 00000000..f389434d Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterBase.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterBoss.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterBoss.uasset new file mode 100644 index 00000000..c394151b Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterBoss.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterBreach.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterBreach.uasset new file mode 100644 index 00000000..0cd1f35d Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterBreach.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterChallenge.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterChallenge.uasset new file mode 100644 index 00000000..007e6294 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterChallenge.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterExerciseRoom.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterExerciseRoom.uasset new file mode 100644 index 00000000..7cd65a60 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterExerciseRoom.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterGoldEfficiencyMonster.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterGoldEfficiencyMonster.uasset new file mode 100644 index 00000000..e3d51cde Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterGoldEfficiencyMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterGoldMonster.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterGoldMonster.uasset new file mode 100644 index 00000000..6d3cb84b Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterGoldMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterGradeBreakthrough.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterGradeBreakthrough.uasset new file mode 100644 index 00000000..cb055c26 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterGradeBreakthrough.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterInherit_1.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterInherit_1.uasset new file mode 100644 index 00000000..27238b10 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterInherit_1.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterInherit_2.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterInherit_2.uasset new file mode 100644 index 00000000..cd7cf4fa Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterInherit_2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleBase.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleBase.uasset new file mode 100644 index 00000000..d810efee Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleBase.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster.uasset new file mode 100644 index 00000000..483d295f Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster2.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster2.uasset new file mode 100644 index 00000000..882da18f Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster3.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster3.uasset new file mode 100644 index 00000000..22559acb Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster3.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster6.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster6.uasset new file mode 100644 index 00000000..bf9222fb Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterLittleMonster6.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterSkillMonster.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterSkillMonster.uasset new file mode 100644 index 00000000..d8f99ac7 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterSkillMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterUnseal.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterUnseal.uasset new file mode 100644 index 00000000..ab1d7bb4 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterUnseal.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_MonsterWeaponRecasting.uasset b/GZJ/Asset/Blueprint/Monster/BP_MonsterWeaponRecasting.uasset new file mode 100644 index 00000000..a379f313 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_MonsterWeaponRecasting.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_NormalMonster.uasset b/GZJ/Asset/Blueprint/Monster/BP_NormalMonster.uasset new file mode 100644 index 00000000..9f2defd5 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_NormalMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_TyrantMonster.uasset b/GZJ/Asset/Blueprint/Monster/BP_TyrantMonster.uasset new file mode 100644 index 00000000..509e8a54 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_TyrantMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_TyrantMonster_2.uasset b/GZJ/Asset/Blueprint/Monster/BP_TyrantMonster_2.uasset new file mode 100644 index 00000000..ce8efb40 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_TyrantMonster_2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/BP_VenomMonster.uasset b/GZJ/Asset/Blueprint/Monster/BP_VenomMonster.uasset new file mode 100644 index 00000000..92920c84 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/BP_VenomMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/BP_Whirlwind.uasset b/GZJ/Asset/Blueprint/Monster/Skill/BP_Whirlwind.uasset new file mode 100644 index 00000000..4c3b6a73 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/BP_Whirlwind.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Action/SkillAction_BossBoorish.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Action/SkillAction_BossBoorish.uasset new file mode 100644 index 00000000..36b191c0 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Action/SkillAction_BossBoorish.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Action/SkillAction_Boss_CharmCurse.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Action/SkillAction_Boss_CharmCurse.uasset new file mode 100644 index 00000000..ef1490ad Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Action/SkillAction_Boss_CharmCurse.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_AccessoryMonster_Whirlwind.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_AccessoryMonster_Whirlwind.uasset new file mode 100644 index 00000000..0266ac37 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_AccessoryMonster_Whirlwind.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorish.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorish.uasset new file mode 100644 index 00000000..370609fb Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorish.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishBase.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishBase.uasset new file mode 100644 index 00000000..6b265786 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishBase.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishSkill1.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishSkill1.uasset new file mode 100644 index 00000000..cf0443c5 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishSkill1.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishSkill2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishSkill2.uasset new file mode 100644 index 00000000..563bf082 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossBoorishSkill2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCarefulSkill.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCarefulSkill.uasset new file mode 100644 index 00000000..8c313493 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCarefulSkill.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCharmSkill1.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCharmSkill1.uasset new file mode 100644 index 00000000..300f9534 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCharmSkill1.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCharmSkill2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCharmSkill2.uasset new file mode 100644 index 00000000..d4207e56 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossCharmSkill2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMagicalSkillBase.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMagicalSkillBase.uasset new file mode 100644 index 00000000..518ae067 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMagicalSkillBase.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMagicalSkill_2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMagicalSkill_2.uasset new file mode 100644 index 00000000..67c584b0 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMagicalSkill_2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMomentSkill1.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMomentSkill1.uasset new file mode 100644 index 00000000..cbec1d7b Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMomentSkill1.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMomentSkill2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMomentSkill2.uasset new file mode 100644 index 00000000..36a4142e Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMomentSkill2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMoment_Base.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMoment_Base.uasset new file mode 100644 index 00000000..7f91db58 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossMoment_Base.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossSpring.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossSpring.uasset new file mode 100644 index 00000000..13abbb79 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_BossSpring.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_CharmCurse.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_CharmCurse.uasset new file mode 100644 index 00000000..fce34e4e Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Boss/Skill_CharmCurse.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V2.uasset new file mode 100644 index 00000000..ff790fab Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V3.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V3.uasset new file mode 100644 index 00000000..4314b591 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V3.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_AccessoryMonster_Whirlwind.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_AccessoryMonster_Whirlwind.uasset new file mode 100644 index 00000000..2fc79e10 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_AccessoryMonster_Whirlwind.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterAccessoryMonster.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterAccessoryMonster.uasset new file mode 100644 index 00000000..c592b12a Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterAccessoryMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterAccessoryMonster_Wind.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterAccessoryMonster_Wind.uasset new file mode 100644 index 00000000..6bdda986 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterAccessoryMonster_Wind.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterGoldEfficiency.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterGoldEfficiency.uasset new file mode 100644 index 00000000..2fed5192 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterGoldEfficiency.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterGoldMonster.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterGoldMonster.uasset new file mode 100644 index 00000000..8d02ffa5 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterGoldMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster.uasset new file mode 100644 index 00000000..0ad5d5ae Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_2.uasset new file mode 100644 index 00000000..73dc99e4 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_3.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_3.uasset new file mode 100644 index 00000000..7aaa5e90 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_3.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_4.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_4.uasset new file mode 100644 index 00000000..fe0ec698 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_4.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_5.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_5.uasset new file mode 100644 index 00000000..7147b35c Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterLittleMonster_5.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterSkillMonster.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterSkillMonster.uasset new file mode 100644 index 00000000..a9d4825f Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterSkillMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecasting.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecasting.uasset new file mode 100644 index 00000000..58ac89f3 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecasting.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecastingMonster.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecastingMonster.uasset new file mode 100644 index 00000000..b421bdd4 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecastingMonster.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecastingMonster_IncreaseSpeed.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecastingMonster_IncreaseSpeed.uasset new file mode 100644 index 00000000..b6975b8d Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecastingMonster_IncreaseSpeed.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecasting_IncreaseSpeed.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecasting_IncreaseSpeed.uasset new file mode 100644 index 00000000..4a3191e0 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_MonsterWeaponRecasting_IncreaseSpeed.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_NormalAttack_V2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_NormalAttack_V2.uasset new file mode 100644 index 00000000..7ee45e44 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_NormalAttack_V2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_NormalAttack_V3.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_NormalAttack_V3.uasset new file mode 100644 index 00000000..199443fe Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_NormalAttack_V3.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_SpeedBrother_Base_V2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_SpeedBrother_Base_V2.uasset new file mode 100644 index 00000000..b08f0f2e Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_SpeedBrother_Base_V2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_SpeedBrother_Base_V3.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_SpeedBrother_Base_V3.uasset new file mode 100644 index 00000000..ac7f710d Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_SpeedBrother_Base_V3.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase.uasset new file mode 100644 index 00000000..49cb4740 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_IncreaseSpeed.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_IncreaseSpeed.uasset new file mode 100644 index 00000000..40820c11 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_IncreaseSpeed.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_IncreaseSpeed_NotInArena.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_IncreaseSpeed_NotInArena.uasset new file mode 100644 index 00000000..0ca54759 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_IncreaseSpeed_NotInArena.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_NotInArena.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_NotInArena.uasset new file mode 100644 index 00000000..46edf70f Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Monster/Skill_TyrantBase_NotInArena.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Skill_NormalAttack.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Skill_NormalAttack.uasset new file mode 100644 index 00000000..cea6ec1d Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Skill_NormalAttack.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack1.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack1.uasset new file mode 100644 index 00000000..dccdcdb5 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack1.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack1_IncreaseSpeed.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack1_IncreaseSpeed.uasset new file mode 100644 index 00000000..52988b38 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack1_IncreaseSpeed.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack2.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack2.uasset new file mode 100644 index 00000000..9c2d654b Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack2.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack2_IncreaseSpeed.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack2_IncreaseSpeed.uasset new file mode 100644 index 00000000..2a2144cf Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack2_IncreaseSpeed.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack3.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack3.uasset new file mode 100644 index 00000000..f72c3a46 Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack3.uasset differ diff --git a/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack3_IncreaseSpeed.uasset b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack3_IncreaseSpeed.uasset new file mode 100644 index 00000000..b4c0887a Binary files /dev/null and b/GZJ/Asset/Blueprint/Monster/Skill/Tyrant/Skill_TyrantAttack3_IncreaseSpeed.uasset differ diff --git a/GZJ/Asset/Blueprint/Player/BP_PlayerController.uasset b/GZJ/Asset/Blueprint/Player/BP_PlayerController.uasset new file mode 100644 index 00000000..3174407c Binary files /dev/null and b/GZJ/Asset/Blueprint/Player/BP_PlayerController.uasset differ diff --git a/GZJ/Asset/Blueprint/Player/BP_PlayerPawn.uasset b/GZJ/Asset/Blueprint/Player/BP_PlayerPawn.uasset new file mode 100644 index 00000000..cc27a1fe Binary files /dev/null and b/GZJ/Asset/Blueprint/Player/BP_PlayerPawn.uasset differ diff --git a/GZJ/Asset/Blueprint/Player/BP_PlayerState.uasset b/GZJ/Asset/Blueprint/Player/BP_PlayerState.uasset new file mode 100644 index 00000000..32aeb494 Binary files /dev/null and b/GZJ/Asset/Blueprint/Player/BP_PlayerState.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/BP_ArenaArea.uasset b/GZJ/Asset/Blueprint/SceneObject/BP_ArenaArea.uasset new file mode 100644 index 00000000..947696ef Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/BP_ArenaArea.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/BP_Crystal.uasset b/GZJ/Asset/Blueprint/SceneObject/BP_Crystal.uasset new file mode 100644 index 00000000..62f1521b Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/BP_Crystal.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/BP_KillBox.uasset b/GZJ/Asset/Blueprint/SceneObject/BP_KillBox.uasset new file mode 100644 index 00000000..1a63d27c Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/BP_KillBox.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/BP_MonsterSpawner.uasset b/GZJ/Asset/Blueprint/SceneObject/BP_MonsterSpawner.uasset new file mode 100644 index 00000000..c577b843 Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/BP_MonsterSpawner.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/BP_Teleporter.uasset b/GZJ/Asset/Blueprint/SceneObject/BP_Teleporter.uasset new file mode 100644 index 00000000..d3c85039 Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/BP_Teleporter.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_Actor.uasset b/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_Actor.uasset new file mode 100644 index 00000000..88612c05 Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_Actor.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_FireDomain.uasset b/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_FireDomain.uasset new file mode 100644 index 00000000..82aee957 Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_FireDomain.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_IceFrost.uasset b/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_IceFrost.uasset new file mode 100644 index 00000000..2c0d7896 Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_IceFrost.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_ToxicRain.uasset b/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_ToxicRain.uasset new file mode 100644 index 00000000..3a7127e9 Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/SkillActor/BP_Skill_ToxicRain.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_01.uasset b/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_01.uasset new file mode 100644 index 00000000..1037c59d Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_01.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_02.uasset b/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_02.uasset new file mode 100644 index 00000000..6c6c9eba Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_02.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_03.uasset b/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_03.uasset new file mode 100644 index 00000000..44961a26 Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_03.uasset differ diff --git a/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_4.uasset b/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_4.uasset new file mode 100644 index 00000000..da27befd Binary files /dev/null and b/GZJ/Asset/Blueprint/SceneObject/TeleporterResources/P_Teleporter_4.uasset differ diff --git a/GZJ/Asset/Blueprint/UGCDamageNumber.uasset b/GZJ/Asset/Blueprint/UGCDamageNumber.uasset new file mode 100644 index 00000000..3d7f5ae2 Binary files /dev/null and b/GZJ/Asset/Blueprint/UGCDamageNumber.uasset differ diff --git a/GZJ/Asset/Blueprint/UGCGameMode.uasset b/GZJ/Asset/Blueprint/UGCGameMode.uasset new file mode 100644 index 00000000..1802f733 Binary files /dev/null and b/GZJ/Asset/Blueprint/UGCGameMode.uasset differ diff --git a/GZJ/Asset/Blueprint/UGCGameState.uasset b/GZJ/Asset/Blueprint/UGCGameState.uasset new file mode 100644 index 00000000..0983b102 Binary files /dev/null and b/GZJ/Asset/Blueprint/UGCGameState.uasset differ diff --git a/GZJ/Asset/Blueprint/UGCHUD.uasset b/GZJ/Asset/Blueprint/UGCHUD.uasset new file mode 100644 index 00000000..93979d73 Binary files /dev/null and b/GZJ/Asset/Blueprint/UGCHUD.uasset differ diff --git a/GZJ/Asset/Blueprint/UGCLevelDirector.uasset b/GZJ/Asset/Blueprint/UGCLevelDirector.uasset new file mode 100644 index 00000000..d4cdf80d Binary files /dev/null and b/GZJ/Asset/Blueprint/UGCLevelDirector.uasset differ diff --git a/GZJ/Asset/Blueprint/UGCPlayerCamera.uasset b/GZJ/Asset/Blueprint/UGCPlayerCamera.uasset new file mode 100644 index 00000000..7d289943 Binary files /dev/null and b/GZJ/Asset/Blueprint/UGCPlayerCamera.uasset differ diff --git a/GZJ/Asset/Blueprint/UGCPlayerStart.uasset b/GZJ/Asset/Blueprint/UGCPlayerStart.uasset new file mode 100644 index 00000000..b812ca4f Binary files /dev/null and b/GZJ/Asset/Blueprint/UGCPlayerStart.uasset differ diff --git a/GZJ/Asset/Blueprint/UGCPlayerStartManager.uasset b/GZJ/Asset/Blueprint/UGCPlayerStartManager.uasset new file mode 100644 index 00000000..ff72fa4e Binary files /dev/null and b/GZJ/Asset/Blueprint/UGCPlayerStartManager.uasset differ diff --git a/GZJ/Asset/Blueprint/Weapon/BP_WeaponPawnBase.uasset b/GZJ/Asset/Blueprint/Weapon/BP_WeaponPawnBase.uasset new file mode 100644 index 00000000..3dc14c4a Binary files /dev/null and b/GZJ/Asset/Blueprint/Weapon/BP_WeaponPawnBase.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EAttributeDisplayType.uasset b/GZJ/Asset/CSV/Enums/EAttributeDisplayType.uasset new file mode 100644 index 00000000..222fdcec Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EAttributeDisplayType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EBagOperateType.uasset b/GZJ/Asset/CSV/Enums/EBagOperateType.uasset new file mode 100644 index 00000000..cce10781 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EBagOperateType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ECustomNoticeType.uasset b/GZJ/Asset/CSV/Enums/ECustomNoticeType.uasset new file mode 100644 index 00000000..86dcd442 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ECustomNoticeType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EDropItemSet.uasset b/GZJ/Asset/CSV/Enums/EDropItemSet.uasset new file mode 100644 index 00000000..2dfeb8df Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EDropItemSet.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EEffectSpawnLocationType.uasset b/GZJ/Asset/CSV/Enums/EEffectSpawnLocationType.uasset new file mode 100644 index 00000000..768bcb23 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EEffectSpawnLocationType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EGameFightStage.uasset b/GZJ/Asset/CSV/Enums/EGameFightStage.uasset new file mode 100644 index 00000000..98b19824 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EGameFightStage.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EGameReadyStage.uasset b/GZJ/Asset/CSV/Enums/EGameReadyStage.uasset new file mode 100644 index 00000000..4959307a Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EGameReadyStage.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EGameStage.uasset b/GZJ/Asset/CSV/Enums/EGameStage.uasset new file mode 100644 index 00000000..37ceb6e7 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EGameStage.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EGeneralNoticeType.uasset b/GZJ/Asset/CSV/Enums/EGeneralNoticeType.uasset new file mode 100644 index 00000000..c2a78d99 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EGeneralNoticeType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EItemDropType.uasset b/GZJ/Asset/CSV/Enums/EItemDropType.uasset new file mode 100644 index 00000000..fde00949 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EItemDropType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EItemType.uasset b/GZJ/Asset/CSV/Enums/EItemType.uasset new file mode 100644 index 00000000..5f631232 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EItemType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EMonsterSpawnerType.uasset b/GZJ/Asset/CSV/Enums/EMonsterSpawnerType.uasset new file mode 100644 index 00000000..ccfeeab0 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EMonsterSpawnerType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EMonsterType.uasset b/GZJ/Asset/CSV/Enums/EMonsterType.uasset new file mode 100644 index 00000000..eed87240 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EMonsterType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EQualityType.uasset b/GZJ/Asset/CSV/Enums/EQualityType.uasset new file mode 100644 index 00000000..e7df8d2f Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EQualityType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ERollingNoticeType.uasset b/GZJ/Asset/CSV/Enums/ERollingNoticeType.uasset new file mode 100644 index 00000000..434d535c Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ERollingNoticeType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ESkillAccessType.uasset b/GZJ/Asset/CSV/Enums/ESkillAccessType.uasset new file mode 100644 index 00000000..6c4660ea Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ESkillAccessType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ESkillCastConditionType.uasset b/GZJ/Asset/CSV/Enums/ESkillCastConditionType.uasset new file mode 100644 index 00000000..3b5cbb56 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ESkillCastConditionType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ESkillName.uasset b/GZJ/Asset/CSV/Enums/ESkillName.uasset new file mode 100644 index 00000000..54e3f3e8 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ESkillName.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ESkillSelectorState.uasset b/GZJ/Asset/CSV/Enums/ESkillSelectorState.uasset new file mode 100644 index 00000000..6b2b9add Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ESkillSelectorState.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ESkillSelectorType.uasset b/GZJ/Asset/CSV/Enums/ESkillSelectorType.uasset new file mode 100644 index 00000000..6d9e9e23 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ESkillSelectorType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ESkillSlot.uasset b/GZJ/Asset/CSV/Enums/ESkillSlot.uasset new file mode 100644 index 00000000..694bf158 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ESkillSlot.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ESkillType.uasset b/GZJ/Asset/CSV/Enums/ESkillType.uasset new file mode 100644 index 00000000..88e8154a Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ESkillType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ETaskDurationPolicy.uasset b/GZJ/Asset/CSV/Enums/ETaskDurationPolicy.uasset new file mode 100644 index 00000000..b77feafd Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ETaskDurationPolicy.uasset differ diff --git a/GZJ/Asset/CSV/Enums/ETeleportType.uasset b/GZJ/Asset/CSV/Enums/ETeleportType.uasset new file mode 100644 index 00000000..84a9ef8f Binary files /dev/null and b/GZJ/Asset/CSV/Enums/ETeleportType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EUILayerGroup.uasset b/GZJ/Asset/CSV/Enums/EUILayerGroup.uasset new file mode 100644 index 00000000..9fdbcfbc Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EUILayerGroup.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EUIType.uasset b/GZJ/Asset/CSV/Enums/EUIType.uasset new file mode 100644 index 00000000..87e55b76 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EUIType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/EWeaponClassType.uasset b/GZJ/Asset/CSV/Enums/EWeaponClassType.uasset new file mode 100644 index 00000000..cac4789b Binary files /dev/null and b/GZJ/Asset/CSV/Enums/EWeaponClassType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/Guide/EGuideExistType.uasset b/GZJ/Asset/CSV/Enums/Guide/EGuideExistType.uasset new file mode 100644 index 00000000..87c92740 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/Guide/EGuideExistType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/Guide/EGuideTextType.uasset b/GZJ/Asset/CSV/Enums/Guide/EGuideTextType.uasset new file mode 100644 index 00000000..18e5609d Binary files /dev/null and b/GZJ/Asset/CSV/Enums/Guide/EGuideTextType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/Guide/EGuideTriggerType.uasset b/GZJ/Asset/CSV/Enums/Guide/EGuideTriggerType.uasset new file mode 100644 index 00000000..9ce8d715 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/Guide/EGuideTriggerType.uasset differ diff --git a/GZJ/Asset/CSV/Enums/Guide/EGuideWidgetType.uasset b/GZJ/Asset/CSV/Enums/Guide/EGuideWidgetType.uasset new file mode 100644 index 00000000..5697b392 Binary files /dev/null and b/GZJ/Asset/CSV/Enums/Guide/EGuideWidgetType.uasset differ diff --git a/GZJ/Asset/CSV/GameReadyStageConfigTable.uasset b/GZJ/Asset/CSV/GameReadyStageConfigTable.uasset new file mode 100644 index 00000000..75766449 Binary files /dev/null and b/GZJ/Asset/CSV/GameReadyStageConfigTable.uasset differ diff --git a/GZJ/Asset/CSV/ItemDataConfigTable.uasset b/GZJ/Asset/CSV/ItemDataConfigTable.uasset new file mode 100644 index 00000000..70bed93f Binary files /dev/null and b/GZJ/Asset/CSV/ItemDataConfigTable.uasset differ diff --git a/GZJ/Asset/CSV/ItemMeshConfigTable.uasset b/GZJ/Asset/CSV/ItemMeshConfigTable.uasset new file mode 100644 index 00000000..3c4e99a4 Binary files /dev/null and b/GZJ/Asset/CSV/ItemMeshConfigTable.uasset differ diff --git a/GZJ/Asset/CSV/SkillParamConfigTable.uasset b/GZJ/Asset/CSV/SkillParamConfigTable.uasset new file mode 100644 index 00000000..8e5b4f62 Binary files /dev/null and b/GZJ/Asset/CSV/SkillParamConfigTable.uasset differ diff --git a/GZJ/Asset/CSV/SkillTable.uasset b/GZJ/Asset/CSV/SkillTable.uasset new file mode 100644 index 00000000..5fe6c1b7 Binary files /dev/null and b/GZJ/Asset/CSV/SkillTable.uasset differ diff --git a/GZJ/Asset/CSV/Structs/FittingInfo.uasset b/GZJ/Asset/CSV/Structs/FittingInfo.uasset new file mode 100644 index 00000000..0e926ae0 Binary files /dev/null and b/GZJ/Asset/CSV/Structs/FittingInfo.uasset differ diff --git a/GZJ/Asset/CSV/Structs/GameReadyInfo.uasset b/GZJ/Asset/CSV/Structs/GameReadyInfo.uasset new file mode 100644 index 00000000..65bef64e Binary files /dev/null and b/GZJ/Asset/CSV/Structs/GameReadyInfo.uasset differ diff --git a/GZJ/Asset/CSV/Structs/ItemDataConfig.uasset b/GZJ/Asset/CSV/Structs/ItemDataConfig.uasset new file mode 100644 index 00000000..d6f2ae52 Binary files /dev/null and b/GZJ/Asset/CSV/Structs/ItemDataConfig.uasset differ diff --git a/GZJ/Asset/CSV/Structs/ItemMeshConfig.uasset b/GZJ/Asset/CSV/Structs/ItemMeshConfig.uasset new file mode 100644 index 00000000..3eaeb000 Binary files /dev/null and b/GZJ/Asset/CSV/Structs/ItemMeshConfig.uasset differ diff --git a/GZJ/Asset/CSV/Structs/SkillConfig.uasset b/GZJ/Asset/CSV/Structs/SkillConfig.uasset new file mode 100644 index 00000000..23411f93 Binary files /dev/null and b/GZJ/Asset/CSV/Structs/SkillConfig.uasset differ diff --git a/GZJ/Asset/CSV/Structs/SkillConfigParam.uasset b/GZJ/Asset/CSV/Structs/SkillConfigParam.uasset new file mode 100644 index 00000000..a7947623 Binary files /dev/null and b/GZJ/Asset/CSV/Structs/SkillConfigParam.uasset differ diff --git a/GZJ/Asset/CSV/Structs/SkillSelectorParam.uasset b/GZJ/Asset/CSV/Structs/SkillSelectorParam.uasset new file mode 100644 index 00000000..4784e110 Binary files /dev/null and b/GZJ/Asset/CSV/Structs/SkillSelectorParam.uasset differ diff --git a/GZJ/Asset/CSV/Structs/SkillTaskParam.uasset b/GZJ/Asset/CSV/Structs/SkillTaskParam.uasset new file mode 100644 index 00000000..d6f5422f Binary files /dev/null and b/GZJ/Asset/CSV/Structs/SkillTaskParam.uasset differ diff --git a/GZJ/Asset/CSV/Structs/WeaponConstructInfo.uasset b/GZJ/Asset/CSV/Structs/WeaponConstructInfo.uasset new file mode 100644 index 00000000..41fb1207 Binary files /dev/null and b/GZJ/Asset/CSV/Structs/WeaponConstructInfo.uasset differ diff --git a/GZJ/Asset/CSV/Structs/WeaponConstructPartInfo.uasset b/GZJ/Asset/CSV/Structs/WeaponConstructPartInfo.uasset new file mode 100644 index 00000000..12deb4ee Binary files /dev/null and b/GZJ/Asset/CSV/Structs/WeaponConstructPartInfo.uasset differ diff --git a/GZJ/Asset/CSV/Structs/WeaponInfo.uasset b/GZJ/Asset/CSV/Structs/WeaponInfo.uasset new file mode 100644 index 00000000..e6ddb5bc Binary files /dev/null and b/GZJ/Asset/CSV/Structs/WeaponInfo.uasset differ diff --git a/GZJ/Asset/CSV/Structs/WeaponPartMeshConfig.uasset b/GZJ/Asset/CSV/Structs/WeaponPartMeshConfig.uasset new file mode 100644 index 00000000..548678ae Binary files /dev/null and b/GZJ/Asset/CSV/Structs/WeaponPartMeshConfig.uasset differ diff --git a/GZJ/Asset/CSV/Structs/WeaponWithFittingsInfo.uasset b/GZJ/Asset/CSV/Structs/WeaponWithFittingsInfo.uasset new file mode 100644 index 00000000..3b8ed588 Binary files /dev/null and b/GZJ/Asset/CSV/Structs/WeaponWithFittingsInfo.uasset differ diff --git a/GZJ/Asset/CSV/WeaponConstructTable.uasset b/GZJ/Asset/CSV/WeaponConstructTable.uasset new file mode 100644 index 00000000..f8acd367 Binary files /dev/null and b/GZJ/Asset/CSV/WeaponConstructTable.uasset differ diff --git a/GZJ/Asset/CSV/WeaponPartMeshConfigTable.uasset b/GZJ/Asset/CSV/WeaponPartMeshConfigTable.uasset new file mode 100644 index 00000000..0537668b Binary files /dev/null and b/GZJ/Asset/CSV/WeaponPartMeshConfigTable.uasset differ diff --git a/GZJ/Asset/FX/Material/MI_Drop_01.uasset b/GZJ/Asset/FX/Material/MI_Drop_01.uasset new file mode 100644 index 00000000..a3226c78 Binary files /dev/null and b/GZJ/Asset/FX/Material/MI_Drop_01.uasset differ diff --git a/GZJ/Asset/FX/Material/MI_Drop_02.uasset b/GZJ/Asset/FX/Material/MI_Drop_02.uasset new file mode 100644 index 00000000..920d10dc Binary files /dev/null and b/GZJ/Asset/FX/Material/MI_Drop_02.uasset differ diff --git a/GZJ/Asset/FX/Material/MI_Drop_03.uasset b/GZJ/Asset/FX/Material/MI_Drop_03.uasset new file mode 100644 index 00000000..721222b6 Binary files /dev/null and b/GZJ/Asset/FX/Material/MI_Drop_03.uasset differ diff --git a/GZJ/Asset/FX/Material/MI_Drop_04.uasset b/GZJ/Asset/FX/Material/MI_Drop_04.uasset new file mode 100644 index 00000000..8124cae9 Binary files /dev/null and b/GZJ/Asset/FX/Material/MI_Drop_04.uasset differ diff --git a/GZJ/Asset/FX/Material/MI_Drop_05.uasset b/GZJ/Asset/FX/Material/MI_Drop_05.uasset new file mode 100644 index 00000000..15d928af Binary files /dev/null and b/GZJ/Asset/FX/Material/MI_Drop_05.uasset differ diff --git a/GZJ/Asset/FX/Material/MI_Drop_06.uasset b/GZJ/Asset/FX/Material/MI_Drop_06.uasset new file mode 100644 index 00000000..8b2e97a4 Binary files /dev/null and b/GZJ/Asset/FX/Material/MI_Drop_06.uasset differ diff --git a/GZJ/Asset/FX/Material/MI_Drop_07.uasset b/GZJ/Asset/FX/Material/MI_Drop_07.uasset new file mode 100644 index 00000000..7f61bca0 Binary files /dev/null and b/GZJ/Asset/FX/Material/MI_Drop_07.uasset differ diff --git a/GZJ/Asset/FX/Material/MI_huoyu.uasset b/GZJ/Asset/FX/Material/MI_huoyu.uasset new file mode 100644 index 00000000..e35280f1 Binary files /dev/null and b/GZJ/Asset/FX/Material/MI_huoyu.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_001.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_001.uasset new file mode 100644 index 00000000..08641daf Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_001.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_002.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_002.uasset new file mode 100644 index 00000000..889a5f49 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_002.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_003.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_003.uasset new file mode 100644 index 00000000..dd86fd8c Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_003.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_004.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_004.uasset new file mode 100644 index 00000000..ba51ce0c Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_004.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_005.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_005.uasset new file mode 100644 index 00000000..8a681ba4 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_005.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_006.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_006.uasset new file mode 100644 index 00000000..f1ac190b Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_006.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_007.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_007.uasset new file mode 100644 index 00000000..db00538e Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_007.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_008.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_008.uasset new file mode 100644 index 00000000..2c0ce4b9 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_008.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_009.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_009.uasset new file mode 100644 index 00000000..d461cc66 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_009.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_010.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_010.uasset new file mode 100644 index 00000000..5120ea75 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_010.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_011.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_011.uasset new file mode 100644 index 00000000..c424be2f Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_011.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_012.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_012.uasset new file mode 100644 index 00000000..e9a46041 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_012.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_013.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_013.uasset new file mode 100644 index 00000000..c9c784f5 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_013.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_014.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_014.uasset new file mode 100644 index 00000000..8eac8a50 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_014.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_015.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_015.uasset new file mode 100644 index 00000000..4bd48680 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_015.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_016.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_016.uasset new file mode 100644 index 00000000..6b218aa6 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_016.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_017.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_017.uasset new file mode 100644 index 00000000..6a0c76cd Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_017.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_018.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_018.uasset new file mode 100644 index 00000000..6eb86d0f Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_018.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_019.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_019.uasset new file mode 100644 index 00000000..39a21d1b Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_019.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_020.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_020.uasset new file mode 100644 index 00000000..43353587 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_020.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_021.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_021.uasset new file mode 100644 index 00000000..89e75d27 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_021.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_022.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_022.uasset new file mode 100644 index 00000000..9e1837c6 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_022.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_023.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_023.uasset new file mode 100644 index 00000000..b364936f Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_023.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_024.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_024.uasset new file mode 100644 index 00000000..e94ac56c Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_024.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_025.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_025.uasset new file mode 100644 index 00000000..b1ec61dc Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_025.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_026.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_026.uasset new file mode 100644 index 00000000..4d943297 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_026.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_027.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_027.uasset new file mode 100644 index 00000000..c81c494c Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_027.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_028.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_028.uasset new file mode 100644 index 00000000..acb92e15 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_028.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_029.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_029.uasset new file mode 100644 index 00000000..ff8aeac8 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_029.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_030.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_030.uasset new file mode 100644 index 00000000..89b61fbc Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_030.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_031.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_031.uasset new file mode 100644 index 00000000..98f32c0f Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_031.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_032.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_032.uasset new file mode 100644 index 00000000..251adf16 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_032.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_033.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_033.uasset new file mode 100644 index 00000000..0b96db63 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_033.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_034.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_034.uasset new file mode 100644 index 00000000..fdea8e00 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_034.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_035.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_035.uasset new file mode 100644 index 00000000..5a29088f Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_035.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_036.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_036.uasset new file mode 100644 index 00000000..1eccdf78 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_036.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_037.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_037.uasset new file mode 100644 index 00000000..b8053837 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_037.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_038.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_038.uasset new file mode 100644 index 00000000..6ebddbae Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_038.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_039.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_039.uasset new file mode 100644 index 00000000..a44b1693 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_039.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_040.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_040.uasset new file mode 100644 index 00000000..5338bd2e Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_040.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_041.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_041.uasset new file mode 100644 index 00000000..fe51d211 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_041.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_042.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_042.uasset new file mode 100644 index 00000000..7515c190 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_042.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_043.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_043.uasset new file mode 100644 index 00000000..fdb5d805 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_043.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_044.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_044.uasset new file mode 100644 index 00000000..96244e34 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_044.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_045.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_045.uasset new file mode 100644 index 00000000..866d46cc Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_045.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_046.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_046.uasset new file mode 100644 index 00000000..a33c6d43 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_046.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_047.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_047.uasset new file mode 100644 index 00000000..29926bed Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_047.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_048.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_048.uasset new file mode 100644 index 00000000..d6dac5f7 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_048.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_049.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_049.uasset new file mode 100644 index 00000000..d529a620 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_049.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_050.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_050.uasset new file mode 100644 index 00000000..cae239b5 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_050.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_051.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_051.uasset new file mode 100644 index 00000000..6f5b82aa Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_051.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_052.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_052.uasset new file mode 100644 index 00000000..6c7f940b Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_052.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_053.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_053.uasset new file mode 100644 index 00000000..fd2aebbe Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_053.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_054.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_054.uasset new file mode 100644 index 00000000..52bf7f62 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_054.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_055.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_055.uasset new file mode 100644 index 00000000..96539ea8 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_055.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_056.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_056.uasset new file mode 100644 index 00000000..afd0cdb9 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_056.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_057.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_057.uasset new file mode 100644 index 00000000..730ec0a7 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_057.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_058.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_058.uasset new file mode 100644 index 00000000..12496a28 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_058.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_059.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_059.uasset new file mode 100644 index 00000000..b6e7ca50 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_059.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_060.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_060.uasset new file mode 100644 index 00000000..0330112a Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_060.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_061.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_061.uasset new file mode 100644 index 00000000..e86c5223 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_061.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_062.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_062.uasset new file mode 100644 index 00000000..48b536e5 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_062.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_063.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_063.uasset new file mode 100644 index 00000000..8d576f08 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_063.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_064.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_064.uasset new file mode 100644 index 00000000..f6bada71 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_064.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_065.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_065.uasset new file mode 100644 index 00000000..2788ff01 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_065.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_066.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_066.uasset new file mode 100644 index 00000000..50b9989b Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_066.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_067.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_067.uasset new file mode 100644 index 00000000..200d9a43 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_067.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_068.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_068.uasset new file mode 100644 index 00000000..1079c1d9 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_068.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_069.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_069.uasset new file mode 100644 index 00000000..0501075a Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_069.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_070.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_070.uasset new file mode 100644 index 00000000..c8c766da Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_070.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_071.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_071.uasset new file mode 100644 index 00000000..25905bda Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_071.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_072.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_072.uasset new file mode 100644 index 00000000..ffa6c9aa Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_072.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_073.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_073.uasset new file mode 100644 index 00000000..37e4a51c Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_073.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_074.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_074.uasset new file mode 100644 index 00000000..f94aa64c Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_074.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_075.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_075.uasset new file mode 100644 index 00000000..428fad2e Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_075.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_076.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_076.uasset new file mode 100644 index 00000000..a1953abd Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_076.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_077.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_077.uasset new file mode 100644 index 00000000..d0bad216 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_077.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_078.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_078.uasset new file mode 100644 index 00000000..4afc581e Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_078.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_079.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_079.uasset new file mode 100644 index 00000000..a813b988 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_079.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_080.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_080.uasset new file mode 100644 index 00000000..440f3815 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_080.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_081.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_081.uasset new file mode 100644 index 00000000..e93a426b Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_081.uasset differ diff --git a/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_082.uasset b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_082.uasset new file mode 100644 index 00000000..44051a76 Binary files /dev/null and b/GZJ/Asset/FX/Material/Mi_Texiaocaizhi_082.uasset differ diff --git a/GZJ/Asset/FX/Mesh/SM_Circle_3.uasset b/GZJ/Asset/FX/Mesh/SM_Circle_3.uasset new file mode 100644 index 00000000..fa6564c2 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/SM_Circle_3.uasset differ diff --git a/GZJ/Asset/FX/Mesh/SM_TrailMesh_2.uasset b/GZJ/Asset/FX/Mesh/SM_TrailMesh_2.uasset new file mode 100644 index 00000000..d7c95165 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/SM_TrailMesh_2.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_001.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_001.uasset new file mode 100644 index 00000000..91ea219a Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_001.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_002.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_002.uasset new file mode 100644 index 00000000..0d3fb4bc Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_002.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_003.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_003.uasset new file mode 100644 index 00000000..0d93c1a2 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_003.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_004.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_004.uasset new file mode 100644 index 00000000..09f30a27 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_004.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_005.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_005.uasset new file mode 100644 index 00000000..901d9ee8 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_005.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_006.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_006.uasset new file mode 100644 index 00000000..f7fd7f5c Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_006.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_007.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_007.uasset new file mode 100644 index 00000000..074c1621 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_007.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_008.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_008.uasset new file mode 100644 index 00000000..2fdf1b9b Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_008.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_009.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_009.uasset new file mode 100644 index 00000000..fe92785c Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_009.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_010.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_010.uasset new file mode 100644 index 00000000..7add7930 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_010.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_011.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_011.uasset new file mode 100644 index 00000000..a912faaa Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_011.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_012.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_012.uasset new file mode 100644 index 00000000..7180adf8 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_012.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_013.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_013.uasset new file mode 100644 index 00000000..d6a51a43 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_013.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_014.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_014.uasset new file mode 100644 index 00000000..b9412367 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_014.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_015.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_015.uasset new file mode 100644 index 00000000..87217e89 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_015.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_016.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_016.uasset new file mode 100644 index 00000000..68740027 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_016.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_017.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_017.uasset new file mode 100644 index 00000000..0cbedb2a Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_017.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_018.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_018.uasset new file mode 100644 index 00000000..086df3fa Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_018.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_019.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_019.uasset new file mode 100644 index 00000000..b4687a43 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_019.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_020.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_020.uasset new file mode 100644 index 00000000..7ca199ad Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_020.uasset differ diff --git a/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_021.uasset b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_021.uasset new file mode 100644 index 00000000..fb623b88 Binary files /dev/null and b/GZJ/Asset/FX/Mesh/Sm_Texiaomoxing_021.uasset differ diff --git a/GZJ/Asset/FX/Particle/01/P_Zhiliao_001.uasset b/GZJ/Asset/FX/Particle/01/P_Zhiliao_001.uasset new file mode 100644 index 00000000..40032786 Binary files /dev/null and b/GZJ/Asset/FX/Particle/01/P_Zhiliao_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/02/P_Chongci_001.uasset b/GZJ/Asset/FX/Particle/02/P_Chongci_001.uasset new file mode 100644 index 00000000..38553407 Binary files /dev/null and b/GZJ/Asset/FX/Particle/02/P_Chongci_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/03/P_Nuyi_001.uasset b/GZJ/Asset/FX/Particle/03/P_Nuyi_001.uasset new file mode 100644 index 00000000..1562d1eb Binary files /dev/null and b/GZJ/Asset/FX/Particle/03/P_Nuyi_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/04/P_Yingsha_001.uasset b/GZJ/Asset/FX/Particle/04/P_Yingsha_001.uasset new file mode 100644 index 00000000..41693472 Binary files /dev/null and b/GZJ/Asset/FX/Particle/04/P_Yingsha_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/04/P_Yingsha_002.uasset b/GZJ/Asset/FX/Particle/04/P_Yingsha_002.uasset new file mode 100644 index 00000000..de506f70 Binary files /dev/null and b/GZJ/Asset/FX/Particle/04/P_Yingsha_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/05/P_Zhanji_001.uasset b/GZJ/Asset/FX/Particle/05/P_Zhanji_001.uasset new file mode 100644 index 00000000..de3fdb5a Binary files /dev/null and b/GZJ/Asset/FX/Particle/05/P_Zhanji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/06/P_Xuanyun_001.uasset b/GZJ/Asset/FX/Particle/06/P_Xuanyun_001.uasset new file mode 100644 index 00000000..f5667a98 Binary files /dev/null and b/GZJ/Asset/FX/Particle/06/P_Xuanyun_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/06/P_Xuanyun_002.uasset b/GZJ/Asset/FX/Particle/06/P_Xuanyun_002.uasset new file mode 100644 index 00000000..40996fc9 Binary files /dev/null and b/GZJ/Asset/FX/Particle/06/P_Xuanyun_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/07/P_Xuruo_001.uasset b/GZJ/Asset/FX/Particle/07/P_Xuruo_001.uasset new file mode 100644 index 00000000..20318d80 Binary files /dev/null and b/GZJ/Asset/FX/Particle/07/P_Xuruo_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/08/P_Chuantou_001.uasset b/GZJ/Asset/FX/Particle/08/P_Chuantou_001.uasset new file mode 100644 index 00000000..e9c3378e Binary files /dev/null and b/GZJ/Asset/FX/Particle/08/P_Chuantou_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/09/P_Fanji_001.uasset b/GZJ/Asset/FX/Particle/09/P_Fanji_001.uasset new file mode 100644 index 00000000..1efdf924 Binary files /dev/null and b/GZJ/Asset/FX/Particle/09/P_Fanji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/10/P_Dianji_001.uasset b/GZJ/Asset/FX/Particle/10/P_Dianji_001.uasset new file mode 100644 index 00000000..9cacaed6 Binary files /dev/null and b/GZJ/Asset/FX/Particle/10/P_Dianji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/10/P_Dianji_002.uasset b/GZJ/Asset/FX/Particle/10/P_Dianji_002.uasset new file mode 100644 index 00000000..7acc9ea8 Binary files /dev/null and b/GZJ/Asset/FX/Particle/10/P_Dianji_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/10/P_Dianji_003.uasset b/GZJ/Asset/FX/Particle/10/P_Dianji_003.uasset new file mode 100644 index 00000000..a3e58b10 Binary files /dev/null and b/GZJ/Asset/FX/Particle/10/P_Dianji_003.uasset differ diff --git a/GZJ/Asset/FX/Particle/11/P_Xingluo_001.uasset b/GZJ/Asset/FX/Particle/11/P_Xingluo_001.uasset new file mode 100644 index 00000000..d1a850e6 Binary files /dev/null and b/GZJ/Asset/FX/Particle/11/P_Xingluo_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/11/P_Xingluo_002.uasset b/GZJ/Asset/FX/Particle/11/P_Xingluo_002.uasset new file mode 100644 index 00000000..61a9e581 Binary files /dev/null and b/GZJ/Asset/FX/Particle/11/P_Xingluo_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/12/P_Shexian_001.uasset b/GZJ/Asset/FX/Particle/12/P_Shexian_001.uasset new file mode 100644 index 00000000..ee2c8dd7 Binary files /dev/null and b/GZJ/Asset/FX/Particle/12/P_Shexian_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/12/P_Shexian_002.uasset b/GZJ/Asset/FX/Particle/12/P_Shexian_002.uasset new file mode 100644 index 00000000..f34e76b0 Binary files /dev/null and b/GZJ/Asset/FX/Particle/12/P_Shexian_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/12/P_Shexian_2.uasset b/GZJ/Asset/FX/Particle/12/P_Shexian_2.uasset new file mode 100644 index 00000000..9c73dbd7 Binary files /dev/null and b/GZJ/Asset/FX/Particle/12/P_Shexian_2.uasset differ diff --git a/GZJ/Asset/FX/Particle/12/P_Shexian_3.uasset b/GZJ/Asset/FX/Particle/12/P_Shexian_3.uasset new file mode 100644 index 00000000..3af35622 Binary files /dev/null and b/GZJ/Asset/FX/Particle/12/P_Shexian_3.uasset differ diff --git a/GZJ/Asset/FX/Particle/12/P_Shexian_4.uasset b/GZJ/Asset/FX/Particle/12/P_Shexian_4.uasset new file mode 100644 index 00000000..25ee16d3 Binary files /dev/null and b/GZJ/Asset/FX/Particle/12/P_Shexian_4.uasset differ diff --git a/GZJ/Asset/FX/Particle/13/P_Lieji_001.uasset b/GZJ/Asset/FX/Particle/13/P_Lieji_001.uasset new file mode 100644 index 00000000..5da113e4 Binary files /dev/null and b/GZJ/Asset/FX/Particle/13/P_Lieji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/13/P_Lieji_002.uasset b/GZJ/Asset/FX/Particle/13/P_Lieji_002.uasset new file mode 100644 index 00000000..399bb4a5 Binary files /dev/null and b/GZJ/Asset/FX/Particle/13/P_Lieji_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/14/P_Ruodian_001.uasset b/GZJ/Asset/FX/Particle/14/P_Ruodian_001.uasset new file mode 100644 index 00000000..4b718b40 Binary files /dev/null and b/GZJ/Asset/FX/Particle/14/P_Ruodian_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/15/P_Suijia_001.uasset b/GZJ/Asset/FX/Particle/15/P_Suijia_001.uasset new file mode 100644 index 00000000..7421e012 Binary files /dev/null and b/GZJ/Asset/FX/Particle/15/P_Suijia_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/16/P_Siwang_001.uasset b/GZJ/Asset/FX/Particle/16/P_Siwang_001.uasset new file mode 100644 index 00000000..e55dd380 Binary files /dev/null and b/GZJ/Asset/FX/Particle/16/P_Siwang_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/16/P_Siwang_002.uasset b/GZJ/Asset/FX/Particle/16/P_Siwang_002.uasset new file mode 100644 index 00000000..96100baa Binary files /dev/null and b/GZJ/Asset/FX/Particle/16/P_Siwang_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/17/P_Sihong_001.uasset b/GZJ/Asset/FX/Particle/17/P_Sihong_001.uasset new file mode 100644 index 00000000..5e6cfe51 Binary files /dev/null and b/GZJ/Asset/FX/Particle/17/P_Sihong_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/18/P_Guangbo_001.uasset b/GZJ/Asset/FX/Particle/18/P_Guangbo_001.uasset new file mode 100644 index 00000000..62046bb2 Binary files /dev/null and b/GZJ/Asset/FX/Particle/18/P_Guangbo_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/19/P_Bingshuang_001.uasset b/GZJ/Asset/FX/Particle/19/P_Bingshuang_001.uasset new file mode 100644 index 00000000..1ba7310b Binary files /dev/null and b/GZJ/Asset/FX/Particle/19/P_Bingshuang_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/20/P_Duyu_001.uasset b/GZJ/Asset/FX/Particle/20/P_Duyu_001.uasset new file mode 100644 index 00000000..ce3f643a Binary files /dev/null and b/GZJ/Asset/FX/Particle/20/P_Duyu_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/21/P_Chuanci_001.uasset b/GZJ/Asset/FX/Particle/21/P_Chuanci_001.uasset new file mode 100644 index 00000000..dd159100 Binary files /dev/null and b/GZJ/Asset/FX/Particle/21/P_Chuanci_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/22/P_Fengyin_001.uasset b/GZJ/Asset/FX/Particle/22/P_Fengyin_001.uasset new file mode 100644 index 00000000..1101ac26 Binary files /dev/null and b/GZJ/Asset/FX/Particle/22/P_Fengyin_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/23/P_Sheling_001.uasset b/GZJ/Asset/FX/Particle/23/P_Sheling_001.uasset new file mode 100644 index 00000000..0740f073 Binary files /dev/null and b/GZJ/Asset/FX/Particle/23/P_Sheling_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/24/P_Jianta_001.uasset b/GZJ/Asset/FX/Particle/24/P_Jianta_001.uasset new file mode 100644 index 00000000..9156770e Binary files /dev/null and b/GZJ/Asset/FX/Particle/24/P_Jianta_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/25/P_Manyueji_001.uasset b/GZJ/Asset/FX/Particle/25/P_Manyueji_001.uasset new file mode 100644 index 00000000..79bc57e1 Binary files /dev/null and b/GZJ/Asset/FX/Particle/25/P_Manyueji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/26/P_Gangfeng_001.uasset b/GZJ/Asset/FX/Particle/26/P_Gangfeng_001.uasset new file mode 100644 index 00000000..7a61e0a4 Binary files /dev/null and b/GZJ/Asset/FX/Particle/26/P_Gangfeng_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/27/P_Huoyu_001.uasset b/GZJ/Asset/FX/Particle/27/P_Huoyu_001.uasset new file mode 100644 index 00000000..b7958b61 Binary files /dev/null and b/GZJ/Asset/FX/Particle/27/P_Huoyu_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/28/P_Penyong_001.uasset b/GZJ/Asset/FX/Particle/28/P_Penyong_001.uasset new file mode 100644 index 00000000..1142878f Binary files /dev/null and b/GZJ/Asset/FX/Particle/28/P_Penyong_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/29/P_Silie_001.uasset b/GZJ/Asset/FX/Particle/29/P_Silie_001.uasset new file mode 100644 index 00000000..b16fc123 Binary files /dev/null and b/GZJ/Asset/FX/Particle/29/P_Silie_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/30/P_Bangji_001.uasset b/GZJ/Asset/FX/Particle/30/P_Bangji_001.uasset new file mode 100644 index 00000000..2a2306e4 Binary files /dev/null and b/GZJ/Asset/FX/Particle/30/P_Bangji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/31/P_ChuanSuo_001.uasset b/GZJ/Asset/FX/Particle/31/P_ChuanSuo_001.uasset new file mode 100644 index 00000000..8684806c Binary files /dev/null and b/GZJ/Asset/FX/Particle/31/P_ChuanSuo_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/31/P_Chuansuo_002.uasset b/GZJ/Asset/FX/Particle/31/P_Chuansuo_002.uasset new file mode 100644 index 00000000..ac04563c Binary files /dev/null and b/GZJ/Asset/FX/Particle/31/P_Chuansuo_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/32/P_Hongzha_001.uasset b/GZJ/Asset/FX/Particle/32/P_Hongzha_001.uasset new file mode 100644 index 00000000..dbe57a6e Binary files /dev/null and b/GZJ/Asset/FX/Particle/32/P_Hongzha_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/33/P_Huanfenshen_001.uasset b/GZJ/Asset/FX/Particle/33/P_Huanfenshen_001.uasset new file mode 100644 index 00000000..3437f04e Binary files /dev/null and b/GZJ/Asset/FX/Particle/33/P_Huanfenshen_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/34/P_Huancisha_001.uasset b/GZJ/Asset/FX/Particle/34/P_Huancisha_001.uasset new file mode 100644 index 00000000..b4feb12b Binary files /dev/null and b/GZJ/Asset/FX/Particle/34/P_Huancisha_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/35/P_Shenxuedun_001.uasset b/GZJ/Asset/FX/Particle/35/P_Shenxuedun_001.uasset new file mode 100644 index 00000000..b1b59667 Binary files /dev/null and b/GZJ/Asset/FX/Particle/35/P_Shenxuedun_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/36/P_Shenshengshu_001.uasset b/GZJ/Asset/FX/Particle/36/P_Shenshengshu_001.uasset new file mode 100644 index 00000000..f2fb3e11 Binary files /dev/null and b/GZJ/Asset/FX/Particle/36/P_Shenshengshu_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/37/P_Meihunzhou_001.uasset b/GZJ/Asset/FX/Particle/37/P_Meihunzhou_001.uasset new file mode 100644 index 00000000..87b22329 Binary files /dev/null and b/GZJ/Asset/FX/Particle/37/P_Meihunzhou_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/38/P_Meizhize_001.uasset b/GZJ/Asset/FX/Particle/38/P_Meizhize_001.uasset new file mode 100644 index 00000000..f0daedd8 Binary files /dev/null and b/GZJ/Asset/FX/Particle/38/P_Meizhize_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/39/P_Shunshashu_001.uasset b/GZJ/Asset/FX/Particle/39/P_Shunshashu_001.uasset new file mode 100644 index 00000000..05d37d8c Binary files /dev/null and b/GZJ/Asset/FX/Particle/39/P_Shunshashu_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/40/P_Shunbaofeng_001.uasset b/GZJ/Asset/FX/Particle/40/P_Shunbaofeng_001.uasset new file mode 100644 index 00000000..e22d9d06 Binary files /dev/null and b/GZJ/Asset/FX/Particle/40/P_Shunbaofeng_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/41/P_Chunzhishu_001.uasset b/GZJ/Asset/FX/Particle/41/P_Chunzhishu_001.uasset new file mode 100644 index 00000000..9308cb47 Binary files /dev/null and b/GZJ/Asset/FX/Particle/41/P_Chunzhishu_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/42/P_Chunwuyu_001.uasset b/GZJ/Asset/FX/Particle/42/P_Chunwuyu_001.uasset new file mode 100644 index 00000000..900bfe91 Binary files /dev/null and b/GZJ/Asset/FX/Particle/42/P_Chunwuyu_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/43/P_Manshenjue_001.uasset b/GZJ/Asset/FX/Particle/43/P_Manshenjue_001.uasset new file mode 100644 index 00000000..e571b9ad Binary files /dev/null and b/GZJ/Asset/FX/Particle/43/P_Manshenjue_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/44/P_Duoji_001.uasset b/GZJ/Asset/FX/Particle/44/P_Duoji_001.uasset new file mode 100644 index 00000000..7555606a Binary files /dev/null and b/GZJ/Asset/FX/Particle/44/P_Duoji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/45/P_Yingzishashou_001.uasset b/GZJ/Asset/FX/Particle/45/P_Yingzishashou_001.uasset new file mode 100644 index 00000000..3ddbf2ed Binary files /dev/null and b/GZJ/Asset/FX/Particle/45/P_Yingzishashou_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/46/P_Hudunkexing_001.uasset b/GZJ/Asset/FX/Particle/46/P_Hudunkexing_001.uasset new file mode 100644 index 00000000..f2405df2 Binary files /dev/null and b/GZJ/Asset/FX/Particle/46/P_Hudunkexing_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/47/P_Tianshenxiafan_001.uasset b/GZJ/Asset/FX/Particle/47/P_Tianshenxiafan_001.uasset new file mode 100644 index 00000000..f61ad3a0 Binary files /dev/null and b/GZJ/Asset/FX/Particle/47/P_Tianshenxiafan_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/48/P_Canfeiduanjing_001.uasset b/GZJ/Asset/FX/Particle/48/P_Canfeiduanjing_001.uasset new file mode 100644 index 00000000..149037ca Binary files /dev/null and b/GZJ/Asset/FX/Particle/48/P_Canfeiduanjing_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/49/P_Yizhihuifu_001.uasset b/GZJ/Asset/FX/Particle/49/P_Yizhihuifu_001.uasset new file mode 100644 index 00000000..c247229b Binary files /dev/null and b/GZJ/Asset/FX/Particle/49/P_Yizhihuifu_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/50/P_Shanghaiguanti_001.uasset b/GZJ/Asset/FX/Particle/50/P_Shanghaiguanti_001.uasset new file mode 100644 index 00000000..f8cd3841 Binary files /dev/null and b/GZJ/Asset/FX/Particle/50/P_Shanghaiguanti_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/50/P_Shanghaiguanti_002.uasset b/GZJ/Asset/FX/Particle/50/P_Shanghaiguanti_002.uasset new file mode 100644 index 00000000..e94b38b8 Binary files /dev/null and b/GZJ/Asset/FX/Particle/50/P_Shanghaiguanti_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/51/P_Liren_001.uasset b/GZJ/Asset/FX/Particle/51/P_Liren_001.uasset new file mode 100644 index 00000000..6de5424d Binary files /dev/null and b/GZJ/Asset/FX/Particle/51/P_Liren_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/52/P_Yinghua_001.uasset b/GZJ/Asset/FX/Particle/52/P_Yinghua_001.uasset new file mode 100644 index 00000000..62edb755 Binary files /dev/null and b/GZJ/Asset/FX/Particle/52/P_Yinghua_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/53/P_Kuangbao_001.uasset b/GZJ/Asset/FX/Particle/53/P_Kuangbao_001.uasset new file mode 100644 index 00000000..cdde0661 Binary files /dev/null and b/GZJ/Asset/FX/Particle/53/P_Kuangbao_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/54/P_Xixue_001.uasset b/GZJ/Asset/FX/Particle/54/P_Xixue_001.uasset new file mode 100644 index 00000000..6132d16a Binary files /dev/null and b/GZJ/Asset/FX/Particle/54/P_Xixue_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/55/P_Xiee_001.uasset b/GZJ/Asset/FX/Particle/55/P_Xiee_001.uasset new file mode 100644 index 00000000..a489201b Binary files /dev/null and b/GZJ/Asset/FX/Particle/55/P_Xiee_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/55/P_Xiee_002.uasset b/GZJ/Asset/FX/Particle/55/P_Xiee_002.uasset new file mode 100644 index 00000000..e48c6911 Binary files /dev/null and b/GZJ/Asset/FX/Particle/55/P_Xiee_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/56/P_Baozha_001.uasset b/GZJ/Asset/FX/Particle/56/P_Baozha_001.uasset new file mode 100644 index 00000000..81814d31 Binary files /dev/null and b/GZJ/Asset/FX/Particle/56/P_Baozha_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/57/P_Jinji_001.uasset b/GZJ/Asset/FX/Particle/57/P_Jinji_001.uasset new file mode 100644 index 00000000..56e2de65 Binary files /dev/null and b/GZJ/Asset/FX/Particle/57/P_Jinji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/58/P_Xuanfeng_001.uasset b/GZJ/Asset/FX/Particle/58/P_Xuanfeng_001.uasset new file mode 100644 index 00000000..622023d3 Binary files /dev/null and b/GZJ/Asset/FX/Particle/58/P_Xuanfeng_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/59/P_Mori_001.uasset b/GZJ/Asset/FX/Particle/59/P_Mori_001.uasset new file mode 100644 index 00000000..058a9c04 Binary files /dev/null and b/GZJ/Asset/FX/Particle/59/P_Mori_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/60/P_Huti_001.uasset b/GZJ/Asset/FX/Particle/60/P_Huti_001.uasset new file mode 100644 index 00000000..d666fed5 Binary files /dev/null and b/GZJ/Asset/FX/Particle/60/P_Huti_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/60/P_Huti_002.uasset b/GZJ/Asset/FX/Particle/60/P_Huti_002.uasset new file mode 100644 index 00000000..7f04ac84 Binary files /dev/null and b/GZJ/Asset/FX/Particle/60/P_Huti_002.uasset differ diff --git a/GZJ/Asset/FX/Particle/61/P_Shixue_001.uasset b/GZJ/Asset/FX/Particle/61/P_Shixue_001.uasset new file mode 100644 index 00000000..82c973e2 Binary files /dev/null and b/GZJ/Asset/FX/Particle/61/P_Shixue_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/62/P_Shouge_001.uasset b/GZJ/Asset/FX/Particle/62/P_Shouge_001.uasset new file mode 100644 index 00000000..ab4bab03 Binary files /dev/null and b/GZJ/Asset/FX/Particle/62/P_Shouge_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/63/P_Fuhun_001.uasset b/GZJ/Asset/FX/Particle/63/P_Fuhun_001.uasset new file mode 100644 index 00000000..f91433d2 Binary files /dev/null and b/GZJ/Asset/FX/Particle/63/P_Fuhun_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/64/P_Shengji_001.uasset b/GZJ/Asset/FX/Particle/64/P_Shengji_001.uasset new file mode 100644 index 00000000..d26bbf0d Binary files /dev/null and b/GZJ/Asset/FX/Particle/64/P_Shengji_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/65/P_Tupochenggong_001.uasset b/GZJ/Asset/FX/Particle/65/P_Tupochenggong_001.uasset new file mode 100644 index 00000000..e214d7d7 Binary files /dev/null and b/GZJ/Asset/FX/Particle/65/P_Tupochenggong_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/66/P_Kaiqibaoxiang_001.uasset b/GZJ/Asset/FX/Particle/66/P_Kaiqibaoxiang_001.uasset new file mode 100644 index 00000000..1fa8efdb Binary files /dev/null and b/GZJ/Asset/FX/Particle/66/P_Kaiqibaoxiang_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/67/P_Hecheng_001.uasset b/GZJ/Asset/FX/Particle/67/P_Hecheng_001.uasset new file mode 100644 index 00000000..ad389cfd Binary files /dev/null and b/GZJ/Asset/FX/Particle/67/P_Hecheng_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/68/P_Fengyintupo_001.uasset b/GZJ/Asset/FX/Particle/68/P_Fengyintupo_001.uasset new file mode 100644 index 00000000..6335b42e Binary files /dev/null and b/GZJ/Asset/FX/Particle/68/P_Fengyintupo_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/69/P_Dengjimanxuyaotupo_001.uasset b/GZJ/Asset/FX/Particle/69/P_Dengjimanxuyaotupo_001.uasset new file mode 100644 index 00000000..1d66152b Binary files /dev/null and b/GZJ/Asset/FX/Particle/69/P_Dengjimanxuyaotupo_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/70/P_Daojishi_001.uasset b/GZJ/Asset/FX/Particle/70/P_Daojishi_001.uasset new file mode 100644 index 00000000..df4f05eb Binary files /dev/null and b/GZJ/Asset/FX/Particle/70/P_Daojishi_001.uasset differ diff --git a/GZJ/Asset/FX/Particle/71/P_Drop_02.uasset b/GZJ/Asset/FX/Particle/71/P_Drop_02.uasset new file mode 100644 index 00000000..6896da78 Binary files /dev/null and b/GZJ/Asset/FX/Particle/71/P_Drop_02.uasset differ diff --git a/GZJ/Asset/FX/Particle/71/P_Drop_03.uasset b/GZJ/Asset/FX/Particle/71/P_Drop_03.uasset new file mode 100644 index 00000000..1eb3963a Binary files /dev/null and b/GZJ/Asset/FX/Particle/71/P_Drop_03.uasset differ diff --git a/GZJ/Asset/FX/Particle/71/P_Drop_04.uasset b/GZJ/Asset/FX/Particle/71/P_Drop_04.uasset new file mode 100644 index 00000000..658c7582 Binary files /dev/null and b/GZJ/Asset/FX/Particle/71/P_Drop_04.uasset differ diff --git a/GZJ/Asset/FX/Particle/71/P_Drop_05.uasset b/GZJ/Asset/FX/Particle/71/P_Drop_05.uasset new file mode 100644 index 00000000..61a2a202 Binary files /dev/null and b/GZJ/Asset/FX/Particle/71/P_Drop_05.uasset differ diff --git a/GZJ/Asset/FX/Particle/MonsterBirthPoint/P_UGCMonsterBirthPoint.uasset b/GZJ/Asset/FX/Particle/MonsterBirthPoint/P_UGCMonsterBirthPoint.uasset new file mode 100644 index 00000000..2258c104 Binary files /dev/null and b/GZJ/Asset/FX/Particle/MonsterBirthPoint/P_UGCMonsterBirthPoint.uasset differ diff --git a/GZJ/Asset/FX/Particle/Skill/P_WereWolf02_Attack_02_Quicken.uasset b/GZJ/Asset/FX/Particle/Skill/P_WereWolf02_Attack_02_Quicken.uasset new file mode 100644 index 00000000..bcf63bf6 Binary files /dev/null and b/GZJ/Asset/FX/Particle/Skill/P_WereWolf02_Attack_02_Quicken.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Noise_3.uasset b/GZJ/Asset/FX/Textures/T_Noise_3.uasset new file mode 100644 index 00000000..2ad44a2c Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Noise_3.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Sub_Noise_6.uasset b/GZJ/Asset/FX/Textures/T_Sub_Noise_6.uasset new file mode 100644 index 00000000..8a2b8903 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Sub_Noise_6.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_001.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_001.uasset new file mode 100644 index 00000000..cab5ae7e Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_001.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_002.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_002.uasset new file mode 100644 index 00000000..731664fc Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_002.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_003.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_003.uasset new file mode 100644 index 00000000..4454ad93 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_003.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_004.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_004.uasset new file mode 100644 index 00000000..ad4e63b4 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_004.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_005.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_005.uasset new file mode 100644 index 00000000..480ed06d Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_005.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_006.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_006.uasset new file mode 100644 index 00000000..51376da7 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_006.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_007.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_007.uasset new file mode 100644 index 00000000..0a7da1df Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_007.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_008.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_008.uasset new file mode 100644 index 00000000..1fdc1fe4 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_008.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_009.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_009.uasset new file mode 100644 index 00000000..e7a198b5 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_009.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_010.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_010.uasset new file mode 100644 index 00000000..dc5ac8a4 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_010.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_011.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_011.uasset new file mode 100644 index 00000000..cd462f46 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_011.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_012.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_012.uasset new file mode 100644 index 00000000..624d2491 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_012.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_013.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_013.uasset new file mode 100644 index 00000000..4aac0a22 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_013.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_014.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_014.uasset new file mode 100644 index 00000000..69a11a55 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_014.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_015.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_015.uasset new file mode 100644 index 00000000..6d56dc67 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_015.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_016.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_016.uasset new file mode 100644 index 00000000..5cb5723d Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_016.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_017.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_017.uasset new file mode 100644 index 00000000..f2b54594 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_017.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_018.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_018.uasset new file mode 100644 index 00000000..4296cb20 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_018.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_019.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_019.uasset new file mode 100644 index 00000000..b595e0c2 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_019.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_020.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_020.uasset new file mode 100644 index 00000000..a40c1df0 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_020.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_021.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_021.uasset new file mode 100644 index 00000000..95e1b701 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_021.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_022.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_022.uasset new file mode 100644 index 00000000..5344068c Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_022.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_023.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_023.uasset new file mode 100644 index 00000000..fb241227 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_023.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_024.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_024.uasset new file mode 100644 index 00000000..ed10a4ea Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_024.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_025.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_025.uasset new file mode 100644 index 00000000..f4448eb5 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_025.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_026.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_026.uasset new file mode 100644 index 00000000..76d0f74c Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_026.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_027.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_027.uasset new file mode 100644 index 00000000..aa7b1798 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_027.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_029.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_029.uasset new file mode 100644 index 00000000..b097d524 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_029.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_030.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_030.uasset new file mode 100644 index 00000000..52fac5d9 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_030.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_031.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_031.uasset new file mode 100644 index 00000000..2f1bcafd Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_031.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_032.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_032.uasset new file mode 100644 index 00000000..2e63dee9 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_032.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_033.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_033.uasset new file mode 100644 index 00000000..143d80e3 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_033.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_034.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_034.uasset new file mode 100644 index 00000000..a203418f Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_034.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_035.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_035.uasset new file mode 100644 index 00000000..411e4b04 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_035.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_036.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_036.uasset new file mode 100644 index 00000000..638c9416 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_036.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_037.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_037.uasset new file mode 100644 index 00000000..ad737568 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_037.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_038.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_038.uasset new file mode 100644 index 00000000..6d591d0f Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_038.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Texiaotietu_039.uasset b/GZJ/Asset/FX/Textures/T_Texiaotietu_039.uasset new file mode 100644 index 00000000..391ad82b Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Texiaotietu_039.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Volume_Fog.uasset b/GZJ/Asset/FX/Textures/T_Volume_Fog.uasset new file mode 100644 index 00000000..bb310c33 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Volume_Fog.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_Voronoi.uasset b/GZJ/Asset/FX/Textures/T_Voronoi.uasset new file mode 100644 index 00000000..0da23b23 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_Voronoi.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_frame_01.uasset b/GZJ/Asset/FX/Textures/T_frame_01.uasset new file mode 100644 index 00000000..079e4814 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_frame_01.uasset differ diff --git a/GZJ/Asset/FX/Textures/T_frame_02.uasset b/GZJ/Asset/FX/Textures/T_frame_02.uasset new file mode 100644 index 00000000..255e3c96 Binary files /dev/null and b/GZJ/Asset/FX/Textures/T_frame_02.uasset differ diff --git a/GZJ/Asset/FX/ui_Particle/UI_BreakThrough_01.uasset b/GZJ/Asset/FX/ui_Particle/UI_BreakThrough_01.uasset new file mode 100644 index 00000000..65032376 Binary files /dev/null and b/GZJ/Asset/FX/ui_Particle/UI_BreakThrough_01.uasset differ diff --git a/GZJ/Asset/FX/ui_Particle/UI_BreakThrough_02.uasset b/GZJ/Asset/FX/ui_Particle/UI_BreakThrough_02.uasset new file mode 100644 index 00000000..8e1e4af9 Binary files /dev/null and b/GZJ/Asset/FX/ui_Particle/UI_BreakThrough_02.uasset differ diff --git a/GZJ/Asset/FX/ui_Particle/UI_frame_01.uasset b/GZJ/Asset/FX/ui_Particle/UI_frame_01.uasset new file mode 100644 index 00000000..5c048210 Binary files /dev/null and b/GZJ/Asset/FX/ui_Particle/UI_frame_01.uasset differ diff --git a/GZJ/Asset/FX/ui_Particle/UI_frame_02.uasset b/GZJ/Asset/FX/ui_Particle/UI_frame_02.uasset new file mode 100644 index 00000000..1ffbf428 Binary files /dev/null and b/GZJ/Asset/FX/ui_Particle/UI_frame_02.uasset differ diff --git a/GZJ/Asset/FX/ui_Particle/UI_seal.uasset b/GZJ/Asset/FX/ui_Particle/UI_seal.uasset new file mode 100644 index 00000000..51ff94db Binary files /dev/null and b/GZJ/Asset/FX/ui_Particle/UI_seal.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_1.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_1.uasset new file mode 100644 index 00000000..0cb85bfc Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_1.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_10.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_10.uasset new file mode 100644 index 00000000..83e1a877 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_10.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_11.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_11.uasset new file mode 100644 index 00000000..c8baa6ff Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_11.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_12.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_12.uasset new file mode 100644 index 00000000..84c692e7 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_12.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_2.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_2.uasset new file mode 100644 index 00000000..67f01155 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_2.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_3.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_3.uasset new file mode 100644 index 00000000..7eb27b39 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_3.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_4.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_4.uasset new file mode 100644 index 00000000..ea60d610 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_4.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_5.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_5.uasset new file mode 100644 index 00000000..a1a64e02 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_5.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_6.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_6.uasset new file mode 100644 index 00000000..a84979bb Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_6.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_7.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_7.uasset new file mode 100644 index 00000000..f952b46a Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_7.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_8.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_8.uasset new file mode 100644 index 00000000..daacaeaa Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_8.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_9.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_9.uasset new file mode 100644 index 00000000..e5dc8c04 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Frames/Icon_UGC_Boss_9.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_01.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_01.uasset new file mode 100644 index 00000000..fc76ac19 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_01.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_02.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_02.uasset new file mode 100644 index 00000000..13990c1c Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_02.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_03.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_03.uasset new file mode 100644 index 00000000..2e20b748 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_03.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_04.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_04.uasset new file mode 100644 index 00000000..7932674c Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_04.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_05.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_05.uasset new file mode 100644 index 00000000..cefb025a Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_05.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_06.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_06.uasset new file mode 100644 index 00000000..3a98250c Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_06.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_07.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_07.uasset new file mode 100644 index 00000000..4658c30d Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_07.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_08.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_08.uasset new file mode 100644 index 00000000..90e6dc1f Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_08.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_09.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_09.uasset new file mode 100644 index 00000000..0471baf5 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_09.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_10.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_10.uasset new file mode 100644 index 00000000..85cebc60 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_10.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_11.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_11.uasset new file mode 100644 index 00000000..c7b51d84 Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_11.uasset differ diff --git a/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_12.uasset b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_12.uasset new file mode 100644 index 00000000..377b084a Binary files /dev/null and b/GZJ/Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_12.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_1.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_1.uasset new file mode 100644 index 00000000..549c327f Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_1.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_2.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_2.uasset new file mode 100644 index 00000000..d31c0fe8 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_2.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_3.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_3.uasset new file mode 100644 index 00000000..e0f6712c Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_3.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_4.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_4.uasset new file mode 100644 index 00000000..6ce1f3be Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_4.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_5.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_5.uasset new file mode 100644 index 00000000..6c1d1a82 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_5.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_6.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_6.uasset new file mode 100644 index 00000000..6d70347d Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_6.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_7.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_7.uasset new file mode 100644 index 00000000..b54b79c8 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_7.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_8.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_8.uasset new file mode 100644 index 00000000..616bb4b9 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_8.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_9.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_9.uasset new file mode 100644 index 00000000..5159a00c Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Frames/Icon_UGC_currency_9.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_01.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_01.uasset new file mode 100644 index 00000000..8901e529 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_01.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_02.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_02.uasset new file mode 100644 index 00000000..12690a42 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_02.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_03.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_03.uasset new file mode 100644 index 00000000..e12a8808 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_03.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_04.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_04.uasset new file mode 100644 index 00000000..686eb338 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_04.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_05.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_05.uasset new file mode 100644 index 00000000..4391dbec Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_05.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_06.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_06.uasset new file mode 100644 index 00000000..c4582495 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_06.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_07.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_07.uasset new file mode 100644 index 00000000..254095f2 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_07.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_08.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_08.uasset new file mode 100644 index 00000000..88b3c3b3 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_08.uasset differ diff --git a/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_09.uasset b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_09.uasset new file mode 100644 index 00000000..380a32a1 Binary files /dev/null and b/GZJ/Asset/IconTexture/Currency_Icon/Textures/Icon_UGC_currency_09.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_1.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_1.uasset new file mode 100644 index 00000000..d2495e07 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_1.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_10.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_10.uasset new file mode 100644 index 00000000..6fc380bf Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_10.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_11.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_11.uasset new file mode 100644 index 00000000..03d551b7 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_11.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_12.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_12.uasset new file mode 100644 index 00000000..2d2d6f7f Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_12.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_13.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_13.uasset new file mode 100644 index 00000000..5497dbbe Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_13.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_14.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_14.uasset new file mode 100644 index 00000000..0cd0c0a4 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_14.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_15.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_15.uasset new file mode 100644 index 00000000..c66577bb Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_15.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_16.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_16.uasset new file mode 100644 index 00000000..23fa4370 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_16.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_17.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_17.uasset new file mode 100644 index 00000000..9943cb06 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_17.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_18.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_18.uasset new file mode 100644 index 00000000..46ad90d9 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_18.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_19.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_19.uasset new file mode 100644 index 00000000..f1eeef15 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_19.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_2.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_2.uasset new file mode 100644 index 00000000..2241cea2 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_2.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_20.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_20.uasset new file mode 100644 index 00000000..9824f584 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_20.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_21.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_21.uasset new file mode 100644 index 00000000..8e771386 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_21.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_22.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_22.uasset new file mode 100644 index 00000000..d0883107 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_22.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_23.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_23.uasset new file mode 100644 index 00000000..c7c7aaf5 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_23.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_24.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_24.uasset new file mode 100644 index 00000000..79701483 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_24.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_25.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_25.uasset new file mode 100644 index 00000000..8ef3262f Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_25.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_26.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_26.uasset new file mode 100644 index 00000000..6455c431 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_26.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_27.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_27.uasset new file mode 100644 index 00000000..39992b6b Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_27.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_28.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_28.uasset new file mode 100644 index 00000000..787d9c7b Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_28.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_29.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_29.uasset new file mode 100644 index 00000000..eb1a014f Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_29.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_3.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_3.uasset new file mode 100644 index 00000000..2fb60750 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_3.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_30.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_30.uasset new file mode 100644 index 00000000..a3a1c9d8 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_30.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_31.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_31.uasset new file mode 100644 index 00000000..1c270cab Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_31.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_32.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_32.uasset new file mode 100644 index 00000000..c39d7ac6 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_32.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_4.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_4.uasset new file mode 100644 index 00000000..dd4fc799 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_4.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_5.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_5.uasset new file mode 100644 index 00000000..8bd3bda4 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_5.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_6.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_6.uasset new file mode 100644 index 00000000..c07f6e34 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_6.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_7.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_7.uasset new file mode 100644 index 00000000..5028ffbc Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_7.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_8.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_8.uasset new file mode 100644 index 00000000..adb65387 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_8.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_9.uasset b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_9.uasset new file mode 100644 index 00000000..26309f53 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Frames/Icon_UGC_role_9.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_01.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_01.uasset new file mode 100644 index 00000000..8a895f73 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_01.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_02.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_02.uasset new file mode 100644 index 00000000..d99528ba Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_02.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_03.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_03.uasset new file mode 100644 index 00000000..4c8b4ba9 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_03.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_04.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_04.uasset new file mode 100644 index 00000000..6de8821a Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_04.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_05.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_05.uasset new file mode 100644 index 00000000..50cc4920 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_05.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_06.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_06.uasset new file mode 100644 index 00000000..1a99e922 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_06.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_07.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_07.uasset new file mode 100644 index 00000000..9e775423 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_07.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_08.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_08.uasset new file mode 100644 index 00000000..8bf3e214 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_08.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_09.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_09.uasset new file mode 100644 index 00000000..a9002952 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_09.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_10.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_10.uasset new file mode 100644 index 00000000..d5e63d9c Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_10.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_11.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_11.uasset new file mode 100644 index 00000000..d3d81be3 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_11.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_12.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_12.uasset new file mode 100644 index 00000000..a6e8c03f Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_12.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_13.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_13.uasset new file mode 100644 index 00000000..2183a6bd Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_13.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_14.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_14.uasset new file mode 100644 index 00000000..3c169d4a Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_14.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_15.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_15.uasset new file mode 100644 index 00000000..f8784530 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_15.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_16.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_16.uasset new file mode 100644 index 00000000..15c25468 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_16.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_17.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_17.uasset new file mode 100644 index 00000000..25884699 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_17.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_18.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_18.uasset new file mode 100644 index 00000000..1d895e3b Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_18.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_19.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_19.uasset new file mode 100644 index 00000000..17d369fd Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_19.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_20.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_20.uasset new file mode 100644 index 00000000..90a30ad7 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_20.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_21.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_21.uasset new file mode 100644 index 00000000..f6d534e2 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_21.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_22.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_22.uasset new file mode 100644 index 00000000..f3a9e97c Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_22.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_23.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_23.uasset new file mode 100644 index 00000000..dca44338 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_23.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_24.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_24.uasset new file mode 100644 index 00000000..152eb20e Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_24.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_25.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_25.uasset new file mode 100644 index 00000000..f4f256f6 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_25.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_26.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_26.uasset new file mode 100644 index 00000000..876b14d5 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_26.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_27.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_27.uasset new file mode 100644 index 00000000..fdde277b Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_27.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_28.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_28.uasset new file mode 100644 index 00000000..27751a45 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_28.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_29.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_29.uasset new file mode 100644 index 00000000..56fb4c41 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_29.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_30.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_30.uasset new file mode 100644 index 00000000..07ad3584 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_30.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_31.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_31.uasset new file mode 100644 index 00000000..43886c71 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_31.uasset differ diff --git a/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_32.uasset b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_32.uasset new file mode 100644 index 00000000..72b4f847 Binary files /dev/null and b/GZJ/Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_32.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_1.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_1.uasset new file mode 100644 index 00000000..205c7888 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_1.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_2.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_2.uasset new file mode 100644 index 00000000..8fcd7961 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_2.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_3.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_3.uasset new file mode 100644 index 00000000..efb28014 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_3.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_4.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_4.uasset new file mode 100644 index 00000000..127a9ac8 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_4.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_5.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_5.uasset new file mode 100644 index 00000000..dd1f13d9 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Frames/Icon_UGC_challenge_5.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_01.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_01.uasset new file mode 100644 index 00000000..06658c82 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_01.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_02.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_02.uasset new file mode 100644 index 00000000..56ac3b60 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_02.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_03.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_03.uasset new file mode 100644 index 00000000..52e1eed6 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_03.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_04.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_04.uasset new file mode 100644 index 00000000..3618f01c Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_04.uasset differ diff --git a/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_05.uasset b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_05.uasset new file mode 100644 index 00000000..69e84515 Binary files /dev/null and b/GZJ/Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_05.uasset differ diff --git a/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_1.uasset b/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_1.uasset new file mode 100644 index 00000000..f95adc5b Binary files /dev/null and b/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_1.uasset differ diff --git a/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_2.uasset b/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_2.uasset new file mode 100644 index 00000000..513ac19a Binary files /dev/null and b/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_2.uasset differ diff --git a/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_3.uasset b/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_3.uasset new file mode 100644 index 00000000..eab03bde Binary files /dev/null and b/GZJ/Asset/IconTexture/chest_Icon/Frames/Icon_UGC_chest_3.uasset differ diff --git a/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_01.uasset b/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_01.uasset new file mode 100644 index 00000000..6c4af116 Binary files /dev/null and b/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_01.uasset differ diff --git a/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_02.uasset b/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_02.uasset new file mode 100644 index 00000000..e6bcfc08 Binary files /dev/null and b/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_02.uasset differ diff --git a/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_03.uasset b/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_03.uasset new file mode 100644 index 00000000..da04e685 Binary files /dev/null and b/GZJ/Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_03.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_Interface_05.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_Interface_05.uasset new file mode 100644 index 00000000..92bea95f Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_Interface_05.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_1.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_1.uasset new file mode 100644 index 00000000..a28b764e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_1.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_10.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_10.uasset new file mode 100644 index 00000000..6b5d6aef Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_10.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_11.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_11.uasset new file mode 100644 index 00000000..fe636dc9 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_11.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_12.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_12.uasset new file mode 100644 index 00000000..aaf535b9 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_12.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_13.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_13.uasset new file mode 100644 index 00000000..2edc9420 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_13.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_14.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_14.uasset new file mode 100644 index 00000000..2b21832d Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_14.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_15.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_15.uasset new file mode 100644 index 00000000..454f156c Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_15.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_16.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_16.uasset new file mode 100644 index 00000000..e9d5d5e4 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_16.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_17.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_17.uasset new file mode 100644 index 00000000..9ae8e9e0 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_17.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_18.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_18.uasset new file mode 100644 index 00000000..0643ad26 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_18.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_19.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_19.uasset new file mode 100644 index 00000000..ba6a72c5 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_19.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_2.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_2.uasset new file mode 100644 index 00000000..9f0e4bf6 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_2.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_20.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_20.uasset new file mode 100644 index 00000000..c61ca409 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_20.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_21.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_21.uasset new file mode 100644 index 00000000..716438d9 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_21.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_22.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_22.uasset new file mode 100644 index 00000000..957f0de5 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_22.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_23.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_23.uasset new file mode 100644 index 00000000..8562f392 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_23.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_24.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_24.uasset new file mode 100644 index 00000000..7b9c18a5 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_24.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_25.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_25.uasset new file mode 100644 index 00000000..5b89bfb5 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_25.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_26.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_26.uasset new file mode 100644 index 00000000..6a793a8d Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_26.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_27.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_27.uasset new file mode 100644 index 00000000..aab98f4a Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_27.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_28.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_28.uasset new file mode 100644 index 00000000..158d28a8 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_28.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_29.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_29.uasset new file mode 100644 index 00000000..80e54e5a Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_29.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_3.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_3.uasset new file mode 100644 index 00000000..2bc7f0c7 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_3.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_30.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_30.uasset new file mode 100644 index 00000000..2ca21fb9 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_30.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_31.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_31.uasset new file mode 100644 index 00000000..353820ab Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_31.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_32.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_32.uasset new file mode 100644 index 00000000..9af45fd0 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_32.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_33.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_33.uasset new file mode 100644 index 00000000..2015c529 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_33.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_34.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_34.uasset new file mode 100644 index 00000000..bb71f0d9 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_34.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_35.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_35.uasset new file mode 100644 index 00000000..cbc899f7 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_35.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_36.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_36.uasset new file mode 100644 index 00000000..e11eacbd Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_36.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_37.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_37.uasset new file mode 100644 index 00000000..98d76df0 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_37.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_38.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_38.uasset new file mode 100644 index 00000000..28b54db1 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_38.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_39.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_39.uasset new file mode 100644 index 00000000..e5e231aa Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_39.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_4.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_4.uasset new file mode 100644 index 00000000..2b512c55 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_4.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_40.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_40.uasset new file mode 100644 index 00000000..a65cacdc Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_40.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_41.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_41.uasset new file mode 100644 index 00000000..e731ae20 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_41.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_42.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_42.uasset new file mode 100644 index 00000000..741c3737 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_42.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_43.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_43.uasset new file mode 100644 index 00000000..36c81689 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_43.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_44.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_44.uasset new file mode 100644 index 00000000..22ba6c22 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_44.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_45.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_45.uasset new file mode 100644 index 00000000..adcbc512 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_45.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_46.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_46.uasset new file mode 100644 index 00000000..7609bdfc Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_46.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_47.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_47.uasset new file mode 100644 index 00000000..38bb6c7e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_47.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_48.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_48.uasset new file mode 100644 index 00000000..82abf201 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_48.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_49.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_49.uasset new file mode 100644 index 00000000..721406bb Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_49.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_5.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_5.uasset new file mode 100644 index 00000000..5e8372bd Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_5.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_50.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_50.uasset new file mode 100644 index 00000000..0d3de9e1 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_50.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_51.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_51.uasset new file mode 100644 index 00000000..6d5510b9 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_51.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_52.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_52.uasset new file mode 100644 index 00000000..6cfcf29f Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_52.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_53.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_53.uasset new file mode 100644 index 00000000..af2df360 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_53.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_54.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_54.uasset new file mode 100644 index 00000000..1eb5a80e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_54.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_55.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_55.uasset new file mode 100644 index 00000000..1cd370d0 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_55.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_56.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_56.uasset new file mode 100644 index 00000000..21106d96 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_56.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_57.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_57.uasset new file mode 100644 index 00000000..9ff919b8 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_57.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_58.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_58.uasset new file mode 100644 index 00000000..5082df3e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_58.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_59.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_59.uasset new file mode 100644 index 00000000..310f21be Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_59.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_6.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_6.uasset new file mode 100644 index 00000000..113d273c Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_6.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_60.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_60.uasset new file mode 100644 index 00000000..b3e9ab2b Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_60.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_61.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_61.uasset new file mode 100644 index 00000000..4071a414 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_61.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_62.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_62.uasset new file mode 100644 index 00000000..c4d8f70e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_62.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_63.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_63.uasset new file mode 100644 index 00000000..eb8d56f8 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_63.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_64.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_64.uasset new file mode 100644 index 00000000..9d89f9b7 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_64.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_65.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_65.uasset new file mode 100644 index 00000000..6a5ea201 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_65.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_7.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_7.uasset new file mode 100644 index 00000000..6e98eab8 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_7.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_8.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_8.uasset new file mode 100644 index 00000000..7351b33e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_8.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_9.uasset b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_9.uasset new file mode 100644 index 00000000..72b5cfa1 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Frames/Icon_UGC_file_9.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_Interface_5.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_Interface_5.uasset new file mode 100644 index 00000000..5b82c35e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_Interface_5.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_01.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_01.uasset new file mode 100644 index 00000000..96bf157d Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_01.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_02.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_02.uasset new file mode 100644 index 00000000..e03b4d53 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_02.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_03.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_03.uasset new file mode 100644 index 00000000..45dde247 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_03.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_04.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_04.uasset new file mode 100644 index 00000000..9fbd1610 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_04.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_05.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_05.uasset new file mode 100644 index 00000000..9251ae6b Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_05.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_06.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_06.uasset new file mode 100644 index 00000000..caff1bcc Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_06.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_07.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_07.uasset new file mode 100644 index 00000000..8cf6f239 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_07.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_08.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_08.uasset new file mode 100644 index 00000000..f7253945 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_08.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_09.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_09.uasset new file mode 100644 index 00000000..d048b8f4 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_09.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_10.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_10.uasset new file mode 100644 index 00000000..fd6c3577 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_10.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_11.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_11.uasset new file mode 100644 index 00000000..909e2cb1 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_11.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_12.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_12.uasset new file mode 100644 index 00000000..12009aef Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_12.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_13.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_13.uasset new file mode 100644 index 00000000..1f9815f6 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_13.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_14.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_14.uasset new file mode 100644 index 00000000..5ab10997 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_14.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_15.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_15.uasset new file mode 100644 index 00000000..bb7a4c7e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_15.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_16.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_16.uasset new file mode 100644 index 00000000..c66be591 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_16.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_17.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_17.uasset new file mode 100644 index 00000000..f2fca90b Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_17.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_18.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_18.uasset new file mode 100644 index 00000000..58d3a15d Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_18.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_19.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_19.uasset new file mode 100644 index 00000000..67520103 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_19.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_20.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_20.uasset new file mode 100644 index 00000000..42c96f0f Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_20.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_21.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_21.uasset new file mode 100644 index 00000000..841e9265 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_21.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_22.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_22.uasset new file mode 100644 index 00000000..31dfa75a Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_22.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_23.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_23.uasset new file mode 100644 index 00000000..55f35813 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_23.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_24.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_24.uasset new file mode 100644 index 00000000..45535865 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_24.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_25.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_25.uasset new file mode 100644 index 00000000..8e39a3db Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_25.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_26.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_26.uasset new file mode 100644 index 00000000..7c5c93d7 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_26.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_27.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_27.uasset new file mode 100644 index 00000000..e1d19bad Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_27.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.uasset new file mode 100644 index 00000000..b025bda1 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_29.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_29.uasset new file mode 100644 index 00000000..58b04372 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_29.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_30.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_30.uasset new file mode 100644 index 00000000..ea67394a Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_30.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_31.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_31.uasset new file mode 100644 index 00000000..b6973184 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_31.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_32.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_32.uasset new file mode 100644 index 00000000..df0ae939 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_32.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_33.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_33.uasset new file mode 100644 index 00000000..984d21a5 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_33.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_34.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_34.uasset new file mode 100644 index 00000000..8e8c4b0d Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_34.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_35.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_35.uasset new file mode 100644 index 00000000..0eb6dc49 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_35.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_36.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_36.uasset new file mode 100644 index 00000000..6f51f4b5 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_36.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_37.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_37.uasset new file mode 100644 index 00000000..7ed94d36 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_37.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_38.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_38.uasset new file mode 100644 index 00000000..edc5757e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_38.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_39.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_39.uasset new file mode 100644 index 00000000..c2c65309 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_39.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_40.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_40.uasset new file mode 100644 index 00000000..6b928294 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_40.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_41.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_41.uasset new file mode 100644 index 00000000..5ce799a4 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_41.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_42.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_42.uasset new file mode 100644 index 00000000..b96777ff Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_42.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_43.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_43.uasset new file mode 100644 index 00000000..94fe801b Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_43.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_44.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_44.uasset new file mode 100644 index 00000000..b5e99471 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_44.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_45.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_45.uasset new file mode 100644 index 00000000..cf90ae08 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_45.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_46.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_46.uasset new file mode 100644 index 00000000..fba4e6de Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_46.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_47.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_47.uasset new file mode 100644 index 00000000..784f3796 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_47.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_48.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_48.uasset new file mode 100644 index 00000000..c6efb9e5 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_48.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_49.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_49.uasset new file mode 100644 index 00000000..818db0a4 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_49.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_50.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_50.uasset new file mode 100644 index 00000000..9c9bc41d Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_50.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_51.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_51.uasset new file mode 100644 index 00000000..a2db3201 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_51.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_52.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_52.uasset new file mode 100644 index 00000000..2819419f Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_52.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_53.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_53.uasset new file mode 100644 index 00000000..ade072aa Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_53.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_54.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_54.uasset new file mode 100644 index 00000000..a411cdcb Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_54.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_55.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_55.uasset new file mode 100644 index 00000000..f941f6de Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_55.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_56.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_56.uasset new file mode 100644 index 00000000..17646dd6 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_56.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_57.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_57.uasset new file mode 100644 index 00000000..bacb3593 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_57.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_58.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_58.uasset new file mode 100644 index 00000000..66107606 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_58.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_59.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_59.uasset new file mode 100644 index 00000000..638e3c02 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_59.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_60.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_60.uasset new file mode 100644 index 00000000..ade010a8 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_60.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_61.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_61.uasset new file mode 100644 index 00000000..2e7586dd Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_61.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_62.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_62.uasset new file mode 100644 index 00000000..cc450179 Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_62.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_63.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_63.uasset new file mode 100644 index 00000000..fa36465e Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_63.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_64.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_64.uasset new file mode 100644 index 00000000..e1f234ec Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_64.uasset differ diff --git a/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_65.uasset b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_65.uasset new file mode 100644 index 00000000..8beb906c Binary files /dev/null and b/GZJ/Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_65.uasset differ diff --git a/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_01.uasset b/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_01.uasset new file mode 100644 index 00000000..ca489322 Binary files /dev/null and b/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_01.uasset differ diff --git a/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_02.uasset b/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_02.uasset new file mode 100644 index 00000000..a4236209 Binary files /dev/null and b/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_02.uasset differ diff --git a/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_03.uasset b/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_03.uasset new file mode 100644 index 00000000..6b2fdb5d Binary files /dev/null and b/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_03.uasset differ diff --git a/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_04.uasset b/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_04.uasset new file mode 100644 index 00000000..579c5f68 Binary files /dev/null and b/GZJ/Asset/IconTexture/general_Icon/T_HUD_BG_Item_Quality_04.uasset differ diff --git a/GZJ/Asset/IconTexture/general_Icon/T_HUD_Danger_Mask.uasset b/GZJ/Asset/IconTexture/general_Icon/T_HUD_Danger_Mask.uasset new file mode 100644 index 00000000..9bf0b7a0 Binary files /dev/null and b/GZJ/Asset/IconTexture/general_Icon/T_HUD_Danger_Mask.uasset differ diff --git a/GZJ/Asset/IconTexture/general_Icon/T_HUD_Danger_Tag.uasset b/GZJ/Asset/IconTexture/general_Icon/T_HUD_Danger_Tag.uasset new file mode 100644 index 00000000..e0f84df4 Binary files /dev/null and b/GZJ/Asset/IconTexture/general_Icon/T_HUD_Danger_Tag.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_1.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_1.uasset new file mode 100644 index 00000000..651d7a8f Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_1.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_10.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_10.uasset new file mode 100644 index 00000000..d827f3a5 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_10.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_11.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_11.uasset new file mode 100644 index 00000000..68e638b5 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_11.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_12.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_12.uasset new file mode 100644 index 00000000..e21f7f4f Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_12.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_13.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_13.uasset new file mode 100644 index 00000000..130c0500 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_13.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_14.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_14.uasset new file mode 100644 index 00000000..9d4a1970 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_14.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_2.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_2.uasset new file mode 100644 index 00000000..5f622934 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_2.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_3.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_3.uasset new file mode 100644 index 00000000..74b3ae88 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_3.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_4.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_4.uasset new file mode 100644 index 00000000..ddcbb2f1 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_4.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_5.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_5.uasset new file mode 100644 index 00000000..f6f680b4 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_5.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_6.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_6.uasset new file mode 100644 index 00000000..0f646dbe Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_6.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_7.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_7.uasset new file mode 100644 index 00000000..0c581d21 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_7.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_8.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_8.uasset new file mode 100644 index 00000000..c430a443 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_8.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_9.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_9.uasset new file mode 100644 index 00000000..326db3e7 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Frames/Icon_UGC_inherit_9.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.uasset new file mode 100644 index 00000000..361a3ba8 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.uasset new file mode 100644 index 00000000..ca6038eb Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_03.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_03.uasset new file mode 100644 index 00000000..0026377a Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_03.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_04.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_04.uasset new file mode 100644 index 00000000..c3356e05 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_04.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_05.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_05.uasset new file mode 100644 index 00000000..9020ed3a Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_05.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_06.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_06.uasset new file mode 100644 index 00000000..e66f8dbe Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_06.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_07.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_07.uasset new file mode 100644 index 00000000..28b57d80 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_07.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_08.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_08.uasset new file mode 100644 index 00000000..9b62166e Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_08.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_09.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_09.uasset new file mode 100644 index 00000000..fe906f75 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_09.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_10.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_10.uasset new file mode 100644 index 00000000..7d2a103b Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_10.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_11.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_11.uasset new file mode 100644 index 00000000..ff065f4b Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_11.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_12.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_12.uasset new file mode 100644 index 00000000..1d8bdac8 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_12.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_13.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_13.uasset new file mode 100644 index 00000000..ccff9a05 Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_13.uasset differ diff --git a/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_14.uasset b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_14.uasset new file mode 100644 index 00000000..c76996dd Binary files /dev/null and b/GZJ/Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_14.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_01.uasset b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_01.uasset new file mode 100644 index 00000000..43f47cae Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_01.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_02.uasset b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_02.uasset new file mode 100644 index 00000000..814afc7c Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_02.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_03.uasset b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_03.uasset new file mode 100644 index 00000000..52e19f59 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_03.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_04.uasset b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_04.uasset new file mode 100644 index 00000000..f6bdd7c9 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_04.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_06.uasset b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_06.uasset new file mode 100644 index 00000000..54beaf0f Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_06.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_07.uasset b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_07.uasset new file mode 100644 index 00000000..3d2f889f Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_07.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_08.uasset b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_08.uasset new file mode 100644 index 00000000..a26a2826 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_08.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_09.uasset b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_09.uasset new file mode 100644 index 00000000..23443924 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Frames/Icon_UGC_Interface_09.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_1.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_1.uasset new file mode 100644 index 00000000..97859d00 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_1.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_10.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_10.uasset new file mode 100644 index 00000000..e0abdef3 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_10.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_11.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_11.uasset new file mode 100644 index 00000000..66f61eb3 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_11.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_12.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_12.uasset new file mode 100644 index 00000000..ff49a27d Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_12.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_2.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_2.uasset new file mode 100644 index 00000000..db7ae79d Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_2.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_3.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_3.uasset new file mode 100644 index 00000000..fbebd0de Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_3.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_4.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_4.uasset new file mode 100644 index 00000000..57cbf6b1 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_4.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_6.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_6.uasset new file mode 100644 index 00000000..a64fa8d6 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_6.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_7.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_7.uasset new file mode 100644 index 00000000..ed8a15f0 Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_7.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_8.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_8.uasset new file mode 100644 index 00000000..3fc127fe Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_8.uasset differ diff --git a/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_9.uasset b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_9.uasset new file mode 100644 index 00000000..cd80e8da Binary files /dev/null and b/GZJ/Asset/IconTexture/interface_Icon/Textures/Icon_UGC_Interface_9.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_1.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_1.uasset new file mode 100644 index 00000000..3d38457e Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_1.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_10.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_10.uasset new file mode 100644 index 00000000..5e9b9b10 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_10.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_11.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_11.uasset new file mode 100644 index 00000000..a847a22c Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_11.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_12.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_12.uasset new file mode 100644 index 00000000..94ebba4d Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_12.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_13.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_13.uasset new file mode 100644 index 00000000..34e755ea Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_13.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_14.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_14.uasset new file mode 100644 index 00000000..36aaf91a Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_14.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_15.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_15.uasset new file mode 100644 index 00000000..fa77d11c Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_15.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_16.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_16.uasset new file mode 100644 index 00000000..90b7d0c7 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_16.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_17.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_17.uasset new file mode 100644 index 00000000..a2b0a060 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_17.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_18.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_18.uasset new file mode 100644 index 00000000..8cbe0c91 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_18.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_19.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_19.uasset new file mode 100644 index 00000000..e260a1b9 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_19.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_2.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_2.uasset new file mode 100644 index 00000000..195dc6d1 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_2.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_20.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_20.uasset new file mode 100644 index 00000000..34d1304c Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_20.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_21.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_21.uasset new file mode 100644 index 00000000..2e322346 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_21.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_22.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_22.uasset new file mode 100644 index 00000000..b96dc450 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_22.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_23.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_23.uasset new file mode 100644 index 00000000..237fcfb1 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_23.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_24.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_24.uasset new file mode 100644 index 00000000..bc704b17 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_24.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_25.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_25.uasset new file mode 100644 index 00000000..5474bba8 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_25.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_26.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_26.uasset new file mode 100644 index 00000000..0d920ee1 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_26.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_27.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_27.uasset new file mode 100644 index 00000000..7cbbfc6b Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_27.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_28.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_28.uasset new file mode 100644 index 00000000..003c1d32 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_28.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_29.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_29.uasset new file mode 100644 index 00000000..1ec52699 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_29.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_3.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_3.uasset new file mode 100644 index 00000000..4739365b Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_3.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_30.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_30.uasset new file mode 100644 index 00000000..6b7339ff Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_30.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_4.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_4.uasset new file mode 100644 index 00000000..4636df56 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_4.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_5.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_5.uasset new file mode 100644 index 00000000..b49ec54e Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_5.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_6.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_6.uasset new file mode 100644 index 00000000..c839c26a Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_6.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_7.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_7.uasset new file mode 100644 index 00000000..fd6f9374 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_7.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_8.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_8.uasset new file mode 100644 index 00000000..d51a266d Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_8.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_9.uasset b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_9.uasset new file mode 100644 index 00000000..9a9b2a0c Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Frames/Icon_UGC_module_9.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_01.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_01.uasset new file mode 100644 index 00000000..6ae02416 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_01.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_02.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_02.uasset new file mode 100644 index 00000000..ab014eb0 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_02.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_03.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_03.uasset new file mode 100644 index 00000000..d9759899 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_03.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_04.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_04.uasset new file mode 100644 index 00000000..aee1a1ca Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_04.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_05.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_05.uasset new file mode 100644 index 00000000..d406ef1c Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_05.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_06.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_06.uasset new file mode 100644 index 00000000..8f70da3f Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_06.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_07.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_07.uasset new file mode 100644 index 00000000..d699645d Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_07.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_08.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_08.uasset new file mode 100644 index 00000000..a8681659 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_08.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_09.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_09.uasset new file mode 100644 index 00000000..28287b57 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_09.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_10.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_10.uasset new file mode 100644 index 00000000..ece32529 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_10.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_11.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_11.uasset new file mode 100644 index 00000000..d40ae782 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_11.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_12.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_12.uasset new file mode 100644 index 00000000..150b9f26 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_12.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_13.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_13.uasset new file mode 100644 index 00000000..907657b9 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_13.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_14.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_14.uasset new file mode 100644 index 00000000..2d8fc5cb Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_14.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_15.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_15.uasset new file mode 100644 index 00000000..dba44dd6 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_15.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_16.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_16.uasset new file mode 100644 index 00000000..9de88d4e Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_16.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_17.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_17.uasset new file mode 100644 index 00000000..3f258c6b Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_17.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_18.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_18.uasset new file mode 100644 index 00000000..fff8071b Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_18.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_19.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_19.uasset new file mode 100644 index 00000000..5b942246 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_19.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_20.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_20.uasset new file mode 100644 index 00000000..c033a178 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_20.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_21.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_21.uasset new file mode 100644 index 00000000..1cb6621f Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_21.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_22.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_22.uasset new file mode 100644 index 00000000..fc6ae284 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_22.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_23.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_23.uasset new file mode 100644 index 00000000..bed2b775 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_23.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_24.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_24.uasset new file mode 100644 index 00000000..80950cc3 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_24.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_25.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_25.uasset new file mode 100644 index 00000000..c11e9eac Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_25.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_26.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_26.uasset new file mode 100644 index 00000000..aafe7c9b Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_26.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_27.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_27.uasset new file mode 100644 index 00000000..f6735129 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_27.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_28.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_28.uasset new file mode 100644 index 00000000..d94f331b Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_28.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_29.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_29.uasset new file mode 100644 index 00000000..4ebde232 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_29.uasset differ diff --git a/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_30.uasset b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_30.uasset new file mode 100644 index 00000000..8c6295f1 Binary files /dev/null and b/GZJ/Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_30.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_1.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_1.uasset new file mode 100644 index 00000000..c0b41cf5 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_1.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_10.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_10.uasset new file mode 100644 index 00000000..47299e5a Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_10.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_11.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_11.uasset new file mode 100644 index 00000000..36461e1b Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_11.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_12.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_12.uasset new file mode 100644 index 00000000..3b12c02f Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_12.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_13.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_13.uasset new file mode 100644 index 00000000..c6021a5b Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_13.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_14.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_14.uasset new file mode 100644 index 00000000..deba1d6e Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_14.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_15.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_15.uasset new file mode 100644 index 00000000..b7d6356d Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_15.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_16.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_16.uasset new file mode 100644 index 00000000..d3d07188 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_16.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_2.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_2.uasset new file mode 100644 index 00000000..95228214 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_2.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_3.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_3.uasset new file mode 100644 index 00000000..26508ddd Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_3.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_4.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_4.uasset new file mode 100644 index 00000000..68f2c918 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_4.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_5.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_5.uasset new file mode 100644 index 00000000..e6cdfc46 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_5.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_6.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_6.uasset new file mode 100644 index 00000000..2078311c Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_6.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_7.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_7.uasset new file mode 100644 index 00000000..c9669fbc Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_7.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_8.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_8.uasset new file mode 100644 index 00000000..22bba66d Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_8.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_9.uasset b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_9.uasset new file mode 100644 index 00000000..c2fbcca3 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Frames/Icon_UGC_monster_9.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_01.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_01.uasset new file mode 100644 index 00000000..9d2552c4 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_01.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_02.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_02.uasset new file mode 100644 index 00000000..60adb0f2 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_02.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_03.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_03.uasset new file mode 100644 index 00000000..f237642f Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_03.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_04.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_04.uasset new file mode 100644 index 00000000..c4f731b7 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_04.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_05.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_05.uasset new file mode 100644 index 00000000..ea090161 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_05.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_06.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_06.uasset new file mode 100644 index 00000000..5c3b94c2 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_06.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_07.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_07.uasset new file mode 100644 index 00000000..2006e887 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_07.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_08.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_08.uasset new file mode 100644 index 00000000..62cb0d4e Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_08.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_09.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_09.uasset new file mode 100644 index 00000000..e237abb2 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_09.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_10.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_10.uasset new file mode 100644 index 00000000..957f702b Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_10.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_11.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_11.uasset new file mode 100644 index 00000000..61370535 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_11.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_12.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_12.uasset new file mode 100644 index 00000000..cfe5d0da Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_12.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_13.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_13.uasset new file mode 100644 index 00000000..8a703c84 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_13.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_14.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_14.uasset new file mode 100644 index 00000000..5d64b90e Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_14.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_15.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_15.uasset new file mode 100644 index 00000000..7db22a78 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_15.uasset differ diff --git a/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_16.uasset b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_16.uasset new file mode 100644 index 00000000..ee823af2 Binary files /dev/null and b/GZJ/Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_16.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_1.uasset b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_1.uasset new file mode 100644 index 00000000..6efd43d4 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_1.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_2.uasset b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_2.uasset new file mode 100644 index 00000000..266c0996 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_2.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_3.uasset b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_3.uasset new file mode 100644 index 00000000..c8922f10 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_3.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_4.uasset b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_4.uasset new file mode 100644 index 00000000..4057ec5d Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_4.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_5.uasset b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_5.uasset new file mode 100644 index 00000000..af67b4d1 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_5.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_6.uasset b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_6.uasset new file mode 100644 index 00000000..a3827890 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_6.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_7.uasset b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_7.uasset new file mode 100644 index 00000000..e892c219 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_7.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_8.uasset b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_8.uasset new file mode 100644 index 00000000..8c50ee59 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Frames/Icon_UGC_technology_8.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_01.uasset b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_01.uasset new file mode 100644 index 00000000..9b2226be Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_01.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_02.uasset b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_02.uasset new file mode 100644 index 00000000..f855c51c Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_02.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_03.uasset b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_03.uasset new file mode 100644 index 00000000..e531bb21 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_03.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_04.uasset b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_04.uasset new file mode 100644 index 00000000..46f94521 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_04.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_05.uasset b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_05.uasset new file mode 100644 index 00000000..c2433314 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_05.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_06.uasset b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_06.uasset new file mode 100644 index 00000000..bc1953ac Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_06.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_07.uasset b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_07.uasset new file mode 100644 index 00000000..c33e5a28 Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_07.uasset differ diff --git a/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_08.uasset b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_08.uasset new file mode 100644 index 00000000..f130872a Binary files /dev/null and b/GZJ/Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_08.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_1.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_1.uasset new file mode 100644 index 00000000..265caba2 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_1.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_2.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_2.uasset new file mode 100644 index 00000000..57202b02 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_2.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_3.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_3.uasset new file mode 100644 index 00000000..b2d875f8 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_3.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_4.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_4.uasset new file mode 100644 index 00000000..ddcc6f88 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_4.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_5.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_5.uasset new file mode 100644 index 00000000..496caa41 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_5.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_6.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_6.uasset new file mode 100644 index 00000000..21a9aa6a Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Frames/Icon_UGC_weapon_6.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_01.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_01.uasset new file mode 100644 index 00000000..cac7dfa4 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_01.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_02.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_02.uasset new file mode 100644 index 00000000..a75db20e Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_02.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_03.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_03.uasset new file mode 100644 index 00000000..fadb96a9 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_03.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_04.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_04.uasset new file mode 100644 index 00000000..bfde6a1e Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_04.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_05.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_05.uasset new file mode 100644 index 00000000..d2e41ca6 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_05.uasset differ diff --git a/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_06.uasset b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_06.uasset new file mode 100644 index 00000000..2b3bc5c3 Binary files /dev/null and b/GZJ/Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_06.uasset differ diff --git a/GZJ/Asset/Material/MI_Book_1.uasset b/GZJ/Asset/Material/MI_Book_1.uasset new file mode 100644 index 00000000..35801284 Binary files /dev/null and b/GZJ/Asset/Material/MI_Book_1.uasset differ diff --git a/GZJ/Asset/Material/MI_Book_2.uasset b/GZJ/Asset/Material/MI_Book_2.uasset new file mode 100644 index 00000000..0485b19e Binary files /dev/null and b/GZJ/Asset/Material/MI_Book_2.uasset differ diff --git a/GZJ/Asset/Material/MI_Book_3.uasset b/GZJ/Asset/Material/MI_Book_3.uasset new file mode 100644 index 00000000..d5fb85db Binary files /dev/null and b/GZJ/Asset/Material/MI_Book_3.uasset differ diff --git a/GZJ/Asset/Material/MI_Book_4.uasset b/GZJ/Asset/Material/MI_Book_4.uasset new file mode 100644 index 00000000..9ba72f3b Binary files /dev/null and b/GZJ/Asset/Material/MI_Book_4.uasset differ diff --git a/GZJ/Asset/Material/MI_SacrificialAltar.uasset b/GZJ/Asset/Material/MI_SacrificialAltar.uasset new file mode 100644 index 00000000..9eba615b Binary files /dev/null and b/GZJ/Asset/Material/MI_SacrificialAltar.uasset differ diff --git a/GZJ/Asset/Material/MI_crystal.uasset b/GZJ/Asset/Material/MI_crystal.uasset new file mode 100644 index 00000000..d19fae35 Binary files /dev/null and b/GZJ/Asset/Material/MI_crystal.uasset differ diff --git a/GZJ/Asset/Material/M_Skyball.uasset b/GZJ/Asset/Material/M_Skyball.uasset new file mode 100644 index 00000000..1a03f4cd Binary files /dev/null and b/GZJ/Asset/Material/M_Skyball.uasset differ diff --git a/GZJ/Asset/Material/Mi_Skyball.uasset b/GZJ/Asset/Material/Mi_Skyball.uasset new file mode 100644 index 00000000..b81008ba Binary files /dev/null and b/GZJ/Asset/Material/Mi_Skyball.uasset differ diff --git a/GZJ/Asset/Material/Mi_floor_01.uasset b/GZJ/Asset/Material/Mi_floor_01.uasset new file mode 100644 index 00000000..b951bd7e Binary files /dev/null and b/GZJ/Asset/Material/Mi_floor_01.uasset differ diff --git a/GZJ/Asset/Material/Mi_floor_02.uasset b/GZJ/Asset/Material/Mi_floor_02.uasset new file mode 100644 index 00000000..33e8c86c Binary files /dev/null and b/GZJ/Asset/Material/Mi_floor_02.uasset differ diff --git a/GZJ/Asset/Material/Mi_floor_03.uasset b/GZJ/Asset/Material/Mi_floor_03.uasset new file mode 100644 index 00000000..2c59bb06 Binary files /dev/null and b/GZJ/Asset/Material/Mi_floor_03.uasset differ diff --git a/GZJ/Asset/Mesh/SM_UGC_Book.uasset b/GZJ/Asset/Mesh/SM_UGC_Book.uasset new file mode 100644 index 00000000..3730eea0 Binary files /dev/null and b/GZJ/Asset/Mesh/SM_UGC_Book.uasset differ diff --git a/GZJ/Asset/Mesh/SM_UGC_SacrificialAltar.uasset b/GZJ/Asset/Mesh/SM_UGC_SacrificialAltar.uasset new file mode 100644 index 00000000..1e8615bd Binary files /dev/null and b/GZJ/Asset/Mesh/SM_UGC_SacrificialAltar.uasset differ diff --git a/GZJ/Asset/Mesh/SM_crystal.uasset b/GZJ/Asset/Mesh/SM_crystal.uasset new file mode 100644 index 00000000..bf9e3b7f Binary files /dev/null and b/GZJ/Asset/Mesh/SM_crystal.uasset differ diff --git a/GZJ/Asset/Texture/T_Book_C.uasset b/GZJ/Asset/Texture/T_Book_C.uasset new file mode 100644 index 00000000..e2bd3576 Binary files /dev/null and b/GZJ/Asset/Texture/T_Book_C.uasset differ diff --git a/GZJ/Asset/Texture/T_Book_N.uasset b/GZJ/Asset/Texture/T_Book_N.uasset new file mode 100644 index 00000000..7facc45b Binary files /dev/null and b/GZJ/Asset/Texture/T_Book_N.uasset differ diff --git a/GZJ/Asset/Texture/T_UGC_SacrificialAltar_D.uasset b/GZJ/Asset/Texture/T_UGC_SacrificialAltar_D.uasset new file mode 100644 index 00000000..f55f726d Binary files /dev/null and b/GZJ/Asset/Texture/T_UGC_SacrificialAltar_D.uasset differ diff --git a/GZJ/Asset/Texture/T_UGC_SacrificialAltar_N.uasset b/GZJ/Asset/Texture/T_UGC_SacrificialAltar_N.uasset new file mode 100644 index 00000000..cec01b03 Binary files /dev/null and b/GZJ/Asset/Texture/T_UGC_SacrificialAltar_N.uasset differ diff --git a/GZJ/Asset/Texture/T_UGC_SacrificialAltar_RMA.uasset b/GZJ/Asset/Texture/T_UGC_SacrificialAltar_RMA.uasset new file mode 100644 index 00000000..14126d5e Binary files /dev/null and b/GZJ/Asset/Texture/T_UGC_SacrificialAltar_RMA.uasset differ diff --git a/GZJ/Asset/Texture/T_UGC_crystal_D.uasset b/GZJ/Asset/Texture/T_UGC_crystal_D.uasset new file mode 100644 index 00000000..8260350f Binary files /dev/null and b/GZJ/Asset/Texture/T_UGC_crystal_D.uasset differ diff --git a/GZJ/Asset/Texture/T_UGC_crystal_N.uasset b/GZJ/Asset/Texture/T_UGC_crystal_N.uasset new file mode 100644 index 00000000..c6a185a6 Binary files /dev/null and b/GZJ/Asset/Texture/T_UGC_crystal_N.uasset differ diff --git a/GZJ/Asset/Texture/T_UGC_crystal_RMA.uasset b/GZJ/Asset/Texture/T_UGC_crystal_RMA.uasset new file mode 100644 index 00000000..518be303 Binary files /dev/null and b/GZJ/Asset/Texture/T_UGC_crystal_RMA.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/BP_FittingDragDropData.uasset b/GZJ/Asset/UI/ChildWidgets/BP_FittingDragDropData.uasset new file mode 100644 index 00000000..fddf77ef Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/BP_FittingDragDropData.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_BagSlotItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_BagSlotItem.uasset new file mode 100644 index 00000000..d09bb0a3 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_BagSlotItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_BagWeaponItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_BagWeaponItem.uasset new file mode 100644 index 00000000..4f1cb93b Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_BagWeaponItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_Challenge_Button.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_Challenge_Button.uasset new file mode 100644 index 00000000..1d64c9da Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_Challenge_Button.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_CloseWidget.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_CloseWidget.uasset new file mode 100644 index 00000000..f8c1ca3e Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_CloseWidget.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_DifficultyItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_DifficultyItem.uasset new file mode 100644 index 00000000..1f909a21 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_DifficultyItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_DifficultyRangeItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_DifficultyRangeItem.uasset new file mode 100644 index 00000000..e6782cbf Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_DifficultyRangeItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_DragItemVisual.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_DragItemVisual.uasset new file mode 100644 index 00000000..fb791038 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_DragItemVisual.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_DropItemWidget.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_DropItemWidget.uasset new file mode 100644 index 00000000..34d40ebb Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_DropItemWidget.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_FittingDragVisual.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_FittingDragVisual.uasset new file mode 100644 index 00000000..9e0cae42 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_FittingDragVisual.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_FittingItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_FittingItem.uasset new file mode 100644 index 00000000..4d37d2a9 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_FittingItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_FittingItemInfo.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_FittingItemInfo.uasset new file mode 100644 index 00000000..5a061c7c Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_FittingItemInfo.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_FittingList.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_FittingList.uasset new file mode 100644 index 00000000..3dd9c4cf Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_FittingList.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_GenerateAllButton.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_GenerateAllButton.uasset new file mode 100644 index 00000000..009b8390 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_GenerateAllButton.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_GenerateInfo.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_GenerateInfo.uasset new file mode 100644 index 00000000..44e159ce Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_GenerateInfo.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_GenerateItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_GenerateItem.uasset new file mode 100644 index 00000000..0f621c53 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_GenerateItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_InheritItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_InheritItem.uasset new file mode 100644 index 00000000..da469c02 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_InheritItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_InheritPanel.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_InheritPanel.uasset new file mode 100644 index 00000000..094802c7 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_InheritPanel.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_InheritSelectItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_InheritSelectItem.uasset new file mode 100644 index 00000000..10f7d3fc Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_InheritSelectItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_InteractButton.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_InteractButton.uasset new file mode 100644 index 00000000..16b19712 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_InteractButton.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_OperateButton.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_OperateButton.uasset new file mode 100644 index 00000000..4a35f5d1 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_OperateButton.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_OperationIcon.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_OperationIcon.uasset new file mode 100644 index 00000000..4ae31f9d Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_OperationIcon.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_PlayerInfo.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_PlayerInfo.uasset new file mode 100644 index 00000000..bd07048c Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_PlayerInfo.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_RewardItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_RewardItem.uasset new file mode 100644 index 00000000..e93419c6 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_RewardItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillButton.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillButton.uasset new file mode 100644 index 00000000..7f134898 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillButton.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillItem.uasset new file mode 100644 index 00000000..c9525ea3 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillSlots.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillSlots.uasset new file mode 100644 index 00000000..bc99cdc1 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_SelectSkillSlots.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_SelectWeaponItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_SelectWeaponItem.uasset new file mode 100644 index 00000000..77a3cee0 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_SelectWeaponItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_SettleSave.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_SettleSave.uasset new file mode 100644 index 00000000..31233cba Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_SettleSave.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_SettlementSaveItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_SettlementSaveItem.uasset new file mode 100644 index 00000000..432ad4cf Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_SettlementSaveItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_SkillSelectButton.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_SkillSelectButton.uasset new file mode 100644 index 00000000..e476f900 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_SkillSelectButton.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_TitleButton.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_TitleButton.uasset new file mode 100644 index 00000000..ca95b3f6 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_TitleButton.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_WeaponAttributeItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponAttributeItem.uasset new file mode 100644 index 00000000..74cbc3d4 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponAttributeItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_WeaponFittingItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponFittingItem.uasset new file mode 100644 index 00000000..f76f12b2 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponFittingItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_WeaponFittingList.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponFittingList.uasset new file mode 100644 index 00000000..71575d94 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponFittingList.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_WeaponInfo.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponInfo.uasset new file mode 100644 index 00000000..c932aa54 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponInfo.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_WeaponItemFitting.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponItemFitting.uasset new file mode 100644 index 00000000..690e80e2 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponItemFitting.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_WeaponPartItem.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponPartItem.uasset new file mode 100644 index 00000000..8aa4cc30 Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_WeaponPartItem.uasset differ diff --git a/GZJ/Asset/UI/ChildWidgets/WBP_WidgetHeader.uasset b/GZJ/Asset/UI/ChildWidgets/WBP_WidgetHeader.uasset new file mode 100644 index 00000000..74cd691f Binary files /dev/null and b/GZJ/Asset/UI/ChildWidgets/WBP_WidgetHeader.uasset differ diff --git a/GZJ/Asset/UI/GM/WBP_GM.uasset b/GZJ/Asset/UI/GM/WBP_GM.uasset new file mode 100644 index 00000000..43569cbb Binary files /dev/null and b/GZJ/Asset/UI/GM/WBP_GM.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_ForceGuidePanel.uasset b/GZJ/Asset/UI/Guide/WBP_ForceGuidePanel.uasset new file mode 100644 index 00000000..c18cc581 Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_ForceGuidePanel.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_ForceGuide_Backpack.uasset b/GZJ/Asset/UI/Guide/WBP_ForceGuide_Backpack.uasset new file mode 100644 index 00000000..8b24e356 Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_ForceGuide_Backpack.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_ForceGuide_BossInfo.uasset b/GZJ/Asset/UI/Guide/WBP_ForceGuide_BossInfo.uasset new file mode 100644 index 00000000..8669ea78 Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_ForceGuide_BossInfo.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_ForceGuide_Challenge.uasset b/GZJ/Asset/UI/Guide/WBP_ForceGuide_Challenge.uasset new file mode 100644 index 00000000..d613fce9 Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_ForceGuide_Challenge.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_ForceGuide_Tech.uasset b/GZJ/Asset/UI/Guide/WBP_ForceGuide_Tech.uasset new file mode 100644 index 00000000..82e870ea Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_ForceGuide_Tech.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_ForceGuide_Unpacking.uasset b/GZJ/Asset/UI/Guide/WBP_ForceGuide_Unpacking.uasset new file mode 100644 index 00000000..0bcece71 Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_ForceGuide_Unpacking.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_GuidePanel.uasset b/GZJ/Asset/UI/Guide/WBP_GuidePanel.uasset new file mode 100644 index 00000000..1b3c9d1f Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_GuidePanel.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_GuideTipsBase.uasset b/GZJ/Asset/UI/Guide/WBP_GuideTipsBase.uasset new file mode 100644 index 00000000..c346b624 Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_GuideTipsBase.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_GuideTips_0.uasset b/GZJ/Asset/UI/Guide/WBP_GuideTips_0.uasset new file mode 100644 index 00000000..463248c9 Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_GuideTips_0.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_GuideTips_1.uasset b/GZJ/Asset/UI/Guide/WBP_GuideTips_1.uasset new file mode 100644 index 00000000..55a5477a Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_GuideTips_1.uasset differ diff --git a/GZJ/Asset/UI/Guide/WBP_GuideTips_2.uasset b/GZJ/Asset/UI/Guide/WBP_GuideTips_2.uasset new file mode 100644 index 00000000..f30d65fa Binary files /dev/null and b/GZJ/Asset/UI/Guide/WBP_GuideTips_2.uasset differ diff --git a/GZJ/Asset/UI/Monster/WBP_MonsterHealth.uasset b/GZJ/Asset/UI/Monster/WBP_MonsterHealth.uasset new file mode 100644 index 00000000..434f5244 Binary files /dev/null and b/GZJ/Asset/UI/Monster/WBP_MonsterHealth.uasset differ diff --git a/GZJ/Asset/UI/Narration/WBP_BossNarration.uasset b/GZJ/Asset/UI/Narration/WBP_BossNarration.uasset new file mode 100644 index 00000000..2cade1ce Binary files /dev/null and b/GZJ/Asset/UI/Narration/WBP_BossNarration.uasset differ diff --git a/GZJ/Asset/UI/Narration/WBP_CrystalNarration.uasset b/GZJ/Asset/UI/Narration/WBP_CrystalNarration.uasset new file mode 100644 index 00000000..1092109b Binary files /dev/null and b/GZJ/Asset/UI/Narration/WBP_CrystalNarration.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_AttackWaveNotice.uasset b/GZJ/Asset/UI/Notice/WBP_AttackWaveNotice.uasset new file mode 100644 index 00000000..11802d8d Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_AttackWaveNotice.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_AttackWaveRemainTimeNotice.uasset b/GZJ/Asset/UI/Notice/WBP_AttackWaveRemainTimeNotice.uasset new file mode 100644 index 00000000..c765c206 Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_AttackWaveRemainTimeNotice.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_CountDownNotice.uasset b/GZJ/Asset/UI/Notice/WBP_CountDownNotice.uasset new file mode 100644 index 00000000..ff19d863 Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_CountDownNotice.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_GlobalNotice.uasset b/GZJ/Asset/UI/Notice/WBP_GlobalNotice.uasset new file mode 100644 index 00000000..99b11359 Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_GlobalNotice.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_InitialNotice.uasset b/GZJ/Asset/UI/Notice/WBP_InitialNotice.uasset new file mode 100644 index 00000000..1b5315a0 Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_InitialNotice.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_InitialNotice_V2.uasset b/GZJ/Asset/UI/Notice/WBP_InitialNotice_V2.uasset new file mode 100644 index 00000000..805edd0e Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_InitialNotice_V2.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_NoticeBase.uasset b/GZJ/Asset/UI/Notice/WBP_NoticeBase.uasset new file mode 100644 index 00000000..21300ace Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_NoticeBase.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_RespawnNotice.uasset b/GZJ/Asset/UI/Notice/WBP_RespawnNotice.uasset new file mode 100644 index 00000000..58b43f72 Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_RespawnNotice.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_RollingNotice.uasset b/GZJ/Asset/UI/Notice/WBP_RollingNotice.uasset new file mode 100644 index 00000000..bf3d462c Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_RollingNotice.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_RollingNoticePanel.uasset b/GZJ/Asset/UI/Notice/WBP_RollingNoticePanel.uasset new file mode 100644 index 00000000..8ba49020 Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_RollingNoticePanel.uasset differ diff --git a/GZJ/Asset/UI/Notice/WBP_WarningFrameNotice.uasset b/GZJ/Asset/UI/Notice/WBP_WarningFrameNotice.uasset new file mode 100644 index 00000000..7e21a7e8 Binary files /dev/null and b/GZJ/Asset/UI/Notice/WBP_WarningFrameNotice.uasset differ diff --git a/GZJ/Asset/UI/SceneObject/WBP_SceneObject.uasset b/GZJ/Asset/UI/SceneObject/WBP_SceneObject.uasset new file mode 100644 index 00000000..e1496ec2 Binary files /dev/null and b/GZJ/Asset/UI/SceneObject/WBP_SceneObject.uasset differ diff --git a/GZJ/Asset/UI/Skill/WBP_SkillBtn.uasset b/GZJ/Asset/UI/Skill/WBP_SkillBtn.uasset new file mode 100644 index 00000000..3f14d5ff Binary files /dev/null and b/GZJ/Asset/UI/Skill/WBP_SkillBtn.uasset differ diff --git a/GZJ/Asset/UI/Skill/WBP_SkillBtn_Item.uasset b/GZJ/Asset/UI/Skill/WBP_SkillBtn_Item.uasset new file mode 100644 index 00000000..b4b22241 Binary files /dev/null and b/GZJ/Asset/UI/Skill/WBP_SkillBtn_Item.uasset differ diff --git a/GZJ/Asset/UI/Skill/WBP_SkillBtn_Item_2.uasset b/GZJ/Asset/UI/Skill/WBP_SkillBtn_Item_2.uasset new file mode 100644 index 00000000..80473ab3 Binary files /dev/null and b/GZJ/Asset/UI/Skill/WBP_SkillBtn_Item_2.uasset differ diff --git a/GZJ/Asset/UI/UIMaterial/Mat_CD.uasset b/GZJ/Asset/UI/UIMaterial/Mat_CD.uasset new file mode 100644 index 00000000..29d8ac38 Binary files /dev/null and b/GZJ/Asset/UI/UIMaterial/Mat_CD.uasset differ diff --git a/GZJ/Asset/UI/UI_Root.uasset b/GZJ/Asset/UI/UI_Root.uasset new file mode 100644 index 00000000..7ae092ef Binary files /dev/null and b/GZJ/Asset/UI/UI_Root.uasset differ diff --git a/GZJ/Asset/UI/WBP_ActiveMonsterTalk.uasset b/GZJ/Asset/UI/WBP_ActiveMonsterTalk.uasset new file mode 100644 index 00000000..db7169f2 Binary files /dev/null and b/GZJ/Asset/UI/WBP_ActiveMonsterTalk.uasset differ diff --git a/GZJ/Asset/UI/WBP_AttackBossPanel.uasset b/GZJ/Asset/UI/WBP_AttackBossPanel.uasset new file mode 100644 index 00000000..fdd9fa9b Binary files /dev/null and b/GZJ/Asset/UI/WBP_AttackBossPanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_AttributePanel.uasset b/GZJ/Asset/UI/WBP_AttributePanel.uasset new file mode 100644 index 00000000..c9472a68 Binary files /dev/null and b/GZJ/Asset/UI/WBP_AttributePanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_AvatarFrame.uasset b/GZJ/Asset/UI/WBP_AvatarFrame.uasset new file mode 100644 index 00000000..0eeeaebd Binary files /dev/null and b/GZJ/Asset/UI/WBP_AvatarFrame.uasset differ diff --git a/GZJ/Asset/UI/WBP_Bag.uasset b/GZJ/Asset/UI/WBP_Bag.uasset new file mode 100644 index 00000000..90761a7e Binary files /dev/null and b/GZJ/Asset/UI/WBP_Bag.uasset differ diff --git a/GZJ/Asset/UI/WBP_BossHealth.uasset b/GZJ/Asset/UI/WBP_BossHealth.uasset new file mode 100644 index 00000000..59c20659 Binary files /dev/null and b/GZJ/Asset/UI/WBP_BossHealth.uasset differ diff --git a/GZJ/Asset/UI/WBP_BossInfoPanel_V2.uasset b/GZJ/Asset/UI/WBP_BossInfoPanel_V2.uasset new file mode 100644 index 00000000..5ea8dc40 Binary files /dev/null and b/GZJ/Asset/UI/WBP_BossInfoPanel_V2.uasset differ diff --git a/GZJ/Asset/UI/WBP_BossInfo_Item_V2.uasset b/GZJ/Asset/UI/WBP_BossInfo_Item_V2.uasset new file mode 100644 index 00000000..c0cd5635 Binary files /dev/null and b/GZJ/Asset/UI/WBP_BossInfo_Item_V2.uasset differ diff --git a/GZJ/Asset/UI/WBP_ChallengeInfo.uasset b/GZJ/Asset/UI/WBP_ChallengeInfo.uasset new file mode 100644 index 00000000..d8096090 Binary files /dev/null and b/GZJ/Asset/UI/WBP_ChallengeInfo.uasset differ diff --git a/GZJ/Asset/UI/WBP_ChallengeText.uasset b/GZJ/Asset/UI/WBP_ChallengeText.uasset new file mode 100644 index 00000000..79cf6883 Binary files /dev/null and b/GZJ/Asset/UI/WBP_ChallengeText.uasset differ diff --git a/GZJ/Asset/UI/WBP_Challenge_Item_V2.uasset b/GZJ/Asset/UI/WBP_Challenge_Item_V2.uasset new file mode 100644 index 00000000..4108f47b Binary files /dev/null and b/GZJ/Asset/UI/WBP_Challenge_Item_V2.uasset differ diff --git a/GZJ/Asset/UI/WBP_Challenge_V2.uasset b/GZJ/Asset/UI/WBP_Challenge_V2.uasset new file mode 100644 index 00000000..22bdc001 Binary files /dev/null and b/GZJ/Asset/UI/WBP_Challenge_V2.uasset differ diff --git a/GZJ/Asset/UI/WBP_CrystalHealth.uasset b/GZJ/Asset/UI/WBP_CrystalHealth.uasset new file mode 100644 index 00000000..8a7b8dda Binary files /dev/null and b/GZJ/Asset/UI/WBP_CrystalHealth.uasset differ diff --git a/GZJ/Asset/UI/WBP_DifficultInfo.uasset b/GZJ/Asset/UI/WBP_DifficultInfo.uasset new file mode 100644 index 00000000..978a686e Binary files /dev/null and b/GZJ/Asset/UI/WBP_DifficultInfo.uasset differ diff --git a/GZJ/Asset/UI/WBP_GeneralSlide.uasset b/GZJ/Asset/UI/WBP_GeneralSlide.uasset new file mode 100644 index 00000000..20ba6aa2 Binary files /dev/null and b/GZJ/Asset/UI/WBP_GeneralSlide.uasset differ diff --git a/GZJ/Asset/UI/WBP_InteractPanel.uasset b/GZJ/Asset/UI/WBP_InteractPanel.uasset new file mode 100644 index 00000000..321dd716 Binary files /dev/null and b/GZJ/Asset/UI/WBP_InteractPanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_MainUI.uasset b/GZJ/Asset/UI/WBP_MainUI.uasset new file mode 100644 index 00000000..e62ada47 Binary files /dev/null and b/GZJ/Asset/UI/WBP_MainUI.uasset differ diff --git a/GZJ/Asset/UI/WBP_NoticeLayer.uasset b/GZJ/Asset/UI/WBP_NoticeLayer.uasset new file mode 100644 index 00000000..aef6c1ff Binary files /dev/null and b/GZJ/Asset/UI/WBP_NoticeLayer.uasset differ diff --git a/GZJ/Asset/UI/WBP_PlayerAvatar.uasset b/GZJ/Asset/UI/WBP_PlayerAvatar.uasset new file mode 100644 index 00000000..222a9861 Binary files /dev/null and b/GZJ/Asset/UI/WBP_PlayerAvatar.uasset differ diff --git a/GZJ/Asset/UI/WBP_ResourceGrade.uasset b/GZJ/Asset/UI/WBP_ResourceGrade.uasset new file mode 100644 index 00000000..56540329 Binary files /dev/null and b/GZJ/Asset/UI/WBP_ResourceGrade.uasset differ diff --git a/GZJ/Asset/UI/WBP_SaveGamePanel.uasset b/GZJ/Asset/UI/WBP_SaveGamePanel.uasset new file mode 100644 index 00000000..e32cf97a Binary files /dev/null and b/GZJ/Asset/UI/WBP_SaveGamePanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_SaveGame_Achievement_Item.uasset b/GZJ/Asset/UI/WBP_SaveGame_Achievement_Item.uasset new file mode 100644 index 00000000..f58936f1 Binary files /dev/null and b/GZJ/Asset/UI/WBP_SaveGame_Achievement_Item.uasset differ diff --git a/GZJ/Asset/UI/WBP_SaveGame_Category_Item.uasset b/GZJ/Asset/UI/WBP_SaveGame_Category_Item.uasset new file mode 100644 index 00000000..0d1cc511 Binary files /dev/null and b/GZJ/Asset/UI/WBP_SaveGame_Category_Item.uasset differ diff --git a/GZJ/Asset/UI/WBP_SealRewards.uasset b/GZJ/Asset/UI/WBP_SealRewards.uasset new file mode 100644 index 00000000..aaf2fd2f Binary files /dev/null and b/GZJ/Asset/UI/WBP_SealRewards.uasset differ diff --git a/GZJ/Asset/UI/WBP_SelectDifficultyPanel.uasset b/GZJ/Asset/UI/WBP_SelectDifficultyPanel.uasset new file mode 100644 index 00000000..19789c55 Binary files /dev/null and b/GZJ/Asset/UI/WBP_SelectDifficultyPanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_SelectSkill.uasset b/GZJ/Asset/UI/WBP_SelectSkill.uasset new file mode 100644 index 00000000..19d84cd2 Binary files /dev/null and b/GZJ/Asset/UI/WBP_SelectSkill.uasset differ diff --git a/GZJ/Asset/UI/WBP_SelectWeaponPanel.uasset b/GZJ/Asset/UI/WBP_SelectWeaponPanel.uasset new file mode 100644 index 00000000..8de64a0b Binary files /dev/null and b/GZJ/Asset/UI/WBP_SelectWeaponPanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_SettlementPanel.uasset b/GZJ/Asset/UI/WBP_SettlementPanel.uasset new file mode 100644 index 00000000..919a0f22 Binary files /dev/null and b/GZJ/Asset/UI/WBP_SettlementPanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_SettlementPanel_Item.uasset b/GZJ/Asset/UI/WBP_SettlementPanel_Item.uasset new file mode 100644 index 00000000..da1cc28f Binary files /dev/null and b/GZJ/Asset/UI/WBP_SettlementPanel_Item.uasset differ diff --git a/GZJ/Asset/UI/WBP_Skill_Item.uasset b/GZJ/Asset/UI/WBP_Skill_Item.uasset new file mode 100644 index 00000000..e725ee19 Binary files /dev/null and b/GZJ/Asset/UI/WBP_Skill_Item.uasset differ diff --git a/GZJ/Asset/UI/WBP_TeamPanel.uasset b/GZJ/Asset/UI/WBP_TeamPanel.uasset new file mode 100644 index 00000000..7d51f72b Binary files /dev/null and b/GZJ/Asset/UI/WBP_TeamPanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_TeamPanel_Item.uasset b/GZJ/Asset/UI/WBP_TeamPanel_Item.uasset new file mode 100644 index 00000000..c54ac158 Binary files /dev/null and b/GZJ/Asset/UI/WBP_TeamPanel_Item.uasset differ diff --git a/GZJ/Asset/UI/WBP_TechnologyPanel.uasset b/GZJ/Asset/UI/WBP_TechnologyPanel.uasset new file mode 100644 index 00000000..c02da905 Binary files /dev/null and b/GZJ/Asset/UI/WBP_TechnologyPanel.uasset differ diff --git a/GZJ/Asset/UI/WBP_TechnologyPanel_Item.uasset b/GZJ/Asset/UI/WBP_TechnologyPanel_Item.uasset new file mode 100644 index 00000000..4fa96c35 Binary files /dev/null and b/GZJ/Asset/UI/WBP_TechnologyPanel_Item.uasset differ diff --git a/GZJ/Asset/UI/WBP_Unpacking.uasset b/GZJ/Asset/UI/WBP_Unpacking.uasset new file mode 100644 index 00000000..4c1f56d5 Binary files /dev/null and b/GZJ/Asset/UI/WBP_Unpacking.uasset differ diff --git a/GZJ/Asset/UI/WBP_UnpackingInfo.uasset b/GZJ/Asset/UI/WBP_UnpackingInfo.uasset new file mode 100644 index 00000000..0279a84c Binary files /dev/null and b/GZJ/Asset/UI/WBP_UnpackingInfo.uasset differ diff --git a/GZJ/Asset/UI/WBP_Unpacking_Item.uasset b/GZJ/Asset/UI/WBP_Unpacking_Item.uasset new file mode 100644 index 00000000..9c2e84fe Binary files /dev/null and b/GZJ/Asset/UI/WBP_Unpacking_Item.uasset differ diff --git a/GZJ/Asset/UI/WBP_WeaponAttribute.uasset b/GZJ/Asset/UI/WBP_WeaponAttribute.uasset new file mode 100644 index 00000000..7d803692 Binary files /dev/null and b/GZJ/Asset/UI/WBP_WeaponAttribute.uasset differ diff --git a/GZJ/Asset/UI/WBP_WeaponDetailsDesc.uasset b/GZJ/Asset/UI/WBP_WeaponDetailsDesc.uasset new file mode 100644 index 00000000..7bb31779 Binary files /dev/null and b/GZJ/Asset/UI/WBP_WeaponDetailsDesc.uasset differ diff --git a/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_01.uasset b/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_01.uasset new file mode 100644 index 00000000..50247dc2 Binary files /dev/null and b/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_01.uasset differ diff --git a/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_02.uasset b/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_02.uasset new file mode 100644 index 00000000..390da3ef Binary files /dev/null and b/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_02.uasset differ diff --git a/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_03.uasset b/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_03.uasset new file mode 100644 index 00000000..df9a1be3 Binary files /dev/null and b/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_03.uasset differ diff --git a/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_04.uasset b/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_04.uasset new file mode 100644 index 00000000..25de7448 Binary files /dev/null and b/GZJ/Asset/UITexture/BossUI/Frames/Icon_UGC_Boss_04.uasset differ diff --git a/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_01.uasset b/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_01.uasset new file mode 100644 index 00000000..60cb0c34 Binary files /dev/null and b/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_01.uasset differ diff --git a/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_02.uasset b/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_02.uasset new file mode 100644 index 00000000..78ca110f Binary files /dev/null and b/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_02.uasset differ diff --git a/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_03.uasset b/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_03.uasset new file mode 100644 index 00000000..fdb04187 Binary files /dev/null and b/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_03.uasset differ diff --git a/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_04.uasset b/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_04.uasset new file mode 100644 index 00000000..63a819f1 Binary files /dev/null and b/GZJ/Asset/UITexture/BossUI/Textures/ZD_UGC_Boss_04.uasset differ diff --git a/GZJ/Asset/UITexture/Icom_01.uasset b/GZJ/Asset/UITexture/Icom_01.uasset new file mode 100644 index 00000000..fba797de Binary files /dev/null and b/GZJ/Asset/UITexture/Icom_01.uasset differ diff --git a/GZJ/Asset/UITexture/Icon_02.uasset b/GZJ/Asset/UITexture/Icon_02.uasset new file mode 100644 index 00000000..f86b15bc Binary files /dev/null and b/GZJ/Asset/UITexture/Icon_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_AnNiu.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_AnNiu.uasset new file mode 100644 index 00000000..8f9cd30f Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_AnNiu.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_Kill.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_Kill.uasset new file mode 100644 index 00000000..43b897df Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_Kill.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_ShuXing_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_ShuXing_01.uasset new file mode 100644 index 00000000..0beebcf7 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_ShuXing_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_ShuXing_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_ShuXing_02.uasset new file mode 100644 index 00000000..04380094 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_ShuXing_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_TUPO.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_TUPO.uasset new file mode 100644 index 00000000..ca3ea73d Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_TUPO.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_TuBiao.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_TuBiao.uasset new file mode 100644 index 00000000..d0b2344d Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_TuBiao.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_chieftain_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_chieftain_01.uasset new file mode 100644 index 00000000..d5692499 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_chieftain_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_chieftain_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_chieftain_02.uasset new file mode 100644 index 00000000..a4477805 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_chieftain_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_corona.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_corona.uasset new file mode 100644 index 00000000..7a13877f Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_corona.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_01.uasset new file mode 100644 index 00000000..e68ee512 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_02.uasset new file mode 100644 index 00000000..40c7de40 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_03.uasset new file mode 100644 index 00000000..3e0dd96d Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_file_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_seal.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_seal.uasset new file mode 100644 index 00000000..656f27b5 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_seal.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_01.uasset new file mode 100644 index 00000000..9b5be4ef Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_02.uasset new file mode 100644 index 00000000..2cf68138 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_03.uasset new file mode 100644 index 00000000..495b3d37 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_04.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_04.uasset new file mode 100644 index 00000000..1bd8b862 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_04.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_05.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_05.uasset new file mode 100644 index 00000000..4fd46b1d Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_05.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_06.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_06.uasset new file mode 100644 index 00000000..aa9c7de9 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_06.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_07.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_07.uasset new file mode 100644 index 00000000..1db829e4 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_07.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_08.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_08.uasset new file mode 100644 index 00000000..b20151d3 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_08.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_09.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_09.uasset new file mode 100644 index 00000000..a2742b6e Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_09.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_10.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_10.uasset new file mode 100644 index 00000000..8e7d41d3 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_10.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_11.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_11.uasset new file mode 100644 index 00000000..ad284783 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_11.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_12.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_12.uasset new file mode 100644 index 00000000..0ac50474 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/ICON_UGC_troops_12.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Chatbox.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Chatbox.uasset new file mode 100644 index 00000000..9de70583 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Chatbox.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Coin.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Coin.uasset new file mode 100644 index 00000000..66460174 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Coin.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton.uasset new file mode 100644 index 00000000..d3d7f8f8 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Pickup_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Pickup_03.uasset new file mode 100644 index 00000000..d57c18a7 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Pickup_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Skill_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Skill_02.uasset new file mode 100644 index 00000000..c85490d1 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Skill_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Treal_04.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Treal_04.uasset new file mode 100644 index 00000000..9d6c1120 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_Treal_04.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_function.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_function.uasset new file mode 100644 index 00000000..35ff6a57 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_PushButton_function.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_01.uasset new file mode 100644 index 00000000..8116bcc7 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_02.uasset new file mode 100644 index 00000000..60a04209 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_03.uasset new file mode 100644 index 00000000..f9ca3e86 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_04.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_04.uasset new file mode 100644 index 00000000..c4008e40 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Skill_04.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Warning.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Warning.uasset new file mode 100644 index 00000000..d672538b Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Warning.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Warning_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Warning_02.uasset new file mode 100644 index 00000000..2c73662c Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_Warning_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_chat.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_chat.uasset new file mode 100644 index 00000000..7b7b39d8 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_chat.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_coordinate_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_coordinate_01.uasset new file mode 100644 index 00000000..081576c1 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_coordinate_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_coordinate_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_coordinate_02.uasset new file mode 100644 index 00000000..0a41283c Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_coordinate_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_SKill.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_SKill.uasset new file mode 100644 index 00000000..783f5ae5 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_SKill.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_WaveNumber_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_WaveNumber_01.uasset new file mode 100644 index 00000000..76ee23e0 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_WaveNumber_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_WaveNumber_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_WaveNumber_02.uasset new file mode 100644 index 00000000..aec8cd0d Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_frame_WaveNumber_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_01.uasset new file mode 100644 index 00000000..06a88b94 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_02.uasset new file mode 100644 index 00000000..123e6b22 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_03.uasset new file mode 100644 index 00000000..c644dd5e Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_04.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_04.uasset new file mode 100644 index 00000000..23e1c978 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_04.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_05.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_05.uasset new file mode 100644 index 00000000..b5cbcae5 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_function_05.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_horn.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_horn.uasset new file mode 100644 index 00000000..2a68fded Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_horn.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_knapsack.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_knapsack.uasset new file mode 100644 index 00000000..53e8e26f Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_knapsack.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_pickup.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_pickup.uasset new file mode 100644 index 00000000..95f741d1 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_pickup.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_revive.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_revive.uasset new file mode 100644 index 00000000..7a13f91b Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_revive.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_01.uasset new file mode 100644 index 00000000..dd703e27 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_02.uasset new file mode 100644 index 00000000..b333348c Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_03.uasset new file mode 100644 index 00000000..bfb5cedd Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_role_frame_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_setup.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_setup.uasset new file mode 100644 index 00000000..91299efc Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_setup.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_speechsounds.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_speechsounds.uasset new file mode 100644 index 00000000..293f5dc2 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_speechsounds.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_treat.uasset b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_treat.uasset new file mode 100644 index 00000000..9a68581a Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Frames/Icon_UGC_treat.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/AAA111.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/AAA111.uasset new file mode 100644 index 00000000..a060fc6b Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/AAA111.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/DDD111.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/DDD111.uasset new file mode 100644 index 00000000..bcf6e42a Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/DDD111.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/GhostCoin.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/GhostCoin.uasset new file mode 100644 index 00000000..99876da9 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/GhostCoin.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_AnNiu.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_AnNiu.uasset new file mode 100644 index 00000000..03e4411d Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_AnNiu.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_BG01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_BG01.uasset new file mode 100644 index 00000000..2b16d038 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_BG01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Breach.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Breach.uasset new file mode 100644 index 00000000..a11bdf71 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Breach.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Breach_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Breach_02.uasset new file mode 100644 index 00000000..aec02bf1 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Breach_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Chatbox.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Chatbox.uasset new file mode 100644 index 00000000..78a88842 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Chatbox.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Coin.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Coin.uasset new file mode 100644 index 00000000..e3499a85 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Coin.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Kill.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Kill.uasset new file mode 100644 index 00000000..30cd6e73 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Kill.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_01.uasset new file mode 100644 index 00000000..72bc7e3f Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Pickup_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Pickup_03.uasset new file mode 100644 index 00000000..676b001c Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Pickup_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Skill_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Skill_02.uasset new file mode 100644 index 00000000..6dd2a102 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Skill_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Treal_04.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Treal_04.uasset new file mode 100644 index 00000000..d88be33d Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_Treal_04.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_function.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_function.uasset new file mode 100644 index 00000000..b8d26110 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_PushButton_function.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_ShuXing_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_ShuXing_01.uasset new file mode 100644 index 00000000..8f3f5d85 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_ShuXing_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_ShuXing_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_ShuXing_02.uasset new file mode 100644 index 00000000..69b5f6d5 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_ShuXing_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_SkillButton_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_SkillButton_01.uasset new file mode 100644 index 00000000..1f16803b Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_SkillButton_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_SkillButton_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_SkillButton_02.uasset new file mode 100644 index 00000000..45cd3056 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_SkillButton_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_TUPO.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_TUPO.uasset new file mode 100644 index 00000000..5a8161b7 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_TUPO.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_TuBiao.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_TuBiao.uasset new file mode 100644 index 00000000..557fff95 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_TuBiao.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Warning.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Warning.uasset new file mode 100644 index 00000000..e401f712 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Warning.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Warning_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Warning_02.uasset new file mode 100644 index 00000000..5cd47624 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_Warning_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chat.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chat.uasset new file mode 100644 index 00000000..5c26609a Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chat.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chieftain_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chieftain_01.uasset new file mode 100644 index 00000000..8f4ebaad Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chieftain_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chieftain_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chieftain_02.uasset new file mode 100644 index 00000000..52f1ffa3 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_chieftain_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_coordinate_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_coordinate_01.uasset new file mode 100644 index 00000000..fef94376 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_coordinate_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_coordinate_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_coordinate_02.uasset new file mode 100644 index 00000000..8b84fea5 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_coordinate_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_corona.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_corona.uasset new file mode 100644 index 00000000..26545587 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_corona.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_cut.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_cut.uasset new file mode 100644 index 00000000..bab5cda7 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_cut.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_01.uasset new file mode 100644 index 00000000..dcf17298 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_02.uasset new file mode 100644 index 00000000..e4ff5fbe Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_03.uasset new file mode 100644 index 00000000..c39d1bfe Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_file_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_SKill.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_SKill.uasset new file mode 100644 index 00000000..9fc51003 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_SKill.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_WaveNumber_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_WaveNumber_01.uasset new file mode 100644 index 00000000..640566ff Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_WaveNumber_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_WaveNumber_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_WaveNumber_02.uasset new file mode 100644 index 00000000..d4a62db4 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_frame_WaveNumber_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_01.uasset new file mode 100644 index 00000000..6e261397 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_01_1.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_01_1.uasset new file mode 100644 index 00000000..48a7bd99 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_01_1.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_02.uasset new file mode 100644 index 00000000..5b9fdd50 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_03.uasset new file mode 100644 index 00000000..d2ee7961 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_04.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_04.uasset new file mode 100644 index 00000000..2811a2e9 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_04.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_05.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_05.uasset new file mode 100644 index 00000000..eed0a959 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_05.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_horn.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_horn.uasset new file mode 100644 index 00000000..174342bf Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_horn.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_knapsack.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_knapsack.uasset new file mode 100644 index 00000000..9da3b460 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_knapsack.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_pickup.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_pickup.uasset new file mode 100644 index 00000000..5d03991b Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_pickup.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_revive.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_revive.uasset new file mode 100644 index 00000000..7320105d Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_revive.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_01.uasset new file mode 100644 index 00000000..4c4e769b Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_02.uasset new file mode 100644 index 00000000..a57f6897 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_03.uasset new file mode 100644 index 00000000..f1eba952 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_role_frame_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_seal.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_seal.uasset new file mode 100644 index 00000000..cdec108e Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_seal.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_setup.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_setup.uasset new file mode 100644 index 00000000..10de33e2 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_setup.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_01.uasset new file mode 100644 index 00000000..46dffd12 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_02.uasset new file mode 100644 index 00000000..a94d4bfa Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_03.uasset new file mode 100644 index 00000000..c100a320 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_04.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_04.uasset new file mode 100644 index 00000000..66c019e9 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_skill_04.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_speechsounds.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_speechsounds.uasset new file mode 100644 index 00000000..279f25f1 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_speechsounds.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_treat.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_treat.uasset new file mode 100644 index 00000000..b3d07207 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_treat.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_01.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_01.uasset new file mode 100644 index 00000000..c0961a2b Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_01.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_02.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_02.uasset new file mode 100644 index 00000000..a5c5792b Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_02.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_03.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_03.uasset new file mode 100644 index 00000000..fe120a42 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_03.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_04.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_04.uasset new file mode 100644 index 00000000..d6e2f8df Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_04.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_05.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_05.uasset new file mode 100644 index 00000000..a74967e9 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_05.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_06.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_06.uasset new file mode 100644 index 00000000..d6f66ea0 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_06.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_07.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_07.uasset new file mode 100644 index 00000000..4244fa57 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_07.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_08.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_08.uasset new file mode 100644 index 00000000..bad8c19e Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_08.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_09.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_09.uasset new file mode 100644 index 00000000..6b0b1027 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_09.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_10.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_10.uasset new file mode 100644 index 00000000..86f79dc9 Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_10.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_11.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_11.uasset new file mode 100644 index 00000000..62db820c Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_11.uasset differ diff --git a/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_12.uasset b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_12.uasset new file mode 100644 index 00000000..9bae01ff Binary files /dev/null and b/GZJ/Asset/UITexture/InterfaceUI/Textures/ZD_UGC_troops_12.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_01.uasset b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_01.uasset new file mode 100644 index 00000000..6ac65673 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_01.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_02.uasset b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_02.uasset new file mode 100644 index 00000000..c9f4ea4e Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_02.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_03.uasset b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_03.uasset new file mode 100644 index 00000000..220c82c2 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_03.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_04.uasset b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_04.uasset new file mode 100644 index 00000000..736499b1 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_04.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_05.uasset b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_05.uasset new file mode 100644 index 00000000..55957c76 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_05.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_06.uasset b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_06.uasset new file mode 100644 index 00000000..05357abb Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_06.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_07.uasset b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_07.uasset new file mode 100644 index 00000000..d9780fa6 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Frames/Icon_UGC_technology_07.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_01.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_01.uasset new file mode 100644 index 00000000..94906629 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_01.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_02.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_02.uasset new file mode 100644 index 00000000..ad3c8b8a Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_02.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_03.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_03.uasset new file mode 100644 index 00000000..c2b265ed Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_03.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_04.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_04.uasset new file mode 100644 index 00000000..e0bbcbd1 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_04.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_05.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_05.uasset new file mode 100644 index 00000000..11c3fcf2 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_05.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_06.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_06.uasset new file mode 100644 index 00000000..8fd1c91c Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_06.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_07.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_07.uasset new file mode 100644 index 00000000..87101073 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_07.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_08.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_08.uasset new file mode 100644 index 00000000..fb60b5e4 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_08.uasset differ diff --git a/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_09.uasset b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_09.uasset new file mode 100644 index 00000000..33499239 Binary files /dev/null and b/GZJ/Asset/UITexture/TechnologyUI/Textures/ZD_UGC_technology_09.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_01.uasset b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_01.uasset new file mode 100644 index 00000000..70dbbe74 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_01.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_02.uasset b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_02.uasset new file mode 100644 index 00000000..2acdf4a9 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_02.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_03.uasset b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_03.uasset new file mode 100644 index 00000000..f993aef5 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_03.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_04.uasset b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_04.uasset new file mode 100644 index 00000000..3af5fc45 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_04.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_05.uasset b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_05.uasset new file mode 100644 index 00000000..091f915f Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_05.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_06.uasset b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_06.uasset new file mode 100644 index 00000000..664556d0 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Frames/Icon_UGC_Unpacking_06.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_01.uasset b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_01.uasset new file mode 100644 index 00000000..7686d781 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_01.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_02.uasset b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_02.uasset new file mode 100644 index 00000000..2b04539d Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_02.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_03.uasset b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_03.uasset new file mode 100644 index 00000000..f2776a15 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_03.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_04.uasset b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_04.uasset new file mode 100644 index 00000000..002c6d48 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_04.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_05.uasset b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_05.uasset new file mode 100644 index 00000000..3c65170b Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_05.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_06.uasset b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_06.uasset new file mode 100644 index 00000000..14d22959 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_06.uasset differ diff --git a/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_07.uasset b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_07.uasset new file mode 100644 index 00000000..0d9ff7f1 Binary files /dev/null and b/GZJ/Asset/UITexture/UnpackingUI/Textures/ZD_UGC_Unpacking_07.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_01.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_01.uasset new file mode 100644 index 00000000..fa930817 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_01.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_02.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_02.uasset new file mode 100644 index 00000000..0a419e79 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_02.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_03.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_03.uasset new file mode 100644 index 00000000..6e2d4e64 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_03.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_04.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_04.uasset new file mode 100644 index 00000000..a5b146b1 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_04.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_05.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_05.uasset new file mode 100644 index 00000000..e5508fb6 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_05.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_06.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_06.uasset new file mode 100644 index 00000000..8044367b Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_06.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_07.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_07.uasset new file mode 100644 index 00000000..c8876a6d Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_07.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_08.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_08.uasset new file mode 100644 index 00000000..475b17f8 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_08.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_09.uasset b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_09.uasset new file mode 100644 index 00000000..cbbd1c64 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Frames/Icom_UGC_attribute_09.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_01.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_01.uasset new file mode 100644 index 00000000..4c7b3e9e Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_01.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_02.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_02.uasset new file mode 100644 index 00000000..77af2025 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_02.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_03.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_03.uasset new file mode 100644 index 00000000..7594ecbf Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_03.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_04.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_04.uasset new file mode 100644 index 00000000..6832b3ce Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_04.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_05.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_05.uasset new file mode 100644 index 00000000..2a954b98 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_05.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_06.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_06.uasset new file mode 100644 index 00000000..a2ea760e Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_06.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_07.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_07.uasset new file mode 100644 index 00000000..d47e1b02 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_07.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_08.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_08.uasset new file mode 100644 index 00000000..89c78006 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_08.uasset differ diff --git a/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_09.uasset b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_09.uasset new file mode 100644 index 00000000..047089e6 Binary files /dev/null and b/GZJ/Asset/UITexture/attributeUI/Textures/ZD_UGC_attribute_09.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_01.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_01.uasset new file mode 100644 index 00000000..bd45f0de Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_01.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_02.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_02.uasset new file mode 100644 index 00000000..e829f879 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_02.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_03.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_03.uasset new file mode 100644 index 00000000..606e19b3 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_03.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_04.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_04.uasset new file mode 100644 index 00000000..9eadedea Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_04.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_05.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_05.uasset new file mode 100644 index 00000000..77657874 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_05.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_06.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_06.uasset new file mode 100644 index 00000000..52c2abb9 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_06.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_07.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_07.uasset new file mode 100644 index 00000000..11c5f949 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_07.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_08.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_08.uasset new file mode 100644 index 00000000..8566b02d Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_08.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_09.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_09.uasset new file mode 100644 index 00000000..f1e1190b Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_09.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_10.uasset b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_10.uasset new file mode 100644 index 00000000..011811ab Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Frames/Icon_UGC_challenge_10.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_01.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_01.uasset new file mode 100644 index 00000000..9d044d2e Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_01.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_02.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_02.uasset new file mode 100644 index 00000000..a10581d3 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_02.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_03.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_03.uasset new file mode 100644 index 00000000..1eddde8e Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_03.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_04.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_04.uasset new file mode 100644 index 00000000..89c97efa Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_04.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_05.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_05.uasset new file mode 100644 index 00000000..4b77e047 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_05.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_06.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_06.uasset new file mode 100644 index 00000000..2739be6f Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_06.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_07.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_07.uasset new file mode 100644 index 00000000..2ed21ebd Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_07.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_08.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_08.uasset new file mode 100644 index 00000000..46de7571 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_08.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_09.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_09.uasset new file mode 100644 index 00000000..8fd0e929 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_09.uasset differ diff --git a/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_10.uasset b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_10.uasset new file mode 100644 index 00000000..56c5cc82 Binary files /dev/null and b/GZJ/Asset/UITexture/challengeUI/Textures/ZD_UGC_challenge_10.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_01.uasset b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_01.uasset new file mode 100644 index 00000000..fbdfd5f1 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_01.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_02.uasset b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_02.uasset new file mode 100644 index 00000000..77b6d2c2 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_02.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_03.uasset b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_03.uasset new file mode 100644 index 00000000..6cb98ff0 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_03.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_04.uasset b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_04.uasset new file mode 100644 index 00000000..06d6e8dc Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_04.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_05.uasset b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_05.uasset new file mode 100644 index 00000000..7fcb9a05 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_05.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_06.uasset b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_06.uasset new file mode 100644 index 00000000..8239a129 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_06.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_07.uasset b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_07.uasset new file mode 100644 index 00000000..e768839d Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Frames/Icon_UGC_clearance_07.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_01.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_01.uasset new file mode 100644 index 00000000..bfe09720 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_01.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_02.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_02.uasset new file mode 100644 index 00000000..41a8e4fc Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_02.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_03.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_03.uasset new file mode 100644 index 00000000..16ed1ecd Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_03.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_04.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_04.uasset new file mode 100644 index 00000000..4f4c8929 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_04.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_05.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_05.uasset new file mode 100644 index 00000000..15186a5e Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_05.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_06.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_06.uasset new file mode 100644 index 00000000..fb087842 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_06.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_07.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_07.uasset new file mode 100644 index 00000000..725f6235 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_07.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_08.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_08.uasset new file mode 100644 index 00000000..f80dcb02 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_08.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_09.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_09.uasset new file mode 100644 index 00000000..1b376fd6 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_09.uasset differ diff --git a/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_10.uasset b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_10.uasset new file mode 100644 index 00000000..3c186be2 Binary files /dev/null and b/GZJ/Asset/UITexture/clearanceUI/Textures/ZD_UGC_clearance_10.uasset differ diff --git a/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_01.uasset b/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_01.uasset new file mode 100644 index 00000000..0573cdb5 Binary files /dev/null and b/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_01.uasset differ diff --git a/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_02.uasset b/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_02.uasset new file mode 100644 index 00000000..a3b0b25d Binary files /dev/null and b/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_02.uasset differ diff --git a/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_03.uasset b/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_03.uasset new file mode 100644 index 00000000..916bad8a Binary files /dev/null and b/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_03.uasset differ diff --git a/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_04.uasset b/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_04.uasset new file mode 100644 index 00000000..37dc7f97 Binary files /dev/null and b/GZJ/Asset/UITexture/currencyUI/Frames/Icon_UGC_currency_04.uasset differ diff --git a/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_01.uasset b/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_01.uasset new file mode 100644 index 00000000..fe583edd Binary files /dev/null and b/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_01.uasset differ diff --git a/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_02.uasset b/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_02.uasset new file mode 100644 index 00000000..65d8a393 Binary files /dev/null and b/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_02.uasset differ diff --git a/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_03.uasset b/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_03.uasset new file mode 100644 index 00000000..2728b758 Binary files /dev/null and b/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_03.uasset differ diff --git a/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_04.uasset b/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_04.uasset new file mode 100644 index 00000000..cd4ce9f3 Binary files /dev/null and b/GZJ/Asset/UITexture/currencyUI/Textures/ZD_UGC_currency_04.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_01.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_01.uasset new file mode 100644 index 00000000..008310bc Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_01.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_02.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_02.uasset new file mode 100644 index 00000000..48fbc73f Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_02.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_03.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_03.uasset new file mode 100644 index 00000000..e94b1164 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_03.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_04.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_04.uasset new file mode 100644 index 00000000..b286e367 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_04.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_05.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_05.uasset new file mode 100644 index 00000000..5a87718b Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_05.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_06.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_06.uasset new file mode 100644 index 00000000..52bc6467 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_06.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_07.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_07.uasset new file mode 100644 index 00000000..2dbf1a87 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_07.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_08.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_08.uasset new file mode 100644 index 00000000..41f5151e Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_08.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_09.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_09.uasset new file mode 100644 index 00000000..947bffee Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_09.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_10.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_10.uasset new file mode 100644 index 00000000..2205dc08 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_10.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_11.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_11.uasset new file mode 100644 index 00000000..761e10f7 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_11.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_12.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_12.uasset new file mode 100644 index 00000000..e48f3ee0 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_12.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_13.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_13.uasset new file mode 100644 index 00000000..e163acd9 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_13.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_14.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_14.uasset new file mode 100644 index 00000000..b7e09ec3 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_14.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_15.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_15.uasset new file mode 100644 index 00000000..b777ec33 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_15.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_16.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_16.uasset new file mode 100644 index 00000000..2c587624 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_16.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_17.uasset b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_17.uasset new file mode 100644 index 00000000..4dd72bc0 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Frames/Icon_UGC_file_17.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_01.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_01.uasset new file mode 100644 index 00000000..87559f63 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_01.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_02.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_02.uasset new file mode 100644 index 00000000..33705897 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_02.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_03.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_03.uasset new file mode 100644 index 00000000..9fd1057b Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_03.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_04.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_04.uasset new file mode 100644 index 00000000..dd898c0e Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_04.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_05.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_05.uasset new file mode 100644 index 00000000..4cf88175 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_05.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_06.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_06.uasset new file mode 100644 index 00000000..95e6e5a2 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_06.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_07.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_07.uasset new file mode 100644 index 00000000..555798ca Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_07.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_08.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_08.uasset new file mode 100644 index 00000000..146ed0d6 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_08.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_09.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_09.uasset new file mode 100644 index 00000000..666d8983 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_09.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_10.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_10.uasset new file mode 100644 index 00000000..1942180c Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_10.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_11.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_11.uasset new file mode 100644 index 00000000..005e8f97 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_11.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_12.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_12.uasset new file mode 100644 index 00000000..e63c3840 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_12.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_13.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_13.uasset new file mode 100644 index 00000000..7fd3c9b7 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_13.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_14.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_14.uasset new file mode 100644 index 00000000..ef140b2c Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_14.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_15.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_15.uasset new file mode 100644 index 00000000..8dbc14e9 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_15.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_16.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_16.uasset new file mode 100644 index 00000000..9dfb0182 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_16.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_17.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_17.uasset new file mode 100644 index 00000000..a0557544 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_17.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_18.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_18.uasset new file mode 100644 index 00000000..af946c0b Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_18.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_19.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_19.uasset new file mode 100644 index 00000000..d6433a71 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_19.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_20.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_20.uasset new file mode 100644 index 00000000..bad40b49 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_20.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_21.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_21.uasset new file mode 100644 index 00000000..023e140e Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_21.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_22.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_22.uasset new file mode 100644 index 00000000..9f4492d8 Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_22.uasset differ diff --git a/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_23.uasset b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_23.uasset new file mode 100644 index 00000000..2bf4d7aa Binary files /dev/null and b/GZJ/Asset/UITexture/fileUI/Textures/ZD_UGC_file_23.uasset differ diff --git a/GZJ/Asset/UITexture/guideUI/UI_UGC_HomeScreen.uasset b/GZJ/Asset/UITexture/guideUI/UI_UGC_HomeScreen.uasset new file mode 100644 index 00000000..1de630e5 Binary files /dev/null and b/GZJ/Asset/UITexture/guideUI/UI_UGC_HomeScreen.uasset differ diff --git a/GZJ/Asset/UITexture/guideUI/UI_UGC_knapsack.uasset b/GZJ/Asset/UITexture/guideUI/UI_UGC_knapsack.uasset new file mode 100644 index 00000000..88796f02 Binary files /dev/null and b/GZJ/Asset/UITexture/guideUI/UI_UGC_knapsack.uasset differ diff --git a/GZJ/Asset/UITexture/guideUI/UI_UGC_leader.uasset b/GZJ/Asset/UITexture/guideUI/UI_UGC_leader.uasset new file mode 100644 index 00000000..5e59dba4 Binary files /dev/null and b/GZJ/Asset/UITexture/guideUI/UI_UGC_leader.uasset differ diff --git a/GZJ/Asset/UITexture/guideUI/UI_UGC_weapon_character.uasset b/GZJ/Asset/UITexture/guideUI/UI_UGC_weapon_character.uasset new file mode 100644 index 00000000..441aeb43 Binary files /dev/null and b/GZJ/Asset/UITexture/guideUI/UI_UGC_weapon_character.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_01.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_01.uasset new file mode 100644 index 00000000..42c31807 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_01.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_02.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_02.uasset new file mode 100644 index 00000000..dab57516 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_02.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_03.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_03.uasset new file mode 100644 index 00000000..1bfe1ff8 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_03.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_04.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_04.uasset new file mode 100644 index 00000000..a603be8a Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_04.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_05.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_05.uasset new file mode 100644 index 00000000..b087ffde Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_05.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_06.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_06.uasset new file mode 100644 index 00000000..61b439e3 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_06.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_07.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_07.uasset new file mode 100644 index 00000000..d9d264d4 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_07.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_08.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_08.uasset new file mode 100644 index 00000000..202f8c1f Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_08.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_09.uasset b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_09.uasset new file mode 100644 index 00000000..da75c083 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Frames/Icon_UGC_inherit_09.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_01.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_01.uasset new file mode 100644 index 00000000..6043aced Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_01.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_02.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_02.uasset new file mode 100644 index 00000000..716e3c0a Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_02.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_03.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_03.uasset new file mode 100644 index 00000000..8e9cd767 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_03.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_04.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_04.uasset new file mode 100644 index 00000000..624480ae Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_04.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_05.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_05.uasset new file mode 100644 index 00000000..4a704175 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_05.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_06.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_06.uasset new file mode 100644 index 00000000..a5cac171 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_06.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_07.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_07.uasset new file mode 100644 index 00000000..5c47856b Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_07.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_08.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_08.uasset new file mode 100644 index 00000000..adbd1770 Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_08.uasset differ diff --git a/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_09.uasset b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_09.uasset new file mode 100644 index 00000000..45242e2b Binary files /dev/null and b/GZJ/Asset/UITexture/inheritUI/Textures/ZD_UGC_inherit_09.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_01.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_01.uasset new file mode 100644 index 00000000..de1e1592 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_01.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_02.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_02.uasset new file mode 100644 index 00000000..59bcca20 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_02.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_03.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_03.uasset new file mode 100644 index 00000000..20543a9d Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_03.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_04.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_04.uasset new file mode 100644 index 00000000..03e14642 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_04.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_05.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_05.uasset new file mode 100644 index 00000000..de89040f Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_05.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_06.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_06.uasset new file mode 100644 index 00000000..6e7c2583 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_06.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_07.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_07.uasset new file mode 100644 index 00000000..e86e2cc6 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/Icon_UGC_knapsack_07.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_08.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_08.uasset new file mode 100644 index 00000000..0bb28057 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_08.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_09.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_09.uasset new file mode 100644 index 00000000..f1c2b425 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_09.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_10.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_10.uasset new file mode 100644 index 00000000..d0eff5c4 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_10.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_11.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_11.uasset new file mode 100644 index 00000000..4f6b27f0 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_11.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_9.uasset b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_9.uasset new file mode 100644 index 00000000..88f390f3 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Frames/ZD_UGC_knapsack_9.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/GeneralSlideBG.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/GeneralSlideBG.uasset new file mode 100644 index 00000000..e1a8e3c9 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/GeneralSlideBG.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_01.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_01.uasset new file mode 100644 index 00000000..55649ebc Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_01.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_02.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_02.uasset new file mode 100644 index 00000000..562bf10e Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_02.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_03.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_03.uasset new file mode 100644 index 00000000..c5402cdb Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_03.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_04.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_04.uasset new file mode 100644 index 00000000..0a731770 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_04.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_05.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_05.uasset new file mode 100644 index 00000000..bf5315cf Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_05.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_06.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_06.uasset new file mode 100644 index 00000000..3b937917 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_06.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_07.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_07.uasset new file mode 100644 index 00000000..6db9e3c0 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_07.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_08.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_08.uasset new file mode 100644 index 00000000..fd77eced Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_08.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_09.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_09.uasset new file mode 100644 index 00000000..383ce0d8 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_09.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_10.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_10.uasset new file mode 100644 index 00000000..c8a8d56c Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_10.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_11.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_11.uasset new file mode 100644 index 00000000..5f47c421 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_11.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_12.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_12.uasset new file mode 100644 index 00000000..a8e43ed3 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_12.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_13.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_13.uasset new file mode 100644 index 00000000..99821bf7 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_13.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_14.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_14.uasset new file mode 100644 index 00000000..3ee47ba8 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_14.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_15.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_15.uasset new file mode 100644 index 00000000..ac94dec2 Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_15.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_16.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_16.uasset new file mode 100644 index 00000000..edf37e1a Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_16.uasset differ diff --git a/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_20.uasset b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_20.uasset new file mode 100644 index 00000000..d61294eb Binary files /dev/null and b/GZJ/Asset/UITexture/knapsackUI/Textures/ZD_UGC_knapsack_20.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_01.uasset b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_01.uasset new file mode 100644 index 00000000..94a5e513 Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_01.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_02.uasset b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_02.uasset new file mode 100644 index 00000000..2480c3d9 Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_02.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_03.uasset b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_03.uasset new file mode 100644 index 00000000..721d8e5c Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_03.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_04.uasset b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_04.uasset new file mode 100644 index 00000000..7d7a4a51 Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_04.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_05.uasset b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_05.uasset new file mode 100644 index 00000000..43ed0710 Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_05.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_06.uasset b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_06.uasset new file mode 100644 index 00000000..2e0ae0bb Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Frames/Icon_UGC_resource_06.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_01.uasset b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_01.uasset new file mode 100644 index 00000000..68dda6a1 Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_01.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_02.uasset b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_02.uasset new file mode 100644 index 00000000..07a26e6f Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_02.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_03.uasset b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_03.uasset new file mode 100644 index 00000000..8d027b4a Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_03.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_04.uasset b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_04.uasset new file mode 100644 index 00000000..58ac248f Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_04.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_05.uasset b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_05.uasset new file mode 100644 index 00000000..ff3626ac Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_05.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_06.uasset b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_06.uasset new file mode 100644 index 00000000..637500e6 Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_06.uasset differ diff --git a/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_07.uasset b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_07.uasset new file mode 100644 index 00000000..969ebe9a Binary files /dev/null and b/GZJ/Asset/UITexture/resourceui/Textures/ZD_UGC_resource_07.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/ICON_UGC_AssaultRifle.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/ICON_UGC_AssaultRifle.uasset new file mode 100644 index 00000000..85e88640 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/ICON_UGC_AssaultRifle.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_ShooterRifle.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_ShooterRifle.uasset new file mode 100644 index 00000000..d8c49c43 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_ShooterRifle.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_Shotgun.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_Shotgun.uasset new file mode 100644 index 00000000..2e182f21 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_Shotgun.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_SniperRifle.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_SniperRifle.uasset new file mode 100644 index 00000000..53ce88f7 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_SniperRifle.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_SubmachineGun.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_SubmachineGun.uasset new file mode 100644 index 00000000..2c65ba1d Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_SubmachineGun.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_machineGun.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_machineGun.uasset new file mode 100644 index 00000000..595de6fb Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_machineGun.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_01.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_01.uasset new file mode 100644 index 00000000..815e016d Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_01.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_02.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_02.uasset new file mode 100644 index 00000000..559c8373 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_02.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_03.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_03.uasset new file mode 100644 index 00000000..87e628a8 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_03.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_04.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_04.uasset new file mode 100644 index 00000000..9deee4b1 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_04.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_05.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_05.uasset new file mode 100644 index 00000000..6b561d2a Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/Icon_UGC_weapon_05.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/White/T_AKM.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_AKM.uasset new file mode 100644 index 00000000..3c1bdbbe Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_AKM.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/White/T_AWM.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_AWM.uasset new file mode 100644 index 00000000..3a1fc10c Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_AWM.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/White/T_M249.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_M249.uasset new file mode 100644 index 00000000..015975f2 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_M249.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/White/T_S12K.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_S12K.uasset new file mode 100644 index 00000000..a0eb1c73 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_S12K.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/White/T_SKS.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_SKS.uasset new file mode 100644 index 00000000..3ddc6f60 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_SKS.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Frames/White/T_UZI.uasset b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_UZI.uasset new file mode 100644 index 00000000..594f49ae Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Frames/White/T_UZI.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_AssaultRifle.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_AssaultRifle.uasset new file mode 100644 index 00000000..620afd93 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_AssaultRifle.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_ShooterRifle.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_ShooterRifle.uasset new file mode 100644 index 00000000..733b2a9a Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_ShooterRifle.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_Shotgun.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_Shotgun.uasset new file mode 100644 index 00000000..9550fae7 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_Shotgun.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_SniperRifle.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_SniperRifle.uasset new file mode 100644 index 00000000..1ee8241b Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_SniperRifle.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_SubmachineGun.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_SubmachineGun.uasset new file mode 100644 index 00000000..8a972072 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_SubmachineGun.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_machineGun.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_machineGun.uasset new file mode 100644 index 00000000..747bbdc9 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_machineGun.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_01.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_01.uasset new file mode 100644 index 00000000..b3ec3ba5 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_01.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_02.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_02.uasset new file mode 100644 index 00000000..f4377b9f Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_02.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_03.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_03.uasset new file mode 100644 index 00000000..80be9ccb Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_03.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_04.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_04.uasset new file mode 100644 index 00000000..9bf6f4f7 Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_04.uasset differ diff --git a/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_05.uasset b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_05.uasset new file mode 100644 index 00000000..36fca0ef Binary files /dev/null and b/GZJ/Asset/UITexture/weaponUI/Textures/ZD_UGC_weapon_05.uasset differ diff --git a/GZJ/Asset/WwiseAudio/Android/1062719616.wem b/GZJ/Asset/WwiseAudio/Android/1062719616.wem new file mode 100644 index 00000000..f467d312 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1062719616.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/110098456.wem b/GZJ/Asset/WwiseAudio/Android/110098456.wem new file mode 100644 index 00000000..dd3359bb Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/110098456.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1127409792.wem b/GZJ/Asset/WwiseAudio/Android/1127409792.wem new file mode 100644 index 00000000..22436f59 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1127409792.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1146204760.wem b/GZJ/Asset/WwiseAudio/Android/1146204760.wem new file mode 100644 index 00000000..8bac84b7 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1146204760.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1228065994.wem b/GZJ/Asset/WwiseAudio/Android/1228065994.wem new file mode 100644 index 00000000..d998467f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1228065994.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1287723698.wem b/GZJ/Asset/WwiseAudio/Android/1287723698.wem new file mode 100644 index 00000000..a2d28655 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1287723698.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1493535104.wem b/GZJ/Asset/WwiseAudio/Android/1493535104.wem new file mode 100644 index 00000000..cc1dc419 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1493535104.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1507766438.wem b/GZJ/Asset/WwiseAudio/Android/1507766438.wem new file mode 100644 index 00000000..edd39cd0 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1507766438.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1675309235.wem b/GZJ/Asset/WwiseAudio/Android/1675309235.wem new file mode 100644 index 00000000..cdf22d92 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1675309235.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1680767104.wem b/GZJ/Asset/WwiseAudio/Android/1680767104.wem new file mode 100644 index 00000000..dfc376df Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1680767104.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1732055168.wem b/GZJ/Asset/WwiseAudio/Android/1732055168.wem new file mode 100644 index 00000000..8e1acae9 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1732055168.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/185178256.wem b/GZJ/Asset/WwiseAudio/Android/185178256.wem new file mode 100644 index 00000000..d1063e2b Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/185178256.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/1933947829.wem b/GZJ/Asset/WwiseAudio/Android/1933947829.wem new file mode 100644 index 00000000..10b5f547 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/1933947829.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/2038465758.wem b/GZJ/Asset/WwiseAudio/Android/2038465758.wem new file mode 100644 index 00000000..d8516ef3 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/2038465758.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/206300901.wem b/GZJ/Asset/WwiseAudio/Android/206300901.wem new file mode 100644 index 00000000..56030a0e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/206300901.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/2135136384.wem b/GZJ/Asset/WwiseAudio/Android/2135136384.wem new file mode 100644 index 00000000..902ef7f0 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/2135136384.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/223974801.wem b/GZJ/Asset/WwiseAudio/Android/223974801.wem new file mode 100644 index 00000000..2ca455d6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/223974801.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/298736302.wem b/GZJ/Asset/WwiseAudio/Android/298736302.wem new file mode 100644 index 00000000..b86b05e8 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/298736302.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/37326121.wem b/GZJ/Asset/WwiseAudio/Android/37326121.wem new file mode 100644 index 00000000..68aaef41 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/37326121.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/409597344.wem b/GZJ/Asset/WwiseAudio/Android/409597344.wem new file mode 100644 index 00000000..7174f57a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/409597344.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/411130705.wem b/GZJ/Asset/WwiseAudio/Android/411130705.wem new file mode 100644 index 00000000..a8b3c2af Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/411130705.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/485711499.wem b/GZJ/Asset/WwiseAudio/Android/485711499.wem new file mode 100644 index 00000000..f32a66d6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/485711499.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/492475616.wem b/GZJ/Asset/WwiseAudio/Android/492475616.wem new file mode 100644 index 00000000..d998467f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/492475616.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/521182556.wem b/GZJ/Asset/WwiseAudio/Android/521182556.wem new file mode 100644 index 00000000..6a5f6dfe Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/521182556.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/55372988.wem b/GZJ/Asset/WwiseAudio/Android/55372988.wem new file mode 100644 index 00000000..8afa141d Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/55372988.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/560582775.wem b/GZJ/Asset/WwiseAudio/Android/560582775.wem new file mode 100644 index 00000000..4531026b Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/560582775.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/562061896.wem b/GZJ/Asset/WwiseAudio/Android/562061896.wem new file mode 100644 index 00000000..11c537e9 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/562061896.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/56485828.wem b/GZJ/Asset/WwiseAudio/Android/56485828.wem new file mode 100644 index 00000000..d5674f89 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/56485828.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/666741184.wem b/GZJ/Asset/WwiseAudio/Android/666741184.wem new file mode 100644 index 00000000..75a4ca52 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/666741184.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/711666881.wem b/GZJ/Asset/WwiseAudio/Android/711666881.wem new file mode 100644 index 00000000..4c04333a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/711666881.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/726361003.wem b/GZJ/Asset/WwiseAudio/Android/726361003.wem new file mode 100644 index 00000000..311e2cb8 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/726361003.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/760304241.wem b/GZJ/Asset/WwiseAudio/Android/760304241.wem new file mode 100644 index 00000000..e37d5216 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/760304241.wem differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_AbsorbSoul_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_AbsorbSoul_1.bnk new file mode 100644 index 00000000..792eb12d Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_AbsorbSoul_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Anger_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Anger_1.bnk new file mode 100644 index 00000000..98d7cc80 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Anger_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Bombing_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Bombing_1.bnk new file mode 100644 index 00000000..4945e1e4 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Bombing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Counter_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Counter_1.bnk new file mode 100644 index 00000000..b41cae13 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Counter_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Crack_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Crack_1.bnk new file mode 100644 index 00000000..3dec5c26 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Crack_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Dash_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Dash_1.bnk new file mode 100644 index 00000000..ab20671a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Dash_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_DeathStrike_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_DeathStrike_1.bnk new file mode 100644 index 00000000..cbddcff6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_DeathStrike_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_ElectricShock_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_ElectricShock_1.bnk new file mode 100644 index 00000000..91b7c915 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_ElectricShock_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Exhaust_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Exhaust_1.bnk new file mode 100644 index 00000000..1988808e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Exhaust_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_FireDomain_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_FireDomain_1.bnk new file mode 100644 index 00000000..388cd3fb Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_FireDomain_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Flowing_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Flowing_1.bnk new file mode 100644 index 00000000..8af8010a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Flowing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Heal_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Heal_1.bnk new file mode 100644 index 00000000..bfb5eeef Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Heal_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_IceFrost_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_IceFrost_1.bnk new file mode 100644 index 00000000..c0eacc71 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_IceFrost_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_LightWave_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_LightWave_1.bnk new file mode 100644 index 00000000..2b7ac0ac Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_LightWave_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Penetration_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Penetration_1.bnk new file mode 100644 index 00000000..a378cb78 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Penetration_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Puncture_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Puncture_1.bnk new file mode 100644 index 00000000..03ec570f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Puncture_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Ray_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Ray_1.bnk new file mode 100644 index 00000000..5da861c4 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Ray_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Roar_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Roar_1.bnk new file mode 100644 index 00000000..a7575e44 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Roar_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Scabbing_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Scabbing_1.bnk new file mode 100644 index 00000000..630ead36 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Scabbing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Seal_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Seal_1.bnk new file mode 100644 index 00000000..a16fef9a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Seal_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_ShadowKill_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_ShadowKill_1.bnk new file mode 100644 index 00000000..36bb752c Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_ShadowKill_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Shuttle_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Shuttle_1.bnk new file mode 100644 index 00000000..8c9bf56e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Shuttle_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Slash_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Slash_1.bnk new file mode 100644 index 00000000..afd53dba Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Slash_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_StarFall_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_StarFall_1.bnk new file mode 100644 index 00000000..52d0e113 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_StarFall_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_StickStrike_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_StickStrike_1.bnk new file mode 100644 index 00000000..7724045f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_StickStrike_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Stomp_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Stomp_1.bnk new file mode 100644 index 00000000..5dcb327f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Stomp_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_StrongWind_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_StrongWind_1.bnk new file mode 100644 index 00000000..d6e24653 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_StrongWind_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Stun_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Stun_1.bnk new file mode 100644 index 00000000..c692f8ab Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Stun_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Tear_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Tear_1.bnk new file mode 100644 index 00000000..c427bd81 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Tear_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_ToxicRain_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_ToxicRain_1.bnk new file mode 100644 index 00000000..c81b0b61 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_ToxicRain_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Tread_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Tread_1.bnk new file mode 100644 index 00000000..74017121 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Tread_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Android/Skill_Weaken_1.bnk b/GZJ/Asset/WwiseAudio/Android/Skill_Weaken_1.bnk new file mode 100644 index 00000000..9a358b1c Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Android/Skill_Weaken_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1062719616.wem b/GZJ/Asset/WwiseAudio/Windows/1062719616.wem new file mode 100644 index 00000000..f467d312 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1062719616.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/110098456.wem b/GZJ/Asset/WwiseAudio/Windows/110098456.wem new file mode 100644 index 00000000..dd3359bb Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/110098456.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1127409792.wem b/GZJ/Asset/WwiseAudio/Windows/1127409792.wem new file mode 100644 index 00000000..22436f59 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1127409792.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1146204760.wem b/GZJ/Asset/WwiseAudio/Windows/1146204760.wem new file mode 100644 index 00000000..8bac84b7 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1146204760.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1228065994.wem b/GZJ/Asset/WwiseAudio/Windows/1228065994.wem new file mode 100644 index 00000000..d998467f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1228065994.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1287723698.wem b/GZJ/Asset/WwiseAudio/Windows/1287723698.wem new file mode 100644 index 00000000..a2d28655 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1287723698.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1493535104.wem b/GZJ/Asset/WwiseAudio/Windows/1493535104.wem new file mode 100644 index 00000000..cc1dc419 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1493535104.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1507766438.wem b/GZJ/Asset/WwiseAudio/Windows/1507766438.wem new file mode 100644 index 00000000..edd39cd0 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1507766438.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1675309235.wem b/GZJ/Asset/WwiseAudio/Windows/1675309235.wem new file mode 100644 index 00000000..cdf22d92 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1675309235.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1680767104.wem b/GZJ/Asset/WwiseAudio/Windows/1680767104.wem new file mode 100644 index 00000000..dfc376df Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1680767104.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1732055168.wem b/GZJ/Asset/WwiseAudio/Windows/1732055168.wem new file mode 100644 index 00000000..8e1acae9 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1732055168.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/185178256.wem b/GZJ/Asset/WwiseAudio/Windows/185178256.wem new file mode 100644 index 00000000..d1063e2b Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/185178256.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/1933947829.wem b/GZJ/Asset/WwiseAudio/Windows/1933947829.wem new file mode 100644 index 00000000..10b5f547 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/1933947829.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/2038465758.wem b/GZJ/Asset/WwiseAudio/Windows/2038465758.wem new file mode 100644 index 00000000..d8516ef3 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/2038465758.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/206300901.wem b/GZJ/Asset/WwiseAudio/Windows/206300901.wem new file mode 100644 index 00000000..56030a0e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/206300901.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/2135136384.wem b/GZJ/Asset/WwiseAudio/Windows/2135136384.wem new file mode 100644 index 00000000..902ef7f0 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/2135136384.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/223974801.wem b/GZJ/Asset/WwiseAudio/Windows/223974801.wem new file mode 100644 index 00000000..2ca455d6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/223974801.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/298736302.wem b/GZJ/Asset/WwiseAudio/Windows/298736302.wem new file mode 100644 index 00000000..b86b05e8 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/298736302.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/37326121.wem b/GZJ/Asset/WwiseAudio/Windows/37326121.wem new file mode 100644 index 00000000..68aaef41 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/37326121.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/409597344.wem b/GZJ/Asset/WwiseAudio/Windows/409597344.wem new file mode 100644 index 00000000..7174f57a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/409597344.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/411130705.wem b/GZJ/Asset/WwiseAudio/Windows/411130705.wem new file mode 100644 index 00000000..a8b3c2af Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/411130705.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/485711499.wem b/GZJ/Asset/WwiseAudio/Windows/485711499.wem new file mode 100644 index 00000000..f32a66d6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/485711499.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/492475616.wem b/GZJ/Asset/WwiseAudio/Windows/492475616.wem new file mode 100644 index 00000000..d998467f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/492475616.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/521182556.wem b/GZJ/Asset/WwiseAudio/Windows/521182556.wem new file mode 100644 index 00000000..6a5f6dfe Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/521182556.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/55372988.wem b/GZJ/Asset/WwiseAudio/Windows/55372988.wem new file mode 100644 index 00000000..8afa141d Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/55372988.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/560582775.wem b/GZJ/Asset/WwiseAudio/Windows/560582775.wem new file mode 100644 index 00000000..4531026b Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/560582775.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/562061896.wem b/GZJ/Asset/WwiseAudio/Windows/562061896.wem new file mode 100644 index 00000000..11c537e9 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/562061896.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/56485828.wem b/GZJ/Asset/WwiseAudio/Windows/56485828.wem new file mode 100644 index 00000000..d5674f89 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/56485828.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/666741184.wem b/GZJ/Asset/WwiseAudio/Windows/666741184.wem new file mode 100644 index 00000000..75a4ca52 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/666741184.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/711666881.wem b/GZJ/Asset/WwiseAudio/Windows/711666881.wem new file mode 100644 index 00000000..4c04333a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/711666881.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/726361003.wem b/GZJ/Asset/WwiseAudio/Windows/726361003.wem new file mode 100644 index 00000000..311e2cb8 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/726361003.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/760304241.wem b/GZJ/Asset/WwiseAudio/Windows/760304241.wem new file mode 100644 index 00000000..e37d5216 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/760304241.wem differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_AbsorbSoul_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_AbsorbSoul_1.bnk new file mode 100644 index 00000000..3655ad5c Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_AbsorbSoul_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Anger_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Anger_1.bnk new file mode 100644 index 00000000..1b06655e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Anger_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Bombing_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Bombing_1.bnk new file mode 100644 index 00000000..7e993cca Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Bombing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Counter_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Counter_1.bnk new file mode 100644 index 00000000..d4318720 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Counter_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Crack_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Crack_1.bnk new file mode 100644 index 00000000..832bffc0 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Crack_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Dash_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Dash_1.bnk new file mode 100644 index 00000000..d169c5e7 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Dash_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_DeathStrike_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_DeathStrike_1.bnk new file mode 100644 index 00000000..2427ad09 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_DeathStrike_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_ElectricShock_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_ElectricShock_1.bnk new file mode 100644 index 00000000..cbd095b6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_ElectricShock_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Exhaust_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Exhaust_1.bnk new file mode 100644 index 00000000..057e81b4 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Exhaust_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_FireDomain_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_FireDomain_1.bnk new file mode 100644 index 00000000..3917e355 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_FireDomain_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Flowing_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Flowing_1.bnk new file mode 100644 index 00000000..8051ad43 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Flowing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Heal_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Heal_1.bnk new file mode 100644 index 00000000..1b493997 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Heal_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_IceFrost_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_IceFrost_1.bnk new file mode 100644 index 00000000..1297ded3 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_IceFrost_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_LightWave_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_LightWave_1.bnk new file mode 100644 index 00000000..b1e52b8d Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_LightWave_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Penetration_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Penetration_1.bnk new file mode 100644 index 00000000..888f2245 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Penetration_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Puncture_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Puncture_1.bnk new file mode 100644 index 00000000..a4333743 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Puncture_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Ray_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Ray_1.bnk new file mode 100644 index 00000000..ba02af3a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Ray_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Roar_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Roar_1.bnk new file mode 100644 index 00000000..9be7f914 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Roar_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Scabbing_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Scabbing_1.bnk new file mode 100644 index 00000000..3d27caa7 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Scabbing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Seal_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Seal_1.bnk new file mode 100644 index 00000000..dedf293e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Seal_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_ShadowKill_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_ShadowKill_1.bnk new file mode 100644 index 00000000..1af89867 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_ShadowKill_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Shuttle_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Shuttle_1.bnk new file mode 100644 index 00000000..ab81f868 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Shuttle_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Slash_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Slash_1.bnk new file mode 100644 index 00000000..59f84cc1 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Slash_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_StarFall_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_StarFall_1.bnk new file mode 100644 index 00000000..ee8ed44c Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_StarFall_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_StickStrike_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_StickStrike_1.bnk new file mode 100644 index 00000000..50381233 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_StickStrike_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Stomp_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Stomp_1.bnk new file mode 100644 index 00000000..89d11b1d Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Stomp_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_StrongWind_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_StrongWind_1.bnk new file mode 100644 index 00000000..a17b3505 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_StrongWind_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Stun_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Stun_1.bnk new file mode 100644 index 00000000..f1747580 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Stun_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Tear_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Tear_1.bnk new file mode 100644 index 00000000..e6970419 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Tear_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_ToxicRain_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_ToxicRain_1.bnk new file mode 100644 index 00000000..12d54163 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_ToxicRain_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Tread_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Tread_1.bnk new file mode 100644 index 00000000..d5cb911b Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Tread_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/Windows/Skill_Weaken_1.bnk b/GZJ/Asset/WwiseAudio/Windows/Skill_Weaken_1.bnk new file mode 100644 index 00000000..cf1cc8c4 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/Windows/Skill_Weaken_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1062719616.wem b/GZJ/Asset/WwiseAudio/iOS/1062719616.wem new file mode 100644 index 00000000..f467d312 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1062719616.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/110098456.wem b/GZJ/Asset/WwiseAudio/iOS/110098456.wem new file mode 100644 index 00000000..dd3359bb Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/110098456.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1127409792.wem b/GZJ/Asset/WwiseAudio/iOS/1127409792.wem new file mode 100644 index 00000000..22436f59 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1127409792.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1146204760.wem b/GZJ/Asset/WwiseAudio/iOS/1146204760.wem new file mode 100644 index 00000000..8bac84b7 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1146204760.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1228065994.wem b/GZJ/Asset/WwiseAudio/iOS/1228065994.wem new file mode 100644 index 00000000..d998467f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1228065994.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1287723698.wem b/GZJ/Asset/WwiseAudio/iOS/1287723698.wem new file mode 100644 index 00000000..a2d28655 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1287723698.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1493535104.wem b/GZJ/Asset/WwiseAudio/iOS/1493535104.wem new file mode 100644 index 00000000..cc1dc419 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1493535104.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1507766438.wem b/GZJ/Asset/WwiseAudio/iOS/1507766438.wem new file mode 100644 index 00000000..edd39cd0 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1507766438.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1675309235.wem b/GZJ/Asset/WwiseAudio/iOS/1675309235.wem new file mode 100644 index 00000000..cdf22d92 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1675309235.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1680767104.wem b/GZJ/Asset/WwiseAudio/iOS/1680767104.wem new file mode 100644 index 00000000..dfc376df Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1680767104.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1732055168.wem b/GZJ/Asset/WwiseAudio/iOS/1732055168.wem new file mode 100644 index 00000000..8e1acae9 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1732055168.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/185178256.wem b/GZJ/Asset/WwiseAudio/iOS/185178256.wem new file mode 100644 index 00000000..d1063e2b Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/185178256.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/1933947829.wem b/GZJ/Asset/WwiseAudio/iOS/1933947829.wem new file mode 100644 index 00000000..10b5f547 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/1933947829.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/2038465758.wem b/GZJ/Asset/WwiseAudio/iOS/2038465758.wem new file mode 100644 index 00000000..d8516ef3 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/2038465758.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/206300901.wem b/GZJ/Asset/WwiseAudio/iOS/206300901.wem new file mode 100644 index 00000000..56030a0e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/206300901.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/2135136384.wem b/GZJ/Asset/WwiseAudio/iOS/2135136384.wem new file mode 100644 index 00000000..902ef7f0 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/2135136384.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/223974801.wem b/GZJ/Asset/WwiseAudio/iOS/223974801.wem new file mode 100644 index 00000000..2ca455d6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/223974801.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/298736302.wem b/GZJ/Asset/WwiseAudio/iOS/298736302.wem new file mode 100644 index 00000000..b86b05e8 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/298736302.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/37326121.wem b/GZJ/Asset/WwiseAudio/iOS/37326121.wem new file mode 100644 index 00000000..68aaef41 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/37326121.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/409597344.wem b/GZJ/Asset/WwiseAudio/iOS/409597344.wem new file mode 100644 index 00000000..7174f57a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/409597344.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/411130705.wem b/GZJ/Asset/WwiseAudio/iOS/411130705.wem new file mode 100644 index 00000000..a8b3c2af Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/411130705.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/485711499.wem b/GZJ/Asset/WwiseAudio/iOS/485711499.wem new file mode 100644 index 00000000..f32a66d6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/485711499.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/492475616.wem b/GZJ/Asset/WwiseAudio/iOS/492475616.wem new file mode 100644 index 00000000..d998467f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/492475616.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/521182556.wem b/GZJ/Asset/WwiseAudio/iOS/521182556.wem new file mode 100644 index 00000000..6a5f6dfe Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/521182556.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/55372988.wem b/GZJ/Asset/WwiseAudio/iOS/55372988.wem new file mode 100644 index 00000000..8afa141d Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/55372988.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/560582775.wem b/GZJ/Asset/WwiseAudio/iOS/560582775.wem new file mode 100644 index 00000000..4531026b Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/560582775.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/562061896.wem b/GZJ/Asset/WwiseAudio/iOS/562061896.wem new file mode 100644 index 00000000..11c537e9 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/562061896.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/56485828.wem b/GZJ/Asset/WwiseAudio/iOS/56485828.wem new file mode 100644 index 00000000..d5674f89 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/56485828.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/666741184.wem b/GZJ/Asset/WwiseAudio/iOS/666741184.wem new file mode 100644 index 00000000..75a4ca52 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/666741184.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/711666881.wem b/GZJ/Asset/WwiseAudio/iOS/711666881.wem new file mode 100644 index 00000000..4c04333a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/711666881.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/726361003.wem b/GZJ/Asset/WwiseAudio/iOS/726361003.wem new file mode 100644 index 00000000..311e2cb8 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/726361003.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/760304241.wem b/GZJ/Asset/WwiseAudio/iOS/760304241.wem new file mode 100644 index 00000000..e37d5216 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/760304241.wem differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_AbsorbSoul_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_AbsorbSoul_1.bnk new file mode 100644 index 00000000..792eb12d Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_AbsorbSoul_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Anger_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Anger_1.bnk new file mode 100644 index 00000000..98d7cc80 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Anger_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Bombing_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Bombing_1.bnk new file mode 100644 index 00000000..4945e1e4 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Bombing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Counter_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Counter_1.bnk new file mode 100644 index 00000000..b41cae13 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Counter_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Crack_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Crack_1.bnk new file mode 100644 index 00000000..3dec5c26 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Crack_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Dash_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Dash_1.bnk new file mode 100644 index 00000000..ab20671a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Dash_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_DeathStrike_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_DeathStrike_1.bnk new file mode 100644 index 00000000..cbddcff6 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_DeathStrike_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_ElectricShock_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_ElectricShock_1.bnk new file mode 100644 index 00000000..91b7c915 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_ElectricShock_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Exhaust_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Exhaust_1.bnk new file mode 100644 index 00000000..1988808e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Exhaust_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_FireDomain_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_FireDomain_1.bnk new file mode 100644 index 00000000..388cd3fb Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_FireDomain_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Flowing_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Flowing_1.bnk new file mode 100644 index 00000000..8af8010a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Flowing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Heal_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Heal_1.bnk new file mode 100644 index 00000000..bfb5eeef Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Heal_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_IceFrost_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_IceFrost_1.bnk new file mode 100644 index 00000000..c0eacc71 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_IceFrost_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_LightWave_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_LightWave_1.bnk new file mode 100644 index 00000000..2b7ac0ac Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_LightWave_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Penetration_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Penetration_1.bnk new file mode 100644 index 00000000..a378cb78 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Penetration_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Puncture_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Puncture_1.bnk new file mode 100644 index 00000000..03ec570f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Puncture_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Ray_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Ray_1.bnk new file mode 100644 index 00000000..5da861c4 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Ray_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Roar_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Roar_1.bnk new file mode 100644 index 00000000..a7575e44 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Roar_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Scabbing_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Scabbing_1.bnk new file mode 100644 index 00000000..630ead36 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Scabbing_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Seal_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Seal_1.bnk new file mode 100644 index 00000000..a16fef9a Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Seal_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_ShadowKill_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_ShadowKill_1.bnk new file mode 100644 index 00000000..36bb752c Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_ShadowKill_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Shuttle_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Shuttle_1.bnk new file mode 100644 index 00000000..8c9bf56e Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Shuttle_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Slash_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Slash_1.bnk new file mode 100644 index 00000000..afd53dba Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Slash_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_StarFall_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_StarFall_1.bnk new file mode 100644 index 00000000..52d0e113 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_StarFall_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_StickStrike_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_StickStrike_1.bnk new file mode 100644 index 00000000..7724045f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_StickStrike_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Stomp_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Stomp_1.bnk new file mode 100644 index 00000000..5dcb327f Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Stomp_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_StrongWind_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_StrongWind_1.bnk new file mode 100644 index 00000000..d6e24653 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_StrongWind_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Stun_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Stun_1.bnk new file mode 100644 index 00000000..c692f8ab Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Stun_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Tear_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Tear_1.bnk new file mode 100644 index 00000000..c427bd81 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Tear_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_ToxicRain_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_ToxicRain_1.bnk new file mode 100644 index 00000000..c81b0b61 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_ToxicRain_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Tread_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Tread_1.bnk new file mode 100644 index 00000000..74017121 Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Tread_1.bnk differ diff --git a/GZJ/Asset/WwiseAudio/iOS/Skill_Weaken_1.bnk b/GZJ/Asset/WwiseAudio/iOS/Skill_Weaken_1.bnk new file mode 100644 index 00000000..9a358b1c Binary files /dev/null and b/GZJ/Asset/WwiseAudio/iOS/Skill_Weaken_1.bnk differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_AbsorbSoul_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_AbsorbSoul_1.uasset new file mode 100644 index 00000000..5f2bea81 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_AbsorbSoul_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Anger_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Anger_1.uasset new file mode 100644 index 00000000..20b8a106 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Anger_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Bombing_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Bombing_1.uasset new file mode 100644 index 00000000..7498b403 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Bombing_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Counter_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Counter_1.uasset new file mode 100644 index 00000000..e256cf8e Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Counter_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Crack_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Crack_1.uasset new file mode 100644 index 00000000..aae05f2c Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Crack_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Dash_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Dash_1.uasset new file mode 100644 index 00000000..b2784215 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Dash_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_DeathStrike_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_DeathStrike_1.uasset new file mode 100644 index 00000000..e1b01cc8 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_DeathStrike_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ElectricShock_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ElectricShock_1.uasset new file mode 100644 index 00000000..54ad47ef Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ElectricShock_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Exhaust_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Exhaust_1.uasset new file mode 100644 index 00000000..c30da4ce Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Exhaust_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_FireDomain_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_FireDomain_1.uasset new file mode 100644 index 00000000..9a87fb94 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_FireDomain_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Flowing_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Flowing_1.uasset new file mode 100644 index 00000000..ea4d79be Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Flowing_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Heal_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Heal_1.uasset new file mode 100644 index 00000000..350d0423 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Heal_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_IceFrost_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_IceFrost_1.uasset new file mode 100644 index 00000000..587a01bd Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_IceFrost_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_LightWave_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_LightWave_1.uasset new file mode 100644 index 00000000..93cd0f35 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_LightWave_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Penetration_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Penetration_1.uasset new file mode 100644 index 00000000..f2287248 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Penetration_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Puncture_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Puncture_1.uasset new file mode 100644 index 00000000..fb94449b Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Puncture_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Ray_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Ray_1.uasset new file mode 100644 index 00000000..381f2018 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Ray_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Roar_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Roar_1.uasset new file mode 100644 index 00000000..688005ea Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Roar_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Scabbing_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Scabbing_1.uasset new file mode 100644 index 00000000..0c3c94cc Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Scabbing_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Seal_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Seal_1.uasset new file mode 100644 index 00000000..80822b33 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Seal_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ShadowKill_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ShadowKill_1.uasset new file mode 100644 index 00000000..0936e27a Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ShadowKill_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Shuttle_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Shuttle_1.uasset new file mode 100644 index 00000000..69f32d07 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Shuttle_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Slash_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Slash_1.uasset new file mode 100644 index 00000000..10c64245 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Slash_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StarFall_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StarFall_1.uasset new file mode 100644 index 00000000..d6ebc203 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StarFall_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StickStrike_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StickStrike_1.uasset new file mode 100644 index 00000000..96fa696f Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StickStrike_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Stomp_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Stomp_1.uasset new file mode 100644 index 00000000..91db4141 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Stomp_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StrongWind_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StrongWind_1.uasset new file mode 100644 index 00000000..66222cd0 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_StrongWind_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Stun_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Stun_1.uasset new file mode 100644 index 00000000..8843da1a Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Stun_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Tear_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Tear_1.uasset new file mode 100644 index 00000000..1e9ef7e9 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Tear_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ToxicRain_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ToxicRain_1.uasset new file mode 100644 index 00000000..1d94f745 Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_ToxicRain_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Tread_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Tread_1.uasset new file mode 100644 index 00000000..c72c1abc Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Tread_1.uasset differ diff --git a/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Weaken_1.uasset b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Weaken_1.uasset new file mode 100644 index 00000000..ebb9e7cb Binary files /dev/null and b/GZJ/Asset/WwiseEvent/SkillAudio/Skill_Weaken_1.uasset differ diff --git a/GZJ/CeShi.umap b/GZJ/CeShi.umap new file mode 100644 index 00000000..9aa6d326 Binary files /dev/null and b/GZJ/CeShi.umap differ diff --git a/GZJ/DeleteFiles.txt b/GZJ/DeleteFiles.txt new file mode 100644 index 00000000..e69de29b diff --git a/GZJ/GZJ.uasset b/GZJ/GZJ.uasset new file mode 100644 index 00000000..887e9f62 Binary files /dev/null and b/GZJ/GZJ.uasset differ diff --git a/GZJ/GZJ.ugcproj b/GZJ/GZJ.ugcproj new file mode 100644 index 00000000..f470de7a --- /dev/null +++ b/GZJ/GZJ.ugcproj @@ -0,0 +1,69 @@ +[Root] +ProjectDisplayName=GZJ +ProjectDescription=GZJ +ProjectName=GZJ +ProjectTrueName=F75647B0B65E273E7EC9626180E71175F72BF7B57C22256BF9F43B95F8399C27 +ProjectShortPath=/GZJ/ +StartMapName=/GZJ/UGCmap +MapMode=0 +bIsBigWorld=0 +Version=1.24.23.10296 +UpdateVersion=5 +GameModePath=/GZJ/Asset/Blueprint/UGCGameMode.UGCGameMode_C +DefaultLevelDirectorPath=/Asset/Blueprint/UGCLevelDirector.UGCLevelDirector_C + +[MatchSetting] +NumberOfTeams=1 +TeamPlayers=4 +bEnableChat=0 +bEnableRoomChat=0 +ChannelName=全部 +RoomName=全部 +bEnablePrivateChat=0 +bEnableTeamChat=0 +bShowMessage=0 +bMessageDisappear=0 +MessageLifetime=0.000000 +MaxMessageLines=6 +bEnableSystemChannel=0 +bEnableChatBubble=0 +BubbleLifetime=10 +MatchMethod=0 +InitialScore=2000 +MinScore=0 +MaxScore=4000 +RankDensity=100 +BeyondRankTime=10 +BeyondRankNum=10 +TeamScoreCalculation=0 + +[MiniMap] +ZoomRatios=50 +SliderExpandRatios=50 +UserDefineMapPath=1 + +[SwitchesInMaps] +SwitchesInMaps=((Key="r.Mobile.EnableIBL",Value=0),(Key="s.StreamableDelegateLimitCount",Value=0),(Key="s.StreamableDelegateLimitTime",Value=0.001),(Key="r.mobile.HZBOcclusion",Value=0),(Key="r.mobile.allowsoftwareocclusion",Value=1),(Key="AnimDynamicStateFlipSmoothFrame",Value=5)) + +[PlayBinding] +PlayBindingArray=[] + +[JobOption] +LastJobId=-1 +LastWindowsJobId=-1 +LastAndroidJobId=-1 +LastIOSJobId=-1 +PakOnly=0 +LastSkipBake=False +LastTargetPlatform=LinuxServer + +[UGCUploadOption] +PlatformIndex=0 +SkipBake=False +TargetPlatform=LinuxServer+WindowsNoEditor+Android_ETC2+IOS + +[DebugSettings] +bRoomOB=0 +TeamPlayers=1,0; + + diff --git a/GZJ/ItemDBFile.uasset b/GZJ/ItemDBFile.uasset new file mode 100644 index 00000000..0478a6d2 Binary files /dev/null and b/GZJ/ItemDBFile.uasset differ diff --git a/GZJ/Navmesh/UGCmap.navmesh b/GZJ/Navmesh/UGCmap.navmesh new file mode 100644 index 00000000..557733a8 Binary files /dev/null and b/GZJ/Navmesh/UGCmap.navmesh differ diff --git a/GZJ/ReferenceAssetList.txt b/GZJ/ReferenceAssetList.txt new file mode 100644 index 00000000..63080f7d --- /dev/null +++ b/GZJ/ReferenceAssetList.txt @@ -0,0 +1,131 @@ +/Game/Arts_Player/Weapon/MainWeapon/Rifle/AKM/Mesh/ST_WEP_AK47_Lod +/Game/Arts_Player/Weapon/MainWeapon/Rifle/AKM/Mesh/ST_WEP_AK47_Mag_Lod +/Game/Arts_Player/Weapon/MainWeapon/Sniper/AWM/Mesh/ST_WEP_AWM_Lod +/Game/Arts_Player/Weapon/MainWeapon/Sniper/AWM/Mesh/ST_WEP_AWM_Mag_lod +/Game/Arts_Player/Weapon/MainWeapon/Others/DP28/Mesh/ST_WEP_DP28_Lod +/Game/Arts_Player/Weapon/MainWeapon/Sniper/K98k/Mesh/ST_WEP_98k_Lod +/Game/Arts_Player/Weapon/MainWeapon/Others/M249/Mesh/ST_WEP_M249_Lod +/Game/Arts_Player/Weapon/MainWeapon/Others/M249/Mesh/ST_WEP_M249_Stock +/Game/Arts_Player/Weapon/MainWeapon/Others/M249/Mesh/ST_WEP_M249_Mag_Lod +/Game/Arts_Player/Weapon/MainWeapon/Rifle/M416/Mesh/ST_WEP_M416_Lod +/Game/Arts_Player/Weapon/MainWeapon/Rifle/M416/Mesh/ST_WEP_M416_Mag_Lod +/Game/Arts_Player/Weapon/MainWeapon/Rifle/M416/Mesh/ST_WEP_M416_Muzzle_Lod +/Game/Arts_Player/Weapon/MainWeapon/Rifle/M416/Mesh/ST_WEP_M416_Scope_Lod +/Game/Arts_Player/Weapon/MainWeapon/Sniper/Mini14/Mesh/ST_WEP_Mini14_Lod +/Game/Arts_Player/Weapon/MainWeapon/Pistol/R1895/Mesh/ST_WEP_R1895_Lod +/Game/Arts_Player/Weapon/MainWeapon/Pistol/Rhino/Mesh/ST_WEP_Rhino_Lod +/Game/Arts_Player/Weapon/MainWeapon/Shotgun/S12K/Mesh/ST_WEP_S12K_Lod +/Game/Arts_Player/Weapon/MainWeapon/Shotgun/S12K/Mesh/ST_WEP_S12K_Mag +/Game/Arts_Player/Weapon/MainWeapon/Shotgun/S1897/Mesh/ST_WEP_S1897_Lod +/Game/Arts_Player/Weapon/MainWeapon/Shotgun/S686/Mesh/ST_WEP_S686_Lod +/Game/Arts_Player/Weapon/MainWeapon/Sniper/SKS/Mesh/ST_WEP_SKS_Lod +/Game/Arts_Player/Weapon/MainWeapon/Machine_gun/UZIPro/Mesh/ST_WEP_UZIPro_Lod +/Game/Arts_Player/Weapon/MainWeapon/Machine_gun/Vector/Mesh/ST_WEP_Vector_Lod +/Game/Arts_Player/Weapon/MainWeapon/Machine_gun/Vector/Mesh/ST_WEP_Vector_Stoke_Lod +/Game/Arts_Player/Weapon/MainWeapon/Machine_gun/Vector/Mesh/ST_WEP_Vector_Scope_Lod +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/Tyrant_Idle +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/Tyrant_Combat_Idle_02 +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/Tyrant_Idle_Shake +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/Tyrant_Walk +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/Tyrant_Combat_Run +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/BS_Tyrant_Hit +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/Tyrant_Death_Montage +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/BS_Falling +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/Tyrant_Fall_Landing +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/Tyrant_Stun_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_01_Shake +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_01_Shake01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_01_Shake02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Combat_Idle_02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/ZombiePC_Walk_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Walk_04 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/zombie_Run_14 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_04 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/BS_Hit +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Front_03_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_HeadShot_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Explosion_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Run01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Run02_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Birth_01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/BS_Falling +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/Zombie_Fall_Landing_Light +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Goback_01_Montage +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/New/Tyrant_Stun_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Observe01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_06 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_05 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Combat_Idle_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/ZombiePC_Run_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Walk_02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_05 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_12 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_10 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/BS_Hit +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Front_03_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_HeadShot_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Explosion_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Run01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Run02_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Birth_01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/BS_Falling +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Goback_01_Montage +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/New/Tyrant_Stun_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/Zombie_Fall_Landing_Light +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/Zombie_Fall_Landing_Hard +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Observe +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_04 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_03 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Combat_Idle_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Walk_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Walk_02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Walk_03 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_03 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_04 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/BS_Hit +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Front_03_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_HeadShot_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Explosion_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Run01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Run02_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Birth_01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Front_01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/BS_Falling +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Goback_01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Goback_01_Montage +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/New/Tyrant_Stun_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/Zombie_Fall_Landing_Light +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/Zombie_Fall_Landing_Hard +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Observe +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_04 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Idle_03 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Combat_Idle_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Walk_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Walk_02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Walk_03 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_01 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_02 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_03 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Locomotion/Zombie_Run_04 +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/BS_Hit +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Front_03_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_HeadShot_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Explosion_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Run01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Run02_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Birth_01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Front_01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Hit_Dead/Zombie01_Death_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/BS_Falling +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Goback_01_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Idle/Zombie_Goback_01_Montage +/Game/Arts_Player_PVE/Monster/Zombie_Tyrant/Anim/New/Tyrant_Stun_Montage +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/Zombie_Fall_Landing_Light +/Game/Arts_Player_PVE/Monster/Shared_Anim01/Fall/Zombie_Fall_Landing_Hard diff --git a/GZJ/Script/Blueprint/AI/AIC_BossBoorish.lua b/GZJ/Script/Blueprint/AI/AIC_BossBoorish.lua new file mode 100644 index 00000000..e5513027 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_BossBoorish.lua @@ -0,0 +1,35 @@ +---@class AIC_BossBoorish_C:MobAIController +--Edit Below-- +local AIC_BossBoorish = {}; + +--[[ +function AIC_BossBoorish:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_BossBoorish:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_BossBoorish:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_BossBoorish:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_BossBoorish:GetAvailableServerRPCs() + return +end +--]] + +return AIC_BossBoorish; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_BossCareful.lua b/GZJ/Script/Blueprint/AI/AIC_BossCareful.lua new file mode 100644 index 00000000..b8737660 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_BossCareful.lua @@ -0,0 +1,35 @@ +---@class AIC_BossCareful_C:MobAIController +--Edit Below-- +local AIC_BossCareful = {}; + +--[[ +function AIC_BossCareful:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_BossCareful:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_BossCareful:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_BossCareful:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_BossCareful:GetAvailableServerRPCs() + return +end +--]] + +return AIC_BossCareful; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_BossCharm.lua b/GZJ/Script/Blueprint/AI/AIC_BossCharm.lua new file mode 100644 index 00000000..25345f9f --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_BossCharm.lua @@ -0,0 +1,35 @@ +---@class AIC_BossCharm_C:MobAIController +--Edit Below-- +local AIC_BossCharm = {}; + +--[[ +function AIC_BossCharm:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_BossCharm:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_BossCharm:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_BossCharm:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_BossCharm:GetAvailableServerRPCs() + return +end +--]] + +return AIC_BossCharm; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_BossMagical.lua b/GZJ/Script/Blueprint/AI/AIC_BossMagical.lua new file mode 100644 index 00000000..02864952 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_BossMagical.lua @@ -0,0 +1,35 @@ +---@class AIC_BossMagical_C:MobAIController +--Edit Below-- +local AIC_BossMagical = {}; + +--[[ +function AIC_BossMagical:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_BossMagical:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_BossMagical:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_BossMagical:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_BossMagical:GetAvailableServerRPCs() + return +end +--]] + +return AIC_BossMagical; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_BossMoment.lua b/GZJ/Script/Blueprint/AI/AIC_BossMoment.lua new file mode 100644 index 00000000..739c2f26 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_BossMoment.lua @@ -0,0 +1,35 @@ +---@class AIC_BossMoment_C:MobAIController +--Edit Below-- +local AIC_BossMoment = {}; + +--[[ +function AIC_BossMoment:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_BossMoment:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_BossMoment:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_BossMoment:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_BossMoment:GetAvailableServerRPCs() + return +end +--]] + +return AIC_BossMoment; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_BossSpring.lua b/GZJ/Script/Blueprint/AI/AIC_BossSpring.lua new file mode 100644 index 00000000..bd63ee49 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_BossSpring.lua @@ -0,0 +1,35 @@ +---@class AIC_BossSpring_C:MobAIController +--Edit Below-- +local AIC_BossSpring = {}; + +--[[ +function AIC_BossSpring:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_BossSpring:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_BossSpring:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_BossSpring:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_BossSpring:GetAvailableServerRPCs() + return +end +--]] + +return AIC_BossSpring; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_DullMonster.lua b/GZJ/Script/Blueprint/AI/AIC_DullMonster.lua new file mode 100644 index 00000000..7e4d9dd9 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_DullMonster.lua @@ -0,0 +1,35 @@ +---@class AIC_DullMonster_C:MobAIController +--Edit Below-- +local AIC_DullMonster = {}; + +--[[ +function AIC_DullMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_DullMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_DullMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_DullMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_DullMonster:GetAvailableServerRPCs() + return +end +--]] + +return AIC_DullMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_IceZodiaca.lua b/GZJ/Script/Blueprint/AI/AIC_IceZodiaca.lua new file mode 100644 index 00000000..9b0c71cc --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_IceZodiaca.lua @@ -0,0 +1,35 @@ +---@class AIC_IceZodiaca_C:MobAIController +--Edit Below-- +local AIC_IceZodiaca = {}; + +--[[ +function AIC_IceZodiaca:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_IceZodiaca:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_IceZodiaca:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_IceZodiaca:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_IceZodiaca:GetAvailableServerRPCs() + return +end +--]] + +return AIC_IceZodiaca; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterAccessoryMonster.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterAccessoryMonster.lua new file mode 100644 index 00000000..d4d35568 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterAccessoryMonster.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterAccessoryMonster_C:MobAIController +--Edit Below-- +local AIC_MonsterAccessoryMonster = {}; + +--[[ +function AIC_MonsterAccessoryMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterAccessoryMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterAccessoryMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterAccessoryMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterAccessoryMonster:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterAccessoryMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterBaseAttack.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterBaseAttack.lua new file mode 100644 index 00000000..a9481600 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterBaseAttack.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterBaseAttack_C:MobAIController +--Edit Below-- +local AIC_MonsterBaseAttack = {}; + +--[[ +function AIC_MonsterBaseAttack:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterBaseAttack:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterBaseAttack:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterBaseAttack:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterBaseAttack:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterBaseAttack; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterExerciseRoom.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterExerciseRoom.lua new file mode 100644 index 00000000..5fd6c127 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterExerciseRoom.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterExerciseRoom_C:MobAIController +--Edit Below-- +local AIC_MonsterExerciseRoom = {}; + +--[[ +function AIC_MonsterExerciseRoom:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterExerciseRoom:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterExerciseRoom:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterExerciseRoom:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterExerciseRoom:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterExerciseRoom; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterGoldEfficiencyMonster.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterGoldEfficiencyMonster.lua new file mode 100644 index 00000000..1acb629f --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterGoldEfficiencyMonster.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterGoldEfficiencyMonster_C:MobAIController +--Edit Below-- +local AIC_MonsterGoldEfficiencyMonster = {}; + +--[[ +function AIC_MonsterGoldEfficiencyMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterGoldEfficiencyMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterGoldEfficiencyMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterGoldEfficiencyMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterGoldEfficiencyMonster:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterGoldEfficiencyMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterGoldMonster.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterGoldMonster.lua new file mode 100644 index 00000000..0fc3e997 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterGoldMonster.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterGoldMonster_C:MobAIController +--Edit Below-- +local AIC_MonsterGoldMonster = {}; + +--[[ +function AIC_MonsterGoldMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterGoldMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterGoldMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterGoldMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterGoldMonster:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterGoldMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterGradeBreakthrough.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterGradeBreakthrough.lua new file mode 100644 index 00000000..d92d9be9 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterGradeBreakthrough.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterGradeBreakthrough_C:MobAIController +--Edit Below-- +local AIC_MonsterGradeBreakthrough = {}; + +--[[ +function AIC_MonsterGradeBreakthrough:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterGradeBreakthrough:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterGradeBreakthrough:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterGradeBreakthrough:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterGradeBreakthrough:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterGradeBreakthrough; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterInherit_1.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterInherit_1.lua new file mode 100644 index 00000000..8b8ecdec --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterInherit_1.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterInherit_1_C:MobAIController +--Edit Below-- +local AIC_MonsterInherit_1 = {}; + +--[[ +function AIC_MonsterInherit_1:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterInherit_1:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterInherit_1:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterInherit_1:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterInherit_1:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterInherit_1; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterInherit_2.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterInherit_2.lua new file mode 100644 index 00000000..597e0a03 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterInherit_2.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterInherit_2_C:MobAIController +--Edit Below-- +local AIC_MonsterInherit_2 = {}; + +--[[ +function AIC_MonsterInherit_2:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterInherit_2:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterInherit_2:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterInherit_2:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterInherit_2:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterInherit_2; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterSkillMonster.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterSkillMonster.lua new file mode 100644 index 00000000..804fad08 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterSkillMonster.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterSkillMonster_C:MobAIController +--Edit Below-- +local AIC_MonsterSkillMonster = {}; + +--[[ +function AIC_MonsterSkillMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterSkillMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterSkillMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterSkillMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterSkillMonster:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterSkillMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterUnseal.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterUnseal.lua new file mode 100644 index 00000000..53019886 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterUnseal.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterUnseal_C:MobAIController +--Edit Below-- +local AIC_MonsterUnseal = {}; + +--[[ +function AIC_MonsterUnseal:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_MonsterUnseal:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterUnseal:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterUnseal:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterUnseal:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterUnseal; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_MonsterWeaponRecasting.lua b/GZJ/Script/Blueprint/AI/AIC_MonsterWeaponRecasting.lua new file mode 100644 index 00000000..421864bb --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_MonsterWeaponRecasting.lua @@ -0,0 +1,35 @@ +---@class AIC_MonsterWeaponRecasting_C:MobAIController +--Edit Below-- +local AIC_MonsterWeaponRecasting = {}; + + +function AIC_MonsterWeaponRecasting:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end + + +--[[ +function AIC_MonsterWeaponRecasting:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_MonsterWeaponRecasting:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_MonsterWeaponRecasting:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_MonsterWeaponRecasting:GetAvailableServerRPCs() + return +end +--]] + +return AIC_MonsterWeaponRecasting; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_NormalMonster.lua b/GZJ/Script/Blueprint/AI/AIC_NormalMonster.lua new file mode 100644 index 00000000..46294e4c --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_NormalMonster.lua @@ -0,0 +1,35 @@ +---@class AIC_NormalMonster_C:MobAIController +--Edit Below-- +local AIC_NormalMonster = {}; + +--[[ +function AIC_NormalMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function AIC_NormalMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_NormalMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_NormalMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_NormalMonster:GetAvailableServerRPCs() + return +end +--]] + +return AIC_NormalMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/AIC_TyrantMonster.lua b/GZJ/Script/Blueprint/AI/AIC_TyrantMonster.lua new file mode 100644 index 00000000..32db2aa3 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/AIC_TyrantMonster.lua @@ -0,0 +1,133 @@ +---@class AIC_TyrantMonster_C:MobAIController +--Edit Below-- +local AIC_TyrantMonster = {}; + + +function AIC_TyrantMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); + -- if self:GetBlackboardComponent() and self:HasAuthority() then + + -- print("BlackboardComponent is not nil") + -- self:GetBlackboardComponent():SetValueAsBool("IsSpeedIncrease", true) + -- print("IsSpeedIncrease : " .. tostring(self:GetBlackboardComponent():GetValueAsBool("IsSpeedIncrease"))) + -- end + -- EventSystem.SetTimer(self, + -- function () + -- if self:GetBlackboardComponent() and self:HasAuthority() then + + -- print("Delay 0.5s BlackboardComponent is not nil") + -- self:GetBlackboardComponent():SetValueAsBool("IsSpeedIncrease", true) + -- print("Delay 0.5s IsSpeedIncrease : " .. tostring(self:GetBlackboardComponent():GetValueAsBool("IsSpeedIncrease"))) + -- end + -- end + -- ,0.5 + -- ) + -- if UAIBlueprintHelperLibrary.GetBlackboard() and self:HasAuthority() then + -- print("BlackboardComponent is not nil") + -- UAIBlueprintHelperLibrary.GetBlackboard():SetValueAsBool("IsSpeedIncrease", true) + -- print("IsSpeedIncrease : " .. tostring(UAIBlueprintHelperLibrary.GetBlackboard():GetValueAsBool("IsSpeedIncrease"))) + -- end + + -- AddSkill + +end + +function AIC_TyrantMonster:OnPossess(PossessedPawn) + --self.SuperClass.OnPossess(PossessedPawn) + if self:HasAuthority() then + EventSystem.SetTimer(self, + function () + + self:SkillBloodthirsty() + self:SkillShield() + end, + 0.5 + ) + end +end + + +function AIC_TyrantMonster:SkillBloodthirsty() + EventSystem.SetTimerLoop(self, + function () + if (self:GetBlackboardComponent() and self:HasAuthority()) then + self:GetBlackboardComponent():SetValueAsBool("IsSpeedIncrease", true) + if not self:GetBlackboardComponent():GetValueAsBool("IsSpeedIncrease") then + print("[SKYERROR] IsSpeedIncrease Setting Failed [true] : " .. tostring(self:GetBlackboardComponent():GetValueAsBool("IsSpeedIncrease"))) + else + EventSystem.SetTimer(self, + function () + self:GetBlackboardComponent():SetValueAsBool("IsSpeedIncrease", false) + if self:GetBlackboardComponent():GetValueAsBool("IsSpeedIncrease") then + print("[SKYERROR] IsSpeedIncrease Setting Failed [false] : " .. tostring(self:GetBlackboardComponent():GetValueAsBool("IsSpeedIncrease"))) + end + end, + MonsterParam.TyrantMonster.SkillParam.bloodthirsty.duration + ) + end + end + end, + MonsterParam.TyrantMonster.SkillParam.bloodthirsty.delay + ) +end + +function AIC_TyrantMonster:SkillShield() + if not self:K2_GetPawn() then + return + end + self:K2_GetPawn():AddModifyDamageDelegationFun( + "SkillShield", + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + if self:K2_GetPawn().ShieldValue > 0 then + self:K2_GetPawn().ShieldValue = self:K2_GetPawn().ShieldValue - DamageAmount + if self:K2_GetPawn().ShieldValue > 0 then + return 0 + else + self:K2_GetPawn().SphereShield:SetVisibility(false) + local GivePawnDamage = self:K2_GetPawn().AttackValue / 2 + UGCGameSystem.ApplyDamage(EventInstigator:K2_GetPawn(), GivePawnDamage, self,self, EDamageType.ShootDamage) + return -self:K2_GetPawn().ShieldValue + end + else + return DamageAmount + end + end + ) + EventSystem.SetTimerLoop( + self, + function () + print("AddSield") + self:K2_GetPawn().SphereShield:SetVisibility(true) + --self:K2_GetPawn().ShieldValue = self:K2_GetPawn().MaxHealth / 2 + self:K2_GetPawn().ShieldValue = 200 + end, + MonsterParam.TyrantMonster.SkillParam.Shield.delay + ) + +end + +--[[ +function AIC_TyrantMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function AIC_TyrantMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function AIC_TyrantMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function AIC_TyrantMonster:GetAvailableServerRPCs() + return +end +--]] + +return AIC_TyrantMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTAttachment_FindExerciseRoomPlayer.lua b/GZJ/Script/Blueprint/AI/BTAttachment_FindExerciseRoomPlayer.lua new file mode 100644 index 00000000..dcc0028f --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTAttachment_FindExerciseRoomPlayer.lua @@ -0,0 +1,49 @@ +---@class BTAttachment_FindExerciseRoomPlayer_C:BTAttachment_LuaBase +---@field Radius float +---@field TargetObject FBlackboardKeySelector +---@field TargetBool FBlackboardKeySelector +--Edit Below-- +local BTAttachment_FindExerciseRoomPlayer = { + PawnClass = nil; +} + +-- tick function +function BTAttachment_FindExerciseRoomPlayer:ReceiveTickAI(OwnerController, ControlledPawn, DeltaSeconds) + local GameState = UGCGameSystem.GameState + if not UE.IsValid(GameState) or not ControlledPawn or ControlledPawn.TargetPlayerKey == nil or ControlledPawn.TargetPlayerKey < 0 then + BTFunctionLibrary.SetBlackboardValueAsObject(self, self.TargetObject, nil) + BTFunctionLibrary.SetBlackboardValueAsBool(self, self.TargetBool, false) + return + end + + if ControlledPawn.bIsStun == true then + BTFunctionLibrary.SetBlackboardValueAsObject(self, self.TargetObject, nil) + return + end + + local TargetPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(ControlledPawn.TargetPlayerKey) + BTFunctionLibrary.SetBlackboardValueAsObject(self, self.TargetObject, TargetPawn) + + if TargetPawn ~= nil and UE.IsValid(TargetPawn) and TargetPawn.bIsAlive and TargetPawn.IsInArena == false then + BTFunctionLibrary.SetBlackboardValueAsBool(self, self.TargetBool, true) + else + BTFunctionLibrary.SetBlackboardValueAsBool(self, self.TargetBool, false) + end +end + +-- -- attachment became active +function BTAttachment_FindExerciseRoomPlayer:ReceiveActivationAI(OwnerController, ControlledPawn) + -- UE.Log("[BTAttachment_FindExerciseRoomPlayer] ReceiveActivationAI: ControlledPawn:[%s]", KismetSystemLibrary.GetObjectName(ControlledPawn)) +end + +-- -- attachment became inactive +-- function BTAttachment_FindExerciseRoomPlayer:ReceiveDeactivationAI(OwnerController, ControlledPawn) + +-- end + +-- -- task search enters branch of tree +-- function BTAttachment_FindExerciseRoomPlayer:ReceiveSearchStartAI(OwnerController, ControlledPawn) + +-- end + +return BTAttachment_FindExerciseRoomPlayer \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTAttachment_FindTarget.lua b/GZJ/Script/Blueprint/AI/BTAttachment_FindTarget.lua new file mode 100644 index 00000000..0be7c167 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTAttachment_FindTarget.lua @@ -0,0 +1,63 @@ +---@class BTAttachment_FindTarget_C:BTAttachment_LuaBase +---@field Target FBlackboardKeySelector +---@field TrackPlayerRange float +--Edit Below-- +local BTAttachment_FindTarget = {} + +-- -- tick function +function BTAttachment_FindTarget:ReceiveTickAI(OwnerController, ControlledPawn, DeltaSeconds) + local GameState = UGCGameSystem.GameState + if not UE.IsValid(GameState) or not ControlledPawn then + return + end + + if ControlledPawn.bIsStun == true then + BTFunctionLibrary.SetBlackboardValueAsObject(self, self.Target, nil) + return + end + + local CurrentTarget = nil + local PlayersInArena = GameState:GetPlayersInArena() + if table.getCount(PlayersInArena) <= 0 then + CurrentTarget = GameState:GetCrystal() + elseif ControlledPawn.TrackPlayer and ControlledPawn.TrackPlayer.IsInArena then + CurrentTarget = ControlledPawn.TrackPlayer + else + local PawnLocation = ControlledPawn:K2_GetActorLocation() + local MinDist = 100000 + for _, Player in pairs(PlayersInArena) do + if UE.IsValid(Player) and UGCPlayerStateSystem.IsAlive(UGCPawnAttrSystem.GetPlayerKeyInt64(Player)) then + local PlayerLocation = Player:K2_GetActorLocation() + local Dist = VectorHelper.GetDistance(PawnLocation, PlayerLocation) + if Dist < MinDist then + MinDist = Dist + CurrentTarget = Player + end + end + end + if CurrentTarget then + local TargetTrackPlayerRange = ControlledPawn.TrackPlayerRange or self.TrackPlayerRange + if MinDist > TargetTrackPlayerRange then + CurrentTarget = GameState:GetCrystal() + end + end + end + BTFunctionLibrary.SetBlackboardValueAsObject(self, self.Target, CurrentTarget) +end + +-- -- attachment became active +-- function BTAttachment_FindTarget:ReceiveActivationAI(OwnerController, ControlledPawn) + +-- end + +-- -- attachment became inactive +-- function BTAttachment_FindTarget:ReceiveDeactivationAI(OwnerController, ControlledPawn) + +-- end + +-- -- task search enters branch of tree +-- function BTAttachment_FindTarget:ReceiveSearchStartAI(OwnerController, ControlledPawn) + +-- end + +return BTAttachment_FindTarget \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTC_BlackboardBool.lua b/GZJ/Script/Blueprint/AI/BTC_BlackboardBool.lua new file mode 100644 index 00000000..6f1d1a68 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTC_BlackboardBool.lua @@ -0,0 +1,36 @@ +---@class BTC_BlackboardBool_C:BTCondition_LuaBase +---@field BlackboardBool FBlackboardKeySelector +--Edit Below-- +local BTC_BlackboardBool = {} + +-- -- called when testing if underlying node can be executed +function BTC_BlackboardBool:PerformConditionCheckAI(OwnerController, ControlledPawn) + return BTFunctionLibrary.GetBlackboardValueAsBool(self, self.BlackboardBool) +end + +-- -- tick function +-- function BTC_BlackboardBool:ReceiveTickAI(OwnerController, ControlledPawn, DeltaSeconds) + +-- end + +-- -- called on execution of underlying node +-- function BTC_BlackboardBool:ReceiveExecutionStartAI(OwnerController, ControlledPawn) + +-- end + +-- -- called when execution of underlying node is finished +-- function BTC_BlackboardBool:ReceiveExecutionFinishAI(OwnerController, ControlledPawn, NodeResult) + +-- end + +-- -- called when observer is activated (flow controller) +-- function BTC_BlackboardBool:ReceiveObserverActivatedAI(OwnerController, ControlledPawn) + +-- end + +-- -- called when observer is deactivated (flow controller) +-- function BTC_BlackboardBool:ReceiveObserverDeactivatedAI(OwnerController, ControlledPawn) + +-- end + +return BTC_BlackboardBool \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTC_EquationInt.lua b/GZJ/Script/Blueprint/AI/BTC_EquationInt.lua new file mode 100644 index 00000000..052aff50 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTC_EquationInt.lua @@ -0,0 +1,37 @@ +---@class BTC_EquationInt_C:BTCondition_LuaBase +---@field BlackboardInt FBlackboardKeySelector +---@field TargetInt int32 +--Edit Below-- +local BTC_EquationInt = {} + +-- -- called when testing if underlying node can be executed +function BTC_EquationInt:PerformConditionCheckAI(OwnerController, ControlledPawn) + return BTFunctionLibrary.GetBlackboardValueAsInt(self, self.BlackboardInt) == self.TargetInt +end + +-- -- tick function +-- function BTC_EquationInt:ReceiveTickAI(OwnerController, ControlledPawn, DeltaSeconds) + +-- end + +-- -- called on execution of underlying node +-- function BTC_EquationInt:ReceiveExecutionStartAI(OwnerController, ControlledPawn) + +-- end + +-- -- called when execution of underlying node is finished +-- function BTC_EquationInt:ReceiveExecutionFinishAI(OwnerController, ControlledPawn, NodeResult) + +-- end + +-- -- called when observer is activated (flow controller) +-- function BTC_EquationInt:ReceiveObserverActivatedAI(OwnerController, ControlledPawn) + +-- end + +-- -- called when observer is deactivated (flow controller) +-- function BTC_EquationInt:ReceiveObserverDeactivatedAI(OwnerController, ControlledPawn) + +-- end + +return BTC_EquationInt \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTT_AccessoryMonster_Whirlwind.lua b/GZJ/Script/Blueprint/AI/BTT_AccessoryMonster_Whirlwind.lua new file mode 100644 index 00000000..53397cdc --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTT_AccessoryMonster_Whirlwind.lua @@ -0,0 +1,106 @@ +---@class BTT_AccessoryMonster_Whirlwind_C:BTTask_LuaBase +---@field DelaySpawnWind float +---@field WaitTime float +---@field DelayGiveHurt float +---@field ForwardLength float +--Edit Below-- +local BTT_AccessoryMonster_Whirlwind = { + CtrlPawn = nil, +} + +-- entry point, task will stay active until FinishExecute is called +function BTT_AccessoryMonster_Whirlwind:ReceiveExecuteAI(OwnerController, ControlledPawn) + if not UGCGameSystem.IsServer() then + self:FinishExecute(true) + return + end + + OwnerController:GetBlackboardComponent():SetValueAsBool("CanPlayWhirlwind", false) + + local PlayerLocation = OwnerController:GetBlackboardComponent():GetValueAsObject("TargetActor"):K2_GetActorLocation() + PlayerLocation.Z = 0 + local MonsterLocation = ControlledPawn:K2_GetActorLocation() + local DropLocation = UGCGameSystem.GameState:GetDropLocation(MonsterLocation) + MonsterLocation.Z = 0 + local DestRot = KismetMathLibrary.FindLookAtRotation(MonsterLocation, PlayerLocation) + ControlledPawn:K2_SetActorRotation(DestRot, false) + + self.CtrlPawn = ControlledPawn + local SpawnForward = self.CtrlPawn:GetActorForwardVector() + local SpawnLocation = VectorHelper.Add(DropLocation, VectorHelper.MulNumber(KismetMathLibrary.Normal(SpawnForward), self.ForwardLength)) + local SpawnRotator = DestRot + EventSystem.SetTimer( + self.CtrlPawn, + function() + UGCGameSystem.SpawnActor( + self.CtrlPawn, + UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/Skill/BP_Whirlwind.BP_Whirlwind_C')), + SpawnLocation, + SpawnRotator, + VectorHelper.ScaleOne(), + self.CtrlPawn + ) + end, + self.DelaySpawnWind + ) + EventSystem.SetTimer( + self.CtrlPawn, + function() + local HitPawns = self:BoxTraceForward(ControlledPawn, OwnerController, 10000, 150, 200) + if not table.isEmpty(HitPawns) then + local CanDamagePlayers = self.CtrlPawn:GetCanDamagePlayer() + if not table.isEmpty(CanDamagePlayers) then + local CanAddAttack = false + for k, TargetPawn in pairs(HitPawns) do + if table.hasValue(CanDamagePlayers, TargetPawn) then + self.CtrlPawn:MonsterApplyDamage(TargetPawn, self.CtrlPawn:GetAttack() * 10) + CanAddAttack = true + end + end + if CanAddAttack then + self.CtrlPawn:AddAttack() + end + end + end + end, + self.DelaySpawnWind + self.DelayGiveHurt + ) + EventSystem.SetTimer( + self, + function() + self:FinishExecute(true) + end, + self.WaitTime + ) +end + +function BTT_AccessoryMonster_Whirlwind:BoxTraceForward(ControlledPawn, OwnerController, Length, Width, Height) + local Forward = ControlledPawn:GetActorForwardVector() + local BoxLoc = VectorHelper.Add(ControlledPawn:K2_GetActorLocation(), VectorHelper.MulNumber(KismetMathLibrary.Normal(Forward), Length / 2)) + + local CasterRotation = ControlledPawn:K2_GetActorRotation() + local BoxRotation = {Yaw = CasterRotation.Yaw, Pitch = CasterRotation.Pitch, Roll = CasterRotation.Roll} + local BoxExtent = {X = Length/2, Y = Width/2, Z = Height/2} + + local AllPlayers = UGCGameSystem.GetAllPlayerPawn() + if not table.isEmpty(AllPlayers) then + table.removeValue(AllPlayers, OwnerController:GetBlackboardComponent():GetValueAsObject("TargetActor"), true) + end + + local ObjectTypes = {EObjectTypeQuery.ObjectTypeQuery3} + local ActorClassFilter = UE.LoadClass(BPClassPath.PlayerPawn) + local ActorsToIgnore = AllPlayers + local RetVal, OutActors = KismetSystemLibrary.BoxOverlapActors(ControlledPawn, BoxLoc, BoxRotation, BoxExtent, ObjectTypes, ActorClassFilter, ActorsToIgnore) + + if RetVal then + local ResultActors = {} + for _, v in pairs(OutActors) do + table.insert(ResultActors, v) + end + return ResultActors + else + return {} + end +end + +return BTT_AccessoryMonster_Whirlwind \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTT_BossBoorishBaseSkill.lua b/GZJ/Script/Blueprint/AI/BTT_BossBoorishBaseSkill.lua new file mode 100644 index 00000000..37c05cb5 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTT_BossBoorishBaseSkill.lua @@ -0,0 +1,113 @@ +---@class BTT_BossBoorishBaseSkill_C:BTTask_LuaBase +---@field SkillIndex int32 +---@field SkillType TEnumAsByte +--Edit Below-- +local BTT_BossBoorishBaseSkill = { + CtrlPawn = nil; +} + +-- entry point, task will stay active until FinishExecute is called +function BTT_BossBoorishBaseSkill:ReceiveExecuteAI(OwnerController, ControlledPawn) + BTFunctionLibrary.SetBlackboardValueAsBool(self, self.ActiveBool, false) + + self.CtrlPawn = ControlledPawn + local PlayerLocation, MoveLocation = self:GetMovablePosition() + if MoveLocation then + ControlledPawn:K2_SetActorLocation(MoveLocation, false, nil, false) + PlayerLocation.Z = 0 + MoveLocation.Z = 0 + ControlledPawn:K2_SetActorRotation(KismetMathLibrary.FindLookAtRotation(MoveLocation, PlayerLocation)) + end + self:PlaySkill() + + EventSystem.SetTimer( + self, + function() + local PawnForward = self.CtrlPawn:GetActorForwardVector() + local CenterPosition = VectorHelper.Add(self.CtrlPawn:K2_GetActorLocation(), VectorHelper.MulNumber(PawnForward, 350)) + local GiveHurtPlayers = self.CtrlPawn:GetSphereActors(CenterPosition, 300, self.CtrlPawn:GetPawnClass()) + if GiveHurtPlayers then + for k, Player in pairs(GiveHurtPlayers) do + self.CtrlPawn:MonsterApplyDamage(Player, self.CtrlPawn:GetAttack() * 5 + self.CtrlPawn:GetDefense() - self.CtrlPawn.BasePhysicalDefense) + end + end + if self.HurtTime > self.SkillTime then + self:FinishExecute(true) + end + end, + self.HurtTime + ) + EventSystem.SetTimer( + self, + function () + if self.SkillTime >= self.HurtTime then + self:FinishExecute(true) + end + end, + self.SkillTime + ) + +end + +function BTT_BossBoorishBaseSkill:PlaySkill() + local SkillManager = self.CtrlPawn:GetSkillManagerComponent() + if SkillManager ~= nil then + SkillManager:TriggerEvent(self.SkillIndex, self.SkillType) + end + if self.CtrlPawn.UpdateSkillCount ~= nil then + self.CtrlPawn:UpdateSkillCount() + end +end + +function BTT_BossBoorishBaseSkill:GetEightpoint(Length) + local Angle45Len = math.sqrt(2) / 2 + return { + Vector.New(Length, 0, 0), + Vector.New(-Length, 0, 0), + Vector.New(0, Length, 0), + Vector.New(0, -Length, 0), + Vector.New(Length * Angle45Len, Length * Angle45Len, 0), + Vector.New(-Length * Angle45Len, Length * Angle45Len, 0), + Vector.New(Length * Angle45Len, -Length * Angle45Len, 0), + Vector.New(-Length * Angle45Len, -Length * Angle45Len, 0) + } +end + +function BTT_BossBoorishBaseSkill:GetMovablePosition() + local ArenaPlayers = UGCGameSystem.GameState:GetPlayersInArena() + if not table.isEmpty(ArenaPlayers) then + local ResLocation = {} + for _, ArenaPlayer in pairs(ArenaPlayers) do + local PawnHelfHeight = ArenaPlayer.CapsuleComponent.CapsuleHalfHeight + local Playerlocation = ArenaPlayer:K2_GetActorLocation() + Playerlocation.Z = Playerlocation.Z + self.CtrlPawn.Capsule.CapsuleHalfHeight - PawnHelfHeight + 5 + + local EightLocation = self:GetEightpoint(350) + for k, AddLocation in pairs(EightLocation) do + local Beginlocation = VectorHelper.Add(Playerlocation, AddLocation) + local ObjectTypes = {EObjectTypeQuery.ObjectTypeQuery1} + local bHit, _ = KismetSystemLibrary.CapsuleTraceSingleForObjects( + self, Beginlocation, Beginlocation, + self.CtrlPawn.Capsule.CapsuleRadius, self.CtrlPawn.Capsule.CapsuleHalfHeight, + ObjectTypes, false, nil, EDrawDebugTrace.None, + nil, true, nil, nil, 20 + ) + + if not bHit then + if ResLocation[ArenaPlayer] == nil then + ResLocation[ArenaPlayer] = {} + end + table.insert(ResLocation[ArenaPlayer], VectorHelper.ToLuaTable(Beginlocation)) + end + end + end + if not table.isEmpty(ResLocation) then + local TempPlayer = table.getKeys(ResLocation)[math.random(1, table.getCount(ResLocation))] + local Locations = ResLocation[TempPlayer] + return VectorHelper.ToLuaTable(TempPlayer:K2_GetActorLocation()), Locations[math.random(1, #Locations)] + end + end + + return nil +end +return BTT_BossBoorishBaseSkill \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTT_BossCharmPlayCurseSkill.lua b/GZJ/Script/Blueprint/AI/BTT_BossCharmPlayCurseSkill.lua new file mode 100644 index 00000000..78dbf8e9 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTT_BossCharmPlayCurseSkill.lua @@ -0,0 +1,17 @@ +---@class BTT_BossCharmPlayCurseSkill_C:BTTask_LuaBase +--Edit Below-- +local BTT_BossCharmPlayCurseSkill = {} + +-- -- entry point, task will stay active until FinishExecute is called +function BTT_BossCharmPlayCurseSkill:ReceiveExecuteAI(OwnerController, ControlledPawn) + if not ControlledPawn or not OwnerController or not ControlledPawn.PlayCharmCurseSkillExe then + OwnerController:GetBlackboardComponent():SetValueAsBool("CanPlayCharmCurseSkill", false) + self:FinishExecute(true) + return + end + ControlledPawn:PlayCharmCurseSkillExe() + OwnerController:GetBlackboardComponent():SetValueAsBool("CanPlayCharmCurseSkill", false) + self:FinishExecute(true) +end + +return BTT_BossCharmPlayCurseSkill \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTT_BossCharmPlayMarshSkill.lua b/GZJ/Script/Blueprint/AI/BTT_BossCharmPlayMarshSkill.lua new file mode 100644 index 00000000..61a06dc4 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTT_BossCharmPlayMarshSkill.lua @@ -0,0 +1,19 @@ +---@class BTT_BossCharmPlayMarshSkill_C:BTTask_LuaBase +--Edit Below-- +local BTT_BossCharmPlayMarshSkill = {} + +-- -- entry point, task will stay active until FinishExecute is called +function BTT_BossCharmPlayMarshSkill:ReceiveExecuteAI(OwnerController, ControlledPawn) + UE.Log("[BTT_BossCharmPlayMarshSkill_ReceiveExecuteAI] ") + if not ControlledPawn or not OwnerController or not ControlledPawn.PlayCharmMarshSkillExe then + OwnerController:GetBlackboardComponent():SetValueAsBool("CanPlayCharmMarshSkill", false) + self:FinishExecute(true) + return + end + ControlledPawn:PlayCharmMarshSkillExe() + OwnerController:GetBlackboardComponent():SetValueAsBool("CanPlayCharmMarshSkill", false) + self:FinishExecute(true) + UE.Log("[BTT_BossCharmPlayMarshSkill_ReceiveExecuteAI] Finish") +end + +return BTT_BossCharmPlayMarshSkill \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTT_BossMomentPlayStormWind.lua b/GZJ/Script/Blueprint/AI/BTT_BossMomentPlayStormWind.lua new file mode 100644 index 00000000..06f74f91 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTT_BossMomentPlayStormWind.lua @@ -0,0 +1,15 @@ +---@class BTT_BossMomentPlay_C:BTTask_LuaBase +--Edit Below-- +local BTT_BossMomentPlayStormWind = {} + +-- -- entry point, task will stay active until FinishExecute is called +function BTT_BossMomentPlayStormWind:ReceiveExecuteAI(OwnerController, ControlledPawn) + if ControlledPawn and ControlledPawn.EnableStormWind then + if not ControlledPawn.IsSkillStormWindEnable then + ControlledPawn:EnableStormWind() + end + end + self:FinishExecute(true) +end + +return BTT_BossMomentPlayStormWind \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTT_BossSpringSkill.lua b/GZJ/Script/Blueprint/AI/BTT_BossSpringSkill.lua new file mode 100644 index 00000000..2f27f8ac --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTT_BossSpringSkill.lua @@ -0,0 +1,17 @@ +---@class BTT_BossSpringSkill_C:BTTask_LuaBase +--Edit Below-- +local BTT_BossSpringSkill = {} + +function BTT_BossSpringSkill:ReceiveExecuteAI(OwnerController, ControlledPawn) + if not ControlledPawn or not OwnerController or not ControlledPawn.SpringThingsSkillExe then + OwnerController:GetBlackboardComponent():SetValueAsBool("CanPlaySpringThingsSkill", false) + self:FinishExecute(true) + return + end + ControlledPawn:SpringThingsSkillExe() + OwnerController:GetBlackboardComponent():SetValueAsBool("CanPlaySpringThingsSkill", false) + self:FinishExecute(true) + +end + +return BTT_BossSpringSkill \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTT_SelectSkill.lua b/GZJ/Script/Blueprint/AI/BTT_SelectSkill.lua new file mode 100644 index 00000000..3ccf7cce --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTT_SelectSkill.lua @@ -0,0 +1,23 @@ +---@class BTT_SelectSkill_C:BTTask_LuaBase +---@field SkillIndex FBlackboardKeySelector +---@field SkillPercentage TArray +--Edit Below-- +local BTT_SelectSkill = {} + +-- -- entry point, task will stay active until FinishExecute is called +function BTT_SelectSkill:ReceiveExecuteAI(OwnerController, ControlledPawn) + local randskill = math.random(1, 100) + local skillindex = 0 + local TamePercentage = 0 + for index, SkillPercentage in pairs(self.SkillPercentages) do + if randskill > TamePercentage and randskill <= TamePercentage + SkillPercentage then + skillindex = index - 1 + break + end + TamePercentage = TamePercentage + SkillPercentage + end + BTFunctionLibrary.SetBlackboardValueAsInt(self, self.SkillIndex, skillindex) + self:FinishExecute(true) +end + +return BTT_SelectSkill \ No newline at end of file diff --git a/GZJ/Script/Blueprint/AI/BTT_SkillCount.lua b/GZJ/Script/Blueprint/AI/BTT_SkillCount.lua new file mode 100644 index 00000000..d9e24f64 --- /dev/null +++ b/GZJ/Script/Blueprint/AI/BTT_SkillCount.lua @@ -0,0 +1,25 @@ +---@class BTT_SkillCount_C:BTTask_LuaBase +---@field PlaySkillIndex int32 +---@field SkillType TEnumAsByte +--Edit Below-- +local BTT_SkillCount = {} + +-- entry point, task will stay active until FinishExecute is called +function BTT_SkillCount:ReceiveExecuteAI(OwnerController, ControlledPawn) + if ControlledPawn == nil then + self:FinishExecute(true) + return + end + local SkillManager = ControlledPawn:GetSkillManagerComponent() + if SkillManager ~= nil then + SkillManager:TriggerEvent(self.PlaySkillIndex, self.SkillType) + end + if ControlledPawn.UpdateSkillCount ~= nil then + ControlledPawn:UpdateSkillCount() + end + + self:FinishExecute(true) +end + + +return BTT_SkillCount \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Item/BP_ItemActorBase.lua b/GZJ/Script/Blueprint/Item/BP_ItemActorBase.lua new file mode 100644 index 00000000..39a9b50e --- /dev/null +++ b/GZJ/Script/Blueprint/Item/BP_ItemActorBase.lua @@ -0,0 +1,178 @@ +---@class BP_ItemActorBase_C:AActor +---@field WidgetComponent UWidgetComponent +---@field ParticleSystem UParticleSystemComponent +---@field StaticMesh UStaticMeshComponent +---@field Sphere USphereComponent +---@field QualityFX TArray +--Edit Below-- +local BP_ItemActorBase = { + ItemData = {}, + -- 尝试放在一起 + IdAndCount = "", + ThisID = -1, + bHasInit = false, + bIsPicking = false; + + bCanBeAutoPickup = true, + DiscardPlayerKey = -1, +}; + +function BP_ItemActorBase:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); + self.bHasInit = true + + if self:HasAuthority() then + local TheData = self.IdAndCount + self.IdAndCount = TheData .. ";" + end +end + +function BP_ItemActorBase:SetIsPicking(InPick) + self.bIsPicking = InPick +end + +function BP_ItemActorBase:GetReplicatedProperties() + return + "ItemData", "ThisID", "IdAndCount", "bCanBeAutoPickup", "DiscardPlayerKey" +end + +function BP_ItemActorBase:IsAutoPickupDisabled(PlayerKey) + return PlayerKey == self.DiscardPlayerKey and self.bCanBeAutoPickup == false +end + +function BP_ItemActorBase:SetAutoPickupDisabled(PlayerKey) + self.DiscardPlayerKey = PlayerKey + self.bCanBeAutoPickup = false + + if self.AutoPickupHandle == nil then + self.AutoPickupHandle = EventSystem.SetTimer(self, function() + self.bCanBeAutoPickup = true + end, 10.0) + end +end + +function BP_ItemActorBase:SetItemValue() + local TheId = self:GetItemID() + if type(TheId) == "nil" then + print(string.format('[BP_ItemActorBase:SetItemValue] 没找到 Id: type ' .. type(TheId))) + return + elseif type(TheId) == "number" then + -- print(string.format('[BP_ItemActorBase:SetItemValue] 找到了 ' .. tostring(TheId))) + if UE.IsValid(self.WidgetComponent) and UE.IsValid(self.WidgetComponent.Widget) then + local bSuccess = self.WidgetComponent.Widget:SetItemData(TheId) + if not bSuccess then + self.WidgetComponent.Widget:SetVisibility(ESlateVisibility.Collapsed) + end + end + self:SpawnEffect(TheId, GetItemTypeByItemId(TheId), GetItemWeaponTypeByItemId(TheId)) + end +end + +function BP_ItemActorBase:OnRep_IdAndCount() + -- 解析该字符串 + -- print("[BP_ItemActorBase:OnRep_IdAndCount] 开始执行") + -- 添加到所有的 Player Controller 中 + local Controller = GameDataManager.GetLocalPlayerController() + table.insert(Controller.AllItemActors[ETeleportType.InArena], self) + + self:SetItemValue() +end + +function BP_ItemActorBase:OnRep_ItemData() + if not self.bHasInit then + return + end + --local val = IsWeaponPartItem(self:GetItemID() ) + print("[BP_ItemActorBase:OnRep_ItemData] 开始执行") + if type(self.ItemData) == "table" then + for i = 1, #self.ItemData do + print(self.ItemData[i]) + end + end + print("[BP_ItemActorBase:OnRep_ItemData] 结束执行") + -- 获取 ItemType + local ItemId = self.ItemData[1] + if ItemId == nil then + return + end + -- 显示出来 + self.WidgetComponent.Widget:SetItemData(ItemId) + self.WidgetComponent.Widget:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self:SpawnEffect(ItemId, GetItemTypeByItemId(ItemId), GetItemWeaponTypeByItemId(ItemId)) +end + +function BP_ItemActorBase:SpawnEffect(InId, InItemType, InWeaponClassType) + local MeshPath = nil + local val = (InId // 10000) == EDropItemSet.WeaponParts + 1 + if not val then + MeshPath = GameDataManager.GetItemMeshPathByItemType(InItemType) + else + MeshPath = GameDataManager.GetItemMeshPathByItemType(InItemType, InWeaponClassType) + end + + AsyncLoadTools:LoadObjectBySoftPath(MeshPath, + function(Asset) + if UE.IsValid(self) and UE.IsValid(self.StaticMesh) then + self.StaticMesh:SetStaticMesh(Asset) + end + end) + + local FXPath = self.QualityFX[self:GetItemQuality()] + if FXPath then + AsyncLoadTools:LoadObjectBySoftPath(FXPath, + function(Asset) + if UE.IsValid(self) and UE.IsValid(self.ParticleSystem) then + self.ParticleSystem:SetHiddenInGame(false, false) + self.ParticleSystem:SetTemplate(Asset) + end + end) + else + if self.ParticleSystem then + self.ParticleSystem:SetHiddenInGame(true, false) + end + end +end + +function BP_ItemActorBase:SetThisID(InThisID) + self.ThisID = InThisID +end + +-- C +function BP_ItemActorBase:SetItemData(InData) + self.IdAndCount = string.format("%d;%d", InData.ItemID, InData.Count) + self.ItemData = InData + self:SetItemValue() +end + +function BP_ItemActorBase:SetPickItemData(InStr) + -- print(string.format("[BP_ItemActorBase:SetItemData] 测试一下数据类型:%s,具体数值:%s", type(InStr), InStr)) + self.IdAndCount = InStr + self:OnRep_IdAndCount() +end + +function BP_ItemActorBase:GetItemID() + local Arr = string.splitToNumber(self.IdAndCount, ";") + return Arr[1] +end + +function BP_ItemActorBase:GetItemCount() + local Arr = string.splitToNumber(self.IdAndCount, ";") + -- print(string.format("[BP_ItemActorBase:GetItemID] 此时 Count = %d", Arr[2])) + return Arr[2] +end + +function BP_ItemActorBase:GetThisID() + return self.ThisID +end + +function BP_ItemActorBase:GetItemQuality() + return self:GetItemID() % 100 // 10 +end + +--[[ +function BP_ItemActorBase:GetAvailableServerRPCs() + return +end +--]] + +return BP_ItemActorBase; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_ActiveMonsterBase.lua b/GZJ/Script/Blueprint/Monster/BP_ActiveMonsterBase.lua new file mode 100644 index 00000000..416e7416 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_ActiveMonsterBase.lua @@ -0,0 +1,107 @@ +---@class BP_ActiveMonsterBase_C:BP_MonsterBase_C +---@field DetailWidget UWidgetComponent +---@field WidgetComponent UWidgetComponent +--Edit Below-- + +local MonsterBase = require('Script.Blueprint.Monster.BP_MonsterBase') +local BP_ActiveMonsterBase = setmetatable( + { + --IsSelfDead = false; + HasBegunPlay = false, + KilledPlayerNum = 0, + }, + { + __index = MonsterBase, + __metatable = MonsterBase + } +) + +BP_ActiveMonsterBase.MonsterWidgetIndex = 0; +BP_ActiveMonsterBase.TalkWidgetTimer = nil; +BP_ActiveMonsterBase.bHasInit = false; + +function BP_ActiveMonsterBase:ReceiveBeginPlayEx() + if self:HasAuthority() == false then + print(string.format("[BP_ActiveMonsterBase:ReceiveBeginPlayEx] 执行")) + local Loc = { X = 0, Y = 0, Z = self.CapsuleComponent:GetScaledCapsuleHalfHeight() + 20 } + self.WidgetComponent:K2_SetRelativeLocation(Loc) + self.WidgetComponent:SetHiddenInGame(false) + if UE.IsValid(self.WidgetComponent.Widget) then + self.WidgetComponent.Widget:SetVisibility(ESlateVisibility.SelfHitTestInvisible); + else + self:NewHealthWidget(); + end + + -- 设置仅显示在自己玩家的客户端 + local WidgetPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_ActiveMonsterTalk.WBP_ActiveMonsterTalk_C') + local DetailsLoc = { X = 0, Y = 0, Z = self.CapsuleComponent:GetScaledCapsuleHalfHeight() + 50 } + self.MonsterWidgetIndex = UGCWidgetManagerSystem.AddObjectPositionUI(self, WidgetPath, DetailsLoc, true, true, true) + self.TalkWidgetTimer = EventSystem.SetTimerLoop(self, function() + local Widget = UGCWidgetManagerSystem.GetObjectPositionUI(self, self.MonsterWidgetIndex); + if UE.IsValid(Widget) then + Widget:SetTalkText(self:GetMonsterType()); + EventSystem.StopTimer(self.TalkWidgetTimer) + EventSystem.SetTimer(self, function() + UGCWidgetManagerSystem.RemoveObjectPositionUI(self, self.MonsterWidgetIndex); + end, 3.0) + end + end, 0.3) + self.bHasInit = true + else + UnrealNetwork.CallUnrealRPC_Multicast(self, "Multi_BeginPlay") + end +end + +function BP_ActiveMonsterBase:Multi_BeginPlay() + if not self.bHasInit then + self:ReceiveBeginPlayEx() + end +end + +function BP_ActiveMonsterBase:ClientOnHealthChangedEx(CurrentHP, MaxHP) + UE.Log("[BP_ActiveMonsterBase:ClientOnHealthChangedEx] %s: CurHealth=%.2f, MaxHealth=%.2f", + KismetSystemLibrary.GetObjectName(self), CurrentHP, MaxHP) + if not UE.IsValid(self.WidgetComponent.Widget) then + -- 创建一个 Widget,然后添加进去 + self:NewHealthWidget(); + end + self.WidgetComponent:SetVisibility(true) + self.WidgetComponent.Widget:UpdateOwnerHealth(CurrentHP, MaxHP) +end + +-- 创建一个 Widget +function BP_ActiveMonsterBase:NewHealthWidget() + print(string.format("[BP_ActiveMonsterBase:NewHealthWidget] 执行")) + local Widget = UserWidget.NewWidgetObjectBP(GameDataManager.GetLocalPlayerController(), + UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_BossHealth.WBP_BossHealth_C'))) + self.WidgetComponent:SetWidget(Widget) + Widget:SetVisibility(ESlateVisibility.SelfHitTestInvisible) +end + +function BP_ActiveMonsterBase:ReceiveEndPlayEx() + if not self:HasAuthority() then + self:Cleanup() + end +end + +function BP_ActiveMonsterBase:ReceiveOnMonsterDeath() + if not self:HasAuthority() then + self:Cleanup() + end +end + +function BP_ActiveMonsterBase:HideWidget() + if UE.IsValid(self.WidgetComponent.Widget) then + self.WidgetComponent.Widget:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function BP_ActiveMonsterBase:Cleanup() + self.WidgetComponent:SetHiddenInGame(true) + self:HideWidget(); + if UE.IsValid(self.TalkWidgetTimer) then + EventSystem.StopTimer(self.TalkWidgetTimer) + end +end + +return BP_ActiveMonsterBase; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_BossBoorish.lua b/GZJ/Script/Blueprint/Monster/BP_BossBoorish.lua new file mode 100644 index 00000000..b5f0e8ef --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_BossBoorish.lua @@ -0,0 +1,71 @@ +---@class BP_BossBoorish_C:BP_MonsterBoss_C +---@field P_Manshenjue_001 UParticleSystemComponent +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +-- local BP_BossBoorish = { +-- BasePhysicalDefense = 0; +-- +-- }; +local MonsterBoss = require('Script.Blueprint.Monster.BP_MonsterBoss') + +local BP_BossBoorish = setmetatable( + { + BasePhysicalDefense = 0; + ID = 10001; + MonsterName = "Boss", + StrengtheningSecretMethodSkillHandle = nil; + }, + { + __index = MonsterBoss, + __metatable = MonsterBoss + } +); + +function BP_BossBoorish:ReceiveBeginPlayEx() + MonsterBoss.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddStrengtheningSecretMethodSkill() + self:AddFlashKillSkill() + end +end + +function BP_BossBoorish:UpdateMonsterLevelEx(MonsterName, newLevel) + self:AddAdditionalDefense(self.BasePhysicalDefense * 3) +end + +function BP_BossBoorish:AddStrengtheningSecretMethodSkill() + EventSystem.SetTimerLoop( + self, + function () + self:AddAdditionalDefense(self.BasePhysicalDefense * 0.01) + end, + 1.0 + ) +end + +function BP_BossBoorish:AddFlashKillSkill() + self.StrengtheningSecretMethodSkillHandle = EventSystem.SetTimerLoop( + self, + function() + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlayFlashKill", true) + end, + 25.0 + ) +end + +function BP_BossBoorish:ReceiveOnMonsterDeath() + MonsterBoss.ReceiveOnMonsterDeath(self) + + if self:HasAuthority() then + if self.StrengtheningSecretMethodSkillHandle then + EventSystem.StopTimer(self.StrengtheningSecretMethodSkillHandle) + self.StrengtheningSecretMethodSkillHandle = nil + end + else + if UE.IsValid(self.P_Manshenjue_001) then + self.P_Manshenjue_001:SetVisibility(false) + end + end +end + +return BP_BossBoorish; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_BossCareful.lua b/GZJ/Script/Blueprint/Monster/BP_BossCareful.lua new file mode 100644 index 00000000..ded692b4 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_BossCareful.lua @@ -0,0 +1,126 @@ +---@class BP_BossCareful_C:BP_MonsterBoss_C +---@field UAESkillManager UUAESkillManagerComponent +---@field ShieldParticle UParticleSystemComponent +---@field UpgradingManaParticle UParticleSystem +--Edit Below-- +local MonsterBoss = require('Script.Blueprint.Monster.BP_MonsterBoss') + +local BP_BossCareful = setmetatable( + { + ID = 10005, + MonsterName = "Boss", + ShieldValue = 0, + }, + { + __index = MonsterBoss, + __metatable = MonsterBoss + } +); + + +function BP_BossCareful:ReceiveBeginPlayEx() + MonsterBoss.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + EventSystem:AddListener(EventType.PlayerPawnDead, BP_BossCareful.KilledPlayer, self) + self:AddSkillCarefulBloodShield() + self:AddSkillCarefulUpgradingMana() + end +end + +function BP_BossCareful:AddSkillCarefulBloodShield() + self.ShieldValue = UGCSimpleCharacterSystem.GetHealthMax(self) + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SetParticleVisibility", true) + + self:AddModifyDamageDelegationFun( + "SkillCarefulBloodShield", + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + local WeaponType = GameDataManager.GetWeaponType(DamageCauser.WeaponActor.CurrentWeaponId) + if WeaponType == nil then + UE.Log("[BP_BossCareful:AddSkillCarefulBloodShield] Can't GetWeaponType, Data is nil") + return 0 + end + if self.ShieldValue > 0 and WeaponType ~= EWeaponClassType.WT_MachineGun then + self.ShieldValue = self.ShieldValue - DamageAmount + if self.ShieldValue > 0 then + return 0 + else + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SetParticleVisibility", false) + return -self.ShieldValue + end + else + return DamageAmount + end + end + ) + + EventSystem.SetTimer( + self, + function () + local NowHealth = UGCSimpleCharacterSystem.GetHealth(self) + if self.BaseHealthMax ~= NowHealth then return end + + self.AddHealthHandle = EventSystem.SetTimerLoop( + self, + function() + local NowHealth = UGCSimpleCharacterSystem.GetHealth(self) + local NowHealthMax = UGCSimpleCharacterSystem.GetHealthMax(self) + if NowHealthMax * 0.8 > NowHealth or (NowHealthMax / self.BaseHealthMax >= 1.5) then + EventSystem.StopTimer(self.AddHealthHandle) + self.AddHealthHandle = nil + return + end + UGCSimpleCharacterSystem.SetHealthMax(self, NowHealthMax + self.BaseHealthMax * 0.01) + UGCSimpleCharacterSystem.SetHealth(self, NowHealth + self.BaseHealthMax * 0.01) + end, + 1 + ) + end, + 10 + ) +end + +function BP_BossCareful:AddSkillCarefulUpgradingMana() + EventSystem.SetTimer( + self, + function () + self.AddAttackHandle = EventSystem.SetTimerLoop( + self, + function() + if self.bIsDead then + EventSystem.StopTimer(self.AddAttackHandle) + self.AddAttackHandle = nil + return + end + self:AddAdditionalAttack(self.AttackValue * 0.02) + + end, + 1 + ) + end, + 10 + ) +end + +function BP_BossCareful:MulticastRPC_SetParticleVisibility(IsShow) + self.ShieldParticle:SetVisibility(IsShow) +end + +function BP_BossCareful:MulticastRPC_SpawnParticleSystemAttach() + local TempParticleComponent = GameplayStatics.SpawnEmitterAttached(self.UpgradingManaParticle, self.Mesh, "", Vector.New(30.0, 0, 10), VectorHelper.RotZero(), Vector.New(2, 2, 2), EAttachLocation.SnapToTarget, true) + EventSystem.SetTimer( + self, + function () + TempParticleComponent:K2_DestroyComponent(self) + end, + 1.5 + ) +end + +function BP_BossCareful:KilledPlayer(DeadPlayerKey, Killer) + if Killer == self then + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnParticleSystemAttach") + self:SetAttackScale(self.AttackScale + 0.2) + end +end + +return BP_BossCareful; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_BossCharm.lua b/GZJ/Script/Blueprint/Monster/BP_BossCharm.lua new file mode 100644 index 00000000..ee4cc947 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_BossCharm.lua @@ -0,0 +1,253 @@ +---@class BP_BossCharm_C:BP_MonsterBoss_C +---@field UAESkillManager UUAESkillManagerComponent +---@field CharmMarshParticle UParticleSystem +---@field CharmCurseParticle UParticleSystem +--Edit Below-- +-- local BP_BossCharm = { +-- SkillCount = 0, +-- CharmCurseSkilling = false, +-- PawnClass = nil, +-- PawnLocations = {}, +-- SurvivalTime = 0. +-- }; + +local MonsterBoss = require('Script.Blueprint.Monster.BP_MonsterBoss') + +local BP_BossCharm = setmetatable( + { + --SkillCount = 0, + CharmCurseSkilling = false, + PawnClass = nil, + PawnLocations = {}, + SurvivalTime = 0., + AttachPawnParticle = {}, + ID = 10002, + MonsterName = "Boss", + EnableCharmMarshSkill = false, + }, + { + __index = MonsterBoss, + __metatable = MonsterBoss + } +); +function BP_BossCharm:ReceiveBeginPlayEx() + MonsterBoss.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlayCharmMarshSkill", false) + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlayCharmCurseSkill", false) + self:AddModifyDamageDelegationFun("EnableCharmMarshSkill", + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + EventSystem.SetTimer( + self, + function() + self.EnableCharmMarshSkill = true + end, + 10 + ) + self:RemoveModifyDamageDelegation("EnableCharmMarshSkill") + return DamageAmount + end + ) + end +end + + +function BP_BossCharm:ReceiveTickEx(DeltaTime) + MonsterBoss.ReceiveTickEx(self, DeltaTime); + + if self:HasAuthority() then + self.SurvivalTime = self.SurvivalTime + DeltaTime + if self.SurvivalTime >= 8 and not self.bIsDead then + if self.EnableCharmMarshSkill then + self.SurvivalTime = 0 + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlayCharmMarshSkill", true) + end + end + end +end + +function BP_BossCharm:GetPawnClass() + if not self.PawnClass then + self.PawnClass = UE.LoadClass(BPClassPath.PlayerPawn) + end + return self.PawnClass +end + +function BP_BossCharm:UpdateSkillCount() + if self:HasAuthority() then + self.SkillCount = self.SkillCount + 1 + self:PlayCharmCurseSkill() + print("BP_BossCharm_UpdateSkillCount") + end +end + +function BP_BossCharm:PlayCharmCurseSkill() + if self.SkillCount >= 5 then + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlayCharmCurseSkill", true) + end +end + +function BP_BossCharm:PlayCharmCurseSkillExe() + self.SkillCount = 0 + self.PawnsMaxWalkSpeed = {} + -- local InArenaPawns = UGCGameState:GetPlayersInArena() + local InArenaPawns = UGCGameSystem.GameState:GetPlayersInArena() + local InArenaPlayerKey = {} + for k, ArenaPawn in pairs(InArenaPawns) do + if ArenaPawn.bCanBeControlledByMonsters then + table.insert(InArenaPlayerKey, UGCPawnAttrSystem.GetPlayerKey(ArenaPawn)) + end + end + + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnParticleSystemAttach", InArenaPlayerKey) + + + local TargetPawns = InArenaPawns + -- local TargetPawns = GameplayStatics.GetAllActorsOfClass(self, self:GetPawnClass(), {}) + + for k, PawnTarget in pairs(TargetPawns) do + if UE.IsValid(PawnTarget) and PawnTarget.bCanBeControlledByMonsters then + UGCPawnAttrSystem.SetSpeedScale(PawnTarget, 0) + end + end + -- 广播到玩家身上绑定粒子 + self.CharmCurseSkilling = true + + EventSystem.SetTimer(self, + function () + self.CharmCurseSkilling = false + -- local TargetPawns = GameplayStatics.GetAllActorsOfClass(self, self:GetPawnClass(), {}) + for k, PawnTarget in pairs(TargetPawns) do + if UE.IsValid(PawnTarget) then + UGCPawnAttrSystem.SetSpeedScale(PawnTarget, 1) + end + end + end, + 2.0 + ) +end + +-- 获取半径范围内的Actor +function BP_BossCharm:GetSphereActors(CenterPosition,radius, TargetClass) + local TargetActors = GameplayStatics.GetAllActorsOfClass(self, TargetClass, {}) + local resActors = {} + for k, TempActor in pairs(TargetActors) do + if VectorHelper.GetDistance(TempActor:K2_GetActorLocation(), CenterPosition) <= radius then + table.insert(resActors, TempActor) + end + end + return resActors +end + +function BP_BossCharm:PlayCharmMarshSkillExe() + local TargetPawns = UGCGameSystem.GameState:GetPlayersInArena() + self.PawnLocations = {} + for k, PawnTarget in pairs(TargetPawns) do + + local TempLocal = PawnTarget:K2_GetActorLocation() + local DropLocation = UGCGameSystem.GameState:GetDropLocation(TempLocal) + DropLocation.Z = DropLocation.Z + 5 + table.insert(self.PawnLocations, DropLocation) + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnParticleSystem", VectorHelper.ToLuaTable(DropLocation)) + + end + + + EventSystem.SetTimer( + self, + function () + local InArenaPawns = UGCGameSystem.GameState:GetPlayersInArena() + for k, TempLocation in pairs(self.PawnLocations) do + for i, TempPawn in pairs(InArenaPawns) do + + if VectorHelper.GetDistance(TempPawn:K2_GetActorLocation(), TempLocation) < 250 then + if self.CharmCurseSkilling then + self:MonsterApplyDamage(TempPawn, self:GetAttack() * 10) + else + self:MonsterApplyDamage(TempPawn, self:GetAttack() * 5) + end + end + end + end + end, + 2.0 + ) +end + +-- 客户端生成一个TempLocation的粒子 +function BP_BossCharm:MulticastRPC_SpawnParticleSystem(TempLocation) + if TempLocation then + GameplayStatics.SpawnEmitterAtLocation(self, self.CharmMarshParticle, TempLocation, Rotator.New(0, 0, 0), Vector.New(1, 1, 1), true) + else + print("MulticastRPC_SpawnParticleSystem_Fun Position is nil type: " .. type(TempLocation)) + end +end +function BP_BossCharm:MulticastRPC_SpawnParticleSystemAttach(InArenaPlayerKeys) + + if not InArenaPlayerKeys then + print("MulticastRPC_SpawnParticleSystem_Fun InArenaPlayerKeys is nil") + return + end + + local TargetPawns = {} + for k, Playerkey in pairs(InArenaPlayerKeys) do + table.insert(TargetPawns, ScriptGameplayStatics.GetPlayerPawnByPlayerKey(self,Playerkey)) + end + + + if TargetPawns then + for k, TargetPawn in pairs(TargetPawns) do + if TargetPawn.Mesh and self.CharmCurseParticle then + local TempParticleComponent = GameplayStatics.SpawnEmitterAttached(self.CharmCurseParticle, TargetPawn.Mesh, "", Vector.New(0, 0, 50), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, true) + if TempParticleComponent then + table.insert(self.AttachPawnParticle, TempParticleComponent) + else + print("MulticastRPC_SpawnParticleSystem_Fun Position Adding TempParticleComponent is nil" ) + end + else + print("MulticastRPC_SpawnParticleSystem_Fun Position Adding Failure" ) + end + end + local WeakSelf + EventSystem.SetTimer( + self, + function () + + if self.AttachPawnParticle then + for k, particleCom in pairs(self.AttachPawnParticle) do + particleCom:K2_DestroyComponent(self) + end + self.AttachPawnParticle = {} + end + end, + 2.0 + ) + else + print("MulticastRPC_SpawnParticleSystem_Fun Position is nil type: " .. type(TempLocation)) + end +end + +function BP_BossCharm:MulticastRPC_DestroyParticleSystem() + if self.AttachPawnParticle then + for k, particleCom in pairs(self.AttachPawnParticle) do + particleCom:K2_DestroyComponent(self) + end + self.AttachPawnParticle = {} + end +end + +function BP_BossCharm:ReceiveOnMonsterDeath() + MonsterBoss.ReceiveOnMonsterDeath(self) + + if self:HasAuthority() then + if self.ReignSkillHandle then EventSystem.StopTimer(self.ReignSkillHandle) self.ReignSkillHandle = nil return end + else + if self.AttachPawnParticle then + for k, particleCom in pairs(self.AttachPawnParticle) do + particleCom:K2_DestroyComponent(self) + end + self.AttachPawnParticle = {} + end + end +end +return BP_BossCharm; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_BossMagical.lua b/GZJ/Script/Blueprint/Monster/BP_BossMagical.lua new file mode 100644 index 00000000..9f2bb9cd --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_BossMagical.lua @@ -0,0 +1,257 @@ +---@class BP_BossMagical_C:BP_MonsterBoss_C +---@field UAESkillManager UUAESkillManagerComponent +---@field bIsReplica bool +---@field ReplicaParticle UParticleSystem +--Edit Below-- +local MonsterBoss = require('Script.Blueprint.Monster.BP_MonsterBoss') + +local BP_BossMagical = setmetatable( + { + PawnClass = nil, + ID = 10006, + MonsterName = "Boss", + Replicas = {}, + ReplicaNum = 4, + Parent = nil, + -- ReplicaClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossMagical_Replica.BP_BossMagical_Replica_C'), + ReplicaClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossMagical.BP_BossMagical_C') + }, + { + __index = MonsterBoss, + __metatable = MonsterBoss + } +); + +function BP_BossMagical:ReceiveBeginPlayEx() + MonsterBoss.ReceiveBeginPlayEx(self) + if self:HasAuthority()then + EventSystem.SetTimer(self, + function () + UE.Log("[BP_BossMagical_ReceiveBeginPlay] bIsReplica: %s", tostring(self.bIsReplica)) + if self.bIsReplica == false then + EventSystem.SetTimer( + self, + function () + -- body + self:AddSkillMagicalReplica() + end, + 3. + ) + self:AddSkillAssassinate() + else + if UE.IsValid(self.Parent) == false then + UnrealNetwork.CallUnrealRPC_Multicast(self, "Multicast_RemoveWidget") + self:K2_DestroyActor() + end + end + end, + 0.1 + ) + end +end + +function BP_BossMagical:Multicast_InitReplica() + + local HealthWidget = self.HealthWidget.Widget + if HealthWidget then + if HealthWidget.HPProgressBar then + HealthWidget.HPProgressBar:SetFillColorAndOpacity({R = 0, G = 0, B = 1, A = 1}) + else + UE.Log("[BP_BossMagical_InitReplica] HPProgressBar is nil") + end + else + UE.Log("[BP_BossMagical_InitReplica] HealthWidget is nil") + end +end + +function BP_BossMagical:ReceiveEndPlayEx() + MonsterBoss.ReceiveEndPlayEx(self) + if self:HasAuthority()then + else + self:Multicast_RemoveWidget() + end +end + +function BP_BossMagical:Multicast_RemoveWidget() + local HealthWidget = self.HealthWidget.Widget + UE.Log("BP_BossMagical_ReceiveEndPlay HealthWidget is %s", tostring(HealthWidget ~= nil)) + if HealthWidget then + HealthWidget:SetVisibility(ESlateVisibility.Collapsed) + HealthWidget:RemoveFromParent() + end +end + +function BP_BossMagical:GetAvailableServerRPCs() + return + "Multicast_SetActorTransform" +end + +function BP_BossMagical:Multicast_SetActorTransform(Position, Rotator) + log_tree("Multicast_SetActorTransform_Position = ", Position) + log_tree("Multicast_SetActorTransform_Rotator = ", Rotator) + self:K2_SetActorLocation(Position) + self:K2_SetActorRotation(Rotator) +end + +function BP_BossMagical:GetReplicaClass() + if self.ReplicaClass == nil then self.ReplicaClass = UE.LoadClass(self.ReplicaClassPath) end + return self.ReplicaClass +end + +function BP_BossMagical:InitReplica(level, Parent) + if level == nil then level = 1 end + self.Parent = Parent + if self:HasAuthority() and self.bIsReplica then + self:UpdateMonsterLevel(self.MonsterName, level) + UnrealNetwork.CallUnrealRPC_Multicast(self, "Multicast_InitReplica") + end +end + +function BP_BossMagical:AddSkillMagicalReplica() + self.SkillMagicalReplicaHandle = EventSystem.SetTimerLoop( + self, + function () + self:ResetReplicas() + end, + 30. + ) +end + +function BP_BossMagical:ResetReplicas() + local Crystal = UGCGameSystem.GameState:GetCrystal() + if UE.IsValid(Crystal) then + local CenterPosition = Crystal:K2_GetActorLocation() + local Eightpoint = self:GetEightpoint(500) + for i = 1, self.ReplicaNum do + if UE.IsValid(self.Replicas[i]) then + self.Replicas[i]:InitReplica(self.BossLevel, self) + else + local Targetposition = VectorHelper.Add(CenterPosition, Eightpoint[i]) + CenterPosition.Z = self:K2_GetActorLocation().Z + Targetposition.Z = self:K2_GetActorLocation().Z + local TargetRotator = KismetMathLibrary.FindLookAtRotation(Targetposition, CenterPosition) + local Replica = UGCGameSystem.SpawnActor(UGCGameSystem.GameState, self:GetReplicaClass(), Targetposition, TargetRotator, VectorHelper.ScaleOne(), nil) + self.Replicas[i] = Replica + Replica.bIsReplica = true + Replica:InitReplica(self.BossLevel, self) + UE.Log("[BP_BossMagical_ResetReplicas] SpawnFinish %d", i) + end + end + end +end + +function BP_BossMagical:AddSkillAssassinate() + self.SkillAssassinateHandle = EventSystem.SetTimerLoop( + self, + function () + local TargetPositions = self:GetMovablePosition() + table.Rand(TargetPositions) + local MoveIndex = 1 + for k, v in pairs(self.Replicas) do + if TargetPositions[MoveIndex] == nil then break end + if UE.IsValid(v) then + self:PlayAssassinate(v, TargetPositions[MoveIndex].Location, TargetPositions[MoveIndex].Rotation) + MoveIndex = MoveIndex + 1 + end + end + if TargetPositions[MoveIndex] then + self:PlayAssassinate(self, TargetPositions[MoveIndex].Location, TargetPositions[MoveIndex].Rotation) + end + end, + 20. + ) +end + +function BP_BossMagical:PlayAssassinate(TargetBossMagical, Location, Rotation) + -- body + TargetBossMagical:GetController():GetBlackboardComponent():SetValueAsBool("CanPlaySkillAssassinate", true) + TargetBossMagical:K2_SetActorLocation(Location) + TargetBossMagical:K2_SetActorRotation(Rotation) + UnrealNetwork.CallUnrealRPC_Multicast(self, "Multicast_SetActorTransform", Location, Rotation) + + EventSystem.SetTimer(TargetBossMagical, + function () + -- body + if UE.IsValid(TargetBossMagical) and UE.IsValid(TargetBossMagical:GetController()) then + TargetBossMagical:GetController():GetBlackboardComponent():SetValueAsBool("CanPlaySkillAssassinate", false) + end + end, + 2 + ) +end + +function BP_BossMagical:GetEightpoint(Length) + local Angle45Len = math.sqrt(2) / 2 + return { + Vector.New(Length, 0, 0), + Vector.New(-Length, 0, 0), + Vector.New(0, Length, 0), + Vector.New(0, -Length, 0), + Vector.New( Length * Angle45Len, Length * Angle45Len, 0), + Vector.New(-Length * Angle45Len, Length * Angle45Len, 0), + Vector.New( Length * Angle45Len, -Length * Angle45Len, 0), + Vector.New(-Length * Angle45Len, -Length * Angle45Len, 0) + } +end + +function BP_BossMagical:GetMovablePosition() + local ArenaPlayers = UGCGameSystem.GameState:GetPlayersInArena() + local ResTransform = {} + if not table.isEmpty(ArenaPlayers) then + for _, ArenaPlayer in pairs(ArenaPlayers) do + local PawnHelfHeight = ArenaPlayer.CapsuleComponent.CapsuleHalfHeight + local Playerlocation = ArenaPlayer:K2_GetActorLocation() + Playerlocation.Z = Playerlocation.Z + self.Capsule.CapsuleHalfHeight - PawnHelfHeight + 5 + + local EightLocation = self:GetEightpoint(350) + for k, AddLocation in pairs(EightLocation) do + local Beginlocation = VectorHelper.Add(Playerlocation, AddLocation) + local ObjectTypes = {EObjectTypeQuery.ObjectTypeQuery1} + local bHit, _ = KismetSystemLibrary.CapsuleTraceSingleForObjects( + self, Beginlocation, Beginlocation, + self.Capsule.CapsuleRadius, self.Capsule.CapsuleHalfHeight, + ObjectTypes, false, nil, EDrawDebugTrace.None, + nil, true, nil, nil, 20 + ) + + if not bHit then + -- 判断该位置是否存在地面 + local DropLocation = UGCGameSystem.GameState:GetDropLocation(Beginlocation) + if VectorHelper.GetDistance(DropLocation, Beginlocation) > 10 then + Playerlocation.Z = Beginlocation.Z + local TargetRotator = KismetMathLibrary.FindLookAtRotation(Beginlocation, Playerlocation) + table.insert(ResTransform, {Location = VectorHelper.ToLuaTable(Beginlocation), Rotation = VectorHelper.RotToLuaTable(TargetRotator)}) + end + end + end + end + + end + + return ResTransform +end + + + +function BP_BossMagical:ReceiveOnMonsterDeath() + MonsterBoss.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + -- 本体死亡则销毁分身 + if self.bIsReplica == false then + if self.SkillAssassinateHandle then + EventSystem.StopTimer(self.SkillAssassinateHandle) + self.SkillAssassinateHandle = nil + end + if self.SkillMagicalReplicaHandle then + EventSystem.StopTimer(self.SkillMagicalReplicaHandle) + self.SkillMagicalReplicaHandle = nil + end + for k, v in pairs(self.Replicas) do + UnrealNetwork.CallUnrealRPC_Multicast(v, "Multicast_RemoveWidget") + if UE.IsValid(v) then v:K2_DestroyActor() end + end + end + end +end + +return BP_BossMagical; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_BossMoment.lua b/GZJ/Script/Blueprint/Monster/BP_BossMoment.lua new file mode 100644 index 00000000..941d30b1 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_BossMoment.lua @@ -0,0 +1,166 @@ +---@class BP_BossMoment_C:BP_MonsterBoss_C +---@field UAESkillManager UUAESkillManagerComponent +---@field Sphere USphereComponent +---@field ParticleSystem_StormWind UParticleSystemComponent +--Edit Below-- +-- local BP_BossMoment = { +-- IsSkillStormWindEnable = false, +-- PawnClass = nil, +-- StormWindHurtHandle = nil +-- } + +local MonsterBoss = require('Script.Blueprint.Monster.BP_MonsterBoss') + +local BP_BossMoment = setmetatable( + { + IsSkillStormWindEnable = false, + PawnClass = nil, + StormWindHurtHandle = nil, + ID = 10003, + MonsterName = "Boss", + ReductionOfSpeedPlayers = {}, + SkillStormWindDelay = 20, + LastSkillStormWindTime = 0, + }, + { + __index = MonsterBoss, + __metatable = MonsterBoss + } +); + +function BP_BossMoment:ReceiveBeginPlayEx() + MonsterBoss.ReceiveBeginPlayEx(self) +end + +function BP_BossMoment:UpdateMonsterLevelEx(MonsterName, newLevel) + self:AddSkillStormKill() +end + +function BP_BossMoment:ReceiveTickEx(DeltaTime) + MonsterBoss.ReceiveTickEx(self, DeltaTime); + if self:HasAuthority() then + self.LastSkillStormWindTime = self.LastSkillStormWindTime + DeltaTime + if self.LastSkillStormWindTime >= self.SkillStormWindDelay then + if UE.IsValid(self:GetController()) and UE.IsValid(self:GetController():GetBlackboardComponent()) then + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlayStormWind", true) + self.LastSkillStormWindTime = 0 + end + end + end +end + +--[[ +function BP_BossMoment:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_BossMoment:GetAvailableServerRPCs() + return +end +--]] + + + +-- function BP_BossMoment:AddSkillStormWind() +-- EventSystem.SetTimerLoop(self, +-- function() +-- self:EnableStormWind() +-- end, +-- 20.0 +-- ) +-- end +function BP_BossMoment:AddSkillStormKill() + UGCSimpleCharacterSystem.SetSpeedScale(self, (self.BaseMaxWalkSpeed + 180)/ 600) + self:AddAdditionalAttack(self.BaseAttackValue * 2) +end + +function BP_BossMoment:SetOverlapPlayerScaleSpeed() + if not self.IsSkillStormWindEnable then return end + + local OverlappingActors = self:GetSphereActors(self:K2_GetActorLocation(), 200, self:GetPawnClass()) + local AllPlayer = GameplayStatics.GetAllActorsOfClass(self, self:GetPawnClass(), {}) + if AllPlayer then + for _,Player in pairs(AllPlayer) do + if table.hasValue(OverlappingActors, Player) and not table.hasValue(self.ReductionOfSpeedPlayers, Player) then + UGCPawnAttrSystem.SetSpeedScale(Player, 0.6) + table.insert(self.ReductionOfSpeedPlayers, Player) + elseif not table.hasValue(OverlappingActors, Player) and table.hasValue(self.ReductionOfSpeedPlayers, Player) then + UGCPawnAttrSystem.SetSpeedScale(Player, 1) + table.removeValue(self.ReductionOfSpeedPlayers, Player) + end + end + end + +end + +function BP_BossMoment:EnableStormWind() + print("BP_BossMoment_Fun_" .. "EnableStormWind_" .. KismetSystemLibrary.GetGameTimeInSeconds(self)) + + self.IsSkillStormWindEnable = true + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SetParticleVisibility", true); + self:GetController():GetBlackboardComponent():SetValueAsBool("IsSkillStormWindEnable", true) + if self:GetPawnClass() then + self.StormWindHurtHandle = EventSystem.SetTimerLoop( + self, + function () + local OverlappingActors = self:GetSphereActors(self:K2_GetActorLocation(), 200, self:GetPawnClass()) + for k, TargetPawn in pairs(OverlappingActors) do + self:MonsterApplyDamage(TargetPawn, self:GetAttack()) + self:SetOverlapPlayerScaleSpeed() + end + end, + 0.2 + ) + + self.DisableStormWindHurtHandle = EventSystem.SetTimer(self, + function() + self:DisableStormWind() + self.DisableStormWindHurtHandle = nil + end, + 5.0 + ) + end +end + +function BP_BossMoment:DisableStormWind() + print("BP_BossMoment_Fun_" .. "DisableStormWind_" .. KismetSystemLibrary.GetGameTimeInSeconds(self)) + + self.IsSkillStormWindEnable = false + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SetParticleVisibility", false) + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlayStormWind", false) + self:GetController():GetBlackboardComponent():SetValueAsBool("IsSkillStormWindEnable", false) + + if self.PawnClass then + for k, TargetPawn in pairs(self.ReductionOfSpeedPlayers) do + if TargetPawn ~= self then + UGCPawnAttrSystem.SetSpeedScale(TargetPawn, 1) + end + end + self.ReductionOfSpeedPlayers = {} + if self.StormWindHurtHandle then + EventSystem.StopTimer(self.StormWindHurtHandle) + self.StormWindHurtHandle = nil + end + end +end + +function BP_BossMoment:ServerOnDeathEx(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + MonsterBoss.ServerOnDeathEx(self, DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + if DeadMonster == self then + if self.DisableStormWindHurtHandle then + EventSystem.StopTimer(self.DisableStormWindHurtHandle) + self.DisableStormWindHurtHandle = nil + end + if self.StormWindHurtHandle then + self:DisableStormWind() + end + end +end + +function BP_BossMoment:MulticastRPC_SetParticleVisibility(NewVisibility) + if self:HasAuthority() then return end + self.ParticleSystem_StormWind:SetVisibility(NewVisibility) +end +return BP_BossMoment; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_BossSpring.lua b/GZJ/Script/Blueprint/Monster/BP_BossSpring.lua new file mode 100644 index 00000000..9e897930 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_BossSpring.lua @@ -0,0 +1,185 @@ +---@class BP_BossSpring_C:BP_MonsterBoss_C +---@field ParticleSystem UParticleSystemComponent +---@field UAESkillManager UUAESkillManagerComponent +---@field SpringThingsParticle UParticleSystem +--Edit Below-- +--local BP_BossSpring = {}; +local MonsterBoss = require('Script.Blueprint.Monster.BP_MonsterBoss') + +local BP_BossSpring = setmetatable( + { + SpringMagicCount = 0, + Damage_Multipler = 1, + RainMarshs = {}, + SpringThingsHandle = nil, + SurvivalTime = 0, + RainMarshsParticleInst = {}, + ID = 10004, + MonsterName = "Boss", + SpringThingsDelayTime = 20, + + }, + { + __index = MonsterBoss, + __metatable = MonsterBoss + } +); + +function BP_BossSpring:ReceiveBeginPlayEx() + MonsterBoss.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddSpringMagicSkill() + end +end + +function BP_BossSpring:ReceiveTick(DeltaTime) + print("BP_BossSpring_Fun" .. "ReceiveTick") + self.SuperClass.ReceiveTick(self, DeltaTime); + if self:HasAuthority() then + self.SurvivalTime = self.SurvivalTime + DeltaTime + if self.SurvivalTime >= self.SpringThingsDelayTime then + self.SurvivalTime = 0 + self:AddSpringThingsSkill() + end + self:TickExeSpringThingsSkill() + else + if (self.RainMarshsParticleInst) then + local RemoveParticle = {} + for TempParticle, Time in pairs( self.RainMarshsParticleInst) do + if KismetSystemLibrary.GetGameTimeInSeconds(self) - Time >= 1.5 then + table.insert(RemoveParticle,TempParticle) + end + end + for k, TempParticle in pairs( RemoveParticle ) do + TempParticle:K2_DestroyComponent(self) + self.RainMarshsParticleInst[TempParticle] = nil + end + end + end +end + +function BP_BossSpring:AddSpringMagicSkill() + print("BP_BossSpring_Fun" .. "AddSpringMagicSkill") + + EventSystem.SetTimerLoop( + self, + function () + self.SpringMagicCount = self.SpringMagicCount + 1 + local SelfHealth = UGCSimpleCharacterSystem.GetHealthMax(self) + self:AddHealth(SelfHealth * 0.06) + --UGCSimpleCharacterSystem.SetHealth(self, SelfHealth + SelfHealth * 0.06) + if self.SpringMagicCount >= 20 then + self.Damage_Multipler = 5 + end + end, + 1.0 + ) + return +end + +-------------------------------SpringThingsSkill----------------------------- +function BP_BossSpring:AddSpringThingsSkill() + if self:GetController() and self:GetController():GetBlackboardComponent() then + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlaySpringThingsSkill", true) + end +end + +function BP_BossSpring:SpringThingsSkillExe() + print("BP_BossSpring_Fun" .. "AddSpringThingsSkill") + + if self.SpringThingsHandle then + EventSystem.StopTimer(self.SpringThingsHandle) + end + self.SpringThingsHandle = EventSystem.SetTimerLoop( + self, + function () + local ArenaPlayers = UGCGameSystem.GameState:GetPlayersInArena() + if ArenaPlayers then + for k, TempPawn in pairs(ArenaPlayers) do + local TempRainMarsh = { + Time = KismetSystemLibrary.GetGameTimeInSeconds(self), + Location = TempPawn:K2_GetActorLocation() + } + + table.insert(self.RainMarshs, TempRainMarsh) + local TempLocal = TempPawn:K2_GetActorLocation() + local DropLocation = UGCGameSystem.GameState:GetDropLocation(TempLocal) + DropLocation.Z = DropLocation.Z + 5 + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnParticleSystem", VectorHelper.ToLuaTable(DropLocation)) + end + end + end, + 0.5 + ) + EventSystem.SetTimer( + self, + function () + if self.SpringThingsHandle then + EventSystem.StopTimer(self.SpringThingsHandle) + self.SpringThingsHandle = nil + end + end, + 5.0 + ) +end + + +function BP_BossSpring:TickExeSpringThingsSkill() + print("BP_BossSpring_Fun" .. "TickExeSpringThingsSkill") + + if self.RainMarshs then + local RemoveRainMarshList = {} + for TempRainMarsh, Local_Time in pairs(self.RainMarshs) do + if KismetSystemLibrary.GetGameTimeInSeconds(self) - Local_Time.Time >= 1 then + table.insert(RemoveRainMarshList,TempRainMarsh) + local TargetPawns = self:GetSphereActors(Local_Time.Location, 150, self:GetPawnClass()) + for k, TargetPawn in pairs(TargetPawns) do + self:MonsterApplyDamage(TargetPawn, UGCSimpleCharacterSystem.GetHealth(self) * self.Damage_Multipler) + end + end + end + if RemoveRainMarshList then + for k, v in pairs(RemoveRainMarshList) do + self.RainMarshs[v] = nil + end + end + end +end + +function BP_BossSpring:MulticastRPC_SpawnParticleSystem(TempLocation) + print("BP_BossSpring_Fun" .. "MulticastRPC_SpawnParticleSystem") + + if TempLocation then + local ObjectTypes = {EObjectTypeQuery.ObjectTypeQuery1} + local TempLocationEnd = Vector.New(TempLocation.X, TempLocation.Y, TempLocation.Z - 200) + local bHit, HitResult = KismetSystemLibrary.LineTraceSingleForObjects(self, TempLocation, TempLocationEnd, ObjectTypes, false, nil, EDrawDebugTrace.None, nil, true, nil, nil, nil) + print("LineTraceSingleForObjects is Hit" .. tostring(bHit)) + if (bHit) then + TempLocation.Z = HitResult.ImpactPoint.Z + 5 + else + TempLocation.Z = TempLocation.Z - 80 + end + self.RainMarshsParticleInst[GameplayStatics.SpawnEmitterAtLocation(self, self.SpringThingsParticle, TempLocation, Rotator.New(0, 0, 0), Vector.New(1, 1, 1), true)] = KismetSystemLibrary.GetGameTimeInSeconds(self) + + else + print("MulticastRPC_SpawnParticleSystem_Fun Position is nil type: " .. type(TempLocation)) + end +end +-------------------------------SpringThingsSkillEnd------------------------ + +function BP_BossSpring:ReceiveOnMonsterDeath() + MonsterBoss.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.SpringThingsHandle then EventSystem.StopTimer(self.SpringThingsHandle) self.SpringThingsHandle = nil return end + else + if self.RainMarshsParticleInst then + for TempParticle, T in pairs(self.RainMarshsParticleInst) do + TempParticle:K2_DestroyComponent(self) + end + self.RainMarshsParticleInst = {} + end + if self.ParticleSystem then self.ParticleSystem:SetVisibility(false) end + end +end + +return BP_BossSpring; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_DelaySpawnActor.lua b/GZJ/Script/Blueprint/Monster/BP_DelaySpawnActor.lua new file mode 100644 index 00000000..6765d065 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_DelaySpawnActor.lua @@ -0,0 +1,49 @@ +---@class BP_DelaySpawnActor_C:AActor +---@field DefaultSceneRoot USceneComponent +---@field TargetActor UClass +--Edit Below-- +local BP_DelaySpawnActor = {}; + + +function BP_DelaySpawnActor:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); + if UGCGameSystem.IsServer() then + EventSystem.SetTimer( + self, + function () + UGCGameSystem.SpawnActor(self.TargetActor, self:K2_GetActorLocation(), self:K2_GetActorRotation(), VectorHelper.ScaleOne()) + print("BP_DelaySpawnActor_SpawnFinish") + + end, + self.DelayTime + ) + print("ServerSetSucceed") + end +end + + +--[[ +function BP_DelaySpawnActor:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_DelaySpawnActor:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_DelaySpawnActor:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_DelaySpawnActor:GetAvailableServerRPCs() + return +end +--]] + +return BP_DelaySpawnActor; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_DullMonster1.lua b/GZJ/Script/Blueprint/Monster/BP_DullMonster1.lua new file mode 100644 index 00000000..a884dc07 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_DullMonster1.lua @@ -0,0 +1,43 @@ +---@class BP_DullMonster1_C:BP_MonsterBase_C +--Edit Below-- +local BP_DullMonster1 = {}; + +--[[ +function BP_DullMonster1:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function BP_DullMonster1:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_DullMonster1:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_DullMonster1:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_DullMonster1:GetAvailableServerRPCs() + return +end +--]] + +function BP_DullMonster1:GetGiveExp() + return 5 +end + +function BP_DullMonster1:GetDropRate() + return 95 +end + +return BP_DullMonster1; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_IceZodiacaBase.lua b/GZJ/Script/Blueprint/Monster/BP_IceZodiacaBase.lua new file mode 100644 index 00000000..ede2d8b5 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_IceZodiacaBase.lua @@ -0,0 +1,44 @@ +---@class BP_IceZodiacaBase_C:BP_MonsterBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +local BP_NormalMonster = {}; + +--[[ +function BP_NormalMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function BP_NormalMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_NormalMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_NormalMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_NormalMonster:GetAvailableServerRPCs() + return +end +--]] + +function BP_NormalMonster:GetGiveExp() + return 5 +end + +function BP_NormalMonster:GetDropRate() + return 95 +end + +return BP_NormalMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterAccessoryMonster.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterAccessoryMonster.lua new file mode 100644 index 00000000..3197da95 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterAccessoryMonster.lua @@ -0,0 +1,74 @@ +---@class BP_MonsterAccessoryMonster_C:BP_MonsterChallenge_C +---@field SM_UGC_TZG3_WUQI UStaticMeshComponent +---@field ReapParticle UParticleSystemComponent +---@field UAESkillManager UUAESkillManagerComponent +---@field DoomsdayParticle UParticleSystem +--Edit Below-- +--local BP_MonsterAccessoryMonster = {}; +local MonsterChallenge = require('Script.Blueprint.Monster.BP_MonsterChallenge') + +local BP_MonsterAccessoryMonster = setmetatable( + { + LastDoomsdayPositions = {}; + BaseAttackValue = 0; + ID = 1005; + WhirlwindSkillHandle = nil + }, + { + __index = MonsterChallenge, + __metatable = MonsterChallenge + } +); + +function BP_MonsterAccessoryMonster:ReceiveBeginPlayEx() + MonsterChallenge.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddWhirlwindSkill() + end +end + +function BP_MonsterAccessoryMonster:AddWhirlwindSkill() + self.WhirlwindSkillHandle = EventSystem.SetTimerLoop( + self, + function() + if self:GetController() and self:GetController():GetBlackboardComponent() then + self:GetController():GetBlackboardComponent():SetValueAsBool("CanPlayWhirlwind", true) + end + end, + 10.0 + ) +end + +function BP_MonsterAccessoryMonster:AddAttack() + if self:HasAuthority() then + self:AddAdditionalAttack(self.BaseAttackValue) + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SetParticleVisibility", true) + end +end +function BP_MonsterAccessoryMonster:MulticastRPC_SetParticleVisibility(NewVisibility) + if self:HasAuthority() then return end + self.ReapParticle:SetVisibility(NewVisibility) + EventSystem.SetTimer( + self, + function() + self.ReapParticle:SetVisibility(false) + end, + 1.5 + ) +end + +function BP_MonsterAccessoryMonster:ReceiveOnMonsterDeath() + MonsterChallenge.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.WhirlwindSkillHandle then + EventSystem.StopTimer(self.WhirlwindSkillHandle) + self.WhirlwindSkillHandle = nil + return + end + end +end + + + + +return BP_MonsterAccessoryMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterAttack.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterAttack.lua new file mode 100644 index 00000000..d3126410 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterAttack.lua @@ -0,0 +1,35 @@ +---@class BP_MonsterAttack_C:BP_MonsterBase_C +--Edit Below-- +-- local BP_MonsterAttack = {}; +local MonsterBase = require('Script.Blueprint.Monster.BP_MonsterBase') +local BP_MonsterAttack = setmetatable( + { + TrackPlayer = nil; + TrackPlayerTimer = nil; + TrackPlayerDamage = 0; + }, + { + __index = MonsterBase, + __metatable = MonsterBase + } +) + +function BP_MonsterAttack:UpdateTrackPlayer(DamageAmount,DamageEvent,EventInstigator,DamageCauser) + if not DamageCauser then return DamageAmount end + if self.TrackPlayerTimer then + EventSystem.StopTimer(self.TrackPlayerTimer) + end + self.TrackPlayer = DamageCauser + self.TrackPlayerTimer = EventSystem.SetTimer( + self, + function () + self.TrackPlayer = nil + self.TrackPlayerTimer = nil + self.TrackPlayerDamage = 0 + end, + 3 + ) + return DamageAmount +end + +return BP_MonsterAttack; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterBase.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterBase.lua new file mode 100644 index 00000000..fabcf2fe --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterBase.lua @@ -0,0 +1,681 @@ +---@class BP_MonsterBase_C:STExtraSimpleCharacter +---@field ParticleSystem_Stun UParticleSystemComponent +---@field MonsterAnimList UUAEMonsterAnimListComponent +---@field Capsule UCapsuleComponent +---@field HurtEffect UParticleSystem +---@field TargetPlayerKey int64 +--Edit Below-- +local BP_MonsterBase = { + ID = 0; + + DeadExp = 0; + DeadCoinPoint = 0; + DeadKillPoint = 1; + + ModifyDamageDelegation = {}; -- 修改收到伤害的委托 + SkillCount = 0; + MonsterName = ""; + -- ID = 0; + bIsDead = false; + bIsStun = false; --是否眩晕 + + bHasInitedByLevel = false; + bHasTriggeredReceiveOnDeath = false; + + AttackValue = 0; + MagicValue = 0; + BossLevel = 0; + PhysicalDefense = 0; + MagicDefense = 0; + Gold = 0; + KillPoint = 0; + exp = 0; + + -- 附加攻击力 + AdditionalAttack = 0; + -- 附加防御力 + AdditionalDefense = 0; + --攻击力效率 + AttackScale = 1; + --防御力效率 + DefenseScale = 1; + -- 应用附加攻击力 + ApplyAdditionalAttack = 1; + -- 应用附加防御力 + ApplyAdditionalDefense = 1; + -- 回血效率 + BloodReturnEfficiency = 1; + -- 伤害减免百分比 + DamageReductionPercentage = 0; + -- 追踪玩家范围 + TrackPlayerRange = 1000; + + bSetWeaponSkill = false; +}; + +---------------------------------属性同步--------------------------------- + +function BP_MonsterBase:GetReplicatedProperties() + return + "TargetPlayerKey", "bIsStun" +end + +function BP_MonsterBase:OnRep_bIsStun() + if self.bIsStun then + self.ParticleSystem_Stun:SetVisibility(true) + else + self.ParticleSystem_Stun:SetVisibility(false) + end +end + +function BP_MonsterBase:OnRep_TargetPlayerKey() + print(string.format('[BP_MonsterBase:OnRep_TargetPlayerKey] 同步 PlayerKey = %d', self.TargetPlayerKey)) +end + +---------------------------------初始化流程--------------------------------- + +function BP_MonsterBase:ReceiveBeginPlay() + BP_MonsterBase.SuperClass.ReceiveBeginPlay(self) + + if self:HasAuthority() then + self.OnDeath:Add(BP_MonsterBase.ServerOnDeath, self) + else + self.OnSimpleCharacterHpChange:Add(BP_MonsterBase.ClientOnHealthChanged, self) + end + + self:ReceiveBeginPlayEx() +end + +function BP_MonsterBase:ReceiveTick(DeltaTime) + BP_MonsterBase.SuperClass.ReceiveTick(self, DeltaTime); + + self:ReceiveTickEx(DeltaTime) +end + +function BP_MonsterBase:ReceiveEndPlay() + self:ReceiveOnDeath() + + if self:HasAuthority() then + self.OnDeath:Remove(BP_MonsterBase.ServerOnDeath, self) + + self.bIsStun = false + if self.StunTimerHandle ~= nil then + EventSystem.StopTimer(self.StunTimerHandle) + end + else + self.ParticleSystem_Stun:SetVisibility(false) + end + + self:ReceiveEndPlayEx() + + BP_MonsterBase.SuperClass.ReceiveEndPlay(self) +end + +---额外初始化项的接口 +---子类中实现 +function BP_MonsterBase:ReceiveBeginPlayEx() +end + +---额外Tick操作接口 +---子类中实现 +function BP_MonsterBase:ReceiveTickEx(DeltaTime) +end + +---额外销毁项的接口 +---子类中实现 +function BP_MonsterBase:ReceiveEndPlayEx() +end + +---客户端血量变化回调 +function BP_MonsterBase:ClientOnHealthChanged(CurrentHP, MaxHP) + self:ClientOnHealthChangedEx(CurrentHP, MaxHP) +end + +---客户端血量变化回调 +---子类中实现 +function BP_MonsterBase:ClientOnHealthChangedEx(CurrentHP, MaxHP) +end + +----------------------------------------死亡回调函数---------------------------------------- + +function BP_MonsterBase:ServerOnDeath(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + if DeadMonster == self then + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(KillerController.PlayerKey) + PlayerState:AddExp(self:GetDeadExp()) + PlayerState:AddCoinPoint(self:GetDeadCoinPoint()) + PlayerState:AddKillPoint(self:GetDeadKillPoint()) + PlayerState:AddKillCount() + + KillerController:AddSealKillCount() + + local Rand = math.random(1, 100) + local DropItemAddition = PlayerState:GetDroppingRate() + if Rand < (self:GetDropRate() * (1 + DropItemAddition)) then + local DropPos = VectorHelper.Sub(self:K2_GetActorLocation(), {X = 0, Y = 0, Z = self.Capsule.CapsuleHalfHeight}) + EventSystem:SendEvent(EventType.SpawnDropItem, DropPos, self:K2_GetActorRotation(), KillerController.PlayerKey, nil) + end + + self.bIsDead = true + self.bIsStun = false + if self.StunTimerHandle ~= nil then + EventSystem.StopTimer(self.StunTimerHandle) + end + + self:ReceiveOnDeath() + + self:ServerOnDeathEx(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + end +end + +function BP_MonsterBase:ReceiveOnDeath() + if self.bHasTriggeredReceiveOnDeath then + return + end + self.bHasTriggeredReceiveOnDeath = true + + self:ReceiveOnMonsterDeath() + + if self:HasAuthority() then + UnrealNetwork.CallUnrealRPC_Multicast(self, "ReceiveOnMonsterDeath") + UnrealNetwork.CallUnrealRPC_Multicast(self, "Client_MulticastRPC_RemoveAllSkillEffect", self) + end +end + +---当收到死亡回调后的处理项接口(服务器和客户端都会运行) +---子类中实现 +function BP_MonsterBase:ReceiveOnMonsterDeath() +end + +---死亡回调额外处理项接口 +---子类中实现 +function BP_MonsterBase:ServerOnDeathEx(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) +end + +-- 处理飘字 +function BP_MonsterBase:UGC_GetDamageNumberConfigIndex(Damage, IsHeadShot, InstigatorController, DamageCauser, DamageType) + if not self:HasAuthority() then + GameplayStatics.SpawnEmitterAttached(self.HurtEffect, self.Mesh, "spine_01", VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.Scale(2.0), EAttachLocation.SnapToTarget, true) + end + + if (not InstigatorController) or (not DamageCauser:IsLocallyControlled()) then + return -1 + end + + UE.Log("[BP_MonsterBase:UGC_GetDamageNumberConfigIndex] 0") + return 0 +end + +---------------------------------初始化属性流程--------------------------------- + +function BP_MonsterBase:InitMonsterByLevel(InLevel) + self.bHasInitedByLevel = false + return self:UpdateMonsterLevel(self.MonsterName, InLevel) +end + +---更新怪物等级 +function BP_MonsterBase:UpdateMonsterLevel(MonsterName, newLevel) + if self.bHasInitedByLevel then + return true + end + self.bHasInitedByLevel = true + + if self.HealthCheckHandle ~= nil then + EventSystem.StopTimer(self.HealthCheckHandle) + self.HealthCheckHandle = nil + end + + if MonsterName == self.MonsterName and self.BossLevel == newLevel then + UE.Log("[BP_MonsterBase][UpdateMonsterLevel] %s: Has Inited", KismetSystemLibrary.GetObjectName(self)) + return true + end + + self.bSetWeaponSkill = false + + local GameState = UGCGameSystem.GameState + + if UE.IsValid(GameState) == false then + UE.Log("[BP_MonsterBase][UpdateMonsterLevel] invalid gamestate") + return false + end + + local MultiplierBoss = GameState.BossHealthMultiplier + local MultiplierMonster = GameState.MonsterHealthAndAttackValueMultiplier + + if ((type(newLevel) == "number") and MonsterParam[MonsterName]) then + + self.BossLevel = newLevel + local MonsterType = self:GetMonsterType() + local HealthMax = MonsterParam[MonsterName].GradeParam[self.BossLevel].Health * MultiplierMonster["Health"] + if MonsterType == EMonsterType.Boss then + HealthMax = HealthMax * MultiplierBoss + end + UGCSimpleCharacterSystem.SetHealthMax(self, HealthMax) + UGCSimpleCharacterSystem.SetHealth(self, HealthMax) + + self.HealthCheckHandle = EventSystem.SetTimerLoop(self, function() + local HealthMax = UGCSimpleCharacterSystem.GetHealthMax(self) + local Health = UGCSimpleCharacterSystem.GetHealth(self) + if math.isNearlyEqual(Health, HealthMax, 10000) == false then + UGCSimpleCharacterSystem.SetHealth(self, HealthMax) + + local Now_HealthMax = UGCSimpleCharacterSystem.GetHealthMax(self) + local Now_Health = UGCSimpleCharacterSystem.GetHealth(self) + + local LogStr = string.format("[BP_MonsterBase][CheckMonsterHealth] %s: Reset Health: HealthMax = %.2f, Health = %.2f; ", KismetSystemLibrary.GetObjectName(self), Now_HealthMax, Now_Health) + if math.isNearlyEqual(Now_HealthMax, Now_Health, 10000) then + LogStr = LogStr.." Stop Timer !" + EventSystem.StopTimer(self.HealthCheckHandle) + end + UE.Log(LogStr) + else + UE.Log("[BP_MonsterBase][CheckMonsterHealth] %s: Valid Health: HealthMax = %.2f, Health = %.2f", KismetSystemLibrary.GetObjectName(self), HealthMax, Health) + EventSystem.StopTimer(self.HealthCheckHandle) + end + end, 0.5) + + self.AttackValue = MonsterParam[MonsterName].GradeParam[self.BossLevel].AttackValue * MultiplierMonster["Attack"] + self.PhysicalDefense = MonsterParam[MonsterName].GradeParam[self.BossLevel].PhysicalDefense + + local MaxWalkSpeed = MonsterParam[MonsterName].GradeParam[self.BossLevel].MovementSpeed + UGCSimpleCharacterSystem.SetSpeedScale(self, MaxWalkSpeed / 600) + + self.DeadCoinPoint = MonsterParam[MonsterName].GradeParam[self.BossLevel].Gold + self.DeadExp = MonsterParam[MonsterName].GradeParam[self.BossLevel].exp + self.DeadKillPoint = MonsterParam[MonsterName].GradeParam[self.BossLevel].KillPoint + + self.BaseHealthMax = HealthMax + self.BaseAttackValue = self.AttackValue + self.BasePhysicalDefense = self.PhysicalDefense + self.BaseMaxWalkSpeed = MaxWalkSpeed + + if MonsterType ~= EMonsterType.Breach then + local LifeTime = MonsterParam[MonsterName].GradeParam[self.BossLevel].LifeTime + if LifeTime and LifeTime > 0 then + self:SetLifeSpan(LifeTime) + end + end + + self:UpdateMonsterLevelEx(MonsterName, newLevel) + else + UE.Log("[BP_MonsterBase][UpdateMonsterLevel] Failure: invalid level or monstername") + return false + end + + return true +end + +---更新怪物等级其他项 +---子类实现 +function BP_MonsterBase:UpdateMonsterLevelEx(MonsterName, newLevel) +end + +function BP_MonsterBase:UpdateSkillCount() + self.SkillCount = self.SkillCount + 1 +end + +---怪物应用伤害 +function BP_MonsterBase:MonsterApplyDamage(TargetPawn, DamageValue) + if self.bIsDead then return end + if TargetPawn == nil then return end + local juryReduction = 0 + local PlayerState = TargetPawn.PlayerState + if PlayerState and PlayerState.InjuryReduction then + juryReduction = PlayerState:InjuryReduction(self) + end + DamageValue = DamageValue - juryReduction + if DamageValue < 0 then + DamageValue = 0 + end + print("BP_MonsterBase_Fun_" .. "MonsterApplyDamage_ " .. DamageValue) + UGCGameSystem.ApplyDamage(TargetPawn, DamageValue, self:GetController(), self, EDamageType.ShootDamage) +end + + +---------------------------------Get&Set--------------------------------- + +-- virtual +function BP_MonsterBase:GetDeadExp() + return self.DeadExp +end + +function BP_MonsterBase:GetDeadCoinPoint() + return self.DeadCoinPoint +end + +function BP_MonsterBase:GetDeadKillPoint() + return self.DeadKillPoint +end + +function BP_MonsterBase:GetDropRate() + return 10 +end + +function BP_MonsterBase:GetMonsterType() + return GameDataManager.GetMonsterTypeByID(self.ID) +end + +---Server +function BP_MonsterBase:SetTargetPlayerKey(InPlayerKey) + self.TargetPlayerKey = InPlayerKey + -- UE.Log("[BP_MonsterBase][SetTargetPlayerKey] [%s]: TargetPlayerKey[%s]", KismetSystemLibrary.GetObjectName(self), tostring(self.TargetPlayerKey)) +end + +---Server +function BP_MonsterBase:SetIsStun(flag, Duration) + if not self:IsAlive() then + return + end + if flag then + if Duration > 0 then + if self.StunTimerHandle ~= nil then + EventSystem.StopTimer(self.StunTimerHandle) + end + + self.StunTimerHandle = EventSystem.SetTimer(self, function() + self.bIsStun = false + end, Duration) + else + return + end + end + self.bIsStun = flag +end + + +function BP_MonsterBase:GetCanDamagePlayer() + return GameplayStatics.GetAllActorsOfClass(self, self:GetPawnClass(), {}) +end + +---设置血量恢复效率 +---@field NewBloodReturnEfficiency float +function BP_MonsterBase:SetBloodReturnEfficiency(NewBloodReturnEfficiency) + if NewBloodReturnEfficiency < 0 then return false end + self.BloodReturnEfficiency = NewBloodReturnEfficiency + return true +end + +---恢复怪物的血量,自动控制在血量上限 +---@field TargetAddHealth float +function BP_MonsterBase:AddHealth(TargetAddHealth) + TargetAddHealth = self.BloodReturnEfficiency * TargetAddHealth + + local TargetHealth = UGCSimpleCharacterSystem.GetHealth(self) + TargetAddHealth + if TargetHealth > UGCSimpleCharacterSystem.GetHealthMax(self) then + TargetHealth = UGCSimpleCharacterSystem.GetHealthMax(self) + end + UGCSimpleCharacterSystem.SetHealth(self, TargetHealth) +end + +---获取攻击力 +---@return float +function BP_MonsterBase:GetAttack() + return self.AttackScale * (self.AttackValue + (self.AdditionalAttack * self.ApplyAdditionalAttack)) +end + +---获取防御力 +---@return float +function BP_MonsterBase:GetDefense() + return self.DefenseScale * (self.PhysicalDefense + (self.AdditionalDefense * self.ApplyAdditionalDefense)) +end + +---设置攻击缩放 +---@field NewAttackScale float +---@return bool +function BP_MonsterBase:SetAttackScale(NewAttackScale) + if NewAttackScale < 0 then return false end + self.AttackScale = NewAttackScale + return true +end + +---设置防御缩放 +---@field NewDefenseScale float +---@return bool +function BP_MonsterBase:SetDefenseScale(NewDefenseScale) + if NewDefenseScale < 0 then return false end + self.DefenseScale = NewDefenseScale + return true +end + +---设置应用攻击附加 +---@field NewApplyAdditionalAttack bool +function BP_MonsterBase:SetApplyAdditionalAttack(NewApplyAdditionalAttack) + if NewApplyAdditionalAttack then + self.ApplyAdditionalAttack = 1 + else + self.ApplyAdditionalAttack = 0 + end +end + +---设置设置应用防御附加 +---@field NewApplyAdditionalDefense bool +function BP_MonsterBase:SetApplyAdditionalDefense(NewApplyAdditionalDefense) + if NewApplyAdditionalDefense then + self.ApplyAdditionalDefense = 1 + else + self.ApplyAdditionalDefense = 0 + end +end + +---添加攻击力附加 +function BP_MonsterBase:AddAdditionalAttack(Val) + self.AdditionalAttack = Val + self.AdditionalAttack +end + +---添加防御力附加 +function BP_MonsterBase:AddAdditionalDefense(Val) + self.AdditionalDefense = Val + self.AdditionalDefense +end + +---重置额外攻击力 +function BP_MonsterBase:ResetAdditionalAttack(Val) + self.AdditionalAttack = Val +end + +---重置额外防御力 +function BP_MonsterBase:ResetAdditionalDefense(Val) + self.AdditionalDefense = Val +end + +---@field CenterPosition Vector +---@field radius float +---@field TargetClass UClass +---@return resActors table +function BP_MonsterBase:GetSphereActors(CenterPosition, radius, TargetClass) + local TargetActors = GameplayStatics.GetAllActorsOfClass(self, TargetClass, {}) + local resActors = {} + for k, TempActor in pairs(TargetActors) do + if VectorHelper.GetDistance(TempActor:K2_GetActorLocation(), CenterPosition) <= radius then + table.insert(resActors, TempActor) + end + end + return resActors +end + +function BP_MonsterBase:GetPawnClass() + if not self.PawnClass then + self.PawnClass = UE.LoadClass(BPClassPath.PlayerPawn) + end + return self.PawnClass +end + +function BP_MonsterBase:GetMonsterClass() + if not self.MonsterClass then + self.MonsterClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterBase.BP_MonsterBase_C')) + end + return self.MonsterClass +end + +---------------------------------伤害处理--------------------------------- + +---伤害处理函数 +function BP_MonsterBase:BP_CharacterModifyDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser) + local BaseDamageAmount = DamageAmount + + DamageAmount = BP_MonsterBase.ReduceInjury(self, DamageCauser, DamageAmount) + + if self.ModifyDamageDelegation then + for k, fun in pairs(self.ModifyDamageDelegation) do + DamageAmount = fun(DamageAmount, DamageEvent, EventInstigator, DamageCauser) + end + end + + if DamageCauser.IsInTrueDamage then + DamageAmount = BaseDamageAmount + end + + if DamageAmount < 0 then + DamageAmount = 0 + end + + DamageAmount = self:DealWeapon(DamageCauser, DamageAmount) + + if EventInstigator then + local ControlledCharacter = EventInstigator:GetPlayerCharacterSafety() + ControlledCharacter:DealRealDamage(self, DamageAmount) + end + + self:CollectPlayerDamage(DamageAmount, EventInstigator.PlayerKey) + + DamageAmount = self:BP_CharacterModifyDamageEx(DamageAmount) + + return DamageAmount +end + +---额外伤害处理接口 +---子类实现 +function BP_MonsterBase:BP_CharacterModifyDamageEx(DamageAmount) + return DamageAmount +end + +--收到伤害时触发, Server调用, 顺序在ModifyDamage之后, DamageAmout应是计算过后的伤害 +function BP_MonsterBase:BPReceiveDamage(DamageAmount, DamageType, EventInstigator, DamageCauser) + self:BPReceiveDamageEx(DamageAmount, DamageType, EventInstigator, DamageCauser) +end + +---子类中实现 +function BP_MonsterBase:BPReceiveDamageEx(DamageAmount, DamageType, EventInstigator, DamageCauser) +end + +--[[ + +time: 20230312 +name: LanTian +describe: +添加一个ModifyDamageDelegation的委托table,作用于重载的伤害修改函数BP_CharacterModifyDamage,便利所有的修改委托函数后返回最终伤害值 +AddModifyDamageDelegation : 添加一个委托 +RemoveModifyDamageDelegation : 移除一个委托 + +]]-- +function BP_MonsterBase.ReduceInjury(Monster, Pawn, DamageAmount) + local ReduceInjury = 0 + if UE.IsValid(Monster) and UE.IsValid(Pawn) and UE.IsValid(Pawn.PlayerState) and Monster.GetDefense and Pawn.PlayerState.DefencePenetrate then + ReduceInjury = (Monster:GetDefense() - Pawn.PlayerState:DefencePenetrate()) / ((Monster:GetDefense() - Pawn.PlayerState:DefencePenetrate()) + 1000) + local OldDamage = DamageAmount + DamageAmount = DamageAmount * (1 - ReduceInjury) * (1 - Monster.DamageReductionPercentage) + + if GameDataManager.GetMonsterTypeByID(Monster.ID) == EMonsterType.Boss then + UE.Log("[BP_MonsterBoss:ReduceInjury] %s: OldDmg=%.2f, Result=%.2f", KismetSystemLibrary.GetObjectName(Monster), OldDamage, DamageAmount) + end + UE.Log("[BP_MonsterBase_ReduceInjury] %f", DamageAmount) + end + return DamageAmount +end + + +function BP_MonsterBase:DealWeapon(InDamageCauser, InDamageAmount) + local WeaponType = GameDataManager.GetWeaponType(InDamageCauser.WeaponActor.CurrentWeaponId) + if WeaponType == nil then + UE.Log("[BP_MonsterBase:DealWeapon] Data is nil") + return + else + if WeaponType == EWeaponClassType.WT_ShotGun then -- 霰弹枪 + if self.ID == 10006 and self.bIsReplica then + InDamageAmount = InDamageAmount * 4 + UE.Log('[BP_MonsterBase:DealWeapon] 霰弹枪: 攻击分身伤害:%f ---SelfName=%s', InDamageAmount, KismetSystemLibrary.GetObjectName(self)) + end + elseif WeaponType == EWeaponClassType.WT_MachineGun then -- 机枪 + --self. + elseif WeaponType == EWeaponClassType.WT_SubmachineGun then -- 冲锋枪 + InDamageCauser.bCanBeControlledByMonsters = true + if GameDataManager.GetMonsterTypeByID(self.ID) == EMonsterType.Boss then + UE.Log('[BP_MonsterBase:DealWeapon] 冲锋枪: 免疫控制 ---SelfName=%s', KismetSystemLibrary.GetObjectName(self)) + end + elseif WeaponType == EWeaponClassType.WT_ShooterRifle then -- 射手步枪 + if GameDataManager.GetMonsterTypeByID(self.ID) == EMonsterType.Boss then + if not self.bSetWeaponSkill then + local SpeedScale = UGCSimpleCharacterSystem.GetSpeedScale(self) + UGCSimpleCharacterSystem.SetSpeedScale(self, SpeedScale * 0.3) + self.bSetWeaponSkill = true + UE.Log('[BP_MonsterBase:DealWeapon] 射手步枪: 减速 ---SelfName=%s', KismetSystemLibrary.GetObjectName(self)) + end + end + elseif WeaponType == EWeaponClassType.WT_AssaultRifle then -- 突击步枪 + if GameDataManager.GetMonsterTypeByID(self.ID) == EMonsterType.Boss then + self:SetBloodReturnEfficiency(0) + UE.Log('[BP_MonsterBase:DealWeapon] 突击步枪: 抑制回复 ---SelfName=%s', KismetSystemLibrary.GetObjectName(self)) + end + elseif WeaponType == EWeaponClassType.WT_Sniper then -- 狙击枪 + if GameDataManager.GetMonsterTypeByID(self.ID) == EMonsterType.Boss then + self:SetApplyAdditionalDefense(false) + UE.Log('[BP_MonsterBase:DealWeapon] 狙击枪: 无视防御 ---SelfName=%s', KismetSystemLibrary.GetObjectName(self)) + end + end + end + + return InDamageAmount +end + +function BP_MonsterBase:CollectPlayerDamage(DamageAmount, PlayerKey) + if PlayerKey == nil then + UE.Log("BP_MonsterBase_Fun_" .. "CollectPlayerDamage" .. "PlayerKey is nil") + return + end + if self:GetMonsterType() == EMonsterType.Boss then + if DamageAmount > UGCSimpleCharacterSystem.GetHealth(self) then + DamageAmount = UGCSimpleCharacterSystem.GetHealth(self) + end + + local GameState = UGCGameSystem.GameState + GameState:UpdatePlayerDamage(PlayerKey, self.ID, DamageAmount) + end +end + +function BP_MonsterBase:RemoveModifyDamageDelegation(Key) + if self.ModifyDamageDelegation[Key] then + self.ModifyDamageDelegation[Key] = nil + return true + end + return false +end + +---@param Key string +---@param DelegationFun fun(DamageAmount:float,DamageEvent:FDamageEvent,EventInstigator:AController,DamageCauser:AActor):float +---@return bool +function BP_MonsterBase:AddModifyDamageDelegationFun(Key, DelegationFun) + if self.ModifyDamageDelegation[Key] then + return false + else + self.ModifyDamageDelegation[Key] = DelegationFun + return true + end +end + +-- 获取封印 KillCount +function BP_MonsterBase:GetSealKillCount() + return 1 +end + +-------------------------------RPCs------------------------------- + +function BP_MonsterBase:GetAvailableServerRPCs() + return + "ReceiveOnMonsterDeath" + -- "Client_MulticastRPC_RemoveAllSkillEffect" +end + +function BP_MonsterBase:Client_MulticastRPC_RemoveAllSkillEffect(CasterActor) + local EffectSystemManager = require('Script.Manager.EffectSystemManager') + EffectSystemManager.RemoveAllEffectOfActor(CasterActor) +end + +return BP_MonsterBase; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterBoss.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterBoss.lua new file mode 100644 index 00000000..0cad735b --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterBoss.lua @@ -0,0 +1,229 @@ +---@class BP_MonsterBoss_C:BP_MonsterAttack_C +---@field HealthWidget UWidgetComponent +---@field NarrationWidget UWidgetComponent +--Edit Below-- +local MonsterAttack = require('Script.Blueprint.Monster.BP_MonsterAttack') +local BP_MonsterBoss = setmetatable( + { + HasBegunPlay = false, + KilledPlayerNum = 0, + + SpawnMinionsHealthPercents = {0.8, 0.5, 0.3, 0.1}, + SpawnedMinions = {}, + }, + { + __index = MonsterAttack, + __metatable = MonsterAttack + } +) + +BP_MonsterBoss.BornTime = nil; + +function BP_MonsterBoss:GetReplicatedProperties() + return + "KilledPlayerNum", "bIsStun", "TargetPlayerKey" +end + +function BP_MonsterBoss:ReceiveBeginPlayEx() + MonsterAttack.ReceiveBeginPlayEx(self) + + if self:HasAuthority() then + local PlayerStates = UGCGameSystem.GetAllPlayerState(false); + local ServerTime = KismetSystemLibrary.GetGameTimeInSeconds(self) + + for i, v in pairs(PlayerStates) do + if v then + --if v.EasterEggsData[3] == nil then + -- v.EasterEggsData[3] = {} + --end + --v.EasterEggsData[3].BeginTime = ServerTime + end + end + + self.BornTime = ServerTime; + else + EventSystem.SetTimer(self, function() + self.NarrationWidget.Widget:UpdateKilledPlayerNum(self.KilledPlayerNum) + end, 1.5) + end +end + +function BP_MonsterBoss:BPReceiveDamageEx(DamageAmount, DamageType, EventInstigator, DamageCauser) + if self.bIsReplica then + return + end + + local CurHPSpawnThreshold = self.SpawnMinionsHealthPercents[1] + if CurHPSpawnThreshold then + local CurHP = UGCSimpleCharacterSystem.GetHealth(self) + local MaxHP = UGCSimpleCharacterSystem.GetHealthMax(self) + local HPPercent = CurHP / MaxHP + if HPPercent <= CurHPSpawnThreshold then + self:SpawnMinions(#UGCGameSystem.GetAllPlayerPawn() * 5) + table.remove(self.SpawnMinionsHealthPercents, 1) + end + end + + UE.Log("[BP_MonsterBoss:BPReceiveDamageEx] %s: CurHealth=%.2f, MaxHealth=%.2f, DamageAmount=%.2f, EventInstigator=%s, Causer=%s", + KismetSystemLibrary.GetObjectName(self), + UGCSimpleCharacterSystem.GetHealth(self), + UGCSimpleCharacterSystem.GetHealthMax(self), + DamageAmount, + KismetSystemLibrary.GetObjectName(EventInstigator), + KismetSystemLibrary.GetObjectName(DamageCauser)) +end + +function BP_MonsterBoss:SpawnMinions(SpawnNum) + local MonsterClass = GameDataManager.GetAttackWaveCommonMonsterClass() + for i = 1, SpawnNum do + local SpawnLoc = VectorHelper.RandomVector(self:K2_GetActorLocation(), 1) + local SpawnRot = VectorHelper.RandomRotatorYaw(self:K2_GetActorRotation()) + local Monster = UGCGameSystem.SpawnActor(self, MonsterClass, SpawnLoc, SpawnRot, VectorHelper.ScaleOne(), nil) + if Monster then + local MaxHP = UGCSimpleCharacterSystem.GetHealthMax(self) / 10.0 + UGCSimpleCharacterSystem.SetHealthMax(Monster, MaxHP) + UGCSimpleCharacterSystem.SetHealth(Monster, MaxHP) + UGCSimpleCharacterSystem.SetSpeedScale(Monster, 385 / 600) + + Monster.BossLevel = 1 + Monster.AttackValue = self.AttackValue / 10.0 + Monster.PhysicalDefense = self.PhysicalDefense / 10.0 + Monster.DeadCoinPoint = 0.0 + Monster.DeadKillPoint = 0.0 + Monster.BaseHealthMax = MaxHP + Monster.BaseAttackValue = Monster.AttackValue + Monster.BasePhysicalDefense = Monster.PhysicalDefense + Monster.BaseMaxWalkSpeed = 385 + + Monster.OnDeath:Add(self.OnMinionDeath, self) + + table.insert(self.SpawnedMinions, Monster) + end + end +end + +function BP_MonsterBoss:OnMinionDeath(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + for Index, Minion in pairs(self.SpawnedMinions) do + if DeadMonster == Minion then + self.SpawnedMinions[Index] = nil + break + end + end +end + +function BP_MonsterBoss:OnRep_KilledPlayerNum() + if UE.IsValid(self.NarrationWidget.Widget) then + self.NarrationWidget.Widget:UpdateKilledPlayerNum(self.KilledPlayerNum) + end +end + +function BP_MonsterBoss:ClientOnHealthChangedEx(CurrentHP, MaxHP) + UE.Log("[BP_MonsterBoss:ClientOnHealthChangedEx] %s: CurHealth=%.2f, MaxHealth=%.2f", KismetSystemLibrary.GetObjectName(self), CurrentHP, MaxHP) + if UE.IsValid(self.NarrationWidget.Widget) then + self.NarrationWidget.Widget:UpdateOwnerHealth(CurrentHP, MaxHP) + end + if UE.IsValid(self.HealthWidget.Widget) then + self.HealthWidget.Widget:UpdateOwnerHealth(CurrentHP, MaxHP) + end +end + +function BP_MonsterBoss:ReceiveOnMonsterDeath() + MonsterAttack.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + else + self.NarrationWidget.Widget:UpdateOwnerHealth(0, 100) + self.HealthWidget.Widget:UpdateOwnerHealth(0, 100) + end +end + +function BP_MonsterBoss:GetDropRate() + return 100 +end + +function BP_MonsterBoss:ServerOnDeathEx(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + MonsterAttack.ServerOnDeathEx(self, DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + -- 当 BOSS 死亡之后所有玩家的 BOSS 击杀数都加一 + if DeadMonster == self then + local PlayerStates = UGCGameSystem.GetAllPlayerState(false); + -- BOSS 死亡掉落 + local ChineseName = Tables.MonsterBaseConfig[DeadMonster.ID].ChineseName + + -- 检查一下有多少怪物 + local Count = 0 + local Diff = UGCGameSystem.GameState.GameDifficulty + if Diff >= 4 then + Diff = 4; + end + for i, v in pairs(Tables.GameFightStageConfig[Diff]) do + Count = Count + v.MonsterNum.Boss + end + -- 如果当前 Boss == 最后一位 Boss + local BossList = UGCGameSystem.GameState.BossList + log_tree("[BP_MonsterBoss:OnSelfDeath] BossList = ", BossList) + + if DeadMonster.ID == BossList[#BossList] then + EventSystem:SendEvent(EventType.OnSendGameEnd, "LastBossDefeated") + end + local ServerTime = KismetSystemLibrary.GetGameTimeInSeconds(self) + local CostTime = ServerTime - self.BornTime + + for i, v in pairs(PlayerStates) do + if v then + v.KillCount.Boss = v.KillCount.Boss + 1 + v.ArchiveData.TotalBossKilledTimes = v.ArchiveData.TotalBossKilledTimes + 1 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](v, 3, CostTime); + + -- 计算当前彩蛋 3 + if v.EasterEggsData[3] == nil then + v.EasterEggsData[3] = {} + v.EasterEggsData[3].BossCount = 1 + else + if v.EasterEggsData[3].BossCount == nil then + v.EasterEggsData[3].BossCount = 0 + end + v.EasterEggsData[3].BossCount = v.EasterEggsData[3].BossCount + 1 + end + + if v.EasterEggsData[3].BossCount == Count then + local ServerTime = KismetSystemLibrary.GetGameTimeInSeconds(self) + v.EasterEggsData[3].EndTime = ServerTime + local BeginTime = v.EasterEggsData[3].BeginTime + if BeginTime ~= nil then + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](v, 3, ServerTime - BeginTime) + end + end + + -- 计算总的掉落概率 + local DropRate = 0 + for _, c in pairs(ArchiveTable.BossDropItems[ChineseName]) do + if c.DropRate ~= nil then + DropRate = c.DropRate + DropRate + end + end + + local RandNum = math.random() + if RandNum <= DropRate then + local Val = math.random(1, 4) + if v.ArchiveData.BossDropItems[ChineseName] == nil then + v.ArchiveData.BossDropItems[ChineseName] = {} + end + if v.ArchiveData.BossDropItems[ChineseName][Val] == nil then + v.ArchiveData.BossDropItems[ChineseName][Val] = 1 + else + v.ArchiveData.BossDropItems[ChineseName][Val] = v.ArchiveData.BossDropItems[ChineseName][Val] + 1 + end + end + end + end + + for Index, Minion in pairs(self.SpawnedMinions) do + if Minion ~= nil and UE.IsValid(Minion) and Minion:IsAlive() then + Minion:SetLifeSpan(2.0) + end + self.SpawnedMinions[Index] = nil + end + end +end + + +return BP_MonsterBoss; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterBreach.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterBreach.lua new file mode 100644 index 00000000..052fc024 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterBreach.lua @@ -0,0 +1,25 @@ +---@class BP_MonsterBreach_C:BP_ActiveMonsterBase_C +--Edit Below-- +-- local BP_MonsterBreach = {}; +local MonsterBase = require('Script.Blueprint.Monster.BP_ActiveMonsterBase') + +local BP_MonsterBreach = setmetatable( + { + }, + { + __index = MonsterBase, + __metatable = MonsterBase + } +); + +function BP_MonsterBreach:GetCanDamagePlayer() + if self.TargetPlayerKey > 0 then + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.TargetPlayerKey) + if PlayerPawn and PlayerPawn.IsInArena == false then + return {PlayerPawn} + end + end + return {} +end + +return BP_MonsterBreach; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterChallenge.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterChallenge.lua new file mode 100644 index 00000000..ba05dba5 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterChallenge.lua @@ -0,0 +1,48 @@ +---@class BP_MonsterChallenge_C:BP_ActiveMonsterBase_C +--Edit Below-- +--local BP_MonsterChallenge = {}; +local MonsterBase = require('Script.Blueprint.Monster.BP_ActiveMonsterBase') + +local BP_MonsterChallenge = setmetatable( + { + }, + { + __index = MonsterBase, + __metatable = MonsterBase + } +); + +function BP_MonsterChallenge:GetCanDamagePlayer() + local TargetActor = self:GetController():GetBlackboardComponent():GetValueAsObject("TargetActor") + if self.TargetPlayerKey > 0 and UE.IsValid(TargetActor) then + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.TargetPlayerKey) + if PlayerPawn and PlayerPawn.bIsAlive and PlayerPawn.IsInArena == false then + return {PlayerPawn} + end + end + return {} +end + +function BP_MonsterChallenge:ServerOnDeathEx(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + if DeadMonster == self then + if KillerController == nil or UE.IsValid(KillerController) == false then + return + end + local PS = KillerController.PlayerState + if UE.IsValid(PS) then + if PS.EasterEggsData[4] == nil then + PS.EasterEggsData[4] = {} + end + if PS.EasterEggsData[4][DeadMonster.ID] == nil then + PS.EasterEggsData[4][DeadMonster.ID] = 1 + else + PS.EasterEggsData[4][DeadMonster.ID] = PS.EasterEggsData[4][DeadMonster.ID] + 1 + end + end + + -- 进行判断一下 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PS, 4) + end +end + +return BP_MonsterChallenge; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterExerciseRoom.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterExerciseRoom.lua new file mode 100644 index 00000000..3f799754 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterExerciseRoom.lua @@ -0,0 +1,63 @@ +---@class BP_MonsterExerciseRoom_C:BP_MonsterBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +--local BP_MonsterExerciseRoom = {}; +local MonsterBase = require('Script.Blueprint.Monster.BP_MonsterBase') + +local BP_MonsterExerciseRoom = setmetatable( + { + ID = 1007; + MonsterName = "ExerciseRoom", + SpawnIndex = -1, + HasCleanRef = false, + }, + { + __index = MonsterBase, + __metatable = MonsterBase + } +); + +function BP_MonsterExerciseRoom:GetDropRate() + return 5 +end + +function BP_MonsterExerciseRoom:ReceiveBeginPlayEx() +end + +function BP_MonsterExerciseRoom:ReceiveEndPlayEx() + if self:HasAuthority() then + self:CleanSpawnerRef() + end +end + +function BP_MonsterExerciseRoom:ServerOnDeathEx(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + if DeadMonster == self then + self:CleanSpawnerRef() + self:SpawnerSpecialDrop(KillerController.PlayerKey) + end +end + +function BP_MonsterExerciseRoom:SetSpawnIndex(InIndex) + self.SpawnIndex = InIndex +end + +function BP_MonsterExerciseRoom:CleanSpawnerRef() + if self.SpawnIndex > 0 and self.HasCleanRef == false then + local Spawner = UGCGameSystem.GameState:GetSpawnerByPlayerKey(self.TargetPlayerKey) + if Spawner then + Spawner:CleanMonsterRefByIndex(self.SpawnIndex) + self.HasCleanRef = true + end + end +end + +function BP_MonsterExerciseRoom:SpawnerSpecialDrop(KillerPlayerKey) + local Spawner = UGCGameSystem.GameState:GetSpawnerByPlayerKey(self.TargetPlayerKey) + if Spawner then + local DropPos = VectorHelper.Sub(self:K2_GetActorLocation(), {X = 0, Y = 0, Z = self.Capsule.CapsuleHalfHeight}) + local DropRot = self:K2_GetActorRotation() + Spawner:CheckSpecialDropForMonster(EMonsterType.HangupRoom, DropPos, DropRot, KillerPlayerKey) + end +end + +return BP_MonsterExerciseRoom; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterGoldEfficiencyMonster.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterGoldEfficiencyMonster.lua new file mode 100644 index 00000000..0a660c24 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterGoldEfficiencyMonster.lua @@ -0,0 +1,80 @@ +---@class BP_MonsterGoldEfficiencyMonster_C:BP_MonsterChallenge_C +---@field UAESkillManager UUAESkillManagerComponent +---@field ThornParticle UParticleSystem +--Edit Below-- +--local BP_MonsterGoldEfficiencyMonster = {}; + +local MonsterChallenge = require('Script.Blueprint.Monster.BP_MonsterChallenge') + +local BP_MonsterGoldEfficiencyMonster = setmetatable( + { + EnableThornSkill = false; + ID = 1006; + MonsterName = "GoldEfficiencyMonster", + ThornSkillHandle = nil; + }, + { + __index = MonsterChallenge, + __metatable = MonsterChallenge + } +); +function BP_MonsterGoldEfficiencyMonster:ReceiveBeginPlayEx() + MonsterChallenge.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddThornSkill() + self:AddToughAndTensileSkill() + end +end + +function BP_MonsterGoldEfficiencyMonster:ReceiveEndPlayEx() + MonsterChallenge.ReceiveEndPlayEx(self) + self:ReceiveOnMonsterDeath() +end + +function BP_MonsterGoldEfficiencyMonster:AddToughAndTensileSkill() + self:AddModifyDamageDelegationFun( + "AddToughAndTensileSkill", + ---@param DelegationFun fun(DamageAmount:float,DamageEvent:FDamageEvent,EventInstigator:AController,DamageCauser:AActor):float + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + return DamageAmount * 0.7 + end + ) +end +function BP_MonsterGoldEfficiencyMonster:AddThornSkill() + self:AddModifyDamageDelegationFun( + "AddThornSkill", + ---@param DelegationFun fun(DamageAmount:float,DamageEvent:FDamageEvent,EventInstigator:AController,DamageCauser:AActor):float + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + if self.EnableThornSkill then + local CanDamagePlayers = self:GetCanDamagePlayer() + if CanDamagePlayers and table.hasValue(CanDamagePlayers, DamageCauser) then + self:MonsterApplyDamage(DamageCauser, DamageAmount * 0.3) + end + end + return DamageAmount + end + ) + self.ThornSkillHandle = EventSystem.SetTimerLoop(self, + function () + self.EnableThornSkill = true + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnParticleSystemAttach") + EventSystem.SetTimer(self, function () + self.EnableThornSkill = false + end, 3.0) + end, 10) +end + +function BP_MonsterGoldEfficiencyMonster:MulticastRPC_SpawnParticleSystemAttach() + self.ThornParticleInst = GameplayStatics.SpawnEmitterAttached(self.ThornParticle, self.Mesh, "", VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, true) +end + +function BP_MonsterGoldEfficiencyMonster:ReceiveOnMonsterDeath() + MonsterChallenge.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.ThornSkillHandle then EventSystem.StopTimer(self.ThornSkillHandle) self.ThornSkillHandle = nil return end + else + if UE.IsValid(self.ThornParticleInst) then self.ThornParticleInst:K2_DestroyComponent(self) end + end +end + +return BP_MonsterGoldEfficiencyMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterGoldMonster.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterGoldMonster.lua new file mode 100644 index 00000000..62bd26b3 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterGoldMonster.lua @@ -0,0 +1,25 @@ +---@class BP_MonsterGoldMonster_C:BP_MonsterChallenge_C +---@field SM_UGC_TZG1_WUQI_2 UStaticMeshComponent +---@field SM_UGC_TZG1_WUQI_1 UStaticMeshComponent +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +--local BP_MonsterGoldMonster = {}; +local MonsterChallenge = require('Script.Blueprint.Monster.BP_MonsterChallenge') + +local BP_MonsterGoldMonster = setmetatable( + { + ID = 1008; + MonsterName = "GoldMonster", + --TargetPlayerKey = -1, + }, + { + __index = MonsterChallenge, + __metatable = MonsterChallenge + } +); + +function BP_MonsterGoldMonster:ReceiveBeginPlayEx() + MonsterChallenge.ReceiveBeginPlayEx(self) +end + +return BP_MonsterGoldMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterGradeBreakthrough.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterGradeBreakthrough.lua new file mode 100644 index 00000000..2a89a21a --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterGradeBreakthrough.lua @@ -0,0 +1,88 @@ +---@class BP_MonsterGradeBreakthrough_C:BP_MonsterBreach_C +---@field UAESkillManager UUAESkillManagerComponent +---@field FuriousParticle UParticleSystem +---@field SuckBloodParticle UParticleSystem +--Edit Below-- +--local BP_MonsterGradeBreakthrough = {}; +local MonsterBreach = require('Script.Blueprint.Monster.BP_MonsterBreach') + +local BP_MonsterGradeBreakthrough = setmetatable( + { + BaseAttackValue = 0; + EnableFuriousSkill = false; + ID = 1009; + MonsterName = "GradeBreakthrough", + }, + { + __index = MonsterBreach, + __metatable = MonsterBreach + } +); + +function BP_MonsterGradeBreakthrough:ReceiveBeginPlayEx() + MonsterBreach.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddFuriousSkill() + end +end + +function BP_MonsterGradeBreakthrough:UpdateSkillCount() + self.SkillCount = self.SkillCount + 1 + if self.SkillCount >= 5 and self:HasAuthority() then + self.SkillCount = 0 + self:AddHealth(self.BaseAttackValue) + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnSuckBloodParticleSystemAttach") + + end +end + +function BP_MonsterGradeBreakthrough:AddFuriousSkill() + self:AddModifyDamageDelegationFun( + "AddFuriousSkill", + ---@param DelegationFun fun(DamageAmount:float,DamageEvent:FDamageEvent,EventInstigator:AController,DamageCauser:AActor):float + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + if self.EnableFuriousSkill then + return DamageAmount * 1.3 + end + return DamageAmount + end + ) + self.FuriousSkillHandle = EventSystem.SetTimerLoop( + self, + function () + self.EnableFuriousSkill = true + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnFuriousParticleSystemAttach") + self:AddAdditionalAttack(self.BaseAttackValue * 0.5) + EventSystem.SetTimer( + self, + function () + self.EnableFuriousSkill = false + self:AddAdditionalAttack(-self.BaseAttackValue * 0.5) + end, + 5.0 + ) + end, + 15 + ) +end + + +function BP_MonsterGradeBreakthrough:MulticastRPC_SpawnFuriousParticleSystemAttach() + self.FuriousParticleInst = GameplayStatics.SpawnEmitterAttached(self.FuriousParticle, self.Mesh, "spine_03", VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, true) +end + +function BP_MonsterGradeBreakthrough:MulticastRPC_SpawnSuckBloodParticleSystemAttach() + self.SuckBloodParticleInst = GameplayStatics.SpawnEmitterAttached(self.SuckBloodParticle, self.Mesh, "", VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, true) +end + +function BP_MonsterGradeBreakthrough:ReceiveOnMonsterDeath() + MonsterBreach.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.FuriousSkillHandle then EventSystem.StopTimer(self.FuriousSkillHandle) self.FuriousSkillHandle = nil return end + else + if UE.IsValid(self.FuriousParticleInst) then self.FuriousParticleInst:K2_DestroyComponent(self) end + if UE.IsValid(self.SuckBloodParticleInst) then self.SuckBloodParticleInst:K2_DestroyComponent(self) end + end +end + +return BP_MonsterGradeBreakthrough; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterInherit_1.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterInherit_1.lua new file mode 100644 index 00000000..fc07682e --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterInherit_1.lua @@ -0,0 +1,97 @@ +---@class BP_MonsterInherit_1_C:BP_MonsterBreach_C +---@field ParticleSystem UParticleSystemComponent +---@field Sphere USphereComponent +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +-- local BP_MonsterInherit_1 = {}; + +local MonsterBreach = require('Script.Blueprint.Monster.BP_MonsterBreach') + +local BP_MonsterInherit_1 = setmetatable( + { + IncreaseAttackMonsters = {}; + ID = 1001; + CheckTargetPlayerKeyHandle = nil; + MonsterName = "MonsterInherit_1", + }, + { + __index = MonsterBreach, + __metatable = MonsterBreach + } +); + +function BP_MonsterInherit_1:ReceiveBeginPlayEx() + MonsterBreach.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddMajinSkill() + self.Inherit_1SkillLoop = EventSystem.SetTimerLoop(self, function() + self:SetOverlapMonsterIncreaseAttack() + end, 1) + else + self.CheckTargetPlayerKeyHandle = EventSystem.SetTimerLoop(self, function() + if self.TargetPlayerKey ~= -1 then + EventSystem.StopTimer(self.CheckTargetPlayerKeyHandle) + local PC = GameDataManager.GetLocalPlayerController() + if PC.PlayerKey == self.TargetPlayerKey then + UIManager:ClosePanel(EUIType.Inherit) + else + end + else + end + end, 0.5) + end +end + +function BP_MonsterInherit_1:ReceiveEndPlayEx() + MonsterBreach.ReceiveEndPlayEx(self) + if self.IncreaseAttackMonsters then + for _, Monster in pairs(self.IncreaseAttackMonsters) do + if UE.IsValid(Monster) then + Monster:AddAdditionalAttack(-self.BaseAttackValue) + end + end + end + self.IncreaseAttackMonsters = {} +end + +function BP_MonsterInherit_1:SetOverlapMonsterIncreaseAttack() + + local Monsters = GameplayStatics.GetAllActorsOfClass(self, self:GetMonsterClass(), {}) + if Monsters then + print("MonstersLength: " .. #Monsters) + local SelfLocation = self:K2_GetActorLocation() + for k, Monster in pairs(Monsters) do + print("BP_MonsterInherit_1_SetOverlapMonsterIncreaseAttack" .. "ClassName: " .. KismetSystemLibrary.GetObjectName(Monster)) + local MonsterLocation = Monster:K2_GetActorLocation() + + if VectorHelper.GetDistance(SelfLocation, MonsterLocation) <= 500 then + if (not table.hasValue(self.IncreaseAttackMonsters, Monster)) and Monster.AttackValue ~= nil then + table.insert(self.IncreaseAttackMonsters, Monster) + Monster:AddAdditionalAttack(Monster.BaseAttackValue) + print("BP_MonsterInherit_1_BeginOtherActor.AttackValue : " .. Monster:GetAttack()) + end + else + if table.hasValue(self.IncreaseAttackMonsters, Monster) then + Monster:AddAdditionalAttack(-Monster.BaseAttackValue) + print("BP_MonsterInherit_1_BeginOtherActor.AttackValue : " .. Monster:GetAttack()) + table.removeValue(self.IncreaseAttackMonsters, Monster) + end + end + end + end +end + +function BP_MonsterInherit_1:AddMajinSkill() + self:AddAdditionalAttack(self.BaseAttackValue * 0.2) +end + +function BP_MonsterInherit_1:ReceiveOnMonsterDeath() + MonsterBreach.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.Inherit_1SkillLoop then EventSystem.StopTimer(self.Inherit_1SkillLoop) self.Inherit_1SkillLoop = nil return end + else + if UE.IsValid(self.ParticleSystem) then self.ParticleSystem:SetVisibility(false) end + end +end + +return BP_MonsterInherit_1; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterInherit_2.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterInherit_2.lua new file mode 100644 index 00000000..37feec13 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterInherit_2.lua @@ -0,0 +1,101 @@ +---@class BP_MonsterInherit_2_C:BP_MonsterBreach_C +---@field P_Yinghua_001 UParticleSystemComponent +---@field Sphere USphereComponent +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +--local BP_MonsterInherit_2 = {}; + +local MonsterBreach = require('Script.Blueprint.Monster.BP_MonsterBreach') + +local BP_MonsterInherit_2 = setmetatable( + { + IncreaseDefenseMonsters = {}; + ID = 1002; + CheckTargetPlayerKeyHandle = nil; + MonsterName = "MonsterInherit_2", + }, + { + __index = MonsterBreach, + __metatable = MonsterBreach + } +); + +function BP_MonsterInherit_2:ReceiveBeginPlayEx() + MonsterBreach.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddReignSkill() + EventSystem.SetTimerLoop(self, function() + self:SetOverlapMonsterIncreaseDefense() + end, 1) + else + self.CheckTargetPlayerKeyHandle = EventSystem.SetTimerLoop(self, function() + if self.TargetPlayerKey ~= -1 then + EventSystem.StopTimer(self.CheckTargetPlayerKeyHandle) + local PC = GameDataManager.GetLocalPlayerController() + + if PC.PlayerKey == self.TargetPlayerKey then + UIManager:ClosePanel(EUIType.Inherit) + else + end + else + end + end, 0.5) + end +end + +function BP_MonsterInherit_2:ReceiveEndPlayEx() + MonsterBreach.ReceiveEndPlayEx(self) + if self.IncreaseDefenseMonsters then + for _, Monster in pairs(self.IncreaseDefenseMonsters) do + if UE.IsValid(Monster) then + Monster:AddAdditionalDefense(- Monster.BasePhysicalDefense) + end + end + end + self.IncreaseDefenseMonsters = {} +end + +function BP_MonsterInherit_2:SetOverlapMonsterIncreaseDefense() + + local Monsters = GameplayStatics.GetAllActorsOfClass(self, self:GetMonsterClass(), {}) + if Monsters then + print("MonstersLength: " .. #Monsters) + local SelfLocation = self:K2_GetActorLocation() + for k, Monster in pairs(Monsters) do + print("BP_MonsterInherit_1_SetOverlapMonsterIncreaseDefense" .. "ClassName: " .. KismetSystemLibrary.GetObjectName(Monster)) + local MonsterLocation = Monster:K2_GetActorLocation() + + if VectorHelper.GetDistance(SelfLocation, MonsterLocation) <= 500 then + if (not table.hasValue(self.IncreaseDefenseMonsters, Monster)) and Monster.PhysicalDefense ~= nil then + table.insert(self.IncreaseDefenseMonsters, Monster) + Monster:AddAdditionalDefense(Monster.BasePhysicalDefense) + print("BP_MonsterInherit_1_BeginOtherActor.PhysicalDefense : " .. Monster:GetDefense()) + end + else + if table.hasValue(self.IncreaseDefenseMonsters, Monster) then + Monster:AddAdditionalDefense(-Monster.BasePhysicalDefense) + print("BP_MonsterInherit_1_BeginOtherActor.PhysicalDefense : " .. Monster:GetDefense()) + table.removeValue(self.IncreaseDefenseMonsters, Monster) + end + end + end + end +end + +function BP_MonsterInherit_2:AddReignSkill() + self.ReignSkillHandle = EventSystem.SetTimerLoop(self, function() + local HealthMax = UGCSimpleCharacterSystem.GetHealthMax(self) + self:AddHealth(HealthMax * 0.1) + end, 5.0) +end + +function BP_MonsterInherit_2:ReceiveOnMonsterDeath() + MonsterBreach.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.ReignSkillHandle then EventSystem.StopTimer(self.ReignSkillHandle) self.ReignSkillHandle = nil return end + else + if UE.IsValid(self.P_Yinghua_001) then self.P_Yinghua_001:SetVisibility(false) end + end +end + +return BP_MonsterInherit_2; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterLittleBase.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleBase.lua new file mode 100644 index 00000000..65a80baf --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleBase.lua @@ -0,0 +1,16 @@ +---@class BP_MonsterLittleBase_C:BP_MonsterAttack_C +--Edit Below-- +--local BP_MonsterLittleBase = {}; +local MonsterAttack = require('Script.Blueprint.Monster.BP_MonsterAttack') + +local BP_MonsterLittleBase = setmetatable( + { + MonsterName = "LittleMonster"; + }, + { + __index = MonsterAttack, + __metatable = MonsterAttack + } +); + +return BP_MonsterLittleBase; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster.lua new file mode 100644 index 00000000..3c421b13 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster.lua @@ -0,0 +1,50 @@ +---@class BP_MonsterLittleMonster_C:BP_MonsterLittleBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +local MonsterLittleBase = require('Script.Blueprint.Monster.BP_MonsterLittleBase') + +local BP_MonsterLittleMonster = setmetatable( + { + ID = 1010; + --MonsterName = "LittleMonster"; + }, + { + __index = MonsterLittleBase, + __metatable = MonsterLittleBase + } +); + +function BP_MonsterLittleMonster:ReceiveBeginPlayEx() + MonsterLittleBase.ReceiveBeginPlayEx(self) +end +--[[ +function BP_MonsterLittleMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function BP_MonsterLittleMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_MonsterLittleMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_MonsterLittleMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_MonsterLittleMonster:GetAvailableServerRPCs() + return +end +--]] + +return BP_MonsterLittleMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster2.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster2.lua new file mode 100644 index 00000000..e7624f20 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster2.lua @@ -0,0 +1,50 @@ +---@class BP_MonsterLittleMonster2_C:BP_MonsterLittleBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +local MonsterLittleBase = require('Script.Blueprint.Monster.BP_MonsterLittleBase') + +local BP_MonsterLittleMonster2 = setmetatable( + { + ID = 1011; + --MonsterName = "LittleMonster"; + }, + { + __index = MonsterLittleBase, + __metatable = MonsterLittleBase + } +); + +function BP_MonsterLittleMonster2:ReceiveBeginPlayEx() + MonsterLittleBase.ReceiveBeginPlayEx(self) +end +--[[ +function BP_MonsterLittleMonster2:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function BP_MonsterLittleMonster2:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_MonsterLittleMonster2:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_MonsterLittleMonster2:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_MonsterLittleMonster2:GetAvailableServerRPCs() + return +end +--]] + +return BP_MonsterLittleMonster2; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster3.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster3.lua new file mode 100644 index 00000000..c0d6e3fe --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster3.lua @@ -0,0 +1,50 @@ +---@class BP_MonsterLittleMonster3_C:BP_MonsterLittleBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +local MonsterLittleBase = require('Script.Blueprint.Monster.BP_MonsterLittleBase') + +local BP_MonsterLittleMonster3 = setmetatable( + { + ID = 1012; + --MonsterName = "LittleMonster"; + }, + { + __index = MonsterLittleBase, + __metatable = MonsterLittleBase + } +); + +function BP_MonsterLittleMonster3:ReceiveBeginPlayEx() + MonsterLittleBase.ReceiveBeginPlayEx(self) +end +--[[ +function BP_MonsterLittleMonster3:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function BP_MonsterLittleMonster3:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_MonsterLittleMonster3:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_MonsterLittleMonster3:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_MonsterLittleMonster3:GetAvailableServerRPCs() + return +end +--]] + +return BP_MonsterLittleMonster3; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster6.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster6.lua new file mode 100644 index 00000000..e3412de3 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterLittleMonster6.lua @@ -0,0 +1,47 @@ +---@class BP_MonsterLittleMonster6_C:BP_MonsterLittleBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +--local BP_MonsterLittleMonster = {}; +local MonsterLittleBase = require('Script.Blueprint.Monster.BP_MonsterLittleBase') + +local BP_MonsterLittleMonster6 = setmetatable( + { + ID = 1013; + MonsterName = "LittleMonster"; + }, + { + __index = MonsterLittleBase, + __metatable = MonsterLittleBase + } +); + +function BP_MonsterLittleMonster6:ReceiveBeginPlayEx() + MonsterLittleBase.ReceiveBeginPlayEx(self) +end + + +--[[ +function BP_MonsterLittleMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_MonsterLittleMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_MonsterLittleMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_MonsterLittleMonster:GetAvailableServerRPCs() + return +end +--]] + +return BP_MonsterLittleMonster6; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterSkillMonster.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterSkillMonster.lua new file mode 100644 index 00000000..c3b87f45 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterSkillMonster.lua @@ -0,0 +1,98 @@ +---@class BP_MonsterSkillMonster_C:BP_MonsterChallenge_C +---@field ParticleSystem UParticleSystemComponent +---@field UAESkillManager UUAESkillManagerComponent +---@field DoomsdayParticle UParticleSystem +--Edit Below-- +--local BP_MonsterSkillMonster = {}; +local MonsterChallenge = require('Script.Blueprint.Monster.BP_MonsterChallenge') + +local BP_MonsterSkillMonster = setmetatable( + { + LastDoomsdayPositions = {}; + BaseAttackValue = 0; + ID = 1004; + --TargetPlayerKey = -1; + Particles = {}; + DoomsdaySkillHandle = nil; + MonsterName = "SkillMonster", + }, + { + __index = MonsterChallenge, + __metatable = MonsterChallenge + } +); + +function BP_MonsterSkillMonster:ReceiveBeginPlayEx() + MonsterChallenge.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddDoomsdaySkill() + end +end + +function BP_MonsterSkillMonster:ReceiveEndPlayEx() + self.SuperClass.ReceiveEndPlay(self); + self:ReceiveOnMonsterDeath() +end + +function BP_MonsterSkillMonster:AddDoomsdaySkill() + -- body + self.DoomsdaySkillHandle = EventSystem.SetTimerLoop( + self, + function() + if self.LastDoomsdayPositions then + local CanDamagePlayers = self:GetCanDamagePlayer() + if CanDamagePlayers then + for k, TempDoomsdayPosition in pairs(self.LastDoomsdayPositions) do + local Players = self:GetSphereActors(TempDoomsdayPosition, 100, self:GetPawnClass()) + if Players then + for k, TempPlayer in pairs(Players) do + if table.hasValue(CanDamagePlayers, TempPlayer) then + self:MonsterApplyDamage(TempPlayer, self:GetAttack() * 5) + end + self:AddAdditionalAttack(self.BaseAttackValue / 2) + end + end + end + end + end + self.LastDoomsdayPositions = {} + local CanDamagePlayers = self:GetCanDamagePlayer() + if CanDamagePlayers then + for k, TempPlayer in pairs(CanDamagePlayers) do + local TempLocation = TempPlayer:K2_GetActorLocation() + table.insert(self.LastDoomsdayPositions, TempLocation) + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnParticleSystem", VectorHelper.ToLuaTable(TempLocation)) + + end + end + end, + 1.0 + ) +end + +function BP_MonsterSkillMonster:MulticastRPC_SpawnParticleSystem(TempLocation) + if TempLocation then + table.insert(self.Particles, GameplayStatics.SpawnEmitterAtLocation(self, self.DoomsdayParticle, TempLocation, Rotator.New(0, 0, 0), Vector.New(1, 1, 1), true)) + else + print("MulticastRPC_SpawnParticleSystem_Fun Position is nil type: " .. type(TempLocation)) + end +end + + +function BP_MonsterSkillMonster:ReceiveOnMonsterDeath() + MonsterChallenge.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.DoomsdaySkillHandle then EventSystem.StopTimer(self.DoomsdaySkillHandle) self.DoomsdaySkillHandle = nil end + else + if self.Particles then + for TempParticle, T in pairs(self.Particles) do + if UE.IsValid(TempParticle) then + TempParticle:K2_DestroyComponent(self) + end + end + end + end +end + + +return BP_MonsterSkillMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterUnseal.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterUnseal.lua new file mode 100644 index 00000000..ccedf01d --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterUnseal.lua @@ -0,0 +1,135 @@ +---@class BP_MonsterUnseal_C:BP_ActiveMonsterBase_C +---@field ParticleSystem UParticleSystemComponent +---@field UAESkillManager UUAESkillManagerComponent +---@field BlastParticle UParticleSystem +---@field GrowUpLevel int32 +--Edit Below-- +--local BP_MonsterUnseal = {}; +local MonsterBase = require('Script.Blueprint.Monster.BP_ActiveMonsterBase') + +local BP_MonsterUnseal = setmetatable( + { + BlastLocations = {}; + SurvivalTime = 0; + ID = 1100; + MonsterName = "Unseal", + }, + { + __index = MonsterBase, + __metatable = MonsterBase + } +); + +function BP_MonsterUnseal:ReceiveBeginPlayEx() + MonsterBase.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddSkillEvil() + end +end + +function BP_MonsterUnseal:ReceiveTickEx(DeltaTime) + MonsterBase.ReceiveTickEx(self, DeltaTime) + if self:HasAuthority() then + self.SurvivalTime = self.SurvivalTime + DeltaTime + if self.SurvivalTime >= 10.0 then + self.SurvivalTime = 0 + self:AddSkillBlast() + end + end +end + +function BP_MonsterUnseal:GetCanDamagePlayer() + if self:GetController() and self:GetController():GetBlackboardComponent() and self:GetController():GetBlackboardComponent():GetValueAsObject("TargetActor") then + local TargetActor = self:GetController():GetBlackboardComponent():GetValueAsObject("TargetActor") + if self.TargetPlayerKey > 0 and UE.IsValid(TargetActor) then + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.TargetPlayerKey) + if PlayerPawn and PlayerPawn.bIsAlive and PlayerPawn.IsInArena == false then + return {PlayerPawn} + end + end + end + return {} +end + +function BP_MonsterUnseal:AddSkillEvil() + self.SkillEvilHandle = EventSystem.SetTimerLoop( + self, + function () + local Monsters = self:GetSphereActors(self:K2_GetActorLocation(), 500, self:GetMonsterClass()) + if Monsters then + for k, Monster in pairs(Monsters) do + Monster:AddHealth(UGCSimpleCharacterSystem.GetHealthMax(Monster) * 0.05) + end + end + end, + 1.0 + ) +end + +function BP_MonsterUnseal:AddSkillBlast() + local CanDamagePlayers = self:GetCanDamagePlayer() + if CanDamagePlayers then + for k, TempPawn in pairs(CanDamagePlayers) do + local SkillLocation = TempPawn:K2_GetActorLocation() + SkillLocation.Z = SkillLocation.Z - TempPawn.CapsuleComponent.CapsuleHalfHeight + 10 + + table.insert(self.BlastLocations,SkillLocation) + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnParticleSystem", VectorHelper.ToLuaTable(SkillLocation)) + end + EventSystem.SetTimer( + self, + function () + if self.BlastLocations then + for k, TempLocation in pairs(self.BlastLocations) do + local Players = self:GetSphereActors(TempLocation, 250, self:GetPawnClass()) + if Players then + for _, TargetPlayer in pairs(Players) do + self:MonsterApplyDamage(TargetPlayer, self:GetAttack() * 20) + end + end + end + self.BlastLocations = {} + end + end, + 1.0 + ) + end +end + +function BP_MonsterUnseal:SetGrowUpLevel(NewLevel) + if NewLevel < 1 then return false end + + local Param = math.pow(1.25, NewLevel - 1) + + local Health_Max = self.BaseHealthMax * Param + + local Param1 = 1 + 0.5 * (self.GrowUpLevel - 1) + + UGCSimpleCharacterSystem.SetHealthMax(self, Health_Max) + UGCSimpleCharacterSystem.SetHealth(self, Health_Max) + self.AttackValue = self.BaseAttackValue * Param + self.PhysicalDefense = self.BasePhysicalDefense * Param1 + self.Gold = self.Gold * Param1 + self.exp = self.exp * Param1 +end + +function BP_MonsterUnseal:MulticastRPC_SpawnParticleSystem(TempLocation) + if TempLocation then + GameplayStatics.SpawnEmitterAtLocation(self, self.BlastParticle, TempLocation, Rotator.New(0, 0, 0), Vector.New(1, 1, 1), true) + end +end + +function BP_MonsterUnseal:ReceiveOnMonsterDeath() + MonsterBase.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.SkillEvilHandle then + EventSystem.StopTimer(self.SkillEvilHandle) + self.SkillEvilHandle = nil + return + end + else + self.ParticleSystem:SetVisibility(false) + end +end + +return BP_MonsterUnseal; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_MonsterWeaponRecasting.lua b/GZJ/Script/Blueprint/Monster/BP_MonsterWeaponRecasting.lua new file mode 100644 index 00000000..f35ada8a --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_MonsterWeaponRecasting.lua @@ -0,0 +1,104 @@ +---@class BP_MonsterWeaponRecasting_C:BP_MonsterChallenge_C +---@field ShieldParticle UParticleSystemComponent +---@field UAESkillManager UUAESkillManagerComponent +---@field ShieldValue float +---@field ShieldBreachParticle UParticleSystem +--Edit Below-- +--local BP_MonsterWeaponRecasting = {}; +local MonsterChallenge = require('Script.Blueprint.Monster.BP_MonsterChallenge') + +local BP_MonsterWeaponRecasting = setmetatable( + { + ID = 1003, + --TargetPlayerKey = -1, + MonsterName = "WeaponRecasting", + }, + { + __index = MonsterChallenge, + __metatable = MonsterChallenge + } +); + +function BP_MonsterWeaponRecasting:ReceiveBeginPlayEx() + MonsterChallenge.ReceiveBeginPlayEx(self) + if self:HasAuthority() then + self:AddSkillShield() + self:AddSkillBloodthirsty() + end +end + +function BP_MonsterWeaponRecasting:AddSkillBloodthirsty() + EventSystem.SetTimerLoop( + self, + function () + + self:GetController():GetBlackboardComponent():SetValueAsBool("IsSpeedIncrease", true) + if not self:GetController():GetBlackboardComponent():GetValueAsBool("IsSpeedIncrease") then + print("[SKYERROR] IsSpeedIncrease Setting Failed [true] : " .. tostring(self:GetController():GetBlackboardComponent():GetValueAsBool("IsSpeedIncrease"))) + end + EventSystem.SetTimer( + self, + function () + self:GetController():GetBlackboardComponent():SetValueAsBool("IsSpeedIncrease", false) + + end, + 5 + ) + end, + 15 + ) + +end +function BP_MonsterWeaponRecasting:AddSkillShield() + + self:AddModifyDamageDelegationFun( + "SkillShield", + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + if self.ShieldValue > 0 then + self.ShieldValue = self.ShieldValue - DamageAmount + if self.ShieldValue > 0 then + return 0 + else + --self.ShieldParticle:SetVisibility(false) + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SetParticleVisibility", false) + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SpawnParticleSystemAttach") + local GivePawnDamage = self.AttackValue + local CanDamagePlayers = self:GetCanDamagePlayer() + if CanDamagePlayers and table.hasValue(CanDamagePlayers, EventInstigator:K2_GetPawn()) then + self:MonsterApplyDamage(EventInstigator:K2_GetPawn(), GivePawnDamage) + end + return -self.ShieldValue + end + else + return DamageAmount + end + end + ) + self.SkillShieldHandle = EventSystem.SetTimerLoop( + self, + function () + + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_SetParticleVisibility", true) + self.ShieldValue = UGCSimpleCharacterSystem.GetHealthMax(self) / 2 + end, + 20 + ) + +end +function BP_MonsterWeaponRecasting:MulticastRPC_SpawnParticleSystemAttach() + GameplayStatics.SpawnEmitterAttached(self.ShieldBreachParticle, self.CapsuleComponent, "", VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, true) +end +function BP_MonsterWeaponRecasting:MulticastRPC_SetParticleVisibility(NewVisibility) + if self:HasAuthority() then return end + self.ShieldParticle:SetVisibility(NewVisibility) +end + +function BP_MonsterWeaponRecasting:ReceiveOnMonsterDeath() + MonsterChallenge.ReceiveOnMonsterDeath(self) + if self:HasAuthority() then + if self.SkillShieldHandle then EventSystem.StopTimer(self.SkillShieldHandle) self.SkillShieldHandle = nil return end + else + end +end + +return BP_MonsterWeaponRecasting; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_NormalMonster.lua b/GZJ/Script/Blueprint/Monster/BP_NormalMonster.lua new file mode 100644 index 00000000..f50dd544 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_NormalMonster.lua @@ -0,0 +1,44 @@ +---@class BP_NormalMonster_C:BP_MonsterBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +local BP_NormalMonster = {}; + +--[[ +function BP_NormalMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function BP_NormalMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_NormalMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_NormalMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_NormalMonster:GetAvailableServerRPCs() + return +end +--]] + +function BP_NormalMonster:GetGiveExp() + return 5 +end + +function BP_NormalMonster:GetDropRate() + return 95 +end + +return BP_NormalMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_TyrantMonster.lua b/GZJ/Script/Blueprint/Monster/BP_TyrantMonster.lua new file mode 100644 index 00000000..47e74451 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_TyrantMonster.lua @@ -0,0 +1,36 @@ +---@class BP_TyrantMonster_C:BP_MonsterBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +local BP_TyrantMonster = {}; + +--[[ +function BP_TyrantMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function BP_TyrantMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_TyrantMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_TyrantMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_TyrantMonster:GetAvailableServerRPCs() + return +end +--]] + +return BP_TyrantMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/BP_TyrantMonster_2.lua b/GZJ/Script/Blueprint/Monster/BP_TyrantMonster_2.lua new file mode 100644 index 00000000..9b833ed2 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_TyrantMonster_2.lua @@ -0,0 +1,111 @@ +---@class BP_TyrantMonster_2_C:BP_MonsterBoss_C +---@field UAESkillManager UUAESkillManagerComponent +---@field SphereShield UStaticMeshComponent +---@field ShieldValue float +--Edit Below-- +---@class BP_TyrantMonster_2_C:BP_MonsterBoss_C +---@field SphereShield UStaticMeshComponent +---@field UAESkillManager UUAESkillManagerComponent +---@field ShieldValue float +-- Edit Below-- + +local MonsterBoss = require('Script.Blueprint.Monster.BP_MonsterBoss') +-- local BP_TyrantMonster = { +-- ModifyDamageDelegation = {} +-- } +local BP_TyrantMonster = setmetatable( + { + --ModifyDamageDelegation = {} + }, + { + __index = MonsterBoss, + __metatable = MonsterBoss + } +); +-- function BP_TyrantMonster:GetReplicatedProperties() +-- return "RemoveModifyDamageDelegation", "AddModifyDamageDelegationFun" +-- end + +--[[ +function BP_TyrantMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_TyrantMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_TyrantMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_TyrantMonster:GetAvailableServerRPCs() + return +end +--]] + +-- function BP_TyrantMonster:GetGiveExp() +-- return 5 +-- end + +-- function BP_TyrantMonster:GetDropRate() +-- return 95 +-- end + +--[[ + +time: 20230312 +name: LanTian +describe: +添加一个ModifyDamageDelegation的委托table,作用于重载的伤害修改函数BP_CharacterModifyDamage,便利所有的修改委托函数后返回最终伤害值 +AddModifyDamageDelegationFun : 添加一个委托 +RemoveModifyDamageDelegation : 移除一个委托 + +]] -- + +-- ---@field BP_CharacterModifyDamage:fun(DamageAmount:float,DamageEvent:FDamageEvent,EventInstigator:AController,DamageCauser:AActor):float +-- function BP_TyrantMonster:BP_CharacterModifyDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser) +-- print("DamageModify: " .. DamageAmount) +-- if self.ModifyDamageDelegation then +-- for k, fun in pairs(self.ModifyDamageDelegation) do +-- print("DamageModifyBegin: " .. DamageAmount) +-- DamageAmount = fun(DamageAmount, DamageEvent, EventInstigator, DamageCauser) +-- print("DamageModifyFunFinsh: " .. DamageAmount) + +-- end +-- end + +-- if DamageAmount < 0 then +-- DamageAmount = 0 +-- end + +-- return DamageAmount +-- end + +-- function BP_TyrantMonster:RemoveModifyDamageDelegation(Key) +-- if self.ModifyDamageDelegation[Key] then +-- self.ModifyDamageDelegation[Key] = nil +-- return true +-- end +-- return false +-- end + +-- ---@param Key string +-- ---@param DelegationFun fun(DamageAmount:float,DamageEvent:FDamageEvent,EventInstigator:AController,DamageCauser:AActor):float +-- ---@return bool +-- function BP_TyrantMonster:AddModifyDamageDelegationFun(Key, DelegationFun) +-- if self.ModifyDamageDelegation[Key] then +-- return false +-- else +-- self.ModifyDamageDelegation[Key] = DelegationFun +-- return true +-- end +-- end + +return BP_TyrantMonster; diff --git a/GZJ/Script/Blueprint/Monster/BP_VenomMonster.lua b/GZJ/Script/Blueprint/Monster/BP_VenomMonster.lua new file mode 100644 index 00000000..6cc07639 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/BP_VenomMonster.lua @@ -0,0 +1,36 @@ +---@class BP_VenomMonster_C:BP_MonsterBase_C +---@field UAESkillManager UUAESkillManagerComponent +--Edit Below-- +local BP_VenomMonster = {}; + +--[[ +function BP_VenomMonster:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function BP_VenomMonster:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_VenomMonster:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_VenomMonster:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_VenomMonster:GetAvailableServerRPCs() + return +end +--]] + +return BP_VenomMonster; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/MonsterDesc.lua b/GZJ/Script/Blueprint/Monster/MonsterDesc.lua new file mode 100644 index 00000000..a336f8a8 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/MonsterDesc.lua @@ -0,0 +1,146 @@ +MonsterDesc = MonsterDesc or {} +EMonster = { + Base = 0; + Common = 1; + Boss = 2; + ExerciseRoom = 3; +} + +MonsterDesc[1001] = { + Name = "MonsterInherit_1", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterInherit_1.BP_MonsterInherit_1_C'), + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1002] = { + Name = "MonsterInherit_2", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterInherit_2.BP_MonsterInherit_2_C') , + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1003] = { + Name = "WeaponRecasting", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterWeaponRecasting.BP_MonsterWeaponRecasting_C') , + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1004] = { + Name = "SkillMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterSkillMonster.BP_MonsterSkillMonster_C') , + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1005] = { + Name = "AccessoryMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterAccessoryMonster.BP_MonsterAccessoryMonster_C') , + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1006] = { + Name = "GoldEfficiencyMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterGoldEfficiencyMonster.BP_MonsterGoldEfficiencyMonster_C') , + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1007] = { + Name = "ExerciseRoom", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterExerciseRoom.BP_MonsterExerciseRoom_C') , + type = EMonster.ExerciseRoom, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1008] = { + Name = "GoldMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterGoldMonster.BP_MonsterGoldMonster_C') , + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1009] = { + Name = "GradeBreakthrough", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterGradeBreakthrough.BP_MonsterGradeBreakthrough_C') , + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1010] = { + Name = "LittleMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterLittleMonster.BP_MonsterLittleMonster_C') , + type = EMonster.Base, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[1100] = { + Name = "Unseal", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterUnseal.BP_MonsterUnseal_C') , + type = EMonster.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } +} +MonsterDesc[10001] = { + Name = "Boorish", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossBoorish.BP_BossBoorish_C') , + type = EMonster.Boss, + SkillDescs = { + {SkillName = "蛮身诀", SkillDesc = "防御值加成提高400%,每秒提升1%防御值加成"}, + {SkillName = "蛮跃击", SkillDesc = "闪到跟前,然后对敌人周围600码所有敌人造成攻击力*(5+防御值加成)的伤害"} + } +} +MonsterDesc[10002] = { + Name = "Charm", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossCharm.BP_BossCharm_C') , + type = EMonster.Boss, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_14.Icon_UGC_monster_14'), + SkillDescs = { + {SkillName = "魅魂咒", SkillDesc = "每攻击5次,下次攻击会释放哀嚎,恐惧所有敌人2s,使敌人无法行动"}, + {SkillName = "魅之泽", SkillDesc = "在所有敌人释放一个500码范围沼泽,2s后造成法术强度*5的法术伤害,对被恐惧的敌人造成伤害提升200%"} + } +} +MonsterDesc[10003] = { + Name = "Moment", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossMoment.BP_BossMoment_C') , + type = EMonster.Boss, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_14.Icon_UGC_monster_14'), + SkillDescs = { + {SkillName = "瞬影击", SkillDesc = "移动速度+180,攻击造成300%伤害,攻击距离降低50%"}, + {SkillName = "瞬暴风", SkillDesc = "快速转动身体,2秒后自身周围产生一个400码范围的风暴,风暴内的敌人移动速度降低60%,且每0.2秒攻击一次风暴内的敌人"} + } +} +MonsterDesc[10004] = { + Name = "Spring", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossSpring.BP_BossSpring_C') , + type = EMonster.Boss, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_14.Icon_UGC_monster_14'), + SkillDescs = { + {SkillName = "春之术", SkillDesc = "每秒回复6%最大生命值,且进入战斗20秒后,生命值高于80%时,造成伤害提升500%"}, + {SkillName = "春物语", SkillDesc = "进入低语状态,每0.5秒向所有敌人脚下释放一个范围300码的雨泽,1秒后造成当前生命值的伤害"} + } +} \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/MonsterParam.lua b/GZJ/Script/Blueprint/Monster/MonsterParam.lua new file mode 100644 index 00000000..0f02e18c --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/MonsterParam.lua @@ -0,0 +1,1612 @@ +MonsterParam = MonsterParam or {} + +-- 表格读取Python Code +--[[ +def Write(Path:str, content:str): + file = open(Path, 'w') + file.write(content) +]] -- +--[[ +#coding=utf-8 +import xlwings as xw +import WriteTxt +app = xw.App(visible=False, add_book=False) +wb = app.books.open("C://Users//VSPO//Desktop//MonsterParam.xlsx") +sheet = wb.sheets[0] # 选择第0个表单,也可以使用wb.sheets['sheet1']指定sheet的名字 +EndIndex = '61' + +MonsterType = sheet.range('B2:B' + EndIndex).value +MonsterName = sheet.range('S2:S' + EndIndex).value +Health = sheet.range('G2:G' + EndIndex).value +AttackValue = sheet.range('H2:H' + EndIndex).value +PhysicalDefense = sheet.range('I2:I' + EndIndex).value +MovementSpeed = sheet.range('L2:L' + EndIndex).value +Gold = sheet.range('O2:O' + EndIndex).value +exp = sheet.range('P2:P' + EndIndex).value +KillPoint = sheet.range('Q2:Q' + EndIndex).value + +LifeTime = sheet.range('R2:R' + EndIndex).value + + + +def AddLevelChild(index:int, child:str, IsFinish = False) -> str: + if IsFinish: + return "[" + str(index) + "] = {\n" + child + "\n}\n" + return "[" + str(index) + "] = {\n" + child + "\n},\n" + +def AddMonsterName(Name:str, Params:str) -> str: + return "MonsterParam[\"" + Name + "\"] = {\n" + Params + "}\n\n" + +def AddDate(Data:str, IsFinish:bool) -> str: + if IsFinish: + return Data + "\n" + return Data + ",\n" + +def AddGradeParam(Params:str)->str: + return "GradeParam = {\n" + Params + "}" + +def IsNoneReturnZero(Targetstr): + if Targetstr == None: + return "0" + return str(Targetstr) + +def IsNoneReturnNegativeOne(Targetstr): + if Targetstr == None: + return "-1" + return str(Targetstr) + +if __name__ == "__main__": + NowName = MonsterName[0] + level = 1 + MonsterParam = """""" + MonsterParamChild = "" + for index in range(len(MonsterName)): + if NowName != MonsterName[index]: + MonsterParam += AddMonsterName(NowName, AddGradeParam(MonsterParamChild)) + level = 1 + MonsterParamChild = "" + + NowName = MonsterName[index] + levelstr = "" + levelstr += AddDate("Health = " + IsNoneReturnZero(Health[index]), False) + levelstr += AddDate("AttackValue = " + IsNoneReturnZero(AttackValue[index]), False) + levelstr += AddDate("PhysicalDefense = " + IsNoneReturnZero(PhysicalDefense[index]), False) + levelstr += AddDate("MovementSpeed = " + IsNoneReturnZero(MovementSpeed[index]), False) + levelstr += AddDate("Gold = " + IsNoneReturnZero(Gold[index]), False) + levelstr += AddDate("exp = " + IsNoneReturnZero(exp[index]), False) + levelstr += AddDate("KillPoint = " + IsNoneReturnZero(KillPoint[index]), False) + levelstr += AddDate("LifeTime = " + IsNoneReturnNegativeOne(LifeTime[index]), True) + + MonsterParamChild += AddLevelChild(level, levelstr) + + level += 1 + + MonsterParam += AddMonsterName(NowName, AddGradeParam(MonsterParamChild)) + level = 0 + MonsterParamChild = "" + WriteTxt.Write("C://Users//VSPO//Desktop//MonsterParams.txt", MonsterParam) + # print(MonsterParam) + +]] -- + +--[[ +-- MonsterParam["MonsterInherit_1"] = { +-- GradeParam = { +-- [1] = { +-- Health = 1500, +-- AttackValue = 150, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [2] = { +-- Health = 3750, +-- AttackValue = 300, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [3] = { +-- Health = 9375, +-- AttackValue = 625, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [4] = { +-- Health = 23438, +-- AttackValue = 938, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [5] = { +-- Health = 58594, +-- AttackValue = 1674, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [6] = { +-- Health = 146484, +-- AttackValue = 3255, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- } +-- }, +-- exp = 50, +-- KillPoint = 10, +-- LifeTime = 60 +-- } +-- MonsterParam["MonsterInherit_2"] = { +-- GradeParam = { +-- [1] = { +-- Health = 1500, +-- AttackValue = 150, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [2] = { +-- Health = 3750, +-- AttackValue = 300, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [3] = { +-- Health = 9375, +-- AttackValue = 625, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [4] = { +-- Health = 23438, +-- AttackValue = 938, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [5] = { +-- Health = 58594, +-- AttackValue = 1674, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [6] = { +-- Health = 146484, +-- AttackValue = 3255, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- } +-- }, +-- exp = 50, +-- KillPoint = 10, +-- LifeTime = 60 +-- } + +-- MonsterParam["WeaponRecasting"] = { +-- GradeParam = { +-- [1] = { +-- Health = 10000, +-- AttackValue = 500, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [2] = { +-- Health = 20000, +-- AttackValue = 1000, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [3] = { +-- Health = 40000, +-- AttackValue = 2000, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [4] = { +-- Health = 80000, +-- AttackValue = 4000, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- } +-- }, +-- SkillParam = { +-- bloodthirsty = { +-- delay = 15, +-- duration = 5 +-- }, +-- Shield = { +-- delay = 15 +-- } +-- }, +-- exp = 10, +-- KillPoint = 2, +-- LifeTime = 120 +-- } +-- MonsterParam["SkillMonster"] = { +-- GradeParam = { +-- [1] = { +-- Health = 5000, +-- AttackValue = 250, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [2] = { +-- Health = 10000, +-- AttackValue = 500, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [3] = { +-- Health = 20000, +-- AttackValue = 1000, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [4] = { +-- Health = 40000, +-- AttackValue = 2000, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- } +-- }, +-- exp = 10, +-- KillPoint = 2, +-- LifeTime = 90 +-- } +-- MonsterParam["AccessoryMonster"] = { +-- GradeParam = { +-- [1] = { +-- Health = 5000, +-- AttackValue = 250, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [2] = { +-- Health = 10000, +-- AttackValue = 500, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [3] = { +-- Health = 20000, +-- AttackValue = 1000, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [4] = { +-- Health = 40000, +-- AttackValue = 2000, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- } +-- }, +-- exp = 10, +-- KillPoint = 2, +-- LifeTime = 90 +-- } + +-- MonsterParam["GoldEfficiencyMonster"] = { +-- GradeParam = { +-- [1] = { +-- Health = 3000, +-- AttackValue = 150, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [2] = { +-- Health = 6000, +-- AttackValue = 300, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [3] = { +-- Health = 12000, +-- AttackValue = 600, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- }, +-- [4] = { +-- Health = 24000, +-- AttackValue = 1200, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 0 +-- } +-- }, +-- exp = 10, +-- KillPoint = 2, +-- LifeTime = 60 +-- } +-- MonsterParam["ExerciseRoom"] = { +-- GradeParam = { +-- [1] = { +-- Health = 100, +-- AttackValue = 10, +-- MagicValue = 600, +-- PhysicalDefense = 1, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 125, +-- }, +-- [2] = { +-- Health = 2800, +-- AttackValue = 1415, +-- MagicValue = 1200, +-- PhysicalDefense = 1, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 150, +-- }, +-- [3] = { +-- Health = 12500, +-- AttackValue = 6250, +-- MagicValue = 2400, +-- PhysicalDefense = 1, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 180, +-- }, +-- [4] = { +-- Health = 55000, +-- AttackValue = 27500, +-- MagicValue = 4800, +-- PhysicalDefense = 1, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 216, +-- } +-- }, +-- exp = 65, +-- KillPoint = 1, +-- LifeTime = -1 +-- } +-- MonsterParam["GoldMonster"] = { +-- GradeParam = { +-- [1] = { +-- Health = 1000, +-- AttackValue = 50, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 1200 +-- }, +-- [2] = { +-- Health = 2000, +-- AttackValue = 100, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 3000 +-- }, +-- [3] = { +-- Health = 4000, +-- AttackValue = 200, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 8400 +-- }, +-- [4] = { +-- Health = 8000, +-- AttackValue = 400, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 12000 +-- } +-- }, +-- exp = 10, +-- KillPoint = 2, +-- LifeTime = 60 +-- } +-- MonsterParam["GradeBreakthrough"] = { +-- GradeParam = { +-- [1] = { +-- Health = 3500, +-- AttackValue = 350, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [2] = { +-- Health = 8750, +-- AttackValue = 875, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [3] = { +-- Health = 21875, +-- AttackValue = 1458, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [4] = { +-- Health = 54688, +-- AttackValue = 2188, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [5] = { +-- Health = 136719, +-- AttackValue = 3906, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- }, +-- [6] = { +-- Health = 341797, +-- AttackValue = 7595, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- } +-- }, +-- exp = 50, +-- KillPoint = 10, +-- LifeTime = 60 +-- } + +-- MonsterParam["LittleMonster"] = { +-- GradeParam = { +-- [1] = { +-- Health = 776, +-- AttackValue = 94, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [2] = { +-- Health = 4399, +-- AttackValue = 157., +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [3] = { +-- Health = 11644, +-- AttackValue = 283, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [4] = { +-- Health = 17977, +-- AttackValue = 369, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [5] = { +-- Health = 24310, +-- AttackValue = 455, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [6] = { +-- Health = 30643.30203, +-- AttackValue = 541, +-- MagicValue = 541, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [7] = { +-- Health = 36358.379265, +-- AttackValue = 568, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [8] = { +-- Health = 42073.4565, +-- AttackValue = 596, +-- MagicValue = 1200, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [9] = { +-- Health = 47788.533735, +-- AttackValue = 623, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [10] = { +-- Health = 50029.34643, +-- AttackValue = 726.666666666667, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [11] = { +-- Health = 52270.159125, +-- AttackValue = 830.333333333334, +-- MagicValue = 2400, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- }, +-- [12] = { +-- Health = 81400.72416, +-- AttackValue = 934, +-- MagicValue = 4800, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 20 +-- } +-- }, +-- exp = 5, +-- KillPoint = 10, +-- LifeTime = -1 +-- } +-- MonsterParam["Unseal"] = { +-- GradeParam = { +-- [1] = { +-- Health = 1500, +-- AttackValue = 150, +-- MagicValue = 600, +-- PhysicalDefense = 50, +-- MegicDefense = 50, +-- MovementSpeed = 385, +-- Gold = 200 +-- } +-- }, +-- exp = 50, +-- KillPoint = 10, +-- LifeTime = 60 +-- } + +-- MonsterParam["Boss"] = { +-- GradeParam = { +-- [1] = { +-- Health = 116436, +-- AttackValue = 2830, +-- MagicValue = 8490, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 1000 +-- }, +-- [2] = { +-- Health = 306433, +-- AttackValue = 5410, +-- MagicValue = 16230, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 3000 +-- }, +-- [3] = { +-- Health = 477885, +-- AttackValue = 6230, +-- MagicValue = 18690, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- }, +-- [4] = { +-- Health = 814007, +-- AttackValue = 9340, +-- MagicValue = 28020, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- } +-- }, +-- exp = 500, +-- KillPoint = 100, +-- LifeTime = -1 +-- } + +-- MonsterParam["Boorish"] = { +-- GradeParam = { +-- [1] = { +-- Health = 116436, +-- AttackValue = 2830, +-- MagicValue = 8490, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 1000 +-- }, +-- [2] = { +-- Health = 306433, +-- AttackValue = 5410, +-- MagicValue = 16230, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 3000 +-- }, +-- [3] = { +-- Health = 477885, +-- AttackValue = 6230, +-- MagicValue = 18690, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- }, +-- [4] = { +-- Health = 814007, +-- AttackValue = 9340, +-- MagicValue = 28020, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- } +-- }, +-- exp = 500, +-- KillPoint = 100, +-- LifeTime = -1 +-- } + +-- MonsterParam["Charm"] = { +-- GradeParam = { +-- [1] = { +-- Health = 116436, +-- AttackValue = 2830, +-- MagicValue = 8490, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 1000 +-- }, +-- [2] = { +-- Health = 306433, +-- AttackValue = 5410, +-- MagicValue = 16230, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 3000 +-- }, +-- [3] = { +-- Health = 477885, +-- AttackValue = 6230, +-- MagicValue = 18690, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- }, +-- [4] = { +-- Health = 814007, +-- AttackValue = 9340, +-- MagicValue = 28020, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- } +-- }, +-- exp = 500, +-- KillPoint = 100, +-- LifeTime = -1 +-- } + +-- MonsterParam["Moment"] = { +-- GradeParam = { +-- [1] = { +-- Health = 116436, +-- AttackValue = 2830, +-- MagicValue = 8490, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 1000 +-- }, +-- [2] = { +-- Health = 306433, +-- AttackValue = 5410, +-- MagicValue = 16230, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 3000 +-- }, +-- [3] = { +-- Health = 477885, +-- AttackValue = 6230, +-- MagicValue = 18690, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- }, +-- [4] = { +-- Health = 814007, +-- AttackValue = 9340, +-- MagicValue = 28020, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- } +-- }, +-- exp = 500, +-- KillPoint = 100, +-- LifeTime = -1 +-- } + +-- MonsterParam["Spring"] = { +-- GradeParam = { +-- [1] = { +-- Health = 116436, +-- AttackValue = 2830, +-- MagicValue = 8490, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 1000 +-- }, +-- [2] = { +-- Health = 306433, +-- AttackValue = 5410, +-- MagicValue = 16230, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 3000 +-- }, +-- [3] = { +-- Health = 477885, +-- AttackValue = 6230, +-- MagicValue = 18690, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- }, +-- [4] = { +-- Health = 814007, +-- AttackValue = 9340, +-- MagicValue = 28020, +-- PhysicalDefense = 1000, +-- MegicDefense = 1000, +-- MovementSpeed = 385, +-- Gold = 6000 +-- } +-- }, +-- exp = 500, +-- KillPoint = 100, +-- LifeTime = -1 +-- } +]] -- + +MonsterParam["MonsterInherit_1"] = { + GradeParam = { + [1] = { + Health = 1736.0, + AttackValue = 1007.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [2] = { + Health = 16556.0, + AttackValue = 4518.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [3] = { + Health = 113472.0, + AttackValue = 17344.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [4] = { + Health = 340417.0, + AttackValue = 26016.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [5] = { + Health = 1021250.0, + AttackValue = 39024.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [6] = { + Health = 3063750.0, + AttackValue = 58537.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + } + } +} + +MonsterParam["MonsterInherit_2"] = { + GradeParam = { + [1] = { + Health = 1736.0, + AttackValue = 1007.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [2] = { + Health = 16556.0, + AttackValue = 4518.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [3] = { + Health = 113472.0, + AttackValue = 17344.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [4] = { + Health = 340417.0, + AttackValue = 26016.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [5] = { + Health = 1021250.0, + AttackValue = 39024.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [6] = { + Health = 3063750.0, + AttackValue = 58537.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + } + } +} + +MonsterParam["GradeBreakthrough"] = { + GradeParam = { + [1] = { + Health = 1289.0, + AttackValue = 496.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [2] = { + Health = 26045.0, + AttackValue = 2013.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [3] = { + Health = 99234.0, + AttackValue = 5272.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [4] = { + Health = 267418.0, + AttackValue = 9739.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [5] = { + Health = 581667.0, + AttackValue = 18323.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + }, + [6] = { + Health = 1702083.0, + AttackValue = 34688.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + + } + } +} + +MonsterParam["Unseal"] = { + GradeParam = { + [1] = { + Health = 3500.0, + AttackValue = 615.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 200.0, + exp = 50.0, + KillPoint = 10.0, + LifeTime = 60.0 + } + } +} + +MonsterParam["GoldMonster"] = { + GradeParam = { + [1] = { + Health = 897.0, + AttackValue = 231.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 1200.0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 30.0 + + }, + [2] = { + Health = 1495.0, + AttackValue = 369.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 3000.0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 30.0 + + }, + [3] = { + Health = 2990.0, + AttackValue = 615.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 8400.0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 30.0 + + }, + [4] = { + Health = 5980.0, + AttackValue = 1844.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 12000.0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 30.0 + + } + } +} + +MonsterParam["GoldEfficiencyMonster"] = { + GradeParam = { + [1] = { + Health = 1289.0, + AttackValue = 310.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 60.0 + + }, + [2] = { + Health = 2148.0, + AttackValue = 496.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 60.0 + + }, + [3] = { + Health = 4296.0, + AttackValue = 826.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 60.0 + + }, + [4] = { + Health = 8592.0, + AttackValue = 2479.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 60.0 + + } + } +} + +MonsterParam["AccessoryMonster"] = { + GradeParam = { + [1] = { + Health = 10125.0, + AttackValue = 759.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 90.0 + + }, + [2] = { + Health = 16874.0, + AttackValue = 1214.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 90.0 + + }, + [3] = { + Health = 33749.0, + AttackValue = 2023.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 90.0 + + }, + [4] = { + Health = 67498.0, + AttackValue = 6069.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 90.0 + + } + } +} + +MonsterParam["SkillMonster"] = { + GradeParam = { + [1] = { + Health = 10125.0, + AttackValue = 759.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 90.0 + + }, + [2] = { + Health = 16874.0, + AttackValue = 1214.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 90.0 + + }, + [3] = { + Health = 33749.0, + AttackValue = 2023.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 90.0 + + }, + [4] = { + Health = 67498.0, + AttackValue = 6069.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 90.0 + + } + } +} + +MonsterParam["WeaponRecasting"] = { + GradeParam = { + [1] = { + Health = 15187.0, + AttackValue = 1138.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 120.0 + + }, + [2] = { + Health = 25312.0, + AttackValue = 1821.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 120.0 + + }, + [3] = { + Health = 50623.0, + AttackValue = 3035.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 120.0 + + }, + [4] = { + Health = 101246.0, + AttackValue = 9104.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 10.0, + KillPoint = 2.0, + LifeTime = 120.0 + + } + } +} + +MonsterParam["ExerciseRoom"] = { + GradeParam = { + [1] = { + Health = 100.0, + AttackValue = 10.0, + PhysicalDefense = 1.0, + MovementSpeed = 385.0, + Gold = 125.0, + exp = 65.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [2] = { + Health = 7652.0, + AttackValue = 1050.0, + PhysicalDefense = 1.0, + MovementSpeed = 385.0, + Gold = 150.0, + exp = 65.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [3] = { + Health = 76276.0, + AttackValue = 4736.0, + PhysicalDefense = 1.0, + MovementSpeed = 385.0, + Gold = 180.0, + exp = 65.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [4] = { + Health = 176965.0, + AttackValue = 9535.0, + PhysicalDefense = 1.0, + MovementSpeed = 385.0, + Gold = 216.0, + exp = 65.0, + KillPoint = 1.0, + LifeTime = -1 + + } + } +} + +MonsterParam["LittleMonster"] = { + GradeParam = { + [1] = { + Health = 1125.0, + AttackValue = 616.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [2] = { + Health = 2894.0, + AttackValue = 1007.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [3] = { + Health = 5754.0, + AttackValue = 1756.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [4] = { + Health = 11026.0, + AttackValue = 2636.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [5] = { + Health = 19581.0, + AttackValue = 3826.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [6] = { + Health = 29713.0, + AttackValue = 4869.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [7] = { + Health = 50850.0, + AttackValue = 7104.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [8] = { + Health = 60983.0, + AttackValue = 8635.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [9] = { + Health = 95286.0, + AttackValue = 11257.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [10] = { + Health = 117977.0, + AttackValue = 14302.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [11] = { + Health = 198772.0, + AttackValue = 18522.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + }, + [12] = { + Health = 232733.0, + AttackValue = 22061.0, + PhysicalDefense = 50.0, + MovementSpeed = 385.0, + Gold = 20.0, + exp = 5.0, + KillPoint = 1.0, + LifeTime = -1 + + } + } +} + +MonsterParam["Boss"] = { + GradeParam = { + [1] = { + Health = 86306.0, + AttackValue = 5853.0, + PhysicalDefense = 1000.0, + MovementSpeed = 385.0, + Gold = 1000.0, + exp = 500.0, + KillPoint = 100.0, + LifeTime = -1 + + }, + [2] = { + Health = 445697.0, + AttackValue = 16231.0, + PhysicalDefense = 1000.0, + MovementSpeed = 385.0, + Gold = 3000.0, + exp = 500.0, + KillPoint = 100.0, + LifeTime = -1 + + }, + [3] = { + Health = 1429284.0, + AttackValue = 37523.0, + PhysicalDefense = 1000.0, + MovementSpeed = 385.0, + Gold = 6000.0, + exp = 500.0, + KillPoint = 100.0, + LifeTime = -1 + + }, + [4] = { + Health = 3490989.0, + AttackValue = 61741.0, + PhysicalDefense = 1000.0, + MovementSpeed = 385.0, + Gold = 0, + exp = 0, + KillPoint = 0, + LifeTime = -1 + + } + } +} + +MonsterTalkContent = { + [5] = { Content = "击败我,突破等级,获得武器奖励" }; + [7] = { Content = "击败我,获得金币奖励" }; + [8] = { Content = "击败我,提高金币获取效率" }; + [10] = { Content = "击败我,获得技能" }; +} \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/Skill/BP_Whirlwind.lua b/GZJ/Script/Blueprint/Monster/Skill/BP_Whirlwind.lua new file mode 100644 index 00000000..43b1281d --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/Skill/BP_Whirlwind.lua @@ -0,0 +1,68 @@ +---@class BP_Whirlwind_C:AActor +---@field ParticleSystem UParticleSystemComponent +---@field DefaultSceneRoot USceneComponent +---@field Speed float +--Edit Below-- +local BP_Whirlwind = { + EnableMove = false +}; + + +function BP_Whirlwind:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); + if self:HasAuthority() then + + EventSystem.SetTimer( + self, + function() + UnrealNetwork.CallUnrealRPC_Multicast(self, "MulticastRPC_EnableMove") + --self.EnableMove = true + end, + 1.0 + ) + + EventSystem.SetTimer( + self, + function() + self:K2_DestroyActor() + end, + 2.0 + ) + end + +end + + + +function BP_Whirlwind:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); + --self:GetOwner() + if not self:HasAuthority() and self.EnableMove then + local MoveLocation = VectorHelper.Add(self:K2_GetActorLocation(), VectorHelper.MulNumber(self:GetActorForwardVector(), self.Speed * DeltaTime)) + self:K2_SetActorLocation(MoveLocation, false, nil, false) + end +end + +function BP_Whirlwind:MulticastRPC_EnableMove() + self.EnableMove = true +end + +--[[ +function BP_Whirlwind:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_Whirlwind:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_Whirlwind:GetAvailableServerRPCs() + return +end +--]] + +return BP_Whirlwind; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/Skill/Boss/Action/SkillAction_BossBoorish.lua b/GZJ/Script/Blueprint/Monster/Skill/Boss/Action/SkillAction_BossBoorish.lua new file mode 100644 index 00000000..d5fc5039 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/Skill/Boss/Action/SkillAction_BossBoorish.lua @@ -0,0 +1,122 @@ +---@class SkillAction_BossBoorish_C:UAESkillActionBP +---@field TargetParticle UParticleSystem +--Edit Below-- + +local SkillAction_BossBoorish = {}; + + +function SkillAction_BossBoorish:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); + --self:OnRealDoAction() + print("SkillAction_BossBoorish_Server: " .. tostring(self:HasAuthority())) +end + + +--[[ +function SkillAction_BossBoorish:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function SkillAction_BossBoorish:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function SkillAction_BossBoorish:GetReplicatedProperties() + return +end +--]] + +--[[ +function SkillAction_BossBoorish:GetAvailableServerRPCs() + return +end +--]] +function SkillAction_BossBoorish:OnRealDoAction() + print("SkillAction_BossBoorish_" .. "OnRealDoAction_".."1") + if UGCGameSystem.IsServer() then + print("SkillAction_BossBoorish_" .. "OnRealDoAction_".."2") + local PlayerLocation, MoveLocation = self:GetMovablePosition() + print("SkillAction_BossBoorish_" .. "OnRealDoAction_".."3") + if(MoveLocation) then + print("SkillAction_BossBoorish_" .. "OnRealDoAction_".."4") + self:GetOwnerPawn():K2_SetActorLocation(MoveLocation, false, nil, false) + print("SkillAction_BossBoorish_" .. "OnRealDoAction_".."5") + PlayerLocation.Z = 0 + MoveLocation.Z = 0 + self:GetOwnerPawn():K2_SetActorRotation(KismetMathLibrary.MakeRotFromX(VectorHelper.Sub(MoveLocation, PlayerLocation)), false) + print("SkillAction_BossBoorish_" .. "OnRealDoAction_".."6") + end + + end + + return true +end + +function SkillAction_BossBoorish:OnUpdateAction(DeltaSeconds) + --print("SkillAction_BossBoorish_" .. "OnUpdateAction_".."1") + return true +end + +function SkillAction_BossBoorish:OnReset() + return true +end + +function SkillAction_BossBoorish:EnableDash(IsEnable) + print("SkillAction_BossBoorish_" .. "EnableDash_".."1") + +end + +function SkillAction_BossBoorish:GetEightpoint(Length) + local Angle45Len = math.sqrt(2) / 2 + return { + Vector.New(Length, 0, 0), + Vector.New(-Length, 0, 0), + Vector.New(0, Length, 0), + Vector.New(0, -Length, 0), + Vector.New(Length * Angle45Len, Length * Angle45Len, 0), + Vector.New(-Length * Angle45Len, Length * Angle45Len, 0), + Vector.New(Length * Angle45Len, -Length * Angle45Len, 0), + Vector.New(-Length * Angle45Len, -Length * Angle45Len, 0) + } +end + +function SkillAction_BossBoorish:GetMovablePosition() + local ResLocation = {} + local ArenaPlayers = UGCGameSystem.GameState:GetPlayersInArena() + if ArenaPlayers then + for k, ArenaPlayer in pairs(ArenaPlayers) do + local PawnHelfHeight = ArenaPlayer.Capsule.CapsuleHelfHeight + local Playerlocation = ArenaPlayer:K2_GetActorLocation() + Playerlocation.Z = Playerlocation.Z + self:GetOwnerPawn().Capsule.CapsuleHelfHeight - PawnHelfHeight + 5 + + local EightLocation = self:GetEightpoint(350) + for k, AddLocation in pairs(EightLocation) do + local Beginlocation = VectorHelper.Add(Playerlocation, AddLocation) + + local ObjectTypes = {EObjectTypeQuery.ObjectTypeQuery1} + local bHit, HitResult = KismetSystemLibrary.CapsuleTraceSingleForObjects( + self, Beginlocation, Beginlocation, + self:GetOwnerPawn().Capsule.CapsuleRadius, self:GetOwnerPawn().Capsule.CapsuleHelfHeight, + ObjectTypes, false, nil, EDrawDebugTrace.None, + nil, true, nil, nil, nil + ) + if not bHit then + table.insert(ResLocation[ArenaPlayer], VectorHelper.ToLuaTable(Beginlocation)) + end + end + + end + end + if ResLocation then + local TempPlayer, Locations = ResLocation[math.random(1, #ResLocation)] + return VectorHelper.ToLuaTable(TempPlayer:K2_GetActorLocation()), Locations[math.random(1, #Locations)] + else + return nil + end +end + +return SkillAction_BossBoorish; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/Skill/Boss/Action/SkillAction_Boss_CharmCurse.lua b/GZJ/Script/Blueprint/Monster/Skill/Boss/Action/SkillAction_Boss_CharmCurse.lua new file mode 100644 index 00000000..11f8116f --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/Skill/Boss/Action/SkillAction_Boss_CharmCurse.lua @@ -0,0 +1,33 @@ +local SkillAction_Boss_CharmCurse = {}; + +--[[ +function SkillAction_Boss_CharmCurse:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function SkillAction_Boss_CharmCurse:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function SkillAction_Boss_CharmCurse:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function SkillAction_Boss_CharmCurse:GetReplicatedProperties() + return +end +--]] + +--[[ +function SkillAction_Boss_CharmCurse:GetAvailableServerRPCs() + return +end +--]] + +return SkillAction_Boss_CharmCurse; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V2.lua b/GZJ/Script/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V2.lua new file mode 100644 index 00000000..6cafcee9 --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V2.lua @@ -0,0 +1,68 @@ +---@class SkillAction_TakeFanDamage_V2_C:UAESkillActionBP +---@field Offset FVector +---@field Angle float +---@field Radius float +---@field InDamageScale float +--Edit Below-- +local SkillAction_TakeFanDamage_V2 = {}; + +function SkillAction_TakeFanDamage_V2:OnRealDoAction() + if UGCGameSystem.IsServer() then + print(string.format("[SkillAction_TakeFanDamage_V2:OnRealDoAction] 受到伤害")) + local OwnerPawnLocation = self:GetOwnerPawn():K2_GetActorLocation() + local OwnerPawnForward = self:GetOwnerPawn():GetActorForwardVector() + local CentrePostion = VectorHelper.Add(OwnerPawnLocation,self.Offset) + local PendingTargets = TableHelper.DeepCopyTable(UGCGameSystem.GameState:GetPlayersInArena()) + table.insert(PendingTargets, UGCGameSystem.GameState:GetCrystal()) + + if PendingTargets then + for _, Target in pairs(PendingTargets) do + if Target then + local TargetPawnPosition = Target:K2_GetActorLocation() + if self:CheckFan(CentrePostion, self.Radius, self.Angle, TargetPawnPosition, OwnerPawnForward) then + if self:GetOwnerPawn().MonsterApplyDamage then + self:GetOwnerPawn():MonsterApplyDamage(Target, self:GetOwnerPawn():GetAttack() * self.InDamageScale) + else + print(string.format("[SkillAction_TakeFanDamage_V2:OnRealDoAction] MonsterApplyDamage is nil")) + end + end + else + print(string.format("[SkillAction_TakeFanDamage_V2:OnRealDoAction] Target is nil")) + end + end + end + + end + return true +end +---@field CentrePostion Vector +---@field radius float +---@field Angle float +---@field TargetPosition Vector +---@field Forward Vector +---@return bool +function SkillAction_TakeFanDamage_V2:CheckFan(CentrePostion, radius, Angle, TargetPosition, Forward) + if (VectorHelper.GetDistance2D(TargetPosition, CentrePostion) > radius) then + return false + end + local TargetVector = VectorHelper.Sub(TargetPosition, CentrePostion) + local TargetAngle = self:IncludedAngle(TargetVector, Forward) + if TargetAngle <= Angle then + return true + end + return false +end + +function SkillAction_TakeFanDamage_V2:IncludedAngle(vector1, vector2) + -- 两个向量的点积 + local dot = VectorHelper.Dot(vector1, vector2) + -- 两个向量的模长乘积 + local length = VectorHelper.Length(vector1) * VectorHelper.Length(vector2) + -- 夹角弧度 + local radian = math.acos(dot / length) + -- 夹角角度 + local degree = radian * 180 / math.pi + + return degree +end +return SkillAction_TakeFanDamage_V2; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V3.lua b/GZJ/Script/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V3.lua new file mode 100644 index 00000000..ba3c2c6b --- /dev/null +++ b/GZJ/Script/Blueprint/Monster/Skill/Monster/Action/SkillAction_TakeFanDamage_V3.lua @@ -0,0 +1,74 @@ +---@class SkillAction_TakeFanDamage_V3_C:UAESkillActionBP +---@field Offset FVector +---@field Angle float +---@field Radius float +--Edit Below-- +local SkillAction_TakeFanDamage_V3 = {}; + +function SkillAction_TakeFanDamage_V3:OnRealDoAction() + if UGCGameSystem.IsServer() then + if self:GetOwnerPawn().TargetPlayerKey == nil or self:GetOwnerPawn().TargetPlayerKey < 0 then return end + + local OwnerPawnLocation = self:GetOwnerPawn():K2_GetActorLocation() + local OwnerPawnForward = self:GetOwnerPawn():GetActorForwardVector() + local CentrePostion = VectorHelper.Add(OwnerPawnLocation,self.Offset) + local TargetPlayer = UGCGameSystem.GetPlayerPawnByPlayerKey(self:GetOwnerPawn().TargetPlayerKey) + + if TargetPlayer then + if not table.hasValue(UGCGameSystem.GameState:GetPlayersInArena(), TargetPlayer) then + local TargetPawnPosition = TargetPlayer:K2_GetActorLocation() + if self:CheckFan(CentrePostion, self.Radius, self.Angle, TargetPawnPosition, OwnerPawnForward) then + if self:GetOwnerPawn().AttackValue then + self:GetOwnerPawn():MonsterApplyDamage(TargetPlayer, self:GetOwnerPawn():GetAttack()) + else + -- print(string.format("[SkillAction_TakeFanDamage_V3:OnRealDoAction] AttackValue is nil")) + end + else + --print(string.format("[SkillAction_TakeFanDamage_V3:OnRealDoAction] CheckFan is nil")) + end + else + -- print(string.format("[SkillAction_TakeFanDamage_V3:OnRealDoAction] TargetPlayer in UGCGameSystem.GameState:GetPlayersInArena()")) + end + else + -- print(string.format("[SkillAction_TakeFanDamage_V3:OnRealDoAction] TargetPlayer is nil")) + end + + end + return true +end +---@field CentrePostion Vector +---@field radius float +---@field Angle float +---@field TargetPosition Vector +---@field Forward Vector +---@return bool +function SkillAction_TakeFanDamage_V3:CheckFan(CentrePostion, radius, Angle, TargetPosition, Forward) + if (VectorHelper.GetDistance2D(TargetPosition, CentrePostion) > radius) then + return false + end + local TargetVector = VectorHelper.Sub(TargetPosition, CentrePostion) + -- local TargetVector = VectorHelper.Sub(CentrePostion, TargetPosition) + + local TargetAngle = self:IncludedAngle(TargetVector, Forward) + if TargetAngle <= Angle then + return true + end + return false +end + +function SkillAction_TakeFanDamage_V3:IncludedAngle(vector1, vector2) + vector1.Z = 0 + vector2.Z = 0 + + -- 两个向量的点积 + local dot = VectorHelper.Dot(vector1, vector2) + -- 两个向量的模长乘积 + local length = VectorHelper.Length(vector1) * VectorHelper.Length(vector2) + -- 夹角弧度 + local radian = math.acos(dot / length) + -- 夹角角度 + local degree = radian * 180 / math.pi + + return degree +end +return SkillAction_TakeFanDamage_V3; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Player/BP_PlayerController.lua b/GZJ/Script/Blueprint/Player/BP_PlayerController.lua new file mode 100644 index 00000000..73ecf09a --- /dev/null +++ b/GZJ/Script/Blueprint/Player/BP_PlayerController.lua @@ -0,0 +1,1746 @@ +---@class BP_PlayerController_C:BP_UGCPlayerController_C +--Edit Below-- +UGCGameSystem.UGCRequire('Script.Common.ue_enum_custom') +UGCGameSystem.UGCRequire('Script.Common.ue_struct_custom') +UGCGameSystem.UGCRequire('Script.Global.Global') + +local BP_PlayerController = { + IsRunOnServer = false, + IsDead = false, + IsDeadInArena = false, + + HasSelectedBaseAttribute = false, + HasSelectedGameDifficulty = false, + HasSelectedDefaultWeapon = false, + + CameraManager = nil, + BackpackComp = nil, --背包组件 + + ---@type table> + ActiveSkillNameList = {}, --技能映射表 + + ResourceGrade = 1, -- 资源等级 + + SealInfo = { + -- 次数 + Times = 1, + -- 击杀数(该数据会依次增加,然后在50的时候如果没有点击封印,就一直是50,当点击封印的时候,该数值重置,死了之后也不会改变) + KillCount = 0, + -- 怪物是否存活,如果不存活说明没有挑战成功,需要继续挑战,即显示挑战按钮 + IsMonsterAlive = false, + }, + + -- 背包数据 + ItemMap = { + [0] = {}, --枪口 + [1] = {}, --握把 + [2] = {}, --弹夹 + [3] = {}, --枪托 + [4] = {}, --准镜 + [5] = {}, --技能书 + [6] = {}, --重铸石 + [7] = {}, --置换石 + }, + + ItemActorClass = nil, + + AutoPickIntervalTime = { + Current = 0, + LimitTime = 1, + }; + + IsAutoRightNowPick = false; + + + ------------- 拾取操作 ------------- + -- 场景中的物品 + AllItemActors = { + [ETeleportType.InHangupRoom] = {}, + [ETeleportType.InArena] = {}, + }; + -- 拾取距离 + PickupDistance = 1000; + --自动拾取距离 + AutoPickupDistance = 200; + + -- 初始化的界面 + InitialWidget = nil; +}; + +function BP_PlayerController:GetReplicatedProperties() + return + "ActiveSkillNameList", + "ResourceGrade", + "ItemMap" +end + +function BP_PlayerController:GetAvailableServerRPCs() + return + "ServerRPC_SelectGameDifficulty", + --"ServerRPC_SelectBaseAttribute", + --"ServerRPC_SelectDefaultWeapon", + --"ServerRPC_AddWeapon", + "ServerRPC_AddItemsByThisID", + "ServerRPC_DiscardItems", + -- "ClientRPC_ShowGeneralNoticeTips", + -- "ClientRPC_ShowNoticeTips", + -- "Client_MulticastRPC_PlayWeaponFireEffect", + -- "ClientRPC_BuyTechSucceed", + "ServerRPC_BuyTech", + "ServerRPC_ChallengeSucceed", + + -- 背包 + "ServerRPC_GenerateItem", + "ServerRPC_SellItem", + "ServerRPC_ResetItem", + "ServerRPC_GenerateAllItem", + "ServerRPC_OnBreach", + -- "ClientRPC_ShowPickUpItems", + --"ClientRPC_UpdateBackpackItemMap", + + --武器 + "ServerRPC_AddFittingItem", + "ServerRPC_ChangeCurrentWeaponId", + "ServerRPC_ResetWeapon", -- 重铸 + + --释放技能 + "ServerRPC_GiveSkill", + "ServerRPC_OnCastSkill", + -- "ClientRPC_SetupSkillButton", + -- "ClientRPC_SetSkillCD", + --突破 + "ServerRPC_StartSpawnBreachMonster", + -- "ClientRPC_SetBreachButtonVisible", + + -- 封印 + "ServerRPC_StartSpawnSealMonster", + "ServerRPC_ApplyRewards", + -- "ClientRPC_SetSealRewards", + -- "ClientRPC_SetSealButtonVisible", + + -- 传承 + "ServerRPC_Inherit", + -- "ClientRPC_UpdateInherit", + + -- 资源等级 + "ServerRPC_SetResourceGrade", + + -- 背包 + --"ClientRPC_ReplicatePawn", + + --新手引导 + -- "ClientRPC_TriggerGuide", + -- "ClientRPC_RemoveGuide", + "ServerRPC_RecordForceGuideInfo", + + -- 生成练功房掉落物 + "ServerRPC_AddExerciseItems", + -- "ClientRPC_SpawnExerciseDropItem", + -- "ClientRPC_ShowInitialPanel", + + -- "Client_UpdateArchiveData", + "ServerRPC_CloseInitialNotice", + + -- GM命令 + "ServerRPC_GM_AddItems", + "ServerRPC_GM_AddCoinPoint", + "ServerRPC_GM_AddTechPoint", + "ServerRPC_GM_ChangeTimeScale" + + + ; +end + +function BP_PlayerController:ReceiveBeginPlay() + BP_PlayerController.SuperClass.ReceiveBeginPlay(self) + + self.IsRunOnServer = UGCGameSystem.IsServer() + + -- 不要自动切换相机 + self.bNeedResetCameraOnPossess = false + + self.ItemActorClass = UE.LoadClass(BPClassPath.PickupItemClass) + + if self.IsRunOnServer then + self.OnCharacterDeadDelegate:Add(self.ServerOnCharacterDead, self) + self.PlayerControllerRespawnedDelegate:Add(self.ServerOnRespawn, self) + else + self.PlayerControllerRespawnedDelegate:Add(self.ClientOnRespawn, self) + self.OnCharacterDeadDelegate:Add(self.ClientOnCharacterDead, self) + + GameDataManager:SetLocalPlayerController(self) + + local CommandManager = require('Script.Manager.CommandQueneManager') + CommandManager:AddInitCommand(self, self.Client_Init) + end +end + +function BP_PlayerController:ReceiveEndPlay() + if self.IsRunOnServer then + self.PlayerControllerRespawnedDelegate:Remove(self.ServerOnRespawn, self) + self.OnCharacterDeadDelegate:Remove(self.ServerOnCharacterDead, self) + else + self.OnCharacterDeadDelegate:Remove(self.ClientOnCharacterDead, self) + self.PlayerControllerRespawnedDelegate:Remove(self.ClientOnRespawn, self) + end + + BP_PlayerController.SuperClass.ReceiveEndPlay(self) +end + +--function BP_PlayerController:Possess(InPawn) +-- -- 同步一下 Pawn +-- self.SuperClass:Possess(InPawn) +-- --UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_ReplicatePawn", InPawn) +--end + +function BP_PlayerController:ReceiveTick(DeltaTime) + if not self.IsRunOnServer then + if self.bHasInitClient == nil and self.PlayerKey ~= 0 and self.IsDead == false then + local CommandManager = require('Script.Manager.CommandQueneManager') + CommandManager.bPlayerCtrlReady = true + self.bHasInitClient = true + UE.Log("[BP_PlayerController] *** UGCPlayerController Tick Init Ready PlayerKey:%s", self.PlayerKey) + end + end + + if self:HasAuthority() == false then + -- 自动拾取 + self.AutoPickIntervalTime.Current = self.AutoPickIntervalTime.Current + DeltaTime + if self.AutoPickIntervalTime.Current > self.AutoPickIntervalTime.LimitTime then + self.AutoPickIntervalTime.Current = self.AutoPickIntervalTime.Current - self.AutoPickIntervalTime.LimitTime + self:RequestPickupNearbyItems(false) + end + end +end + +function BP_PlayerController:Client_Init() + UE.Log("[BP_PlayerController] Client_Init PlayerKey=%d", self.PlayerKey); + + GameDataManager:SetLocalPlayerController(self) + GameDataManager:SetLocalPlayerState(self.PlayerState) + + -- 不要自动切换相机 + self.bAutoManageActiveCameraTarget = false + -- 初始化摄像机 + self:SetupCamera(0.2) + -- 初始化UI + local UIManager = require('Script.Manager.UIManager') + UIManager:Init() + + require('Script.Manager.NewPlayerGuideManager') + NewPlayerGuideManager:Init() + + local GameStage = UGCGameSystem.GameState.GameStage + if GameStage > EGameStage.WaitForPlayer then + if self.InitialWidget then + self.InitialWidget:SetVisibility(ESlateVisibility.Collapsed) + end + end + + if GameStage == EGameStage.GameReady then + if UGCGameSystem.GameState.GameReadyStage >= 0 and UGCGameSystem.GameState.GameReadyStageRemainTime > 0 then + for _, Config in pairs(Tables.GameReadyStageConfig) do + if Config.Stage == UGCGameSystem.GameState.GameReadyStage then + UIManager:ShowPanel(Config.TriggerUI) + break + end + end + end + end + + self.CheckForceGuidePanelHandle = EventSystem.SetTimerLoop(self, function() + local GameState = UGCGameSystem.GameState + if GameState and GameState.GameDifficulty > 0 then + local PS = GameDataManager.GetLocalPlayerState() + if PS then + if PS:GetNeedTriggerForceGuide() then + if PS.ForceGuideInfo ~= nil and PS.ForceGuideInfo.CurStepIndex > 0 then + local ForceGuidePanel = UIManager:GetPanel(EUIType.ForceGuide) + if ForceGuidePanel and UE.IsValid(ForceGuidePanel) then + ForceGuidePanel:InitByRecordedInfo(PS.ForceGuideInfo) + end + end + end + EventSystem.StopTimer(self.CheckForceGuidePanelHandle) + end + end + end, 0.5) +end + +function BP_PlayerController:ServerOnRespawn(InPlayerController) + if InPlayerController == self then + UE.Log("[BP_PlayerController:ServerOnRespawn] PlayerKey=%d", self.PlayerKey) + + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + + if PlayerPawn and UE.IsValid(PlayerPawn) and UE.IsValid(PlayerState) then + UGCPawnSystem.SetIsInvincible(PlayerPawn, true) + + EventSystem.SetTimer(self, function() + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + PlayerPawn:OnPlayerRespawned(PlayerState, self) + UGCPawnSystem.SetIsInvincible(PlayerPawn, false) + end, 1.0) + end + end +end + +function BP_PlayerController:ClientOnRespawn(InPlayerController) + if InPlayerController == self then + UE.Log("[BP_PlayerController:ClientOnRespawn] PlayerKey=%d", self.PlayerKey) + + GameDataManager:SetLocalPlayerController(self) + self.IsDead = false + end +end + +function BP_PlayerController:ServerOnCharacterDead(InCharacter) + if InCharacter.PlayerKey == self.PlayerKey then + UE.Log("[BP_PlayerController:ServerOnCharacterDead] PlayerKey=%d", self.PlayerKey) + end +end + +function BP_PlayerController:ClientOnCharacterDead(InCharacter) + if InCharacter.PlayerKey == self.PlayerKey then + UE.Log("[BP_PlayerController:ClientOnCharacterDead] PlayerKey=%d", self.PlayerKey) + + self.bHasInitClient = nil + self.IsDead = true + + CommandQueneManager.bHasInit = false + CommandQueneManager.bPlayerCtrlReady = false + CommandQueneManager:RemoveInitCommand(InCharacter) + + ----记录强引导的当前步数 + local PS = GameDataManager.GetLocalPlayerState() + if PS and PS:GetNeedTriggerForceGuide() then + local ForceGuidePanel = UIManager:GetPanel(EUIType.ForceGuide) + if ForceGuidePanel and UE.IsValid(ForceGuidePanel) and ForceGuidePanel.CurStepIndex > 0 then + UnrealNetwork.CallUnrealRPC(self, self, "ServerRPC_RecordForceGuideInfo", self.PlayerKey, + ForceGuidePanel.CurStepIndex, ForceGuidePanel.CurValidStepIndex, ForceGuidePanel.bIsInStepProgress, ForceGuidePanel.StepPendingList) + end + end + + UIManager:DestroyAllPanel(true) + UIManager:ShowNotice(ECustomNoticeType.RespawnNotice, 5) + + NewPlayerGuideManager:RemoveAllGuide() + end +end + +function BP_PlayerController:SetupCamera(DelayTime) + local CameraManagerClass = require('Script.Manager.CameraManager') + self.CameraManager = CameraManagerClass.New(self) + EventSystem.SetTimer(self, + function() + self:GetCameraManager():SetupOverlookCamera() + end, DelayTime) +end + +function BP_PlayerController:GetCameraManager() + return self.CameraManager +end + +function BP_PlayerController:OnRep_ResourceGrade() + if EventSystem and GameDataManager.GetLocalPlayerController() == self then + EventSystem:SendEvent(EventType.OnResourceGradeChanged, self.ResourceGrade) + end +end + +function BP_PlayerController:ServerRPC_RecordForceGuideInfo(PlayerKey, CurStepIndex, ValidStepIndex, bIsInStepProgress, StepPendingList) + if not self:HasAuthority() then return end + local PS = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + if PS then + PS.ForceGuideInfo = { + CurStepIndex = CurStepIndex, + ValidStepIndex = ValidStepIndex, + bIsInStepProgress = bIsInStepProgress, + StepPendingList = StepPendingList, + } + UnrealNetwork.RepLazyProperty(PS, "ForceGuideInfo") + end +end + +function BP_PlayerController:ServerRPC_SelectGameDifficulty(Index) + if self.HasSelectedGameDifficulty then return end + + if self:HasAuthority() then + UE.Log("[BP_PlayerController:ServerRPC_SelectGameDifficulty] Index = " .. tostring(Index)) + if UGCGameSystem.GameState.PlayerDifficultySelection[Index] == nil then + UGCGameSystem.GameState.PlayerDifficultySelection[Index] = 1 + else + UGCGameSystem.GameState.PlayerDifficultySelection[Index] = UGCGameSystem.GameState.PlayerDifficultySelection[Index] + 1 + end + self.HasSelectedGameDifficulty = true + end +end + +function BP_PlayerController:ServerRPC_SelectBaseAttribute(Index) + if self.HasSelectedBaseAttribute then return end + + if self:HasAuthority() then + local AttributeInfo = { + PlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(self:GetPlayerCharacterSafety()), + AttributeIndex = Index, + } + table.insert(UGCGameSystem.GameState.PlayerAttributeSelection, AttributeInfo) + self.HasSelectedBaseAttribute = true + end +end + +function BP_PlayerController:ServerRPC_SelectDefaultWeapon(ID) + if self.HasSelectedDefaultWeapon then + UE.LogError("[BP_PlayerController:ServerRPC_SelectDefaultWeapon] HasSelected") + return + end + + if self:HasAuthority() then + UE.Log("[BP_PlayerController:ServerRPC_SelectDefaultWeapon] ID = " .. tostring(ID)) + self:ServerRPC_AddWeapon(ID, self.PlayerKey) + self.HasSelectedDefaultWeapon = true + end +end + +-- 添加武器唯一入口 +function BP_PlayerController:ServerRPC_AddWeapon(ID, InPlayerKey) + if self:HasAuthority() then + if InPlayerKey ~= self.PlayerKey then + return + end + + print(string.format('[BP_PlayerController:ServerRPC_AddWeapon] 添加武器')) + + if InPlayerKey ~= nil then + UE.Log("[BP_PlayerController:ServerRPC_AddWeapon] 开始添加武器, Id = %d, PlayerKey = %d", ID, InPlayerKey) + end + + local ControlledCharacter = self:GetPlayerCharacterSafety() + if not UE.IsValid(ControlledCharacter) then + return + end + + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + + local ControlledWeapon = ControlledCharacter.WeaponActor + --新添加的武器 Id 将会被显示 + if UE.IsValid(ControlledWeapon) then + ControlledWeapon:SetWeaponID(ID) + PlayerState:AddWeapon(ID) + else + -- 这说明武器里面啥都没有 + AsyncLoadTools:LoadObject(BPClassPath.WeaponBaseActor, + function(WeaponClass) + if UE.IsValid(self) and UE.IsValid(WeaponClass) and UE.IsValid(PlayerState) then + ControlledWeapon = UGCGameSystem.SpawnActor(self, WeaponClass, ControlledCharacter:K2_GetActorLocation(), ControlledCharacter:K2_GetActorRotation(), VectorHelper.ScaleOne(), nil) + ControlledCharacter.WeaponActor = ControlledWeapon + ControlledCharacter.OnWeaponSpawnedDelegate(ControlledCharacter) + ControlledWeapon:SetWeaponID(ID) + ControlledWeapon:SetOwnerCharacter(ControlledCharacter) + PlayerState:AddWeapon(ID) + end + end) + end + end +end + +--改变当前武器 +function BP_PlayerController:ServerRPC_ChangeCurrentWeaponId(InWeaponId) + UE.Log("[BP_PlayerController:ServerRPC_ChangeCurrentWeaponId] 开始执行改变当前武器操作") + local ControlledCharacter = self:GetPlayerCharacterSafety() + local WC = ControlledCharacter:GetWeaponComponent() + if WC ~= nil then + if WC:FindWeaponById(InWeaponId) ~= nil then + WC:SetCurrentWeapon(InWeaponId) + else + UE.Log("[BP_PlayerController:ServerRPC_ChangeCurrentWeaponId] 找不到该武器,请检查一下") + end + end +end + +function BP_PlayerController:ServerRPC_ResetWeapon(InWeaponId) + UE.Log("[BP_PlayerController:ServerRPC_ResetWeapon] Weapon Id = %d", InWeaponId) + -- 移除石头 + local ItemData = { + ItemID = 31000, + ItemCount = -1 + } + local bSuccess = self:UpdateBackpackItem(ItemData) + if not bSuccess then + UE.Log("[BP_PlayerController:ServerRPC_ResetWeapon] 移除重铸石失败,请检查一下") + return + end + + -- 移除成功了,开始重铸玩家武器属性 + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + bSuccess = PlayerState:ResetWeapon(InWeaponId) + + if not bSuccess then + local Item = { + ItemID = 31000, + ItemCount = 1 + } + bSuccess = self:UpdateBackpackItem(Item) + if not bSuccess then + UE.Log("[BP_PlayerController:ServerRPC_ResetWeapon] 添加重铸石失败,请检查原因") + end + end +end + +function BP_PlayerController:ServerRPC_GenerateItem(InItemList) + -- 先生成一个 + self:GenerateItem(InItemList) +end + +-- 添加物品的时候 +function BP_PlayerController:ServerRPC_AddItemsByThisID(InThisIDList) + if self:HasAuthority() then + local GameState = UGCGameSystem.GameState + if not UE.IsValid(GameState) then + UE.Log("[ServerRPC_AddItemsByThisID] invalid gamestate") + return + end + local ThisIDList = InThisIDList + + local HadItemIds = {} + for i, v in pairs(GameState.GlobalDropItemActorList) do + table.insert(HadItemIds, i) + end + + log_tree('Common GlobalDropItemActorList = ', HadItemIds) + log_tree('Common ThisIDList = ', ThisIDList) + + local Func = function(InGameState, InThisIdList) + local PendingActorThisIDs = {} + local AddItemIds = {} + local LogStr = "[ServerRPC_AddItemsByThisID] Add: " + for _, InThisID in pairs(InThisIdList) do + local ItemActor = InGameState.GlobalDropItemActorList[InThisID] + if UE.IsValid(ItemActor) and ItemActor.bIsPicking == false then + local ItemID = ItemActor:GetItemID() + local ItemCount = ItemActor:GetItemCount() + ItemActor:SetIsPicking(true) + -- 检查是否添加进去了 + local AddCount = self:UpdateItemMap(ItemID, ItemCount) + + -- 当添加数量或者移除数量跟原先的一样的时候才会销毁 + if AddCount == ItemActor:GetItemCount() then + LogStr = LogStr .. string.format("{ItemID = %d, Count = %d},", ItemID, AddCount) + table.insert(PendingActorThisIDs, InThisID) + table.insert(AddItemIds, ItemID) + end + end + end + UE.Log(LogStr) + return PendingActorThisIDs, AddItemIds + end + + local PendingActorThisIDs, AddItemIds = Func(GameState, ThisIDList) + + UE.Log("[ServerRPC_AddItemsByThisID] PendingActorThisIDs Length = %d", #PendingActorThisIDs) + for _, ThisID in pairs(PendingActorThisIDs) do + local ThisActor = GameState.GlobalDropItemActorList[ThisID] + if UE.IsValid(ThisActor) and ThisActor.bIsPicking then + ThisActor:K2_DestroyActor() + else + print(string.format('[BP_PlayerController:ServerRPC_AddItemsByThisID] 无法找到 This ID = %d', ThisID)) + end + GameState.GlobalDropItemActorList[ThisID] = nil + end + + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_ShowPickUpItems", AddItemIds) + end +end + +-- 往武器上添加配件 +function BP_PlayerController:ServerRPC_AddFittingItem(InWeaponId, InFittingItemId) + UE.Log("[BP_PlayerController:ServerRPC_AddFittingItem] 添加配件") + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + PlayerState:AddWeaponFittingItem(InWeaponId, InFittingItemId) +end + +function BP_PlayerController:ServerRPC_RemoveFittingItem(InFittingItemId) + UE.Log("[BP_PlayerController:ServerRPC_RemoveFittingItem] 开始执行") + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + PlayerState:RemoveWeaponFittingItem(InFittingItemId) +end + +-- Server 该生成仅生成在玩家周围 +function BP_PlayerController:CreateItem(InPlayer, InItemData, IsFromDiscard) + print(string.format('[BP_PlayerController:CreateItem] 执行')) + if InPlayer == nil then + InPlayer = self:GetPlayerCharacterSafety() + end + + -- TODO + local PlayerVec = VectorHelper.ToLuaTable(InPlayer:K2_GetActorLocation()) + --local DropPos = VectorHelper.Sub(PlayerVec, { X = 0, Y = 0, Z = 0 }) + local DropPos = PlayerVec + + log_tree("PlayerVec = ", PlayerVec) + + UE.Log("DiscardItemId: %d, DiscardCount = %d", InItemData.ItemID, InItemData.ItemCount) + if self.Pawn.IsInArena then + print(string.format('[BP_PlayerController:CreateItem] 在场景中丢弃')) + EventSystem:SendEvent(EventType.SpawnDropItemByID, InItemData.ItemID, InItemData.ItemCount, DropPos, InPlayer:K2_GetActorRotation(), self.PlayerKey, IsFromDiscard) + else + -- 练功房通知生成一个 + print(string.format('[BP_PlayerController:CreateItem] 在练功房丢弃')) + local ItemData = { + ItemID = InItemData.ItemID, + Count = InItemData.ItemCount + } + self:RequestExerciseDropItem(self.PlayerKey, DropPos, VectorHelper.RotZero(), ItemData, false, IsFromDiscard) + end +end + +-- 丢弃物品 +function BP_PlayerController:ServerRPC_DiscardItems(InDiscardItems) + if self:HasAuthority() then + print(string.format('[BP_PlayerController:ServerRPC_DiscardItems] 执行')) + local GameState = UGCGameSystem.GameState + if not UE.IsValid(GameState) then + UE.Log("[ServerRPC_DiscardItems] invalid gamestate") + return + end + + local LogStr = "[ServerRPC_DiscardItems] Discard: " + local DiscardItemIDs = {} + for ItemID, Count in pairs(InDiscardItems) do + -- 看一下此时的type + local DiscardCount = self:UpdateItemMap(ItemID, Count) + + -- 检查一下 Discard + UE.Log('[BP_PlayerController:ServerRPC_DiscardItems] Discard Count = %d', DiscardCount) + if DiscardCount == Count then + LogStr = LogStr .. string.format("{ItemID = %d, Count = %d},", ItemID, Count) + if DiscardCount < 0 then + DiscardCount = -DiscardCount + end + DiscardItemIDs[ItemID] = DiscardCount + else + print(string.format('[BP_PlayerController:ServerRPC_DiscardItems] 丢弃物品数量不对,本应该丢弃:%d,实际上丢弃:%d', Count, DiscardCount)) + end + end + UE.Log(LogStr) + + for DiscardItemID, DiscardCount in pairs(DiscardItemIDs) do + local ItemData = { + ItemID = DiscardItemID, + ItemCount = DiscardCount + } + self:CreateItem(self.Pawn, ItemData, true) + end + + LogStr = "[ServerRPC_DiscardItems] Result ItemMap = " + local CurItemMap = self:GetItemMap() + for ItemType, ItemList in pairs(CurItemMap) do + for i, v in pairs(ItemList) do + LogStr = LogStr .. string.format("{ItemType = %d, ItemID = %d, Count = %d},", ItemType, i, v) + end + end + UE.Log(LogStr) + end +end + +--function BP_PlayerController:ClientRPC_UpdateBackpackItemMap(InItemMap) +-- if self:HasAuthority() then return end +-- +-- --此处需要知道死亡之后自己是谁,每次获取即可 +-- self:ClientUpdateItemMap(InItemMap) +--end + +function BP_PlayerController:ClientRPC_UpdateWeaponById(InWeaponType) + +end + +-- Server, 直接输入{ItemID, ±ItemCount},返回添加或者移除的是否是这些东西 +function BP_PlayerController:UpdateBackpackItem(InData) + local GameState = UGCGameSystem.GameState + if not UE.IsValid(GameState) then + return + end + local DiscardCount = self:UpdateItemMap(InData.ItemID, InData.ItemCount) + local bSuccess = DiscardCount == InData.ItemCount + return bSuccess +end + +-- Server +function BP_PlayerController:UpdateMoney(InDelta) + local ControlledCharacter = self:GetPlayerCharacterSafety() + if not UE.IsValid(ControlledCharacter) then + return false + end + local PlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(ControlledCharacter) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + + return PlayerState:UpdateCoinPoint(InDelta) +end + +function BP_PlayerController:ServerRPC_SellItem(InData) + if InData.ItemCount > 0 then + InData.ItemCount = -InData.ItemCount + end + local bSuccess = self:UpdateBackpackItem(InData) + + --售卖东西 + if bSuccess then + local Money = math.abs(Tables.QualityInfo[GetItemQualityLevel(InData.ItemID)][2] * InData.ItemCount) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + bSuccess = PlayerState ~= nil and UE.IsValid(PlayerState) and PlayerState:AddCoinPointDirectly(Money) + if bSuccess then + UE.Log("[BP_PlayerController:ServerRPC_SellItem] 售卖 Item: Id = %d 成功", InData.ItemID) + end + else + UE.Log("[BP_PlayerController:ServerRPC_SellItem] 售卖 Item: Id = %d 失败", InData.ItemID) + end +end + +--执行置换 +function BP_PlayerController:ServerRPC_ResetItem(InData) + --这是要移除的,说明开始转换了 + UE.Log('[BP_PlayerController:ServerRPC_ResetItem] 开始 Rest Item') + --if GetItemQualityLevel(InData.ItemID) >= EQualityType.Super then + -- -- 再做一次限制 + -- return + --end + --开始移除 + local TheCount = InData.ItemCount + InData.ItemCount = - TheCount + local bSuccess = self:UpdateBackpackItem(InData) + if bSuccess then + -- 开始添加物品,如果添加不下了,就生成一个 + if GetItemGrantTypeById(InData.ItemID) == EDropItemSet.SkillBooks then + local SkillId = GetSkillIdByItemId(InData.ItemID) + local Skills = {} + for i = 9, 32 do + if SkillId == i then + else + table.insert(Skills, i) + end + end + local Skill = Skills[math.random(1, table.getCount(Skills))] + Skill = 20000 + Skill * 100 + InData.ItemID % 100 + local ItemData = { + ItemID = Skill, + ItemCount = TheCount + } + bSuccess = self:UpdateBackpackItem(ItemData) + else + local TempArr1 = { 1, 2, 3, 4, 5 } + local TempArr2 = { 1, 2, 3, 4, 5, 6 } + local CurrentItemType = GetItemTypeByItemId(InData.ItemID) + 1 + local CurrentWeaponType = GetItemWeaponTypeByItemId(InData.ItemID) + local RandomNum = math.random(1, 4) + table.remove(TempArr1, CurrentItemType) + + InData.ItemID = InData.ItemID - CurrentItemType * 1000 + TempArr1[RandomNum] * 1000 + table.remove(TempArr2, CurrentWeaponType) + RandomNum = math.random(1, 5) + InData.ItemID = InData.ItemID - CurrentWeaponType * 100 + TempArr2[RandomNum] * 100 + InData.ItemCount = TheCount + bSuccess = self:UpdateBackpackItem(InData) + end + + if bSuccess then + local ItemData = { + ItemID = 32000, + ItemCount = - TheCount + } + self:UpdateBackpackItem(ItemData) + end + end +end + +function BP_PlayerController:ClientRPC_ShowGeneralNoticeTips(InText, ShowAlert, ShowTime) + if self:HasAuthority() then return end + UIManager:ShowGeneralNotice(InText, ShowAlert, ShowTime) +end + + +function BP_PlayerController:ClientRPC_ShowNoticeTips(InNoticeType, ...) + if self:HasAuthority() then return end + UIManager:ShowNotice(InNoticeType, ...) +end + +function BP_PlayerController:Client_MulticastRPC_PlayWeaponFireEffect() + if self:HasAuthority() then return end + + local ControlledCharacter = self:GetPlayerCharacterSafety() + if UE.IsValid(ControlledCharacter) then + local ControlledWeapon = ControlledCharacter.WeaponActor + if ControlledWeapon then + ControlledWeapon:PlayFireEffect() + end + end +end + +--- 购买科技 +function BP_PlayerController:ServerRPC_BuyTech(TechID) + if self:HasAuthority() then + local TargetPlayerState = self:GetCurPlayerState() + if TargetPlayerState.TechBuyNum[TechID] ~= nil then + if Tables.Tech[TechID].bLimit and Tables.Tech[TechID].LimitNum <= TargetPlayerState.TechBuyNum[TechID] then + UE.Log("BP_PlayerController_Fun_" .. "ServerRPC_BuyTech_" .. "BugFailure") + return + end + local NeedKillPoint = Tables.Tech[TechID].KillingPoints(TargetPlayerState.TechBuyNum[TechID] + 1) + local Temp = 0 + for i, v in pairs(TargetPlayerState.Attributes) do + Temp = Temp + v.KillPoint_Cost + end + NeedKillPoint = NeedKillPoint * (1 + Temp) + if TargetPlayerState.KillPoint.Current >= NeedKillPoint then + TargetPlayerState.KillPoint.Current = TargetPlayerState.KillPoint.Current - NeedKillPoint + TargetPlayerState.TechBuyNum[TechID] = TargetPlayerState.TechBuyNum[TechID] + 1 + Tables.Tech[TechID].ChangeTechParam(self) + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_BuyTechSucceed", TechID, TargetPlayerState.TechBuyNum[TechID]) + else + NoticeTipsTools.ServerGeneralNoticeTips(self.PlayerKey, "科技点不足", true) + end + end + end +end + +function BP_PlayerController:ClientRPC_BuyTechSucceed(TechID, BuyNum) + EventSystem:SendEvent(EventType.PlayerBuyTechSucceed, TechID, BuyNum) +end + +function BP_PlayerController:ServerRPC_ChallengeSucceed(ChallengeInfoKey, PlayerKey, ChallengeMonsterType, MonsterLevel, bSkipCheckCD) + --TODO:检测是否该挑战在CD中 + if Tables.ChallengeInfo[ChallengeInfoKey] == nil then + UE.Log("[BP_PlayerController:ServerRPC_ChallengeSucceed] [Error] invalid ChallengeInfoKey") + return + end + + local TargetPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + local NowTime = UGCGameSystem.GameState.GameDuration + + if not bSkipCheckCD then + local LastChallengeTime = TargetPlayerState.ChallengeMonsterTime[ChallengeInfoKey].LastChallengeTime + local CoolingTime = TargetPlayerState.ChallengeMonsterTime[ChallengeInfoKey].CoolingTime + if NowTime - LastChallengeTime < CoolingTime then return end + end + + TargetPlayerState.ChallengeMonsterTime[ChallengeInfoKey].LastChallengeTime = NowTime + + local TargetSpawner = UGCGameSystem.GameState:GetSpawnerByPlayerKey(PlayerKey) + if UE.IsValid(TargetSpawner) then + TargetSpawner:StartSpawnChallengeMonster(ChallengeMonsterType, MonsterLevel) + NoticeTipsTools.ServerGeneralNoticeTips(PlayerKey, "挑战怪已生成在练功房,请尽快击败获取奖励!", true, 4.0) + end +end +--------------------------------------------- 技能相关逻辑 ---------------------------------------------------- + +function BP_PlayerController:ServerRPC_GiveSkill(SkillName, SkillSlot, SkillLevel) + UE.Log("[BP_PlayerController:ServerRPC_GiveSkill] [%s] [%s] GiveSkill:%d, Slot:%s, Level:%s", self.PlayerKey, self.PlayerName, SkillName, tostring(SkillSlot), tostring(SkillLevel)) + + --- OldSkillId == -1: 失败出错 + --- OldSkillId == 0: 当前是空插槽 + --- OldSkillId > 0: 当前是空插槽 + local OldSkillId = self:GiveSkill(SkillName, SkillSlot, SkillLevel) + + if SkillLevel == nil then + return + end + + if OldSkillId == -1 then + print(string.format('[BP_PlayerController:ServerRPC_GiveSkill] 添加错误')) + elseif OldSkillId == 0 then + -- 说明是空白插槽 + if SkillLevel == nil then + return + end + + local InSkillId = 20000 + SkillName * 100 + SkillLevel * 10 + local AddItemCount = self:UpdateItemMap(InSkillId, -1) + if AddItemCount == -1 then + print(string.format('[BP_PlayerController:ServerRPC_GiveSkill] 添加好啦')) + else + print(string.format('[BP_PlayerController:ServerRPC_GiveSkill] 添加失败')) + end + else + -- 说明是替换技能 + -- 塞回背包 + local InSkillId = 20000 + SkillName * 100 + SkillLevel * 10 + local AddItemCount = self:UpdateItemMap(InSkillId, -1) + if AddItemCount == -1 then + AddItemCount = self:UpdateItemMap(OldSkillId, 1) + if AddItemCount == 1 then + print(string.format('[BP_PlayerController:ServerRPC_GiveSkill] 成功啦~')) + else + -- 检查背包是否满了 + if self:IsBackpackFull(EItemType.SkillBook) then + -- 丢到地面上 + self:CreateItem(nil, { ItemID = OldSkillId, ItemCount = 1 }) + else + print(string.format('[BP_PlayerController:ServerRPC_GiveSkill] 存在问题,请检查一下')) + end + print(string.format('[BP_PlayerController:ServerRPC_GiveSkill] 存在问题,请检查一下')) + end + else + -- 检查背包是否满了 + if self:IsBackpackFull(EItemType.SkillBook) then + -- 丢到地面上 + self:CreateItem(nil, { ItemID = OldSkillId, ItemCount = 1 }) + else + print(string.format('[BP_PlayerController:ServerRPC_GiveSkill] 存在问题,请检查一下')) + end + end + end +end + +function BP_PlayerController:ClientRPC_SetupSkillButton(SkillName, SkillSlot, SkillLevel) + EventSystem:SendEvent(EventType.OnSetupSkillButton, SkillName, SkillSlot, SkillLevel) +end + +function BP_PlayerController:GiveSkillList(SkillNameList) + if (not (self.Pawn and UE.IsValid(self.Pawn))) then + UE.LogError("[BP_PlayerController:GiveSkillList] self.Pawn == nil") + return + end + + if SkillNameList == nil then + return + end + + self.Pawn:GiveSkillWithSkillNameList(SkillNameList) +end + +function BP_PlayerController:GiveSkill(SkillName, SkillSlot, SkillLevel) + if (not (self.Pawn and UE.IsValid(self.Pawn))) then + UE.LogError("[BP_PlayerController:GiveSkill] self.Pawn == nil") + return -1 + end + + if SkillName == nil or SkillName == ESkillName.Default then + UE.LogError("[BP_PlayerController:GiveSkill] invalid SkillName") + return -1 + end + + for i, v in pairs(self.ActiveSkillNameList) do + print(string.format('[BP_PlayerController:GiveSkill] Slot: %d, SkillName: %d, SkillLevel: %d', i, v.SkillName, v.SkillLevel)) + end + + for Slot, SkillInfo in pairs(self.ActiveSkillNameList) do + if SkillInfo.SkillName == SkillName and SkillInfo.SkillLevel == SkillLevel then + UE.LogError("[BP_PlayerController:GiveSkill] Has Same Skill") + return -1 + end + end + + return self.Pawn:GiveSkill(SkillName, SkillSlot, SkillLevel) +end + +---@param SkillSlot ESkillSlot +function BP_PlayerController:ClientOnCastSkill(SkillSlot) + UE.Log("[Skill] [%s] [%s] ClientOnCastSkill:%s", self.PlayerKey, self.PlayerName, SkillSlot) + UnrealNetwork.CallUnrealRPC(self, self, "ServerRPC_OnCastSkill", SkillSlot) +end + +function BP_PlayerController:ServerRPC_OnCastSkill(SkillSlot) + UE.Log("[Skill] [%s] [%s] ServerRPC_OnCastSkill:%s", self.PlayerKey, self.PlayerName, SkillSlot) + + local Pawn = self:GetPlayerCharacterSafety() + if UE.IsValid(Pawn) then + Pawn:TryActiveSkillBySlot(SkillSlot) + end +end + +function BP_PlayerController:ClientRPC_SetSkillCD(Slot, CDDuration) + -- 更改CD状态 + UE.Log("[Skill] ClientRPC_SetSkillCD Slot:%s Duration:%f", Slot, CDDuration) + EventSystem:SendEvent(EventType.PlayerSkillCDTriggered, Slot, CDDuration) +end + +-- 获取空的机能插槽 +function BP_PlayerController:GetEmptySlots() + local Slots = { ESkillSlot.Slot1, ESkillSlot.Slot2, ESkillSlot.Slot3, } + local NeedRemoveSlots = {} + if table.getCount(self.ActiveSkillNameList) > 0 then + for i, v in pairs(self.ActiveSkillNameList) do + for j = 1, #Slots do + if i == Slots[j] then + table.insert(NeedRemoveSlots, j) + end + end + end + end + + if #NeedRemoveSlots > 0 then + --for i = 1, #NeedRemoveSlots do + -- print(string.format('[BP_PlayerController:GetEmptySlots] 移除的index = %d', NeedRemoveSlots[i])) + --end + + for i = 1, #NeedRemoveSlots do + table.remove(Slots, NeedRemoveSlots[#NeedRemoveSlots - i + 1]) + end + end + + return Slots +end + +-- 获取主动技能 +function BP_PlayerController:GetInitiativeSkillSlots() + local Slots = {} + for i, v in pairs(self.ActiveSkillNameList) do + for j = 1, 3 do + if i == j then + table.insert(Slots, i) + end + end + end + return Slots +end + +function BP_PlayerController:GetNearEmptySlot() + local EmptySlots = self:GetEmptySlots() + if #EmptySlots == 0 then + return 0 + end + return EmptySlots[1] +end + +function BP_PlayerController:IsFullInitiativeSkills() + return self:GetEmptySlots() == 0 +end + +--------------------------------------------- 新手引导相关 --------------------------------------------- +function BP_PlayerController:ClientRPC_TriggerGuide(ConfigID) + if NewPlayerGuideManager then + NewPlayerGuideManager:TriggerGuide(ConfigID) + end +end + +function BP_PlayerController:ClientRPC_RemoveGuide(ConfigID) + if NewPlayerGuideManager then + NewPlayerGuideManager:RemoveGuide(ConfigID) + end +end + +--------------------------------------------- 突破相关逻辑 ---------------------------------------------------- + +function BP_PlayerController:ClientRPC_SetBreachButtonVisible(IsShow) + EventSystem:SendEvent(EventType.ToggleBreachButton, IsShow) +end + +function BP_PlayerController:ClientRPC_SetSealButtonVisible(IsShow) + EventSystem:SendEvent(EventType.ShowSealButton, IsShow) +end + +function BP_PlayerController:ServerRPC_StartSpawnBreachMonster(RewardWeaponID, InLevel) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + if UE.IsValid(PlayerState) == false or PlayerState:GetCanSpawnBreachMonster() == false then + return + end + + local TargetSpawner = UGCGameSystem.GameState:GetSpawnerByPlayerKey(self.PlayerKey) + if UE.IsValid(TargetSpawner) == false then + return + end + + TargetSpawner:StartSpawnBreachMonster(RewardWeaponID, InLevel) +end + +--------------------------------------------- 封印 --------------------------------------------- + +-- 增加封印击杀数 +function BP_PlayerController:AddSealKillCount() + -- 阉割版 + --if self.SealInfo.KillCount + 1 >= SealTables.MultiCount then + -- -- 执行显示封印按钮,如果当前有封引怪或者显示按钮,那么就不进行操作 + -- if not self.SealInfo.IsMonsterAlive then + -- UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_SetSealButtonVisible", true) + -- end + --else + -- self.SealInfo.KillCount = self.SealInfo.KillCount + 1 + --end +end + +function BP_PlayerController:ServerRPC_StartSpawnSealMonster() + local TargetSpawner = UGCGameSystem.GameState:GetSpawnerByPlayerKey(self.PlayerKey) + if UE.IsValid(TargetSpawner) == false then + return + end + TargetSpawner:StartSpawnSeal(self) + NoticeTipsTools.ServerGeneralNoticeTips(self.PlayerKey, "封印怪已生成在练功房,请尽快击败获取奖励!", true, 4.0) +end + +function BP_PlayerController:ClientRPC_SetSealRewards(InRewardsItems) + -- 显示奖励界面 + UIManager.AllPanel[EUIType.SealRewards]:SetRewards(InRewardsItems) + UIManager:ShowPanel(EUIType.SealRewards) +end + +function BP_PlayerController:ServerRPC_ApplyRewards(InData) + print(string.format('[BP_PlayerController:ServerRPC_ApplyRewards] Type = %s', InData.Type)) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + local Type = InData.Type + if Type == '配件' or Type == '技能书' then + for _ = 1, InData.Value do + local ItemData + if Type == '配件' then + ItemData = GenerateWeaponPartData() + else + ItemData = GenerateSkillBookData() + end + local ItemInfo = { + ItemID = ItemData.ItemID, + ItemCount = ItemData.Count + } + self:CreateItem(nil, ItemInfo) + end + elseif Type == '金币' then + PlayerState:UpdateCoinPoint(InData.Value) + elseif Type == '科技点' then + PlayerState:AddKillPoint(InData.Value) + else + PlayerState:AddAttribute(Type, InData.Value, true) + end +end + +--------------------------------------------- 传承 --------------------------------------------- +function BP_PlayerController:ServerRPC_Inherit(IsBreak, SelectText, InCurrId) + print(string.format('[BP_PlayerController:ServerRPC_Inherit] 继承怪')) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + local OldNum = PlayerState.InheritItems[SelectText] + local OldInfo = InheritTable.Items[OldNum] + if InCurrId ~= OldNum then + print(string.format('[BP_PlayerController:ServerRPC_Inherit] Current Id = %d', InCurrId)) + print(string.format('[BP_PlayerController:ServerRPC_Inherit] Old Num = %d', OldNum)) + + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_UpdateInherit", self.PlayerKey, 4) + return + end + local NextId = InheritTable.GetNextId(OldNum) + local NewInfo = InheritTable.Items[NextId] + if IsBreak then + -- 出个怪 + local TargetSpawner = UGCGameSystem.GameState:GetSpawnerByPlayerKey(self.PlayerKey) + if UE.IsValid(TargetSpawner) == false then + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_UpdateInherit", self.PlayerKey, 2) + return + end + TargetSpawner:StartSpawnInherit(self, SelectText, OldNum) + NoticeTipsTools.ServerGeneralNoticeTips(self.PlayerKey, "进阶怪已生成在练功房,请尽快击败获取奖励!", true, 4.0) + else + if PlayerState.CoinPoint.Current < OldInfo.Cost then + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_UpdateInherit", self.PlayerKey, 3) + return + else + local IsSuccess = PlayerState:UpdateCoinPoint( - OldInfo.Cost) + if IsSuccess then + PlayerState.InheritItems[SelectText] = NextId + --获得奖励 + for i = 1, #NewInfo.Benefit do + PlayerState:AddAttribute(OldInfo.Benefit[i].Type, OldInfo.Benefit[i].Value, true) + end + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_UpdateInherit", self.PlayerKey, 1) + else + print(string.format('[BP_PlayerController:ServerRPC_Inherit] 没有添加成功')) + end + + end + end +end + +-- IsSuccess: 0:击杀怪物;1:扣除金币成功;2:击杀失败;3:扣除失败;4:执行失败 +function BP_PlayerController:ClientRPC_UpdateInherit(InPlayerKey, IsSuccess) + if InPlayerKey ~= self.PlayerKey then + return + end + + UIManager.AllPanel[EUIType.Inherit]:UpdateInherit(IsSuccess) +end + +function BP_PlayerController:ServerRPC_SetResourceGrade(ResourceGrade) + if type(ResourceGrade) ~= 'number' or ResourceGrade < 1 or ResourceGrade > 4 then + return + end + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false then + return + end + local Spawner = GameState:GetSpawnerByPlayerKey(self.PlayerKey) + if Spawner == nil or UE.IsValid(Spawner) == false then + return + end + + self.ResourceGrade = ResourceGrade + Spawner:UpdateHangupRoomMonsterLevel(ResourceGrade) +end + +-- 一键合成 +function BP_PlayerController:ServerRPC_GenerateAllItem(InType) + local ItemMap = self:GetItemMapByItemType(InType) + if ItemMap == nil then + print(string.format('[BP_PlayerController:ServerRPC_GenerateAllItem] 当前背包中没有 %d', InType)) + return + end + + -- 首先,将背包中的物品放到各个数组中 + local AllItems = {} + -- 全部拆分开 + + for i, v in pairs(ItemMap) do + local Quality = GetItemQualityLevel(i) + if AllItems[Quality] == nil then + AllItems[Quality] = {} + end + AllItems[Quality][i] = v + end + + local SingleItems = {} + -- 先根据AllItems[Quality] 进行判断 + local TheType = EQualityType.Senior + while TheType >= 0 do + if AllItems[TheType] ~= nil then + for i, v in pairs(AllItems[TheType]) do + local NextStack = v // 3 + if NextStack > 0 then + for d = 1, NextStack do + local ItemData = {i,i,i} + self:GenerateItem(ItemData) + end + end + + -- 检查一下剩余的 + local LastCount = v - NextStack * 3 + if LastCount > 0 then + if SingleItems[TheType] == nil then + SingleItems[TheType] = {} + end + for c = 1, LastCount do + table.insert(SingleItems[TheType], i) + end + end + end + + if SingleItems[TheType] ~= nil then + -- 计算数量 + local Count = table.getCount(SingleItems[TheType]) + local NextTypeCount = Count // 3 + if NextTypeCount >= 1 then + for i = 1, NextTypeCount do + local ItemData = { + SingleItems[TheType][3 * (i - 1) + 1], + SingleItems[TheType][3 * (i - 1) + 2], + SingleItems[TheType][3 * (i - 1) + 3], + } + self:GenerateItem(ItemData) + end + end + end + end + TheType = TheType - 1 + end +end + +function BP_PlayerController:GenerateItem(InItemList) + -- InData 中包含的是几个要合成的 Id + for i = 1, #InItemList do + local InData = InItemList[i] + local RemoveCount = self:UpdateItemMap(InData, -1) + UE.Log('移除的数量:%d,移除的 Id = %d', RemoveCount, InData) + end + -- 判断是不是技能书 + local CreateId = self:GetCreateId(InItemList) + CreateId = CreateId + 10 -- 抬升一个等级 + -- 判断当前技能是否是超级 + if GetItemQualityLevel(CreateId) == EQualityType.Super then + self.PlayerState.ArchiveData.TotalSuperSkill = self.PlayerState.ArchiveData.TotalSuperSkill + 1 + end + + UE.Log('要添加的物品的 Id:%d', CreateId) + local AddItemCount = self:UpdateItemMap(CreateId, 1) + if AddItemCount == 0 then + local ItemData = { + ItemID = CreateId, + ItemCount = 1 + } + self:CreateItem(nil, ItemData) + return + end +end + +function BP_PlayerController:GetCreateId(InItemList) + --local ItemId = InItemList[1] + --local Level = GetItemQualityLevel(ItemId) + 1 + -- + ----生成ID + --local WeaponType = math.random(1, 6) + -- + ---- 判断是不是技能书 + --local CreateId = 0 + --if GetItemGrantTypeById(ItemId) == EDropItemSet.SkillBooks then + -- local Val = math.random(9, 32) + -- CreateId = 20000 + Val * 100 + (Level + 1) * 10 + --else + -- CreateId = ItemId // 1000 * 1000 + WeaponType * 100 + (Level + 1) * 10 + --end + -- + --if ItemId == InItemList[2] and ItemId == InItemList[3] then + -- CreateId = ItemId + 10 -- 抬升一个等级 + --end + return InItemList[math.random(1,3)] +end + +-- 显示所有拾取的东西 +function BP_PlayerController:ClientRPC_ShowPickUpItems(InAddItems) + local ItemsMap = {} + for i = 1, table.getCount(InAddItems) do + local ItemId = InAddItems[i] + if ItemsMap[ItemId] == nil then + ItemsMap[ItemId] = 1 + else + ItemsMap[ItemId] = ItemsMap[ItemId] + 1 + end + end + + -- 找到对应物品 + for i, v in pairs(ItemsMap) do + local FittingItem = DropItemMap.FittingItemMap[i] + local Item = nil + if FittingItem ~= nil then + Item = FittingItem["Quality"] .. FittingItem["WeaponType"] .. FittingItem["FittingType"] + else + FittingItem = DropItemMap.SkillItemMap[i] + if FittingItem == nil then + print(string.format('[BP_PlayerController:ClientRPC_ShowPickUpItems] 当前没有该元素:%s', tostring(i))) + return + end + Item = FittingItem["Quality"] .. FittingItem["SkillName"] + end + local Params = { + Text = Item, + Color = Tables.ItemRarityColor[GetItemQualityLevel(i)].LinearColor, -- 16进制颜色 + Num = v, + } + NoticeTipsTools.ClientNoticeTips(ECustomNoticeType.RollingNotice, Params, ERollingNoticeType.Gain) + end +end + +------------------------------------ 背包相关逻辑 ------------------------------------ +function BP_PlayerController:OnRep_ItemMap() + -- 刷新一下背包界面 + --log_tree("ItemMap - ", self.ItemMap) + EventSystem:SendEvent(EventType.UpdateItemList, false) +end + +function BP_PlayerController:GetItemTypeCountByType(InType) + return table.getCount(self.ItemMap[InType]) +end + +--- Server 添加/减少物品数量 +---@param InItemID number @目标物品ID +---@param InCount number @更改的数量(若为负数则视为丢弃) +---@return number @实际添加/减少的数量,当 数据 == -1000 的时候没有拾取或者丢弃 +---减少的时候数量不会超过该物品的总数,因此不需要判断具体减少数据会不会超过总数 +function BP_PlayerController:UpdateItemMap(InItemID, InCount) + local RetVal = 0 + + --石头 和 技能书 + if InItemID > 20000 then + --获取对应信息即可 + local InType = nil + if InItemID // 1000 == 31 then + InType = EItemType.ScouringStone + elseif InItemID // 1000 == 32 then + InType = EItemType.SubstituteStone + elseif InItemID // 10000 == 2 then + InType = EItemType.SkillBook + end + RetVal = InCount + print(string.format('当前玩家身上物品表的数量为:%d', self:GetItemTypeCountByType(InType))) + local val = self.ItemMap[InType][InItemID] + if self:GetItemTypeCountByType(InType) >= 24 then + -- 判断当前是否有该物品,如果有,就执行操作,没有就返回0 + if val == nil then + return 0 + end + end + + if val == nil then + if InCount <= 0 then + RetVal = 0 + else + self.ItemMap[InType][InItemID] = InCount + end + else + --表示由原先值并且打算移除 + if val + InCount == 0 then + table.removeKey(self.ItemMap[InType], InItemID) + else + self.ItemMap[InType][InItemID] = val + InCount + end + RetVal = InCount + end + + return RetVal + end + + -- 普通武器配件 + local Type = GetItemTypeByItemId(InItemID) + if self:GetItemTypeCountByType(Type) >= 24 then + if InCount <= 0 then + return 0 + end + end + + local CurCount = self.ItemMap[Type][InItemID] + if InCount > 0 then + if CurCount == nil then + self.ItemMap[Type][InItemID] = InCount + else + -- 此处判断是否会超出数量 + self.ItemMap[Type][InItemID] = CurCount + InCount + end + RetVal = InCount + elseif InCount < 0 then + if CurCount == nil then + return 0 + end + + print(string.format('开始移除')) + if math.abs(InCount) == CurCount then + table.removeKey(self.ItemMap[Type], InItemID) + else + self.ItemMap[Type][InItemID] = CurCount + InCount + end + RetVal = InCount + else + RetVal = 0 + end + + return RetVal +end + +-- 添加背包物品 +function BP_PlayerController:AddBagItem(InItemData) + local HadAddCount = self:UpdateItemMap(InItemData.ItemID, InItemData.ItemCount) --该数据只有 == 数量和 0 这两个值 + if HadAddCount == InItemData.ItemCount then + return + end + -- 生成出来 + if InItemData.ItemCount < 0 then + return + end + self:CreateItem(nil, InItemData) +end + +function BP_PlayerController:GenerateItemList(InItemList) + print(string.format("[BP_PlayerController:GenerateItemList] 当前要删除的数量为:%d", #InItemList)) + local ItemList = {} + for i = 1, #InItemList do + table.insert(ItemList, InItemList[i]) + end + UnrealNetwork.CallUnrealRPC(self, self, "ServerRPC_GenerateItem", ItemList) +end + +function BP_PlayerController:GetItemMap() + return self.ItemMap +end + +function BP_PlayerController:GetItemMapByItemType(InType) + return self.ItemMap[InType] +end + +function BP_PlayerController:FindItemCount( InType, InItemID ) + if InItemID ~= nil then + print('[BP_PlayerController:FindItemCount] ItemId = NIl') + else + print(string.format('[BP_PlayerController:FindItemCount] ItemId = %d, ItemMap Count = %d', InItemID, #self.ItemMap)) + end + + local Count = self.ItemMap[InType][InItemID] + if Count == nil then + return 0 + end + return Count +end + +-- 拾取操作 +function BP_PlayerController:RequestPickupNearbyItems(IsPickAll) + -- 首先判断玩家在哪部分 + + if self.Pawn.IsInArena then + local Dis + if IsPickAll then + Dis = self.PickupDistance + else + Dis = self.AutoPickupDistance + end + if not table.isEmpty(self.AllItemActors[ETeleportType.InArena]) then + local AddItemThisIDs = {} + for i, v in pairs(self.AllItemActors[ETeleportType.InArena]) do + if UE.IsValid(v) and v.bIsPicking == false then + local bCanPick = true + if IsPickAll == false then + bCanPick = v:IsAutoPickupDisabled(self.PlayerKey) == false + end + local DisLen = VectorHelper.Length(VectorHelper.Sub(self.Pawn:K2_GetActorLocation(), v:K2_GetActorLocation())) + if Dis >= DisLen and bCanPick then + v:SetIsPicking(true) + table.insert(AddItemThisIDs, v:GetThisID()) + end + end + end + -- 告知服务器进行拾取这些 + UnrealNetwork.CallUnrealRPC(self, self, "ServerRPC_AddItemsByThisID", AddItemThisIDs) + end + else + if not table.isEmpty(self.AllItemActors[ETeleportType.InHangupRoom]) then + -- 拾取这里面的所有物品 + -- i: 序号;v: 具体物体 + local AddItems = {} + for i, v in pairs(self.AllItemActors[ETeleportType.InHangupRoom]) do + if UE.IsValid(v) and v.bIsPicking == false then + -- 通知服务器进行添加 + local bCanPick = false + if not IsPickAll then + local DisLen = VectorHelper.Length(VectorHelper.Sub(self.Pawn:K2_GetActorLocation(), v:K2_GetActorLocation())) + bCanPick = v:IsAutoPickupDisabled(self.PlayerKey) == false and DisLen <= self.AutoPickupDistance + end + bCanPick = self:CanAddItemById(v:GetItemID()) and (IsPickAll or bCanPick) + if bCanPick then + v:SetIsPicking(true) + local ItemData = { + ItemID = v:GetItemID(), + ItemCount = v:GetItemCount() + } + v:K2_DestroyActor() + table.insert(AddItems, ItemData) + end + end + end + if not table.isEmpty(AddItems) then + UnrealNetwork.CallUnrealRPC(self, self, "ServerRPC_AddExerciseItems", AddItems) + end + end + end +end + +function BP_PlayerController:ClientUpdateItemMap(ItemMap) + self.ItemMap = TableHelper.DeepCopyTable(ItemMap) +end + +function BP_PlayerController:IsBackpackFull(InItemType) + return table.getCount(self.ItemMap[InItemType]) == 24 +end + +function BP_PlayerController:FindQualityItemCount(InQuality, InGrantType) + local Count = 0 + if InGrantType == EDropItemSet.WeaponParts then + for i, v in pairs(self.ItemMap) do + if i < EItemType.SkillBook then + for c, d in pairs(v) do + if GetItemQualityLevel(c) == InQuality then + Count = Count + d + end + end + end + end + elseif InGrantType == EDropItemSet.SkillBooks then + for i, v in pairs(self.ItemMap[EItemType.SkillBook]) do + if GetItemQualityLevel(i) == InQuality then + Count = Count + v + end + end + end + return Count +end + +-- S / C: 是否可以添加新的物品 +function BP_PlayerController:CanAddItemById(InItemId) + -- 如果没满的话 + local InType = GetItemTypeByItemId(InItemId) + if self:IsBackpackFull(GetItemTypeByItemId(InItemId)) then + -- 遍历查找是否有该东西 + local Count = self:FindItemCount(InType, InItemId) + return Count > 0 + end + return true +end + +function BP_PlayerController:RequestExerciseDropItem(InPlayerKey, InLoc, InRot, InData, IsMonsterDrop, IsFromDiscard) + print(string.format('[BP_PlayerController:RequestExerciseDropItem] '.. tostring(InPlayerKey))) + InLoc = VectorHelper.ToLuaTable(InLoc) + InRot = VectorHelper.RotToLuaTable(InRot) + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_SpawnExerciseDropItem", InPlayerKey, InLoc, InRot, InData, IsMonsterDrop, IsFromDiscard) +end + +-- 客户端生成 +function BP_PlayerController:ClientRPC_SpawnExerciseDropItem(InPlayerKey, InLoc, InRot, InData, IsMonsterDrop, IsFromDiscard) + if self.PlayerKey ~= InPlayerKey then + return; + end + + print(string.format('[BP_PlayerController:ClientRPC_SpawnExerciseDropItem] 执行')) + local Location = self.Pawn:K2_GetActorLocation() + local ForwardLocation = VectorHelper.ToLuaTable(self.Pawn:GetActorForwardVector()) + local Scalar = 1.5 + ForwardLocation = { X = ForwardLocation.X * Scalar, Y = ForwardLocation.Y * Scalar, Z = ForwardLocation.Z - 0 } + log_tree('ForwardLocation = ', ForwardLocation) + + Location = VectorHelper.Add(Location, ForwardLocation) + --Location = VectorHelper.Add(Location, VectorHelper.MulScalar(ForwardLocation, 1.5)) + Location = VectorHelper.ToLuaTable(Location) + + local Scale = VectorHelper.ScaleOne() + + --此处生成了一个具体的 Item + local DropItemActor = nil + if IsMonsterDrop then + DropItemActor = UGCGameSystem.SpawnActor( + self, + self.ItemActorClass, + InLoc, -- 阉割版 + InRot, + Scale, + UGCGameSystem.GameState + ) + else + DropItemActor = UGCGameSystem.SpawnActor( + self, + self.ItemActorClass, + Location, -- 阉割版 + InRot, + Scale, + UGCGameSystem.GameState + ) + end + + --DropItemActor:SetPickItemData(string.format("%d;%d", InData.ItemID, InData.Count)) + -- 设置数据进去 + DropItemActor:SetItemData(InData) + -- 设置自动销毁时间 + DropItemActor:SetLifeSpan(60 * 30) + + if IsFromDiscard then + DropItemActor:SetAutoPickupDisabled(InPlayerKey) + end + + table.insert(self.AllItemActors[ETeleportType.InHangupRoom], DropItemActor) +end + +function BP_PlayerController:ServerRPC_AddExerciseItems(InItemList) + local AddItems = {} + print(string.format('[BP_PlayerController:ServerRPC_AddExerciseItems] 执行!'.. tostring(self.PlayerKey))) + log_tree('InItemList = ', InItemList) + log_tree('UGCGameSystem.GameState.DropItemList = ', UGCGameSystem.GameState.DropItemList) + local AddItemIds = {} + for i = 1, #InItemList do + -- 检查保存在 GameState 中的数组 + -- c: ItemId, v:ItemCount + local SavedCount = UGCGameSystem.GameState.DropItemList[self.PlayerKey][InItemList[i].ItemID] + if SavedCount ~= nil then + if SavedCount < InItemList[i].ItemCount then + print(string.format('[BP_PlayerController:ServerRPC_AddExerciseItems] 该元素:%d 作弊了', InItemList[i].ItemID)) + else + local ItemData = { + ItemID = InItemList[i].ItemID, + ItemCount = InItemList[i].ItemCount, + } + table.insert(AddItems, ItemData) + table.insert(AddItemIds, InItemList[i].ItemID) + local AddCount = self:UpdateItemMap(InItemList[i].ItemID, InItemList[i].ItemCount) + if SavedCount == AddCount then + table.removeKey(UGCGameSystem.GameState.DropItemList[self.PlayerKey], InItemList[i].ItemID) + else + UGCGameSystem.GameState.DropItemList[self.PlayerKey][InItemList[i].ItemID] = SavedCount - InItemList[i].ItemCount + end + end + else + print(string.format('[BP_PlayerController:ServerRPC_AddExerciseItems] 该元素:%d 作弊了', InItemList[i].ItemID)) + end + end + + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_ShowPickUpItems", AddItemIds) +end + +function BP_PlayerController:ServerRPC_GM_AddItems(InItemDataList) + local AddItemIds = {} + for _, ItemData in pairs(InItemDataList) do + if self:UpdateItemMap(ItemData.ItemID, ItemData.ItemCount) > 0 then + table.insert(AddItemIds, ItemData.ItemID) + end + end + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_ShowPickUpItems", AddItemIds) +end + +function BP_PlayerController:ServerRPC_GM_AddCoinPoint(InDelta) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + if UE.IsValid(PlayerState) then + PlayerState:AddCoinPointDirectly(InDelta) + end +end + +function BP_PlayerController:ServerRPC_GM_AddTechPoint(InDelta) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + if UE.IsValid(PlayerState) then + PlayerState:AddTechPointDirectly(InDelta) + end +end + +function BP_PlayerController:ServerRPC_GM_ChangeTimeScale(Scale) + EventSystem:SendEvent(EventType.GM_TimeScale, Scale) +end + +function BP_PlayerController:ServerRPC_OnBreach(InPlayerKey) + print(string.format('[BP_PlayerController:ServerRPC_OnBreach] 执行生成一个怪')) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(InPlayerKey) + local Level = PlayerState.Level + if Level % 10 ~= 0 then + return + end + local LevelVal = Level / 10 + -- 获取 BossId + local BossList = UGCGameSystem.GameState.BossList + if LevelVal > #BossList then + LevelVal = #BossList + end + local BossId = BossList[LevelVal] + print(string.format('[BP_PlayerController:ServerRPC_OnBreach] BossId = %d', BossId)) + -- 找到要添加的枪 + local NeedAddWeaponType = Tables.MonsterBaseConfig[BossId].WeaponType + if NeedAddWeaponType == nil then + print(string.format('[BP_PlayerController:ServerRPC_OnBreach] 找不到当前武器类型:%d', NeedAddWeaponType)) + return + end + + for i, v in pairs(Tables.DefaultWeaponId) do + if v == NeedAddWeaponType then + -- 要添加 i + self:ServerRPC_StartSpawnBreachMonster(i, Level) + break + end + end +end + +function BP_PlayerController:ClientRPC_ShowInitialPanel(IsShow) + print(string.format('[BP_PlayerController:ClientRPC_ShowInitialPanel] 执行')) + if IsShow then + self.InitialWidget = UserWidget.NewWidgetObjectBP(self, UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Notice/WBP_InitialNotice_V2.WBP_InitialNotice_V2_C'))) + self.InitialWidget:AddToViewport() + self.InitialWidget:SetVisibility(ESlateVisibility.Visible) + else + if self.InitialWidget then + self.InitialWidget:SetVisibility(ESlateVisibility.Collapsed) + end + end +end + +function BP_PlayerController:ClientRPC_ShowPanel(UIType, ...) + UIManager:ShowPanel(UIType, ...) +end + +function BP_PlayerController:ServerRPC_CloseInitialNotice(IsShow) + UGCGameSystem.GameState:SetInitialOver(IsShow) +end + +function BP_PlayerController:Client_UpdateArchiveData(InArchiveData) + log_tree("[BP_PlayerController:Client_UpdateArchiveData] InArchiveData = ", InArchiveData); + self.PlayerState:SetGameEndArchiveData(InArchiveData); +end + +return BP_PlayerController; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Player/BP_PlayerPawn.lua b/GZJ/Script/Blueprint/Player/BP_PlayerPawn.lua new file mode 100644 index 00000000..67f92726 --- /dev/null +++ b/GZJ/Script/Blueprint/Player/BP_PlayerPawn.lua @@ -0,0 +1,697 @@ +---@class BP_PlayerPawn_C:BP_UGCPlayerPawn_C +---@field BreachWidget UWidgetComponent +---@field ParticleSystem UParticleSystemComponent +---@field CameraSocket USceneComponent +---@field WeaponActorSocket USceneComponent +---@field WeaponParticleArray TMap:TEnumAsByte,UParticleSystem +--Edit Below-- +UGCGameSystem.UGCRequire('Script.Common.ue_enum_custom') +UGCGameSystem.UGCRequire('Script.Common.ue_struct_custom') +UGCGameSystem.UGCRequire('Script.Global.Global') + +local BP_PlayerPawn = { + IsRunOnServer = false, + + WeaponActor = nil, + + IsInArena = false, --是否在场内 + + IsInTrueDamage = false, --是否在真实伤害状态 + + DashDuration = -1, --冲刺持续时间 + CachedCharacterMovementGravityScale = 1.5, --缓存玩家重力参数 + IsDashTo = false, --冲刺状态开关 + LaunchCharacterForce = 10000, --冲刺力度 决定要冲刺多远 + LaunchDir = nil, --冲刺方向 + + EnergyData = { Max = 0, Cur = 0 }, --能量值(为了同一帧同步所以合并) + + bHasApplyedAttribute = false, --是否已有初始属性 + AttributeUpdateInterval = 0, --属性更新计时器 + + bCanBeControlledByMonsters = true, --可被怪物控制 + + WeaponParticles = {}, --武器特效 + + BossAttackCount = 0, --Boss被攻击次数(用作播放特效) + + bIsAlive = true, --玩家是否活着 + + SkillSystemComponent = nil, --技能系统 + TestTimerHandler = nil; + + ItemActorClass = nil, +}; + +BP_PlayerPawn.OnReceiveDamageDelegate = Delegate.New() +BP_PlayerPawn.OnWeaponSpawnedDelegate = Delegate.New() + +--设置同步的属性 +function BP_PlayerPawn:GetReplicatedProperties() + return + "WeaponActor", + "EnergyData", + "BossAttackCount", + "IsInArena" +end + +function BP_PlayerPawn:GetAvailableServerRPCs() + return + -- "DrawDebugSphere", + -- "DrawDebugLine", + -- "DrawDebugBox", + -- "Client_MulticastRPC_PlaySkillEffect", + -- "Client_MulticastRPC_PlayEffect", + -- "Client_MulticastRPC_PlayDirectionalEffect", + -- "Client_MulticastRPC_PlayEffectAtLocation", + -- "Client_MulticastRPC_RemoveSkillEffect", + -- "Client_MulticastRPC_RemoveAllSkillEffect" +end + +function BP_PlayerPawn:ReceiveBeginPlay() + BP_PlayerPawn.SuperClass.ReceiveBeginPlay(self) + + self.IsRunOnServer = UGCGameSystem.IsServer() + + --禁止掉落伤害 + self.bTemperoryDisableFallingDamage = true + --缓存当前重力 + self.CachedCharacterMovementGravityScale = self.STCharacterMovement.GravityScale + self.ItemActorClass = UE.LoadClass(BPClassPath.PickupItemClass) + + EventSystem.SetTimer(self, function() + --self:TestPawn(); + end, 30) + + if self:HasAuthority() then + self:BindServerEvent() + + if self.SkillSystemComponent == nil then + local SkillSystemComponentClass = require("Script.SimpleSkill.SkillSystemComponent") + self.SkillSystemComponent = SkillSystemComponentClass.New(self) + end + else + self:BindClientEvent() + + local CommandManager = require('Script.Manager.CommandQueneManager') + CommandManager:AddInitCommand(self, self.Client_Init) + end +end + +function BP_PlayerPawn:TestPawn() + if self:HasAuthority() == false then + end + --local PlayerState = self:GetPlayerStateSafety() + --PlayerState:AddExp(10000) +end + +function BP_PlayerPawn:ReceiveEndPlay() + if self:HasAuthority() then + self:UnbindServerEvent() + else + self:UnbindClientEvent() + end + + BP_PlayerPawn.SuperClass.ReceiveEndPlay(self) +end + +function BP_PlayerPawn:ReceiveTick(DeltaTime) + BP_PlayerPawn.SuperClass.ReceiveTick(self, DeltaTime) + + if self.IsRunOnServer then + self:ServerTick(DeltaTime) + self.SkillSystemComponent:OnTick(DeltaTime) + else + if self.bHasInitClient == nil and self.PlayerKey ~= 0 then + local CommandManager = require('Script.Manager.CommandQueneManager') + CommandManager.bPlayerPawnReady = true + self.bHasInitClient = true + UE.Log("[BP_PlayerPawn] *** BP_PlayerPawn Tick Init Ready PlayerKey:%s", self.PlayerKey) + end + + self:ClientTick(DeltaTime) + end +end + +function BP_PlayerPawn:Client_Init() + self:ClientOnHPChanged(UGCPawnAttrSystem.GetHealth(self), UGCPawnAttrSystem.GetHealthMax(self), 0) + self:OnRep_EnergyData() +end + +---@field UGC_PreTakeDamageEvent:fun(Damage:float,EventInstigator:AController,DamageEvent:FDamageEvent,DamageCauser:AActor):float +function BP_PlayerPawn:UGC_PreTakeDamageEvent(Damage, EventInstigator, DamageEvent, DamageCauser) + UE.Log("[BP_PlayerPawn:UGC_PreTakeDamageEvent] Damage = %d", Damage) + return Damage +end + +function BP_PlayerPawn:ServerTick(DeltaTime) + --自动回复逻辑 + if UGCGameSystem.GameState.bHasApplyedAttribute then + self.AttributeUpdateInterval = self.AttributeUpdateInterval + DeltaTime + if self.AttributeUpdateInterval >= 1.0 then + local PlayerState = self:GetPlayerStateSafety() + --成长属性 + PlayerState:GrowthAttributes() + --每秒增加杀敌点 + PlayerState:GrowthKillPoint() + --刷新战斗力计算结果 + PlayerState:RefreshCombatPoint() + --每秒回复 + PlayerState:RecoverPlayerPawn() + --每秒杀敌点 + PlayerState:AttributeAdditionPerSecond() + + self.AttributeUpdateInterval = 0 + end + end + + --冲刺逻辑 + if self.DashDuration > 0 then + self.DashDuration = self.DashDuration - DeltaTime + if self.DashDuration <= 0 then + self.DashDuration = -1 + self.LaunchDir = nil + self:EnableDashTo(false) + end + + if self.LaunchDir then + self:LaunchCharacter(VectorHelper.MulNumber(self.LaunchDir, self.LaunchCharacterForce * DeltaTime), true, false) + + if self.CharacterMovement.MovementMode ~= EMovementMode.MOVE_Falling then + self.CharacterMovement:SetMovementMode(EMovementMode.MOVE_Falling) + end + end + end +end + +function BP_PlayerPawn:ClientTick(DeltaTime) +end + +function BP_PlayerPawn:BindServerEvent() + self.OnCharacterHpChange:Add(BP_PlayerPawn.ServerOnHPChanged, self) + self.OnDeath:Add(BP_PlayerPawn.ServerOnSelfDeath, self) +end + +function BP_PlayerPawn:BindClientEvent() + EventSystem:AddListener(EventType.ClientUpdateWeapon, BP_PlayerPawn.OnUpdateWeapon, self) + self.OnCharacterHpChange:Add(BP_PlayerPawn.ClientOnHPChanged, self) +end + +function BP_PlayerPawn:UnbindServerEvent() + self.OnDeath:Remove(BP_PlayerPawn.ServerOnSelfDeath, self) + self.OnCharacterHpChange:Remove(BP_PlayerPawn.ServerOnHPChanged, self) +end + +function BP_PlayerPawn:UnbindClientEvent() + EventSystem:RemoveListener(EventType.ClientUpdateWeapon, BP_PlayerPawn.OnUpdateWeapon, self) + self.OnCharacterHpChange:Remove(BP_PlayerPawn.ClientOnHPChanged, self) +end + +function BP_PlayerPawn:ServerOnSelfDeath(DeadPawn, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + if DeadPawn.PlayerKey == self.PlayerKey then + if UE.IsValid(KillerController) and UE.IsValid(KillerController.Pawn) then + EventSystem:SendEvent(EventType.PlayerPawnDead, self.PlayerKey, KillerController.Pawn) + end + UE.Log("[BP_PlayerPawn:ServerOnSelfDeath] PlayerKey=%d",self.PlayerKey) + local PlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(self) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) + + PlayerState.BackupEnergyData = TableHelper.DeepCopyTable(self.EnergyData) + self.bIsAlive = false + + if self.SkillSystemComponent then + self.SkillSystemComponent:RemoveAllSkill() + UnrealNetwork.CallUnrealRPC_Multicast(self, "Client_MulticastRPC_RemoveAllSkillEffect", self) + end + + if DamageCauser and UE.IsValid(DamageCauser) then + local MonsterType = GameDataManager.GetMonsterTypeByID(DamageCauser.ID) + if MonsterType == EMonsterType.Boss or MonsterType == EMonsterType.Common then + if MonsterType == EMonsterType.Boss then + DamageCauser.KilledPlayerNum = DamageCauser.KilledPlayerNum + 1 + end + PlayerController.IsDeadInArena = true + else + PlayerController.IsDeadInArena = false + end + end + end +end + +function BP_PlayerPawn:ServerOnHPChanged(CurHP, MaxHP, PrevHP) + UE.Log("[BP_PlayerPawn:ServerOnHPChanged] PlayerKey = %d, CurHP = %.1f, MaxHP = %.1f, PrevHP = %.1f", UGCPawnAttrSystem.GetPlayerKeyInt64(self), CurHP, MaxHP, PrevHP) +end + +function BP_PlayerPawn:ClientOnHPChanged(CurHP, MaxHP, PrevHP) + local PlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(self) + EventSystem:SendEvent(EventType.OnPlayerHPChanged, PlayerKey, CurHP, MaxHP, PrevHP) + + UE.Log("[BP_PlayerPawn:ClientOnHPChanged] PlayerKey = %d, CurHP = %.1f, MaxHP = %.1f, PrevHP = %.1f", PlayerKey, CurHP, MaxHP, PrevHP) +end + +function BP_PlayerPawn:IsSkipSpawnDeadTombBox(EventInstigater) + return true +end + +function BP_PlayerPawn:GetPickupCollision() + return self.PickupCollision +end + +-- 获取武器组件 +function BP_PlayerPawn:GetWeaponComponent() + return self.WeaponActor +end + +function BP_PlayerPawn:IsFullHealth() + local MaxHP = UGCPawnAttrSystem.GetHealthMax(self) + local CurHP = UGCPawnAttrSystem.GetHealth(self) + return math.isNearlyEqual(MaxHP, CurHP) and MaxHP > 0 +end + +function BP_PlayerPawn:IsFullEnergy() + local MaxEnergy = self.EnergyData.Max + local CurEnergy = self.EnergyData.Cur + return math.isNearlyEqual(MaxEnergy, CurEnergy) and MaxEnergy > 0 +end + +function BP_PlayerPawn:IsSelfAlive() + return self.bIsAlive +end + +function BP_PlayerPawn:OnRep_EnergyData() + if EventSystem and EventType then + local Cur = self.EnergyData.Cur + local Max = self.EnergyData.Max + UE.Log("[BP_PlayerPawn:OnRep_Energy] Cur = %2.2f, Max = %2.2f", Cur, Max) + EventSystem:SendEvent(EventType.OnPlayerEnergyChanged, self.PlayerKey, Cur, Max) + end +end + +function BP_PlayerPawn:OnRep_WeaponActor() + UE.Log("[BP_PlayerPawn:OnRep_WeaponActor] PlayerKey=%d, Changed", self.PlayerKey) + EventSystem.SetTimer(self, function() + if self.WeaponActor ~= nil and UE.IsValid(self.WeaponActor) then + self.WeaponActor:OnRep_CurrentWeaponId() + end + end, 0.2) +end + +function BP_PlayerPawn:OnRep_BossAttackCount() + if self.WeaponActor == nil then + return + end + local WeaponId = self.WeaponActor.CurrentWeaponId + local WT = self.WeaponActor:GetWeaponTypeByWeaponId(WeaponId) + if WT == EWeaponClassType.WT_ShooterRifle + or WT == EWeaponClassType.WT_AssaultRifle + or WT == EWeaponClassType.WT_ShotGun + or WT == EWeaponClassType.WT_MachineGun + then + self:PlaySingleWeaponEffect(self.PlayerKey, WT) + end +end + +function BP_PlayerPawn:DashTo(Dir, Duration, DashForce) + self.LaunchCharacterForce = DashForce + self.DashDuration = Duration + self.LaunchDir = Dir + self:EnableDashTo(true) +end + +function BP_PlayerPawn:EnableDashTo(IsOn) + if IsOn then + self.STCharacterMovement.GravityScale = 0 + else + self.STCharacterMovement.GravityScale = self.CachedCharacterMovementGravityScale + end +end + + +--- 玩家处理伤害函数 +---@param DamageAmount float +---@param DamageEvent FDamageEvent +---@param EventInstigator AController +---@param DamageCauser AActor +function BP_PlayerPawn:BP_CharacterModifyDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser) + self.OnReceiveDamageDelegate(self, DamageAmount, EventInstigator, DamageCauser) + + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(UGCPawnAttrSystem.GetPlayerKeyInt64(self)) + -- 获取 闪避 + if PlayerState:Dodge() > 0 then + math.randomseed(KismetSystemLibrary.GetGameTimeInSeconds(self)) + local Val = math.random() -- (0, 1) + if Val <= PlayerState:Dodge() then + -- 此时闪避 + UE.Log("[BP_PlayerPawn:BP_CharacterModifyDamage] 闪避了一次") + return 0 + end + end + + local Val = BP_PlayerPawn.SuperClass:BP_CharacterModifyDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser) + + -- 处理玩家的 defence + DamageAmount = PlayerState:GetDamage(DamageCauser, Val) + UE.Log("[BP_PlayerPawn:BP_CharacterModifyDamage] PlayerKey=%d, 当前受到伤害=%.2f", self.PlayerKey, DamageAmount) + + -- 处理反弹伤害 + PlayerState:GetReverseDamage(DamageCauser, DamageAmount) + + -- 检查是否有护盾 + local Amount = PlayerState:DealShield(DamageAmount) + + return Amount +end + +--玩家进行吸血 +function BP_PlayerPawn:VampBlood(InNum) + if InNum <= 0 then + return + end + -- 获取玩家吸血效率 + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(UGCPawnAttrSystem.GetPlayerKeyInt64(self)) + local Val = PlayerState:SuckBlood(InNum) + -- 回复血量 + self:RecoverCurHP(Val, 0) + UE.Log("[BP_PlayerPawn:VampBlood] Vamp = %.2f", Val) +end + +--传过来一个怪物收到的真实伤害 +function BP_PlayerPawn:DealRealDamage(InMonster, InNum) + -- 处理吸血 + self:VampBlood(InNum) + + -- 可以处理飘字等 + -- 飘字 UGC_GetDamageNumberConfigIndex,可以检查一下 + if GameDataManager.GetMonsterTypeByID(InMonster.ID) == EMonsterType.Boss then + self.BossAttackCount = self.BossAttackCount + 1 + end +end + +-- Server +function BP_PlayerPawn:SetMaxHealth(InMaxHealth) + UGCPawnAttrSystem.SetHealthMax(self, InMaxHealth) + UE.Log("[BP_PlayerPawn:SetMaxHealth] PlayerKey = %d, InMaxHP = %2.2f", self.PlayerKey, InMaxHealth) +end + +-- Server +function BP_PlayerPawn:SetMaxEnergy(InMaxEnergy) + self.EnergyData.Max = InMaxEnergy + self.EnergyData.Cur = InMaxEnergy + UE.Log("[BP_PlayerPawn:SetMaxEnergy] PlayerKey = %d, Max = %2.2f, Cur = %2.2f", self.PlayerKey, self.EnergyData.Max, self.EnergyData.Cur) +end + +-- Server & Client +function BP_PlayerPawn:GetCurEnergy() + return self.EnergyData.Cur +end + +-- Server +function BP_PlayerPawn:ConsumeEnergy(InDelta) + local CurEnergy = math.clamp(self.EnergyData.Cur - InDelta, 0, self.EnergyData.Cur) + self.EnergyData.Cur = CurEnergy +end + +-- Server 回复血量 +function BP_PlayerPawn:RecoverCurHP(Value, Percent) + local MaxHP = UGCPawnAttrSystem.GetHealthMax(self) + local CurHP = UGCPawnAttrSystem.GetHealth(self) + if math.isNearlyEqual(MaxHP, CurHP) then + UE.Log("[BP_PlayerPawn:RecoverCurHP] Full HP") + return + end + + local Delta = Value + MaxHP * Percent + local NewCurHP = CurHP + Delta + NewCurHP = math.clamp(NewCurHP, 0, MaxHP) + + UE.Log("[BP_PlayerPawn:RecoverCurHP] PlayerKey = %d, Value = %2.2f, CurHP = %2.2f, Real = %2.2f", self.PlayerKey, Delta, CurHP, MaxHP - NewCurHP) + UGCPawnAttrSystem.SetHealth(self, NewCurHP) +end + +-- Server +function BP_PlayerPawn:RecoverCurEnergy(Value, Percent) + if UE.IsValid(self) == false then + print(string.format('[BP_PlayerPawn:RecoverCurEnergy] 本身就有问题')) + end + + if self.EnergyData == nil then + print(string.format('[BP_PlayerPawn:RecoverCurEnergy] 莫名其妙 Energy == nil')) + end + + if self.EnergyData.Max == nil then + print(string.format('[BP_PlayerPawn:RecoverCurEnergy] 莫名其妙 Max Energy == nil')) + end + + if self.EnergyData.Cur == nil then + print(string.format('[BP_PlayerPawn:RecoverCurEnergy] 莫名其妙 Cur Energy == nil')) + end + + local MaxEnergy = self.EnergyData.Max + local CurEnergy = self.EnergyData.Cur + if math.isNearlyEqual(MaxEnergy, CurEnergy) and MaxEnergy > 0 then + UE.Log("[BP_PlayerPawn:RecoverCurEnergy] PlayerKey = %d, Full Energy", self.PlayerKey) + return + end + + local Delta = Value + MaxEnergy * Percent + local NewCurEnergy = CurEnergy + Delta + NewCurEnergy = math.clamp(NewCurEnergy, 0, MaxEnergy) + UE.Log("[BP_PlayerPawn:RecoverCurEnergy] PlayerKey = %d, Value = %2.2f, CurHP = %2.2f, Real = %2.2f", self.PlayerKey, Delta, CurEnergy, MaxEnergy - NewCurEnergy) + self.EnergyData.Cur = NewCurEnergy +end + +---玩家重生后初始化数据的逻辑 +function BP_PlayerPawn:OnPlayerRespawned(OwnerPlayerState, OwnerPlayerController) + if (not UE.IsValid(OwnerPlayerState)) or (not UE.IsValid(OwnerPlayerController)) then + UE.LogError("[BP_PlayerPawn:OnPlayerRespawned] invalid PS or PC") + return + end + + ---Attribute init + print(string.format('[BP_PlayerPawn:OnPlayerRespawned] 设置玩家 Energy 的值')) + self:SetMaxEnergy(OwnerPlayerState.BackupEnergyData.Max) + + OwnerPlayerState:ApplyAttributes() + + ---SkillSystem init + if self.SkillSystemComponent == nil then + local SkillSystemComponentClass = require("Script.SimpleSkill.SkillSystemComponent") + self.SkillSystemComponent = SkillSystemComponentClass.New(self) + end + + local SkillListCopy = TableHelper.DeepCopyTable(OwnerPlayerController.ActiveSkillNameList) + for Slot, SkillInfo in pairs(SkillListCopy) do + self:GiveSkill(SkillInfo.SkillName, Slot, SkillInfo.SkillLevel) + end + + ---清空上次死亡上传的备份数据 + OwnerPlayerState.BackupEnergyData = {} + + ---Weapon init + local OwnedWeapons = OwnerPlayerState:GetWeapons() + local CurWeaponId = -1 + if not table.isEmpty(OwnedWeapons) then + CurWeaponId = OwnedWeapons[1].WeaponId + end + + if self.WeaponActor == nil then + AsyncLoadTools:LoadObject(BPClassPath.WeaponBaseActor, + function(WeaponClass) + if UE.IsValid(self) and UE.IsValid(WeaponClass) and UE.IsValid(OwnerPlayerState) then + local Weapon = UGCGameSystem.SpawnActor(self, WeaponClass, self:K2_GetActorLocation(), self:K2_GetActorRotation(), VectorHelper.ScaleOne(), nil) + Weapon:SetWeaponID(CurWeaponId) + Weapon:SetOwnerCharacter(self) + self.WeaponActor = Weapon + self.OnWeaponSpawnedDelegate(self) + end + end) + else + self.WeaponActor:SetWeaponID(CurWeaponId) + end + +end + +--仅切换枪的时候再做操作 +function BP_PlayerPawn:OnUpdateWeapon(InWeaponId, InOldId, InPlayerKey) + -- 因为不需要重复播放 + if InOldId == InWeaponId then + return + end + + if InPlayerKey ~= self.PlayerKey then + return + end + + local WeaponType = GameDataManager.GetWeaponType(InWeaponId) + if WeaponType == nil then + UE.Log("[BP_WeaponPawnBase:CheckWeaponByWeaponId] Data is nil") + return + else + self:ClearParticles() + self:ShowParticle(false) + -- 选择对应的特效,并在玩家身上播放 + local WeaponParticle = self.WeaponParticleArray[WeaponType] + if WeaponParticle ~= nil then + self.ParticleSystem:SetTemplate(WeaponParticle) + if WeaponType == EWeaponClassType.WT_SubmachineGun or WeaponType == EWeaponClassType.WT_Sniper then + -- 持久显示 + local Text = '' + if WeaponType == EWeaponClassType.WT_ShooterRifle then + Text = 'spine_03' + end + self.WeaponParticles[WeaponType] = GameplayStatics.SpawnEmitterAttached(WeaponParticle, self.Mesh, Text, Vector.New(0, 0, 0), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, false) + else + --当攻击的时候显示一次,因此不在这里显示 + end + + UE.Log("[BP_PlayerPawn:OnUpdateWeapon] 播放特效, Type = %d", WeaponType) + end + self:ShowParticle(true) + end +end + +function BP_PlayerPawn:PlaySingleWeaponEffect(InPlayerKey, InWeaponType) + UE.Log("[BP_PlayerPawn:PlaySingleWeaponEffect] 开始播放特效") + if InPlayerKey ~= self.PlayerKey then + return + end + UE.Log("[BP_PlayerPawn:PlaySingleWeaponEffect] 当前武器类型:%d", InWeaponType) + if InWeaponType == nil then + UE.Log("[BP_WeaponPawnBase:CheckWeaponByWeaponId] 找不到 WeaponType, 请检查一下") + return + else + local WeaponParticle = self.WeaponParticleArray[InWeaponType] + if WeaponParticle ~= nil then + UE.Log("[BP_PlayerPawn:PlaySingleWeaponEffect] 有武器特效") + local EffectParticle = GameplayStatics.SpawnEmitterAttached(WeaponParticle, self.Mesh, "", Vector.New(0, 0, 0), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, true) + EventSystem.SetTimer(self, function() + if UE.IsValid(EffectParticle) then + EffectParticle:K2_DestroyComponent() + end + end, 1) + else + UE.Log("[BP_PlayerPawn:PlaySingleWeaponEffect] 找不到武器特效") + end + end +end + +-- 清除玩家身上的特效 +function BP_PlayerPawn:ShowParticle(InShow) + -- 设置隐藏即可 + self.ParticleSystem:SetHiddenInGame(InShow, false) +end + +function BP_PlayerPawn:ClearParticles() + for _, v in pairs(self.WeaponParticles) do + v:K2_DestroyComponent(self) + end + + self.WeaponParticles = {} +end + +function BP_PlayerPawn:IsInMainArea() + return self.IsInArena +end + +function BP_PlayerPawn:IsInExerciseRoom() + return not self.IsInArena +end + +function BP_PlayerPawn:OnRep_IsInArena() + -- 进行 + if UE.IsValid(self.WeaponActor) then + self.WeaponActor:PlayerInArena(self.IsInArena) + end +end + +------------------------------- **************** 技能激活 **************** ----------------------------------- + +---@param SkillNameList ESkillName[] +function BP_PlayerPawn:GiveSkillWithSkillNameList(SkillNameList) + self.SkillSystemComponent:GiveSkillWithList(SkillNameList) +end + +---@param SkillName ESkillName +---@param SlotID ESkillSlot +---@param SkillLevel int +---@return number 返回-1则添加技能失败,返回0则代表当前slot无技能,其余正常情况返回技能ID +function BP_PlayerPawn:GiveSkill(SkillName, SlotID, SkillLevel) + return self.SkillSystemComponent:GiveSkill(SkillName, SlotID, SkillLevel) +end + +function BP_PlayerPawn:TryActiveSkillBySlot(SkillSlot) + if self.SkillSystemComponent ~= nil then + self.SkillSystemComponent:TryActiveSkillBySlot(SkillSlot) + else + UE.Log("SkillSystemComponent of PlayerPawn is nil") + end +end + +function BP_PlayerPawn:RemoveSkill(SkillName) + if self.SkillSystemComponent ~= nil then + self.SkillSystemComponent:RemoveSkill(SkillName) + end +end + +function BP_PlayerPawn:Client_MulticastRPC_PlayEffect(InstanceId, EffectId, CasterActor, ActorList, Duration, SpawnLocationType, BoneName) + if (not UE.IsValid(CasterActor)) then + UE.Log("[Client_MulticastRPC_PlayEffect] invalid CasterActor") + return + end + local EffectSystemManager = require('Script.Manager.EffectSystemManager') + EffectSystemManager.PlayEffect(InstanceId, EffectId, CasterActor, ActorList, Duration, SpawnLocationType, BoneName) +end + +function BP_PlayerPawn:Client_MulticastRPC_PlayDirectionalEffect(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation) + if (not UE.IsValid(CasterActor)) then + UE.Log("[Client_MulticastRPC_PlayDirectionalEffect] invalid CasterActor") + return + end + local EffectSystemManager = require('Script.Manager.EffectSystemManager') + EffectSystemManager.PlayDirectionalEffect(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation) +end + +function BP_PlayerPawn:Client_MulticastRPC_PlayEffectAtLocation(InstanceId, EffectId, CasterActor, Location, Rotation, Duration) + if (not UE.IsValid(CasterActor)) then + UE.Log("[Client_MulticastRPC_PlayEffectAtLocation] invalid CasterActor") + return + end + local EffectSystemManager = require('Script.Manager.EffectSystemManager') + EffectSystemManager.PlayEffectAtLocation(InstanceId, EffectId, CasterActor, Location, Rotation, Duration) +end + +function BP_PlayerPawn:Client_MulticastRPC_RemoveSkillEffect(SkillName, InstanceId, CasterActor) + if (not UE.IsValid(CasterActor)) then + UE.Log("[Client_MulticastRPC_RemoveSkillEffect] invalid CasterActor") + return + end + local EffectSystemManager = require('Script.Manager.EffectSystemManager') + EffectSystemManager.RemoveSkillEffectByInstanceId(SkillName, InstanceId, CasterActor) +end + +function BP_PlayerPawn:Client_MulticastRPC_RemoveAllSkillEffect(CasterActor) + if (not UE.IsValid(CasterActor)) then + UE.Log("[Client_MulticastRPC_RemoveAllSkillEffect] invalid CasterActor") + return + end + local EffectSystemManager = require('Script.Manager.EffectSystemManager') + EffectSystemManager.RemoveAllEffectOfActor(CasterActor) +end + +------------------------------- **************** Debug **************** ----------------------------------- +function BP_PlayerPawn:DrawDebugSphere(Center, Color, Radius) + STExtraGameplayStatics.ClientDrawDebugSphere(Center, Radius, 10, Color, 10, 1) +end + + +function BP_PlayerPawn:DrawDebugLine(Start, End, Color) + STExtraGameplayStatics.ClientDrawDebugLine(Start, End, Color, 10, 1) +end + + +function BP_PlayerPawn:DrawDebugBox(Center, Extent, Color, Rotation) + STExtraGameplayStatics.ClientDrawDebugBox(Center, Extent, Color, Rotation, 1, 2) +end + +return BP_PlayerPawn; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Player/BP_PlayerState.lua b/GZJ/Script/Blueprint/Player/BP_PlayerState.lua new file mode 100644 index 00000000..e6f43ab0 --- /dev/null +++ b/GZJ/Script/Blueprint/Player/BP_PlayerState.lua @@ -0,0 +1,2093 @@ +---@class BP_PlayerState_C:BP_UGCPlayerState_C +--Edit Below-- +UGCGameSystem.UGCRequire('Script.Common.ue_enum_custom') +UGCGameSystem.UGCRequire('Script.Common.ue_struct_custom') +UGCGameSystem.UGCRequire('Script.Global.Global') + +local BP_PlayerState = { + -- [AttributeType] = { AttributeName: Value , ...}, ... + Attributes = {}, -- 玩家属性表,存放所有属性 + CombatPoint = 0, -- 战力 + CoinPoint = { + Total = 0, + Current = 0, + }, -- 金币 + KillPoint = { + Total = 0, + Current = 0, + }, -- 杀敌点 + + KillCount = { + Total = 0, + Boss = 0, + }, -- 杀敌数,用于计算增加量和表示玩家击杀怪物 + Level = 1, -- 等级 + CurExp = 0, -- 获取的总经验 + NextAddExp = 0, -- 由于被打断,之后需要添加的值 + + BreachInfo = { + NeedBreach = false, --是否需要突破 + InBreachProgress = false, --是否正在突破中 + }, + + BreachSuccessTime = 0, --突破成功次数 + + --local ItemData = { + -- WeaponId = InWeaponId, + -- Type = WeaponType, + -- NativeProps = { + -- Common = 0, + -- Plus = { }, + -- }, + -- Properties = { }, + -- Fittings = { }, + -- FittingLevel = 0, + -- } + OwnerWeapons = {}, + TotalWeaponCount = 0, --当前拥有的Weapon数量 + + TechBuyNum = {}, -- 玩家科技表 + + BackupEnergyData = {}, --玩家能量信息备份 + -- 需要同步的射击距离 + AttackRange = 0, -- 同步的射击距离 + ChallengeMonsterTime = {}, + + LastSpecialItems = {}, -- 保存着上一次的词条属性 + + --- 存放特殊词条物品,如果存在,那么就是有该属性;不存在,就取消 + --- [id] = { + --- Times = 0, + --- LastTime = ServerTime, + --- } + SpecialItemTimerHandles = { + ['击败'] = { }, + ['每秒'] = { }, + ['射击'] = { }, + ['射击%'] = { }, + ['周期'] = { }, + ['固定'] = { }, + }, --保存着对应Id的Timer + + --- 存放着继承的等级 + InheritItems = { + ['盔'] = 110, + ['甲'] = 210, + }, + + -- 特殊物品数据存放地方,没有特定结构,数据结构 { [ID] = {}, } + SpecialThings = {}, + + --- 每局游戏通关之类保存的数据 + --- { + --- GameTimes = 0, --游玩局数 + --- GameClearanceTimes = 0, --游戏通关数 + --- TotalCoinPoint = 0, --获取总金币数 + --- TotalKillPoint = 0, --获取总杀敌点数 + --- TotalBossKilledTimes = 0,--击杀 Boss 次数 + --- TotalSuperSkill = 0, --获取总超级技能数 + --- TotalSuperFitting = 0, --获取超级配件数 + --- TotalUnpackTimes = 0, --总开箱次数 + --- Score = 0, --积分 + --- + --- PlayedGames = { --通关过的游戏 + --- Difficulty = Times + --- }, + --- BossDropItems = { + --- ["春"] = { + --- Type: Count + --- }, + --- }, + --- GameDropItems = { + --- Difficulty = { Type: Count }, + --- }, + --- EasterEggs = { --彩蛋类 + --- }, + --- } + ArchiveData = nil, + + -- 存一份缓存 + SavedArchiveData = nil; + GameEndSavedArchiveData = {}; + + -- 新的一局游戏初始数据,该数据是 { Type = Value, ... } + NewGameInitialData = {}, + + EasterEggsData = { + }, + + -- 一些其他属性 + AppendAttribute = {}, + + --当前强制引导信息 + ForceGuideInfo = { + CurStepIndex = -2, + ValidStepIndex = -2, + bIsInStepProgress = false, + StepPendingList = {}, + }, +}; + +function BP_PlayerState:GetReplicatedProperties() + return + "Attributes", + "CoinPoint", + "KillPoint", + "OwnerWeapons", + "TechBuyNum", + "AttackRange", + "TotalWeaponCount", + "ChallengeMonsterTime", + "InheritItems", + "ArchiveData", + {"BreachInfo", "Lazy"}, + {"ForceGuideInfo", "Lazy"}, + {"SavedArchiveData", "Lazy"} +end + +function BP_PlayerState:ReceiveBeginPlay() + BP_PlayerState.SuperClass.ReceiveBeginPlay(self) + + if self:HasAuthority() == true then + self:BindServerEvent() + self:InitWeaponAttribute() + self:InitChallengeMonsterTime(-10000.0) + + for key, _ in pairs(Tables.Tech) do + self.TechBuyNum[key] = 0 + end + + EventSystem.SetTimer(self, function() + --self:TestAddStone() + end, 20) + else + local CommandManager = require('Script.Manager.CommandQueneManager') + CommandManager.bPlayerStateReady = true + CommandManager:AddInitCommand(self, self.Client_Init) + UE.Log("[BP_PlayerState] *** BP_PlayerPawn Tick Init Ready PlayerKey:%s", self.PlayerKey) + end +end + +function BP_PlayerState:ReceiveEndPlay() + if self:HasAuthority() then + self:UnbindServerEvent() + else + CommandQueneManager:RemoveInitCommand(self) + end + + BP_PlayerState.SuperClass:ReceiveEndPlay() +end + +function BP_PlayerState:Client_Init() + if self:GetOwner() == STExtraGameplayStatics.GetFirstPlayerController(self) then + GameDataManager:SetLocalPlayerState(self) + end + self:OnRep_Attributes() + self:OnRep_CoinPoint() + self:OnRep_KillPoint() + self:OnRep_OwnerWeapons() + self:OnRep_TotalWeaponCount() + self:OnRep_AttackRange() +end + +function BP_PlayerState:BindServerEvent() +end + +function BP_PlayerState:UnbindServerEvent() +end + +function BP_PlayerState:InitArchiveData() + local ItemData = { + GameTimes = 0, --游玩局数 + GameClearanceTimes = 0, --游戏通关数 + TotalCoinPoint = 0, --获取总金币数 + TotalKillPoint = 0, --获取总杀敌点数 + TotalBossKilledTimes = 0, --击杀 Boss 次数 + TotalSuperSkill = 0, --获取总超级技能数 + TotalSuperFitting = 0, --获取超级配件数 + TotalUnpackTimes = 0, --总开箱次数 + Score = 0, --总开箱次数 + + PlayedGames = { --游玩过的游戏 + }, + BossDropItems = { + }, + GameDropItems = { + }, + EasterEggs = { --彩蛋类 + }, + } + + -- 初始化 + for i = 1, 13 do + --if i ~= 9 then + ItemData.EasterEggs[i] = { + Active = false, -- 是否激活 + } + --end + end + + return ItemData +end + +-- 加载重生数据 +function BP_PlayerState:LoadNewGameInitialData() + print(string.format('[BP_PlayerState:LoadNewGameInitialData] 加载到 NewGameInitialData 中')) + local Data = self.ArchiveData + local OutTable = {} + + if Data == nil then + -- 说明还未加载,请检查原因 + print(string.format('[BP_PlayerState:LoadNewGameInitialData] Error 按理说此处应该加载了,但是并没有显示出来')) + self.NewGameInitialData = {} + return + end + + -- 通关检查 + if self.ArchiveData.GameClearanceTimes > 0 then + -- i:难度(int); v:次数(int) + for i, v in pairs(self.ArchiveData.PlayedGames) do + -- 从表中进行加载,k: 可以获得奖励的次数; u: 具体奖励 + for k,u in pairs(ArchiveTable.GameClearanceRewards[i]) do + if k <= v then + ArchiveTable.Funcs[ArchiveTable.ArchiveType.GameClearance](i, k, OutTable) + end + end + end + else + -- 表示第一次游玩 + print(string.format('[BP_PlayerState:LoadNewGameInitialData] 第一次游玩')) + end + + local Func = function(InTable, InOutTable) + for i, v in pairs(InTable) do + InOutTable[i] = v + end + end + + -- 积分 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.Credit](self.ArchiveData.Score, OutTable) + --Func(OutTable, self.NewGameInitialData) + -- 依次判断以下内容 + --- 通关 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.Achievement].Func("通关", self.ArchiveData.GameClearanceTimes, OutTable) + --- 击杀首领 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.Achievement].Func("击败", self.ArchiveData.TotalBossKilledTimes, OutTable) + --- 获得金币,单位是w + ArchiveTable.Funcs[ArchiveTable.ArchiveType.Achievement].Func("金币", self.ArchiveData.TotalCoinPoint / 10000, OutTable) + --- 获得杀敌点 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.Achievement].Func("科技点", self.ArchiveData.TotalKillPoint, OutTable) + --- 获得超级技能 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.Achievement].Func("技能", self.ArchiveData.TotalSuperSkill, OutTable) + --- 获得超级配件 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.Achievement].Func("配件", self.ArchiveData.TotalSuperFitting, OutTable) + --- 开箱次数 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.Achievement].Func("开箱", self.ArchiveData.TotalUnpackTimes, OutTable) + Func(OutTable, self.NewGameInitialData) + + -- Boss 掉落物 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.DropBossItems](self.ArchiveData.BossDropItems, OutTable) + Func(OutTable, self.NewGameInitialData) + + -- 游戏掉落物 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.DropGameItems](self.ArchiveData.GameDropItems, OutTable) + Func(OutTable, self.NewGameInitialData) + + log_tree("[BP_PlayerState:LoadNewGameInitialData] Begin self.NewGameInitialData = ", self.NewGameInitialData); + + -- 彩蛋类 + + for EasterIndex, Table in pairs(ArchiveTable.EasterEggs) do + if self.ArchiveData.EasterEggs[EasterIndex] == nil then + self.ArchiveData.EasterEggs[EasterIndex] = { + Active = false; + } + else + if self.ArchiveData.EasterEggs[EasterIndex].Active then + local Type = Table.Reward.Type; + if Type ~= nil then + if self.NewGameInitialData[Type] == nil then + self.NewGameInitialData[Type] = Table.Reward.Value + else + self.NewGameInitialData[Type] = self.NewGameInitialData[Type] + Table.Reward.Value + end + --print(string.format("[BP_PlayerState:LoadNewGameInitialData] Type = " .. tostring(Type))) + end + end + end + end + + --for EasterIndex, Table in pairs(self.ArchiveData.EasterEggs) do + -- if Table and Table.Active then + -- -- 添加进去 + -- local Item = ArchiveTable.EasterEggs[EasterIndex] + -- if Item ~= nil then + -- local Type = Item.Reward.Type + -- if Type ~= nil then + -- if self.NewGameInitialData[Type] == nil then + -- self.NewGameInitialData[Type] = ArchiveTable.EasterEggs[EasterIndex].Reward.Value + -- else + -- self.NewGameInitialData[Type] = self.NewGameInitialData[Type] + ArchiveTable.EasterEggs[EasterIndex].Reward.Value + -- end + -- --print(string.format("[BP_PlayerState:LoadNewGameInitialData] Type = " .. tostring(Type))) + -- end + -- end + -- end + --end + + log_tree("[BP_PlayerState:LoadNewGameInitialData] End self.NewGameInitialData = ", self.NewGameInitialData); + + -- 应用到 Attributes[Base] 中 + --self.NewGameInitialData = OutTable + + print(string.format('[BP_PlayerState:LoadNewGameInitialData] 应用到数据:')) + log_tree("NewGameInitialData = ", self.NewGameInitialData) +end + +function BP_PlayerState:GetGameTimes() + local GameTimes = 0 + local ArchiveData = self.ArchiveData + if ArchiveData then + local ArchivedGameTimes = ArchiveData.GameTimes + GameTimes = ArchivedGameTimes ~= nil and ArchivedGameTimes or 0 + end + + return GameTimes +end + +function BP_PlayerState:GetNeedTriggerForceGuide() + local SavedArchiveData = self.SavedArchiveData + local PlayedGames = SavedArchiveData.PlayedGames + local MaxDifficulty = 0 + for Difficulty, Times in pairs(PlayedGames) do + if Times ~= nil and Times > 0 then + if Difficulty >= 5 then + return false + else + if Difficulty > MaxDifficulty then + MaxDifficulty = Difficulty + end + end + end + end + -- return self:GetGameTimes() <= 100 + local GameDifficulty = UGCGameSystem.GameState.GameDifficulty + return false + -- return GameDifficulty ~= nil and MaxDifficulty < 5 and GameDifficulty > 0 and GameDifficulty <= 2 +end + +-- 初始化存档数据(从 NewGameInitialData 加载到 Attributes[Base] ) +function BP_PlayerState:InitData() + print(string.format('[BP_PlayerState:InitData] 开始往 Attributes 中写入数据')) + + for i, v in pairs(self.NewGameInitialData) do + if self.Attributes[AttributeType.Base][i] ~= nil then + self.Attributes[AttributeType.Base][i] = self.Attributes[AttributeType.Base][i] + v + else + local EnName = GlobalConfigs.AttributeNameTable[i] + if EnName ~= nil then + if self.Attributes[AttributeType.Base][EnName] == nil then + self.Attributes[AttributeType.Base][EnName] = v + else + self.Attributes[AttributeType.Base][EnName] = self.Attributes[AttributeType.Base][EnName] + v + end + else + self.AppendAttribute[i] = v + print(string.format('[BP_PlayerState:InitData] 无法找到名为 %s 的属性,请检查', i)) + end + end + end + + print(string.format('[BP_PlayerState:InitData] 玩家:%d', self.UID)) + log_tree("Attributes = ", self.Attributes) + + -- 下面是检查其他不在 GlobalConfigs 中的一些属性,然后依次实现即可,比如 中级配件 这种 + self:HandleOtherAttribute() +end + +function BP_PlayerState:HandleOtherAttribute() + log_tree("[BP_PlayerState:HandleOtherAttribute] self.AppendAttribute = ", self.AppendAttribute); + for i, v in pairs(self.AppendAttribute) do + if i == '初始金币' then + self.CoinPoint.Current = self.CoinPoint.Current + v + self.CoinPoint.Total = self.CoinPoint.Total + v; + elseif i == '初始科技点' then + self.KillPoint.Current = self.KillPoint.Current + v; + self.KillPoint.Total = self.KillPoint.Total + v; + -- @Test 简化 + --elseif i == '初级配件' then + -- self:GiveArchiveInitItem(EDropItemSet.WeaponParts, EQualityType.Primary) + --elseif i == '中级配件' then + -- self:GiveArchiveInitItem(EDropItemSet.WeaponParts, EQualityType.Middle) + --elseif i == '高级配件' then + -- self:GiveArchiveInitItem(EDropItemSet.WeaponParts, EQualityType.Senior) + elseif i == '初级技能' then + if type(v) == 'number' then + for c = 1, v do + self:GiveArchiveInitItem(EDropItemSet.SkillBooks, EQualityType.Primary, 1) + end + else + self:GiveArchiveInitItem(EDropItemSet.SkillBooks, EQualityType.Primary, 1) + end + elseif i == '中级技能' then + if type(v) == 'number' then + for c = 1, v do + self:GiveArchiveInitItem(EDropItemSet.SkillBooks, EQualityType.Middle, 1) + end + else + self:GiveArchiveInitItem(EDropItemSet.SkillBooks, EQualityType.Middle, 1) + end + elseif i == '高级技能' then + if type(v) == 'number' then + for c = 1, v do + self:GiveArchiveInitItem(EDropItemSet.SkillBooks, EQualityType.Senior, 1) + end + else + self:GiveArchiveInitItem(EDropItemSet.SkillBooks, EQualityType.Senior, 1) + end + --elseif i == "高级抽奖金币消耗%" then + + elseif i == "初始经验" then + -- 添加初始经验 + self:AddExp(v) + else + print(string.format("[BP_PlayerState:HandleOtherAttribute] 此时选项是 %s, 值是 %s", tostring(i), tostring(v))); + end + end +end + +function BP_PlayerState:GiveArchiveInitItem(InType, InQuality, InCount) + local ItemId = 0 + if InType == EDropItemSet.WeaponParts then + local RanNum1 = math.random(1, 5) -- 配件种类 + local RandNum2 = math.random(1, 6) -- 武器 + ItemId = 10000 + RanNum1 * 1000 + RandNum2 * 100 + (InQuality + 1) * 10 + elseif InType == EDropItemSet.SkillBooks then + local RanNum = math.random(9, 32) + ItemId = 20000 + RanNum * 100 + (InQuality + 1) * 10 + end + + -- 加到背包 + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.PlayerKey) + PlayerController:UpdateItemMap(ItemId, InCount) +end + +function BP_PlayerState:TestAddStone() + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.PlayerKey) + PlayerController:UpdateItemMap(31000, 100) + PlayerController:UpdateItemMap(32000, 100) +end + +-- 重置除了基础属性其他属性 +function BP_PlayerState:InitWeaponAttribute() + if self.Attributes[AttributeType.Weapon] ~= nil then + for i, v in pairs(self.Attributes[AttributeType.Weapon]) do + self.Attributes[AttributeType.Weapon][i] = 0 + self.Attributes[AttributeType.WeaponSpecial][i] = 0 + end + end +end + +function BP_PlayerState:InitChallengeMonsterTime(InTime) + for k, TargetMonsterInfo in pairs(Tables.ChallengeInfo) do + self.ChallengeMonsterTime[k] = {LastChallengeTime = InTime, CoolingTime = TargetMonsterInfo.CoolingTime} + end +end + +-- Server +function BP_PlayerState:OnWeaponAttributeChanged(InWeaponId) + -- 在这里判断是不是当前 Weapon,如果不是可以直接不更新 + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] 开始更新玩家属性表") + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + + local WC = PlayerPawn:GetWeaponComponent() + if WC == nil then + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] 检查一下 WC") + return + end + + local CurrWeaponId = WC.CurrentWeaponId + local Data = GameDataManager.GetWeaponConstructDataByID(CurrWeaponId) + if Data == nil then + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] Data is nil") + return + end + + --要更新的不是当前武器,所以忽略 + if InWeaponId ~= CurrWeaponId then + return + end + + -- 清空属性表 + + self:InitWeaponAttribute() + + local OutTable, SpecialItems = --[[WC:GetOutProps()]] {}, {} + + -- 是否要刷新射速 + local bShootRefresh = false + + for i = 1, #OutTable do + local SingleVal = OutTable[i] + + if SingleVal == nil then + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] 里面的值为空,请检查") + else + local Index = GlobalConfigs.AttributeNameTable[SingleVal.Type] + if not bShootRefresh then + if SingleVal.Type ~= nil then + bShootRefresh = string.find(SingleVal.Type, '射速') ~= -1 + else + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] 此时属性是 nil") + end + end + + -- 这些是基础属性 + if Index ~= nil then + -- 添加到武器属性上 + self.Attributes[AttributeType.Weapon][Index] = SingleVal.Value + self.Attributes[AttributeType.Weapon][Index] + print(string.format("[BP_PlayerState:OnWeaponAttributeChanged] Value = %s", tostring(self.Attributes[AttributeType.Weapon][Index]))) + else + -- 检查是否是 Special + if SingleVal.Unit == 'Special' then + print(string.format('[BP_PlayerState:OnWeaponAttributeChanged] 当前是特殊词条')) + self.Attributes[AttributeType.WeaponSpecial][SingleVal.Type] = SingleVal.Value + else + + end + if SingleVal.Type ~= nil then + if math.type(SingleVal.Value) == 'integer' then + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] 未设置:Key: %s, Value = %d", SingleVal.Type, SingleVal.Value) + elseif math.type(SingleVal.Value) == 'float' then + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] 未设置:Key: %s, Value = %f", SingleVal.Type, SingleVal.Value) + else + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] 值为空,请检查一下") + end + else + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] Find Index == nil") + end + end + end + end + + local Val = 0 + for _, v in pairs(self.Attributes) do + Val = Val + v.Base_AttackRange + end + UE.Log("[BP_PlayerState:OnWeaponAttributeChanged] 此时额外攻击距离是 %s", tostring(Val)) + self.AttackRange = Val > 0 and Val or 0 + + if bShootRefresh then + EventSystem:SendEvent(EventType.RefreshShoot) + end + + if table.getCount(SpecialItems) > 0 then + self:DealWithSpecialItems(SpecialItems) + else + print(string.format("[BP_PlayerState:OnWeaponAttributeChanged] 当前没有特殊的配件")) + end + + self:PostChangedProps(); + + self:ApplyAttributes(); +end + +function BP_PlayerState:PostChangedProps() + -- 每1%的暴击伤害%加成会提高3%的射击伤害% + if self:IsCurrentWeaponHasItem(14540) then + local TotalAttack = 0 + for _, v in pairs(self.Attributes) do + TotalAttack = v.Bonus_CriticalAttack + TotalAttack + end + self.Attributes[AttributeType.WeaponSpecial].Bonus_CriticalAttack = TotalAttack * 3 + else + self.Attributes[AttributeType.WeaponSpecial].Bonus_CriticalAttack = 0 + end + + if self:IsCurrentWeaponHasItem(15640) then + local TotalAttack = 0 + for _, v in pairs(self.Attributes) do + TotalAttack = v.Bonus_FireAttack + TotalAttack + end + self.Attributes[AttributeType.WeaponSpecial].Adv_CriticalAttack = TotalAttack * 3 + else + self.Attributes[AttributeType.WeaponSpecial].Adv_CriticalAttack = 0 + end +end + +function BP_PlayerState:DealWithSpecialItems(InItems) + print(string.format("[BP_PlayerState:DealWithSpecialItems] 处理特殊物品")) + -- 此时里面是有数据的 + -- 首先跟之前的进行比较,观察是否有移除或者添加的 Item,找出交集,然后分别对比前后 + local SameItems = {} + local NeedRemoveItems = {} + local NeedAddItems = {} + + local NewItems = {} + local OldItems = {} + + for i = 1, table.getCount(InItems) do + NewItems[InItems[i].ItemId] = 1 + print(string.format("[BP_PlayerState:DealWithSpecialItems] Item Id = %d", InItems[i].ItemId)) + end + for i = 1, table.getCount(self.LastSpecialItems) do + OldItems[self.LastSpecialItems[i]] = 1 + end + + for i, v in pairs(NewItems) do + if OldItems[i] == 1 then + -- 说明这是公共的 + SameItems[i] = 1 + else + -- 说明是需要添加的 + NeedAddItems[i] = 1 + end + end + for i, v in pairs(OldItems) do + if OldItems[i] == nil then + -- 说明是需要移除的 + NeedRemoveItems[i] = 1 + end + end + + self.LastSpecialItems = InItems + + if table.getCount(SameItems) then + for i, v in pairs(SameItems) do + print(string.format("[BP_PlayerState:DealWithSpecialItems] 相同的物品:%d", i)) + end + end + + if table.getCount(NeedAddItems) > 0 then + for i, v in pairs(NeedAddItems) do + print(string.format("[BP_PlayerState:DealWithSpecialItems] 需要添加的物品:%d", i)) + end + end + + if table.getCount(NeedRemoveItems) > 0 then + for i, v in pairs(NeedRemoveItems) do + print(string.format("[BP_PlayerState:DealWithSpecialItems] 需要移除的物品:%d", i)) + end + end + + if table.getCount(NeedAddItems) > 0 then + self:AddSpecialItems(NeedAddItems) + end + if table.getCount(NeedRemoveItems) > 0 then + self:RemoveSpecialItems(NeedRemoveItems) + end +end + +-- {id = 1} +function BP_PlayerState:AddSpecialItems(InItems) + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + print(string.format("[BP_PlayerState:AddSpecialItems] 添加特殊物品")) + for i, v in pairs(InItems) do + print(string.format("[BP_PlayerState:AddSpecialItems] 特殊物品:%d", i)) + local Cond = DropItemMap.SpecialFittingProperties[i][1].Condition + + self.SpecialItemTimerHandles[Cond][i] = { + Times = 0, + LastTime = 0, + } + if Cond == '击败' then + + elseif Cond == '每秒' then + + elseif Cond == '射击' then + + --self:Special_RemoveKillCount(i) + elseif Cond == '射击%' then + + elseif Cond == '周期' then + + elseif Cond == '固定' then + + end + end +end + +-- {id = 1} +function BP_PlayerState:RemoveSpecialItems(InItems) + for i, v in pairs(InItems) do + local Cond = DropItemMap.SpecialFittingProperties[i][1].Condition + self.SpecialItemTimerHandles[Cond][i] = { + Times = 0, + LastTime = 0, + } + if Cond == '击败' then + self:Special_RemoveKillCount(i) + elseif Cond == '每秒' then + self:Special_RemoveKillCount(i) + elseif Cond == '射击' then + self:Special_RemoveKillCount(i) + elseif Cond == '射击%' then + + elseif Cond == '周期' then + + elseif Cond == '固定' then + + end + end +end + +--测试打印所有属性 +function BP_PlayerState:PrintAllAttributes() + UE.Log("[BP_PlayerState:PrintAllAttributes] 开始打印 Attributes") + --玩家的普通属性 + for _, v in pairs(self.Attributes) do + print(string.format('[BP_PlayerState:PrintAllAttributes] Id = %d', _)) + for j, k in pairs(v) do + if math.type(k) == 'integer' then + UE.Log('%s = %d', j, k) + elseif math.type(k) == 'float' then + UE.Log('%s = %f', j, k) + end + end + end + UE.Log("[BP_PlayerState:PrintAllAttributes] 结束打印 Attributes") +end + +-- 应用玩家最大生命值和最大能量值属性 +function BP_PlayerState:ApplyAttributes() + print(string.format('[BP_PlayerState:ApplyAttributes] 执行方法')) + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + + --self:PrintAllAttributes() + local TheHP = 0 + local TheEnergy = 0 + for _, v in pairs(self.Attributes) do + TheHP = TheHP + v.Base_MaxHP + TheEnergy = TheEnergy + v.Base_MaxEnergy + end + UE.Log("[BP_PlayerState:ApplyAttributes] PlayerKey = %d, MaxHealth = %f, MaxEnergy = %f", self.PlayerKey, TheHP, TheEnergy) + + PlayerPawn:SetMaxHealth(TheHP) + PlayerPawn:SetMaxEnergy(TheEnergy) +end + +-- 武器属性不用管 +function BP_PlayerState:GrowthAttributes() + local GrowthHp = 0 + + -- 直接读取所有的 GrowthHp + for _, v in pairs(self.Attributes) do + GrowthHp = v.Growth_MaxHP * (1 + v.Bonus_MaxHP) + GrowthHp + end + + if GrowthHp > 0 then + self.Attributes[AttributeType.Base].Base_MaxHP = self.Attributes[AttributeType.Base].Base_MaxHP + GrowthHp + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + local Temp = 0 + for _, v in pairs(self.Attributes) do + Temp = Temp + v.Base_MaxHP + end + PlayerPawn:SetMaxHealth(Temp) + end + + for _, v in pairs(self.Attributes) do + v.Base_Attack = v.Base_Attack + v.Growth_Attack * (1 + v.Bonus_Attack) + end +end + +-- 武器属性不用管 +function BP_PlayerState:GrowthKillPoint() + local Temp = 0 + for _, v in pairs(self.Attributes) do + Temp = Temp + v.Growth_KillPoint * (1 + v.Eco_KillPoint) + end + self.KillPoint.Current = self.KillPoint.Current + Temp + self.KillPoint.Total = self.KillPoint.Total + Temp + + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](self, 6) +end + +-- 战斗力公式(没啥用,就仅显示) +function BP_PlayerState:RefreshCombatPoint() + local CombatPoint = 0 + for _, v in pairs(self.Attributes) do + CombatPoint = CombatPoint + + v.Base_MaxHP / 250 + v.Base_Attack / 50 + v.Base_Defence / 4 + v.Adv_DefencePenetration * 3 + + v.Adv_CriticalAttackRate * 20000 + v.Adv_CriticalAttack * 150 + v.Adv_FireAttack * 225 + v.Adv_DefencePenetrationPercent * 50000 + + v.Adv_AdditionalAttack * 30000 + v.Adv_FinalAttack * 30000 + v.Growth_MaxHP * 500 + v.Growth_Attack * 2500 + + v.Base_AttackSpeed * 2000 + v.Bonus_Attack * 5000 + v.Bonus_MaxHP * 10000 + v.Bonus_Defence * 5000 + + v.Bonus_DamageReduction * 200000 + v.Eco_CoinPoint * 2000 + v.Eco_KillPoint * 2000 + v.Eco_Exp * 3000 + + v.Eco_DropRate * 2000 + v.Bonus_CriticalAttack * 100000 + v.Bonus_FireAttack * 150000 + v.Growth_Kill_MaxHP * 1000 + v.Growth_Kill_Attack * 5000 + end + self.CombatPoint = math.ceil(CombatPoint) + EventSystem:SendEvent(EventType.ServerOnCombatPointChanged, self.PlayerKey, self.CombatPoint) +end + +-- 玩家造成伤害公式,InVal是反弹伤害 +function BP_PlayerState:MakeDamage(InEnemy, InVal) + --这个是敌人受到伤害加成 + local EnemyAppendDamage = self:GetAdditionDamage() + local Damage = 0 + for _, v in pairs(self.Attributes) do + Damage = Damage + (v.Base_Attack * (1 + v.Bonus_Attack)) * (1 + v.Adv_FireAttack * (1 + v.Bonus_FireAttack) + + v.Adv_AdditionalAttack) * (1 + EnemyAppendDamage) * (1 + v.Adv_FinalAttack) + end + + -- 每射击5次,下次射击必定暴击 + if self:IsCurrentWeaponHasItem(11140) then + local TheId = 11140 + local AttackTimes = DropItemMap.SpecialFittingProperties[TheId][1].Times + if self.SpecialThings[TheId] == nil then + self.SpecialThings[TheId] = {} + end + if self.SpecialThings[TheId].Times ~= nil then + if self.SpecialThings[TheId].Times < AttackTimes then + self.SpecialThings[TheId].Times = self.SpecialThings[TheId].Times + 1 + self.SpecialThings[TheId].CertainCriticalAttack = true + else + self.SpecialThings[TheId].Times = self.SpecialThings[TheId].Times - AttackTimes + self.SpecialThings[TheId].CertainCriticalAttack = false + -- 让下次射击暴击 + end + else + self.SpecialThings[TheId].Times = 1 + self.SpecialThings[TheId].CertainCriticalAttack = false + end + end + + --每次射击有25%概率造成2次伤害 + local Val = 1 + if self:IsCurrentWeaponHasItem(11440) and math.RandomValue(25) then + Val = 2 + end + + -- 射击有5%概率使敌人防御值降低30%,持续5秒 + local TheId1 = 14240 + if self:IsCurrentWeaponHasItem(TheId1) then + local ServerTime = KismetSystemLibrary.GetGameTimeInSeconds(self) + if self.SpecialThings[TheId1] == nil then + self.SpecialThings[TheId1] = {} + self.SpecialThings[TheId1].ServerTime = ServerTime + self.SpecialThings[TheId1].LimitServerTime = ServerTime + else + local LimitServerTime = self.SpecialThings[TheId1].ServerTime + if self.SpecialThings[TheId1].ServerTime > LimitServerTime then + if math.RandomValue(0.01 * DropItemMap.SpecialFittingProperties[TheId1][1].Probability) then + InEnemy:SetDefenseScale(DropItemMap.SpecialFittingProperties[TheId1][1].Benefit.Value) + self.SpecialThings[TheId1].LimitServerTime = DropItemMap.SpecialFittingProperties[TheId1][1].CoolDown + ServerTime + end + else + self.SpecialThings[TheId1].ServerTime = ServerTime + end + end + end + + if self:OnCriticalAttack() then + local Multiply = 0 + for _, v in pairs(self.Attributes) do + Multiply = Multiply + (1 + v.Adv_CriticalAttack) * (1 + v.Bonus_CriticalAttack) + end + Damage = Damage * Multiply + end + + if InVal == nil then + InVal = 0 + end + + return Damage * Val + InVal +end + +-- private 计算是否暴击 +function BP_PlayerState:OnCriticalAttack() + local TheId = 11140 + local ShouldCriticalAttack = self.SpecialThings[TheId] ~= nil and self.SpecialThings[TheId].CertainCriticalAttack or false + local CriticalAttackPercent = 0 + for _, v in pairs(self.Attributes) do + CriticalAttackPercent = CriticalAttackPercent + v.Adv_CriticalAttackRate + end + local RandomVal = math.random() + return RandomVal <= CriticalAttackPercent or ShouldCriticalAttack +end + +-- 玩家防御穿透 +function BP_PlayerState:DefencePenetrate() + local Temp = 0 + for _, v in pairs(self.Attributes) do + Temp = Temp + v.Adv_DefencePenetration + end + return Temp +end + +-- 玩家产生的伤害加成 +function BP_PlayerState:GetAdditionDamage() + return 0 +end + +-- 减伤公式 +function BP_PlayerState:InjuryReduction(InEnemy) + -- local EnemyDefence = InEnemy:GetDefense() + local EnemyDefencePercent = InEnemy.DamageReductionPercentage + -- 伤害减免 + local Temp = 0 + for i, v in pairs(self.Attributes) do + Temp = Temp + (v.Base_Defence * (1 + v.Bonus_Defence) - 0) * (1 - EnemyDefencePercent) + end + return Temp +end + +-- 玩家收到的伤害 +function BP_PlayerState:GetDamage(InEnemy, InNum) + local EnemyDamage = self:InjuryReduction(InEnemy) + local Temp = 0 + for _, v in pairs(self.Attributes) do + Temp = Temp + v.Bonus_DamageReduction + end + local Res = InNum * (1 - (EnemyDamage / (EnemyDamage + 1000))) * (1 - Temp) + return Res +end + +--反弹伤害 +function BP_PlayerState:GetReverseDamage(InEnemy) + local Ir = self:InjuryReduction(InEnemy) + return self:MakeDamage(InEnemy) * (1 - Ir) +end + +-- 根据数值进行 Reverse Damage +function BP_PlayerState:GetReverseDamage(InEnemy, InNum) + local Ir = self:InjuryReduction(InEnemy) + local Damage = 0 + local DamagePercent = 0 + + -- 计算反弹伤害 + for i, v in pairs(self.Attributes) do + Damage = v.Base_ReboundDamage + Damage + DamagePercent = v.Base_ReboundDamagePercent + DamagePercent + end + + return self:MakeDamage(InEnemy, Damage + InNum * DamagePercent) * (1 - Ir) +end + +-- 处理护盾,返回具体受到的伤害 +function BP_PlayerState:DealShield(InDamage) + if self.Attributes[AttributeType.Base].Base_Shield > InDamage then + self.Attributes[AttributeType.Base].Base_Shield = self.Attributes[AttributeType.Base].Base_Shield - InDamage + return 0 + else + local Ret = InDamage - self.Attributes[AttributeType.Base].Base_Shield + self.Attributes[AttributeType.Base].Base_Shield = 0 + return Ret + end +end + +--吸血 +function BP_PlayerState:SuckBlood(InDamage) + local VampVal = 0 + for _, v in pairs(self.Attributes) do + VampVal = VampVal + v.Base_Vamp + end + return InDamage * (1 - 1 / (1 + VampVal)) +end + +-- 闪避 +function BP_PlayerState:Dodge() + local Rate = 0 + for _, v in pairs(self.Attributes) do + Rate = Rate + v.Base_EvadeRate + end + return 1 - 1 / (1 + Rate) +end + +-- 韧性 +function BP_PlayerState:Tenacity() + local Rate = 0 + for _, v in pairs(self.Attributes) do + Rate = Rate + v.Base_Toughness + end + return 1 - Rate +end + +-- 每秒射速 +function BP_PlayerState:ShootTimeEverSecond() + local AttackSpeed, Rate = 0, 0 + for _, v in pairs(self.Attributes) do + Rate = Rate + v.Base_AttackIntervalReduction + AttackSpeed = AttackSpeed + v.Base_AttackSpeed + end + return AttackSpeed / Rate +end + +-- 每秒生命值 +function BP_PlayerState:RecoverPlayerPawn() + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + local RecoverHp, RecoverHpPercent, bre, brep = 0, 0, 0, 0 + for _, v in pairs(self.Attributes) do + RecoverHp = RecoverHp + v.Base_RecoverHP + RecoverHpPercent = RecoverHpPercent + v.Base_RecoverHPPercent + bre = bre + v.Base_RecoverEnergy + brep = brep + v.Base_RecoverEnergyPercent + end + UE.Log("[BP_PlayerState:RecoverPlayerPawn] PlayerKey: %d, Recover HP = %s, Recover HP Percent = %s", self.PlayerKey, tostring(RecoverHp), tostring(RecoverHpPercent)) + + if UE.IsValid(PlayerPawn) then + self:RecoverPlayerCurHP(PlayerPawn, RecoverHp, RecoverHpPercent) + self:RecoverPlayerCurEnergy(PlayerPawn, bre, brep) + end +end + +-- 每秒刷新的数据 +function BP_PlayerState:AttributeAdditionPerSecond() + --每秒杀敌点 + local val, Shield = 0, 0 + for _, v in pairs(self.Attributes) do + val = val + v.Growth_KillPoint + Shield = Shield + v.Growth_Shield + end + if val > 0 then + self.KillPoint.Current = math.ceil(self.KillPoint.Current + val) + self.KillPoint.Total = (self.KillPoint.Total + val) + end + + self:Special_AddPerSecondProp(12440, 0) + self:Special_AddPerSecondProp(12540, 0) + + -- 查看是否需要护盾,该值是 % + if Shield > 0 then + self:PropShield('Shield', Shield) + end + + -- 每隔10秒,进入嗜血状态,该状态下吸血%达到100%,持续2秒 + if self:IsCurrentWeaponHasItem(11340) then + local TheId = 11340 + if self.SpecialThings[TheId] == nil then + self.SpecialThings[TheId] = {} + self.SpecialThings[TheId].CurrentTime = 1 + else + self.SpecialThings[TheId].CurrentTime = self.SpecialThings[TheId].CurrentTime + 1 + if self.SpecialThings[TheId].CurrentTime >= 10 then + -- 此时启动即可 + self.Attributes[AttributeType.WeaponSpecial].Base_Vamp = 1 + EventSystem.SetTimer(self, function() + self.Attributes[AttributeType.WeaponSpecial].Base_Vamp = 0 + end, 2) + end + end + end +end + +-- 此处 Id 是护盾的意思 +function BP_PlayerState:PropShield(InId, InValue) + if self.SpecialThings[InId] == nil then + self.SpecialThings[InId] = 0 + end + if self.SpecialThings[InId] < 10 then + self.SpecialThings[InId] = self.SpecialThings[InId] + 1 + else + local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + local MaxHP = UGCPawnAttrSystem.GetHealthMax(Pawn) + local AppendHealth = InValue * MaxHP + self.Attributes[AttributeType.Base].Base_Shield = self.Attributes[AttributeType.Base].Base_Shield + AppendHealth + end +end + +-- 这是添加每秒的东西 +function BP_PlayerState:Special_AddPerSecondProp(InId, InTime) + if self:IsCurrentWeaponHasItem(InId) then + if self.SpecialThings[InId] == nil then + self.SpecialThings[InId] = 0 + end + if self.SpecialThings[InId] < InTime then + self.SpecialThings[InId] = self.SpecialThings[InId] + 1 + else + local Val = DropItemMap.SpecialFittingProperties[InId][1].Benefit + self:AddAttribute(Val.Type, Val.Value, true) + self.SpecialThings[InId] = 0 + end + end +end + +function BP_PlayerState:GetDroppingRate() + local DropRate = 0 + for i, v in pairs(self.Attributes) do + DropRate = DropRate + v.Eco_DropRate + end + return DropRate +end + +function BP_PlayerState:RecoverPlayerCurHP(Pawn, Value, Percent) + Pawn:RecoverCurHP(Value, Percent) +end + +function BP_PlayerState:RecoverPlayerCurEnergy(Pawn, Value, Percent) + Pawn:RecoverCurEnergy(Value, Percent) +end + +--server 增加或者减少金币 +function BP_PlayerState:UpdateCoinPoint(InDelta) + if self.CoinPoint.Current + InDelta < 0 then + return false + else + if InDelta > 0 then + self:AddCoinPoint(InDelta) + else + self.CoinPoint.Current = self.CoinPoint.Current + InDelta + end + return true + end +end + +---生效范围:S,向上取整 +function BP_PlayerState:AddCoinPointDirectly(InDelta) + if InDelta <= 0 then + return false + end + self.CoinPoint.Current = self.CoinPoint.Current + InDelta + self.CoinPoint.Current = math.ceil(self.CoinPoint.Current) + self.CoinPoint.Total = self.CoinPoint.Total + InDelta + + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](self, 1) + return true +end + +---生效范围:S,向上取整 +function BP_PlayerState:AddTechPointDirectly(InDelta) + local Delta = InDelta + self.KillPoint.Current = self.KillPoint.Current + Delta + self.KillPoint.Total = self.KillPoint.Total + Delta + self.KillPoint.Current = math.ceil(self.KillPoint.Current) +end + +---生效范围:S,向上取整 +function BP_PlayerState:AddCoinPoint(InDelta) + local Temp = 0 + for i, v in pairs(self.Attributes) do + Temp = Temp + v.Eco_CoinPoint + end + local Delta = InDelta * (1 + Temp) + self.CoinPoint.Current = self.CoinPoint.Current + Delta + self.CoinPoint.Current = math.ceil(self.CoinPoint.Current) + self.CoinPoint.Total = self.CoinPoint.Total + Delta + + -- 检查一下 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](self, 1) +end + +---生效范围:S,向上取整 +function BP_PlayerState:AddKillPoint(InDelta) + local Temp = 0 + for i, v in pairs(self.Attributes) do + Temp = Temp + v.Eco_KillPoint + end + local Delta = InDelta * (1 + Temp) + self.KillPoint.Current = self.KillPoint.Current + Delta + self.KillPoint.Total = self.KillPoint.Total + Delta + self.KillPoint.Current = math.ceil(self.KillPoint.Current) +end + +-- 添加杀敌数(这个是真实数据) +function BP_PlayerState:AddKillCount() + self.KillCount.Total = self.KillCount.Total + 1 + local Temp = 0 + for i, v in pairs(self.Attributes) do + Temp = Temp + v.Growth_Kill_Attack + end + self.Attributes[AttributeType.Base].Base_Attack = self.Attributes[AttributeType.Base].Base_Attack + Temp + + -- 执行 4 个 + --local val = '击败' + --for i, v in pairs(self.SpecialItemTimerHandles[val]) do + -- print(string.format("[BP_PlayerState:AddKillCount] ItemID = %d", i)) + -- self:Special_AddKillCount(val, i) + --end +end + +--添加特殊词条 支持杀敌,这是那种有最大射击数的 +function BP_PlayerState:Special_AddKillCount(InCond, InId) + --说明开启了 + print(string.format("[BP_PlayerState:Special_AddKillCount] 执行到了")) + if self.SpecialItemTimerHandles[InCond] == nil then + return + end + local Prop = self.SpecialItemTimerHandles[InCond][InId] + local ServerTime = KismetSystemLibrary.GetGameTimeInSeconds(self) + + -- 是否可以操作 + local CanDoOperation = false + + -- 说明当前还没开始 + if Prop.Times == 0 then + -- 记录开始的时间 + self.SpecialItemTimerHandles[InCond][InId].Times = 1 + CanDoOperation = true + else + local LastTime = self.SpecialItemTimerHandles[InCond][InId].LastTime + local ContinueTime = DropItemMap.SpecialFittingProperties[InId][1].ContinueTime + if ContinueTime == nil or ContinueTime == -1 then + if Prop.Times <= DropItemMap.SpecialFittingProperties[InId][1].Times then + CanDoOperation = true + self.SpecialItemTimerHandles[InCond][InId].Times = Prop.Times + 1 + end + else + if ServerTime - LastTime > ContinueTime then + --重置 + self.SpecialItemTimerHandles[InCond][InId].Times = 0 + self:Special_AddKillCount(InId) + else + if Prop.Times <= DropItemMap.SpecialFittingProperties[InId][1].Times then + CanDoOperation = true + self.SpecialItemTimerHandles[InCond][InId].Times = Prop.Times + 1 + end + end + end + end + + self.SpecialItemTimerHandles[InCond][InId].LastTime = ServerTime + + if CanDoOperation then + local ChineseType = DropItemMap.SpecialFittingProperties[InId][1].Benefit.Type + -- 往这里面添加数据 + print(string.format("[BP_PlayerState:Special_AddKillCount] Current Type = %s", ChineseType)) + self.Attributes[AttributeType.WeaponSpecial][GlobalConfigs.AttributeNameTable[ChineseType]] = DropItemMap.SpecialFittingProperties[InId][1].Benefit.Value * self.SpecialItemTimerHandles[InCond][InId].Times + end +end + +--移除特殊词条 +function BP_PlayerState:Special_RemoveKillCount(InId) + local ChineseType = DropItemMap.SpecialFittingProperties[InId][1].Benefit.Type + self.Attributes[AttributeType.WeaponSpecial][GlobalConfigs.AttributeNameTable[ChineseType]] = 0 + + table.remove(self.SpecialItemTimerHandles, InId) +end + +-- Server +function BP_PlayerState:SetLevelDirectly(NewLevel) + self.Level = NewLevel + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](self, 7) + EventSystem:SendEvent(EventType.ServerOnLevelAndExpChanged, self.PlayerKey, self.Level, self.CurExp, self:GetNeedExpByLevel(self.Level)) +end + +-- Server +function BP_PlayerState:AddExp(InDelta) + -- 判断当前 Exp,改变当前传入的值 + if InDelta < 0 then + return + end + + -- 限制一下最高等级 + if self.Level >= 60 then + return + end + + -- 需要检查一下该值的变化 + if self.BreachInfo.NeedBreach then + return + end + + -- 数值 + local Temp = 0 + for _, v in pairs(self.Attributes) do + Temp = Temp + v.Eco_Exp + end + -- 当前产生的 Exp + local Val = self.CurExp + InDelta * (1 + Temp) + + Val = Val + self.NextAddExp; + + if Val <= 0 then + return + end + + local NeedExp = self:GetNeedExpByLevel(self.Level) + + while Val >= NeedExp do + self.Level = self.Level + 1 + Val = Val - NeedExp + + if self.Level % 10 == 0 then + self.BreachInfo.NeedBreach = true + self.BreachInfo.InBreachProgress = false + UnrealNetwork.RepLazyProperty(self, "BreachInfo") + + -- 此时设置 加入之后需要添加的量 + self.NextAddExp = Val + Val = 0 + end + if self.Level % 8 == 0 then + local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(self.PlayerKey) + UnrealNetwork.CallUnrealRPC(PC, PC, "ClientRPC_TriggerGuide", 15) + end + if self.Level == 3 then + local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(self.PlayerKey) + UnrealNetwork.CallUnrealRPC(PC, PC, "ClientRPC_TriggerGuide", 31) + end + NeedExp = self:GetNeedExpByLevel(self.Level) + + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + self:RecoverPlayerCurHP(PlayerPawn, 0, 1.0) + self:RecoverPlayerCurEnergy(PlayerPawn, 0, 1.0) + UnrealNetwork.CallUnrealRPC_Multicast(PlayerPawn, "Client_MulticastRPC_PlayEffect", GameDataManager.GetEffectInstanceId(), 35, PlayerPawn, nil, 0, EEffectSpawnLocationType.Attach) + end + + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](self, 7) + + self.CurExp = Val + + EventSystem:SendEvent(EventType.ServerOnLevelAndExpChanged, self.PlayerKey, self.Level, self.CurExp, self:GetNeedExpByLevel(self.Level)) +end + +-- S, 杀敌后根据杀敌威力值增加威力值 +function BP_PlayerState:GrowthKillAttack() + local Temp = 0 + for i, v in pairs(self.Attributes) do + Temp = Temp + v.Growth_Kill_Attack + end + self.Attributes[AttributeType.Base].Base_Attack = self.Attributes[AttributeType.Base].Base_Attack + Temp +end + +--- Server 重铸武器的属性 +---@return bool 是否重铸成功 +function BP_PlayerState:ResetWeapon(InWeaponId) + -- 移除武器的所有属性,然后再给武器添加对应这么多的属性 + local FindIndex = 0 + for i = 1, table.getCount(self.OwnerWeapons) do + if self.OwnerWeapons[i].WeaponId == InWeaponId then + FindIndex = i + break + end + end + + if FindIndex == 0 then + UE.Log("[BP_PlayerState:ResetWeapon] 找不到对应武器:%d", InWeaponId) + return false + end + + --先看一下有多少条 + local PlusPropCount = #self.OwnerWeapons[FindIndex].NativeProps.Plus + self.OwnerWeapons[FindIndex].NativeProps.Plus = {} + local bSuccess = self:AddNewEntry(InWeaponId, PlusPropCount) + local PlayerCharacter = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + if PlayerCharacter ~= nil and PlayerCharacter.WeaponActor ~= nil then + if PlayerCharacter.WeaponActor.CurrentWeaponId == InWeaponId then + self:OnWeaponAttributeChanged(InWeaponId) + end + end + return bSuccess +end + +function BP_PlayerState:OnRep_Attributes() + if GameDataManager and GameDataManager.GetLocalPlayerState() == self then + EventSystem:SendEvent(EventType.OnPlayerAttributeChanged, self.Attributes) + + if self.Attributes[AttributeType.Base] and self.Attributes[AttributeType.Base].Base_Attack then + EventSystem:SendEvent(EventType.OnPlayerBaseAttackValueChanged, self.PlayerKey, self.Attributes[AttributeType.Base].Base_Attack) + end + end +end + +function BP_PlayerState:OnRep_CoinPoint() + if GameDataManager and GameDataManager.GetLocalPlayerState() == self then + if EventSystem and EventType then + EventSystem:SendEvent(EventType.PlayerCoinPointChanged, self.CoinPoint.Current) + end + end +end + +function BP_PlayerState:OnRep_KillPoint() + if GameDataManager and GameDataManager.GetLocalPlayerState() == self then + EventSystem:SendEvent(EventType.PlayerKillPointChanged, self.KillPoint.Current) + end +end + +function BP_PlayerState:OnRep_OwnerWeapons() + -- 通知更新 武器 + if EventSystem ~= nil and EventType ~= nil then + EventSystem:SendEvent(EventType.UpdateAllWeapon, self.OwnerWeapons, self.PlayerKey) + end + + log_tree_dev("PlayerKey = "..tostring(self.PlayerKey) .. " ,OwnerWeapons = ", self.OwnerWeapons) +end + +--这个是更新所有背包中的武器 +function BP_PlayerState:OnRep_TotalWeaponCount(InOldCount) + if GameDataManager.GetLocalPlayerState() == nil then + return + end + if self.TotalWeaponCount == InOldCount then + return + end + if self.PlayerKey ~= GameDataManager.GetLocalPlayerState().PlayerKey then + return + end + + --进行通知 + EventSystem:SendEvent(EventType.RefreshWeapons, self.TotalWeaponCount) +end + +function BP_PlayerState:OnRep_InheritItems() + if EventSystem ~= nil and EventType ~= nil then + EventSystem:SendEvent(EventType.PlayerInheritItemsChanged, self.InheritItems) + end +end + +function BP_PlayerState:OnRep_BreachInfo() + UE.Log("[BP_PlayerState:OnRep_BreachInfo] NeedBreach=%s, InBreachProgress=%s", tostring(self.BreachInfo.NeedBreach), tostring(self.BreachInfo.InBreachProgress)) + EventSystem:SendEvent(EventType.ToggleBreachButton, self:GetNeedShowBreachButton(), self.PlayerKey) +end + +-- 获取是否能生成突破怪 +function BP_PlayerState:GetCanSpawnBreachMonster() + return self.BreachInfo.NeedBreach == true and self.BreachInfo.InBreachProgress == false +end + +-- 获取是否需要显示突破按钮 +function BP_PlayerState:GetNeedShowBreachButton() + return self.BreachInfo.NeedBreach == true and self.BreachInfo.InBreachProgress == false +end + +-- Server 应用等级改变 +function BP_PlayerState:OnChangedLevel() + -- 依次添加 + local IsZero = self.Level % 10 == 0 + local BreachLevel = 0 + if IsZero then + BreachLevel = self.Level / 10 + end + + self.Attributes[AttributeType.Base].Base_MaxHP = self.Attributes[AttributeType.Base].Base_MaxHP + LevelRewards.EachLevel.Health + self.Attributes[AttributeType.Base].Base_Attack = self.Attributes[AttributeType.Base].Base_Attack + LevelRewards.EachLevel.Attack + self.Attributes[AttributeType.Base].Base_Defence = self.Attributes[AttributeType.Base].Base_Defence + LevelRewards.EachLevel.Defence + + if BreachLevel <= 0 then + return + end + -- Apply Attributes + -- TODO 阉割版 + --self.Attributes[AttributeType.Base].Base_MaxHP = self.Attributes[AttributeType.Base].Base_MaxHP + Tables.BreachRewards[BreachLevel].Health + --self.Attributes[AttributeType.Base].Base_Attack = self.Attributes[AttributeType.Base].Base_Attack + Tables.BreachRewards[BreachLevel].Attack + --self.Attributes[AttributeType.Base].Eco_CoinPoint = self.Attributes[AttributeType.Base].Eco_CoinPoint + Tables.BreachRewards[BreachLevel].Bonus_Gold + --self.Attributes[AttributeType.Base].Base_AttackSpeed = self.Attributes[AttributeType.Base].Base_AttackSpeed + Tables.BreachRewards[BreachLevel].Attack_Speed + --self.Attributes[AttributeType.Base].Adv_FireAttack = self.Attributes[AttributeType.Base].Adv_FireAttack + Tables.BreachRewards[BreachLevel].Attack_Damage + + -- -- 应用提升等级奖励 + local Func = function(InLevel, InVal) + if InLevel <= 1 then + return 0 + end + return LevelRewards.Rewards[InLevel - 1][InVal] + end + self.Attributes[AttributeType.Base].Base_MaxHP = self.Attributes[AttributeType.Base].Base_MaxHP + LevelRewards.Rewards[BreachLevel].Health - Func(BreachLevel, 'Health') + self.Attributes[AttributeType.Base].Base_Attack = self.Attributes[AttributeType.Base].Base_Attack + LevelRewards.Rewards[BreachLevel].Attack - Func(BreachLevel, 'Attack') + self.Attributes[AttributeType.Base].Base_AttackSpeed = self.Attributes[AttributeType.Base].Base_AttackSpeed + LevelRewards.Rewards[BreachLevel].AttackSpeed - Func(BreachLevel, 'AttackSpeed') + + self.Attributes[AttributeType.Base].Growth_Kill_Attack = self.Attributes[AttributeType.Base].Growth_Kill_Attack + 1 + + self:ApplyAttributes() +end + +-- +function BP_PlayerState:GetNeedExpByLevel(InLevel) + return math.ceil((100 + 113.103448 * (InLevel - 1)) / (InLevel <= 10 and 2 or 1)) +end + +-- +function BP_PlayerState:OnRep_AttackRange() + -- 通知更新 + if EventSystem ~= nil and EventType ~= nil then + EventSystem:SendEvent(EventType.AttackRangeChanged, self.AttackRange) + end +end + +--创建一个新的武器并添加到列表中 +function BP_PlayerState:AddWeapon(InId) + UE.Log("[BP_PlayerState:AddWeapon] 开始添加武器,Id = %d", InId) + if not self:HasAuthority() then + return + end + -- 判断是否有对应武器 + if self:FindWeaponExist(InId) then + UE.Log("[BP_PlayerState:AddWeapon] 能找到对应武器 Id: %d", InId) + -- 提示添加词条 + self:AddNewEntry(InId, 2) + else + UE.Log("[BP_PlayerState:AddWeapon] 找不到对应武器,需要重新添加") + self:AddNewWeaponInternal(InId) + end + + --找到对应的, + local PlayerCharacter = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + if PlayerCharacter ~= nil and PlayerCharacter.WeaponActor ~= nil then + PlayerCharacter.WeaponActor:SetCurrentWeapon(InId) + end + -- 阉割版 + --ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](self, 9) + -- 服务端 + UE.Log("[BP_PlayerState:AddWeapon] 当前的Id = %d", InId) + self:OnWeaponAttributeChanged(InId) +end + +-- 移除武器但是不移除配件 +function BP_PlayerState:RemoveWeapon(InWeaponId) + if self:FindWeaponById(InWeaponId) == nil then + UE.Log("[BP_PlayerState:RemoveWeapon] 没有当前武器:%d,请检查", InWeaponId) + return + end + -- 将武器身上的所有配件都移掉,再删除武器 + local bSuccess = self:RemoveAllWeaponFittings(InWeaponId) + if bSuccess then + -- 从背包中删除武器 + local Index = self:GetWeaponIndex(InWeaponId) + table.remove(self.OwnerWeapons, Index) + else + UE.Log("[BP_PlayerState:RemoveWeapon] 移除配件失败,请检查原因") + end +end + +--这里面保存着小手枪 +function BP_PlayerState:AddNewWeaponInternal(InWeaponId) + -- 判断类型 + local WeaponType = GameDataManager.GetWeaponType(InWeaponId) + if WeaponType == nil then + UE.Log("[BP_PlayerState:AddNewWeaponInternal] WeaponData is nil") + return + end + + local ItemData = { + WeaponId = InWeaponId, + Type = WeaponType, + + -- 这个是固有属性 + NativeProps = { + -- 这个是武器默认属性 + Common = 0, + -- 开始拥有的高级属性 + Plus = { + }, + }, + --这条是后面添加的词条属性 + Properties = { }, + --配件,存放的是Id 的数组 + Fittings = { }, + + --- 武器的配件等级: + --- 一旦有一个格子没有配件,那就 == 0 + --- 有[五个初级,五个中级)的时候就是初级 == 1 + --- 有[五个中级,五个高级)的时候就是中级 == 2 + --- 有[五个高级,五个超级)的时候就是高级 == 3 + --- 有[五个超级]的时候就是超级 == 4 + FittingLevel = 0, + } + local MainIndex, Val + if WeaponType == EWeaponClassType.WT_Pistol then + else + MainIndex, Val = RandomWeaponProperty(self) + local Pro = {MainType = MainIndex, Value = Val } + table.insert(ItemData.NativeProps.Plus, Pro) + end + + self:RemovePistol() + table.insert(self.OwnerWeapons, ItemData) + + -- 更新背包中武器数量 + if self.OwnerWeapons[1].Type ~= EWeaponClassType.WT_Pistol then + self.TotalWeaponCount = table.getCount(self.OwnerWeapons) + end +end + +--移除小手枪 +function BP_PlayerState:RemovePistol() + local RemoveIndex = 0 + for i = 1, #self.OwnerWeapons do + if self.OwnerWeapons[i].Type == EWeaponClassType.WT_Pistol then + RemoveIndex = i + break + end + end + -- 当不是小手枪的时候,那就移除 + if RemoveIndex ~= 0 then + UE.Log("[BP_PlayerState:RemovePistol] 移除了小手枪") + table.remove(self.OwnerWeapons, RemoveIndex) + end +end + +function BP_PlayerState:FindWeaponExist(InWeaponId) + for i = 1, #self.OwnerWeapons do + local Weapon = self.OwnerWeapons[i] + if Weapon.WeaponId == InWeaponId then + return true + end + end + return false +end + +function BP_PlayerState:FindWeaponById(InWeaponId) + for i = 1, #self.OwnerWeapons do + if self.OwnerWeapons[i].WeaponId == InWeaponId then + return self.OwnerWeapons[i] + end + end + return nil +end + +function BP_PlayerState:GetWeaponIndex(InWeaponId) + for i = 1, #self.OwnerWeapons do + if self.OwnerWeapons[i].WeaponId == InWeaponId then + return i + end + end + return -1 +end + +function BP_PlayerState:AddNewEntry(InWeaponId, InCount) + -- 如果是已经添加过了的,那就添加词条,如果是小手枪,那就不添加,返回 + local WeaponType = GameDataManager.GetWeaponType(InWeaponId) + if WeaponType == nil or WeaponType == EWeaponClassType.WT_Pistol then + UE.Log("[BP_PlayerState:AddNewEntry] Data is nil") + return false + end + + UE.Log("[BP_PlayerState:AddNewEntry] 开始给 %d 添加 %d 条词条", InWeaponId, InCount) + for _ = 1, InCount do + local MainIndex, Val = RandomWeaponProperty(self) + --在 Properties 中添加 + local ItemData = { + MainType = MainIndex, + Value = Val + } + --输出一下添加的属性 + UE.Log("[BP_PlayerState:AddNewEntry] 添加的属性为:%s, 值为:%s", Tables.WeaponPropertyConfig[ItemData.MainType].PropName, tostring(Val)) + table.insert(self:FindWeaponById(InWeaponId).NativeProps.Plus, ItemData) + end + return true +end + +-- 添加到对应武器上配件 +function BP_PlayerState:AddWeaponFittingItem(InWeaponId, InItemId) + UE.Log("[BP_PlayerState:AddWeaponFittingItem] 开始添加新的配件 %d", InItemId) + if GetItemGrantTypeById(InItemId) ~= EDropItemSet.WeaponParts then + return false + end + + local WeaponInfo = GameDataManager.GetWeaponConstructDataByID(InWeaponId) + if WeaponInfo == nil then + UE.Log("[BP_PlayerState:AddWeaponFittingItem] WeaponData is nil") + return false + end + local WeaponType = WeaponInfo.WeaponType + + UE.Log("[BP_PlayerState:AddWeaponFittingItem] 找到武器后开始添加") + + --查看是否有其他的 + if self:FindTargetFittingItemExist(InWeaponId, InItemId) then + --这个是必须成功的 + UE.Log("[BP_PlayerState:AddWeaponFittingItem] 开始移除原先的配件") + self:RemoveFittingItemByItemType(InWeaponId, GetItemTypeByItemId(InItemId)) + end + + self:AddFittingItemInternal(InWeaponId, InItemId) + + -- 添加完成之后需要检查一些当前数量够不够,对于五个初级,五个中级 + self:CheckFittingLevel(InWeaponId) + print(string.format("[BP_PlayerState:AddWeaponFittingItem] Weapon Type = %d", WeaponType)) + self:OnWeaponAttributeChanged(InWeaponId) +end + +--找到 Target 武器类型 +function BP_PlayerState:FindTargetFittingItemExist(InWeaponId, InFittingItemId) + UE.Log("[BP_PlayerState:FindTargetFittingItemExist] 开始寻找对应类型的配件") + + local WeaponInfo = self:FindWeaponById(InWeaponId) + if WeaponInfo == nil then + return false + end + local ItemType = GetItemTypeByItemId(InFittingItemId) + --查找对应配件 + for i = 1, #WeaponInfo.Fittings do + local FittingItem = WeaponInfo.Fittings[i] + if ItemType == GetItemTypeByItemId(FittingItem) then + --说明有,进行移除操作 + return true + end + end + return false +end + +function BP_PlayerState:RemoveAllWeaponFittings(InWeaponId) + local Weapon = self:FindWeaponById(InWeaponId) + if Weapon == nil then + UE.Log("[BP_PlayerState:RemoveAllWeaponFittings] 没有当前武器: %d,请检查一下", InWeaponId) + return false + end + + local Count = table.getCount(Weapon.Fittings) + for i = 1, Count do + local FittingId = Weapon.Fittings[i] + self:RemoveFittingItemByItemType(InWeaponId, GetItemTypeByItemId(FittingId)) + end + return true +end + +-- 通过武器配件类型移除武器配件 +function BP_PlayerState:RemoveFittingItemByItemType(InWeaponId, InItemType) + UE.Log("[BP_PlayerState:RemoveFittingItemByItemType] 开始通过物品Type: %d 在 %d 武器中进行移除", InItemType, InWeaponId) + local RemovePos = 0 + local RemoveItemId = 0 + for i = 1, #self:FindWeaponById(InWeaponId).Fittings do + local FittingItem = self:FindWeaponById(InWeaponId).Fittings[i] -- 这里面只存Id,Count == 1 + --这说明找到了 + if GetItemTypeByItemId(FittingItem) == InItemType then + UE.Log("[BP_PlayerState:RemoveFittingItemByItemType] 找到对应选项") + RemovePos = i + RemoveItemId = FittingItem + end + end + + if RemovePos == 0 then + UE.Log("[BP_PlayerState:RemoveFittingItemByItemType] 没有找到要移除的配件") + end + + --添加到背包中 + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.PlayerKey) + local RemoveCount = PlayerController:UpdateItemMap(RemoveItemId, 1) + if RemoveCount == 1 then + -- 说明添加成功 + UE.Log('[BP_PlayerState:RemoveFittingItemByItemType] 添加成功,开始移除') + table.remove(self:FindWeaponById(InWeaponId).Fittings, RemovePos) + else + UE.Log('[BP_PlayerState:RemoveFittingItemByItemType] 无法添加成功,请检查原因') + end +end + +function BP_PlayerState:GetWeaponByFittingItemId(InFittingItemId) + local WeaponType = GetItemWeaponTypeByItemId(InFittingItemId) + for i = 1, #self.OwnerWeapons do + local Weapon = self.OwnerWeapons[i] + if Weapon.Type == WeaponType then + return Weapon + end + end + return nil +end + +-- 所有武器上是否有对应Item +function BP_PlayerState:IsItemInWeapon(InFittingItemId) + for i = 1, #self.OwnerWeapons do + for j = 1, #self.OwnerWeapons[i].Fittings do + if InFittingItemId == self.OwnerWeapons[i].Fittings[j] then + return true + end + end + end + + return false +end + +-- 查找当前武器上是否有对应配件 +function BP_PlayerState:IsItemInWeapon(InWeaponId, InFittingItemId) + local Weapon = nil + for i = 1, #self.OwnerWeapons do + if self.OwnerWeapons[i].WeaponId == InWeaponId then + Weapon = self.OwnerWeapons[i] + break + end + end + + if Weapon ~= nil then + for i = 1, #Weapon.Fittings do + if Weapon.Fittings[i] == InFittingItemId then + return true + end + end + end + return false +end + +-- 当前武器上是否有对应配件 +function BP_PlayerState:IsCurrentWeaponHasItem(InFittingItemId) + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + if PlayerPawn.WeaponActor ~= nil and UE.IsValid(PlayerPawn.WeaponActor) then + return self:IsItemInWeapon(PlayerPawn.WeaponActor.CurrentWeaponId, InFittingItemId) + end + return false +end + +--实施具体的添加武器配件操作 +function BP_PlayerState:AddFittingItemInternal(InWeaponId, InFittingItemId) + UE.Log("[BP_WeaponPawnBase:AddFittingItemInternal] 添加配件") + + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.PlayerKey) + local RemoveCount = PlayerController:UpdateItemMap(InFittingItemId, -1) + if RemoveCount == -1 then + local Weapon = self:FindWeaponById(InWeaponId) + UE.Log("[BP_WeaponPawnBase:AddFittingItemInternal] Weapon Id = %d", InWeaponId) + if Weapon == nil then + UE.Log("[BP_WeaponPawnBase:AddFittingItemInternal] 找不到 Weapon") + end + table.insert(Weapon.Fittings, InFittingItemId) + else + UE.Log("[BP_WeaponPawnBase:AddFittingItemInternal] 无法从背包中移除,请检查原因") + end +end + +function BP_PlayerState:FindWeaponByWeaponType(InWeaponType) + for i = 1, #self.OwnerWeapons do + if self.OwnerWeapons[i].Type == InWeaponType then + return self.OwnerWeapons[i] + end + end + return nil +end + +-- 从背包中移除 +function BP_PlayerState:RemoveWeaponFittingItem(InFittingItemId) + self:RemoveFittingItemByItemType(self:GetWeaponByFittingItemId(InFittingItemId).WeaponId, GetItemTypeByItemId(InFittingItemId)) + self:OnWeaponAttributeChanged(self:GetWeaponByFittingItemId(InFittingItemId).WeaponId) +end + +-- 检查并判断当前的level,然后跟之前的level进行比较,然后增加或者删除高级属性词条 +function BP_PlayerState:CheckFittingLevel(InWeaponId) + local FittingList = self:FindWeaponById(InWeaponId).Fittings + local OldFittingLevel = self:FindWeaponById(InWeaponId).FittingLevel + -- 找到 WeaponType + local ThisWeaponType = GameDataManager.GetWeaponType(InWeaponId) + if ThisWeaponType == nil then + UE.Log("[BP_PlayerState:CheckFittingLevel] Data is nil") + return + end + + local NewFittingLevel + --在这里刷新一下 + if #FittingList ~= 5 then + NewFittingLevel = 0 + else + local Lowest = 10 + local bIsSelfWeaponFitting = true + for i = 1, #FittingList do + local Item = FittingList[i] + -- 找到最低的 + local Quality = GetItemQualityLevel(Item) + local WeaponType = GetItemWeaponTypeByItemId(Item) + if bIsSelfWeaponFitting and WeaponType ~= ThisWeaponType then + bIsSelfWeaponFitting = false + end + if Quality < Lowest then + Lowest = Quality + end + end + if bIsSelfWeaponFitting then + -- 说明之前都是对的,此时添加新的词条 + NewFittingLevel = Lowest + 1 + else + NewFittingLevel = 0 + end + end + + self:FindWeaponById(InWeaponId).FittingLevel = NewFittingLevel + -- 需要更新的就是 New - Old + self:UpdateFittingLevel(InWeaponId, NewFittingLevel - OldFittingLevel, NewFittingLevel) +end + +function BP_PlayerState:UpdateFittingLevel(InWeaponId, InCount, InNowLevel) + UE.Log("[BP_PlayerState:UpdateFittingLevel] 要添加的武器 Id:%d, 数量:%d", InWeaponId, InCount) + if InCount == 0 then + UE.Log("[BP_PlayerState:UpdateFittingLevel] 添加物品并不能导致变化") + return + end + local Props = self:FindWeaponById(InWeaponId).Properties + if InCount < 0 then + for _ = 1, -InCount do + table.remove(self:FindWeaponById(InWeaponId).Properties, #Props) + end + else + for _ = 1, InCount do + local MainIndex, Val = RandomWeaponProperty(self) + local ItemData = { + MainType = MainIndex, + Value = Val + } + table.insert(self:FindWeaponById(InWeaponId).Properties, ItemData) + end + end +end + +function BP_PlayerState:GetWeaponCount() + return #self.OwnerWeapons +end + +-- SC +function BP_PlayerState:GetWeapons() + return self.OwnerWeapons +end + +function BP_PlayerState:SetGameEndArchiveData(InData) + self.GameEndSavedArchiveData = InData; +end + +function BP_PlayerState:AddAttribute(InType, InValue, IsChinese) + local Val = InType + if IsChinese then + Val = GlobalConfigs.AttributeNameTable[InType] + end + self.Attributes[AttributeType.Base][Val] = self.Attributes[AttributeType.Base][Val] + InValue + self:ApplyAttributes() +end + +function BP_PlayerState:AddWeaponAttribute(InType, InValue) + +end + +function BP_PlayerState:FindPistolExist() + for i = 1, #self.OwnerWeapons do + if self.OwnerWeapons[i].Type == EWeaponClassType.WT_Pistol then + return true + end + end + return false +end + +function BP_PlayerState:GetWeaponFittingsById(InWeaponId) + local Weapon = self:FindWeaponById(InWeaponId) + if Weapon == nil then + UE.Log("[BP_PlayerState:GetWeaponFittingsById] 无法找到 %d 的武器", InWeaponId) + else + return Weapon.Fittings + end +end + +--当开火的时候 +function BP_PlayerState:OnShot() + local Temp1, Temp2 = 0, 0 + for i, v in pairs(self.Attributes) do + Temp1 = Temp1 + v.Growth_Fire_MaxHP + Temp2 = Temp2 + v.Growth_Fire_Attack + end + self.Attributes[AttributeType.Base].Base_MaxHP = self.Attributes[AttributeType.Base].Base_MaxHP + Temp1 + self.Attributes[AttributeType.Base].Base_Attack = self.Attributes[AttributeType.Base].Base_Attack + Temp2 + + -- 造成伤害提升1点防御穿透,最高75点 + if self:IsCurrentWeaponHasItem(13440) then + -- 防御穿透 + if self.Attributes[AttributeType.WeaponSpecial].Adv_DefencePenetration < 75 then + self.Attributes[AttributeType.WeaponSpecial].Adv_DefencePenetration = self.Attributes[AttributeType.WeaponSpecial].Adv_DefencePenetration + 1 + end + else + self.Attributes[AttributeType.WeaponSpecial].Adv_DefencePenetration = 0 + end + + -- 射击有5%的概率获得5000金币,如成功获得金币则进入10秒冷却期 + if self:IsCurrentWeaponHasItem(14440) then + local TheId = 14440 + local Rate = DropItemMap.SpecialFittingProperties[TheId][1].Probability / 100 + local Cooldown = DropItemMap.SpecialFittingProperties[TheId][1].CoolDown + local Func = DropItemMap.SpecialFittingProperties[TheId][1].Func + self:RateBenefit(TheId, Rate, Cooldown, Func) + end + + -- 射击有5%的概率获得150点杀敌点,如成功获得杀敌点则进入10秒冷却期 + if self:IsCurrentWeaponHasItem(14140) then + local TheId = 14140 + local Rate = DropItemMap.SpecialFittingProperties[TheId][1].Probability / 100 + local Cooldown = DropItemMap.SpecialFittingProperties[TheId][1].CoolDown + local Func = DropItemMap.SpecialFittingProperties[TheId][1].Func + self:RateBenefit(TheId, Rate, Cooldown, Func) + end + + -- 每1%的暴击伤害%加成会提高3%的射击伤害% + if self:IsCurrentWeaponHasItem(14540) then + local Attack = 0 + for i, v in pairs(self.Attributes) do + Attack = Attack + v.Bonus_CriticalAttack + end + self.Attributes[AttributeType.WeaponSpecial].Adv_FireAttack = self.Attributes[AttributeType.WeaponSpecial].Adv_FireAttack + Attack * 3 + else + self.Attributes[AttributeType.WeaponSpecial].Adv_FireAttack = 0 + end + + -- 射击会造成5%威力值的射击伤害% + if self:IsCurrentWeaponHasItem(14340) then + -- 获取威力值 + local Attack = 0 + for _, v in pairs(self.Attributes) do + Attack = Attack + v.Base_Attack + end + self.Attributes[AttributeType.WeaponSpecial].Adv_FireAttack = Attack * 0.05 + self.Attributes[AttributeType.WeaponSpecial].Adv_FireAttack + else + self.Attributes[AttributeType.WeaponSpecial].Adv_FireAttack = 0 + end + + -- 射击有10%的概率进入极速状态,该状态下射速提升100%,持续5s + if self:IsCurrentWeaponHasItem(11240) then + local TheId = 11240 + local Rate = DropItemMap.SpecialFittingProperties[TheId][1].Probability / 100 + local Cooldown = DropItemMap.SpecialFittingProperties[TheId][1].CoolDown + self:QuickSpeedState(TheId, Rate, Cooldown) + end +end + +function BP_PlayerState:QuickSpeedState(InId, Percent, CoolDown) + if self.SpecialThings[InId] == nil then + self.SpecialThings[InId] = {} + local CurrentRealTime = KismetSystemLibrary.GetGameTimeInSeconds(self) + self.SpecialThings[InId].ServerTime = CurrentRealTime + self.SpecialThings[InId].LimitServerTime = CurrentRealTime + end + + if self.SpecialThings[InId].ServerTime < self.SpecialThings[InId].LimitServerTime then + return + end + + local RandomPercent = math.random() + if RandomPercent < Percent then + -- 说明成功了 + self.Attributes[AttributeType.WeaponSpecial].Base_AttackSpeed = 1 + EventSystem.SetTimer(self, function() + self.Attributes[AttributeType.WeaponSpecial].Base_AttackSpeed = 0 + end, CoolDown) + end +end + +function BP_PlayerState:RateBenefit(InId, Percent, CoolDown, InFunc) + local ServerTime = KismetSystemLibrary.GetGameTimeInSeconds(self) + if self.SpecialThings[InId] == nil then + self.SpecialThings[InId] = {} + self.SpecialThings[InId].ServerTime = ServerTime + self.SpecialThings[InId].LimitServerTime = ServerTime + end + + if self.SpecialThings[InId].ServerTime < self.SpecialThings[InId].LimitServerTime then + return + end + + local RandomPercent = math.random() + if RandomPercent < Percent then + -- 说明成功了 + InFunc(self) + self.SpecialThings[InId].LimitServerTime = ServerTime + CoolDown + end + + self.SpecialThings[InId].ServerTime = ServerTime +end + +--获取练功房多加的怪物数量 +function BP_PlayerState:GetMonsterSpawnAdditionCount() + local Temp = 0 + for i, v in pairs(self.Attributes) do + Temp = Temp + v.Eco_HangupRoomMonsterNum + end + return Temp +end + +-- 获得练功房刷怪效率 +function BP_PlayerState:GetMonsterRefreshEfficiency() + local Temp = 0 + for i, v in pairs(self.Attributes) do + Temp = Temp + v.Eco_HangupRoomRefreshRate + end + return Temp +end + +-- 获取所有武器上的装备 +function BP_PlayerState:GetAllEquipment() + local OutData = {} + for i, v in ipairs(self.OwnerWeapons) do + for c, d in pairs(v.Fittings) do + table.insert(OutData, d) + end + end + return OutData +end + +return BP_PlayerState; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/BP_ArenaArea.lua b/GZJ/Script/Blueprint/SceneObject/BP_ArenaArea.lua new file mode 100644 index 00000000..f3df8d9c --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/BP_ArenaArea.lua @@ -0,0 +1,54 @@ +---@class BP_CharacterTrigger_C:AActor +---@field Box UBoxComponent +---@field DefaultSceneRoot USceneComponent +--Edit Below-- +local BP_ArenaArea = { + InRangePlayerPawn = {} +}; + +function BP_ArenaArea:ReceiveBeginPlay() + BP_ArenaArea.SuperClass.ReceiveBeginPlay(self) + + if self:HasAuthority() then + self.InRangePlayerPawn = {} + self.PlayerPawnClass = UE.LoadClass(BPClassPath.PlayerPawn) + self.Box.OnComponentBeginOverlap:Add(BP_ArenaArea.Box_OnComponentBeginOverlap,self) + self.Box.OnComponentEndOverlap:Add(BP_ArenaArea.Box_OnComponentEndOverlap,self) + end +end + +function BP_ArenaArea:ReceiveEndPlay() + if self:HasAuthority() then + self.PlayerPawnClass = nil + self.InRangePlayerPawn = nil + self.Box.OnComponentBeginOverlap:Remove(BP_ArenaArea.Box_OnComponentBeginOverlap,self) + self.Box.OnComponentEndOverlap:Remove(BP_ArenaArea.Box_OnComponentEndOverlap,self) + end + + BP_ArenaArea.SuperClass.ReceiveEndPlay(self) +end + +function BP_ArenaArea:UpdatePlayerPawnInRange(InPlayerPawn, IsAdd) + if IsAdd then + table.insert(self.InRangePlayerPawn, InPlayerPawn) + InPlayerPawn.IsInArena = true + else + table.removeValue(self.InRangePlayerPawn, InPlayerPawn) + InPlayerPawn.IsInArena = false + end + EventSystem:SendEvent(EventType.PlayerPawnInArenaChanged, self.InRangePlayerPawn) +end + +function BP_ArenaArea:Box_OnComponentBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) + if UE.IsValid(OtherActor) and UE.IsA(OtherActor, self.PlayerPawnClass) then + self:UpdatePlayerPawnInRange(OtherActor, true) + end +end + +function BP_ArenaArea:Box_OnComponentEndOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex) + if UE.IsValid(OtherActor) and UE.IsA(OtherActor, self.PlayerPawnClass) then + self:UpdatePlayerPawnInRange(OtherActor, false) + end +end + +return BP_ArenaArea; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/BP_Crystal.lua b/GZJ/Script/Blueprint/SceneObject/BP_Crystal.lua new file mode 100644 index 00000000..920ef246 --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/BP_Crystal.lua @@ -0,0 +1,100 @@ +---@class BP_Crystal_C:BP_DamageableActor_C +---@field NarrationWidget UWidgetComponent +---@field Sphere USphereComponent +---@field Chicken USkeletalMeshComponent +---@field HealthWidget UWidgetComponent +---@field Capsule UCapsuleComponent +---@field SM_Floor UStaticMeshComponent +---@field Arrow_4 UArrowComponent +---@field Arrow_3 UArrowComponent +---@field Arrow_2 UArrowComponent +---@field Arrow_1 UArrowComponent +---@field BuffComponent USTBaseBuffSystemComponent +--Edit Below-- +local BP_Crystal = { + bHasNoticedAttacked = false, + bHasNoticedBossAttacked = false, +}; + +function BP_Crystal:ReceiveBeginPlay() + BP_Crystal.SuperClass.ReceiveBeginPlay(self) + + self.OnCurrentHpReachedZeroByAnyDamage:Add( + function(BP_Crystal, Damage, DamageType, InstigatedBy, DamageCauser) + UE.Log("[BP_Crystal:OnCurrentHpReachedZeroByAnyDamage] BP_Crystal=%s, Damage=%s, DamageType=%s, InstigatedBy=%s, DamageCauser=%s", + KismetSystemLibrary.GetObjectName(BP_Crystal), + tostring(Damage), + tostring(DamageType), + KismetSystemLibrary.GetObjectName(InstigatedBy), + KismetSystemLibrary.GetObjectName(DamageCauser)) + + --UnrealNetwork.CallUnrealRPC_Multicast(self, self, "Client_MulticastRPC_SetFailedSkeletalLocation", self) + + -- EventSystem:SendEvent(EventType.OnCrystalHPReachedZero) + EventSystem:SendEvent(EventType.OnSendGameEnd, "ChickenDead") + end + ) + + self.OnAnyDamage:Add( + function(BP_Crystal, Damage, DamageType, InstigatedBy, DamageCauser) + UE.Log("[BP_Crystal:OnAnyDamage] BP_Crystal=%s, Damage=%s, DamageType=%s, InstigatedBy=%s, DamageCauser=%s", + KismetSystemLibrary.GetObjectName(BP_Crystal), + tostring(Damage), + tostring(DamageType), + KismetSystemLibrary.GetObjectName(InstigatedBy), + KismetSystemLibrary.GetObjectName(DamageCauser)) + if self.bHasNoticedAttacked == false then + NoticeTipsTools.MulticastNoticeTips(ECustomNoticeType.GlobalWarningNotice, "光子鸡正遭到攻击", 6.0, true) + self.bHasNoticedAttacked = true + EventSystem.SetTimer(self, function() + self.bHasNoticedAttacked = false + end, 6.5) + end + + if self.bHasNoticedBossAttacked == false then + if UE.IsValid(DamageCauser) and UE.IsA(DamageCauser, UE.LoadClass(BPClassPath.MonsterBase)) then + if DamageCauser:GetMonsterType() == EMonsterType.Boss then + self.bHasNoticedBossAttacked = true + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(UGCGameSystem.GameState, "Client_MulticastRPC_ShowCrystalAttackedByBoss") + end + end + end + end + ) +end + +function BP_Crystal:GetAvailableServerRPCs() + return + -- "Client_MulticastRPC_SetFailedSkeletalLocation" +end + +function BP_Crystal:OnRep_CurrentHp() + BP_Crystal.SuperClass.OnRep_CurrentHp(self) + + if (not UGCGameSystem.IsServer()) and EventSystem and UE.IsValid(UGCGameSystem.GameState) then + local HpPercentage = self.CurrentHp / self.MaxHp + UE.Log("[BP_Crystal:OnRep_CurrentHp] CurrentHP = %.2f, Max=%.2f, Percent = %.2f", self.CurrentHp, self.MaxHp, HpPercentage) + EventSystem:SendEvent(EventType.OnCrystalHPChanged, HpPercentage) + + self.NarrationWidget.Widget:UpdateOwnerHealthPercent(HpPercentage) + end +end + +function BP_Crystal:BP_PreTakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser) + if UE.IsValid(DamageCauser) and UE.IsA(DamageCauser, UE.LoadClass(BPClassPath.MonsterBase)) then + local Type = DamageCauser:GetMonsterType() + if Type == EMonsterType.Boss then + return 5.0 + elseif Type == EMonsterType.Common then + return 1.0 + end + end + return 0.0 +end + +function BP_Crystal:Client_MulticastRPC_SetFailedSkeletalLocation(Crystal) + Crystal.Chicken:K2_SetRelativeRotation(VectorHelper.NewRot(-90, 0, 180), false, nil, false) + Crystal.Chicken:K2_SetRelativeLocation(VectorHelper.NewVec(0, -180, 10), false, nil, false) +end + +return BP_Crystal; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/BP_KillBox.lua b/GZJ/Script/Blueprint/SceneObject/BP_KillBox.lua new file mode 100644 index 00000000..e579aa7f --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/BP_KillBox.lua @@ -0,0 +1,61 @@ +---@class BP_KillBox_C:AActor +---@field Box UBoxComponent +---@field DefaultSceneRoot USceneComponent +--Edit Below-- +local BP_KillBox = { +}; + +function BP_KillBox:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); + + if self:HasAuthority() then + self.Box.OnComponentBeginOverlap:Add(self.Box_OnComponentBeginOverlap, self); + end +end + +function BP_KillBox:Box_OnComponentBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) + if UGCGameSystem.IsServer() then + local PlayerKey = OtherActor.PlayerKey + if PlayerKey then + --OtherActor:K2_DestroyActor() + -- 重生玩家 + -- UGCGameSystem.GetRespawnComponent():AddRespawnPlayer(PlayerKey, 0) + + else + if UE.IsA(OtherActor, UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterBase.BP_MonsterBase_C'))) then + -- 设置血量 == 0 + UGCSimpleCharacterSystem.SetHealth(OtherActor, -1) + --UGCGameSystem.ApplyDamage(OtherActor, 2^30, ) + --UGCPawnAttrSystem.SetHealth(OtherActor, 0) + --OtherActor:K2_DestroyActor() + end + end + end + return nil; +end + +--[[ +function BP_KillBox:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function BP_KillBox:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function BP_KillBox:GetReplicatedProperties() + return +end +--]] + +--[[ +function BP_KillBox:GetAvailableServerRPCs() + return +end +--]] + +return BP_KillBox; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/BP_MonsterSpawner.lua b/GZJ/Script/Blueprint/SceneObject/BP_MonsterSpawner.lua new file mode 100644 index 00000000..06911763 --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/BP_MonsterSpawner.lua @@ -0,0 +1,591 @@ +---@class BP_MonsterSpawner_C:AActor +---@field Box UBoxComponent +---@field Type TEnumAsByte +---@field SpawnerID int32 +--Edit Below-- +local BP_MonsterSpawner = { + CurPosIndex = 0, + NumberOfPoints = 500, + ScalarParam = 3.0, + + ResourceGrade = 1, + + DropPositions = {}, + SpawnedMonsters = {}, + SpawnNum = 10, + + TargetPlayerKey = -100, + + InheritMonster = { + ['盔'] = false, + ['甲'] = false + }; + + IsActivate = false, + + SpawnMonsterIndex = 1, + + CheckNumInterval = 0.8, --检查剩余怪物数量的间隔时间 + ElapsedTime = 0.0, + + SpawnWaitingNum = 0, --等待生成的怪物数量 + + SpawnWaitingBossNum = 0, +}; + +function BP_MonsterSpawner:ReceiveBeginPlay() + BP_MonsterSpawner.SuperClass.ReceiveBeginPlay(self); + if self:HasAuthority() then + self:GenerateDropPosition() + end +end + +function BP_MonsterSpawner:ReceiveTick(DeltaTime) + BP_MonsterSpawner.SuperClass.ReceiveTick(self, DeltaTime); + + if self.IsActivate == false then + return + end + + if self:HasAuthority() then + if self.Type == EMonsterSpawnerType.HangUpRoom then + if self.SpawnWaitingNum > 0 then + self:SpawnSingleHangupRoomMonster() + self.SpawnWaitingNum = self.SpawnWaitingNum - 1 + end + + self.ElapsedTime = self.ElapsedTime + DeltaTime + if self.ElapsedTime >= self.CheckNumInterval then + self.ElapsedTime = 0.0 + self.CheckNumInterval = math.random(1, 5) / 10.0 + + local RemainedMonsterNum = table.getCount(self.SpawnedMonsters) + if RemainedMonsterNum < self.SpawnNum then + self.SpawnWaitingNum = math.clamp(self.SpawnWaitingNum + (self.SpawnNum - RemainedMonsterNum), 0, 10) + end + end + else + if self.SpawnWaitingNum > 0 then + self:SpawnSingleAttackMonster() + self.SpawnWaitingNum = self.SpawnWaitingNum - 1 + end + if self.SpawnWaitingBossNum > 0 then + self:SpawnSingleAttackBoss() + self.SpawnWaitingBossNum = self.SpawnWaitingBossNum - 1 + end + end + end + +end + +function BP_MonsterSpawner:GetSpawnerType() + return self.Type +end + +function BP_MonsterSpawner:GetSpawnerID() + return self.SpawnerID +end + +function BP_MonsterSpawner:BindPlayerKey(InPlayerKey) + self.TargetPlayerKey = InPlayerKey + UE.Log("[BP_MonsterSpawner][BindPlayerKey] %s Bind PlayerKey: %d", KismetSystemLibrary.GetObjectName(self), self.TargetPlayerKey) +end + +function BP_MonsterSpawner:StartSpawnHangupMonster(InSpawnNum) + if self.Type ~= EMonsterSpawnerType.HangUpRoom then + return + end + + self.IsActivate = true + + UE.Log("[BP_MonsterSpawner][StartSpawnHangupMonster] %s: TargetPlayerKey[%s]", KismetSystemLibrary.GetObjectName(self), tostring(self.TargetPlayerKey)) + + self.SpawnWaitingNum = InSpawnNum +end + +function BP_MonsterSpawner:SpawnSingleHangupRoomMonster() + if table.getCount(self.SpawnedMonsters) >= 10 then + return + end + + local BindedPC = UGCGameSystem.GetPlayerControllerByPlayerKey(self.TargetPlayerKey) + if BindedPC == nil or UE.IsValid(BindedPC) == false then + UE.Log("[BP_MonsterSpawner][SpawnSingleHangupRoomMonster] Can't Find BindedPC") + return + end + + local MonsterClass = GameDataManager.GetRandHangupMonsterClass() + if MonsterClass then + local Location = self:GetSpawnLocation() + local Rotation = self:GetSpawnRotation() + local Scale = VectorHelper.ScaleOne() + local Monster = UGCGameSystem.SpawnActor(self, MonsterClass, Location, Rotation, Scale, nil) + if not Monster then + return + end + Monster:SetOwner(self) + local MonsterInitSuccess = Monster:InitMonsterByLevel(BindedPC.ResourceGrade) + -- if MonsterInitSuccess == false then + -- UE.Log("[BP_MonsterSpawner][SpawnSingleHangupRoomMonster] Monster Init Failed: MonsterName[%s]", KismetSystemLibrary.GetObjectName(Monster)) + -- return + -- end + Monster:SetTargetPlayerKey(self.TargetPlayerKey) + Monster:SetSpawnIndex(self.SpawnMonsterIndex) + + self.SpawnedMonsters[self.SpawnMonsterIndex] = Monster + -- UE.Log("[BP_MonsterSpawner][SpawnSingleHangupRoomMonster] Success: MonsterName[%s], SpawnIndex[%d]", KismetSystemLibrary.GetObjectName(Monster), self.SpawnMonsterIndex) + self.SpawnMonsterIndex = self.SpawnMonsterIndex + 1 + end +end + +function BP_MonsterSpawner:StartSpawnAttackWave(NormalMonsterNum, BossMonsterNum) + if self.Type ~= EMonsterSpawnerType.AttackWave then return end + + self.IsActivate = true + + UGCGameSystem.GameState:UpdateIsInAttackWave(NormalMonsterNum + BossMonsterNum > 0) + + self.SpawnWaitingNum = NormalMonsterNum + self.SpawnWaitingBossNum = BossMonsterNum +end + +function BP_MonsterSpawner:SpawnSingleAttackMonster() + local MonsterClass = GameDataManager.GetAttackWaveCommonMonsterClass() + MonsterClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossCharm.BP_BossCharm_C')) + if MonsterClass then + local Location = self:GetSpawnLocation() + local Rotation = self:GetSpawnRotation() + local Scale = VectorHelper.Scale(1.25) + local Monster = UGCGameSystem.SpawnActor(self, MonsterClass, Location, Rotation, Scale, nil) + if Monster then + table.insert(self.SpawnedMonsters, Monster) + Monster:SetOwner(self) + Monster:InitMonsterByLevel(UGCGameSystem.GameState.CurAttackWave) + Monster.OnDeath:Add(BP_MonsterSpawner.OnSpawnedMonsterDeath, self) + end + end +end + +function BP_MonsterSpawner:SpawnSingleAttackBoss() + local MonsterClass = GameDataManager.GetRandBossMonsterClass() + if MonsterClass then + local Location = self:GetSpawnLocation() + local Rotation = self:GetSpawnRotation() + local Scale = VectorHelper.Scale(1.5) + local Monster = UGCGameSystem.SpawnActor(self, MonsterClass, Location, Rotation, Scale, nil) + if Monster then + table.insert(self.SpawnedMonsters, Monster) + Monster:SetOwner(self) + Monster:InitMonsterByLevel(GameDataManager.BossIndex) + Monster.OnDeath:Add(BP_MonsterSpawner.OnSpawnedMonsterDeath, self) + end + end +end + +function BP_MonsterSpawner:StartSpawnBreachMonster(RewardWeaponID, InLevel) + if self.IsActivate == false or self.Type ~= EMonsterSpawnerType.HangUpRoom then + return + end + + if RewardWeaponID == nil or RewardWeaponID <= 0 then + return + end + + self.RewardWeaponID = RewardWeaponID + + local MonsterClass = GameDataManager.GetRandBreachMonsterClass() + if MonsterClass then + local Location = self:GetSpawnLocation() + local Rotation = self:GetSpawnRotation() + local Scale = VectorHelper.ScaleOne() + local Monster = UGCGameSystem.SpawnActor(self, MonsterClass, Location, Rotation, Scale, nil) + if not Monster then + return + end + Monster:SetTargetPlayerKey(self.TargetPlayerKey) + Monster:SetOwner(self) + Monster.OnDeath:Add(BP_MonsterSpawner.OnSpawnedBreachMonsterDeath, self) + local TargetPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.TargetPlayerKey) + Monster:InitMonsterByLevel(TargetPlayerState.BreachSuccessTime + 1) + TargetPlayerState.BreachInfo.NeedBreach = true + TargetPlayerState.BreachInfo.InBreachProgress = true + UnrealNetwork.RepLazyProperty(TargetPlayerState, "BreachInfo") + + if self.BreachLifeSpanHandle ~= nil then + EventSystem.StopTimer(self.BreachLifeSpanHandle) + end + + --设置计时器,检查是否突破成功,若未成功,则继续显示突破按钮 + self.BreachLifeSpanHandle = EventSystem.SetTimer(self, function() + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.TargetPlayerKey) + if UE.IsValid(PlayerState) then + if UE.IsValid(Monster) and Monster:IsAlive() then + PlayerState.BreachInfo.NeedBreach = true + PlayerState.BreachInfo.InBreachProgress = false + UnrealNetwork.RepLazyProperty(PlayerState, "BreachInfo") + + Monster:K2_DestroyActor() + + NoticeTipsTools.ServerGeneralNoticeTips(self.TargetPlayerKey, "突破失败,请重新尝试,否则无法继续提升等级", true) + end + end + EventSystem.StopTimer(self.BreachLifeSpanHandle) + self.BreachLifeSpanHandle = nil + end, 60) + end +end + +function BP_MonsterSpawner:StartSpawnChallengeMonster(InChallengeMonsterType, Level) + if self.IsActivate == false or self.Type ~= EMonsterSpawnerType.HangUpRoom then + return + end + if InChallengeMonsterType < EMonsterType.ChallengeGold or InChallengeMonsterType > EMonsterType.ChallengeWeaponRecasting then + UE.Log("[BP_MonsterSpawner:StartSpawnChallengeMonster] Error: invalid ChallengeMonsterType") + return + end + + local MonsterClass = GameDataManager.GetRandMonsterClassByType(InChallengeMonsterType) + if MonsterClass then + local Location = self:GetSpawnLocation() + local Rotation = self:GetSpawnRotation() + local Scale = VectorHelper.Scale(1.2) + local Monster = UGCGameSystem.SpawnActor(self, MonsterClass, Location, Rotation, Scale, nil) + if not Monster then + return + end + Monster:InitMonsterByLevel(Level) + Monster:SetTargetPlayerKey(self.TargetPlayerKey) + Monster:SetOwner(self) + Monster.OnDeath:Add(BP_MonsterSpawner.OnSpawnedChallengeMonsterDeath, self) + end +end + +function BP_MonsterSpawner:StartSpawnSeal(InPlayerController) + if self.IsActivate == false or self.Type ~= EMonsterSpawnerType.HangUpRoom then + return + end + local MonsterClass = GameDataManager.GetRandMonsterClassByType(EMonsterType.Unseal) + if MonsterClass then + local Location = self:GetSpawnLocation() + local Rotation = self:GetSpawnRotation() + local Scale = VectorHelper.ScaleOne() + local Monster = UGCGameSystem.SpawnActor( + self, + MonsterClass, + Location, + Rotation, + Scale, + nil) + if not Monster then + return + end + Monster:SetTargetPlayerKey(self.TargetPlayerKey) + Monster:SetLifeSpan(60) + Monster:SetGrowUpLevel(InPlayerController.SealInfo.Times) + Monster:SetOwner(self) + Monster.OnDeath:Add(BP_MonsterSpawner.OnSealMonsterDeath, self) + InPlayerController.SealInfo.IsMonsterAlive = true + + EventSystem.SetTimer(self, function() + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.TargetPlayerKey) + if UE.IsValid(PlayerState) then + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.TargetPlayerKey) + if UE.IsValid(Monster) then + PlayerController.SealInfo.IsMonsterAlive = false + PlayerController.SealInfo.KillCount = 0 + NoticeTipsTools.ServerGeneralNoticeTips(self.TargetPlayerKey, "封印失败,请重新尝试,否则无法获取封印奖励", true) + UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ClientRPC_SetSealButtonVisible", true) + end + end + end, 61) + end +end + +function BP_MonsterSpawner:StartSpawnInherit(InPlayerController, InText, InOldNum) + if self.IsActivate == false or self.Type ~= EMonsterSpawnerType.HangUpRoom then + return + end + + local MonsterId = 0 + if InText == '盔' then + MonsterId = 1001 + elseif InText == '甲' then + MonsterId = 1002 + end + + local Func = function(InNum) + return InNum // 10 % 10 + end + + + local MonsterClass = UE.LoadClass(Tables.MonsterBaseConfig[MonsterId].Path) + if MonsterClass then + local Location = self:GetSpawnLocation() + local Rotation = self:GetSpawnRotation() + local Scale = VectorHelper.ScaleOne() + local Monster = UGCGameSystem.SpawnActor( + self, + MonsterClass, + Location, + Rotation, + Scale, + nil) + if Monster == nil then + return + end + + Monster:SetTargetPlayerKey(self.TargetPlayerKey) + Monster:SetLifeSpan(60) + Monster:UpdateMonsterLevel(Monster.MonsterName, Func(InOldNum)) + Monster:SetOwner(self) + Monster.OnDeath:Add(BP_MonsterSpawner.OnInheritDeath, self) + self.InheritMonster[InText] = true + + EventSystem.SetTimer(self, function() + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.TargetPlayerKey) + if UE.IsValid(PlayerState) and UE.IsValid(Monster) then + NoticeTipsTools.ServerGeneralNoticeTips(self.TargetPlayerKey, "进阶失败,请重新尝试,否则无法获取奖励", true) + UnrealNetwork.CallUnrealRPC(self, self, "ClientRPC_UpdateInherit", self.PlayerKey, 2) + end + end, 61) + end +end + +function BP_MonsterSpawner:GenerateDropPosition() + self.DropPositions = {} + + local OriginPos = self:K2_GetActorLocation() + local BoxExtent = self.Box:GetScaledBoxExtent() + + local NumOfPoints = self.NumberOfPoints + local ScalarParam = self.ScalarParam + local ActualWidth = math.max(100.0, BoxExtent.X) + local GoldenAngle = 1.618 * 2 * 3.141 + local LGRad = ActualWidth * 0.45 + + local SMArea = LGRad * LGRad * 3.141 / NumOfPoints + for i = 1, NumOfPoints, 1 do + local Angle = i * GoldenAngle + local CumArea = i * SMArea + local SpiralRad = math.sqrt(CumArea / 3.141) + local X = math.cos(Angle) * SpiralRad * ScalarParam + local Y = math.sin(Angle) * SpiralRad * ScalarParam + local RelativePos = Vector.New(X, Y, 0.0) + local TempPos = VectorHelper.Add(OriginPos, RelativePos) + table.insert(self.DropPositions, TempPos) + end +end + +function BP_MonsterSpawner:GetSpawnLocation() + if #self.DropPositions <= 1 then + self:GenerateDropPosition() + end + return table.remove(self.DropPositions, math.random(1, #self.DropPositions)) +end + +function BP_MonsterSpawner:GetSpawnRotation() + return Rotator.New(0.0, math.random(-180.0, 180.0), 0.0) +end + +function BP_MonsterSpawner:OnSpawnedMonsterDeath(DeadMonster, KillerController, DamageCauseActor, HitResult, HitImpulseDirection, DamageTypeID, bHeadShotDamage) + if self:HasAuthority() then + if self:GetSpawnerType() == EMonsterSpawnerType.AttackWave then + table.removeValue(self.SpawnedMonsters, DeadMonster) + if table.getCount(self.SpawnedMonsters) <= 0 then + UGCGameSystem.GameState:UpdateIsInAttackWave(false) + end + end + + DeadMonster.OnDeath:Remove(BP_MonsterSpawner.OnSpawnedMonsterDeath, self) + end +end + +function BP_MonsterSpawner:OnSpawnedChallengeMonsterDeath(DeadMonster, KillerController, DamageCauseActor, HitResult, HitImpulseDirection, DamageTypeID, bHeadShotDamage) + if self:HasAuthority() then + local Level = DeadMonster.BossLevel + local MonsterType = GameDataManager.GetMonsterTypeByID(DeadMonster.ID) + local ChallengeIndex = GameDataManager.GetChallengeInfoIndex(MonsterType) + Tables.ChallengeInfo[ChallengeIndex].IncomeFun(KillerController.PlayerKey, Level) + + DeadMonster.OnDeath:Remove(BP_MonsterSpawner.OnSpawnedChallengeMonsterDeath, self) + end +end + +function BP_MonsterSpawner:OnSpawnedBreachMonsterDeath(DeadMonster, KillerController, DamageCauseActor, HitResult, HitImpulseDirection, DamageTypeID, bHeadShotDamage) + if self:HasAuthority() then + if self.RewardWeaponID == nil or self.RewardWeaponID <= 0 then + return + end + + local KillerPlayerKey = KillerController.PlayerKey + local KillerPlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(KillerPlayerKey) + local KillerPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(KillerPlayerKey) + + ---检测击杀者是否是自己(防止别人帮你击杀) + if KillerPlayerKey ~= DeadMonster.TargetPlayerKey then + local TargetPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(DeadMonster.TargetPlayerKey) + TargetPlayerState.BreachInfo.NeedBreach = true + TargetPlayerState.BreachInfo.InBreachProgress = false + UnrealNetwork.RepLazyProperty(TargetPlayerState, "BreachInfo") + + NoticeTipsTools.ServerGeneralNoticeTips(DeadMonster.TargetPlayerKey, "突破失败,请重新尝试,否则无法继续提升等级", true) + return + end + + KillerPlayerState.BreachSuccessTime = KillerPlayerState.BreachSuccessTime + 1 + KillerPlayerState.BreachInfo.NeedBreach = false + KillerPlayerState.BreachInfo.InBreachProgress = false + UnrealNetwork.RepLazyProperty(KillerPlayerState, "BreachInfo") + + KillerPlayerState:OnChangedLevel() + + if KillerPlayerState.BreachSuccessTime == 1 then + local DropPos = VectorHelper.Sub(DeadMonster:K2_GetActorLocation(), {X = 0, Y = 0, Z = DeadMonster.Capsule.CapsuleHalfHeight}) + local DropRot = DeadMonster:K2_GetActorRotation() + if KillerPlayerState:GetNeedTriggerForceGuide() then + local RayItemData = { + ItemID = 21240, + ItemType = EItemType.SkillBook, + Quality = 4, + Count = 1, + } + EventSystem:SendEvent(EventType.SpawnDropItem, DropPos, DropRot, KillerController.PlayerKey, RayItemData) + EventSystem:SendEvent(EventType.SpawnDropItem, DropPos, DropRot, KillerController.PlayerKey, GenerateSkillBookData(ESkillType.Active)) + else + EventSystem:SendEvent(EventType.SpawnDropItem, DropPos, DropRot, KillerController.PlayerKey, GenerateSkillBookData()) + EventSystem:SendEvent(EventType.SpawnDropItem, DropPos, DropRot, KillerController.PlayerKey, GenerateSkillBookData()) + end + end + + KillerController:ServerRPC_AddWeapon(self.RewardWeaponID, KillerPlayerKey) + + UnrealNetwork.CallUnrealRPC(KillerController, KillerController, "ClientRPC_TriggerGuide", 19) + UnrealNetwork.CallUnrealRPC_Multicast(KillerPlayerPawn, "Client_MulticastRPC_PlayEffect", GameDataManager.GetEffectInstanceId(), 36, KillerPlayerPawn, nil, 0, EEffectSpawnLocationType.Attach) + NoticeTipsTools.ServerGeneralNoticeTips(KillerPlayerKey, "已消灭突破怪,等级已解锁,已获得突破武器") + + DeadMonster.OnDeath:Remove(BP_MonsterSpawner.OnSpawnedBreachMonsterDeath, self) + + if self.BreachLifeSpanHandle ~= nil then + EventSystem.StopTimer(self.BreachLifeSpanHandle) + end + end +end + +function BP_MonsterSpawner:OnSealMonsterDeath(DeadMonster, KillerController, DamageCauseActor, HitResult, HitImpulseDirection, DamageTypeID, bHeadShotDamage) + if self:HasAuthority() then + --重置参数 + KillerController.SealInfo.IsMonsterAlive = false + KillerController.SealInfo.KillCount = 0 + local FinalItems = self:RandomSealRewards(KillerController.SealInfo.Times) + KillerController.SealInfo.Times = KillerController.SealInfo.Times + 1 + UnrealNetwork.CallUnrealRPC(KillerController, KillerController, "ClientRPC_SetSealRewards", FinalItems) + end +end + +function BP_MonsterSpawner:RandomSealRewards(InTimes) + -- 随机两个 + local Items = {} + local FinalItems = {} + local RewardCount = table.getCount(SealTables.Rewards) + for i = 1, RewardCount do + table.insert(Items, i) + end + + local Func = function(InIndex) + local TheIndex = 1 + for i, v in pairs(SealTables.Rewards) do + if TheIndex == InIndex then + return i + end + TheIndex = TheIndex + 1 + end + end + + for _ = 1, 2 do + local FirstIndex = math.random(1, #Items) + table.remove(Items, FirstIndex) + local Type = Func(Items[FirstIndex]) + local Value = InTimes * SealTables.Rewards[Type] + if Type == '配件' or Type == '技能书' then + Value = InTimes // 5 + 1 + end + table.insert(FinalItems, { Type = Type, Value = Value }) + end + + return FinalItems +end + +function BP_MonsterSpawner:OnInheritDeath(DeadMonster, KillerController, DamageCauseActor, HitResult, HitImpulseDirection, DamageTypeID, bHeadShotDamage) + local OldId + local SelectText + if DeadMonster.ID == 1001 then + SelectText = '盔' + elseif DeadMonster.ID == 1002 then + SelectText = '甲' + end + + OldId = KillerController.PlayerState.InheritItems[SelectText] + + -- 给予奖励 + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(DeadMonster.TargetPlayerKey) + local NextId = InheritTable.GetNextId(OldId) + local Benefit = InheritTable.Items[OldId].Benefit + for i = 1, #Benefit do + PlayerState:AddAttribute(Benefit[i].Type, Benefit[i].Value, true) + end + PlayerState.InheritItems[SelectText] = NextId + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](self, 14) + local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerState.PlayerKey) + UnrealNetwork.CallUnrealRPC(PC, PC, "ClientRPC_UpdateInherit", DeadMonster.TargetPlayerKey, 0) +end + +function BP_MonsterSpawner:UpdateHangupRoomMonsterLevel(Level) + local HangupRoomMonsterClass = UE.LoadClass(BPClassPath.HangupRoomMonster) + for _, Monster in pairs(self.SpawnedMonsters) do + if UE.IsA(Monster, HangupRoomMonsterClass) then + Monster:InitMonsterByLevel(Level) + end + end +end + +function BP_MonsterSpawner:CleanMonsterRefByIndex(SpawnIndex) + if self.Type ~= EMonsterSpawnerType.HangUpRoom or SpawnIndex == nil or SpawnIndex <= 0 then + return + end + self.SpawnedMonsters[SpawnIndex] = nil +end + +function BP_MonsterSpawner:CheckSpecialDropForMonster(MonsterType, DropPos, DropRot, KillerPlayerKey) + local GameDifficulty = UGCGameSystem.GameState.GameDifficulty + if GameDifficulty < 3 or GameDifficulty > 10 then + return + end + + if self.RandDropRayDeadCount == nil then + self.RandDropRayDeadCount = math.random(1, 3) + end + + if self.HangupRoomMonsterDeadCount == nil then + self.HangupRoomMonsterDeadCount = 0 + end + + if self.HasDroppedRay == nil then + self.HasDroppedRay = false + end + + if self.HasDroppedRay == true then + return + end + + if MonsterType == EMonsterType.HangupRoom then + self.HangupRoomMonsterDeadCount = self.HangupRoomMonsterDeadCount + 1 + if self.HangupRoomMonsterDeadCount == self.RandDropRayDeadCount then + UE.Log("[BP_MonsterSpawner][CheckSpecialDropForMonster] HangupRoom Drop") + local RayItemData = {ItemID = 21240, ItemType = EItemType.SkillBook, Quality = 4, Count = 1,} + EventSystem:SendEvent(EventType.SpawnDropItem, DropPos, DropRot, KillerPlayerKey, RayItemData) + self.HasDroppedRay = true + end + end +end + +return BP_MonsterSpawner; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/BP_Teleporter.lua b/GZJ/Script/Blueprint/SceneObject/BP_Teleporter.lua new file mode 100644 index 00000000..ffb64663 --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/BP_Teleporter.lua @@ -0,0 +1,122 @@ +---@class BP_Teleporter_C:AActor +---@field ParticleSystem_Ring UParticleSystemComponent +---@field Arrow UArrowComponent +---@field Sphere USphereComponent +---@field ParticleSystem_Arrow UParticleSystemComponent +---@field DefaultSceneRoot USceneComponent +---@field TeleporterID int32 +---@field Type TEnumAsByte +---@field ParticleNormal UParticleSystem +---@field ParticleInAttackWave UParticleSystem +--Edit Below-- +UGCGameSystem.UGCRequire('Script.Common.ue_enum_custom') +UGCGameSystem.UGCRequire('Script.Common.ue_struct_custom') +UGCGameSystem.UGCRequire('Script.Global.Global') + +local BP_Teleporter = { + DestLoc = {}, + DestRot = {}, + + BindPlayerKey = -100, + DestTeleporter = nil, +}; + +function BP_Teleporter:GetReplicatedProperties() + return + "TeleporterID", + "Type", + "BindPlayerKey" +end + +function BP_Teleporter:ReceiveBeginPlay() + BP_Teleporter.SuperClass.ReceiveBeginPlay(self) + + if self:HasAuthority() then + self.PlayerPawnClass = UE.LoadClass(BPClassPath.PlayerPawn) + self.Sphere.OnComponentBeginOverlap:Add(BP_Teleporter.Sphere_OnBeginOverlap, self) + else + self:OnRep_BindPlayerKey() + end +end + +function BP_Teleporter:ReceiveEndPlay() + if self:HasAuthority() then + self.DestLoc = nil + self.DestRot = nil + self.PlayerPawnClass = nil + self.Sphere.OnComponentBeginOverlap:Remove(BP_Teleporter.Sphere_OnBeginOverlap, self) + end + + BP_Teleporter.SuperClass.ReceiveEndPlay(self) +end + +function BP_Teleporter:FindDestTeleporter() + local TeleporterClass = UE.LoadClass(BPClassPath.Teleporter) + if UE.IsValid(TeleporterClass) then + local FoundedTeleporters = totable(GameplayStatics.GetAllActorsOfClass(self, TeleporterClass, {})) + for _, Teleporter in pairs(FoundedTeleporters) do + if Teleporter.TeleporterID == self.TeleporterID and Teleporter ~= self and Teleporter.Type ~= self.Type then + self.DestTeleporter = Teleporter + break + end + end + end +end + +function BP_Teleporter:OnRep_BindPlayerKey() + local LocalPC = GameDataManager.GetLocalPlayerController() + if UE.IsValid(LocalPC) and LocalPC.PlayerKey == self.BindPlayerKey then + self:SetActorHiddenInGame(false) + else + self:SetActorHiddenInGame(true) + end +end + +function BP_Teleporter:SetRingColor(Trigger) + if Trigger == true then + self.ParticleSystem_Ring:SetTemplate(self.ParticleInAttackWave) + else + self.ParticleSystem_Ring:SetTemplate(self.ParticleNormal) + end +end + +function BP_Teleporter:GetTeleporterID() + return self.TeleporterID +end + +function BP_Teleporter:SetBindPlayerKey(InPlayerKey) + self.BindPlayerKey = InPlayerKey +end + +function BP_Teleporter:TeleportPawnToDest(InPawn) + if self.Type == ETeleportType.InArena then + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.BindPlayerKey) + local HangUpRoomPlayerStart = PlayerController.HangUpRoomPlayerStart + if HangUpRoomPlayerStart then + self.DestLoc = HangUpRoomPlayerStart:K2_GetActorLocation() + self.DestRot = HangUpRoomPlayerStart:K2_GetActorRotation() + end + else + if self.DestTeleporter == nil then + self:FindDestTeleporter() + end + self.DestLoc = self.DestTeleporter.Arrow:K2_GetComponentLocation() + self.DestRot = self.DestTeleporter.Arrow:K2_GetComponentRotation() + end + + InPawn.bShouldDumpCallstackWhenMovingfast = false + InPawn:SetClientLocationOrRotation(self.DestLoc, self.DestRot, true, false) + InPawn.bShouldDumpCallstackWhenMovingfast = true + + UE.Log("[BP_Teleporter:TeleportPawnToDest] ID = %d, TeleportType = %d", self.TeleporterID, self.Type) +end + +function BP_Teleporter:Sphere_OnBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) + if UE.IsValid(OtherActor) and UE.IsA(OtherActor, self.PlayerPawnClass) then + if self.BindPlayerKey == UGCPawnAttrSystem.GetPlayerKeyInt64(OtherActor) then + self:TeleportPawnToDest(OtherActor) + end + end +end + +return BP_Teleporter; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_Actor.lua b/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_Actor.lua new file mode 100644 index 00000000..ddc3a772 --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_Actor.lua @@ -0,0 +1,67 @@ +---@class BP_Skill_Actor_C:AActor +---@field Sphere USphereComponent +---@field ParticleSystem UParticleSystemComponent +---@field DefaultSceneRoot USceneComponent +--Edit Below-- +local BP_Skill_Actor = { + CasterPawn = nil, + Level = 1, +}; + +function BP_Skill_Actor:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self) + if self:HasAuthority() then + self.MonsterBaseClass = UE.LoadClass(BPClassPath.MonsterBase) + self.Sphere.OnComponentBeginOverlap:Add(BP_Skill_Actor.Sphere_OnComponentBeginOverlap, self) + self.Sphere.OnComponentEndOverlap:Add(BP_Skill_Actor.Sphere_OnComponentEndOverlap, self) + end +end + +function BP_Skill_Actor:ReceiveEndPlay() + if self:HasAuthority() then + self.MonsterBaseClass = nil + self.CasterPawn = nil + self.Sphere.OnComponentBeginOverlap:Remove(BP_Skill_Actor.Sphere_OnComponentBeginOverlap, self) + self.Sphere.OnComponentEndOverlap:Remove(BP_Skill_Actor.Sphere_OnComponentEndOverlap, self) + end + self.SuperClass.ReceiveBeginPlay(self) +end + +function BP_Skill_Actor:SetSphereRadius(NewRadius) + self.Sphere:SetSphereRadius(NewRadius, true) +end + +function BP_Skill_Actor:SetCasterPawn(CasterPawn) + self.CasterPawn = CasterPawn + +end + +function BP_Skill_Actor:SetLevel(NewLevel) + self.Level = NewLevel +end + +function BP_Skill_Actor:Sphere_OnComponentBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) + if UE.IsValid(OtherActor) and UE.IsA(OtherActor, self.MonsterBaseClass) and UGCSimpleCharacterSystem.GetHealth(OtherActor) > 0 then + if self.CasterPawn ~= nil and UE.IsValid(self.CasterPawn) then + self:OnMonsterBeginOverlap(OtherActor) + end + end +end + +function BP_Skill_Actor:Sphere_OnComponentEndOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex) + if UE.IsValid(OtherActor) and UE.IsA(OtherActor, self.MonsterBaseClass) and UGCSimpleCharacterSystem.GetHealth(OtherActor) > 0 then + if self.CasterPawn ~= nil and UE.IsValid(self.CasterPawn) then + self:OnMonsterEndOverlap(OtherActor) + end + end +end + +--在子类实现 +function BP_Skill_Actor:OnMonsterBeginOverlap(Monster) +end + +--在子类实现 +function BP_Skill_Actor:OnMonsterEndOverlap(Monster) +end + +return BP_Skill_Actor; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_FireDomain.lua b/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_FireDomain.lua new file mode 100644 index 00000000..23e8fd11 --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_FireDomain.lua @@ -0,0 +1,63 @@ +---@class BP_Skill_FireDomain_C:BP_Skill_Actor_C +--Edit Below-- + +local SkillActorBase = require('Script.Blueprint.SceneObject.SkillActor.BP_Skill_Actor') +local BP_Skill_FireDomain = setmetatable( + { + AdditionInRangeDamageTable = {200, 400, 600, 800}, + CurInRangeDamage = 0.0, + + InRangeMonsters = {}, + }, + { + __index = SkillActorBase, + __metatable = SkillActorBase + } +); + + +function BP_Skill_FireDomain:ReceiveBeginPlay() + SkillActorBase.ReceiveBeginPlay(self) + self:SetSphereRadius(200) + + if self:HasAuthority() then + self.LoopTimerHandle = EventSystem.SetTimerLoop(self, function() + if self.CasterPawn == nil or UE.IsValid(self.CasterPawn) == false then + return + end + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + for _, Monster in pairs(self.InRangeMonsters) do + if Monster ~= nil and UE.IsValid(Monster) and Monster.bIsDead == false then + UGCGameSystem.ApplyDamage(Monster, self.CurInRangeDamage, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end + end, 1.0) + end +end + +function BP_Skill_FireDomain:ReceiveEndPlay() + if self:HasAuthority() then + if UE.IsValid(self.LoopTimerHandle) then + EventSystem.StopTimer(self.LoopTimerHandle) + end + end + + self.InRangeMonsters = {} + self.SuperClass.ReceiveEndPlay(self) +end + +function BP_Skill_FireDomain:SetLevel(NewLevel) + SkillActorBase.SetLevel(self, NewLevel) + + self.CurInRangeDamage = self.AdditionInRangeDamageTable[NewLevel] +end + +function BP_Skill_FireDomain:OnMonsterBeginOverlap(Monster) + table.insert(self.InRangeMonsters, Monster) +end + +function BP_Skill_FireDomain:OnMonsterEndOverlap(Monster) + table.removeValue(self.InRangeMonsters, Monster, true) +end + +return BP_Skill_FireDomain; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_IceFrost.lua b/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_IceFrost.lua new file mode 100644 index 00000000..e0131326 --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_IceFrost.lua @@ -0,0 +1,58 @@ +---@class BP_Skill_IceFrost_C:BP_Skill_Actor_C +--Edit Below-- + +local SkillActorBase = require('Script.Blueprint.SceneObject.SkillActor.BP_Skill_Actor') +local BP_Skill_IceFrost = setmetatable( + { + AdditionDamageRateTable = {2.0, 3.0, 4.0, 5.0}, + SpeedScaleReductionRateTable = {0.8, 0.7, 0.6, 0.5}, + CurDamageRate = 0.0, + CurSpeedScaleReductionRate = 0.0, + CachedSpeedScales = {}, + }, + { + __index = SkillActorBase, + __metatable = SkillActorBase + } +); + + +function BP_Skill_IceFrost:ReceiveBeginPlay() + SkillActorBase.ReceiveBeginPlay(self) + self:SetSphereRadius(200) +end + +function BP_Skill_IceFrost:ReceiveEndPlay() + for Monster, SpeedScale in pairs(self.CachedSpeedScales) do + if Monster ~= nil and UE.IsValid(Monster) then + UGCSimpleCharacterSystem.SetSpeedScale(Monster, SpeedScale) + end + end + self.CachedSpeedScales = {} + self.SuperClass.ReceiveEndPlay(self) +end + +function BP_Skill_IceFrost:SetLevel(NewLevel) + SkillActorBase.SetLevel(self, NewLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[NewLevel] + self.CurSpeedScaleReductionRate = self.SpeedScaleReductionRateTable[NewLevel] +end + +function BP_Skill_IceFrost:OnMonsterBeginOverlap(Monster) + local SpeedScale = UGCSimpleCharacterSystem.GetSpeedScale(Monster) + self.CachedSpeedScales[Monster] = SpeedScale + UGCSimpleCharacterSystem.SetSpeedScale(Monster, SpeedScale * self.CurSpeedScaleReductionRate) + + local DamageAmount = 100 + UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) +end + +function BP_Skill_IceFrost:OnMonsterEndOverlap(Monster) + if self.CachedSpeedScales[Monster] then + UGCSimpleCharacterSystem.SetSpeedScale(Monster, self.CachedSpeedScales[Monster]) + end +end + +return BP_Skill_IceFrost; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_ToxicRain.lua b/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_ToxicRain.lua new file mode 100644 index 00000000..3816849c --- /dev/null +++ b/GZJ/Script/Blueprint/SceneObject/SkillActor/BP_Skill_ToxicRain.lua @@ -0,0 +1,77 @@ +---@class BP_Skill_ToxicRain_C:BP_Skill_Actor_C +--Edit Below-- + +local SkillActorBase = require('Script.Blueprint.SceneObject.SkillActor.BP_Skill_Actor') +local BP_Skill_ToxicRain = setmetatable( + { + AdditionDamageRateTable = {1.2, 1.8, 2.4, 3.0}, + DefenceReductionRateTable = {0.95, 0.90, 0.85, 0.75}, + CurDamageRate = 0.0, + CurDefenceReductionRate = 0.0, + AffectedMonster = {}, + + TimerHandle = nil, + }, + { + __index = SkillActorBase, + __metatable = SkillActorBase + } +) + + +function BP_Skill_ToxicRain:ReceiveBeginPlay() + SkillActorBase.ReceiveBeginPlay(self) + self:SetSphereRadius(150) +end + +function BP_Skill_ToxicRain:ReceiveEndPlay() + for Monster, CachedDefence in pairs(self.AffectedMonster) do + if Monster ~= nil and UE.IsValid(Monster) then + Monster.PhysicalDefense = CachedDefence + end + end + self.AffectedMonster = {} + + if self.TimerHandle then + EventSystem.StopTimer(self.TimerHandle) + end + + self.SuperClass.ReceiveEndPlay(self) +end + +function BP_Skill_ToxicRain:SetLevel(NewLevel) + SkillActorBase.SetLevel(self, NewLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[NewLevel] + self.CurDefenceReductionRate = self.DefenceReductionRateTable[NewLevel] +end + +function BP_Skill_ToxicRain:OnMonsterBeginOverlap(Monster) + if self.TimerHandle == nil then + self:SetupTimer() + end + + self.AffectedMonster[Monster] = Monster.PhysicalDefense + Monster.PhysicalDefense = Monster.PhysicalDefense * self.CurDefenceReductionRate +end + +function BP_Skill_ToxicRain:OnMonsterEndOverlap(Monster) + if self.AffectedMonster[Monster] then + Monster.PhysicalDefense = self.AffectedMonster[Monster] + end +end + +function BP_Skill_ToxicRain:SetupTimer() + self.TimerHandle = EventSystem.SetTimerLoop(self, function() + local DamageAmount = 120 + UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + for Monster, CachedDefence in pairs(self.AffectedMonster) do + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end + end, 1.0) +end + +return BP_Skill_ToxicRain; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/UGCGameMode.lua b/GZJ/Script/Blueprint/UGCGameMode.lua new file mode 100644 index 00000000..74a82234 --- /dev/null +++ b/GZJ/Script/Blueprint/UGCGameMode.lua @@ -0,0 +1,24 @@ +---@class UGCGameMode_C:BP_UGCGameBase_C +--Edit Below-- +local UGCGameMode = {}; +-- function UGCGameMode:ReceiveBeginPlay() + +-- end +-- function UGCGameMode:ReceiveTick(DeltaTime) + +-- end +-- function UGCGameMode:ReceiveEndPlay() + +-- end + +function UGCGameMode:LuaModifyDamage(Damage, DamageType, InstigatorPlayerState, VictimPlayerState) + return Damage +end + +function UGCGameMode:Server_RespawnPlayer(InPlayerKey) + -- 3秒后重生 + + UGCGameSystem.GetRespawnComponent():AddRespawnPlayer(InPlayerKey, 3) +end + +return UGCGameMode; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/UGCGameState.lua b/GZJ/Script/Blueprint/UGCGameState.lua new file mode 100644 index 00000000..ffb58249 --- /dev/null +++ b/GZJ/Script/Blueprint/UGCGameState.lua @@ -0,0 +1,1811 @@ +---@class UGCGameState_C:BP_UGCGameState_C +---@field DataTables TArray +--Edit Below-- +UGCGameSystem.UGCRequire('Script.Common.ue_enum_custom') +UGCGameSystem.UGCRequire('Script.Common.ue_struct_custom') +UGCGameSystem.UGCRequire('Script.Global.Global') + +local UGCGameState = { + + IsRunOnServer = false, + + --玩家数据列表 + PlayerDataList = {}, + + --玩家难度选择 + PlayerDifficultySelection = { + }, + + --游戏难度 + GameDifficulty = 0, + + --首领血量系数 + BossHealthMultiplier = 1.0, + + --怪物血量及攻击力系数 + MonsterHealthAndAttackValueMultiplier = { + ["Health"] = 1.0, + ["Attack"] = 1.0, + }, + + --游戏是否胜利 + GameIsWin = false, + + --游戏开始时间 + GameStartTimeStamp = 0, + + --游戏结束时间 + GameEndTimeStamp = 0, + + --当前游戏时长 + GameDuration = 0.0, + + --是否应用初始角色属性 + bHasApplyedAttribute = false, + + --在场地中央的玩家们 + PlayerPawnInArena = {}, + + --水晶 + Crystal = nil, + + --等待玩家进入剩余时间 + WaitPlayerJoinTime = -1, + + --游戏阶段 + GameStage = -1, + + --准备阶段各个状态 + GameReadyStage = -1, + + --准备阶段各个状态剩余时间 + GameReadyStageRemainTime = -1, + + --进攻波次是否存在 + IsInAttackWave = false, + + --总进攻波次 + TotalAttackWave = -1, + + --进攻波次 + CurAttackWave = -1, + + --战斗阶段各个波次剩余时间 + GameFightStageRemainTime = -1, + + --Item全局唯一ID + CurDropItemThisID = 1, + + --掉落物全局表 + GlobalDropItemActorList = {}, + + --根据玩家进行区分掉落物,除了玩家以外掉落的为 InArena: 0;玩家本身使用 PlayerKey + DropItemList = { + [0] = {}, + }; + + --玩家伤害 {[PlayerKey] = {[BossID] = number} ... } + PlayerDamageList = {}, + + --首领列表 + BossList = {}, + + --玩家伤害 {[PlayerKey] = {[Level] = number, [CurExp] = number}, ... } + PlayerLevelAndExpList = {}, + + --玩家战力值 + PlayerCombatPointList = {}, + + -- 本局游戏玩家死亡次数 { PlayerKey: DieCount } + PlayerDieTimes = {}, + + -- 玩家重生数据 { Type: Value } + PlayerArchiveDatas = {}, + + -- 练功房物品数量上限 + ExerciseRoomItemLimit = 50; + + PlayerInitDatas = {}; + + GameResultData = {}; --游戏结算信息 +}; + +require('Script.Manager.CommandQueneManager') + +--设置同步的属性 +function UGCGameState:GetReplicatedProperties() + return + "GameDuration", + "PlayerDataList", + "PlayerDifficultySelection", + "GameStage", + "WaitPlayerJoinTime", + "TotalAttackWave", + "CurAttackWave", + "IsInAttackWave", + "GameFightStageRemainTime", + {"GameResultData", "Lazy"}, + {"GameReadyStage", "Lazy"}, + "GameReadyStageRemainTime", + "PlayerDamageList", + {"BossList", "Lazy"}, + "GameDifficulty", + "PlayerLevelAndExpList", + "PlayerCombatPointList", + "PlayerDieTimes" +end + +function UGCGameState:GetAvailableServerRPCs() + return + -- "Client_MulticastRPC_ShowGeneralNoticeTips", + -- "Client_MulticastRPC_ShowNoticeTips", + -- "Client_MulticastRPC_SendEvent", + -- "Client_MulticastRPC_ShowPanel", + -- "Client_MulticastRPC_ClosePanel", + -- "Client_MulticastRPC_ShowCrystalAttackedByBoss", + + ---Sound + -- "Client_MulticastRPC_PlaySound2D", + -- "Client_MulticastRPC_PlaySoundAtLocation", + -- "Client_MulticastRPC_PlaySoundAttachActor", + -- "Client_MulticastRPC_StopAllSound", + -- "Client_MulticastRPC_StopSoundByActor", + -- "Client_MulticastRPC_StopSoundByID" + + ---Unpacking + -- "Client_RPC_UnpackingResults", + "Server_RPC_Unpacking" +end + +function UGCGameState:ReceiveBeginPlay() + UGCGameSystem.UGCRequire('Script.Global.Global') + + UGCGameState.SuperClass.ReceiveBeginPlay(self) + + self.IsRunOnServer = UGCGameSystem.IsServer() + + self.IsShowDeadBox = false + + --游戏数据初始化 + GameDataManager:Init() + + if self:HasAuthority() == true then + EventSystem:AddListener(EventType.PlayerPawnInArenaChanged, UGCGameState.OnPlayerPawnInArenaChanged, self) + EventSystem:AddListener(EventType.SpawnDropItem, UGCGameState.SpawnDropItem, self) + EventSystem:AddListener(EventType.SpawnDropItemByID, UGCGameState.SpawnDropItemByID, self) + EventSystem:AddListener(EventType.ServerOnLevelAndExpChanged, UGCGameState.OnPlayerLevelAndExpChanged, self) + EventSystem:AddListener(EventType.ServerOnCombatPointChanged, UGCGameState.OnCombatPointChanged, self) + + GameEndManager:Init() + else + --预加载资源 + AsyncLoadTools:Init() + + local CommandManager = require('Script.Manager.CommandQueneManager') + CommandManager:AddInitCommand(self, self.Client_Init) + end +end + +function UGCGameState:ReceiveEndPlay() + if self:HasAuthority() == true then + EventSystem:RemoveListener(EventType.SpawnDropItemByID, UGCGameState.SpawnDropItemByID, self) + EventSystem:RemoveListener(EventType.SpawnDropItem, UGCGameState.SpawnDropItem, self) + EventSystem:RemoveListener(EventType.PlayerPawnInArenaChanged, UGCGameState.OnPlayerPawnInArenaChanged, self) + EventSystem:RemoveListener(EventType.ServerOnLevelAndExpChanged, UGCGameState.OnPlayerLevelAndExpChanged, self) + EventSystem:RemoveListener(EventType.ServerOnCombatPointChanged, UGCGameState.OnCombatPointChanged, self) + + else + AsyncLoadTools:UnInit() + + if NewPlayerGuideManager then + NewPlayerGuideManager:UnInit() + end + end + + GameDataManager:UnInit() + + UGCGameState.SuperClass.ReceiveEndPlay(self) +end + +function UGCGameState:ReceiveTick(DeltaTime) + UGCGameState.SuperClass.ReceiveTick(self, DeltaTime) + + if not self.IsRunOnServer then + if self.bHasInitClient == nil then + CommandQueneManager.bGameStateReady = true + self.bHasInitClient = true + UE.Log("[UGCGameState] *** UGCGameState Tick Init Ready") + end + CommandQueneManager:Update() + else + end +end + +function UGCGameState:Client_Init() + self:OnRep_BossList() + self:OnRep_PlayerDamageList() + self:OnRep_GameStage() + self:OnRep_PlayerLevelAndExpList() + self:OnRep_PlayerCombatPointList() +end + +-- 使用默认属性 +function UGCGameState:ApplyDefaultAttributes() + local AllPlayerStates = UGCGameSystem.GetAllPlayerState(false) + for _, PlayerState in pairs(AllPlayerStates) do + -- 将属性设置到PlayerState + local Temp = {} + + for i = 0, AttributeType.WeaponSpecial do + local Attribute = {} + for j, v in pairs(GlobalConfigs.Attributes) do + if i == 0 then + Attribute[j] = v.Value + else + Attribute[j] = 0 + end + end + Temp[i] = Attribute + end + + PlayerState.Attributes = Temp + + -- 在初始化属性结束后(GameState:ApplyDefaultAttributes())进行玩家存档属性的初始化 + PlayerState:InitData() + PlayerState:ApplyAttributes() + end + self.bHasApplyedAttribute = true +end + +-- 进行通知应用玩家属性 +function UGCGameState:ApplyPlayerWeaponAttributes(InPlayerKey) + -- 找到对应 PlayerState + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(InPlayerKey) + PlayerState:ApplyAttributes() +end + +function UGCGameState:CheckAllPlayersGameDifficultySelection() + local ValidVoteInfo = {} + if table.getCount(self.PlayerDifficultySelection) > 0 then + for Index, VoteNum in pairs(self.PlayerDifficultySelection) do + if VoteNum > 0 then + table.insert(ValidVoteInfo, { VoteType = Index, VoteNum = VoteNum }) + end + end + end + + if table.getCount(ValidVoteInfo) > 0 then + --有效投票(有人投票) + table.sort(ValidVoteInfo, + function(a, b) + if a.VoteNum > b.VoteNum then + return true + elseif a.VoteNum == b.VoteNum then + return a.VoteType > b.VoteType + else + return false + end + end) + for _, v in pairs(ValidVoteInfo) do + UE.Log("[UGCGameState:CheckAllPlayersGameDifficultySelection] VoteIndex = %s, VoteNum = %d", v.VoteType, v.VoteNum) + end + + if table.getCount(ValidVoteInfo) > 0 then + for index, v in pairs(ValidVoteInfo) do + --self.GameDifficulty = GlobalConfigs.GameDifficulty[v.VoteType] + self.GameDifficulty = v.VoteType + break + end + else + self.GameDifficulty = 1 + end + + else + --无有效投票(所有人都没投票)则固定难度1 + self.GameDifficulty = 1 + end + + if self.GameDifficulty <= 0 then + NoticeTipsTools.MulticastGeneralNoticeTips("游戏难度配置错误,请检查逻辑,游戏终止", true, 4.0) + return + end + + UE.Log("[UGCGameState:CheckAllPlayersGameDifficultySelection] GameDifficulty = "..tostring(self.GameDifficulty)) + NoticeTipsTools.MulticastGeneralNoticeTips("游戏难度:难"..tostring(self.GameDifficulty)) + + local FightStageConfig = Tables.GameFightStageConfig[math.clamp(self.GameDifficulty, 1, 4)] + self.TotalAttackWave = table.getCount(FightStageConfig) + UE.Log("[UGCGameState:CheckAllPlayersGameDifficultySelection] TotalAttackWave = %d", self.TotalAttackWave) + + local BossTotaNum = 0 + for _, Config in pairs(FightStageConfig) do + BossTotaNum = BossTotaNum + Config.MonsterNum.Boss + end + + -- Boss难度表 + local BossSort = { + { ID = 10001, Diff = 3 }, + { ID = 10002, Diff = 4 }, + { ID = 10003, Diff = 2 }, + { ID = 10004, Diff = 9 }, + { ID = 10005, Diff = 1 }, + { ID = 10006, Diff = 10 }, + }; + + table.sort(BossSort, function(a, b) + return a.Diff < b.Diff; + end) + + for i = 1, BossTotaNum do + local BossInfo = nil + if i <= 2 then + BossInfo = table.remove(BossSort, math.random(1, #BossSort - 2)); + else + BossInfo = table.remove(BossSort, math.random(1, #BossSort)) + end + if BossInfo then + table.insert(self.BossList, BossInfo.ID) + end + end + + UnrealNetwork.RepLazyProperty(self, "BossList") + + local AllPlayerStates = UGCGameSystem.GetAllPlayerState(false) + for _, PlayerState in pairs(AllPlayerStates) do + self.PlayerDamageList[PlayerState.PlayerKey] = {} + for _, BossID in pairs(self.BossList) do + self.PlayerDamageList[PlayerState.PlayerKey][BossID] = 0.0 + end + end + +end + +function UGCGameState:CheckAllPlayersDefaultWeaponSelection() + local AllPlayerStates = UGCGameSystem.GetAllPlayerState(false) + for _, PlayerState in pairs(AllPlayerStates) do + local InPlayerKey = PlayerState.PlayerKey + if table.getCount(PlayerState.OwnerWeapons) <= 0 then + -- 设置初始武器 + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(InPlayerKey) + PlayerController:ServerRPC_SelectDefaultWeapon(101) ---配置默认武器R1895 + end + end +end + +function UGCGameState:CheckAllPlayersDefaultTelentSelection() + local AllPlayerController = UGCGameSystem.GetAllPlayerController(false) + for _, PC in pairs(AllPlayerController) do + local InPlayerKey = PC.PlayerKey + if next(PC.ActiveSkillNameList) == nil then + PC:GiveSkillList({ESkillName.Heal, ESkillName.Dash}) + NoticeTipsTools.ServerGeneralNoticeTips(InPlayerKey, "已选择默认天赋技能:冲刺") + else + PC:GiveSkill(ESkillName.Heal) + end + end + + NoticeTipsTools.MulticastGeneralNoticeTips("所有玩家已准备完毕,练功房激活! 等待进攻波次开始!", false, 8.0) +end + +function UGCGameState:GetGameDuration() + return math.ceil(self.GameEndTimeStamp - self.GameStartTimeStamp) +end + +function UGCGameState:SetIsGameWin(IsWin) + self.GameIsWin = IsWin +end + +function UGCGameState:GetIsGameWin() + return self.GameIsWin +end + +function UGCGameState:GetCrystal() + if self.Crystal == nil or UE.IsValid(self.Crystal) == false then + local CrystalClass = UE.LoadClass(BPClassPath.Crystal) + local Crystals = GameplayStatics.GetAllActorsOfClass(self, CrystalClass, {}) + local Crystal = Crystals[1] + self.Crystal = Crystal + end + return self.Crystal +end + +function UGCGameState:GetAttackWaveSpawner() + if self.AttackWaveSpawner == nil or UE.IsValid(self.AttackWaveSpawner) == false then + local SpawnerClass = UE.LoadClass(BPClassPath.MonsterSpawner) + local Spawners = GameplayStatics.GetAllActorsOfClass(self, SpawnerClass, {}) + for _, Spawner in pairs(Spawners) do + if Spawner.Type == EMonsterSpawnerType.AttackWave then + self.AttackWaveSpawner = Spawner + break + end + end + end + return self.AttackWaveSpawner +end + +function UGCGameState:GetAllHangUpRoomSpawners() + if self.HangUpRoomSpawners == nil then + self.HangUpRoomSpawners = {} + local Spawners = GameplayStatics.GetAllActorsOfClass(self, UE.LoadClass(BPClassPath.MonsterSpawner), {}) + for _, Spawner in pairs(Spawners) do + if Spawner.Type == EMonsterSpawnerType.HangUpRoom then + self.HangUpRoomSpawners[Spawner.TargetPlayerKey] = Spawner + end + end + end + return self.HangUpRoomSpawners +end + +function UGCGameState:GetAllSpawners() + local AttackWaveSpawner = self:GetAttackWaveSpawner() + local HangUpRoomSpawners = self:GetAllHangUpRoomSpawners() + + local AllSpawners = {} + table.insert(AllSpawners, AttackWaveSpawner) + for _, Spawner in pairs(HangUpRoomSpawners) do + table.insert(AllSpawners, Spawner) + end + return AllSpawners +end + +function UGCGameState:GetSpawnerByPlayerKey(InPlayerKey) + if self.HangUpRoomSpawners == nil then + self.HangUpRoomSpawners = {} + local Spawners = GameplayStatics.GetAllActorsOfClass(self, UE.LoadClass(BPClassPath.MonsterSpawner), {}) + for _, Spawner in pairs(Spawners) do + if Spawner.Type == EMonsterSpawnerType.HangUpRoom then + self.HangUpRoomSpawners[Spawner.TargetPlayerKey] = Spawner + end + end + end + return self.HangUpRoomSpawners[InPlayerKey] +end + +function UGCGameState:GetAllTeleporters() + if self.Teleporters == nil then + self.Teleporters = {} + local Teleporters = GameplayStatics.GetAllActorsOfClass(self, UE.LoadClass(BPClassPath.Teleporter), {}) + for _, Teleporter in pairs(Teleporters) do + table.insert(self.Teleporters, Teleporter) + end + end + return self.Teleporters +end + +function UGCGameState:GetAllPlayerStarts() + if self.PlayerStarts == nil then + self.PlayerStarts = {} + self.PlayerStarts[ETeleportType.InArena] = {} + self.PlayerStarts[ETeleportType.InHangupRoom] = {} + local AllPlayerStarts = GameplayStatics.GetAllActorsOfClass(self, UE.LoadClass(BPClassPath.PlayerStart), {}) + print(string.format('[UGCGameState:GetAllPlayerStarts] 一共有%d个 PlayerStart', table.getCount(AllPlayerStarts))) + for _, PlayerStart in pairs(AllPlayerStarts) do + + table.insert(self.PlayerStarts[PlayerStart:GetType()], PlayerStart) + end + end + return self.PlayerStarts +end + +function UGCGameState:GetPlayersInArena() + return self.PlayerPawnInArena +end + +function UGCGameState:OnPlayerPawnInArenaChanged(InRangePlayerPawn) + self.PlayerPawnInArena = InRangePlayerPawn +end + +function UGCGameState:OnPlayerLevelAndExpChanged(PlayerKey, InLevel, InCurExp, InTotalExp) + if self.PlayerLevelAndExpList[PlayerKey] == nil then + self.PlayerLevelAndExpList[PlayerKey] = {} + end + self.PlayerLevelAndExpList[PlayerKey] = {Level = InLevel, CurExp = InCurExp, TotalExp = InTotalExp} +end + +function UGCGameState:OnCombatPointChanged(PlayerKey, CombatPoint) + self.PlayerCombatPointList[PlayerKey] = CombatPoint +end + +-- 生成一个掉落物 +function UGCGameState:SpawnDropItem(InLoc, InRot, InPlayerKey, InData) + local ItemData + if InData == nil then + ItemData = GenerateDropItemData() + else + ItemData = InData + end + + if InPlayerKey ~= nil then + -- 判断是否生成在 InArena:如果玩家此时在场内,说明就生成在场内 + local ThePawn = UGCGameSystem.GetPlayerPawnByPlayerKey(InPlayerKey) + if ThePawn then + if not ThePawn.IsInArena then + -- 说明在场内 + self:SpawnDropItem_ExerciseRoom(InLoc, InRot, InPlayerKey, ItemData) + --self.DropItemList[0][self.CurDropItemThisID] = DropItemActor; + else + self:SpawnDropItem_InArena(InLoc, InRot, InPlayerKey, ItemData) + --if self.DropItemList[InPlayerKey] == nil then + -- self.DropItemList[InPlayerKey] = {} + --end + ---- 添加到数组中,可以设置为当玩家在练功房的时候自动拾取里面的所有东西 + --self.DropItemList[InPlayerKey][self.CurDropItemThisID] = DropItemActor; + end + else + print(string.format('[UGCGameState:SpawnDropItem] 无法找到当前玩家')) + end + return + end +end + +function UGCGameState:SpawnDropItem_InArena(InLoc, InRot, InPlayerKey, InData) + local ItemBaseClass = UE.LoadClass(BPClassPath.PickupItemClass) + local Location = self:GetDropLocation(InLoc) + local Scale = VectorHelper.ScaleOne() + + --此处生成了一个具体的 Item + local DropItemActor = UGCGameSystem.SpawnActor( + self, + ItemBaseClass, + Location, + InRot, + Scale, + self + ) + + if DropItemActor then + DropItemActor:SetPickItemData(string.format("%d;%d", InData.ItemID, InData.Count)) + DropItemActor:SetThisID(self.CurDropItemThisID) + + self.GlobalDropItemActorList[self.CurDropItemThisID] = DropItemActor + self.CurDropItemThisID = self.CurDropItemThisID + 1 + end +end + +function UGCGameState:SpawnDropItem_ExerciseRoom(InLoc, InRot, InPlayerKey, InData) + -- 判断场景中的物品数量是否超过指定数量 + if not self:CanExerciseCreateDropItem(InPlayerKey) then + return + end + log_tree('InData = ', InData) + -- 加入到数组中,场景中的不加入 + if self.DropItemList[InPlayerKey] == nil then + self.DropItemList[InPlayerKey] = {} + end + if self.DropItemList[InPlayerKey][InData.ItemID] == nil then + self.DropItemList[InPlayerKey][InData.ItemID] = InData.Count + else + self.DropItemList[InPlayerKey][InData.ItemID] = self.DropItemList[InPlayerKey][InData.ItemID] + InData.Count + end + log_tree("DropItemList", self.DropItemList) + -- 发送 RPC 通知客户端创建东西 + local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(InPlayerKey) + InLoc = self:GetDropLocation(InLoc) + PC:RequestExerciseDropItem(InPlayerKey, InLoc, InRot, InData, true) +end + +--是否可以在练功房创建掉落物 +function UGCGameState:CanExerciseCreateDropItem(InPlayerKey) + if self.DropItemList[InPlayerKey] ~= nil then + -- i: ItemID, v: ItemCount + local TotalCount = 0 + for i, v in pairs(self.DropItemList[InPlayerKey]) do + TotalCount = TotalCount + v; + end + return self.ExerciseRoomItemLimit > TotalCount; + else + return true; + end +end + +--玩家丢弃的时候生成 +function UGCGameState:SpawnDropItemByID(InItemID, InCount, InLoc, InRot, InPlayerKey, IsFromDiscard) + UE.Log("[UGCGameState:SpawnDropItemByID] 开始执行") + local ItemBaseClass = UE.LoadClass(BPClassPath.PickupItemClass) + local Location = self:GetDropLocation(InLoc) + local Rotation = InRot + local Scale = VectorHelper.ScaleOne() + local DropItemActor = UGCGameSystem.SpawnActor( + self, + ItemBaseClass, + Location, + Rotation, + Scale, + self + ) + + if DropItemActor then + UE.Log("[UGCGameState:SpawnDropItemByID] 执行掉落方法") + UE.Log("{ItemID类型是 = %s, Count = %s}", type(InItemID), type(InCount)) + + DropItemActor:SetPickItemData(string.format("%d;%d", InItemID, InCount)) + DropItemActor:SetThisID(self.CurDropItemThisID) + if IsFromDiscard then + DropItemActor:SetAutoPickupDisabled(InPlayerKey) + end + + self.GlobalDropItemActorList[self.CurDropItemThisID] = DropItemActor + self.CurDropItemThisID = self.CurDropItemThisID + 1 + end + UE.Log("[UGCGameState:SpawnDropItemByID] 执行完成") +end + +function UGCGameState:GetDropLocation(InStartLocation) + local StartPos = VectorHelper.Add(InStartLocation, {X=0,Y=0,Z=50}) + local EndPos = VectorHelper.Sub(InStartLocation, {X=0,Y=0,Z=500}) + local ObjectTypes = {EObjectTypeQuery.ObjectTypeQuery1} + local AllWeapons = GameplayStatics.GetAllActorsOfClass(self, UE.LoadClass(BPClassPath.Weapon), {}) + local bHit, HitResult = KismetSystemLibrary.LineTraceSingleForObjects(self, StartPos, EndPos, ObjectTypes, false, AllWeapons, EDrawDebugTrace.None, nil, true, nil,nil, nil) + local DropPos = {} + if bHit then + DropPos = HitResult.ImpactPoint + else + DropPos = InStartLocation + end + return DropPos +end + +--S +function UGCGameState:UpdatePlayerDamage(InPlayerKey, InBossID, InDeltaDamage) + if self.PlayerDamageList[InPlayerKey] == nil then + self.PlayerDamageList[InPlayerKey] = {} + end + if self.PlayerDamageList[InPlayerKey][InBossID] == nil then + self.PlayerDamageList[InPlayerKey][InBossID] = 0 + end + local CurDamage = self.PlayerDamageList[InPlayerKey][InBossID] + self.PlayerDamageList[InPlayerKey][InBossID] = CurDamage + InDeltaDamage +end + +--S +function UGCGameState:UpdateIsInAttackWave(bNewIsInAttackWave) + if self.IsInAttackWave ~= bNewIsInAttackWave then + self.IsInAttackWave = bNewIsInAttackWave + EventSystem:SendEvent(EventType.OnIsInAttackWaveChanged, self.IsInAttackWave) + if bNewIsInAttackWave == false then + -- 提示当前过3秒传回练功房 + EventSystem.SetTimer(self, function() + -- 发送到练功房 + EventSystem:SendEvent(EventType.SendPlayersToExercise) + end, 3) + end + end +end + +function UGCGameState:GetAllPlayerLevel() + local LevelTable = {} + for PlayerKey, Info in pairs(self.PlayerLevelAndExpList) do + LevelTable[PlayerKey] = Info.Level + end + return LevelTable +end + +function UGCGameState:GetAllPlayerExp() + local ExpTable = {} + for PlayerKey, Info in pairs(self.PlayerLevelAndExpList) do + ExpTable[PlayerKey] = {CurExp = Info.CurExp, TotalExp = Info.TotalExp} + end + return ExpTable +end + +function UGCGameState:OnRep_PlayerDataList() + for k,v in pairs(self.PlayerDataList) do + UE.Log("[UGCGameState:OnRep_PlayerDataList] PlayerKey = "..tostring(v.PlayerKey).." PlayerName = "..v.PlayerName) + end + + EventSystem:SendEvent(EventType.PlayerDataListChanged, self.PlayerDataList) +end + +function UGCGameState:OnRep_PlayerDifficultySelection() + if table.getCount(self.PlayerDifficultySelection) > 0 then + for k, v in pairs(self.PlayerDifficultySelection) do + UE.Log("[UGCGameState:OnRep_PlayerDifficultySelection] key = %s, value = %d", tostring(k), v) + end + end + + EventSystem:SendEvent(EventType.PlayerDifficultySelectionChanged, self.PlayerDifficultySelection) +end + +function UGCGameState:OnRep_WaitPlayerJoinTime() + UE.Log("[UGCGameState:OnRep_WaitPlayerJoinTime] WaitPlayerJoinTime = %d", self.WaitPlayerJoinTime) + + EventSystem:SendEvent(EventType.OnWaitPlayerJoinTimeChanged, self.WaitPlayerJoinTime) +end + +function UGCGameState:OnRep_GameStage() + UE.Log("[UGCGameState:OnRep_GameStage] GameStage = %d", self.GameStage) + + EventSystem:SendEvent(EventType.OnGameStageChanged, self.GameStage); +end + +function UGCGameState:OnRep_GameReadyStage() + UE.Log("[UGCGameState:OnRep_GameReadyStage] GameReadyStage = %s", tostring(self.GameReadyStage)) + + -- 这里只发了一次 + if UIManager and UIManager.HasInitialized then + if self.GameReadyStage >= 0 then + for _, Config in pairs(Tables.GameReadyStageConfig) do + if Config.Stage == self.GameReadyStage then + local TriggerUI = Config.TriggerUI + UIManager:ShowPanel(TriggerUI) + break + end + end + end + end +end + +function UGCGameState:OnRep_GameReadyStageRemainTime() + UE.Log("[UGCGameState:OnRep_GameReadyStageRemainTime] GameReadyStageRemainTime = %s", tostring(self.GameReadyStageRemainTime)) + + EventSystem:SendEvent(EventType.OnGameReadyStageRemainTimeChanged, self.GameReadyStageRemainTime) +end + +function UGCGameState:OnRep_CurAttackWave() + UE.Log("[UGCGameState:OnRep_CurAttackWave] CurAttackWave = %s", tostring(self.CurAttackWave)) + + EventSystem:SendEvent(EventType.OnCurAttackWaveChanged, self.CurAttackWave, self.TotalAttackWave) + + if self.CurAttackWave > 0 and self.TotalAttackWave > 0 and UIManager then + UIManager:ShowNotice(ECustomNoticeType.GeneralNotice, string.format("第%d波进攻开始", self.CurAttackWave), false, 3.0) + UIManager:ShowNotice(ECustomNoticeType.AttackWaveNotice, self.CurAttackWave, self.TotalAttackWave) + end +end + +function UGCGameState:OnRep_IsInAttackWave() + UE.Log("[UGCGameState:OnRep_IsInAttackWave] IsInAttackWave = %s", tostring(self.IsInAttackWave)) + + EventSystem:SendEvent(EventType.OnIsInAttackWaveChanged, self.IsInAttackWave) + + if self.GameStage >= EGameStage.GameFight then + for _, Teleporter in pairs(self:GetAllTeleporters()) do + if self.IsInAttackWave == false then + Teleporter:SetRingColor(Teleporter.Type == ETeleportType.InHangupRoom) + else + Teleporter:SetRingColor(Teleporter.Type == ETeleportType.InArena) + end + end + end + + if self.GameStage == EGameStage.GameFight and self.IsInAttackWave == false then + UIManager:ShowNotice(ECustomNoticeType.GeneralNotice, "进攻波次已清理完毕,可回到练功房继续提升等级", false, 3.0) + end +end + +function UGCGameState:OnRep_GameFightStageRemainTime() + UE.Log("[UGCGameState:OnRep_GameFightStageRemainTime] GameFightStageRemainTime = %s", tostring(self.GameFightStageRemainTime)) + + EventSystem:SendEvent(EventType.OnGameFightStageRemainTimeChanged, self.GameFightStageRemainTime) + + if self.GameFightStageRemainTime > 5 then + self.bHasNoticedAttackWave = false + end + + if UIManager and UIManager.HasInitialized then + if self.GameFightStageRemainTime >= 0 then + UIManager:ShowNotice(ECustomNoticeType.AttackWaveRemainTimeNotice, self.GameFightStageRemainTime) + end + if self.GameFightStageRemainTime <= 5 and not self.bHasNoticedAttackWave then + UIManager:ShowNotice(ECustomNoticeType.CountDownNotice, "怪物进攻倒计时", self.GameFightStageRemainTime, true) + self.bHasNoticedAttackWave = true + end + end +end + +function UGCGameState:OnRep_PlayerDamageList() + log_tree("[OnRep_PlayerDamageList] PlayerDamageList = ", self.PlayerDamageList) + + EventSystem:SendEvent(EventType.OnPlayerDamageChanged, self.PlayerDamageList) +end + +function UGCGameState:OnRep_BossList() + log_tree_dev("[OnRep_BossList] BossList = ", self.BossList) + EventSystem:SendEvent(EventType.ChangeBossList, self.BossList) +end + +function UGCGameState:OnRep_PlayerLevelAndExpList() + local LevelTable = {} + local ExpTable = {} + for PlayerKey, Info in pairs(self.PlayerLevelAndExpList) do + LevelTable[PlayerKey] = Info.Level + ExpTable[PlayerKey] = Info.CurExp + end + EventSystem:SendEvent(EventType.OnPlayerLevelChanged, self:GetAllPlayerLevel()) + EventSystem:SendEvent(EventType.OnPlayerExpChanged, self:GetAllPlayerExp()) +end + +function UGCGameState:OnRep_PlayerCombatPointList() + EventSystem:SendEvent(EventType.OnPlayerCombatPointChanged, self.PlayerCombatPointList) +end + +function UGCGameState:OnRep_GameDuration() + EventSystem:SendEvent(EventType.OnGameDurationChanged, self.GameDuration) +end + +--------------------------------------------RPC-------------------------------------------- + +function UGCGameState:Client_MulticastRPC_ShowGeneralNoticeTips(InText, ShowAlert, ShowTime) + if self:HasAuthority() then return end + + UIManager:ShowGeneralNotice(InText, ShowAlert, ShowTime) +end + +function UGCGameState:Client_MulticastRPC_ShowNoticeTips(InNoticeType, ...) + if self:HasAuthority() then return end + + UIManager:ShowNotice(InNoticeType, ...) +end + +function UGCGameState:Client_MulticastRPC_SendEvent(InEventType, ...) + if self:HasAuthority() then return end + + EventSystem:SendEvent(InEventType, ...) +end + +function UGCGameState:Client_MulticastRPC_ShowPanel(InUIType, ...) + if self:HasAuthority() then return end + + EventSystem:SendEvent(EventType.RequestShowPanel, InUIType, ...) +end + +function UGCGameState:Client_MulticastRPC_ClosePanel(InUIType) + if self:HasAuthority() then return end + UIManager:ClosePanel(EUIType.DifficultInfo) + EventSystem:SendEvent(EventType.RequestClosePanel, InUIType) +end + +function UGCGameState:Client_MulticastRPC_ShowCrystalAttackedByBoss() + if self:HasAuthority() then return end + + local Crystal = self:GetCrystal() + Crystal.NarrationWidget.Widget:UpdateNarrationText("来看看是哪来的小东西,是在帮我挠痒痒吗?") +end + +function UGCGameState:Server_RPC_Unpacking(PlayerKey, UnpackingLevel, InTimes) + local TargetPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + local Val = Tables.Unpacking.LevelCoinPoint[UnpackingLevel].CoinPoint1 + if InTimes == 10 then + Val = Tables.Unpacking.LevelCoinPoint[UnpackingLevel].CoinPoint10 + end + local Func = function(InValue) + if InValue > 0 then + InValue = -InValue + end + InValue = math.clamp(InValue, -1, 0) + return InValue + end + -- 计算开箱所需金币 + local Temp, Temp1, Temp2, Temp3 = 0, 0, 0, 0 + for i, v in pairs(TargetPlayerState.Attributes) do + Temp = Temp + v.Unpacking_Cost + Temp1 = Temp1 + v.Primary_Raffle_Cost + Temp2 = Temp2 + v.Middle_Raffle_Cost + Temp3 = Temp3 + v.Senior_Raffle_Cost + end + + local Func1 = function(TheTime, InPlayerState, Num) + if TheTime == 10 then + if InPlayerState.EasterEggsData[Num] == nil then + InPlayerState.EasterEggsData[Num] = 1 + else + InPlayerState.EasterEggsData[Num] = InPlayerState.EasterEggsData[Num] + 1 + end + -- 比较一下 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](InPlayerState, Num) + end + end + + local Val1 = 0 + if UnpackingLevel == 1 then + Val1 = Temp1 + elseif UnpackingLevel == 2 then + Val1 = Temp2 + elseif UnpackingLevel == 3 then + Val1 = Temp3 + end + + Val = Val * (1 + Temp) * (1 + Val1) + if TargetPlayerState.CoinPoint.Current > Val then + -- 可以扣金币 + local UnpackingResults = {} + for i = 1, InTimes do + local UnpackingResult = self:Unpacking(PlayerKey, UnpackingLevel) + table.insert(UnpackingResults, {Name = UnpackingResult.Name, UnpackingLevel = UnpackingResult.UnpackingLevel}) + end + + TargetPlayerState:UpdateCoinPoint(- Val) + + if UnpackingLevel == 1 then + Func1(InTimes, TargetPlayerState, 13) + elseif UnpackingLevel == 2 then + Func1(InTimes, TargetPlayerState, 12) + elseif UnpackingLevel == 3 then + Func1(InTimes, TargetPlayerState, 11) + end + + local TargetPawn = ScriptGameplayStatics.GetPlayerPawnByPlayerKey(self, PlayerKey) + local TargetController = TargetPawn:GetController() + + TargetPlayerState.ArchiveData.TotalUnpackTimes = TargetPlayerState.ArchiveData.TotalUnpackTimes + InTimes; + + -- + --local CurItemMap = TargetController:GetItemMap() + --UnrealNetwork.CallUnrealRPC(TargetController, TargetController, "ClientRPC_UpdateBackpackItemMap", CurItemMap) + UnrealNetwork.CallUnrealRPC(TargetController, self, "Client_RPC_UnpackingResults", PlayerKey, UnpackingResults) + else + UE.LogError("[UGCGameState:Server_RPC_Unpacking] 金币不足") + end +end + +function UGCGameState:Client_RPC_UnpackingResults(PlayerKey, UnpackingResults) + EventSystem:SendEvent(EventType.UnpackingResult, PlayerKey, UnpackingResults) +end + +function UGCGameState:Unpacking(PlayerKey, UnpackingLevel, Drop) + if Drop == nil then + Drop = Tables.Unpacking.CardDropping + end + while 1 do + local RateList = {} + if Drop.Children then + for k, Child in pairs(Drop.Children) do + if Child.Rate then + RateList[k] = Child.Rate + else + print("UGCGameState_Fun_" .. "Unpacking_" .. "Error_" .. "Rate is nil") + return + end + end + + local TargetIndex = self:GetRandomIndex(RateList) + Drop = Drop.Children[TargetIndex] + else + if Drop.AddDataFun then + local TargetController = ScriptGameplayStatics.GetPlayerPawnByPlayerKey(self,PlayerKey):GetController() + return Drop.AddDataFun(TargetController, UnpackingLevel) + else + print("UGCGameState_Fun_" .. "Unpacking_" .. "Error_" .. "Children is nil and AddDataFun is nil") + return + end + end + end +end + +function UGCGameState:GetRandomIndex(probabilityList) + local totalProbability = 0 + for i=1, #probabilityList do + totalProbability = totalProbability + probabilityList[i] + end + local randomValue = math.random() * totalProbability + local currentIndex = 1 + for i=1, #probabilityList do + randomValue = randomValue - probabilityList[i] + if randomValue <= 0 then + currentIndex = i + break + end + end + return currentIndex +end + +-- 保存玩家数据 +function UGCGameState:SavePlayersData(InPlayerKey) + local Func = function(v) + print(string.format('[UGCGameState:SavePlayersData] 开始保存数据')) + -- 进行测试 + --self:TestPlayerSaveData(v) + + local SaveData = v.ArchiveData + local Version_Temp + if Version == nil then + Version_Temp = require('Script.Global.Version') + else + Version_Temp = Version + end + local SavedData = { + ArchiveData = SaveData, + Version = Version_Temp.GetCurrentVersion() + } + log_tree("SaveData = ", SavedData) + UGCPlayerStateSystem.SavePlayerArchiveData(v.UID, SavedData) + end + + if InPlayerKey ~= nil then + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(InPlayerKey) + Func(PlayerState) + else + local AllPlayerStates = UGCGameSystem.GetAllPlayerState(false) + print(string.format('[UGCGameState:SavePlayersData] 保存数据')) + for _, v in pairs(AllPlayerStates) do + Func(v) + end + end +end + +function UGCGameState:TestPlayerSaveData(InPlayerState) + InPlayerState.ArchiveData = { + --GameTimes = 100, --游玩局数 + GameTimes = 1000, --游玩局数 + GameClearanceTimes = 200, --游戏通关数 + TotalCoinPoint = 200000000, --获取总金币数 + TotalKillPoint = 1300000, --获取总杀敌点数 + TotalBossKilledTimes = 500, --击杀 Boss 次数 + TotalSuperSkill = 2000, --获取总超级技能数 + TotalSuperFitting = 0, --获取超级配件数 + TotalUnpackTimes = 40000, --总开箱次数 + Score = 200000, --积分 + + PlayedGames = { --游玩过的游戏 + [1] = 6, + [2] = 6, + [3] = 6, + [4] = 6, + [5] = 6, + [6] = 6, + [7] = 6, + [8] = 6, + [9] = 6, + [10] = 6, + [11] = 6, + [12] = 6, + [13] = 6, + [14] = 6, + [15] = 6, + [16] = 6, + [17] = 6, + [18] = 6, + [19] = 6, + [20] = 6, + [21] = 6, + [22] = 6, + [23] = 6, + [24] = 6, + [25] = 6, + [26] = 6, + [27] = 6, + [28] = 6, + [29] = 6, + [30] = 6, + [31] = 6, + [32] = 6, + [33] = 6, + [34] = 6, + [35] = 6, + [36] = 6, + [37] = 6, + [38] = 6, + [39] = 6, + [40] = 6, + [41] = 6, + [42] = 6, + [43] = 6, + [44] = 6, + [45] = 6, + [46] = 6, + [47] = 6, + [48] = 6, + [49] = 6, + [50] = 6, + [51] = 6, + [52] = 6, + [53] = 6, + [54] = 6, + [55] = 6, + [56] = 6, + [57] = 6, + [58] = 6, + [59] = 6, + [60] = 6, + [61] = 6, + [62] = 6, + [63] = 6, + [64] = 6, + [65] = 6, + [66] = 6, + }, + + BossDropItems = { -- BOSS 掉落物 + ['慎'] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + }, + ['魅'] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + }, + ['春'] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + }, + ['瞬'] = { + [1] = 1, + [2] = 2, + [3] = 1, + [4] = 2, + }, + ['蛮'] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + }, + ['幻'] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + }, + }, + + GameDropItems = { -- 游戏掉落物 + [1] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [2] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [3] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [4] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [5] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [6] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [7] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [8] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [9] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [10] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [11] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [12] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [13] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [14] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [15] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [16] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [17] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [18] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [19] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [20] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [21] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [22] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [23] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [24] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [25] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [26] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [27] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [28] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [29] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [30] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [31] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [32] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [33] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [34] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [35] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [36] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [37] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [38] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [39] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [40] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [41] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [42] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [43] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [44] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [45] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [46] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [47] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [48] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [49] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [50] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [51] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [52] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [53] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [54] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [55] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [56] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [57] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [58] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [59] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [60] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [61] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [62] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [63] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [64] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [65] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + [66] = { + [1] = 1, + [2] = 1, + [3] = 1, + [4] = 1, + [5] = 1, + [6] = 6, + }, + }, + -- + EasterEggs = { --彩蛋类 + [1] = { + Active = true, + }, + [2] = { + Active = true, + }, + [3] = { + Active = true, + }, + [4] = { + Active = true, + }, + [5] = { + Active = true, + }, + [6] = { + Active = true, + }, + [7] = { + Active = true, + }, + [8] = { + Active = true, + }, + -- [9] = { + -- Active = false, + -- }, + [10] = { + Active = true, + }, + [11] = { + Active = true, + }, + [12] = { + Active = true, + }, + [13] = { + Active = true, + }, + --[14] = { + -- Active = false, + --}, + }, + } + -- 测试存档 + --for i = 1, table.getCount(ArchiveTable.EasterEggs) do + -- InPlayerState.ArchiveData.EasterEggs[i] = { + -- Active = false, -- 是否激活 + -- } + --end + +end + +-- 加载所有玩家数据 +function UGCGameState:LoadPlayerData() + local AllPlayerStates = UGCGameSystem.GetAllPlayerState(false) + for i = 1, #AllPlayerStates do + -- 获取玩家存档信息 + local PlayerData = UGCPlayerStateSystem.GetPlayerArchiveData(AllPlayerStates[i].UID) + if PlayerData ~= nil then + -- 解析 PlayerData + -- 依次检查对应版本 + self.PlayerArchiveDatas[AllPlayerStates[i].UID] = self:HandlePlayerArchiveData(PlayerData) + end + end +end + +-- 根据版本处理具体数据 +function UGCGameState:HandlePlayerArchiveData(InPlayerData) + -- 说明是最新版本,直接操作 + if InPlayerData.Version == self.VersionId then + return InPlayerData + elseif InPlayerData.Version == '0.1' then + return InPlayerData + end + return nil +end + +-----------------------------------Sound----------------------------------- + +function UGCGameState:Client_MulticastRPC_PlaySound2D(ConfigId) + if self:HasAuthority() then return end + + SoundManager.PlaySound2D(ConfigId) +end + +function UGCGameState:Client_MulticastRPC_PlaySoundAtLocation(ConfigId, Location, Rotation) + if self:HasAuthority() then return end + + SoundManager.PlaySoundAtLocation(ConfigId, Location, Rotation) +end + +function UGCGameState:Client_MulticastRPC_PlaySoundAttachActor(ConfigId, AttachedActor, StopWhenAttachedToDestroyed) + if self:HasAuthority() then return end + + SoundManager.PlaySoundAttachActor(ConfigId, AttachedActor, StopWhenAttachedToDestroyed) +end + +function UGCGameState:Client_MulticastRPC_StopAllSound() + if self:HasAuthority() then return end + + SoundManager.StopAllSound() +end + +function UGCGameState:Client_MulticastRPC_StopSoundByActor(Actor) + if self:HasAuthority() then return end + + SoundManager.StopSoundByActor(Actor) +end + +function UGCGameState:Client_MulticastRPC_StopSoundByID(ID) + if self:HasAuthority() then return end + + SoundManager.StopSoundByID(ID) +end + +function UGCGameState:CloseNoticeUI() + local PlayerControllerList = UGCGameSystem.GetAllPlayerController() + for i, v in pairs(PlayerControllerList) do + UnrealNetwork.CallUnrealRPC(v, v, "ClientRPC_ShowInitialPanel", false) + end +end + +function UGCGameState:SetInitialOver(InPlayerKey) + self.PlayerInitDatas[InPlayerKey] = true + local PSs = UGCGameSystem.GetAllPlayerState(false) + if table.getCount(PSs) == table.getCount(self.PlayerInitDatas) and table.getCount(self.PlayerInitDatas) >= 4 then + -- 执行操作 + EventSystem:SendEvent(EventType.UpdateInitialWidget) + UGCGameSystem.GameState.GameStage = EGameStage.GameReady; + end +end + +return UGCGameState; diff --git a/GZJ/Script/Blueprint/UGCHUD.lua b/GZJ/Script/Blueprint/UGCHUD.lua new file mode 100644 index 00000000..e2223868 --- /dev/null +++ b/GZJ/Script/Blueprint/UGCHUD.lua @@ -0,0 +1,35 @@ +---@class UGCHUD_C:BP_BattleRoyaleHUD_C +--Edit Below-- +local UGCHUD = {}; + +--[[ +function UGCHUD:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function UGCHUD:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function UGCHUD:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function UGCHUD:GetReplicatedProperties() + return +end +--]] + +--[[ +function UGCHUD:GetAvailableServerRPCs() + return +end +--]] + +return UGCHUD; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/UGCPlayerCamera.lua b/GZJ/Script/Blueprint/UGCPlayerCamera.lua new file mode 100644 index 00000000..16890f4f --- /dev/null +++ b/GZJ/Script/Blueprint/UGCPlayerCamera.lua @@ -0,0 +1,38 @@ +---@class UGCPlayerCamera_C:AActor +---@field Camera UCameraComponent +---@field SpringArm USpringArmComponent +---@field DefaultSceneRoot USceneComponent +--Edit Below-- +local UGCPlayerCamera = {}; + +--[[ +function UGCPlayerCamera:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +--[[ +function UGCPlayerCamera:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function UGCPlayerCamera:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function UGCPlayerCamera:GetReplicatedProperties() + return +end +--]] + +--[[ +function UGCPlayerCamera:GetAvailableServerRPCs() + return +end +--]] + +return UGCPlayerCamera; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/UGCPlayerStart.lua b/GZJ/Script/Blueprint/UGCPlayerStart.lua new file mode 100644 index 00000000..d692b33c --- /dev/null +++ b/GZJ/Script/Blueprint/UGCPlayerStart.lua @@ -0,0 +1,45 @@ +---@class UGCPlayerStart_C:BP_STPlayerStart_C +---@field PlayerStartID int32 +---@field Type TEnumAsByte +--Edit Below-- +local UGCPlayerStart = {}; + +function UGCPlayerStart:GetPlayerStartID() + return self.PlayerStartID +end + +--[[ +function UGCPlayerStart:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end +--]] + +function UGCPlayerStart:GetType() + return self.Type +end + +--[[ +function UGCPlayerStart:ReceiveTick(DeltaTime) + self.SuperClass.ReceiveTick(self, DeltaTime); +end +--]] + +--[[ +function UGCPlayerStart:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +--[[ +function UGCPlayerStart:GetReplicatedProperties() + return +end +--]] + +--[[ +function UGCPlayerStart:GetAvailableServerRPCs() + return +end +--]] + +return UGCPlayerStart; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/UGCPlayerStartManager.lua b/GZJ/Script/Blueprint/UGCPlayerStartManager.lua new file mode 100644 index 00000000..746d6647 --- /dev/null +++ b/GZJ/Script/Blueprint/UGCPlayerStartManager.lua @@ -0,0 +1,97 @@ +local UGCPlayerStartManager = {}; + +function UGCPlayerStartManager:GetUGCModePlayerStart(Controller) + if UGCGameSystem.GameState:HasAuthority() == false then + return nil + end + + local PlayerState = Controller.PlayerState + + if PlayerState == nil then + UE.LogError( "[UGCPlayerStartManager][GetUGCModePlayerStart] Error: PlayerState is nil!") + return nil + end + + local AllPlayerStarts = UGCGameSystem.GameState:GetAllPlayerStarts() + local GameStage = UGCGameSystem.GameState.GameStage + + local SelectedPlayerStart = nil + if GameStage <= EGameStage.GameReady then + local InArenaPlayerStart = AllPlayerStarts[ETeleportType.InArena] + local FoundedPlayerStart = nil + for _, PlayerStart in pairs(InArenaPlayerStart) do + if not PlayerStart:IsMarkOccupied() then + FoundedPlayerStart = PlayerStart + break + end + end + if FoundedPlayerStart ~= nil and UE.IsValid(FoundedPlayerStart) then + FoundedPlayerStart:SetMarkOccupied() + + Controller.InitialPlayerStart = FoundedPlayerStart + + local InHangUpRoomPlayerStart = AllPlayerStarts[ETeleportType.InHangupRoom] + for _, PlayerStart in pairs(InHangUpRoomPlayerStart) do + if PlayerStart.PlayerStartID == FoundedPlayerStart.PlayerStartID then + Controller.HangUpRoomPlayerStart = PlayerStart + break + end + end + + --将玩家和刷怪器绑定 + self:BindSpawnerPlayerKey(FoundedPlayerStart, Controller.PlayerKey) + + --将玩家和传送点绑定 + self:BindTeleporterPlayerKey(FoundedPlayerStart, Controller.PlayerKey) + + SelectedPlayerStart = FoundedPlayerStart + + UE.Log("[UGCPlayerStartManager][GetUGCModePlayerStart] Initial: SelectedPlayerStart[%s] BornID[%d] PlayerID[%s]", + KismetSystemLibrary.GetObjectName(SelectedPlayerStart), SelectedPlayerStart.PlayerBornPointID, Controller.PlayerKey) + end + else + if Controller.IsDeadInArena then + SelectedPlayerStart = Controller.InitialPlayerStart + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(Controller.PlayerKey) + PlayerPawn.IsInArena = true + else + SelectedPlayerStart = Controller.HangUpRoomPlayerStart + local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(Controller.PlayerKey) + PlayerPawn.IsInArena = false + end + + UE.Log("[UGCPlayerStartManager][GetUGCModePlayerStart] IsDeadInArena[%s] SelectedPlayerStart[%s] BornID[%d] PlayerID[%s]", + tostring(Controller.IsDeadInArena), KismetSystemLibrary.GetObjectName(SelectedPlayerStart), SelectedPlayerStart.PlayerBornPointID, Controller.PlayerKey) + end + + return SelectedPlayerStart +end + +function UGCPlayerStartManager:BindSpawnerPlayerKey(SelectedPlayerStart, InPlayerKey) + local MonsterSpawnerClass = UE.LoadClass(BPClassPath.MonsterSpawner) + if UE.IsValid(MonsterSpawnerClass) then + local PlayerStartID = SelectedPlayerStart:GetPlayerStartID() + local FoundedSpawners = totable(GameplayStatics.GetAllActorsOfClass(self, MonsterSpawnerClass, {})) + for _, Spawner in pairs(FoundedSpawners) do + if PlayerStartID == Spawner:GetSpawnerID() then + Spawner:BindPlayerKey(InPlayerKey) + break + end + end + end +end + +function UGCPlayerStartManager:BindTeleporterPlayerKey(SelectedPlayerStart, InPlayerKey) + local TeleporterClass = UE.LoadClass(BPClassPath.Teleporter) + if UE.IsValid(TeleporterClass) then + local PlayerStartID = SelectedPlayerStart:GetPlayerStartID() + local FoundedTeleporters = totable(GameplayStatics.GetAllActorsOfClass(self, TeleporterClass, {})) + for _, Teleporter in pairs(FoundedTeleporters) do + if PlayerStartID == Teleporter:GetTeleporterID() then + Teleporter:SetBindPlayerKey(InPlayerKey) + end + end + end +end + +return UGCPlayerStartManager; \ No newline at end of file diff --git a/GZJ/Script/Blueprint/Weapon/BP_WeaponPawnBase.lua b/GZJ/Script/Blueprint/Weapon/BP_WeaponPawnBase.lua new file mode 100644 index 00000000..4903edf1 --- /dev/null +++ b/GZJ/Script/Blueprint/Weapon/BP_WeaponPawnBase.lua @@ -0,0 +1,831 @@ +---@class BP_WeaponPawnBase_C:APawn +---@field Sphere USphereComponent +---@field DefaultRoot USceneComponent +---@field StaticMesh1 UStaticMeshComponent +---@field StaticMesh4 UStaticMeshComponent +---@field StaticMesh3 UStaticMeshComponent +---@field StaticMesh2 UStaticMeshComponent +---@field MuzzleParticle UParticleSystem +--Edit Below-- +local BP_WeaponPawnBase = { + Activated = false, + HasBegunPlay = false, + + InRangeMonsters = {}, -- 检测区域中的 Monster + TargetMonster = nil, -- 目标 Monster + MarkPendingInitialized = false, + + Weapons = {}, --所有的武器 数组类型 + + CurrentWeaponId = 0, -- 这个是 武器表中的 Id + OwnerCharacter = nil, + OwningPlayerState = nil, -- 拥有的PlayerState + OwningPlayerController = nil, -- 拥有的 PlayerController + DefaultShootCountPerSecond = 1, -- 默认每秒射击次数 + + TimeTemp = 0, -- 射击的定时器 + DefaultSphereRadius = 1200, -- 默认球体半径 + + TempSphereRadius = 0, + IsPlayerInArena = false; -- 玩家是否在场内,因为玩家默认不在场内 + -- Client + IsAttackNearestMonster = true; -- 是否攻击离得最近的怪物 +}; + +BP_WeaponPawnBase.OnFireDelegate = Delegate.New() + +--设置同步的属性 +function BP_WeaponPawnBase:GetReplicatedProperties() + return + "Activated", + "OwnerCharacter", + "TargetMonster", + "CurrentWeaponId" +end + +function BP_WeaponPawnBase:ReceiveBeginPlay() + BP_WeaponPawnBase.SuperClass.ReceiveBeginPlay(self) + + self.MainMesh = self.StaticMesh1 + self.PartStaticMeshes = { self.StaticMesh2, self.StaticMesh3, self.StaticMesh4 } + self.MonsterBaseClass = UE.LoadClass(BPClassPath.MonsterBase) + + self.InRangeMonsters = {} + self.HasBegunPlay = true + + if self:HasAuthority() then + self:LoadPlayerState() + self:LoadPlayerController() + --self:SetFireTimer() + self.OnFireDelegate:Add(BP_WeaponPawnBase.MulticastPlayMuzzleEffectAndSound, self) + else + self.Sphere.OnComponentBeginOverlap:Add(BP_WeaponPawnBase.Sphere_OnComponentBeginOverlap, self) + self.Sphere.OnComponentEndOverlap:Add(BP_WeaponPawnBase.Sphere_OnComponentEndOverlap, self) + + EventSystem:AddListener(EventType.AsyncLoadWeaponMeshesCompleted, BP_WeaponPawnBase.OnPreLoadAccessable, self) + EventSystem:AddListener(EventType.AttackRangeChanged, BP_WeaponPawnBase.SetSphereSizeRadius, self) + + self:OnCreateWeapons() + end +end + +function BP_WeaponPawnBase:ReceiveEndPlay() + self.HasBegunPlay = false + self.MainMesh = nil + self.PartStaticMeshes = nil + self.MonsterBaseClass = nil + self.InRangeMonsters = nil + + if self:HasAuthority() then + self:ClearFireTimer() + self.OnFireDelegate:Remove(BP_WeaponPawnBase.MulticastPlayMuzzleEffectAndSound, self) + else + self.Sphere.OnComponentBeginOverlap:Remove(BP_WeaponPawnBase.Sphere_OnComponentBeginOverlap, self) + self.Sphere.OnComponentEndOverlap:Remove(BP_WeaponPawnBase.Sphere_OnComponentEndOverlap, self) + EventSystem:RemoveListener(EventType.AsyncLoadWeaponMeshesCompleted, BP_WeaponPawnBase.OnPreLoadAccessable, self) + EventSystem:RemoveListener(EventType.AttackRangeChanged, BP_WeaponPawnBase.SetSphereSizeRadius, self) + end + + BP_WeaponPawnBase.SuperClass.ReceiveEndPlay(self) +end + +function BP_WeaponPawnBase:ReceiveTick(DeltaTime) + BP_WeaponPawnBase.SuperClass.ReceiveTick(self, DeltaTime) + if not self.HasBegunPlay then + return + end + + if self:HasAuthority() then + -- 获取次数 + if self.OwnerCharacter == nil or not UE.IsValid(self.OwnerCharacter) then + return + end + if self.OwnerCharacter:IsSelfAlive() then + self:TickFire(DeltaTime) + end + else + if self.MarkPendingInitialized then + self:ChangeWeaponId(self.CurrentWeaponId) + end + + -- 每帧获取对应位置和旋转 + if UE.IsValid(self.OwnerCharacter) then + self:UpdateTargetMonster() + if UE.IsValid(self.TargetMonster) then + local SocketPos = VectorHelper.Add(self.OwnerCharacter:K2_GetActorLocation(), { X = 0, Y = 0, Z = 110 }) + local MonsterPos = VectorHelper.Add(self.TargetMonster:K2_GetActorLocation(), { X = 0, Y = 0, Z = 80 }) + self.StaticMesh1:K2_SetWorldRotation(KismetMathLibrary.FindLookAtRotation(SocketPos, MonsterPos), false) + else + self.StaticMesh1:K2_SetWorldRotation(self.OwnerCharacter:K2_GetActorRotation(), false) + end + end + + self.TimeTemp = self.TimeTemp + DeltaTime + if self.TimeTemp > 1 then + -- print(string.format('[BP_WeaponPawnBase:ReceiveTick] 开始打印怪物名称')) + if #self.InRangeMonsters > 0 then + for i, v in pairs(self.InRangeMonsters) do + -- print(string.format('[BP_WeaponPawnBase:ReceiveTick] MonsterName = %s', KismetSystemLibrary.GetObjectName(v))) + end + end + -- print(string.format('[BP_WeaponPawnBase:ReceiveTick] 结束打印, Target Monster Name = %s', KismetSystemLibrary.GetObjectName(self.TargetMonster))) + self.TimeTemp = self.TimeTemp - 1 + end + end +end + +function BP_WeaponPawnBase:OnCreateWeapons() + if not self.OwnerCharacter then + return + end + -- 先关闭 + local ObjectTypes = {} + local ActorClassFilter = UE.LoadClass(BPClassPath.MonsterBase) + local ActorsToIgnore = { } + local SphereLoc = self.OwnerCharacter:K2_GetActorLocation() + local Radius = self.Sphere.SphereRadius + local OutArrs = {} + local RetVal, OutActors = KismetSystemLibrary.SphereOverlapActors(self.OwnerCharacter, SphereLoc, Radius, ObjectTypes, ActorClassFilter, ActorsToIgnore, OutArrs) + --STExtraGameplayStatics.ClientDrawDebugSphere(SphereLoc, Radius, 6, {R = 1, G = 0, B = 0, A = 1}, 10, 1) + --print(string.format('[BP_WeaponPawnBase:OnCreateWeapons] OutArrs Len = %d', #OutArrs)) + + if RetVal then + --print(string.format('[BP_WeaponPawnBase:OnCreateWeapons] 进来了是进来了,有多少值呢:%d, Radius = %d', table.getCount(OutActors), Radius)) + if table.getCount(OutActors) > 0 then + for i = 1, #OutActors do + table.insert(self.InRangeMonsters, OutActors[i]) + end + self:UpdateTargetMonster() + end + else + print(string.format('[BP_WeaponPawnBase:OnCreateWeapons] 没有用呀~~')) + end + + -- 先关闭 + --self.TempSphereRadius = self.Sphere.SphereRadius + --self.Sphere:SetActive(false, true) + ----self.Sphere:SetSphereRadius(5) + --EventSystem.SetTimer(self, function() + -- --self.Sphere:SetSphereRadius(self.TempSphereRadius, true) + -- self.Sphere:SetActive(true, true) + --end, 0.2) +end + +function BP_WeaponPawnBase:PlayerInArena(IsInArena) + -- print(string.format('[BP_WeaponPawnBase:PlayerInArena] '.. tostring(IsInArena))) + self.IsPlayerInArena = IsInArena +end + +function BP_WeaponPawnBase:TickFire(DeltaTime) + local ShootTime = self:GetShootTime() + self.TimeTemp = self.TimeTemp + DeltaTime + if self.TimeTemp > ShootTime then + -- print(string.format("[BP_WeaponPawnBase:TickFire] 隔 %f 秒进行第二次射击", ShootTime)) + self.TimeTemp = self.TimeTemp - ShootTime + self:Fire() + end +end + +function BP_WeaponPawnBase:LoadPlayerController() + if self.OwnerCharacter ~= nil then + self.OwningPlayerController = self.OwnerCharacter:GetPlayerControllerSafety() + end +end + +function BP_WeaponPawnBase:LoadPlayerState() + if self.OwningPlayerState == nil then + if self.OwnerCharacter ~= nil then + self.OwningPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.OwnerCharacter.PlayerKey) + end + end +end + +function BP_WeaponPawnBase:Fire() + print(string.format("[BP_WeaponPawnBase:Fire] 开始开火")) + if not self.Activated then + return + end + + if UE.IsValid(self.TargetMonster) == false then + return + end + + if UE.IsValid(self.OwnerCharacter) == false then + return + end + + if not self.TargetMonster:IsAlive() then + return + end + + self:LoadPlayerState() + if self.OwningPlayerController == nil then + self:LoadPlayerController() + end + if self.OwningPlayerController == nil then + print(string.format("[BP_WeaponPawnBase:Fire] 玩家控制器设置出错,请检查")) + return + end + + -- 造成的伤害 + local Damage = self.OwningPlayerState:MakeDamage(self.TargetMonster) + self.OnFireDelegate(self, Damage) + local RealDamage = UGCGameSystem.ApplyDamage(self.TargetMonster, Damage, self.OwningPlayerController, self.OwnerCharacter, EDamageType.ShootDamage) + -- 在这进行判断 + if self.TargetMonster then + GameDataManager.GetMonsterTypeByID(self.TargetMonster.ID) + end + --调用PlayerState 射击生命值 和 射击威力值 + self.OwningPlayerState:OnShot() + UE.Log("[BP_WeaponPawnBase:Fire] RealDamage = %f, Player Key = %d", RealDamage, self.OwnerCharacter.PlayerKey) +end + +function BP_WeaponPawnBase:MulticastPlayMuzzleEffectAndSound() + local SoundConfigId = Tables.WeaponSoundConfig[self.CurrentWeaponId] + if SoundConfigId then + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(self, "Client_MulticastRPC_PlayMuzzleEffectAndSound", SoundConfigId) + end +end + +-- Client +function BP_WeaponPawnBase:ChangeWeaponId(ID) + if not self.HasBegunPlay then + UE.LogError("[BP_WeaponPawnBase:ChangeWeaponId] Has not BegunPlay, Mark Pending Initialized") + self.MarkPendingInitialized = true + return + end + + self.MarkPendingInitialized = false + + if ID <= 0 then + self.MainMesh:SetHiddenInGame(true, false) + for _, StaticMeshComp in pairs(self.PartStaticMeshes) do + StaticMeshComp:SetHiddenInGame(true, false) + end + return + end + + local RowData = GameDataManager.GetWeaponConstructDataByID(ID) + local MeshInfo = GameDataManager.GetWeaponMeshInfo(ID) + if RowData == nil or MeshInfo == nil then + self.MainMesh:SetHiddenInGame(true, false) + for _, PartMesh in pairs(self.PartStaticMeshes) do + PartMesh:SetHiddenInGame(true, false) + end + UE.Log("[BP_WeaponPawnBase:ChangeWeaponId] RowData or MeshInfo is nil") + return + end + + local MainStaticMesh = MeshInfo.MainMesh + local PartStaticMeshes = MeshInfo.PartMeshes + + if MainStaticMesh then + self.MainMesh:SetStaticMesh(MainStaticMesh) + end + + for i, PartMesh in pairs(self.PartStaticMeshes) do + local PartStaticMesh = PartStaticMeshes[i] + if PartStaticMesh then + local SocketName = PartStaticMesh.SocketName + local Mesh = PartStaticMesh.PartMesh + + PartMesh:SetHiddenInGame(false, false) + PartMesh:SetStaticMesh(Mesh) + PartMesh:K2_AttachTo(self.MainMesh, SocketName, EAttachLocation.SnapToTarget, false) + else + PartMesh:SetHiddenInGame(true, false) + end + end + + local Trans = MeshInfo.RelativeTransform + self.MainMesh:K2_SetRelativeTransform(Trans, false, nil, false) +end + +function BP_WeaponPawnBase:OnRep_Activated() + ---TODO +end + +function BP_WeaponPawnBase:OnRep_OwnerCharacter() + -- UE.Log("[BP_WeaponPawnBase:OnRep_OwnerCharacter]") + if self.OwnerCharacter then + -- 武器绑定到人物头上 + self:K2_AttachToComponent(self.OwnerCharacter.WeaponActorSocket, "", EAttachmentRule.SnapToTarget, EAttachmentRule.KeepRelative, EAttachmentRule.SnapToTarget, true) + end +end + +---Server +function BP_WeaponPawnBase:SetWeaponID(ID) + print(string.format("[BP_WeaponPawnBase:SetWeaponID] 设置 Weapon Id = %d", ID)) + self.CurrentWeaponId = ID + self.Activated = ID > 0 +end + +---S +function BP_WeaponPawnBase:SetOwnerCharacter(InCharacter) + if InCharacter == nil then + return + end + self.OwnerCharacter = InCharacter + self:SetOwner(InCharacter) +end + +function BP_WeaponPawnBase:SetFireTimer() + if self.OwningPlayerState == nil then + self.OwningPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + end + + KismetSystemLibrary.K2_ClearTimerHandle(self, self.TimerHandle) + if self.FireTimerDelegate then + ObjectExtend.DestroyDelegate(self.FireTimerDelegate) + end + self.FireTimerDelegate = ObjectExtend.CreateDelegate(self, + function() + + if self.Activated and UE.IsValid(self.TargetMonster) and UE.IsValid(self.OwnerCharacter) and self.TargetMonster:IsAlive() then + local PC = self.OwnerCharacter:GetPlayerControllerSafety() + if PC then + -- 造成的伤害 + local Damage = self.OwningPlayerState:MakeDamage(self.TargetMonster) + local RealDamage = UGCGameSystem.ApplyDamage(self.TargetMonster, Damage, PC, self.OwnerCharacter, EDamageType.ShootDamage) + -- 在这进行判断 + if self.TargetMonster then + GameDataManager.GetMonsterTypeByID(self.TargetMonster.ID) + end + UE.Log("[BP_WeaponPawnBase:FireTimerDelegate] RealDamage = %f", RealDamage) + end + end + end) + + -- 获取一下默认属性 + self:RefreshShootSpeed() +end + +function BP_WeaponPawnBase:RefreshShootSpeed() + local bIsActive = KismetSystemLibrary.K2_IsTimerActiveDelegate(self.TimerHandle) + if bIsActive then + KismetSystemLibrary.K2_ClearTimerDelegate(self.TimerHandle) + end + if self.OwningPlayerState == nil then + self.OwningPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + end + + local ShootRate = self.OwningPlayerState:ShootTimeEverSecond() + --这个 0.5 是一个基础射击数值 + local TimeDelta = 0.5 / ShootRate + self.TimerHandle = KismetSystemLibrary.K2_SetTimerDelegateForLua(self.FireTimerDelegate, self, TimeDelta, true) +end + +-- server 获取射击间隔(s) +function BP_WeaponPawnBase:GetShootTime() + if self.OwningPlayerState == nil or self.OwnerCharacter == nil then + -- 默认情况下攻速 + return 1 / 1.30 + end + local ShootRate = self.OwningPlayerState:ShootTimeEverSecond() + --print(string.format("[BP_WeaponPawnBase:GetShootTime] Shoot Rate = %f", ShootRate)) + return 1 / ShootRate +end + +function BP_WeaponPawnBase:ClearFireTimer() + KismetSystemLibrary.K2_ClearTimerHandle(self, self.TimerHandle) + ObjectExtend.DestroyDelegate(self.FireTimerDelegate) +end + +function BP_WeaponPawnBase:GetWeaponTypeByWeaponId(InWeaponId) + return GameDataManager.GetWeaponType(InWeaponId) +end + +---C +function BP_WeaponPawnBase:OnPreLoadAccessable() + self:OnRep_OwnerCharacter() +end + +function BP_WeaponPawnBase:Sphere_OnComponentBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) + if UE.IsValid(OtherActor) and UE.IsA(OtherActor, self.MonsterBaseClass) then + self:UpdateMonsterInRange(OtherActor, true) + end +end + +function BP_WeaponPawnBase:Sphere_OnComponentEndOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex) + if UE.IsValid(OtherActor) and UE.IsA(OtherActor, self.MonsterBaseClass) then + self:UpdateMonsterInRange(OtherActor, false) + end +end + +function BP_WeaponPawnBase:UpdateMonsterInRange(InMonster, IsAdd) + if not self.OwnerCharacter then + return + end + if IsAdd and InMonster:IsAlive() then + InMonster.OnDeath:Add(self.OnOverlappedMonsterDeath, self) + table.insert(self.InRangeMonsters, InMonster) + else + InMonster.OnDeath:Remove(self.OnOverlappedMonsterDeath, self) + table.removeValue(self.InRangeMonsters, InMonster) + end + self:UpdateTargetMonster() +end + +function BP_WeaponPawnBase:UpdateTargetMonster() + if (not UE.IsValid(self.OwnerCharacter)) or (not self.Sphere) then + return + end + + local MinDist = self.Sphere:GetScaledSphereRadius() + local PawnLocation = self.OwnerCharacter:K2_GetActorLocation() + local CurTarget = nil + + local Func = function(InMinDist, InMonster, InPawnLoc, InCurr) + if UE.IsValid(InMonster) and InMonster:IsAlive() then + local MonsterLocation = InMonster:K2_GetActorLocation() + local Dist = VectorHelper.GetDistance(InPawnLoc, MonsterLocation) + if Dist < InMinDist then + InMinDist = Dist + InCurr = InMonster + end + end + return InCurr, InMinDist + end + + -- 选择最近的怪物 + if self.IsAttackNearestMonster then + for _, Monster in pairs(self.InRangeMonsters) do + if UE.IsValid(Monster) then + local IsInArenaMonster = Monster:GetMonsterType() == EMonsterType.Boss or Monster:GetMonsterType() == EMonsterType.Common + if self.IsPlayerInArena then + if IsInArenaMonster then + CurTarget, MinDist = Func(MinDist, Monster, PawnLocation, CurTarget) + end + else + CurTarget, MinDist = Func(MinDist, Monster, PawnLocation, CurTarget) + end + end + end + else + -- 按照权重进行设置,找到 BOSS + local NiuBiGuai = {} + for _, Monster in pairs(self.InRangeMonsters) do + if UE.IsValid(Monster) and Monster:IsAlive() then + local MonsterType = Tables.MonsterBaseConfig[Monster.ID].Type + if MonsterType == EMonsterType.Default or MonsterType == EMonsterType.Common or MonsterType == EMonsterType.HangupRoom then + else + table.insert(NiuBiGuai, Monster) + end + end + end + + if table.getCount(NiuBiGuai) > 0 then + for _, Monster in pairs(NiuBiGuai) do + CurTarget, MinDist = Func(MinDist, Monster, PawnLocation, CurTarget) + end + end + + if CurTarget == nil then + for _, Monster in pairs(self.InRangeMonsters) do + CurTarget, MinDist = Func(MinDist, Monster, PawnLocation, CurTarget) + end + end + end + + if CurTarget ~= self.TargetMonster then + self.TargetMonster = CurTarget + -- print(string.format('[BP_WeaponPawnBase:UpdateTargetMonster] 设置Target Monster = %s', KismetSystemLibrary.GetObjectName(CurTarget))) + UnrealNetwork.CallUnrealRPC(self, self, "ServerRPC_SetTargetMonster", CurTarget) + end +end + +function BP_WeaponPawnBase:ServerRPC_SetTargetMonster(InMonster) + -- print(string.format('[BP_WeaponPawnBase:ServerRPC_SetTargetMonster] 服务端设置 TargetMonster:%s', KismetSystemLibrary.GetObjectName(InMonster))) + if UE.IsValid(InMonster) and InMonster:IsAlive() then + self.TargetMonster = InMonster + else + self.TargetMonster = nil + end +end + +function BP_WeaponPawnBase:GetAvailableServerRPCs() + return + -- "Client_MulticastRPC_PlayMuzzleEffectAndSound" + "ServerRPC_SetTargetMonster" +end + +function BP_WeaponPawnBase:OnOverlappedMonsterDeath(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + if DeadMonster and UE.IsA(DeadMonster, self.MonsterBaseClass) then + self:UpdateMonsterInRange(DeadMonster, false) + end +end + +function BP_WeaponPawnBase:GetPlayerState() + if UGCGameSystem.IsServer() then + local PlayerKey = self.OwnerCharacter.PlayerKey + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + return PlayerState + else + local PlayerState = GameDataManager.GetLocalPlayerState() + return PlayerState + end +end + +function BP_WeaponPawnBase:FindWeaponById(InWeaponId) + -- 找到 PS + return self:GetPlayerState():FindWeaponById(InWeaponId) +end + +function BP_WeaponPawnBase:GetWeaponByFittingItemId(InFittingItemId) + local WeaponType = GetItemWeaponTypeByItemId(InFittingItemId) + for i = 1, #self.Weapons do + local Weapon = self.Weapons[i] + if Weapon.Type == WeaponType then + return Weapon + end + end + return nil +end + +-- 查找配件的武器是否存在 +function BP_WeaponPawnBase:FindWeaponExist(InFittingItemId) + local WeaponType = GetItemWeaponTypeByItemId(InFittingItemId) + return self:FindWeaponByWeaponType(WeaponType) +end + +function BP_WeaponPawnBase:FindWeaponByWeaponType(InWeaponType) + for i = 1, #self.Weapons do + if self.Weapons[i].Type == InWeaponType then + return self.Weapons[i] + end + end + return nil +end + +--Server 获取当前武器的属性,这是一个表:{ { Type = "", Value = 0 },{ Type = "", Value = 0 } } +function BP_WeaponPawnBase:GetOutProps() + -- 需要获取手枪属性 + local OutTable = {} + local TheTable = DropItemMap.WeaponTable[EWeaponClassType.WT_Pistol].Props + OutTable = TableHelper.DeepCopyTable(TheTable) + if self.CurrentWeaponId == 0 then + -- 说明当前是手枪,不进行处理 + return self:MergeOutTable(OutTable) + end + print(string.format("[BP_WeaponPawnBase:GetOutProps] 当前武器 Id = %d", self.CurrentWeaponId)) + -- NativeProps + local Weapon = self:FindWeaponById(self.CurrentWeaponId) + local SpecialItems = {} + --print(string.format("[BP_WeaponPawnBase:GetOutProps] 开始打印武器高级属性,数量为:%d", table.getCount(Weapon.NativeProps.Plus))) + + -- 高级属性 + for i = 1, table.getCount(Weapon.NativeProps.Plus) do + local Val = Weapon.NativeProps.Plus[i] + --print(string.format("[BP_WeaponPawnBase:GetOutProps] MainType: %s,类型是:%s", tostring(Val.MainType), type(Val.MainType))) + local Name = Tables.WeaponPropertyConfig[Val.MainType].PropName + local ItemData = { + Type = Name, + Value = Val.Value + } + --print(string.format("[BP_WeaponPawnBase:GetOutProps] 武器高级属性:Name:%s, Value: %s", Name, tostring(Val.Value))) + table.insert(OutTable, ItemData) + end + + -- 添加 Properties + local Properties = Weapon.Properties + --print(string.format("[BP_WeaponPawnBase:GetOutProps] 开始打印武器属性,数量:%d", table.getCount(Properties))) + for i = 1, #Properties do + local Prop = Properties[i] + local ItemData = { + Type = Tables.WeaponPropertyConfig[Prop.MainType].PropName, + Value = Prop.Value + } + --print(string.format("[BP_WeaponPawnBase:GetOutProps] 武器属性:Name: %s, Value: %s", ItemData.Type, tostring(Prop.Value))) + table.insert(OutTable, ItemData) + end + + -- 处理武器自带属性 + local FittingLevel = Weapon.FittingLevel + if FittingLevel > 0 then + local Val = DropItemMap.WeaponTable[Weapon.Type].PlusProps[FittingLevel] + local ItemData = { + Type = Val.Type, + Value = Val.Value + } + table.insert(OutTable, ItemData) + end + + -- FittingItems + local FittingList = Weapon.Fittings + for i = 1, #FittingList do + local FittingItemId = FittingList[i] + local FittingProps = DropItemMap.FittingItemMap[FittingItemId].Props + for j = 1, #FittingProps do + if FittingProps[j].Unit ~= 'Special' then + local ItemData = { + Type = FittingProps[j].Type, + Value = FittingProps[j].Value + } + table.insert(OutTable, ItemData) + else + local ItemData = { + ItemId = FittingItemId, + } + table.insert(SpecialItems, ItemData) + end + end + end + + -- OutTable 是不包含特殊词条属性的,SpecialItems 里面是词条属性 + return self:MergeOutTable(OutTable), SpecialItems +end + +-- Server 设置当前的武器,当点击页面上的武器的时候执行这个 +function BP_WeaponPawnBase:SetCurrentWeapon(InId) + -- 重复点击无效 + if InId == self.CurrentWeaponId then + print(string.format("[BP_WeaponPawnBase:SetCurrentWeapon] 当前选择的Id与原先的Id相同")) + return + end + if self:FindWeaponById(InId) == nil then + print(string.format("[BP_WeaponPawnBase:SetCurrentWeapon] 无法找到对应Id")) + return + end + + self.CurrentWeaponId = InId + -- 通知进行改变 + print(string.format("[BP_WeaponPawnBase:SetCurrentWeapon] WeaponId = %d", self.CurrentWeaponId)) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.OwnerCharacter.PlayerKey) + PlayerState:OnWeaponAttributeChanged(self.CurrentWeaponId) +end + +-- 每操作一下就执行该方法进行检测 FittingLevel,然后刷新全部属性 +function BP_WeaponPawnBase:GetWeaponFittingLevel(InWeaponId) + if not self:FindWeaponExist(InWeaponId) then + print(string.format('[BP_WeaponPawnBase:GetWeaponFittingLevel] 找不到对应武器,请检查')) + return -1 + end + print(string.format('[BP_WeaponPawnBase:GetWeaponFittingLevel] 找到了对应武器,数量是: %d', InWeaponId)) + return self:FindWeaponById(InWeaponId).FittingLevel +end + +function BP_WeaponPawnBase:OnRep_CurrentWeaponId() + if self.OwnerCharacter == nil or UE.IsValid(self.OwnerCharacter) == false then + return + end + + EventSystem:SendEvent(EventType.ClientUpdateWeapon, self.CurrentWeaponId, self.OwnerCharacter.PlayerKey) + + if self.CurrentWeaponId > 0 then + self:ChangeWeaponId(self.CurrentWeaponId) + end +end + +function BP_WeaponPawnBase:GetWeaponFittingsById(InItemId) + print(string.format("[BP_WeaponPawnBase:GetWeaponFittingsById] 开始输入Ids")) + if self:FindWeaponById(InItemId) == nil then + for i, v in pairs(self.Weapons) do + print(i) + end + end + print(string.format("[BP_WeaponPawnBase:GetWeaponFittingsById] 结束输入Ids")) + return self:FindWeaponById(InItemId).Fittings +end + +function BP_WeaponPawnBase:GetWeaponCount() + return #self:GetWeapons() +end + +function BP_WeaponPawnBase:FindWeaponIndexById(InWeaponId) + local PSWeapons = self:GetWeapons() + for i = 1, #PSWeapons do + if PSWeapons[i].WeaponId == InWeaponId then + return i + end + end + return -1 +end + +function BP_WeaponPawnBase:GetWeapons() + return self:GetPlayerState().OwnerWeapons +end + +function BP_WeaponPawnBase:FindWeaponIdByIndex(InIndex) + if InIndex <= 0 or InIndex > self:GetWeaponCount() then + return + end + return self:GetWeapons()[InIndex].WeaponId +end + +function BP_WeaponPawnBase:GetCurrentWeaponIndex() + return self:FindWeaponIndexById(self.CurrentWeaponId) +end + +-- SC +function BP_WeaponPawnBase:SetSphereSizeRadius(InAddNum) + self.Sphere:SetSphereRadius(self.DefaultSphereRadius + InAddNum, true) +end + +--获取武器基础属性 +function BP_WeaponPawnBase:GetWeaponBaseAttribute() + local OutTable = {} + local TheTable = DropItemMap.WeaponTable[EWeaponClassType.WT_Pistol].Props + OutTable = TableHelper.DeepCopyTable(TheTable) + if self.CurrentWeaponId == 0 then + -- 说明当前是手枪,不进行处理 + return self:MergeOutTable(OutTable) + end + + local Weapon = self:FindWeaponById(self.CurrentWeaponId) + --武器基础属性 + local FittingLevel = Weapon.FittingLevel + if FittingLevel > 0 then + local Val = DropItemMap.WeaponTable[Weapon.Type].PlusProps[FittingLevel] + local ItemData = { + Type = Val.Type, + Value = Val.Value + } + table.insert(OutTable, ItemData) + end + + -- FittingItems + local FittingList = Weapon.Fittings + for i = 1, #FittingList do + local FittingItemId = FittingList[i] + local FittingProps = DropItemMap.FittingItemMap[FittingItemId].Props + for j = 1, #FittingProps do + if FittingProps[j].Unit ~= 'Special' then + local ItemData = { + Type = FittingProps[j].Type, + Value = FittingProps[j].Value + } + table.insert(OutTable, ItemData) + end + end + end + + return self:MergeOutTable(OutTable) +end + +--获取武器高级属性 +function BP_WeaponPawnBase:GetWeaponSeniorAttribute() + local OutTable = {} + if self.CurrentWeaponId == 0 then + return {} + end + + local Weapon = self:FindWeaponById(self.CurrentWeaponId) + + local Properties = Weapon.Properties + for i = 1, #Properties do + local Prop = Properties[i] + local ItemData = { + Type = Tables.WeaponPropertyConfig[Prop.MainType].PropName, + Value = Prop.Value + } + table.insert(OutTable, ItemData) + end + + for i = 1, table.getCount(Weapon.NativeProps.Plus) do + local Val = Weapon.NativeProps.Plus[i] + local Name = Tables.WeaponPropertyConfig[Val.MainType].PropName + local ItemData = { + Type = Name, + Value = Val.Value + } + table.insert(OutTable, ItemData) + end + return self:MergeOutTable(OutTable) +end + +-- 叠加属性 +function BP_WeaponPawnBase:MergeOutTable(InOutTable) + local Items = {} + for i = 1, table.getCount(InOutTable) do + local Name = InOutTable[i].Type + local Value = InOutTable[i].Value + if Items[Name] == nil then + Items[Name] = Value + else + Items[Name] = Items[Name] + Value + end + end + local OutTable = {} + for i, v in pairs(Items) do + if string.len(i) < 10 then + local ItemData = { + Type = i, + Value = v + } + table.insert(OutTable, ItemData) + end + end + return OutTable +end + +function BP_WeaponPawnBase:Client_MulticastRPC_PlayMuzzleEffectAndSound(SoundConfigId) + if self.OwnerCharacter then + SoundManager.PlaySoundAtLocation(SoundConfigId, self.OwnerCharacter:K2_GetActorLocation(), self.OwnerCharacter:K2_GetActorRotation()) + end + + if self.MuzzleParticle and self.MainMesh then + GameplayStatics.SpawnEmitterAttached(self.MuzzleParticle, self.MainMesh, "MuzzleEffect", VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.Scale(0.5), EAttachLocation.SnapToTarget, true) + end +end + +return BP_WeaponPawnBase; \ No newline at end of file diff --git a/GZJ/Script/Common/ue_enum_custom.lua b/GZJ/Script/Common/ue_enum_custom.lua new file mode 100644 index 00000000..89e5443e --- /dev/null +++ b/GZJ/Script/Common/ue_enum_custom.lua @@ -0,0 +1,341 @@ +-- auto exported UENUM while compiling + +-- sorted by enum name asc + +---@enum EAttributeDisplayType +EAttributeDisplayType = { + Int = 0, + Percent = 1, +}; + + +---@enum EBagOperateType +EBagOperateType = { + None = 0, + Generate = 1, + Drop = 2, + Sell = 3, + Reset = 4, +}; + + +---@enum ECustomNoticeType +ECustomNoticeType = { + AttackWaveNotice = 0, + AttackWaveRemainTimeNotice = 1, + GeneralNotice = 2, + RespawnNotice = 3, + InitialNotice = 4, + CountDownNotice = 5, + GlobalWarningNotice = 6, + RollingNotice = 7, +}; + + +---@enum EDropItemSet +EDropItemSet = { + WeaponParts = 0, + SkillBooks = 1, + Stones = 2, +}; + + +---@enum EEffectSpawnLocationType +EEffectSpawnLocationType = { + Bottom = 0, + Middle = 1, + Top = 2, + Attach = 3, +}; + + +---@enum EGameFightStage +EGameFightStage = { + WaveBegin = 0, + WaveStop = 1, +}; + + +---@enum EGameReadyStage +EGameReadyStage = { + SelectGameDifficulty = 0, + SelectBaseAttribute = 1, + SelectDefaultWeapon = 2, + SelectDefaultTalentSkill = 3, +}; + + +---@enum EGameStage +EGameStage = { + WaitForPlayer = 0, + GameReady = 1, + GameFight = 2, + GameEnd = 3, +}; + + +---@enum EGeneralNoticeType +EGeneralNoticeType = { + Normal = 0, + Alert = 1, + Full = 2, +}; + + +---@enum EItemDropType +EItemDropType = { + None = 0, + Generate = 1, + Drop = 2, + CancelGenerate = 3, +}; + + +---@enum EItemType +EItemType = { + Muzzle = 0, + Grip = 1, + Mag = 2, + Stock = 3, + Scope = 4, + SkillBook = 5, + ScouringStone = 6, + SubstituteStone = 7, +}; + + +---@enum EMonsterSpawnerType +EMonsterSpawnerType = { + HangUpRoom = 0, + AttackWave = 1, +}; + + +---@enum EMonsterType +EMonsterType = { + Default = 0, + HangupRoom = 1, + Common = 2, + Boss = 3, + Inherit = 4, + Breach = 5, + Unseal = 6, + ChallengeGold = 7, + ChallengeGoldEfficiency = 8, + ChallengeAccessory = 9, + ChallengeSkill = 10, + ChallengeWeaponRecasting = 11, +}; + + +---@enum EQualityType +EQualityType = { + Primary = 0, + Middle = 1, + Senior = 2, + Super = 3, +}; + + +---@enum ERollingNoticeType +ERollingNoticeType = { + None = 0, + Gain = 1, + Drop = 2, +}; + + +---@enum ESkillAccessType +ESkillAccessType = { + BuiltIn = 0, + Talented = 1, + Acquired = 2, +}; + + +---@enum ESkillCastConditionType +ESkillCastConditionType = { + IsNeedHeal = 0, +}; + + +---@enum ESkillName +ESkillName = { + Default = 0, + Heal = 1, + Dash = 2, + Anger = 3, + ShadowKill = 4, + Slash = 5, + Stun = 6, + Exhaust = 7, + Penetration = 8, + Counter = 9, + ElectricShock = 10, + StarFall = 11, + Ray = 12, + Crack = 13, + Weaken = 14, + Scabbing = 15, + DeathStrike = 16, + Roar = 17, + LightWave = 18, + IceFrost = 19, + ToxicRain = 20, + Puncture = 21, + Seal = 22, + AbsorbSoul = 23, + Tread = 24, + Stomp = 25, + StrongWind = 26, + FireDomain = 27, + Flowing = 28, + Tear = 29, + StickStrike = 30, + Shuttle = 31, + Bombing = 32, +}; + + +---@enum ESkillSelectorState +ESkillSelectorState = { + UnInitialized = 0, + WaitingActivation = 1, + Active = 2, + Finished = 3, +}; + + +---@enum ESkillSelectorType +ESkillSelectorType = { + SelfPawn = 0, + NearestPawn = 1, + CircleRange = 2, + Straightforward = 3, +}; + + +---@enum ESkillSlot +ESkillSlot = { + Slot0 = 0, + Slot1 = 1, + Slot2 = 2, + Slot3 = 3, + Slot4 = 4, +}; + + +---@enum ESkillType +ESkillType = { + Active = 0, + Passive = 1, +}; + + +---@enum ETaskDurationPolicy +ETaskDurationPolicy = { + Instant = 0, + HasDuration = 1, +}; + + +---@enum ETeleportType +ETeleportType = { + InArena = 0, + InHangupRoom = 1, +}; + + +---@enum EUILayerGroup +EUILayerGroup = { + Low = 0, + MainUI = 1, + Medium = 2, + High = 3, + Top = 4, + Guide = 5, + Toppest = 6, + Notice = 7, +}; + + +---@enum EUIType +EUIType = { + Default = 0, + Main = 1, + Backpack = 2, + Attribute = 3, + Inherit = 4, + Tech = 5, + Challenge = 6, + ResourceGrade = 7, + SaveGame = 8, + Settlement = 9, + SettlementItem = 10, + BossInfo = 11, + TreasureBox = 12, + SelectWeapon = 13, + MessageBox = 14, + FloatBox = 15, + SelectDefaultWeapon = 16, + SelectAttribute = 17, + SelectDifficulty = 18, + Notice = 19, + SelectSkill = 20, + Unpacking = 21, + WeaponDetailsDesc = 22, + WeaponAttribute = 23, + SkillButton = 24, + UseSkill = 25, + SealRewards = 26, + NewPlayerGuide = 27, + DifficultInfo = 28, + GeneralGuide = 29, + ForceGuide = 30, + GM = 31, +}; + + +---@enum EWeaponClassType +EWeaponClassType = { + WT_Pistol = 0, + WT_ShotGun = 1, + WT_MachineGun = 2, + WT_SubmachineGun = 3, + WT_ShooterRifle = 4, + WT_AssaultRifle = 5, + WT_Sniper = 6, +}; + + +---@enum EGuideExistType +EGuideExistType = { + Persist = 0, + Duration = 1, +}; + + +---@enum EGuideTextType +EGuideTextType = { + None = 0, + Right = 1, + Top = 2, + Left = 3, + Down = 4, +}; + + +---@enum EGuideTriggerType +EGuideTriggerType = { + UIVisibile = 0, + CustomCondition = 1, +}; + + +---@enum EGuideWidgetType +EGuideWidgetType = { + Square = 0, + Round = 1, +}; + + diff --git a/GZJ/Script/Common/ue_struct_custom.lua b/GZJ/Script/Common/ue_struct_custom.lua new file mode 100644 index 00000000..a16dd457 --- /dev/null +++ b/GZJ/Script/Common/ue_struct_custom.lua @@ -0,0 +1,4 @@ +-- auto exported UStruct while compiling + +-- sorted by struct name asc + diff --git a/GZJ/Script/Global/ArchiveTable.lua b/GZJ/Script/Global/ArchiveTable.lua new file mode 100644 index 00000000..c8282cd0 --- /dev/null +++ b/GZJ/Script/Global/ArchiveTable.lua @@ -0,0 +1,1251 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by yh. +--- DateTime: 2023/4/24 16:38 +--- + +ArchiveTable = ArchiveTable or {} + +-- 游戏通关奖励 +ArchiveTable.GameClearanceRewards = { + [1] = { + [1] = { Type = "初始金币", Value = 250, Unit = "" }, + [3] = { Type = "金币加成%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [2] = { + [1] = { Type = "初始科技点", Value = 20, Unit = "" }, + [3] = { Type = "科技点加成%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [3] = { + [1] = { Type = "初始经验", Value = 50, Unit = "" }, + [3] = { Type = "经验加成%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [4] = { + [1] = { Type = "生命值", Value = 200, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [5] = { + [1] = { Type = "威力值", Value = 20, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [6] = { + [1] = { Type = "防御值", Value = 5, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [7] = { + [1] = { Type = "防御穿透", Value = 5, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [8] = { + [1] = { Type = "生命值", Value = 200, Unit = "" }, + [3] = { Type = "防御值加成%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [9] = { + [1] = { Type = "威力值", Value = 20, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [10] = { + [1] = { Type = "能量值", Value = 5, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [11] = { + [1] = { Type = "防御穿透", Value = 5, Unit = "" }, + [3] = { Type = "能量值回复%/s", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [12] = { + [1] = { Type = "初级技能", Value = 1, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [13] = { + [1] = { Type = "初级技能", Value = 1, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.05, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.05, Unit = "%" } + }, + [14] = { + [1] = { Type = "初始金币", Value = 1250, Unit = "" }, + [3] = { Type = "金币加成%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [15] = { + [1] = { Type = "初始科技点", Value = 100, Unit = "" }, + [3] = { Type = "科技点加成%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [16] = { + [1] = { Type = "初始经验", Value = 250, Unit = "" }, + [3] = { Type = "经验加成%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [17] = { + [1] = { Type = "生命值", Value = 1000, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [18] = { + [1] = { Type = "威力值", Value = 100, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [19] = { + [1] = { Type = "防御值", Value = 25, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [20] = { + [1] = { Type = "防御穿透", Value = 25, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [21] = { + [1] = { Type = "生命值", Value = 1000, Unit = "" }, + [3] = { Type = "防御值加成%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [22] = { + [1] = { Type = "威力值", Value = 100, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [23] = { + [1] = { Type = "能量值", Value = 25, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [24] = { + [1] = { Type = "防御穿透", Value = 25, Unit = "" }, + [3] = { Type = "能量值回复%/s", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [25] = { + [1] = { Type = "初级技能", Value = 2, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [26] = { + [1] = { Type = "初级技能", Value = 2, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.1, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.1, Unit = "%" } + }, + [27] = { + [1] = { Type = "初始金币", Value = 2500, Unit = "" }, + [3] = { Type = "金币加成%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [28] = { + [1] = { Type = "初始科技点", Value = 200, Unit = "" }, + [3] = { Type = "科技点加成%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [29] = { + [1] = { Type = "初始经验", Value = 500, Unit = "" }, + [3] = { Type = "经验加成%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [30] = { + [1] = { Type = "生命值", Value = 2000, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [31] = { + [1] = { Type = "威力值", Value = 200, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [32] = { + [1] = { Type = "防御值", Value = 50, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [33] = { + [1] = { Type = "防御穿透", Value = 50, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [34] = { + [1] = { Type = "生命值", Value = 2000, Unit = "" }, + [3] = { Type = "防御值加成%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [35] = { + [1] = { Type = "威力值", Value = 200, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [36] = { + [1] = { Type = "能量值", Value = 50, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [37] = { + [1] = { Type = "防御穿透", Value = 50, Unit = "" }, + [3] = { Type = "能量值回复%/s", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [38] = { + [1] = { Type = "初级技能", Value = 3, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [39] = { + [1] = { Type = "初级技能", Value = 3, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.15, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.15, Unit = "%" } + }, + [40] = { + [1] = { Type = "初始金币", Value = 3750, Unit = "" }, + [3] = { Type = "金币加成%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [41] = { + [1] = { Type = "初始科技点", Value = 300, Unit = "" }, + [3] = { Type = "科技点加成%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [42] = { + [1] = { Type = "初始经验", Value = 750, Unit = "" }, + [3] = { Type = "经验加成%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [43] = { + [1] = { Type = "生命值", Value = 3000, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [44] = { + [1] = { Type = "威力值", Value = 300, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [45] = { + [1] = { Type = "防御值", Value = 75, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [46] = { + [1] = { Type = "防御穿透", Value = 75, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [47] = { + [1] = { Type = "生命值", Value = 3000, Unit = "" }, + [3] = { Type = "防御值加成%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [48] = { + [1] = { Type = "威力值", Value = 300, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [49] = { + [1] = { Type = "能量值", Value = 75, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [50] = { + [1] = { Type = "防御穿透", Value = 75, Unit = "" }, + [3] = { Type = "能量值回复%/s", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [51] = { + [1] = { Type = "中级技能", Value = 1, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [52] = { + [1] = { Type = "中级技能", Value = 1, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.2, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.2, Unit = "%" } + }, + [53] = { + [1] = { Type = "初始金币", Value = 5000, Unit = "" }, + [3] = { Type = "金币加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [54] = { + [1] = { Type = "初始科技点", Value = 400, Unit = "" }, + [3] = { Type = "科技点加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [55] = { + [1] = { Type = "初始经验", Value = 1000, Unit = "" }, + [3] = { Type = "经验加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [56] = { + [1] = { Type = "生命值", Value = 4000, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [57] = { + [1] = { Type = "威力值", Value = 400, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [58] = { + [1] = { Type = "防御值", Value = 100, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [59] = { + [1] = { Type = "防御穿透", Value = 100, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [60] = { + [1] = { Type = "生命值", Value = 4000, Unit = "" }, + [3] = { Type = "防御值加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [61] = { + [1] = { Type = "威力值", Value = 400, Unit = "" }, + [3] = { Type = "射击伤害%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [62] = { + [1] = { Type = "能量值", Value = 100, Unit = "" }, + [3] = { Type = "生命值加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [63] = { + [1] = { Type = "防御穿透", Value = 100, Unit = "" }, + [3] = { Type = "能量值回复%/s", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [64] = { + [1] = { Type = "初级技能", Value = 2, Unit = "" }, + [3] = { Type = "防御穿透%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [65] = { + [1] = { Type = "初级技能", Value = 2, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + }, + [66] = { + [1] = { Type = "初级技能", Value = 2, Unit = "" }, + [3] = { Type = "威力值加成%", Value = 0.25, Unit = "%" }, + [5] = { Type = "最终伤害%", Value = 0.25, Unit = "%" } + } +} + +-- 游戏积分奖励,可以使用二分法进行查找 +ArchiveTable.CreditRewards = { + [1] = { + Reach = 40, + Reward = { Type = "金币加成%", Value = 0.1, Unit = "%" } + }, + [2] = { + Reach = 160, + Reward = { Type = "科技点加成%", Value = 0.1, Unit = "%" } + }, + [3] = { + Reach = 400, + Reward = { Type = "经验加成%", Value = 0.1, Unit = "%" } + }, + [4] = { + Reach = 800, + Reward = { Type = "汲取%", Value = 0.05, Unit = "%" } + }, + [5] = { + Reach = 1400, + Reward = { Type = "闪避%", Value = 0.05, Unit = "%" } + }, + [6] = { + Reach = 2240, + Reward = { Type = "射击伤害%", Value = 0.2, Unit = "%" } + }, + [7] = { + Reach = 3360, + Reward = { Type = "射击伤害%", Value = 0.3, Unit = "%" } + }, + [8] = { + Reach = 4800, + Reward = { Type = "练功房怪物刷新速率%", Value = 0.1, Unit = "%" } + }, + [9] = { + Reach = 6600, + Reward = { Type = "练功房怪物数量", Value = 1, Unit = "" } + }, + [10] = { + Reach = 8800, + Reward = { Type = "射速%", Value = 0.2, Unit = "%" } + }, + [11] = { + Reach = 11440, + Reward = { Type = "射速%", Value = 0.4, Unit = "%" } + }, + [12] = { + Reach = 14560, + Reward = { Type = "射速频率", Value = -0.1, Unit = "s" } + }, + [13] = { + Reach = 18200, + Reward = { Type = "暴击伤害%", Value = 0.6, Unit = "%" } + }, + [14] = { + Reach = 22400, + Reward = { Type = "附加伤害%", Value = 0.5, Unit = "%" } + }, + [15] = { + Reach = 27200, + Reward = { Type = "防御穿透%", Value = 0.1, Unit = "%" } + }, + [16] = { + Reach = 32640, + Reward = { Type = "防御穿透%", Value = 0.1, Unit = "%" } + }, + [17] = { + Reach = 38760, + Reward = { Type = "暴击概率%", Value = 0.15, Unit = "%" } + }, + [18] = { + Reach = 45600, + Reward = { Type = "附加伤害%", Value = 0.6, Unit = "%" } + }, + [19] = { + Reach = 53200, + Reward = { Type = "防御值加成%", Value = 0.15, Unit = "%" } + }, + [20] = { + Reach = 61600, + Reward = { Type = "生命值加成%", Value = 0.15, Unit = "%" } + }, + [21] = { + Reach = 70840, + Reward = { Type = "威力值加成%", Value = 0.2, Unit = "%" } + }, + [22] = { + Reach = 80960, + Reward = { Type = "生命值加成%", Value = 0.2, Unit = "%" } + }, + [23] = { + Reach = 92000, + Reward = { Type = "威力值加成%", Value = 0.25, Unit = "%" } + }, + [24] = { + Reach = 104000, + Reward = { Type = "暴击伤害加成%", Value = 0.2, Unit = "%" } + }, + [25] = { + Reach = 117000, + Reward = { Type = "附加伤害%", Value = 0.8, Unit = "%" } + }, + [26] = { + Reach = 131040, + Reward = { Type = "射击伤害加成%", Value = 0.25, Unit = "%" } + }, + [27] = { + Reach = 146160, + Reward = { Type = "射击伤害加成%", Value = 0.3, Unit = "%" } + }, + [28] = { + Reach = 162400, + Reward = { Type = "防御值加成%", Value = 0.35, Unit = "%" } + }, + [29] = { + Reach = 179800, + Reward = { Type = "生命值加成%", Value = 0.4, Unit = "%" } + }, + [30] = { + Reach = 198400, + Reward = { Type = "最终伤害%", Value = 0.5, Unit = "%" } + } +} + +-- 游戏彩蛋 +ArchiveTable.EasterEggs = { + [1] = { + Name = "大富翁", + Condition = "身上金币达到100w", + Reward = { Type = "金币加成%", Value = 0.1, Unit = "%" }, + }, + [2] = { + Name = "压根死不了", + Condition = "不死通关", + Reward = { Type = "防御值加成%", Value = 0.1, Unit = "%" }, + }, + [3] = { + Name = "玩的就是极限", + Condition = "10秒内击败最终首领", + Reward = { Type = "最终伤害%", Value = 0.1, Unit = "%" }, + }, + [4] = { + Name = "驯怪高手", + Condition = "单局共击败20种挑战怪", + Reward = { Type = "威力值加成%", Value = 0.1, Unit = "%" }, + }, + [5] = { + Name = "真·划水", + Condition = "对首领0输出通关", + Reward = { Type = "生命值加成%", Value = 0.1, Unit = "%" }, + }, + [6] = { + Name = "怪见愁", + Condition = "单局获得5w科技点", + Reward = { Type = "科技点兑换%", Value = -0.1, Unit = "%" }, + }, + [7] = { + Name = "登顶", + Condition = "首次达到满级", + Reward = { Type = "经验加成%", Value = 0.1, Unit = "%" }, + }, + [8] = { + Name = "头是真铁", + Condition = "使用单武器通关", + Reward = { Type = "最终伤害%", Value = 0.1, Unit = "%" }, + }, + --[9] = { + -- Name = "满配!", + -- Condition = "所有武器都装满超级配件", + -- Reward = { Type = "中级配件", Value = 1, Unit = "" }, + --}, + [10] = { + Name = "冲就完事", + Condition = "单局使用250次冲刺", + Reward = { Type = "射速%", Value = 0.2, Unit = "%" }, + }, + [11] = { + Name = "一直开一直快乐", + Condition = "共使用50次高级宝箱十连开", + Reward = { Type = "高级抽奖金币消耗", Value = -0.05, Unit = "%" }, + }, + [12] = { + Name = "大开愉悦", + Condition = "共使用75次中级宝箱十连开", + Reward = { Type = "中级抽奖金币消耗%", Value = -0.05, Unit = "%" }, + }, + [13] = { + Name = "小开怡情", + Condition = "共使用100次初级宝箱十连开", + Reward = { Type = "初级抽奖金币消耗%", Value = -0.05, Unit = "%" }, + }, + --[14] = { + -- Name = "一脉相传", + -- Condition = "盔甲均升至皇阶5级", + -- Reward = { Type = "属性购买金币消耗%", Value = -0.1, Unit = "%" }, + --} +} + +-- 成就类型 +ArchiveTable.AchievementType = { + ['通关'] = 0, + ['击败首领'] = 1, + ['金币'] = 2, + ['科技点'] = 3, + ['超级技能'] = 4, + ['超级配件'] = 5, + ['开箱次数'] = 6, +} + +-- 成就 +ArchiveTable.AchievementRewards = { + ["通关"] = { + [1] = { + Name = "通关①", + Reward = { Type = "射击伤害%", Value = 0.01, Unit = "%" } + }, + [5] = { + Name = "通关②", + Reward = { Type = "射击伤害%", Value = 0.05, Unit = "%" } + }, + [20] = { + Name = "通关③", + Reward = { Type = "射击伤害%", Value = 0.1, Unit = "%" } + }, + [50] = { + Name = "通关④", + Reward = { Type = "射击伤害%", Value = 0.25, Unit = "%" } + }, + [100] = { + Name = "通关⑤", + Reward = { Type = "射击伤害%", Value = 0.5, Unit = "%" } + } + }, + -- 共击杀首领 + ["击败"] = { + [4] = { + Name = "首领击败①", + Reward = { Type = "暴击伤害%", Value = 0.015, Unit = "%" } + }, + [20] = { + Name = "首领击败②", + Reward = { Type = "暴击伤害%", Value = 0.075, Unit = "%" } + }, + [80] = { + Name = "首领击败③", + Reward = { Type = "暴击伤害%", Value = 0.125, Unit = "%" } + }, + [200] = { + Name = "首领击败④", + Reward = { Type = "暴击伤害%", Value = 0.45, Unit = "%" } + }, + [400] = { + Name = "首领击败⑤", + Reward = { Type = "暴击伤害%", Value = 0.75, Unit = "%" } + } + }, + ["金币"] = { + [100] = { + Name = "金币获取①", + Reward = { Type = "金币加成%", Value = 0.01, Unit = "%" } + }, + [500] = { + Name = "金币获取②", + Reward = { Type = "金币加成%", Value = 0.05, Unit = "%" } + }, + [2000] = { + Name = "金币获取③", + Reward = { Type = "金币加成%", Value = 0.1, Unit = "%" } + }, + [5000] = { + Name = "金币获取④", + Reward = { Type = "金币加成%", Value = 0.25, Unit = "%" } + }, + [10000] = { + Name = "金币获取⑤", + Reward = { Type = "金币加成%", Value = 0.5, Unit = "%" } + } + }, + ["科技点"] = { + [12000] = { + Name = "科技点获取①", + Reward = { Type = "科技点加成%", Value = 0.01, Unit = "%" } + }, + [60000] = { + Name = "科技点获取②", + Reward = { Type = "科技点加成%", Value = 0.05, Unit = "%" } + }, + [240000] = { + Name = "科技点获取③", + Reward = { Type = "科技点加成%", Value = 0.1, Unit = "%" } + }, + [600000] = { + Name = "科技点获取④", + Reward = { Type = "科技点加成%", Value = 0.25, Unit = "%" } + }, + [1200000] = { + Name = "科技点获取⑤", + Reward = { Type = "科技点加成%", Value = 0.5, Unit = "%" } + } + }, + ["技能"] = { + [10] = { + Name = "技能获取①", + Reward = { Type = "掉宝率加成%", Value = 0.01, Unit = "%" } + }, + [50] = { + Name = "技能获取②", + Reward = { Type = "掉宝率加成%", Value = 0.05, Unit = "%" } + }, + [200] = { + Name = "技能获取③", + Reward = { Type = "掉宝率加成%", Value = 0.1, Unit = "%" } + }, + [500] = { + Name = "技能获取④", + Reward = { Type = "掉宝率加成%", Value = 0.25, Unit = "%" } + }, + [1000] = { + Name = "技能获取⑤", + Reward = { Type = "掉宝率加成%", Value = 0.5, Unit = "%" } + } + }, + ["配件"] = { + [20] = { + Name = "配件获取①", + Reward = { Type = "掉宝率加成%", Value = 0.01, Unit = "%" } + }, + [100] = { + Name = "配件获取②", + Reward = { Type = "掉宝率加成%", Value = 0.05, Unit = "%" } + }, + [400] = { + Name = "配件获取③", + Reward = { Type = "掉宝率加成%", Value = 0.1, Unit = "%" } + }, + [1000] = { + Name = "配件获取④", + Reward = { Type = "掉宝率加成%", Value = 0.25, Unit = "%" } + }, + [2000] = { + Name = "配件获取⑤", + Reward = { Type = "掉宝率加成%", Value = 0.5, Unit = "%" } + } + }, + ["开箱"] = { + [350] = { + Name = "开箱达人①", + Reward = { Type = "开箱金币消耗", Value = -0.01, Unit = "%" } + }, + [1750] = { + Name = "开箱达人②", + Reward = { Type = "开箱金币消耗", Value = -0.02, Unit = "%" } + }, + [7000] = { + Name = "开箱达人③", + Reward = { Type = "开箱金币消耗", Value = -0.03, Unit = "%" } + }, + [17500] = { + Name = "开箱达人④", + Reward = { Type = "开箱金币消耗", Value = -0.04, Unit = "%" } + }, + [35000] = { + Name = "开箱达人⑤", + Reward = { Type = "开箱金币消耗", Value = -0.05, Unit = "%" } + } + } +} + +-- 游戏掉落的物品 +ArchiveTable.DropGameItemIndex = { + [1] = '握把', + [2] = '枪口', + [3] = '弹夹', + [4] = '枪托', + [5] = '瞄准镜', + [6] = '碎片', +} + +-- 掉落类,Value * Difficulty +ArchiveTable.DropGameItems = { + ['握把'] = { Type = "生命值加成%", Value = 0.005, Unit = "%" }, + ['枪口'] = { Type = "威力值加成%", Value = 0.005, Unit = "%" }, + ['弹夹'] = { Type = "射击伤害%", Value = 0.005, Unit = "%" }, + ['枪托'] = { Type = "暴击伤害%", Value = 0.005, Unit = "%" }, + ['瞄准镜'] = { Type = "附加伤害%", Value = 0.005, Unit = "%" }, + ['套装'] = { + { Type = "生命值", Value = 100, Unit = "" }, + { Type = "威力值", Value = 10, Unit = "" }, + }, + -- 碎片是集齐当前难度套装之后通关会掉落的东西 + ['碎片'] = { + { Type = "生命值", Value = 10, Unit = "" }, + { Type = "威力值", Value = 1, Unit = "" }, + }, +} + +ArchiveTable.ArchiveType = { + GameClearance = 0, + Credit = 1, + EasterEggs = 2, + Achievement = 3, + DropBossItems = 4, + DropGameItems = 5, +} + +ArchiveTable.Funcs = { + --游戏通关 + [ArchiveTable.ArchiveType.GameClearance] = function(Difficulty, InIndex, InOutTable) + print(string.format('[ArchiveTable.ArchiveType.GameClearance] Difficulty = %d, InIndex = %d', Difficulty, InIndex)) + if InOutTable == nil then + InOutTable = {} + end + + local TempTable = ArchiveTable.GameClearanceRewards[Difficulty][InIndex] + local Value = TempTable.Value + + if InOutTable[TempTable.Type] == nil then + InOutTable[TempTable.Type] = Value + else + InOutTable[TempTable.Type] = InOutTable[TempTable.Type] + Value + end + + print(string.format('[ArchiveTable.ArchiveType.GameClearance] 执行结束')) + log_tree("InOutTable = ", InOutTable) + end, + -- 积分 + [ArchiveTable.ArchiveType.Credit] = function(InScore, InOutTable) + -- 先找到最小大于 InScore 的值 + print(string.format('[ArchiveTable.ArchiveType.Credit] InScore = %d', InScore)) + if InScore <= 0 then + return + end + if InOutTable == nil then + InOutTable = {} + end + log_tree('InOutTable = ', InOutTable) + + local MinVal = 0 + for i, v in pairs(ArchiveTable.CreditRewards) do + if v.Reach > InScore then + MinVal = i + break + end + end + + -- 说明当前积分还没达到这么多 + if MinVal > 1 then + for i, v in pairs(ArchiveTable.CreditRewards) do + if i < MinVal then + if InOutTable[v.Reward.Type] == nil then + InOutTable[v.Reward.Type] = v.Reward.Value + else + InOutTable[v.Reward.Type] = InOutTable[v.Reward.Type] + v.Reward.Value + end + end + end + end + + print(string.format('[ArchiveTable.ArchiveType.Credit] 执行结束')) + log_tree("InOutTable = ", InOutTable) + end, + --彩蛋 + [ArchiveTable.ArchiveType.EasterEggs] = function(InPlayerState, InEggNum, ...) + if InEggNum > 14 or InEggNum <= 0 then + return + end + + if InPlayerState.ArchiveData == nil or InPlayerState.ArchiveData.EasterEggs == nil then + print(string.format('[ArchiveTable.ArchiveType.EasterEggs] 请先初始化 ArchiveData')) + return + end + + if InPlayerState.ArchiveData.EasterEggs[InEggNum].Active == false then + if ArchiveTable.EasterEggConditionFuncs[InEggNum](InPlayerState, ...) then + InPlayerState.ArchiveData.EasterEggs[InEggNum].Active = true + end + end + end, + -- 成就 + [ArchiveTable.ArchiveType.Achievement] = { + Func = function(InAchieveType, InValue, InOutTable) + print(string.format('[ArchiveTable.ArchiveType.Achievement] 执行 %s', InAchieveType)) + log_tree('InOutTable = ', InOutTable) + if InValue > 0 then + if InOutTable == nil then + InOutTable = {} + end + for i, v in pairs(ArchiveTable.AchievementRewards[InAchieveType]) do + if InValue >= i then + if InOutTable[v.Reward.Type] == nil then + InOutTable[v.Reward.Type] = v.Reward.Value + else + InOutTable[v.Reward.Type] = InOutTable[v.Reward.Type] + v.Reward.Value + end + end + end + end + log_tree('InOutTable = ', InOutTable) + end, + }, + + -- Boss掉落物 { BossName: { Type(int): Count }} + [ArchiveTable.ArchiveType.DropBossItems] = function(InBossDropItems, InOutTable) + -- 需要记录一下是否是套装 + print(string.format('[ArchiveTable.ArchiveType.DropBossItems] 开始执行 Boss 掉落')) + log_tree("Boss Drop Items = ", InBossDropItems) + log_tree('InOutTable = ', InOutTable) + -- i: BossName v: 数据表 + for BossName, v in pairs(InBossDropItems) do + -- 这里是针对于一个东西 + local IsCloth = false + if table.getCount(v) == 4 then + -- 说明是套装了 + IsCloth = true + print(string.format('[ArchiveTable.ArchiveType.DropBossItems] 这是一个套装了')) + end + -- c: 类型的索引;d:数量 + for c, d in pairs(v) do + --log_tree('v = ', v) + for j = 1, #ArchiveTable.BossDropItems[BossName][c].Rewards do + local Type = ArchiveTable.BossDropItems[BossName][c].Rewards[j].Type + if InOutTable[Type] == nil then + InOutTable[Type] = ArchiveTable.BossDropItems[BossName][c].Rewards[j].Value * d + else + InOutTable[Type] = ArchiveTable.BossDropItems[BossName][c].Rewards[j].Value * d + InOutTable[Type] + end + end + end + + if IsCloth then + for j = 1, #ArchiveTable.BossDropItems[BossName][5].Rewards do + local Type = ArchiveTable.BossDropItems[BossName][5].Rewards[j].Type + if InOutTable[Type] == nil then + InOutTable[Type] = ArchiveTable.BossDropItems[BossName][5].Rewards[j].Value + else + InOutTable[Type] = ArchiveTable.BossDropItems[BossName][5].Rewards[j].Value + InOutTable[Type] + end + end + end + end + log_tree('InOutTable = ', InOutTable) + print(string.format('[ArchiveTable.ArchiveType.DropBossItems] 结束执行 Boss 掉落')) + end, + --游戏掉落物 + [ArchiveTable.ArchiveType.DropGameItems] = function(InDropItems, InOutTable) + if InOutTable == nil then + InOutTable = {} + end + print(string.format('[ArchiveTable.ArchiveType.DropGameItems] 开始执行 Game 掉落')) + log_tree('InOutTable = ', InOutTable) + log_tree('InDropItems = ', InDropItems) + if table.isEmpty(InDropItems) then + return + end + -- i: 难度; v: 存储当前的表 + for i, v in pairs(InDropItems) do + -- c: 类型的索引(ArchiveTable.DropGameItemIndex); d: 数量 + for c, d in pairs(v) do + -- 这样就找到对应的值了 + local Val = ArchiveTable.DropGameItems[ArchiveTable.DropGameItemIndex[c]] + -- 说明是碎片 + if c == 6 then + -- e: 数组的索引 + for e = 1, #Val do + if InOutTable[Val[e].Type] == nil then + InOutTable[Val[e].Type] = Val[e].Value * i * d + else + InOutTable[Val[e].Type] = Val[e].Value * i * d + InOutTable[Val[e].Type] + end + end + else + --说明是普通装备 + if InOutTable[Val.Type] == nil then + InOutTable[Val.Type] = Val.Value * i * d + else + InOutTable[Val.Type] = Val.Value * i * d + InOutTable[Val.Type] + end + end + end + -- 检查当前是否是套装 + if table.getCount(v) >= 5 then + -- r:数组的索引 + for r = 1, #ArchiveTable.DropGameItems['套装'] do + if InOutTable[ArchiveTable.DropGameItems['套装'][r].Type] == nil then + InOutTable[ArchiveTable.DropGameItems['套装'][r].Type] = ArchiveTable.DropGameItems['套装'][r].Value * i + else + InOutTable[ArchiveTable.DropGameItems['套装'][r].Type] = ArchiveTable.DropGameItems['套装'][r].Value * i + InOutTable[ArchiveTable.DropGameItems['套装'][r].Type] + end + end + end + end + + print(string.format('[ArchiveTable.ArchiveType.DropGameItems] 结束执行 Game 掉落')) + log_tree('InOutTable = ', InOutTable) + end, +} + +ArchiveTable.EasterEggConditionFuncs = { + -- 身上金币达到100w + [1] = function(InPlayerState, ...) + return InPlayerState.CoinPoint.Current >= 100 * 10000 + end, + -- 不死通关 + [2] = function(InPlayerState, ...) + return UGCGameSystem.GameState.PlayerDieTimes[InPlayerState.PlayerKey] == 0 or UGCGameSystem.GameState.PlayerDieTimes[InPlayerState.PlayerKey] == nil + end, + -- TODO 10秒内击杀最终首领 + [3] = function(InPlayerState, ...) + local InData = {...} + return InData[1] <= 10 + end, + -- 单局共击杀20种挑战怪 + [4] = function(InPlayerState, ...) + return InPlayerState.EasterEggsData[4] ~= nil and table.getCount(InPlayerState.EasterEggsData[4]) >= 20 + end, + -- 对首领0输出通关 + [5] = function(InPlayerState, ...) + local Data = {...} + return math.isNearlyEqual(0, Data[1], 0.01) + end, + -- 单局获得5w杀敌点 + [6] = function(InPlayerState, ...) + return InPlayerState.KillPoint.Total >= 5 * 10000 + end, + -- 首次达到满级 + [7] = function(InPlayerState, ...) + return InPlayerState.Level >= 60 + end, + -- 使用单武器通关 + [8] = function(InPlayerState, ...) + return #InPlayerState.OwnerWeapons == 1 and InPlayerState.OwnerWeapons[1].WeaponId ~= 101 + end, + -- 所有武器都装满超级配件 + [9] = function(InPlayerState, ...) + local AllEquipments = InPlayerState:GetAllEquipment() + local AllTrue = true + if table.getCount(AllEquipments) == 0 then + AllTrue = false + else + for i = 1, #AllEquipments do + if GetItemQualityLevel(AllEquipments[i]) ~= EQualityType.Super then + AllTrue = false + end + end + end + return AllTrue + end, + -- 单局使用250次冲刺 + [10] = function(InPlayerState, ...) + return InPlayerState.EasterEggsData[10] ~= nil and InPlayerState.EasterEggsData[10] >= 250 + end, + -- 共使用50次高级宝箱十连开 + [11] = function(InPlayerState, ...) + return InPlayerState.EasterEggsData[11] ~= nil and InPlayerState.EasterEggsData[11] >= 50 + end, + -- 共使用75次中级宝箱十连开 + [12] = function(InPlayerState, ...) + return InPlayerState.EasterEggsData[12] ~= nil and InPlayerState.EasterEggsData[12] >= 75 + end, + -- 共使用100次初级宝箱十连开 + [13] = function(InPlayerState, ...) + return InPlayerState.EasterEggsData[13] ~= nil and InPlayerState.EasterEggsData[13] >= 50 + end, + -- 盔甲均升至皇阶5级 + [14] = function(InPlayerState, ...) + return InPlayerState.InheritItems['盔'] >= 175 and InPlayerState.InheritItems['甲'] >= 275 + end, +} + +ArchiveTable.BossDropItemIndexs = { + ['武器'] = 1, + ['盔甲'] = 2, + ['腿铠'] = 3, + ['足屐'] = 4, + + ['套装'] = 5, +} + +-- 打怪凋落物 +ArchiveTable.BossDropItems = { + ['幻'] = { + [1] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "威力值加成%", Value = 0.01, Unit = "%" } + } + }, + [2] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "射击伤害%", Value = 0.01, Unit = "%" } + } + }, + [3] = { + DropRate = 0.2, + Rewards = { + { Type = "防御值", Value = 2, Unit = "" }, + { Type = "防御值加成%", Value = 0.01, Unit = "%" } + } + }, + [4] = { + DropRate = 0.2, + Rewards = { + { Type = "生命值", Value = 100, Unit = "" }, + { Type = "生命值加成%", Value = 0.01, Unit = "%" } + } + }, + + [5] = { + Rewards = { + { Type = "威力值", Value = 500, Unit = "" }, + { Type = "威力值加成%", Value = 0.3, Unit = "%" }, + { Type = "最终伤害%", Value = 0.1, Unit = "%" } + } + } + }, + ['慎'] = { + [1] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "射击伤害%", Value = 0.01, Unit = "%" } + } + }, + [2] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "最终伤害%", Value = 0.01, Unit = "%" } + } + }, + [3] = { + DropRate = 0.2, + Rewards = { + { Type = "防御值", Value = 2, Unit = "" }, + { Type = "防御值加成%", Value = 0.01, Unit = "%" } + } + }, + [4] = { + DropRate = 0.2, + Rewards = { + { Type = "生命值", Value = 100, Unit = "" }, + { Type = "生命值加成%", Value = 0.01, Unit = "%" } + } + }, + [5] = { + Rewards = { + { Type = "威力值", Value = 500, Unit = "" }, + { Type = "暴击伤害%", Value = 0.45, Unit = "%" }, + { Type = "暴击概率%", Value = 0.1, Unit = "%" } + } + } + }, + ['魅'] = { + [1] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "暴击伤害%", Value = 0.015, Unit = "%" } + } + }, + [2] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "附加伤害%", Value = 0.01, Unit = "%" } + } + }, + [3] = { + DropRate = 0.2, + Rewards = { + { Type = "防御值", Value = 2, Unit = "" }, + { Type = "防御值加成%", Value = 0.01, Unit = "%" } + } + }, + [4] = { + DropRate = 0.2, + Rewards = { + { Type = "生命值", Value = 100, Unit = "" }, + { Type = "生命值加成%", Value = 0.01, Unit = "%" } + } + }, + [5] = { + Rewards = { + { Type = "威力值", Value = 500, Unit = "" }, + { Type = "射击伤害%", Value = 0.3, Unit = "%" }, + { Type = "射速%", Value = 0.3, Unit = "%" } + } + } + }, + ['瞬'] = { + [1] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "威力值加成%", Value = 0.01, Unit = "%" } + } + }, + [2] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "附加伤害%", Value = 0.01, Unit = "%" } + } + }, + [3] = { + DropRate = 0.2, + Rewards = { + { Type = "防御值", Value = 2, Unit = "" }, + { Type = "防御值加成%", Value = 0.01, Unit = "%" } + } + }, + [4] = { + DropRate = 0.2, + Rewards = { + { Type = "生命值", Value = 100, Unit = "" }, + { Type = "生命值加成%", Value = 0.01, Unit = "%" } + } + }, + [5] = { + Rewards = { + { Type = "威力值", Value = 500, Unit = "" }, + { Type = "金币加成%", Value = 0.2, Unit = "%" }, + { Type = "经验加成%", Value = 0.2, Unit = "%" }, + { Type = "科技点加成%", Value = 0.2, Unit = "%" }, + { Type = "练功房怪物刷新速率%", Value = 0.1, Unit = "%" } + } + } + }, + ['春'] = { + [1] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "射击伤害%", Value = 0.01, Unit = "%" } + } + }, + [2] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "暴击伤害%", Value = 0.015, Unit = "%" } + } + }, + [3] = { + DropRate = 0.2, + Rewards = { + { Type = "防御值", Value = 2, Unit = "" }, + { Type = "防御值加成%", Value = 0.01, Unit = "%" } + } + }, + [4] = { + DropRate = 0.2, + Rewards = { + { Type = "生命值", Value = 100, Unit = "" }, + { Type = "生命值加成%", Value = 0.01, Unit = "%" } + } + }, + [5] = { + Rewards = { + { Type = "威力值", Value = 500, Unit = "" }, + { Type = "暴击伤害加成%", Value = 0.05, Unit = "%" }, + { Type = "最终伤害%", Value = 0.1, Unit = "%" } + } + } + }, + ['蛮'] = { + [1] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "暴击伤害%", Value = 0.015, Unit = "%" } + } + }, + [2] = { + DropRate = 0.2, + Rewards = { + { Type = "威力值", Value = 10, Unit = "" }, + { Type = "附加伤害%", Value = 0.01, Unit = "%" } + } + }, + [3] = { + DropRate = 0.2, + Rewards = { + { Type = "防御值", Value = 2, Unit = "" }, + { Type = "防御值加成%", Value = 0.01, Unit = "%" } + } + }, + [4] = { + DropRate = 0.2, + Rewards = { + { Type = "生命值", Value = 100, Unit = "" }, + { Type = "生命值加成%", Value = 0.01, Unit = "%" } + } + }, + [5] = { + Rewards = { + { Type = "威力值", Value = 500, Unit = "" }, + { Type = "射击伤害加成%", Value = 0.05, Unit = "%" }, + { Type = "最终伤害%", Value = 0.1, Unit = "%" } + } + } + } +} + + +return ArchiveTable \ No newline at end of file diff --git a/GZJ/Script/Global/AsyncLoadTools.lua b/GZJ/Script/Global/AsyncLoadTools.lua new file mode 100644 index 00000000..08ce2b0f --- /dev/null +++ b/GZJ/Script/Global/AsyncLoadTools.lua @@ -0,0 +1,435 @@ +AsyncLoadTools = AsyncLoadTools or {} + +AsyncLoadTools.LoadedResources = {} + +AsyncLoadTools.PreLoadedWeaponMeshes = {} +AsyncLoadTools.PreLoadedWeaponIcons = {} +AsyncLoadTools.PreLoadedEffects = {} + +AsyncLoadTools.PreLoadWeaponMeshesCompleted = false +AsyncLoadTools.PreLoadWeaponIconsCompleted = false +AsyncLoadTools.PreLoadEffectsCompleted = false + +AsyncLoadTools.PendingPreLoadedMeshNum = 0 +AsyncLoadTools.PendingPreLoadedIconNum = 0 +AsyncLoadTools.PendingPreLoadedEffectNum = 0 + +AsyncLoadTools.PendingLoadSoftPaths = {} +AsyncLoadTools.PendingCallbacks = {} + +function AsyncLoadTools:Init() + -- self:PreLoadWeaponIcons() + -- self:PreLoadWeaponMeshes() + self:PreLoadEffects() +end + +function AsyncLoadTools:UnInit() + self.LoadedResources = nil + self.PreLoadedWeaponMeshes = nil + self.PreLoadedWeaponIcons = nil + self.PreLoadedEffects = nil + self:Release() +end + +function AsyncLoadTools:Release() + local GameState = UGCGameSystem.GameState + local AsyncDelegates = GameState.AsyncDelegate + if AsyncDelegates then + for _, Delegate in pairs(AsyncDelegates) do + ObjectExtend.DestroyDelegate(Delegate) + end + end + GameState.AsyncDelegate = nil +end + +function AsyncLoadTools:LoadObject(SourcePath, CallBack) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false then + UE.Log("[AsyncLoadTools:LoadObject] GameState is invalid") + return + end + + if CallBack == nil or type(CallBack) ~= "function" then + UE.Log("[AsyncLoadTools:LoadObject] CallBack is invalid") + return + end + + if SourcePath == nil or type(SourcePath) ~= "string" then + UE.Log("[AsyncLoadTools:LoadObject] SourcePath is invalid") + return + end + + SourcePath = GetFullPath(SourcePath) + + local CachedResource = self.LoadedResources[SourcePath] + if CachedResource and UE.IsValid(CachedResource) then + UE.Log("[AsyncLoadTools:LoadObject] Has Cached Resource! SourcePath = "..SourcePath) + CallBack(CachedResource) + return + end + + if self.PendingCallbacks[SourcePath] == nil then + self.PendingCallbacks[SourcePath] = {} + end + if table.hasValue(self.PendingLoadSoftPaths, SourcePath) then + table.insert(self.PendingCallbacks[SourcePath], CallBack) + UE.Log("[AsyncLoadTools:LoadObject] SourcePath: %s has requested AsyncLoading, Callback has added to wait-list", SourcePath) + return + end + + table.insert(self.PendingLoadSoftPaths, SourcePath) + table.insert(self.PendingCallbacks[SourcePath], CallBack) + + if GameState.AsyncDelegate == nil then + GameState.AsyncDelegate = {} + GameState.AsyncDelegateIndex = 0 + end + + local softObjPath = KismetSystemLibrary.MakeSoftObjectPath(SourcePath) + UE.Log("[AsyncLoadTools:LoadObject] SourcePath: %s request asyncLoading. ", SourcePath) + + GameState.AsyncDelegateIndex = GameState.AsyncDelegateIndex + 1 + local AsyncDelegateIndex = GameState.AsyncDelegateIndex + GameState.AsyncDelegate[AsyncDelegateIndex] = ObjectExtend.CreateDelegate(GameState, + function (Asset) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false then + return + end + + if Asset ~= nil then + local CallBackList = self.PendingCallbacks[SourcePath] + if type(CallBackList) == "table" and table.getCount(CallBackList) > 0 then + for _, PendingCallback in pairs(CallBackList) do + PendingCallback(Asset) + end + self.PendingCallbacks[SourcePath] = nil + end + self.LoadedResources[SourcePath] = Asset + else + UE.Log("[AsyncLoadTools:LoadObject] Error:"..SourcePath) + end + + table.removeValue(self.PendingLoadSoftPaths, SourcePath) + + if GameState.AsyncDelegate[AsyncDelegateIndex] then + ObjectExtend.DestroyDelegate(GameState.AsyncDelegate[AsyncDelegateIndex]) + GameState.AsyncDelegate[AsyncDelegateIndex] = nil + end + end + ) + + STExtraBlueprintFunctionLibrary.GetAssetByAssetReferenceAsync(softObjPath, GameState.AsyncDelegate[AsyncDelegateIndex], true) +end + +function AsyncLoadTools:LoadObjectBySoftPath(SourcePath, CallBack) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false then + UE.Log("[AsyncLoadTools:LoadObjectBySoftPath] GameState is invalid") + return + end + + if CallBack == nil or type(CallBack) ~= "function" then + UE.Log("[AsyncLoadTools:LoadObjectBySoftPath] CallBack is invalid") + return + end + + if SourcePath == nil or SourcePath.AssetPathName == nil then + UE.Log("[AsyncLoadTools:LoadObjectBySoftPath] SourcePath is invalid") + return + end + + local CachedResource = self.LoadedResources[SourcePath] + if CachedResource and UE.IsValid(CachedResource) then + UE.Log("[AsyncLoadTools:LoadObjectBySoftPath] Has Cached Resource! SourcePath = "..SourcePath.AssetPathName) + CallBack(CachedResource) + return + end + + if self.PendingCallbacks[SourcePath] == nil then + self.PendingCallbacks[SourcePath] = {} + end + if table.hasValue(self.PendingLoadSoftPaths, SourcePath) then + table.insert(self.PendingCallbacks[SourcePath], CallBack) + UE.Log("[AsyncLoadTools:LoadObjectBySoftPath] SourcePath: %s has requested AsyncLoading, Callback has added to wait-list", SourcePath.AssetPathName) + return + end + + table.insert(self.PendingLoadSoftPaths, SourcePath) + table.insert(self.PendingCallbacks[SourcePath], CallBack) + + if GameState.AsyncDelegate == nil then + GameState.AsyncDelegate = {} + GameState.AsyncDelegateIndex = 0 + end + + GameState.AsyncDelegateIndex = GameState.AsyncDelegateIndex + 1 + local AsyncDelegateIndex = GameState.AsyncDelegateIndex + GameState.AsyncDelegate[AsyncDelegateIndex] = ObjectExtend.CreateDelegate(GameState, + function (Asset) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false then + return + end + + if Asset ~= nil then + local CallBackList = self.PendingCallbacks[SourcePath] + if type(CallBackList) == "table" and table.getCount(CallBackList) > 0 then + for _, PendingCallback in pairs(CallBackList) do + PendingCallback(Asset) + end + self.PendingCallbacks[SourcePath] = nil + end + self.LoadedResources[SourcePath] = Asset + else + UE.Log("[AsyncLoadTools:LoadObjectBySoftPath] Error:"..SourcePath.AssetPathName) + end + + table.removeValue(self.PendingLoadSoftPaths, SourcePath) + + if GameState.AsyncDelegate[AsyncDelegateIndex] then + ObjectExtend.DestroyDelegate(GameState.AsyncDelegate[AsyncDelegateIndex]) + GameState.AsyncDelegate[AsyncDelegateIndex] = nil + end + end + ) + + STExtraBlueprintFunctionLibrary.GetAssetByAssetReferenceAsync(SourcePath, GameState.AsyncDelegate[AsyncDelegateIndex], true) +end + +function AsyncLoadTools:GetResource(SourcePath) + SourcePath = GetFullPath(SourcePath) + return self.LoadedResources[SourcePath] +end + +function AsyncLoadTools:PreLoadWeaponMeshes() + local GameState = UGCGameSystem.GameState + if GameState.AsyncDelegate == nil then + GameState.AsyncDelegate = {} + GameState.AsyncDelegateIndex = 0 + end + + self.PreLoadWeaponMeshesCompleted = false + self.PendingPreLoadedMeshNum = 0 + + if table.isEmpty(GameDataManager.WeaponConstructTable) then + GameDataManager:LoadWeaponConstructTable() + end + + local MeshDataTable = {} + local TotalMeshNum = 0 + for i, Data in pairs(GameDataManager.WeaponConstructTable) do + local RowName = tonumber(i) + local MeshData = { + MainMesh = nil, + PartMesh = {}, + } + MeshData.ID = RowName + MeshData.MainMesh = Data.MainMesh + local PartMeshInfo = Data.PartMeshInfo + for i, v in pairs(PartMeshInfo) do + local SocketName = v.SocketName + local PartMesh = v.PartMesh + table.insert(MeshData.PartMesh, {Mesh = PartMesh, Socket = SocketName}) + TotalMeshNum = TotalMeshNum + 1 + end + + TotalMeshNum = TotalMeshNum + 1 + MeshDataTable[RowName] = MeshData + table.insert(self.PreLoadedWeaponMeshes, MeshData) + end + + self.PendingPreLoadedMeshNum = TotalMeshNum + + local MainMeshCallback = function(Asset, DataIndex, PartMeshIndex) + for _, MeshData in pairs(self.PreLoadedWeaponMeshes) do + if MeshData.ID == DataIndex then + MeshData.MainMesh = Asset + return + end + end + end + + local PartMeshCallback = function(Asset, DataIndex, PartMeshIndex) + for _, MeshData in pairs(self.PreLoadedWeaponMeshes) do + if MeshData.ID == DataIndex then + local PartMeshData = MeshData.PartMesh[PartMeshIndex] + if PartMeshData then + PartMeshData.Mesh = Asset + end + end + end + end + + for i, MeshData in pairs(MeshDataTable) do + local TargetIndex = i + local MainMeshPath = MeshData.MainMesh + local PartMeshInfo = MeshData.PartMesh + + self:PushAsyncLoadMeshPath(MainMeshPath, TargetIndex, MainMeshCallback) + + for j, PartMeshData in pairs(PartMeshInfo) do + self:PushAsyncLoadMeshPath(PartMeshData.Mesh, TargetIndex, PartMeshCallback, j) + end + end + +end + +function AsyncLoadTools:PushAsyncLoadMeshPath(MeshPath, DataIndex, CallBack, PartMeshIndex) + local GameState = UGCGameSystem.GameState + GameState.AsyncDelegateIndex = GameState.AsyncDelegateIndex + 1 + local AsyncDelegateIndex = GameState.AsyncDelegateIndex + + GameState.AsyncDelegate[AsyncDelegateIndex] = ObjectExtend.CreateDelegate(GameState, + function (Asset) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false then + return + end + + if Asset ~= nil then + CallBack(Asset, DataIndex, PartMeshIndex) + else + UE.Log("[AsyncLoadTools:PushAsyncLoadMeshPath] Error:"..MeshPath.AssetPathName) + end + + self.PendingPreLoadedMeshNum = self.PendingPreLoadedMeshNum - 1 + if self.PendingPreLoadedMeshNum <= 0 then + self.PreLoadWeaponMeshesCompleted = true + EventSystem:SendEvent(EventType.AsyncLoadWeaponMeshesCompleted) + end + + if GameState.AsyncDelegate[AsyncDelegateIndex] then + ObjectExtend.DestroyDelegate(GameState.AsyncDelegate[AsyncDelegateIndex]) + GameState.AsyncDelegate[AsyncDelegateIndex] = nil + end + end) + STExtraBlueprintFunctionLibrary.GetAssetByAssetReferenceAsync(MeshPath, GameState.AsyncDelegate[AsyncDelegateIndex], true) +end + +function AsyncLoadTools.GetWeaponMeshInfo(ID) + for _, MeshData in pairs(AsyncLoadTools.PreLoadedWeaponMeshes) do + if MeshData.ID == ID then + UE.Log("[AsyncLoadTools][GetWeaponMeshInfo] Found ID = "..tostring(ID)) + return MeshData + end + end + UE.Log("[AsyncLoadTools][GetWeaponMeshInfo] invalid ID = "..tostring(ID)) + return nil +end + +function AsyncLoadTools:PreLoadWeaponIcons() + local GameState = UGCGameSystem.GameState + if GameState.AsyncDelegate == nil then + GameState.AsyncDelegate = {} + GameState.AsyncDelegateIndex = 0 + end + + self.PreLoadWeaponIconsCompleted = false + + if table.isEmpty(GameDataManager.WeaponConstructTable) then + GameDataManager:LoadWeaponConstructTable() + end + + self.PendingPreLoadedIconNum = 0 + local PendingIcons = {} + for i, Data in pairs(GameDataManager.WeaponConstructTable) do + local RowName = tonumber(i) + local IconPath = Data.Icon + + PendingIcons[RowName] = IconPath + self.PendingPreLoadedIconNum = self.PendingPreLoadedIconNum + 1 + end + + for index, SoftPath in pairs(PendingIcons) do + GameState.AsyncDelegateIndex = GameState.AsyncDelegateIndex + 1 + local AsyncDelegateIndex = GameState.AsyncDelegateIndex + GameState.AsyncDelegate[AsyncDelegateIndex] = ObjectExtend.CreateDelegate(GameState, + function (Asset) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false then + return + end + + if Asset ~= nil then + self.PreLoadedWeaponIcons[index] = Asset + else + UE.Log("[AsyncLoadTools:PreLoadWeaponIcons] Error:"..SoftPath.AssetPathName) + end + + self.PendingPreLoadedIconNum = self.PendingPreLoadedIconNum - 1 + if self.PendingPreLoadedIconNum <= 0 then + self.PreLoadWeaponIconsCompleted = true + EventSystem:SendEvent(EventType.AsyncLoadWeaponIconsCompleted) + end + + if GameState.AsyncDelegate[AsyncDelegateIndex] then + ObjectExtend.DestroyDelegate(GameState.AsyncDelegate[AsyncDelegateIndex]) + GameState.AsyncDelegate[AsyncDelegateIndex] = nil + end + end + ) + STExtraBlueprintFunctionLibrary.GetAssetByAssetReferenceAsync(SoftPath, GameState.AsyncDelegate[AsyncDelegateIndex], true) + end +end + +function AsyncLoadTools.GetWeaponIcon(ID) + return AsyncLoadTools.PreLoadedWeaponIcons[ID] +end + +function AsyncLoadTools:PreLoadEffects() + local GameState = UGCGameSystem.GameState + if GameState.AsyncDelegate == nil then + GameState.AsyncDelegate = {} + GameState.AsyncDelegateIndex = 0 + end + self.PreLoadEffectsCompleted = false + + local EffectTables = require("Script.Global.EffectTables") + local EffectPaths = EffectTables.Paths + + self.PendingPreLoadedEffectNum = 0 + local PendingEffectPaths = {} + for index, value in pairs(EffectPaths) do + PendingEffectPaths[index] = value + self.PendingPreLoadedEffectNum = self.PendingPreLoadedEffectNum + 1 + end + + for index, EffectPath in pairs(PendingEffectPaths) do + GameState.AsyncDelegateIndex = GameState.AsyncDelegateIndex + 1 + local AsyncDelegateIndex = GameState.AsyncDelegateIndex + GameState.AsyncDelegate[AsyncDelegateIndex] = ObjectExtend.CreateDelegate(GameState, + function (Particle) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false then + return + end + + if Particle ~= nil then + self.PreLoadedEffects[index] = Particle + else + UE.Log("[AsyncLoadTools:PreLoadEffects] Error:"..EffectPath) + end + + self.PendingPreLoadedEffectNum = self.PendingPreLoadedEffectNum - 1 + if self.PendingPreLoadedEffectNum <= 0 then + self.PreLoadEffectsCompleted = true + end + + if GameState.AsyncDelegate[AsyncDelegateIndex] then + ObjectExtend.DestroyDelegate(GameState.AsyncDelegate[AsyncDelegateIndex]) + GameState.AsyncDelegate[AsyncDelegateIndex] = nil + end + end + ) + + local softObjPath = KismetSystemLibrary.MakeSoftObjectPath(EffectPath) + STExtraBlueprintFunctionLibrary.GetAssetByAssetReferenceAsync(softObjPath, GameState.AsyncDelegate[AsyncDelegateIndex], true) + end +end + +function AsyncLoadTools.GetEffectByIndex(Index) + return AsyncLoadTools.PreLoadedEffects[Index] +end + +return AsyncLoadTools \ No newline at end of file diff --git a/GZJ/Script/Global/CSVLoader.lua b/GZJ/Script/Global/CSVLoader.lua new file mode 100644 index 00000000..b08e3e81 --- /dev/null +++ b/GZJ/Script/Global/CSVLoader.lua @@ -0,0 +1,26 @@ +CSVLoader = CSVLoader or {} + +---@return table +---@param TablePath string +---@param KeyName string @如果KeyName不为空则以此查结构体的变量名作为索引值 +function CSVLoader.LoadTable(TablePath, KeyName) + local TmpTable = TableHelper.DeepCopyTable(Gameplay.GetTable(TablePath)) + local IndexTable = {} + if KeyName == nil then + for k, v in pairs(TmpTable) do + -- 将行标识转换为ID + local i = tonumber(k) + IndexTable[i] = v + end + else + for k, v in pairs(TmpTable) do + -- 采用结构体变量作为索引 IndexTable[v.KeyName] = v + local i = v[KeyName] + IndexTable[i] = v + end + end + + return IndexTable +end + +return CSVLoader \ No newline at end of file diff --git a/GZJ/Script/Global/DropItemConfigTable.lua b/GZJ/Script/Global/DropItemConfigTable.lua new file mode 100644 index 00000000..7e58ac11 --- /dev/null +++ b/GZJ/Script/Global/DropItemConfigTable.lua @@ -0,0 +1,382 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by yh. +--- DateTime: 2023/4/19 16:43 +--- + +DropItemConfigTable = {} + +DropItemConfigTable.Items = { + [12100] = { + ItemID = 12100, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_17.Icon_UGC_module_17') + }, + [12200] = { + ItemID = 12200, + ItemType = EItemType.Grip, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_17.Icon_UGC_module_17') + }, + [12300] = { + ItemID = 12300, + ItemType = EItemType.Mag, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_06.Icon_UGC_module_06') + }, + [12400] = { + ItemID = 12400, + ItemType = EItemType.Stock, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_21.Icon_UGC_module_21') + }, + [12500] = { + ItemID = 12500, + ItemType = EItemType.Scope, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_30.Icon_UGC_module_30') + }, + [12600] = { + ItemID = 12600, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_12.Icon_UGC_module_12') + }, + [11100] = { + ItemID = 11100, + ItemType = EItemType.ScouringStone, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_20.Icon_UGC_module_20') + }, + [11200] = { + ItemID = 11200, + ItemType = EItemType.SubstituteStone, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_24.Icon_UGC_module_24') + }, + [11300] = { + ItemID = 11300, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_03.Icon_UGC_module_03') + }, + [11400] = { + ItemID = 11400, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_15.Icon_UGC_module_15') + }, + [11500] = { + ItemID = 11500, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_28.Icon_UGC_module_28') + }, + [11600] = { + ItemID = 11600, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_09.Icon_UGC_module_09') + }, + [13100] = { + ItemID = 13100, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_26.Icon_UGC_module_26') + }, + [13200] = { + ItemID = 13200, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_22.Icon_UGC_module_22') + }, + [13300] = { + ItemID = 13300, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_01.Icon_UGC_module_01') + }, + [13400] = { + ItemID = 13400, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_13.Icon_UGC_module_13') + }, + [13500] = { + ItemID = 13500, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_22.Icon_UGC_module_22') + }, + [13600] = { + ItemID = 13600, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_13.Icon_UGC_module_13') + }, + [14100] = { + ItemID = 14100, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_10.Icon_UGC_module_10') + }, + [14200] = { + ItemID = 14200, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_10.Icon_UGC_module_10') + }, + [14300] = { + ItemID = 14300, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_05.Icon_UGC_module_05') + }, + [14400] = { + ItemID = 14400, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_16.Icon_UGC_module_16') + }, + [14500] = { + ItemID = 14500, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_11.Icon_UGC_module_11') + }, + [14600] = { + ItemID = 14600, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_16.Icon_UGC_module_16') + }, + [15100] = { + ItemID = 15100, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_23.Icon_UGC_module_23') + }, + [15200] = { + ItemID = 15200, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_19.Icon_UGC_module_19') + }, + [15300] = { + ItemID = 15300, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_27.Icon_UGC_module_27') + }, + [15400] = { + ItemID = 15400, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_02.Icon_UGC_module_02') + }, + [15500] = { + ItemID = 15500, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_08.Icon_UGC_module_08') + }, + [15600] = { + ItemID = 15600, + ItemType = EItemType.Muzzle, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/module_Icon/Textures/Icon_UGC_module_14.Icon_UGC_module_14') + }, + [20100] = { + ItemID = 20100, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_32.Icon_UGC_role_32') + }, + [20200] = { + ItemID = 20200, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_04.Icon_UGC_role_04') + }, + [20300] = { + ItemID = 20300, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_19.Icon_UGC_role_19') + }, + [20400] = { + ItemID = 20400, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_30.Icon_UGC_role_30') + }, + [20500] = { + ItemID = 20500, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_31.Icon_UGC_role_31') + }, + [20600] = { + ItemID = 20600, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_29.Icon_UGC_role_29') + }, + [20700] = { + ItemID = 20700, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_28.Icon_UGC_role_28') + }, + [20800] = { + ItemID = 20800, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_07.Icon_UGC_role_07') + }, + [20900] = { + ItemID = 20900, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_11.Icon_UGC_role_11') + }, + [21000] = { + ItemID = 21000, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_08.Icon_UGC_role_08') + }, + [21100] = { + ItemID = 21100, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_27.Icon_UGC_role_27') + }, + [21200] = { + ItemID = 21200, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_22.Icon_UGC_role_22') + }, + [21300] = { + ItemID = 21300, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_18.Icon_UGC_role_18') + }, + [21400] = { + ItemID = 21400, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_21.Icon_UGC_role_21') + }, + [21500] = { + ItemID = 21500, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_26.Icon_UGC_role_26') + }, + [21600] = { + ItemID = 21600, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_25.Icon_UGC_role_25') + }, + [21700] = { + ItemID = 21700, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_24.Icon_UGC_role_24') + }, + [21800] = { + ItemID = 21800, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_13.Icon_UGC_role_13') + }, + [21900] = { + ItemID = 21900, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_03.Icon_UGC_role_03') + }, + [22000] = { + ItemID = 22000, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_09.Icon_UGC_role_09') + }, + [22100] = { + ItemID = 22100, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_05.Icon_UGC_role_05') + }, + [22200] = { + ItemID = 22200, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_12.Icon_UGC_role_12') + }, + [22300] = { + ItemID = 22300, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_01.Icon_UGC_role_01') + }, + [22400] = { + ItemID = 22400, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_16.Icon_UGC_role_16') + }, + [22500] = { + ItemID = 22500, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_10.Icon_UGC_role_10') + }, + [22600] = { + ItemID = 22600, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_17.Icon_UGC_role_17') + }, + [22700] = { + ItemID = 22700, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_15.Icon_UGC_role_15') + }, + [22800] = { + ItemID = 22800, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_20.Icon_UGC_role_20') + }, + [22900] = { + ItemID = 22900, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_23.Icon_UGC_role_23') + }, + [23000] = { + ItemID = 23000, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_02.Icon_UGC_role_02') + }, + [23100] = { + ItemID = 23100, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_06.Icon_UGC_role_06') + }, + [23200] = { + ItemID = 23200, + ItemType = EItemType.SkillBook, + Desc = '', + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_14.Icon_UGC_role_14') + } +} \ No newline at end of file diff --git a/GZJ/Script/Global/DropItemMap.lua b/GZJ/Script/Global/DropItemMap.lua new file mode 100644 index 00000000..192db1a8 --- /dev/null +++ b/GZJ/Script/Global/DropItemMap.lua @@ -0,0 +1,2431 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by vspo. +--- DateTime: 2023/3/13 16:15 +--- + +DropItemMap = DropItemMap or {} + +DropItemMap.RandomFun = { + FittingItem = function(FittingItemLevel) + local IDStr = "1" + IDStr = IDStr .. tostring(math.random(1, 5)) + IDStr = IDStr .. tostring(math.random(1, 6)) + IDStr = IDStr .. tostring(FittingItemLevel) + IDStr = IDStr .. "0" + local ID = tonumber(IDStr) + return ID + end, + SkillItem = function(SkillItemLevel) + local MaxSkillType = 0 + for k, _ in pairs(DropItemMap.SkillItemMap) do + local skillTypeNum = k // 100 % 100 + if MaxSkillType < skillTypeNum then + MaxSkillType = skillTypeNum + end + end + local IDStr = "2" + local skillType = math.random(9, MaxSkillType) + local skillTypeStr = "" + if skillType < 10 then + skillTypeStr = "0" + end + skillTypeStr = skillTypeStr .. tostring(skillType) + IDStr = IDStr .. skillTypeStr + IDStr = IDStr .. tostring(SkillItemLevel) + IDStr = IDStr .. "0" + local ID = tonumber(IDStr) + return ID + end +} + +DropItemMap.FittingItemMap = { + [12110] = { + FittingType = "握把", + Quality = "初级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "击败威力值", Value = 1.50, Unit = "" }, + { Type = "威力值加成%", Value = 0.10, Unit = "%" } + }, + }, + [12120] = { + FittingType = "握把", + Quality = "中级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "击败威力值", Value = 3, Unit = "" }, + { Type = "威力值加成%", Value = 0.15, Unit = "%" } + }, + }, + [12130] = { + FittingType = "握把", + Quality = "高级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "击败威力值", Value = 6, Unit = "" }, + { Type = "威力值加成%", Value = 0.25, Unit = "%" } + }, + }, + [12140] = { + FittingType = "握把", + Quality = "超级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "击败威力值", Value = 12, Unit = "" }, + { Type = "威力值加成%", Value = 0.40, Unit = "%" }, + { Type = "击败敌人提升50点威力值,持续5秒,可叠加25次", Value = 1, Unit = "Special" } + }, + }, + [12210] = { + FittingType = "握把", + Quality = "初级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "每秒威力值", Value = 1, Unit = "" }, + { Type = "威力值加成%", Value = 0.10, Unit = "%" } + }, + }, + [12220] = { + FittingType = "握把", + Quality = "中级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "每秒威力值", Value = 2, Unit = "" }, + { Type = "威力值加成%", Value = 0.15, Unit = "%" } + }, + }, + [12230] = { + FittingType = "握把", + Quality = "高级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "每秒威力值", Value = 4, Unit = "" }, + { Type = "威力值加成%", Value = 0.25, Unit = "%" } + }, + }, + [12240] = { + FittingType = "握把", + Quality = "超级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "每秒威力值", Value = 8, Unit = "" }, + { Type = "威力值加成%", Value = 0.40, Unit = "%" }, + { Type = "击败敌人提升2%威力值加成%,持续5秒,可叠加50次", Value = 1, Unit = "Special" } + }, + }, + [12310] = { + FittingType = "握把", + Quality = "初级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "击败生命值", Value = 15, Unit = "" }, + { Type = "威力值加成%", Value = 0.10, Unit = "%" } + }, + }, + [12320] = { + FittingType = "握把", + Quality = "中级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "击败生命值", Value = 30, Unit = "" }, + { Type = "威力值加成%", Value = 0.15, Unit = "%" } + }, + }, + [12330] = { + FittingType = "握把", + Quality = "高级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "击败生命值", Value = 60, Unit = "" }, + { Type = "威力值加成%", Value = 0.25, Unit = "%" } + }, + }, + [12340] = { + FittingType = "握把", + Quality = "超级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "击败生命值", Value = 120, Unit = "" }, + { Type = "威力值加成%", Value = 0.40, Unit = "%" }, + { Type = "击败敌人提升250点生命值,持续5秒,可叠加50次", Value = 1, Unit = "Special" } + }, + }, + [12410] = { + FittingType = "握把", + Quality = "初级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "射击生命值", Value = 10, Unit = "" }, + { Type = "威力值加成%", Value = 0.10, Unit = "%" } + }, + }, + [12420] = { + FittingType = "握把", + Quality = "中级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "射击生命值", Value = 20, Unit = "" }, + { Type = "威力值加成%", Value = 0.15, Unit = "%" } + }, + }, + [12430] = { + FittingType = "握把", + Quality = "高级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "射击生命值", Value = 40, Unit = "" }, + { Type = "威力值加成%", Value = 0.25, Unit = "%" } + }, + }, + [12440] = { + FittingType = "握把", + Quality = "超级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "射击生命值", Value = 80, Unit = "" }, + { Type = "威力值加成%", Value = 0.40, Unit = "%" }, + { Type = "每秒提升0.05%防御值加成%", Value = 1, Unit = "Special" } + }, + }, + [12510] = { + FittingType = "握把", + Quality = "初级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "每秒生命值", Value = 10, Unit = "" }, + { Type = "威力值加成%", Value = 0.10, Unit = "%" } + }, + }, + [12520] = { + FittingType = "握把", + Quality = "中级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "每秒生命值", Value = 20, Unit = "" }, + { Type = "威力值加成%", Value = 0.15, Unit = "%" } + }, + }, + [12530] = { + FittingType = "握把", + Quality = "高级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "每秒生命值", Value = 40, Unit = "" }, + { Type = "威力值加成%", Value = 0.25, Unit = "%" } + }, + }, + [12540] = { + FittingType = "握把", + Quality = "超级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "每秒生命值", Value = 80, Unit = "" }, + { Type = "威力值加成%", Value = 0.40, Unit = "%" }, + { Type = "每秒提升0.05%生命值加成%", Value = 1, Unit = "Special" } + }, + }, + [12610] = { + FittingType = "握把", + Quality = "初级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "射击威力值", Value = 1, Unit = "" }, + { Type = "威力值加成%", Value = 0.10, Unit = "%" } + }, + }, + [12620] = { + FittingType = "握把", + Quality = "中级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "射击威力值", Value = 2, Unit = "" }, + { Type = "威力值加成%", Value = 0.15, Unit = "%" } + }, + }, + [12630] = { + FittingType = "握把", + Quality = "高级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "射击威力值", Value = 4, Unit = "" }, + { Type = "威力值加成%", Value = 0.25, Unit = "%" } + }, + }, + [12640] = { + FittingType = "握把", + Quality = "超级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "射击威力值", Value = 8, Unit = "" }, + { Type = "威力值加成%", Value = 0.40, Unit = "%" }, + { Type = "每次射击提升20点威力值,持续5秒,可叠加50次", Value = 1, Unit = "Special" } + }, + }, + [11110] = { + FittingType = "枪口", + Quality = "初级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "暴击概率%", Value = 0.05, Unit = "%" }, + { Type = "防御穿透%", Value = 0.05, Unit = "%" } + }, + }, + [11120] = { + FittingType = "枪口", + Quality = "中级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "暴击概率%", Value = 0.10, Unit = "%" }, + { Type = "防御穿透%", Value = 0.08, Unit = "%" } + }, + }, + [11130] = { + FittingType = "枪口", + Quality = "高级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "暴击概率%", Value = 0.15, Unit = "%" }, + { Type = "防御穿透%", Value = 0.15, Unit = "%" } + }, + }, + [11140] = { + FittingType = "枪口", + Quality = "超级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "暴击概率%", Value = 0.25, Unit = "%" }, + { Type = "防御穿透%", Value = 0.25, Unit = "%" }, + { Type = "每射击5次,下次射击必定暴击", Value = 1, Unit = "Special" } + }, + }, + [11210] = { + FittingType = "枪口", + Quality = "初级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "闪避%", Value = 0.05, Unit = "%" }, + { Type = "防御穿透%", Value = 0.05, Unit = "%" } + }, + }, + [11220] = { + FittingType = "枪口", + Quality = "中级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "闪避%", Value = 0.08, Unit = "%" }, + { Type = "防御穿透%", Value = 0.08, Unit = "%" } + }, + }, + [11230] = { + FittingType = "枪口", + Quality = "高级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "闪避%", Value = 0.15, Unit = "%" }, + { Type = "防御穿透%", Value = 0.15, Unit = "%" } + }, + }, + [11240] = { + FittingType = "枪口", + Quality = "超级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "闪避%", Value = 0.25, Unit = "%" }, + { Type = "防御穿透%", Value = 0.25, Unit = "%" }, + { Type = "射击有10%的概率进入极速状态,该状态下射速提升100%,持续5s", Value = 1, Unit = "Special" } + }, + }, + [11310] = { + FittingType = "枪口", + Quality = "初级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "汲取%", Value = 0.05, Unit = "%" }, + { Type = "防御穿透%", Value = 0.05, Unit = "%" } + }, + }, + [11320] = { + FittingType = "枪口", + Quality = "中级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "汲取%", Value = 0.08, Unit = "%" }, + { Type = "防御穿透%", Value = 0.08, Unit = "%" } + }, + }, + [11330] = { + FittingType = "枪口", + Quality = "高级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "汲取%", Value = 0.15, Unit = "%" }, + { Type = "防御穿透%", Value = 0.15, Unit = "%" } + }, + }, + [11340] = { + FittingType = "枪口", + Quality = "超级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "汲取%", Value = 0.25, Unit = "%" }, + { Type = "防御穿透%", Value = 0.25, Unit = "%" }, + { Type = "每隔10秒,进入嗜血状态,该状态下汲取%达到100%,持续2秒", Value = 1, Unit = "Special" } + }, + }, + [11410] = { + FittingType = "枪口", + Quality = "初级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "射速%", Value = 0.10, Unit = "%" }, + { Type = "防御穿透%", Value = 0.05, Unit = "%" } + }, + }, + [11420] = { + FittingType = "枪口", + Quality = "中级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "射速%", Value = 0.20, Unit = "%" }, + { Type = "防御穿透%", Value = 0.08, Unit = "%" } + }, + }, + [11430] = { + FittingType = "枪口", + Quality = "高级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "射速%", Value = 0.30, Unit = "%" }, + { Type = "防御穿透%", Value = 0.15, Unit = "%" } + }, + }, + [11440] = { + FittingType = "枪口", + Quality = "超级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "射速%", Value = 0.50, Unit = "%" }, + { Type = "防御穿透%", Value = 0.25, Unit = "%" }, + { Type = "每次射击有25%概率造成2次伤害", Value = 1, Unit = "Special" } + }, + }, + [11510] = { + FittingType = "枪口", + Quality = "初级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "威力值加成%", Value = 0.10, Unit = "%" }, + { Type = "防御穿透%", Value = 0.05, Unit = "%" } + }, + }, + [11520] = { + FittingType = "枪口", + Quality = "中级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "威力值加成%", Value = 0.20, Unit = "%" }, + { Type = "防御穿透%", Value = 0.08, Unit = "%" } + }, + }, + [11530] = { + FittingType = "枪口", + Quality = "高级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "威力值加成%", Value = 0.25, Unit = "%" }, + { Type = "防御穿透%", Value = 0.15, Unit = "%" } + }, + }, + [11540] = { + FittingType = "枪口", + Quality = "超级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "威力值加成%", Value = 0.40, Unit = "%" }, + { Type = "防御穿透%", Value = 0.25, Unit = "%" }, + { Type = "威力值", Value = 1500, Unit = "" } + }, + }, + [11610] = { + FittingType = "枪口", + Quality = "初级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "射击伤害%", Value = 0.10, Unit = "%" }, + { Type = "防御穿透%", Value = 0.05, Unit = "%" } + }, + }, + [11620] = { + FittingType = "枪口", + Quality = "中级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "射击伤害%", Value = 0.20, Unit = "%" }, + { Type = "防御穿透%", Value = 0.08, Unit = "%" } + }, + }, + [11630] = { + FittingType = "枪口", + Quality = "高级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "射击伤害%", Value = 0.25, Unit = "%" }, + { Type = "防御穿透%", Value = 0.15, Unit = "%" } + }, + }, + [11640] = { + FittingType = "枪口", + Quality = "超级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "射击伤害%", Value = 0.40, Unit = "%" }, + { Type = "防御穿透%", Value = 0.25, Unit = "%" }, + { Type = "射击伤害加成%", Value = 0.10, Unit = "%" } + }, + }, + [13110] = { + FittingType = "弹匣", + Quality = "初级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "生命值", Value = 600, Unit = "" }, + { Type = "射速%", Value = 0.20, Unit = "%" } + }, + }, + [13120] = { + FittingType = "弹匣", + Quality = "中级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "生命值", Value = 1800, Unit = "" }, + { Type = "射速%", Value = 0.40, Unit = "%" } + }, + }, + [13130] = { + FittingType = "弹匣", + Quality = "高级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "生命值", Value = 5000, Unit = "" }, + { Type = "射速%", Value = 0.60, Unit = "%" } + }, + }, + [13140] = { + FittingType = "弹匣", + Quality = "超级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "生命值", Value = 15000, Unit = "" }, + { Type = "射速%", Value = 0.80, Unit = "%" }, + { Type = "生命值加成%", Value = 0.50, Unit = "%" } + }, + }, + [13210] = { + FittingType = "弹匣", + Quality = "初级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "防御值", Value = 20, Unit = "" }, + { Type = "射速%", Value = 0.20, Unit = "%" } + }, + }, + [13220] = { + FittingType = "弹匣", + Quality = "中级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "防御值", Value = 50, Unit = "" }, + { Type = "射速%", Value = 0.40, Unit = "%" } + }, + }, + [13230] = { + FittingType = "弹匣", + Quality = "高级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "防御值", Value = 100, Unit = "" }, + { Type = "射速%", Value = 0.60, Unit = "%" } + }, + }, + [13240] = { + FittingType = "弹匣", + Quality = "超级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "防御值", Value = 300, Unit = "" }, + { Type = "射速%", Value = 0.80, Unit = "%" }, + { Type = "防御值加成%", Value = 0.50, Unit = "%" } + }, + }, + [13310] = { + FittingType = "弹匣", + Quality = "初级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "威力值", Value = 20, Unit = "" }, + { Type = "射速%", Value = 0.20, Unit = "%" } + }, + }, + [13320] = { + FittingType = "弹匣", + Quality = "中级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "射速%", Value = 0.40, Unit = "%" } + }, + }, + [13330] = { + FittingType = "弹匣", + Quality = "高级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "威力值", Value = 270, Unit = "" }, + { Type = "射速%", Value = 0.60, Unit = "%" } + }, + }, + [13340] = { + FittingType = "弹匣", + Quality = "超级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "射速%", Value = 0.80, Unit = "%" }, + { Type = "威力值加成%", Value = 0.50, Unit = "%" } + }, + }, + [13410] = { + FittingType = "弹匣", + Quality = "初级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "防御穿透", Value = 60, Unit = "" }, + { Type = "射速%", Value = 0.20, Unit = "%" } + }, + }, + [13420] = { + FittingType = "弹匣", + Quality = "中级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "防御穿透", Value = 50, Unit = "" }, + { Type = "射速%", Value = 0.40, Unit = "%" } + }, + }, + [13430] = { + FittingType = "弹匣", + Quality = "高级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "防御穿透", Value = 100, Unit = "" }, + { Type = "射速%", Value = 0.60, Unit = "%" } + }, + }, + [13440] = { + FittingType = "弹匣", + Quality = "超级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "防御穿透", Value = 200, Unit = "" }, + { Type = "射速%", Value = 0.80, Unit = "%" }, + { Type = "造成伤害提升1点防御穿透,最高75点", Value = 1, Unit = "Special" } + }, + }, + [13510] = { + FittingType = "弹匣", + Quality = "初级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "暴击伤害%", Value = 0.15, Unit = "%" }, + { Type = "射速%", Value = 0.20, Unit = "%" } + }, + }, + [13520] = { + FittingType = "弹匣", + Quality = "中级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "暴击伤害%", Value = 0.30, Unit = "%" }, + { Type = "射速%", Value = 0.40, Unit = "%" } + }, + }, + [13530] = { + FittingType = "弹匣", + Quality = "高级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "暴击伤害%", Value = 0.50, Unit = "%" }, + { Type = "射速%", Value = 0.60, Unit = "%" } + }, + }, + [13540] = { + FittingType = "弹匣", + Quality = "超级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "暴击伤害%", Value = 0.60, Unit = "%" }, + { Type = "射速%", Value = 0.80, Unit = "%" }, + { Type = "暴击伤害加成%", Value = 0.10, Unit = "%" } + }, + }, + [13610] = { + FittingType = "弹匣", + Quality = "初级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "附加伤害%", Value = 0.10, Unit = "%" }, + { Type = "射速%", Value = 0.20, Unit = "%" } + }, + }, + [13620] = { + FittingType = "弹匣", + Quality = "中级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "附加伤害%", Value = 0.20, Unit = "%" }, + { Type = "射速%", Value = 0.40, Unit = "%" } + }, + }, + [13630] = { + FittingType = "弹匣", + Quality = "高级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "附加伤害%", Value = 0.25, Unit = "%" }, + { Type = "射速%", Value = 0.60, Unit = "%" } + }, + }, + [13640] = { + FittingType = "弹匣", + Quality = "超级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "附加伤害%", Value = 0.40, Unit = "%" }, + { Type = "射速%", Value = 0.80, Unit = "%" }, + { Type = "射速频率", Value = -0.10, Unit = "s" } + }, + }, + [14110] = { + FittingType = "枪托", + Quality = "初级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "科技点加成%", Value = 0.15, Unit = "%" }, + { Type = "射击伤害%", Value = 0.20, Unit = "%" } + }, + }, + [14120] = { + FittingType = "枪托", + Quality = "中级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "科技点加成%", Value = 0.25, Unit = "%" }, + { Type = "射击伤害%", Value = 0.30, Unit = "%" } + }, + }, + [14130] = { + FittingType = "枪托", + Quality = "高级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "科技点加成%", Value = 0.35, Unit = "%" }, + { Type = "射击伤害%", Value = 0.45, Unit = "%" } + }, + }, + [14140] = { + FittingType = "枪托", + Quality = "超级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "科技点加成%", Value = 0.50, Unit = "%" }, + { Type = "射击伤害%", Value = 0.65, Unit = "%" }, + { Type = "射击有5%的概率获得150点科技点,如成功获得科技点则进入10秒冷却期", Value = 1, Unit = "Special" } + }, + + }, + [14210] = { + FittingType = "枪托", + Quality = "初级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "掉宝率加成%", Value = 0.15, Unit = "%" }, + { Type = "射击伤害%", Value = 0.20, Unit = "%" } + }, + }, + [14220] = { + FittingType = "枪托", + Quality = "中级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "掉宝率加成%", Value = 0.25, Unit = "%" }, + { Type = "射击伤害%", Value = 0.30, Unit = "%" } + }, + }, + [14230] = { + FittingType = "枪托", + Quality = "高级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "掉宝率加成%", Value = 0.35, Unit = "%" }, + { Type = "射击伤害%", Value = 0.45, Unit = "%" } + }, + }, + [14240] = { + FittingType = "枪托", + Quality = "超级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "掉宝率加成%", Value = 0.50, Unit = "%" }, + { Type = "射击伤害%", Value = 0.65, Unit = "%" }, + { Type = "射击有5%概率使敌人防御值降低30%,持续5秒", Value = 1, Unit = "Special" } + }, + }, + [14310] = { + FittingType = "枪托", + Quality = "初级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "经验加成%", Value = 0.15, Unit = "%" }, + { Type = "射击伤害%", Value = 0.20, Unit = "%" } + }, + }, + [14320] = { + FittingType = "枪托", + Quality = "中级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "经验加成%", Value = 0.25, Unit = "%" }, + { Type = "射击伤害%", Value = 0.30, Unit = "%" } + }, + }, + [14330] = { + FittingType = "枪托", + Quality = "高级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "经验加成%", Value = 0.35, Unit = "%" }, + { Type = "射击伤害%", Value = 0.45, Unit = "%" } + }, + }, + [14340] = { + FittingType = "枪托", + Quality = "超级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "经验加成%", Value = 0.50, Unit = "%" }, + { Type = "射击伤害%", Value = 0.65, Unit = "%" }, + { Type = "射击会造成5%威力值的射击伤害%", Value = 1, Unit = "Special" } + }, + }, + [14410] = { + FittingType = "枪托", + Quality = "初级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "金币加成%", Value = 0.15, Unit = "%" }, + { Type = "射击伤害%", Value = 0.20, Unit = "%" } + }, + }, + [14420] = { + FittingType = "枪托", + Quality = "中级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "金币加成%", Value = 0.25, Unit = "%" }, + { Type = "射击伤害%", Value = 0.30, Unit = "%" } + }, + }, + [14430] = { + FittingType = "枪托", + Quality = "高级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "金币加成%", Value = 0.35, Unit = "%" }, + { Type = "射击伤害%", Value = 0.45, Unit = "%" } + }, + }, + [14440] = { + FittingType = "枪托", + Quality = "超级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "金币加成%", Value = 0.50, Unit = "%" }, + { Type = "射击伤害%", Value = 0.65, Unit = "%" }, + { Type = "射击有5%的概率获得5000金币,如成功获得金币则进入10秒冷却期", Value = 1, Unit = "Special" } + }, + }, + [14510] = { + FittingType = "枪托", + Quality = "初级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "击败金币", Value = 10, Unit = "" }, + { Type = "射击伤害%", Value = 0.20, Unit = "%" } + }, + }, + [14520] = { + FittingType = "枪托", + Quality = "中级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "击败金币", Value = 20, Unit = "" }, + { Type = "射击伤害%", Value = 0.30, Unit = "%" } + }, + }, + [14530] = { + FittingType = "枪托", + Quality = "高级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "击败金币", Value = 40, Unit = "" }, + { Type = "射击伤害%", Value = 0.45, Unit = "%" } + }, + }, + [14540] = { + FittingType = "枪托", + Quality = "超级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "击败金币", Value = 80, Unit = "" }, + { Type = "射击伤害%", Value = 0.65, Unit = "%" }, + { Type = "每1%的暴击伤害%加成会提高3%的射击伤害%", Value = 1, Unit = "Special" } + }, + }, + [14610] = { + FittingType = "枪托", + Quality = "初级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "每秒科技点", Value = 1, Unit = "" }, + { Type = "射击伤害%", Value = 0.20, Unit = "%" } + }, + }, + [14620] = { + FittingType = "枪托", + Quality = "中级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "每秒科技点", Value = 2, Unit = "" }, + { Type = "射击伤害%", Value = 0.30, Unit = "%" } + }, + }, + [14630] = { + FittingType = "枪托", + Quality = "高级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "每秒科技点", Value = 4, Unit = "" }, + { Type = "射击伤害%", Value = 0.45, Unit = "%" } + }, + }, + [14640] = { + FittingType = "枪托", + Quality = "超级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "每秒科技点", Value = 8, Unit = "" }, + { Type = "射击伤害%", Value = 0.65, Unit = "%" }, + { Type = "击败敌人提升2%生命值加成%,持续10秒,可叠加50次", Value = 1, Unit = "Special" } + }, + }, + [15110] = { + FittingType = "瞄准镜", + Quality = "初级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "受到伤害降低", Value = 30, Unit = "" }, + { Type = "射击距离", Value = 40, Unit = "cm" } + }, + }, + [15120] = { + FittingType = "瞄准镜", + Quality = "中级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "受到伤害降低", Value = 90, Unit = "" }, + { Type = "射击距离", Value = 70, Unit = "cm" } + }, + }, + [15130] = { + FittingType = "瞄准镜", + Quality = "高级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "受到伤害降低", Value = 270, Unit = "" }, + { Type = "射击距离", Value = 100, Unit = "cm" } + }, + }, + [15140] = { + FittingType = "瞄准镜", + Quality = "超级", + WeaponType = "霰弹枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "受到伤害降低", Value = 810, Unit = "" }, + { Type = "射击距离", Value = 150, Unit = "cm" }, + { Type = "伤害减免%", Value = 0.10, Unit = "%" } + }, + }, + [15210] = { + FittingType = "瞄准镜", + Quality = "初级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "防御值加成%", Value = 0.05, Unit = "%" }, + { Type = "射击距离", Value = 40, Unit = "cm" } + }, + }, + [15220] = { + FittingType = "瞄准镜", + Quality = "中级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "防御值加成%", Value = 0.08, Unit = "%" }, + { Type = "射击距离", Value = 70, Unit = "cm" } + }, + }, + [15230] = { + FittingType = "瞄准镜", + Quality = "高级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "防御值加成%", Value = 0.15, Unit = "%" }, + { Type = "射击距离", Value = 100, Unit = "cm" } + }, + }, + [15240] = { + FittingType = "瞄准镜", + Quality = "超级", + WeaponType = "机枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "防御值加成%", Value = 0.30, Unit = "%" }, + { Type = "射击距离", Value = 150, Unit = "cm" }, + { Type = "每秒对自身200码范围内敌人造成自身最大生命值*5%的伤害", Value = 1, Unit = "Special" } + }, + }, + [15310] = { + FittingType = "瞄准镜", + Quality = "初级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "反弹伤害", Value = 30, Unit = "" }, + { Type = "射击距离", Value = 40, Unit = "cm" } + }, + }, + [15320] = { + FittingType = "瞄准镜", + Quality = "中级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "反弹伤害", Value = 90, Unit = "" }, + { Type = "射击距离", Value = 70, Unit = "cm" } + }, + }, + [15330] = { + FittingType = "瞄准镜", + Quality = "高级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "反弹伤害", Value = 270, Unit = "" }, + { Type = "射击距离", Value = 100, Unit = "cm" } + }, + }, + [15340] = { + FittingType = "瞄准镜", + Quality = "超级", + WeaponType = "冲锋枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "反弹伤害", Value = 810, Unit = "" }, + { Type = "射击距离", Value = 150, Unit = "cm" }, + { Type = "反弹伤害%", Value = 0.05, Unit = "%" } + }, + }, + [15410] = { + FittingType = "瞄准镜", + Quality = "初级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "生命值回复", Value = 50, Unit = "s" }, + { Type = "射击距离", Value = 40, Unit = "cm" } + }, + }, + [15420] = { + FittingType = "瞄准镜", + Quality = "中级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "生命值回复", Value = 80, Unit = "s" }, + { Type = "射击距离", Value = 70, Unit = "cm" } + }, + }, + [15430] = { + FittingType = "瞄准镜", + Quality = "高级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "生命值回复", Value = 150, Unit = "s" }, + { Type = "射击距离", Value = 100, Unit = "cm" } + }, + }, + [15440] = { + FittingType = "瞄准镜", + Quality = "超级", + WeaponType = "射手步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "生命值回复", Value = 150, Unit = "s" }, + { Type = "射击距离", Value = 150, Unit = "cm" }, + { Type = "自身最大生命值回复%", Value = 0.05, Unit = "%" } + }, + }, + [15510] = { + FittingType = "瞄准镜", + Quality = "初级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "能量值回复", Value = 5, Unit = "s" }, + { Type = "射击距离", Value = 40, Unit = "cm" } + }, + }, + [15520] = { + FittingType = "瞄准镜", + Quality = "中级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "能量值回复", Value = 8, Unit = "s" }, + { Type = "射击距离", Value = 70, Unit = "cm" } + }, + }, + [15530] = { + FittingType = "瞄准镜", + Quality = "高级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "能量值回复", Value = 15, Unit = "s" }, + { Type = "射击距离", Value = 100, Unit = "cm" } + }, + }, + [15540] = { + FittingType = "瞄准镜", + Quality = "超级", + WeaponType = "突击步枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "能量值回复", Value = 15, Unit = "s" }, + { Type = "射击距离", Value = 150, Unit = "cm" }, + { Type = "自身最大能量值回复%", Value = 0.05, Unit = "%" } + }, + }, + [15610] = { + FittingType = "瞄准镜", + Quality = "初级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 60, Unit = "" }, + { Type = "射击距离", Value = 40, Unit = "cm" }, + { Type = "每10秒获得自身最大生命值", Value = 0.05, Unit = "%的护盾" }, + }, + }, + [15620] = { + FittingType = "瞄准镜", + Quality = "中级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 180, Unit = "" }, + { Type = "射击距离", Value = 70, Unit = "cm" }, + { Type = "每10秒获得自身最大生命值", Value = 0.10, Unit = "%的护盾" }, + }, + }, + [15630] = { + FittingType = "瞄准镜", + Quality = "高级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 540, Unit = "" }, + { Type = "射击距离", Value = 100, Unit = "cm" }, + { Type = "每10秒获得自身最大生命值", Value = 0.15, Unit = "%的护盾" }, + }, + }, + [15640] = { + FittingType = "瞄准镜", + Quality = "超级", + WeaponType = "狙击枪", + Props = { + { Type = "威力值", Value = 1620, Unit = "" }, + { Type = "射击距离", Value = 150, Unit = "cm" }, + { Type = "每10秒获得自身最大生命值", Value = 0.25, Unit = "%的护盾" }, + { Type = "每1%的射击伤害%加成会提高3%的暴击伤害%", Value = 1, Unit = "Special" } + }, + }, +} + +DropItemMap.SkillItemMap = { + [20100] = { + SkillName = "回复", + SkillSelectType = "自带", + ColdDown = 20, + Cost = 0, + Desc = "立即回复40%已损生命值和能量值" + }, + [20200] = { + SkillName = "冲刺", + SkillSelectType = "开局选择,天赋技能", + ColdDown = 5, + Cost = 10, + Desc = "向前冲刺400码" + }, + [20300] = { + SkillName = "怒意", + SkillSelectType = "开局选择,天赋技能", + ColdDown = 50, + Cost = 20, + Desc = "使用期间,造成伤害提升100%,不过受到伤害提升20%,持续8秒" + }, + [20400] = { + SkillName = "影击", + SkillSelectType = "开局选择,天赋技能", + ColdDown = 50, + Cost = 20, + Desc = "移动速度提升50%,并且闪避率提升50%,持续8秒" + }, + [20500] = { + SkillName = "瞬击", + SkillSelectType = "开局选择,天赋技能", + ColdDown = 25, + Cost = 20, + Desc = "立即对周围300码的所有敌人造成自身最大生命值10%的真实伤害" + }, + [20600] = { + SkillName = "眩晕", + SkillSelectType = "开局选择,天赋技能", + ColdDown = 30, + Cost = 20, + Desc = "眩晕周围300码所有敌人,持续3秒" + }, + [20700] = { + SkillName = "虚弱", + SkillSelectType = "开局选择,天赋技能", + ColdDown = 45, + Cost = 20, + Desc = "使周围300码的所有敌人受到伤害提升30%,持续8秒" + }, + [20800] = { + SkillName = "穿透", + SkillSelectType = "开局选择,天赋技能", + ColdDown = 50, + Cost = 20, + Desc = "开启期间,造成伤害均为真实伤害,持续8秒" + }, + [20910] = { + SkillName = "反击", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "受到伤害时有【10%】概率对附近300码所有敌方单位造成【200+自身最大生命值*5%】伤害" + }, + [20920] = { + SkillName = "反击", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "受到伤害时有【12%】概率对附近300码所有敌方单位造成【200+自身最大生命值*8%】伤害" + }, + [20930] = { + SkillName = "反击", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "受到伤害时有【15%】概率对附近300码所有敌方单位造成【200+自身最大生命值*12%】伤害" + }, + [20940] = { + SkillName = "反击", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "受到伤害时有【20%】概率对附近300码所有敌方单位造成【200+自身最大生命值*18%】伤害" + }, + [21010] = { + SkillName = "电击", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "射击时有【10%】概率对周围随机目标造成【200+威力值*200%】的伤害,最多5个目标" + }, + [21020] = { + SkillName = "电击", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "射击时有【12%】概率对周围随机目标造成【200+威力值*320%】的伤害,最多5个目标" + }, + [21030] = { + SkillName = "电击", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "射击时有【15%】概率对周围随机目标造成【200+威力值*480%】的伤害,最多5个目标" + }, + [21040] = { + SkillName = "电击", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "射击时有【20%】概率对周围随机目标造成【200+威力值*720%】的伤害,最多5个目标" + }, + [21110] = { + SkillName = "星落", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每秒降下星火,对周围随机敌人造成【240+威力值*180%】的伤害,最多【5】个目标,每个敌人2秒内最多受到1次该技能伤害" + }, + [21120] = { + SkillName = "星落", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每秒降下星火,对周围随机敌人造成【240+威力值*300%】的伤害,最多【6】个目标,每个敌人2秒内最多受到1次该技能伤害" + }, + [21130] = { + SkillName = "星落", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每秒降下星火,对周围随机敌人造成【240+威力值*450%】的伤害,最多【7】个目标,每个敌人2秒内最多受到1次该技能伤害" + }, + [21140] = { + SkillName = "星落", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每秒降下星火,对周围随机敌人造成【240+威力值*680%】的伤害,最多【10】个目标,每个敌人2秒内最多受到1次该技能伤害" + }, + [21210] = { + SkillName = "射线", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击朝前方发射3条间隔30°的射线,对直线上的敌人造成【100+威力值*150%】的伤害,射线长度为1000码" + }, + [21220] = { + SkillName = "射线", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击朝前方发射3条间隔30°的射线,对直线上的敌人造成【100+威力值*220%】的伤害,射线长度为1000码" + }, + [21230] = { + SkillName = "射线", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击朝前方发射3条间隔30°的射线,对直线上的敌人造成【100+威力值*360%】的伤害,射线长度为1000码" + }, + [21240] = { + SkillName = "射线", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击朝前方发射3条间隔30°的射线,对直线上的敌人造成【100+威力值*520%】的伤害,射线长度为1000码" + }, + [21310] = { + SkillName = "裂击", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会额外对【1】个目标造成本次伤害的60%" + }, + [21320] = { + SkillName = "裂击", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会额外对【2】个目标造成本次伤害的70%" + }, + [21330] = { + SkillName = "裂击", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会额外对【3】个目标造成本次伤害的80%" + }, + [21340] = { + SkillName = "裂击", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会额外对【4】个目标造成本次伤害的100%" + }, + [21410] = { + SkillName = "弱点", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会使敌人受到伤害提升3%,持续5秒,可无限叠加" + }, + [21420] = { + SkillName = "弱点", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会使敌人受到伤害提升3%,持续5秒,可无限叠加" + }, + [21430] = { + SkillName = "弱点", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会使敌人受到伤害提升3%,持续5秒,可无限叠加" + }, + [21440] = { + SkillName = "弱点", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会使敌人受到伤害提升3%,持续5秒,可无限叠加" + }, + [21510] = { + SkillName = "碎甲", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会降低敌人2点防御值,持续5秒,可无限叠加" + }, + [21520] = { + SkillName = "碎甲", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会降低敌人2点防御值,持续5秒,可无限叠加" + }, + [21530] = { + SkillName = "碎甲", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会降低敌人2点防御值,持续5秒,可无限叠加" + }, + [21540] = { + SkillName = "碎甲", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 0, + Cost = 0, + Desc = "每次射击会降低敌人2点防御值,持续5秒,可无限叠加" + }, + [21610] = { + SkillName = "瞬打", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "对敌人造成致命一击,立即造成【400+威力值*600%】的伤害" + }, + [21620] = { + SkillName = "瞬打", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "对敌人造成致命一击,立即造成【400+威力值*800%】的伤害" + }, + [21630] = { + SkillName = "瞬打", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "对敌人造成致命一击,立即造成【400+威力值*1000%】的伤害" + }, + [21640] = { + SkillName = "瞬打", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "对敌人造成致命一击,立即造成【400+威力值*1500%】的伤害" + }, + [21710] = { + SkillName = "嘶吼", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "痛苦嘶叫,对周围400码范围所有敌人造成【200+威力值*250%】的伤害" + }, + [21720] = { + SkillName = "嘶吼", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "痛苦嘶叫,对周围400码范围所有敌人造成【200+威力值*320%】的伤害" + }, + [21730] = { + SkillName = "嘶吼", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "痛苦嘶叫,对周围400码范围所有敌人造成【200+威力值*420%】的伤害" + }, + [21740] = { + SkillName = "嘶吼", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "痛苦嘶叫,对周围400码范围所有敌人造成【200+威力值*550%】的伤害" + }, + [21810] = { + SkillName = "光波", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "向正前方释放一道光波,对直线上的敌人造成【250+威力值*300%】的伤害" + }, + [21820] = { + SkillName = "光波", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "向正前方释放一道光波,对直线上的敌人造成【250+威力值*420%】的伤害" + }, + [21830] = { + SkillName = "光波", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "向正前方释放一道光波,对直线上的敌人造成【250+威力值*560%】的伤害" + }, + [21840] = { + SkillName = "光波", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "向正前方释放一道光波,对直线上的敌人造成【250+威力值*760%】的伤害" + }, + [21910] = { + SkillName = "冰霜", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "最近的怪物脚下释放400码范围的冰霜,区域内所有敌人受到【100+威力值*200%】的伤害,移动速度降低20%,持续3秒" + }, + [21920] = { + SkillName = "冰霜", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "最近的怪物脚下释放400码范围的冰霜,区域内所有敌人受到【100+威力值*300%】的伤害,移动速度降低30%,持续3秒" + }, + [21930] = { + SkillName = "冰霜", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "最近的怪物脚下释放400码范围的冰霜,区域内所有敌人受到【100+威力值*400%】的伤害,移动速度降低40%,持续3秒" + }, + [21940] = { + SkillName = "冰霜", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "最近的怪物脚下释放400码范围的冰霜,区域内所有敌人受到【100+威力值*500%】的伤害,移动速度降低50%,持续3秒" + }, + [22010] = { + SkillName = "滩涂", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "最近的怪物脚下释放300码范围的滩涂,区域内所有敌人每秒受到【120+威力值*120%】的伤害,防御值降低5%,持续3秒" + }, + [22020] = { + SkillName = "滩涂", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "最近的怪物脚下释放300码范围的滩涂,区域内所有敌人每秒受到【120+威力值*180%】的伤害,防御值降低10%,持续3秒" + }, + [22030] = { + SkillName = "滩涂", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "最近的怪物脚下释放300码范围的滩涂,区域内所有敌人每秒受到【120+威力值*240%】的伤害,防御值降低15%,持续3秒" + }, + [22040] = { + SkillName = "滩涂", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "最近的怪物脚下释放300码范围的滩涂,区域内所有敌人每秒受到【120+威力值*300%】的伤害,防御值降低25%,持续3秒" + }, + [22110] = { + SkillName = "穿刺", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "释放穿刺,对直接上的敌人造成【150+威力值*150%】的伤害,并眩晕2秒" + }, + [22120] = { + SkillName = "穿刺", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "释放穿刺,对直接上的敌人造成【150+威力值*250%】的伤害,并眩晕2.2秒" + }, + [22130] = { + SkillName = "穿刺", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "释放穿刺,对直接上的敌人造成【150+威力值*350%】的伤害,并眩晕2.5秒" + }, + [22140] = { + SkillName = "穿刺", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "释放穿刺,对直接上的敌人造成【150+威力值*500%】的伤害,并眩晕3秒" + }, + [22210] = { + SkillName = "封印", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 18, + Cost = 40, + Desc = "最近的怪物脚下释放300码范围的封印,区域内所有敌人受到【120+威力值*200%】的伤害,1.5秒内无法动弹" + }, + [22220] = { + SkillName = "封印", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 18, + Cost = 40, + Desc = "最近的怪物脚下释放300码范围的封印,区域内所有敌人受到【120+威力值*260%】的伤害,1.8秒内无法动弹" + }, + [22230] = { + SkillName = "封印", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 18, + Cost = 40, + Desc = "最近的怪物脚下释放300码范围的封印,区域内所有敌人受到【120+威力值*320%】的伤害,2.1秒内无法动弹" + }, + [22240] = { + SkillName = "封印", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 18, + Cost = 40, + Desc = "最近的怪物脚下释放300码范围的封印,区域内所有敌人受到【120+威力值*400%】的伤害,2.5秒内无法动弹" + }, + [22310] = { + SkillName = "摄灵", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "对周围400码内敌人造成【180+威力值150%】的伤害,并回复造成伤害对应的生命值" + }, + [22320] = { + SkillName = "摄灵", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "对周围400码内敌人造成【180+威力值250%】的伤害,并回复造成伤害对应的生命值" + }, + [22330] = { + SkillName = "摄灵", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "对周围400码内敌人造成【180+威力值350%】的伤害,并回复造成伤害对应的生命值" + }, + [22340] = { + SkillName = "摄灵", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "对周围400码内敌人造成【180+威力值450%】的伤害,并回复造成伤害对应的生命值" + }, + [22410] = { + SkillName = "践踏", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 15, + Cost = 40, + Desc = "猛踩地面,对周围300码范围的敌人造成【180+威力值*150%】的伤害,并眩晕1秒" + }, + [22420] = { + SkillName = "践踏", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 15, + Cost = 40, + Desc = "猛踩地面,对周围300码范围的敌人造成【180+威力值*200%】的伤害,并眩晕1.2秒" + }, + [22430] = { + SkillName = "践踏", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 15, + Cost = 40, + Desc = "猛踩地面,对周围300码范围的敌人造成【180+威力值*250%】的伤害,并眩晕1.4秒" + }, + [22440] = { + SkillName = "践踏", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 15, + Cost = 40, + Desc = "猛踩地面,对周围300码范围的敌人造成【180+威力值*300%】的伤害,并眩晕2秒" + }, + [22510] = { + SkillName = "跺击", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 25, + Cost = 40, + Desc = "跺击地面,对周围500码范围内敌人造成【100+威力值*180%】的伤害,并降低其50%移动速度,持续5秒" + }, + [22520] = { + SkillName = "跺击", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 25, + Cost = 40, + Desc = "跺击地面,对周围500码范围内敌人造成【100+威力值*220%】的伤害,并降低其50%移动速度,持续5秒" + }, + [22530] = { + SkillName = "跺击", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 25, + Cost = 40, + Desc = "跺击地面,对周围500码范围内敌人造成【100+威力值*280%】的伤害,并降低其50%移动速度,持续5秒" + }, + [22540] = { + SkillName = "跺击", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 25, + Cost = 40, + Desc = "跺击地面,对周围500码范围内敌人造成【100+威力值*350%】的伤害,并降低其50%移动速度,持续5秒" + }, + [22610] = { + SkillName = "罡风", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 30, + Cost = 40, + Desc = "转动自身的身体形成罡风,每秒对周围300码范围的敌人造成【80+威力值*15%】的伤害,自身移动速度提升50%,持续5秒" + }, + [22620] = { + SkillName = "罡风", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 30, + Cost = 40, + Desc = "转动自身的身体形成罡风,每秒对周围300码范围的敌人造成【80+威力值*22%】的伤害,自身移动速度提升50%,持续5秒" + }, + [22630] = { + SkillName = "罡风", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 30, + Cost = 40, + Desc = "转动自身的身体形成罡风,每秒对周围300码范围的敌人造成【80+威力值*30%】的伤害,自身移动速度提升50%,持续7秒" + }, + [22640] = { + SkillName = "罡风", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 30, + Cost = 40, + Desc = "转动自身的身体形成罡风,每秒对周围300码范围的敌人造成【80+威力值*40%】的伤害,自身移动速度提升50%,持续8秒" + }, + [22710] = { + SkillName = "火域", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 22, + Cost = 40, + Desc = "向前方喷射一道400码范围扇形的火焰,并残留一个持续3秒的火域,对敌人造成【140+威力值*150%】的伤害,处于火域中的敌人每秒会受到200点伤害" + }, + [22720] = { + SkillName = "火域", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 22, + Cost = 40, + Desc = "向前方喷射一道400码范围扇形的火焰,并残留一个持续3秒的火域,对敌人造成【140+威力值*220%】的伤害,处于火域中的敌人每秒会受到400点伤害" + }, + [22730] = { + SkillName = "火域", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 22, + Cost = 40, + Desc = "向前方喷射一道400码范围扇形的火焰,并残留一个持续3秒的火域,对敌人造成【140+威力值*320%】的伤害,处于火域中的敌人每秒会受到600点伤害" + }, + [22740] = { + SkillName = "火域", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 22, + Cost = 40, + Desc = "向前方喷射一道400码范围扇形的火焰,并残留一个持续3秒的火域,对敌人造成【140+威力值*450%】的伤害,处于火域中的敌人每秒会受到800点伤害" + }, + [22810] = { + SkillName = "喷涌", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "每秒向周身随机角度喷射一道宽200码,长800码的水波,对命中敌人造成【攻击力*100%】的伤害,并使其3秒内防御降低10%,水波持续3秒" + }, + [22820] = { + SkillName = "喷涌", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "每秒向周身随机角度喷射一道宽200码,长800码的水波,对命中敌人造成【攻击力*120%】的伤害,并使其3秒内防御降低15%,水波持续3秒" + }, + [22830] = { + SkillName = "喷涌", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "每秒向周身随机角度喷射一道宽200码,长800码的水波,对命中敌人造成【攻击力*150%】的伤害,并使其3秒内防御降低20%,水波持续3秒" + }, + [22840] = { + SkillName = "喷涌", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "每秒向周身随机角度喷射一道宽200码,长800码的水波,对命中敌人造成【攻击力*200%】的伤害,并使其3秒内防御降低30%,水波持续3秒" + }, + [22910] = { + SkillName = "撕裂", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 30, + Cost = 40, + Desc = "撕裂最近的敌人,每秒受到【100+威力值*200%】的伤害,并使其受到伤害提升30%,持续5秒" + }, + [22920] = { + SkillName = "撕裂", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 30, + Cost = 40, + Desc = "撕裂最近的敌人,每秒受到【100+威力值*250%】的伤害,并使其受到伤害提升30%,持续5秒" + }, + [22930] = { + SkillName = "撕裂", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 30, + Cost = 40, + Desc = "撕裂最近的敌人,每秒受到【100+威力值*320%】的伤害,并使其受到伤害提升30%,持续5秒" + }, + [22940] = { + SkillName = "撕裂", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 30, + Cost = 40, + Desc = "撕裂最近的敌人,每秒受到【100+威力值*400%】的伤害,并使其受到伤害提升30%,持续5秒" + }, + [23010] = { + SkillName = "棒击", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "向正前方释放棒击大地,对一条直线上的敌人敌人造成【威力值*500%】的暴击伤害,并眩晕1秒,直线长度1000码" + }, + [23020] = { + SkillName = "棒击", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "向正前方释放棒击大地,对一条直线上的敌人敌人造成【威力值*700%】的暴击伤害,并眩晕1秒,直线长度1000码" + }, + [23030] = { + SkillName = "棒击", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "向正前方释放棒击大地,对一条直线上的敌人敌人造成【威力值*900%】的暴击伤害,并眩晕1秒,直线长度1000码" + }, + [23040] = { + SkillName = "棒击", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 20, + Cost = 40, + Desc = "向正前方释放棒击大地,对一条直线上的敌人敌人造成【威力值*1200%】的暴击伤害,并眩晕1秒,直线长度1000码" + }, + [23110] = { + SkillName = "穿梭", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "快速射击周围400码的敌人【6】次,每次造成【150+威力值*60%】的伤害" + }, + [23120] = { + SkillName = "穿梭", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "快速射击周围400码的敌人【7】次,每次造成【150+威力值*90%】的伤害" + }, + [23130] = { + SkillName = "穿梭", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "快速射击周围400码的敌人【8】次,每次造成【150+威力值*120%】的伤害" + }, + [23140] = { + SkillName = "穿梭", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "快速射击周围400码的敌人【10】次,每次造成【150+威力值*150%】的伤害" + }, + [23210] = { + SkillName = "轰炸", + Quality = "初级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "每隔0.5秒轰炸周围400码8个敌人,每次造成【120+威力值*80%】的伤害,持续5秒" + }, + [23220] = { + SkillName = "轰炸", + Quality = "中级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "每隔0.5秒轰炸周围400码8个敌人,每次造成【120+威力值*110%】的伤害,持续5秒" + }, + [23230] = { + SkillName = "轰炸", + Quality = "高级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "每隔0.5秒轰炸周围400码8个敌人,每次造成【120+威力值*150%】的伤害,持续5秒" + }, + [23240] = { + SkillName = "轰炸", + Quality = "超级", + SkillSelectType = "选完角色后选择", + ColdDown = 35, + Cost = 40, + Desc = "每隔0.5秒轰炸周围400码8个敌人,每次造成【120+威力值*200%】的伤害,持续5秒" + } +} + +-- 武器的一些属性,都从这里面进行读取 +DropItemMap.WeaponTable = { + [EWeaponClassType.WT_Pistol] = { + ChineseName = "手枪", + EnglishName = "R1895", + Desc = "基础生长", + Prop = "射速%+30%,击败威力值+0.5", + Props = { + { Type = "射速%", Value = 0.3 }, + { Type = "击败威力值", Value = 2 }, + }, + PlusProps = {}, --成长属性 + Sign = '', + }, + [EWeaponClassType.WT_ShotGun] = { + ChineseName = "霰弹枪", + EnglishName = "S12K", + Desc = "影子猎手", + Text = "克制分身", + Prop = "对分身造成的伤害提升400%", + PlusProps = { + { Type = "射速%", Value = 0.3 }, + { Type = "射速%", Value = 0.45 }, + { Type = "射速%", Value = 0.7 }, + { Type = "射速%", Value = 1 } + }, + Sign = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_01.Icon_UGC_weapon_01'), + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/weaponUI/Frames/White/T_S12K.T_S12K'), + }, + [EWeaponClassType.WT_MachineGun] = { + ChineseName = "机枪", + EnglishName = "M249", + Desc = "护盾克星", + Text = "无视护盾", + Prop = "造成伤害时,无视敌人护盾", + PlusProps = { + { Type = "防御穿透%", Value = 0.1 }, + { Type = "防御穿透%", Value = 0.2 }, + { Type = "防御穿透%", Value = 0.3 }, + { Type = "防御穿透%", Value = 0.5 } + }, + Sign = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_03.Icon_UGC_weapon_03'), + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/weaponUI/Frames/White/T_M249.T_M249'), + }, + [EWeaponClassType.WT_SubmachineGun] = { + ChineseName = "冲锋枪", + EnglishName = "UZI", + Desc = "天神下凡", + Text = "免疫控制", + Prop = "免疫控制", + PlusProps = { + { Type = "威力值%", Value = 0.2 }, + { Type = "威力值%", Value = 0.4 }, + { Type = "威力值%", Value = 0.65 }, + { Type = "威力值%", Value = 1 } + }, + Sign = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_06.Icon_UGC_weapon_06'), + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/weaponUI/Frames/White/T_UZI.T_UZI'), + }, + [EWeaponClassType.WT_ShooterRifle] = { -- 只有这个是直接的值 + ChineseName = "射手步枪", + EnglishName = "SKS", + Desc = "残废断筋", + Text = "超级减速", + Prop = "对BOSS造成伤害时,降低敌人70%移动速度", + PlusProps = { + { Type = "射击距离", Value = 60 }, + { Type = "射击距离", Value = 100 }, + { Type = "射击距离", Value = 150 }, + { Type = "射击距离", Value = 200 } + }, + Sign = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_02.Icon_UGC_weapon_02'), + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/weaponUI/Frames/White/T_SKS.T_SKS'), + }, + [EWeaponClassType.WT_AssaultRifle] = { + ChineseName = "突击步枪", + EnglishName = "AKM", + Desc = "抑制回复", + Text = "抑制回复", + Prop = "对BOSS造成伤害时,敌人回血效果降低100%", + PlusProps = { + { Type = "射击伤害%", Value = 0.2 }, + { Type = "射击伤害%", Value = 0.4 }, + { Type = "射击伤害%", Value = 0.65 }, + { Type = "射击伤害%", Value = 1 } + }, + Sign = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_04.Icon_UGC_weapon_04'), + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/weaponUI/Frames/White/T_AKM.T_AKM'), + }, + [EWeaponClassType.WT_Sniper] = { + ChineseName = "狙击枪", + EnglishName = "AWM", + Desc = "伤害灌体", + Text = "无视防御", + Prop = "对BOSS造成伤害时,直接移除敌人的防御加成", + PlusProps = { + { Type = "暴击伤害%", Value = 0.3 }, + { Type = "暴击伤害%", Value = 0.6 }, + { Type = "暴击伤害%", Value = 1 }, + { Type = "暴击伤害%", Value = 1.5 } + }, + Sign = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/weapon_Icon/Textures/Icon_UGC_weapon_05.Icon_UGC_weapon_05'), + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/weaponUI/Frames/White/T_AWM.T_AWM'), + }, +} + +-- 这里面是存放着词条数据的执行方法 +-- 存放数据: +--- +---[PlayerKey] = { +--- [id] = { +--- Times = 0, +--- LastTime = ServerTime, +--- } +---} +--- +DropItemMap.SpecialFittingProperties = { + [12140] = { + { + Desc = '击败敌人提升50点威力值,持续5秒,可叠加25次', + Condition = '击败', -- 使用 Condition 进行类型区分 + Benefit = { + Type = "威力值", Value = 50, Unit = "", + }, + Times = 50, -- 当 == -1 的时候表示每秒执行 + ContinueTime = 5, -- 持续时间内没有续上的话,那就消失掉所有 + } + }, + [12240] = { + { + Desc = '击败敌人提升2%威力值加成%,持续5秒,可叠加50次', + Condition = '击败', + Benefit = { + Type = "威力值加成%", Value = 0.02, Unit = "%", + }, + Times = 50, -- 当 == -1 的时候表示每秒执行 + ContinueTime = 5, -- 持续时间内没有续上的话,那就消失掉所有 + }, + }, + [12340] = { + { + Desc = '击败敌人提升2%威力值加成%,持续5秒,可叠加50次', + Condition = '击败', + Benefit = { + Type = "生命值", Value = 250, Unit = "", + }, + Times = 50, -- 当 == -1 的时候表示每秒执行 + ContinueTime = 5, -- 持续时间内没有续上的话,那就消失掉所有 + }, + }, + [14640] = { + { + Desc = '击败敌人提升2%生命值加成%,持续10秒,可叠加50次', + Condition = '击败', + Benefit = { + Type = "生命值加成%", Value = 0.02, Unit = "%", + }, + Times = 50, -- 当 == -1 的时候表示每秒执行 + ContinueTime = 5, -- 持续时间内没有续上的话,那就消失掉所有 + } + }, + [12640] = { + { + Desc = '每次射击提升20点威力值,持续5秒,可叠加50次', + + Condition = '持续时间射击', -- 表示射击必能执行的操作 + Benefit = { + Type = "射击威力值", Value = 20, Unit = "", + }, + Times = 50, -- 叠加次数 + CoolDown = 0, -- 冷却时间 + ContinueTime = 5, -- 持续时间内没有续上的话,那就消失掉所有 + }, + }, + + [12440] = { + { + Desc = '每秒提升0.05%防御值加成%', + Condition = '每秒', + Benefit = { + Type = "防御值加成%", Value = 0.0005, Unit = "%", + }, + Times = math.maxinteger, -- 当 == -1 的时候表示每秒执行 + CoolDown = 0, -- 冷却时间 + ContinueTime = -1, -- 持续时间内没有续上的话,那就消失掉所有 + }, + }, + [12540] = { + { + Desc = '每秒提升0.05%生命值加成%', + Condition = '每秒', + Benefit = { + Type = "生命值加成%", Value = 0.0005, Unit = "%", + }, + Times = math.maxinteger, -- 当 == -1 的时候表示每秒执行 + CoolDown = 0, -- 冷却时间 + ContinueTime = -1, -- 持续时间内没有续上的话,那就消失掉所有 + }, + }, + + [11140] = { + { + Desc = '每射击5次,下次射击必定暴击', + Condition = '射击%', + Benefit = { + Type = '科技点', Value = 150, Unit = '' + }, + Probability = 20, + CoolDown = 0, -- 获得之后的冷却 + Times = 5 + 1, + }, + }, + [11240] = { + { + Desc = '射击有10%的概率进入极速状态,该状态下射速提升100%,持续5s', + Condition = '射击%', + Benefit = { + Type = '射速%', Value = 1, Unit = '' + }, + Probability = 10, + CoolDown = 5, -- 获得之后的冷却 + } + }, + [11340] = { + { + Desc = '每隔10秒,进入嗜血状态,该状态下汲取%达到100%,持续2秒', + Condition = '周期', + } + }, + [11440] = { + { + Desc = '每次射击有25%概率造成2次伤害', + Condition = '射击%', + Benefit = { + Type = '射击伤害%', Value = 100, Unit = '' + }, + Probability = 25, + CoolDown = 10, -- 获得之后的冷却 + } + }, + [13440] = { + { + Desc = '造成伤害提升1点防御穿透,最高75点', + Condition = '射击', + Benefit = { + Type = '防御穿透', Value = 1, Unit = '', + }, + Times = 75, + ContinueTime = 0, + } + }, + [14140] = { + { + Desc = '射击有5%的概率获得150点科技点,如成功获得科技点则进入10秒冷却期', + Condition = '射击%', + Benefit = { + Type = '科技点', Value = 150, Unit = '' + }, + Probability = 5, + CoolDown = 10, -- 获得之后的冷却 + Func = function(PlayerState) + PlayerState.KillPoint.Current = PlayerState.KillPoint.Current + 150 + end + } + }, + [14240] = { + { + Desc = '射击有5%概率使敌人防御值降低30%,持续5秒', + Condition = '射击%', + Benefit = { Type = '敌人减速', Value = 0.3, Unit = '' }, + Probability = 5, + CoolDown = 5, -- 获得之后的冷却 + } + }, + [14340] = { + { + Desc = '射击会造成5%威力值的射击伤害%', + Condition = '射击', + Benefit = { + Type = '射击伤害%', Value = 0.05, Unit = '%' + }, + + } + }, + [14440] = { + { + Desc = '射击有5%的概率获得5000金币,如成功获得金币则进入10秒冷却期', + Condition = '射击%', + Benefit = { + Type = '击败金币', Value = 5000, Unit = '' + }, + Probability = 5, + CoolDown = 10, -- 获得之后的冷却 + Func = function(PlayerState) + PlayerState.CoinPoint.Current = PlayerState.CoinPoint.Current + 5000 + end + } + }, + [14540] = { + { + Desc = '每1%的暴击伤害%加成会提高3%的射击伤害%', + Condition = '固定', + } + }, + [15240] = { + { + Desc = '每秒对自身200码范围内敌人造成自身最大生命值*5%的伤害', + Condition = '每秒', + } + }, + [15640] = { + { + Desc = "每1%的射击伤害%加成会提高3%的暴击伤害%", + Condition = '固定', + } + } +} + +-- 去掉文本中的 +function DropItemMap.ToText(InData) + local Text = '' + if InData.Unit == '' then + Text = InData.Type .. '+' .. tostring(InData.Value) .. InData.Unit + else + Text = string.gsub(InData.Type, '%%', '') + Text = Text .. '+' .. tostring(InData.Value * 100) .. InData.Unit + end + return Text +end diff --git a/GZJ/Script/Global/EffectTables.lua b/GZJ/Script/Global/EffectTables.lua new file mode 100644 index 00000000..fe9c9375 --- /dev/null +++ b/GZJ/Script/Global/EffectTables.lua @@ -0,0 +1,49 @@ +EffectTables = EffectTables or {} + +EffectTables.Paths = { + [1] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/01/P_Zhiliao_001.P_Zhiliao_001'), --治疗技能 + [2] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/02/P_Chongci_001.P_Chongci_001'), --冲刺技能 + [3] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/03/P_Nuyi_001.P_Nuyi_001'), --怒意技能 + [4] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/04/P_Yingsha_002.P_Yingsha_002'), --影杀技能 + [5] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/05/P_Zhanji_001.P_Zhanji_001'), --瞬击技能 + [6] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/06/P_Xuanyun_001.P_Xuanyun_001'), --眩晕技能1 + [7] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/06/P_Xuanyun_002.P_Xuanyun_002'), --眩晕技能2 + [8] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/07/P_Xuruo_001.P_Xuruo_001'), --虚脱技能 + [9] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/08/P_Chuantou_001.P_Chuantou_001'), --穿透技能 + [10] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/09/P_Fanji_001.P_Fanji_001'), --反击技能 + [11] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/10/P_Dianji_003.P_Dianji_003'), --电击技能 + [12] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/11/P_Xingluo_001.P_Xingluo_001'), --星落技能 + + [14] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/13/P_Lieji_001.P_Lieji_001'), --裂击技能 + [15] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/14/P_Ruodian_001.P_Ruodian_001'), --弱点技能 + [16] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/15/P_Suijia_001.P_Suijia_001'), --碎甲技能 + [17] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/16/P_Siwang_002.P_Siwang_002'), --死亡技能 + [18] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/17/P_Sihong_001.P_Sihong_001'), --嘶吼技能 + [19] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/18/P_Guangbo_001.P_Guangbo_001'), --光波技能 + [20] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/19/P_Bingshuang_001.P_Bingshuang_001'), --冰霜技能 + [21] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/20/P_Duyu_001.P_Duyu_001'), --滩涂技能 + [22] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/21/P_Chuanci_001.P_Chuanci_001'), --穿刺技能 + [23] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/22/P_Fengyin_001.P_Fengyin_001'), --封印技能 + [24] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/23/P_Sheling_001.P_Sheling_001'), --摄灵技能 + [25] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/24/P_Jianta_001.P_Jianta_001'), --践踏技能 + [26] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/25/P_Manyueji_001.P_Manyueji_001'), --跺击技能 + [27] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/26/P_Gangfeng_001.P_Gangfeng_001'), --罡风技能 + [28] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/27/P_Huoyu_001.P_Huoyu_001'), --火域技能 + [29] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/28/P_Penyong_001.P_Penyong_001'), --喷涌技能 + [30] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/29/P_Silie_001.P_Silie_001'), --撕裂技能 + [31] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/30/P_Bangji_001.P_Bangji_001'), --棒击技能 + [32] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/31/P_ChuanSuo_001.P_Chuansuo_001'), --穿梭技能1 + [33] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/31/P_Chuansuo_002.P_Chuansuo_002'), --穿梭技能2 + [34] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/32/P_Hongzha_001.P_Hongzha_001'), --轰炸技能 + + [35] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/64/P_Shengji_001.P_Shengji_001'), --升级特效 + [36] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/65/P_Tupochenggong_001.P_Tupochenggong_001'),--突破成功特效 + + ----射线专用 + [1001] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/12/P_Shexian_2.P_Shexian_2'), --射线技能V1 + [1002] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/12/P_Shexian_3.P_Shexian_3'), --射线技能V2 + [1003] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/12/P_Shexian_4.P_Shexian_4'), --射线技能V3 + [1004] = UGCGameSystem.GetUGCResourcesFullPath('Asset/FX/Particle/12/P_Shexian_001.P_Shexian_001'), --射线技能V4 +} + +return EffectTables; \ No newline at end of file diff --git a/GZJ/Script/Global/EventSystem.lua b/GZJ/Script/Global/EventSystem.lua new file mode 100644 index 00000000..3206bfdf --- /dev/null +++ b/GZJ/Script/Global/EventSystem.lua @@ -0,0 +1,108 @@ +EventSystem = EventSystem or {} + +EventSystem.Events = {} + +--添加监听 +function EventSystem:AddListener(EventType, Func, Object) + if EventType == nil or Func == nil then + UE.LogError("EventSystem:AddListener EventType or Func is nil!") + return + end + + local FuncData = {} + FuncData.Object = Object + FuncData.Func = Func + + if EventSystem.Events[EventType]==nil then + local NewEventFuncs={} + table.insert(NewEventFuncs ,FuncData) + EventSystem.Events[EventType] = NewEventFuncs + UE.Log("EventSystem:AddListener EventType[%s], Func[%s]", tostring(EventType), tostring(Func)) + else + table.insert(EventSystem.Events[EventType], FuncData) + UE.Log("EventSystem:AddListener EventType[%s], Func[%s]", tostring(EventType), tostring(Func)) + end +end + +--移除监听 +function EventSystem:RemoveListener(EventType, Func, Object) + if EventType == nil or Func == nil then + UE.LogError("EventSystem:RemoveListener EventType or Func is nil!") + return + end + local EventFuncs = EventSystem.Events[EventType] + if EventFuncs ~= nil then + for i, FuncData in pairs(EventFuncs) do + if FuncData.Func == Func and FuncData.Object == Object then + local result = table.removeKey(EventFuncs, i) + UE.Log("EventSystem:RemoveListener EventType[%s], Func[%s]", tostring(EventType), tostring(result)) + break + end + end + else + UE.Log("EventSystem:RemoveListener EventFuncs[%s] is nil!", tostring(EventType)) + end +end + +--派发事件 +function EventSystem:SendEvent(EventType, ...) + UE.Log("EventSystem:SendEvent self[%s], EventType[%s]", tostring(self), tostring(EventType)) + if EventType ~= nil then + local EventFuncs = EventSystem.Events[EventType]; + if EventFuncs ~= nil then + for i, FuncData in pairs(EventFuncs) do + if FuncData.Object ~= nil then + FuncData.Func(FuncData.Object, ...) + else + FuncData.Func(...) + end + end + else + UE.Log("EventSystem:SendEvent EventFuncs[%s] is nil!", tostring(EventType)) + end + end +end + +--- SetTimer +---@param Obj UObject +---@param Fun fun() +---@param IntevalSeconds float +---@return TimerHandle +function EventSystem.SetTimer(Obj, Fun, IntevalSeconds) + UE.Log("[Timer] 设置定时器 %s:%s", UE.GetPathName(Obj), tostring(Fun)) + local TimerDelegate = ObjectExtend.CreateDelegate(Obj, Fun, Obj) + local Handle = KismetSystemLibrary.K2_SetTimerDelegateForLua(TimerDelegate, Obj, IntevalSeconds, false) + local R = {} + R.Object = Obj + R.Handle = Handle + return R +end + +--- SetTimerLoop +---@param Obj UObject +---@param Fun fun() +---@param IntevalSeconds float +---@return TimerHandle +function EventSystem.SetTimerLoop(Obj, Fun, IntevalSeconds) + local TimerDelegate = ObjectExtend.CreateDelegate(Obj, Fun, Obj); + local Handle = KismetSystemLibrary.K2_SetTimerDelegateForLua(TimerDelegate, Obj, IntevalSeconds, true); + local R = {}; + R.Object = Obj; + R.Handle = Handle; + + UE.Log("[Timer] 设置循环定时器 %s:%s H:%s", UE.GetPathName(Obj), tostring(Fun), tostring(R)); + return R; +end + +--- StopTimer +---@param HandlePair TimerHandle +function EventSystem.StopTimer(HandlePair) + if HandlePair == nil then + assert(false, "[UGC][EventSystem.StopTimer] HandlePair is nil") + else + UE.Log("[Timer] 停止定时器 Object:%s Handle:%s", UE.GetPathName(HandlePair.Object), tostring(HandlePair.Handle)); + KismetSystemLibrary.K2_ClearTimerHandle(HandlePair.Object, HandlePair.Handle); + end +end + +return EventSystem \ No newline at end of file diff --git a/GZJ/Script/Global/Global.lua b/GZJ/Script/Global/Global.lua new file mode 100644 index 00000000..78a5fa42 --- /dev/null +++ b/GZJ/Script/Global/Global.lua @@ -0,0 +1,31 @@ +--Monster +require('Script.Global.Version') +require('Script.Blueprint.Monster.MonsterParam') +require('Script.Blueprint.Monster.MonsterDesc') + +require('Script.Global.Tables') +require('Script.Global.GlobalConfigs') +require('Script.Global.GlobalConsts') +require('Script.Global.GlobalFunctions') + +require('Script.Global.VectorHelper') +require('Script.Global.TableHelper') +require('Script.Global.CSVLoader') +require('Script.Global.EventSystem') +require('Script.Global.AsyncLoadTools') +require('Script.Global.NoticeTipsTools') + +require('Script.Manager.GameDataManager') +require('Script.Manager.UIManager') +require('Script.Manager.CommandQueneManager') +require('Script.Manager.SoundManager') +require('Script.Manager.NewPlayerGuideManager') +require('Script.Manager.GameEndManager') + +require('Script.Global.DropItemMap') +require('Script.Global.SealTables') +require('Script.Global.DropItemConfigTable') +require('Script.Global.InheritTable') +require('Script.Global.ArchiveTable') +require('Script.Global.LevelReward') + diff --git a/GZJ/Script/Global/GlobalConfigs.lua b/GZJ/Script/Global/GlobalConfigs.lua new file mode 100644 index 00000000..384a23ef --- /dev/null +++ b/GZJ/Script/Global/GlobalConfigs.lua @@ -0,0 +1,479 @@ +GlobalConfigs = GlobalConfigs or {} + +GlobalConfigs.OpenDebug = false + +GlobalConfigs.GameDifficulty = { + [1] = 1, + [2] = 2, + [3] = 3, +} + +GlobalConfigs.QualityColor = { + [1] = {R = 0.246201, G = 0.450786, B = 0.318547, A = 1.0}, + [2] = {R = 0.250158, G = 0.462077, B = 0.564712, A = 1.0}, + [3] = {R = 0.412543, G = 0.291771, B = 0.491021, A = 1.0}, + [4] = {R = 0.630757, G = 0.155926, B = 0.104616, A = 1.0}, +} + +-- 属性类型 +AttributeType = { + Base = 0, -- 基础人物属性 + Weapon = 1, --武器词条属性 + WeaponSpecial = 2, -- 武器特殊词条属性 +} + +GlobalConfigs.Attributes = { + --基础属性 + Base_MaxHP = { Value = 100000, Type = EAttributeDisplayType.Int }, --生命值 + Base_MaxEnergy = { Value = 100, Type = EAttributeDisplayType.Int }, --能量值 + Base_Attack = { Value = 100, Type = EAttributeDisplayType.Int }, --威力值 + Base_Defence = { Value = 2, Type = EAttributeDisplayType.Int }, --防御值 + Base_AttackSpeed = { Value = 1, Type = EAttributeDisplayType.Percent }, --射速% + Base_AttackIntervalReduction = { Value = 1, Type = EAttributeDisplayType.Int }, --射速频率 + Base_Vamp = { Value = 0, Type = EAttributeDisplayType.Percent }, --吸血% + Base_EvadeRate = { Value = 0, Type = EAttributeDisplayType.Percent }, --闪避% + Base_RecoverHP = { Value = 20, Type = EAttributeDisplayType.Int }, --生命值回复 + Base_RecoverEnergy = { Value = 4, Type = EAttributeDisplayType.Int }, --能量值回复 + Base_RecoverHPPercent = { Value = 0, Type = EAttributeDisplayType.Percent }, --生命值回复百分比% + Base_RecoverEnergyPercent = { Value = 0, Type = EAttributeDisplayType.Percent }, --能量值回复百分比% + Base_AttackRange = { Value = 0, Type = EAttributeDisplayType.Int }, --攻击距离 + Base_Toughness = { Value = 0, Type = EAttributeDisplayType.Percent }, --韧性% + Base_DamageReduction = { Value = 0, Type = EAttributeDisplayType.Int }, --受到伤害降低 + + --成长属性 + Growth_MaxHP = { Value = 0, Type = EAttributeDisplayType.Int }, --每秒生命值 + Growth_Attack = { Value = 0, Type = EAttributeDisplayType.Int }, --每秒威力值 + Growth_Kill_MaxHP = { Value = 0, Type = EAttributeDisplayType.Int }, --杀敌生命值 + Growth_Kill_Attack = { Value = 1, Type = EAttributeDisplayType.Int }, --杀敌威力值 + Growth_Fire_MaxHP = { Value = 0, Type = EAttributeDisplayType.Int }, --射击生命值 + Growth_Fire_Attack = { Value = 0, Type = EAttributeDisplayType.Int }, --射击威力值 + Growth_Kill_CoinPoint = { Value = 0, Type = EAttributeDisplayType.Int }, --杀敌金币 + Growth_KillPoint = { Value = 0, Type = EAttributeDisplayType.Int }, --每秒杀敌点 + + --高级属性 + Adv_CriticalAttackRate = { Value = 0, Type = EAttributeDisplayType.Percent }, --暴击概率% + Adv_CriticalAttack = { Value = 0.5, Type = EAttributeDisplayType.Percent }, --暴击伤害% + + Adv_FireAttack = { Value = 0, Type = EAttributeDisplayType.Percent }, --射击伤害% + Adv_AdditionalAttack = { Value = 0, Type = EAttributeDisplayType.Percent }, --附加伤害% + Adv_DefencePenetration = { Value = 0, Type = EAttributeDisplayType.Int }, --防御穿透值 + Adv_DefencePenetrationPercent = { Value = 0, Type = EAttributeDisplayType.Percent }, --防御穿透百分比% + Adv_FinalAttack = { Value = 0, Type = EAttributeDisplayType.Percent }, --最终伤害% + + --加成属性 + Bonus_MaxHP = { Value = 0, Type = EAttributeDisplayType.Percent }, --生命值加成% + Bonus_Attack = { Value = 0, Type = EAttributeDisplayType.Percent }, --威力值加成% + Bonus_FireAttack = { Value = 0, Type = EAttributeDisplayType.Percent }, --射击伤害加成% + Bonus_CriticalAttack = { Value = 0, Type = EAttributeDisplayType.Percent }, --暴击伤害加成% + Bonus_Defence = { Value = 0, Type = EAttributeDisplayType.Percent }, --防御加成% + Bonus_DamageReduction = { Value = 0, Type = EAttributeDisplayType.Percent }, --伤害减免加成% + + --经济属性 + Eco_CoinPoint = { Value = 0, Type = EAttributeDisplayType.Percent }, --金币加成% + Eco_KillPoint = { Value = 0, Type = EAttributeDisplayType.Percent }, --杀敌点加成% + Eco_Exp = { Value = 0, Type = EAttributeDisplayType.Percent }, --经验加成% + Eco_DropRate = { Value = 0, Type = EAttributeDisplayType.Percent }, --掉宝率加成% + Eco_HangupRoomMonsterNum = { Value = 0, Type = EAttributeDisplayType.Int }, --练功房怪物数量 + Eco_HangupRoomRefreshRate = { Value = 0, Type = EAttributeDisplayType.Int }, --练功房刷新效率% + + -- 增长的护甲 + Growth_Shield = { Value = 0, Type = EAttributeDisplayType.Percent }, --每10秒获得自身最大生命值的护盾 + Base_Shield = { Value = 0, Type = EAttributeDisplayType.Int }, --具体护盾值 + Base_ReboundDamage = { Value = 0, Type = EAttributeDisplayType.Int }, --反弹伤害 + Base_ReboundDamagePercent = { Value = 0, Type = EAttributeDisplayType.Percent }, --反弹伤害% + + -- 金币消耗,该值为负 + Unpacking_Cost = { Value = 0, Type = EAttributeDisplayType.Percent }, -- + Senior_Raffle_Cost = { Value = 0, Type = EAttributeDisplayType.Percent }, -- + Middle_Raffle_Cost = { Value = 0, Type = EAttributeDisplayType.Percent }, -- + Primary_Raffle_Cost = { Value = 0, Type = EAttributeDisplayType.Percent }, -- + Inherit_Cost = { Value = 0, Type = EAttributeDisplayType.Percent }, -- + KillPoint_Cost = { Value = 0, Type = EAttributeDisplayType.Percent }, -- +} + +-- 存档类型 +GlobalConfigs.ArchiveType = { + GameClearance = 0, + Credit = 1, + EasterEggs = 2, + Achievement = 3, +} + +-- 存档需要保存的数据 +GlobalConfigs.InitialValues = { + ["初始金币"] = "Init_Coin", + ["初始科技点"] = "Init_KillPoint", + ["初始经验"] = "Init_Exp", + ["初级配件"] = "Init_Primary_WeaponPart", + ["初级技能书"] = "Init_Primary_SkillBook", + ["中级技能书"] = "Init_Middle_SkillBook", + ["中级配件"] = "Init_Middle_WeaponPart", +} + +GlobalConfigs.AttributeNameTable = { + ["生命值"] = "Base_MaxHP", + ["能量值"] = "Base_MaxEnergy", + ["威力值"] = "Base_Attack", + ["防御值"] = "Base_Defence", + ["射速%"] = "Base_AttackSpeed", + ["射速频率"] = "Base_AttackIntervalReduction", + ["汲取%"] = "Base_Vamp", + ["闪避%"] = "Base_EvadeRate", + ["生命值回复/s"] = "Base_RecoverHP", + ["能量值回复/s"] = "Base_RecoverEnergy", + ["生命值回复%/s"] = "Base_RecoverHPPercent", + ["能量值回复%/s"] = "Base_RecoverEnergyPercent", + ["射击距离"] = "Base_AttackRange", + ["韧性%"] = "Base_Toughness", + ["受到伤害降低"] = "Base_DamageReduction", + ["每秒生命值"] = "Growth_MaxHP", + ["每秒威力值"] = "Growth_Attack", + ["击败生命值"] = "Growth_Kill_MaxHP", + ["击败威力值"] = "Growth_Kill_Attack", + ["射击生命值"] = "Growth_Fire_MaxHP", + ["射击威力值"] = "Growth_Fire_Attack", + ["击败金币"] = "Growth_Kill_CoinPoint", + ["每秒科技点"] = "Growth_KillPoint", + ["暴击概率%"] = "Adv_CriticalAttackRate", + ["暴击伤害%"] = "Adv_CriticalAttack", + ["射击伤害%"] = "Adv_FireAttack", + ["附加伤害%"] = "Adv_AdditionalAttack", + ["防御穿透"] = "Adv_DefencePenetration", + ["防御穿透%"] = "Adv_DefencePenetrationPercent", + ["最终伤害%"] = "Adv_FinalAttack", + ["生命值加成%"] = "Bonus_MaxHP", + ["威力值加成%"] = "Bonus_Attack", + ["射击伤害加成%"] = "Bonus_FireAttack", + ["暴击伤害加成%"] = "Bonus_CriticalAttack", + ["防御值加成%"] = "Bonus_Defence", + ["伤害减免%"] = "Bonus_DamageReduction", + ["金币加成%"] = "Eco_CoinPoint", + ["科技点加成%"] = "Eco_KillPoint", + ["经验加成%"] = "Eco_Exp", + ["掉宝率加成%"] = "Eco_DropRate", + ["练功房怪物数量"] = "Eco_HangupRoomMonsterNum", + ["练功房刷新效率%"] = "Eco_HangupRoomRefreshRate", + + ["每10秒获得自身最大生命值"] = "Growth_Shield", + ["护盾"] = "Base_Shield", + ["反弹伤害"] = "Base_ReboundDamage", + ["反弹伤害%"] = "Base_ReboundDamagePercent", + + -- 金币消耗 + ["开箱金币消耗"] = "Unpacking_Cost", + ["高级抽奖金币消耗"] = "Senior_Raffle_Cost", + ["中级抽奖金币消耗"] = "Middle_Raffle_Cost", + ["初级抽奖金币消耗"] = "Primary_Raffle_Cost", + ["属性购买金币消耗"] = "Inherit_Cost", + ["科技点兑换"] = "KillPoint_Cost", +} + +--玩家针对于怪物的属性 +GlobalConfigs.EnemyAttributeTable = { + ["敌人降低移速"] = "Base_Speed", + ["敌人降低回血"] = "Base_HPHeal", + ["敌人降低防御加成"] = "Base_Defence", + ["敌人移除护盾"] = "Base_Armor", +} + +--这个是对应Id的排序,通过ID可以找到类型,通过类型也可以找到ID +GlobalConfigs.AttributeIdMap = { + [1] = "生命值", + [2] = "威力值", + [3] = "射速%", + [4] = "汲取%", + [5] = "生命值回复/s", + [6] = "生命值回复%/s", + [7] = "射击距离", + [8] = "受到伤害降低", + [9] = "能量值", + [10] = "防御值", + [11] = "射速频率", + [12] = "闪避%", + [13] = "能量值回复/s", + [14] = "能量值回复%/s", + [15] = "韧性%", + [16] = "每秒生命值", + [17] = "击败生命值", + [18] = "射击生命值", + [19] = "击败金币", + [20] = "每秒威力值", + [21] = "击败威力值", + [22] = "射击威力值", + [23] = "每秒科技点", + [24] = "暴击概率%", + [25] = "射击伤害%", + [26] = "防御穿透", + [27] = "防御穿透%", + [28] = "暴击伤害%", + [29] = "附加伤害%", + [30] = "最终伤害%", + [31] = "生命值加成%", + [32] = "射击伤害加成%", + [33] = "防御值加成%", + [34] = "威力值加成%", + [35] = "暴击伤害加成%", + [36] = "伤害减免%", + [37] = "金币加成%", + [38] = "经验加成%", + [39] = "练功房怪物数量", + [40] = "科技点加成%", + [41] = "掉宝率加成%", + [42] = "练功房刷新效率%", + --[43] = "生命值成长*lv", + --[44] = "威力值成长*lv", + --[45] = "防御值成长*lv" +} + +GlobalConfigs.AttributeNameMap = { + ["生命值"] = 1, + ["威力值"] = 2, + ["射速%"] = 3, + ["汲取%"] = 4, + ["生命值回复/s"] = 5, + ["生命值回复%/s"] = 6, + ["射击距离"] = 7, + ["受到伤害降低"] = 8, + ["能量值"] = 9, + ["防御值"] = 10, + ["射速频率"] = 11, + ["闪避%"] = 12, + ["能量值回复/s"] = 13, + ["能量值回复/s"] = 14, + ["韧性%"] = 15, + ["每秒生命值"] = 16, + ["击败生命值"] = 17, + ["射击生命值"] = 18, + ["击败金币"] = 19, + ["每秒威力值"] = 20, + ["击败威力值"] = 21, + ["射击威力值"] = 22, + ["每秒科技点"] = 23, + ["暴击概率%"] = 24, + ["射击伤害%"] = 25, + ["防御穿透"] = 26, + ["防御穿透%"] = 27, + ["暴击伤害%"] = 28, + ["附加伤害%"] = 29, + ["最终伤害%"] = 30, + ["生命值加成%"] = 31, + ["射击伤害加成%"] = 32, + ["防御值加成%"] = 33, + ["威力值加成%"] = 34, + ["暴击伤害加成%"] = 35, + ["伤害减免%"] = 36, + ["金币加成%"] = 37, + ["经验加成%"] = 38, + ["练功房怪物数量"] = 39, + ["科技点加成%"] = 40, + ["掉宝率加成%"] = 41, + ["练功房刷新效率%"] = 42, + --["生命值成长*lv"] = 43, + --["威力值成长*lv"] = 44, + --["防御值成长*lv"] = 45 +} + +GlobalConfigs.SkillInfo = { + [ESkillName.Heal] = {Name = "回复", IconIndex = 32, Desc = "立即回复20%最大生命值和能量值并且回复40%已损生命值和能量值"}, + [ESkillName.Dash] = {Name = "冲刺", IconIndex = 4, Desc = "向前冲刺400码", ShortDesc = "位移"}, + [ESkillName.Anger] = {Name = "怒意", IconIndex = 19, Desc = "使用期间,造成伤害提升100%,不过受到伤害提升20%,持续8秒", ShortDesc = "伤害提升"}, + [ESkillName.ShadowKill] = {Name = "影击", IconIndex = 30, Desc = "移动速度提升50%,并且闪避%提升50%,持续8秒", ShortDesc = "闪避"}, + [ESkillName.Slash] = {Name = "瞬击", IconIndex = 31, Desc = "立即对周围300码的有敌人造成自身最大生命值10%的真实伤害", ShortDesc = "瞬击血量"}, + [ESkillName.Stun] = {Name = "眩晕", IconIndex = 29, Desc = "眩晕周围300码所有敌人,持续3秒", ShortDesc = "眩晕"}, + [ESkillName.Exhaust] = {Name = "虚弱", IconIndex = 28, Desc = "使周围300码的所有敌人受到伤害提升30%,持续8秒", ShortDesc = "射击易伤"}, + [ESkillName.Penetration] = {Name = "穿透", IconIndex = 7, Desc = "开启期间,造成伤害均为真实伤害,持续8秒", ShortDesc = "真伤"}, + [ESkillName.Counter] = {Name = "反击", IconIndex = 11, Desc = "受到伤害时有【10%/12%/15%/20%】概率对附近300码所有敌方单位造成【200+自身最大生命值*5%/8%/12%/18%】伤害"}, + [ESkillName.ElectricShock] = {Name = "电击", IconIndex = 8, Desc = "射击时有【10%/12%/15%/20%】概率对周围随机目标造成【200+威力值*200%/320%/480%/720%】的伤害,最多5个目标"}, + [ESkillName.StarFall] = {Name = "星落", IconIndex = 27, Desc = "每3秒降下星火,对周围200码随机敌人造成【240+威力值*36%/48%/63%/90%】的伤害,最多【2/3/4/5】个目标"}, + [ESkillName.Ray] = {Name = "射线", IconIndex = 22, Desc = "每次射击朝前方发射3条间隔30°的射线,对直线上的敌人造成【100+威力值*10%/20%/30%/40%】的伤害,射线长度为1000码"}, + [ESkillName.Crack] = {Name = "裂击", IconIndex = 18, Desc = "每次射击会额外对【1/2/3/4】个目标造成本次伤害的25%"}, + [ESkillName.Weaken] = {Name = "弱点", IconIndex = 21, Desc = "每次射击会使敌人受到伤害提升1%/2%/3%/5%,持续5秒,可无限叠加"}, + [ESkillName.Scabbing] = {Name = "碎甲", IconIndex = 26, Desc = "每次射击会降低敌人5/10/15/25点防御值,持续5秒,可无限叠加"}, + [ESkillName.DeathStrike] = {Name = "瞬打", IconIndex = 25, Desc = "对敌人造成致命一击,立即造成【400+威力值*600%/800%/1000%/1500%】的伤害"}, + [ESkillName.Roar] = {Name = "嘶吼", IconIndex = 24, Desc = "痛苦嘶叫,对周围400码范围所有敌人造成【200+威力值*250%/320%/420%/550%】的伤害"}, + [ESkillName.LightWave] = {Name = "光波", IconIndex = 13, Desc = "向正前方释放一道光波,对直线上的敌人造成【250+威力值*300%/420%/560%/760%】的伤害"}, + [ESkillName.IceFrost] = {Name = "冰霜", IconIndex = 3, Desc = "最近的怪物脚下释放400码范围的冰霜,区域内所有敌人受到【100+威力值*200%/300%/400%/500%】的伤害,移动速度降低20%/30%/40%/50%,持续3秒"}, + [ESkillName.ToxicRain] = {Name = "滩涂", IconIndex = 9, Desc = "最近的怪物脚下释放300码范围的滩涂,区域内所有敌人每秒受到【120+威力值*120%/180%/240%/300%】的伤害,防御值降低5%/10%/15%/25%,持续3秒"}, + [ESkillName.Puncture] = {Name = "穿刺", IconIndex = 5, Desc = "释放穿刺,对直接上的敌人造成【150+威力值*150%/250%/350%/500%】的伤害,并眩晕2/2.2/2.5/3秒"}, + [ESkillName.Seal] = {Name = "封印", IconIndex = 12, Desc = "最近的怪物脚下释放300码范围的封印,区域内所有敌人受到【120+威力值*200%/260%/320%/400%】的伤害,1.5/1.8/2.1/2.5秒内无法动弹"}, + [ESkillName.AbsorbSoul] = {Name = "摄灵", IconIndex = 1, Desc = "对周围400码内敌人造成【180+威力值150%/250%/350%/450%】的伤害,并回复造成伤害对应的生命值"}, + [ESkillName.Tread] = {Name = "践踏", IconIndex = 16, Desc = "猛踩地面,对周围300码范围的敌人造成【180+威力值*150%/200%/250%/300%】的伤害,并眩晕1/1.2/1.4/2秒"}, + [ESkillName.Stomp] = {Name = "跺击", IconIndex = 10, Desc = "跺击地面,对周围500码范围内敌人造成【100+威力值*180%/220%/280%/350%】的伤害,并降低其50%移动速度,持续5秒"}, + [ESkillName.StrongWind] = {Name = "罡风", IconIndex = 17, Desc = "转动自身的身体形成罡风,每秒对周围300码范围的敌人造成【80+威力值*15%/22%/30%/40%】的伤害,自身移动速度提升50%,持续5/6/7/8秒"}, + [ESkillName.FireDomain] = {Name = "火域", IconIndex = 15, Desc = "向前方喷射一道400码范围扇形的火焰,并残留一个持续3秒的火域,对敌人造成【140+威力值*150%/220%/320%/450%】的伤害,处于火域中的敌人每秒会受到200/400/600/800点伤害"}, + [ESkillName.Flowing] = {Name = "喷涌", IconIndex = 20, Desc = "每秒向周身随机角度喷射一道宽200码,长800码的水波,对命中敌人造成【攻击力*100%/120%/150%/200%】的伤害,并使其3秒内防御降低10%/15%/20%/30%,水波持续3秒"}, + [ESkillName.Tear] = {Name = "撕裂", IconIndex = 23, Desc = "撕裂最近的敌人,每秒受到【100+威力值*200%/250%/320%/400%】的伤害,并使其受到伤害提升30%,持续5秒"}, + [ESkillName.StickStrike] = {Name = "棒击", IconIndex = 2, Desc = "向正前方释放棒击大地,对一条直线上的敌人敌人造成【威力值*500%/700%/900%/1200%】的暴击伤害,并眩晕1秒,直线长度1000码"}, + [ESkillName.Shuttle] = {Name = "穿梭", IconIndex = 6, Desc = "快速射击周围400码的敌人【6/7/8/10】次,每次造成【150+威力值*60%/90%/120%/150%】的伤害"}, + [ESkillName.Bombing] = {Name = "轰炸", IconIndex = 14, Desc = "每隔0.5秒轰炸周围400码8个敌人,每次造成【120+威力值*80%/110%/150%/200%】的伤害,持续5秒"}, +} + +-- 天赋类型 +GlobalConfigs.ETalentType = { + Damage = "伤害", + Function = "功能", + Survival = "生存", +} + +-- 技能天赋类型 +GlobalConfigs.SkillTalent = { + [ESkillName.Dash] = { Talent = GlobalConfigs.ETalentType.Function, }, + [ESkillName.Anger] = { Talent = GlobalConfigs.ETalentType.Damage, }, + [ESkillName.ShadowKill] = { Talent = GlobalConfigs.ETalentType.Survival, }, + [ESkillName.Slash] = { Talent = GlobalConfigs.ETalentType.Damage, }, + [ESkillName.Stun] = { Talent = GlobalConfigs.ETalentType.Function, }, + [ESkillName.Exhaust] = { Talent = GlobalConfigs.ETalentType.Damage, }, + [ESkillName.Penetration] = { Talent = GlobalConfigs.ETalentType.Damage, }, +} + +--- 玩家人数不同影响首领生命值的系数 +--- @type table +GlobalConfigs.PlayerNumMultiplier = { + [1] = 1, + [2] = 2, + [3] = 4, + [4] = 6, +} + +--- 难度不同影响怪物生命值和攻击力的系数 +--- @type table +GlobalConfigs.DifficultyMultiplier = { + ["Health"] = { + [1] = 1, + [2] = 1, + [3] = 2, + [4] = 3.5, + [5] = 5.5, + [6] = 8, + [7] = 11, + [8] = 14.5, + [9] = 18.5, + [10] = 23, + [11] = 28, + [12] = 33.5, + [13] = 39.5, + [14] = 46, + [15] = 53, + [16] = 60.5, + [17] = 68.5, + [18] = 77, + [19] = 86, + [20] = 95.5, + [21] = 105.5, + [22] = 116, + [23] = 127, + [24] = 138.5, + [25] = 150.5, + [26] = 163, + [27] = 176, + [28] = 189.5, + [29] = 203.5, + [30] = 218, + [31] = 233, + [32] = 248.5, + [33] = 264.5, + [34] = 281, + [35] = 298, + [36] = 315.5, + [37] = 333.5, + [38] = 352, + [39] = 371, + [40] = 390.5, + [41] = 410.5, + [42] = 431, + [43] = 452, + [44] = 473.5, + [45] = 495.5, + [46] = 518, + [47] = 541, + [48] = 564.5, + [49] = 588.5, + [50] = 613, + [51] = 638, + [52] = 663.5, + [53] = 689.5, + [54] = 716, + [55] = 743, + [56] = 770.5, + [57] = 798.5, + [58] = 827, + [59] = 856, + [60] = 885.5, + [61] = 915.5, + [62] = 946, + [63] = 977, + [64] = 1008.5, + [65] = 1040.5, + [66] = 1073, + }, + ["Attack"] = { + [1] = 1, + [2] = 1, + [3] = 1.15, + [4] = 1.3, + [5] = 1.5, + [6] = 1.75, + [7] = 2.05, + [8] = 2.4, + [9] = 2.8, + [10] = 3.25, + [11] = 3.75, + [12] = 4.3, + [13] = 4.9, + [14] = 5.55, + [15] = 6.25, + [16] = 7, + [17] = 7.8, + [18] = 8.65, + [19] = 9.55, + [20] = 10.5, + [21] = 11.5, + [22] = 12.55, + [23] = 13.65, + [24] = 14.8, + [25] = 16, + [26] = 17.25, + [27] = 18.55, + [28] = 19.9, + [29] = 21.3, + [30] = 22.75, + [31] = 24.25, + [32] = 25.8, + [33] = 27.4, + [34] = 29.05, + [35] = 30.75, + [36] = 32.5, + [37] = 34.3, + [38] = 36.15, + [39] = 38.05, + [40] = 40, + [41] = 42, + [42] = 44.05, + [43] = 46.15, + [44] = 48.3, + [45] = 50.5, + [46] = 52.75, + [47] = 55.05, + [48] = 57.4, + [49] = 59.8, + [50] = 62.25, + [51] = 64.75, + [52] = 67.3, + [53] = 69.9, + [54] = 72.55, + [55] = 75.25, + [56] = 78, + [57] = 80.8, + [58] = 83.65, + [59] = 86.55, + [60] = 89.5, + [61] = 92.5, + [62] = 95.55, + [63] = 98.65, + [64] = 101.8, + [65] = 105, + [66] = 108.25, + }, +} + +return GlobalConfigs; \ No newline at end of file diff --git a/GZJ/Script/Global/GlobalConsts.lua b/GZJ/Script/Global/GlobalConsts.lua new file mode 100644 index 00000000..3829ab0d --- /dev/null +++ b/GZJ/Script/Global/GlobalConsts.lua @@ -0,0 +1,173 @@ +--[[ + 这里用于保存一些全局的常量 +--]] +_G.Delegate = require("common.Delegate") + +_G.UIRoot = { + BattleRoot = 1, + BattleGuideRoot = 2, + BattleNoticeRoot = 3, + MiddleRoot = 4, + CommonRoot = 5, + CommonGuideRoot = 6, + CommonNoticeRoot = 7, + GeneralGuideRoot = 8, + SettlementRoot = 9, +} + +_G.UIClassPath = { + MainUI = "Asset/UI/WBP_MainUI.WBP_MainUI_C", + TeamPanelItem = "Asset/UI/WBP_TeamPanel_Item.WBP_TeamPanel_Item_C", + SkillItem = "Asset/UI/WBP_Skill_Item.WBP_Skill_Item_C", + Bag_FittingItem = "Asset/UI/ChildWidgets/WBP_FittingItem.WBP_FittingItem_C", + Bag_WeaponItem = "Asset/UI/ChildWidgets/WBP_BagWeaponItem.WBP_BagWeaponItem_C", +} + +_G.BPClassPath = { + --------for FlushLoad + MonsterBase = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterBase.BP_MonsterBase_C'), + PlayerPawn = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Player/BP_PlayerPawn.BP_PlayerPawn_C'), + MonsterSpawner = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/SceneObject/BP_MonsterSpawner.BP_MonsterSpawner_C'), + Teleporter = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/SceneObject/BP_Teleporter.BP_Teleporter_C'), + Crystal = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/SceneObject/BP_Crystal.BP_Crystal_C'), + Weapon = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Weapon/BP_WeaponPawnBase.BP_WeaponPawnBase_C'), + MonsterBoss = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterBoss.BP_MonsterBoss_C'), + HangupRoomMonster = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterExerciseRoom.BP_MonsterExerciseRoom_C'), + PlayerStart = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/UGCPlayerStart.UGCPlayerStart_C'), + PickupItemClass = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Item/BP_ItemActorBase.BP_ItemActorBase_C'), + + --------for AsyncLoad + CustomCameraActor = "Asset/Blueprint/UGCPlayerCamera.UGCPlayerCamera_C", + WeaponBaseActor = "Asset/Blueprint/Weapon/BP_WeaponPawnBase.BP_WeaponPawnBase_C", +} + +_G.TablePath = { + WeaponConstructInfo = UGCGameSystem.GetUGCResourcesFullPath('Asset/CSV/WeaponConstructTable.WeaponConstructTable'), +} + +_G.EventType = { + + OnGameStageChanged = 10, + OnWaitPlayerJoinTimeChanged = 11, + OnIsInAttackWaveChanged = 12, + OnCurAttackWaveChanged = 13, + OnGameReadyStageRemainTimeChanged = 14, + OnGameFightStageRemainTimeChanged = 15, + OnSendGameEnd = 16, + + + --------------------------------Server & Client------------------------------------------- + NewRoundStart = 101, + RoundEnd = 102, + GameEnd = 103, + ExitGame = 104, + + PlayerDataListChanged = 201, + PlayerDifficultySelectionChanged = 202, + + + PlayerBuyTechSucceed = 304, + --------------------------------Only Server----------------------------------------------- + PlayerPawnInArenaChanged = 401, + SpawnDropItem = 402, + SpawnDropItemByID = 403, + UpdateWeaponAttribute = 404, -- 武器属性更新完成,需要重新调用一遍更新玩家属性 + OnCrystalHPReachedZero = 405, -- 水晶死亡 + + -- 武器 + RefreshShoot = 406, -- 刷新射击速率 + UpdateWeapon = 407, -- 刷新武器,在武器配件有更新的时候进行刷新 + SelectedWeapon = 408, -- 选择武器的时候进行刷新 + + ServerOnLevelAndExpChanged = 409, + ServerOnCombatPointChanged = 410, + + PlayerPawnDead = 411, -- 玩家死亡 DeadPlayerKey, Killer + + SendPlayersToExercise = 412, -- 传送到休息室 + + --------------------------------Only Client----------------------------------------------- + CurrentRoundChange = 501, + + RequestPickup = 502, + + PlayerCoinPointChanged = 601, + PlayerKillPointChanged = 602, + PlayerSkillMappingChanged = 603, + PlayerSkillCDTriggered = 604, + OnSetupSkillButton = 605, + PlayerInheritItemsChanged = 606, + + PlayerPawnInitialized_Client = 701, + PlayerStateInitialized_Client = 702, + PlayerControllerInitialized_Client = 703, + ClientUpdateWeapon = 704, + + AsyncLoadWeaponMeshesCompleted = 804, + AsyncLoadWeaponIconsCompleted = 805, + AsyncLoadSkillIconsCompleted = 807, + AsyncLoadSkillEffectsCompleted = 810, + + AttackRangeChanged = 808, + + ChangeBossList = 809, + + --------------------------------UI-------------------------------------------------------- + RequestShowPanel = 901, + RequestClosePanel = 902, + + ShowNotice = 903, + ShowRollingNotice = 904, + + OnWidgetShowed = 905, + OnWidgetClosed = 906, + + OnPlayerExpChanged = 811, + OnPlayerLevelChanged = 812, + OnPlayerHPChanged = 813, + OnPlayerEnergyChanged = 814, + + ToggleBreachButton = 815, + + OnPlayerBaseAttackValueChanged = 820, + OnPlayerCombatPointChanged = 816, + OnPlayerAttributeChanged = 817, + OnPlayerDamageChanged = 818, + OnCrystalHPChanged = 819, + + ShowGeneralSlideWidget = 821, + SendGeneralSlideNum = 822, + BagOperation = 823, + CancelBagOperation = 824, + SelectedItem = 825, + ShowItemDescribe = 826, + ClickTitle = 827, + UpdateItemList = 828, + CloseGenerateItem = 829, + + + UpdateAllWeapon = 831, + ClickFittingItem = 833, + AttributeChanged = 834, + ShowSealButton = 835, + UnpackingResult = 836, + RefreshWeapons = 837, + + UpdateBossInfoToWidget = 841, + + OnResourceGradeChanged = 842, + + UpdateStones = 843, + UpdateInitialWidget = 844, + + OnGameDurationChanged = 845, + + --------------------------------强引导相关-------------------------------------------------------- + + ForceGuide_OnGuideTriggered = 8998, + ForceGuide_OnGuideFinished = 8999, + ForceGuide_TechBuy = 9001, + + --------------------------------GM相关-------------------------------------------------------- + GM_TimeScale = 500001, +} \ No newline at end of file diff --git a/GZJ/Script/Global/GlobalFunctions.lua b/GZJ/Script/Global/GlobalFunctions.lua new file mode 100644 index 00000000..f80622a9 --- /dev/null +++ b/GZJ/Script/Global/GlobalFunctions.lua @@ -0,0 +1,670 @@ +GlobalFunctions = GlobalFunctions or {} + +GlobalFunctions.IsServer = nil +GlobalFunctions.IsShipping = nil + +function UE.LogTag() + if GlobalFunctions.IsServer == nil then + GlobalFunctions.IsServer = UGCGameSystem.IsServer() + end + + local LogStr = "[UGCLog]" + if GlobalFunctions.IsServer == true then + LogStr = LogStr .. "[Server]" + else + LogStr = LogStr .. "[Client]" + end + + if GameDataManager and UE.IsValid(GameDataManager.GetLocalPlayerState()) then + LogStr = LogStr .. "[" .. GameDataManager.GetLocalPlayerState().PlayerKey .. "]" + end + + return LogStr +end + +function UE.Print(Log) + print(Log) +end + +function UE.Log(Fmt, ...) + local LogStr = UE.LogTag()..string.format(Fmt, ...) + UE.Print(LogStr) +end + +function UE.LogError(Fmt, ...) + local LogStr = UE.LogTag().."[Error]"..string.format(Fmt, ...) + UE.Print(LogStr) +end + +function UE.LogUGC(Fmt, ...) + local LogStr = UE.LogTag()..string.format(Fmt, ...) + ugcprint(LogStr) +end + + +function GlobalFunctions.GetAttributeDisplayType(InAttributeName) + for Name, Config in pairs(GlobalConfigs.Attributes) do + if Name == InAttributeName then + return Config.Type + end + end + + return EAttributeDisplayType.Int +end + +---获取武器蓝图路径 +---@return WeaponClassPath string @蓝图路径 +---@param ID int +function GlobalFunctions.GetWeaponClassPath(ID) + local WeaponData = Tables.Weapon[ID] + if WeaponData ~= nil then + return WeaponData.ClassPath + end + return nil +end + +---获取武器名称 +---@return WeaponName string @武器名称 +---@param ID int +function GlobalFunctions.GetWeaponName(ID) + local WeaponData = Tables.Weapon[ID] + if WeaponData ~= nil then + return WeaponData.WeaponName + end + return nil +end + +---发送自定义Action +---生效范围:S +---@param EventName string @事件名称 +---@param EventWaitTime int @事件等待时间 +function GlobalFunctions.SendEventNextSecond(EventName, EventWaitTime) + if EventName == "" then + UE.Log("[GlobalFunctions.SendEventNextSecond] Not SendEvent") + return + end + + local GameState = UGCGameSystem.GameState + if not GameState then + return + end + if GameState.ActionHandles == nil then + GameState.ActionHandles = {} + GameState.ActionHandleIndex = 0 + end + + GameState.ActionHandleIndex = GameState.ActionHandleIndex + 1 + local HandleIndex = GameState.ActionHandleIndex + + UE.Log("[GlobalFunctions.SendEventNextSecond] SendEvent: %s, WaitTime: %s", EventName, tostring(EventWaitTime)) + + local ActionHandle = { + Delegate = nil, + Timer = nil, + } + + ActionHandle.Delegate = ObjectExtend.CreateDelegate(GameState, + function() + if type(EventWaitTime) == "number" and EventWaitTime > 0 then + UGCGameSystem.SendModeCustomEvent(EventName, EventWaitTime) + else + UGCGameSystem.SendModeCustomEvent(EventName) + end + + if GameState.ActionHandles[HandleIndex] and GameState.ActionHandles[HandleIndex].Delegate then + ObjectExtend.DestroyDelegate(GameState.ActionHandles[HandleIndex].Delegate) + GameState.ActionHandles[HandleIndex].Delegate = nil + end + + if GameState.ActionHandles[HandleIndex] and GameState.ActionHandles[HandleIndex].Timer then + KismetSystemLibrary.K2_ClearTimerHandle(GameState, GameState.ActionHandles[HandleIndex].Timer) + GameState.ActionHandles[HandleIndex].Timer = nil + end + + GameState.ActionHandles[HandleIndex] = nil + end) + + ActionHandle.Timer = KismetSystemLibrary.K2_SetTimerDelegateForLua(ActionHandle.Delegate, GameState, 1, false) + GameState.ActionHandles[HandleIndex] = ActionHandle +end + +------------------------------------------------------------------------------------ +local RootPackagePath = UGCMapInfoLib.GetRootLongPackagePath() + +function GetFullPath(InPath) + if type(InPath) ~= "string" then + return "" + end + + if #RootPackagePath > #InPath or string.sub(InPath, 1, #RootPackagePath) ~= RootPackagePath then + InPath = RootPackagePath..InPath + end + + return InPath +end + + +------------------------------------------------------------------------------------ + +---获取表元素个数 +function table.getCount(t) + if type(t) ~= "table" then + return -1 + end + local Length = 0 + for i, v in pairs(t) do + Length = Length + 1 + end + return Length +end + +---获取表中所有的Key +function table.getKeys(t) + if type(t) ~= "table" then + return {} + end + local keys = {} + for k,v in pairs(t) do + keys[#keys + 1] = k + end + return keys +end + +---获取对应元素的Index +function table.getIndex(t, v) + if type(t) ~= "table" then + return nil + end + for index, value in pairs(t) do + if value == v then + return index + end + end + return nil +end + +---获取表中是否有对应Key +function table.hasKey(t, k) + if type(t) ~= "table" then + return false + end + for key, value in pairs(t) do + if k == key then + return true + end + end + return false +end + +---按Key删除表中元素 +function table.removeKey(t, k) + if t == nil then + return nil + end + local v = t[k] + t[k] = nil + return v +end + +---获取表中是否有对应的Value +function table.hasValue(t, value) + if t == nil then return false end + for k, v in pairs(t) do + if v == value then + return true + end + end + return false +end + +---按Value删除表中元素 +function table.removeValue(t, value, removeAll) + local deleteNum = 0 + local i = 1 + local max = table.getCount(t) + + while i <= max do + if t[i] == value then + table.remove(t,i) + deleteNum = deleteNum + 1 + i = i - 1 + max = max - 1 + if not removeAll then break end + end + i = i + 1 + end + return deleteNum +end + +---返回是否是空表 +function table.isEmpty(t) + if type(t) ~= "table" then + return true + end + return next(t) == nil +end + +function table.Swap(t, i, j) + if type(t) ~= "table" then + return + end + local temp = t[i] + t[i] = t[j] + t[j] = temp +end + +-- 针对 t1, t2 做插值,注意:t1 是 t2 的子集 +function table.Diff(t1, t2) + local val = {} + for i, v in pairs(t2) do + if t1[i] == nil then + val[i] = v + end + end + return val +end + +--- table随机(洗牌算法) +function table.Rand(t) + if type(t) ~= "table" then + return false + end + for i = 1, #t - 1 do + local SwapIndex = math.random(i + 1, #t) + table.Swap(t, i, SwapIndex) + end +end + +---@param header string +---@param tbl table +---@param maxIndent integer +---❉ 递归打印table,默认并且最多支持打印5层Table嵌套 +function table.print(header, tbl, maxIndent) + local logFunc = UE.Log + local maxIndent = maxIndent or 5 + maxIndent = math.max(1,maxIndent) + maxIndent = math.min(5,maxIndent) + if tbl == nil or type(tbl) ~= 'table' then + logFunc("table.print input arg is not a table type!") + return + end + + logFunc(header) + logFunc("========= content of table(\"" .. tostring(tbl) .."\") ===========") + + local function printInternal(t, prevKey, indent) + local indent = indent + if indent > maxIndent then + logFunc(prevKey .. "Over " .. maxIndent .." indents,omit print...") + return + end + for key, value in pairs(t) do + local printKey = prevKey .. "." .. tostring(key) + logFunc(printKey .. " = " .. tostring(value)) + if key ~= "_outer" and type(value) == 'table' then + if next(value) == nil then + logFunc(printKey .. " = " .. "{ }") + else + printInternal(value, printKey, indent + 1) + end + end + end + end + printInternal(tbl, "", 0) +end + + +---clamp +---@param v number @number +---@param Min number @min +---@param Max number @max +---@return number @clamp v between Min and Max +function math.clamp(v, Min, Max) + Min = math.min(Min, Max) + Max = math.max(Min, Max) + if v < Min then + return Min + end + if v > Max then + return Max + end + return v +end + +---clamp +---@param a number @First number to compare +---@param b number @Second number to compare +---@param Tolerance number @Maximum allowed difference for considering them as 'nearly equal' +---@return boolean @true if a and b are nearly equal +function math.isNearlyEqual(a, b, Tolerance) + if Tolerance == nil then + Tolerance = 0.01 + end + return math.abs(a - b) <= Tolerance +end + +--- @param n integer 正整数 +function math.pow(x, n) + local val = x + for i = 1, n do + val = val * val + end + return val +end + +---字符串分割 +function string.split(InStr, sep) + local sep, fields = sep or "\t",{} + local pattern = string.format("([^%s]+)", sep) + InStr:gsub(pattern, function(c) fields[#fields+1] = c end) + return fields +end + +---字符串直接转Number +function string.splitToNumber(InStr, sep) + local sep, fields = sep or "\t",{} + local pattern = string.format("([^%s]+)", sep) + InStr:gsub(pattern, function(c) fields[#fields+1] = tonumber(c) end) + return fields +end + +---------------------------------For Items--------------------------------- +---11111 +---对于武器配件来说 +---第一位:大类 1 +---第二位:物品类型 1~5 +---第三位:所属武器类型 1~6 +---第四位:物品品质 1~4 +---第五位:物品伤害类型 0 +--- +---对于技能书来说 +---第一位:大类 2 +---第二、三位:技能类型 01~99 +---第四位:品质 1~4 +---第五位:伤害类型 0 +--- +---对于石头来说 +---第一位:大类 3 +---第二位:具体分类 1~2 +---第三四五位:保留字段 000 +--- +---以下是武器配件的方法 +---获取品质,对应 Tables.QualityInfo +function GetItemQualityLevel(InItemId) + return (InItemId // 10) % 10 - 1 +end + +---获取物品所属武器类型,注意第一个是手枪,因此不需要 - 1 +function GetItemWeaponTypeByItemId(InItemId) + return (InItemId // 100) % 10 +end + +---获取物品类型,此处返回的是 1-5,如果要对应 Enum,需要再 - 1 +function GetItemTypeByItemId(InItemId) + local val = InItemId // 10000 -- 对应的是 EItemType + if val == 1 then + return (InItemId // 1000) % 10 - 1 + elseif val == 2 then + return EItemType.SkillBook + elseif val == 3 then + if InItemId // 1000 == 31 then + return EItemType.ScouringStone + elseif InItemId // 1000 == 32 then + return EItemType.SubstituteStone + end + end + print(string.format("[GetItemTypeByItemId] 此时 ItemId 有问题,ItemId = %d", InItemId)) +end + +function GetSkillIdByItemId(InItemId) + if InItemId < 20000 or InItemId > 29999 then + return nil + end + return InItemId % 10000 // 100 +end + +---获取物品大类,都是对应 Enum: EDropItemSet +function GetItemGrantTypeById(InItemId) + return (InItemId // 10000) - 1 +end + +function GetItemDamageTypeByItemId(InItemId) + return (InItemId % 10) +end + +function IsWeaponPartItem(InItemId) + if InItemId == nil then + return false + end + local Id = InItemId // 10000 + return Id == EDropItemSet.WeaponParts + 1 +end + +function IsSkillBookItem(InItemData) + local Id = InItemData.ItemID // 10000 + return Id == EDropItemSet.SkillBooks + 1 +end + +function IsStoneItem(InItemData) + local Id = InItemData.ItemID // 10000 + return Id == EDropItemSet.Stones + 1 +end + +function GenerateSkillBookData(SkillType) + local RateTable = { + [1] = {Min = 1, Max = 85}, + [2] = {Min = 86, Max = 98}, + [3] = {Min = 99, Max = 100}, + } + local Rand = math.random(1, 100) + local ResultQuality = -1 + for Quality, Rates in pairs(RateTable) do + if Rand >= Rates.Min and Rand <= Rates.Max then + ResultQuality = Quality + break + end + end + + local StartSkillName = ESkillName.Counter + local EndSkillName = ESkillName.Bombing + + if SkillType ~= nil then --刷出制定类型的技能(主动/被动) + if SkillType == ESkillType.Passive then + EndSkillName = ESkillName.Scabbing + elseif SkillType == ESkillType.Active then + StartSkillName = ESkillName.DeathStrike + end + end + + local SkillNamePool = {} + for i = StartSkillName, EndSkillName do + table.insert(SkillNamePool, i) + end + + local ResultSkillName = SkillNamePool[math.random(1, #SkillNamePool)] + + local ItemData = { + -- 此处需要修改,中间两位是具体生成的 + ItemID = 20000 + ResultQuality * 10 + ResultSkillName * 100, + ItemType = EItemType.SkillBook, + Quality = ResultQuality, + Count = 1, + } + UE.Log("DropItem: ItemType = %d, ItemType = %d, Quality = %d", ItemData.ItemID, ItemData.ItemType, ItemData.Quality) + return ItemData +end + +function GenerateWeaponPartData() + local WeaponPartTypeRateTable = { + [EItemType.Muzzle] = {Min = 1, Max = 20}, + [EItemType.Grip] = {Min = 21, Max = 40}, + [EItemType.Mag] = {Min = 41, Max = 60}, + [EItemType.Stock] = {Min = 61, Max = 80}, + [EItemType.Scope] = {Min = 81, Max = 100}, + } + local Rand1 = math.random(1, 100) + local ResultItemType = -1 + for ItemType, Rates in pairs(WeaponPartTypeRateTable) do + if Rand1 >= Rates.Min and Rand1 <= Rates.Max then + ResultItemType = ItemType + break + end + end + + local QualityRateTable = { + [1] = {Min = 1, Max = 95}, + [2] = {Min = 96, Max = 99}, + [3] = {Min = 100, Max = 100}, + } + local Rand2 = math.random(1, 100) + local ResultQuality = -1 + for Quality, Rates in pairs(QualityRateTable) do + if Rand2 >= Rates.Min and Rand2 <= Rates.Max then + ResultQuality = Quality + break + end + end + + local WeaponClassTypeRateTable = { + [EWeaponClassType.WT_ShotGun] = {Min = 1, Max = 4}, + [EWeaponClassType.WT_MachineGun] = {Min = 5, Max = 8}, + [EWeaponClassType.WT_SubmachineGun] = {Min = 9, Max = 12}, + [EWeaponClassType.WT_ShooterRifle] = {Min = 13, Max = 16}, + [EWeaponClassType.WT_AssaultRifle] = {Min = 17, Max = 20}, + [EWeaponClassType.WT_Sniper] = {Min = 21, Max = 24}, + } + local Rand3 = math.random(1, 24) + local ResultWeaponClassType = -1 + for WeaponClassType, Rates in pairs(WeaponClassTypeRateTable) do + if Rand3 >= Rates.Min and Rand3 <= Rates.Max then + ResultWeaponClassType = WeaponClassType + break + end + end + + local ItemData = { + ItemID = 10000 + (ResultItemType + 1) * 1000 + ResultWeaponClassType * 100 + ResultQuality * 10, + ItemType = ResultItemType, + Quality = ResultQuality, + Count = 1, + WeaponClassType = ResultWeaponClassType + } + + UE.Log("DropItem: ItemType = %d, ItemType = %d, Quality = %d, WeaponClassType = %d", ItemData.ItemID, ItemData.ItemType, ItemData.Quality, ItemData.WeaponClassType) + return ItemData +end + +function GenerateStoneData() + local RateTable = { + [EItemType.SubstituteStone] = {Min = 1, Max = 100}, + [EItemType.ScouringStone] = {Min = -1, Max = -100}, + } + local Rand = math.random(1, 100) + local ResultItemType = -1 + for ItemType, Rates in pairs(RateTable) do + if Rand >= Rates.Min and Rand <= Rates.Max then + ResultItemType = ItemType + break + end + end + + local ItemData = { + ItemID = ResultItemType == EItemType.ScouringStone and 31000 or 32000, + ItemType = ResultItemType, + Quality = 1, + Count = 1, + } + + UE.Log("DropItem: ItemType = %d, ItemType = %d, Quality = %d", ItemData.ItemID, ItemData.ItemType, ItemData.Quality) + return ItemData +end + +function GenerateDropItemData() + local RateTable = { + [EDropItemSet.SkillBooks] = {Min = 1, Max = 95}, + -- 默认不需要这个 + --[EDropItemSet.WeaponParts] = {Min = -100, Max = -10}, + [EDropItemSet.Stones] = {Min = 96, Max = 100}, + } + + local Rand = math.random(1, 100) + + local ResultItemSet = -1 + for ItemSet, Rates in pairs(RateTable) do + if Rand >= Rates.Min and Rand <= Rates.Max then + ResultItemSet = ItemSet + break + end + end + + if ResultItemSet == EDropItemSet.WeaponParts then + return GenerateWeaponPartData() + elseif ResultItemSet == EDropItemSet.SkillBooks then + return GenerateSkillBookData() + else + return GenerateStoneData() + end + --return GenerateSkillBookData() +end + +--创建随机词条 +function RandomWeaponProperty(InVal) + -- 从200 中进行随机 + math.randomseed(KismetSystemLibrary.GetGameTimeInSeconds(InVal) + math.random()) + --这是计算 200 + local Val = math.random(1,200) + local WeaponMainPropIndex = 0 + for i = 1, 16 do + if Val > Tables.WeaponPropertyConfig[i].ProbabilityMin and Val <= Tables.WeaponPropertyConfig[i].ProbabilityMax then + WeaponMainPropIndex = i + break + end + end + + local MinVal = Tables.WeaponPropertyConfig[WeaponMainPropIndex].RandomMin + local MaxVal = Tables.WeaponPropertyConfig[WeaponMainPropIndex].RandomMax + + math.randomseed(KismetSystemLibrary.GetGameTimeInSeconds(InVal)) + + --返回属性的具体值 + local c = math.random() * (MaxVal - MinVal) + MinVal + + return WeaponMainPropIndex, c +end + +--- @return boolean 是否可以随机到 +function math.RandomValue(InPercent) + if InPercent > 1 then + InPercent = InPercent * 0.01 + end + local RandomNum = math.random() + if RandomNum < InPercent then + return true + end + return false +end + +function table.logTree(InTable, Addtions) + -- 首先检测一下是否是table + if Addtions == nil then + Addtions = '' + end + local RetStr = Addtions + if type(InTable) == 'table' then + for i, v in pairs(InTable) do + RetStr = RetStr .. "k: " .. tostring(i) .. '\t'; + RetStr = RetStr .. "v: " + if type(v) == 'table' then + RetStr = RetStr .. '\ttype:table\n' + RetStr = RetStr .. table.logTree(v, "\t" .. Addtions) + RetStr = RetStr .. '\n' + else + RetStr = RetStr .. tostring(v) .. '\t'; + end + -- RetStr = RetStr ..'\n' + end + else + RetStr = tostring(InTable) + end + return RetStr .. '\n'; +end \ No newline at end of file diff --git a/GZJ/Script/Global/InheritTable.lua b/GZJ/Script/Global/InheritTable.lua new file mode 100644 index 00000000..2e590ad5 --- /dev/null +++ b/GZJ/Script/Global/InheritTable.lua @@ -0,0 +1,820 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by yh. +--- DateTime: 2023/4/20 10:12 +--- + +InheritTable = {} + +-- 属性 +InheritTable.Items = { + [110] = { + Type = '盔', + Stage = '初级', + Level = 0, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.Icon_UGC_inherit_02'), + Cost = 500, + Benefit = { + { Type = '威力值', Value = 0, Unit = '' }, + { Type = '射击伤害%', Value = 0., Unit = '%' }, + } + }, + [111] = { + Type = '盔', + Stage = '初级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.Icon_UGC_inherit_02'), + Cost = 1000, + Benefit = { + { Type = '威力值', Value = 10, Unit = '' }, + { Type = '射击伤害%', Value = 0.05, Unit = '%' }, + } + }, + [112] = { + Type = '盔', + Stage = '初级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.Icon_UGC_inherit_02'), + Cost = 2000, + Benefit = { + { Type = '威力值', Value = 20, Unit = '' }, + { Type = '射击伤害%', Value = 0.05, Unit = '%' }, + } + }, + [113] = { + Type = '盔', + Stage = '初级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.Icon_UGC_inherit_02'), + Cost = 3000, + Benefit = { + { Type = '威力值', Value = 30, Unit = '' }, + { Type = '射击伤害%', Value = 0.05, Unit = '%' }, + } + }, + [114] = { + Type = '盔', + Stage = '初级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.Icon_UGC_inherit_02'), + Cost = 4000, + Benefit = { + { Type = '威力值', Value = 40, Unit = '' }, + { Type = '射击伤害%', Value = 0.05, Unit = '%' }, + } + }, + [115] = { + Type = '盔', + Stage = '初级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_02.Icon_UGC_inherit_02'), + Cost = '突破', + Benefit = { + { Type = '威力值', Value = 50, Unit = '' }, + { Type = '射击伤害%', Value = 0.05, Unit = '%' }, + } + }, + [121] = { + Type = '盔', + Stage = '中级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_04.Icon_UGC_inherit_04'), + Cost = 6000, + Benefit = { + { Type = '威力值', Value = 100, Unit = '' }, + { Type = '射击伤害%', Value = 0.10, Unit = '%' }, + } + }, + [122] = { + Type = '盔', + Stage = '中级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_04.Icon_UGC_inherit_04'), + Cost = 8000, + Benefit = { + { Type = '威力值', Value = 120, Unit = '' }, + { Type = '射击伤害%', Value = 0.10, Unit = '%' }, + } + }, + [123] = { + Type = '盔', + Stage = '中级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_04.Icon_UGC_inherit_04'), + Cost = 10000, + Benefit = { + { Type = '威力值', Value = 140, Unit = '' }, + { Type = '射击伤害%', Value = 0.10, Unit = '%' }, + } + }, + [124] = { + Type = '盔', + Stage = '中级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_04.Icon_UGC_inherit_04'), + Cost = 12000, + Benefit = { + { Type = '威力值', Value = 160, Unit = '' }, + { Type = '射击伤害%', Value = 0.10, Unit = '%' }, + } + }, + [125] = { + Type = '盔', + Stage = '中级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_04.Icon_UGC_inherit_04'), + Cost = '突破', + Benefit = { + { Type = '威力值', Value = 180, Unit = '' }, + { Type = '射击伤害%', Value = 0.10, Unit = '%' }, + } + }, + [131] = { + Type = '盔', + Stage = '高级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_06.Icon_UGC_inherit_06'), + Cost = 14000, + Benefit = { + { Type = '威力值', Value = 240, Unit = '' }, + { Type = '射击伤害%', Value = 0.15, Unit = '%' }, + } + }, + [132] = { + Type = '盔', + Stage = '高级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_06.Icon_UGC_inherit_06'), + Cost = 17000, + Benefit = { + { Type = '威力值', Value = 270, Unit = '' }, + { Type = '射击伤害%', Value = 0.15, Unit = '%' }, + } + }, + [133] = { + Type = '盔', + Stage = '高级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_06.Icon_UGC_inherit_06'), + Cost = 20000, + Benefit = { + { Type = '威力值', Value = 300, Unit = '' }, + { Type = '射击伤害%', Value = 0.15, Unit = '%' }, + } + }, + [134] = { + Type = '盔', + Stage = '高级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_06.Icon_UGC_inherit_06'), + Cost = 23000, + Benefit = { + { Type = '威力值', Value = 330, Unit = '' }, + { Type = '射击伤害%', Value = 0.15, Unit = '%' }, + } + }, + [135] = { + Type = '盔', + Stage = '高级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_06.Icon_UGC_inherit_06'), + Cost = '突破', + Benefit = { + { Type = '威力值', Value = 360, Unit = '' }, + { Type = '射击伤害%', Value = 0.15, Unit = '%' }, + } + }, + [141] = { + Type = '盔', + Stage = '超级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_08.Icon_UGC_inherit_08'), + Cost = 25000, + Benefit = { + { Type = '威力值', Value = 430, Unit = '' }, + { Type = '射击伤害%', Value = 0.20, Unit = '%' }, + } + }, + [142] = { + Type = '盔', + Stage = '超级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_08.Icon_UGC_inherit_08'), + Cost = 29000, + Benefit = { + { Type = '威力值', Value = 470, Unit = '' }, + { Type = '射击伤害%', Value = 0.20, Unit = '%' }, + } + }, + [143] = { + Type = '盔', + Stage = '超级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_08.Icon_UGC_inherit_08'), + Cost = 33000, + Benefit = { + { Type = '威力值', Value = 510, Unit = '' }, + { Type = '射击伤害%', Value = 0.20, Unit = '%' }, + } + }, + [144] = { + Type = '盔', + Stage = '超级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_08.Icon_UGC_inherit_08'), + Cost = 37000, + Benefit = { + { Type = '威力值', Value = 550, Unit = '' }, + { Type = '射击伤害%', Value = 0.20, Unit = '%' }, + } + }, + [145] = { + Type = '盔', + Stage = '超级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_08.Icon_UGC_inherit_08'), + Cost = '突破', + Benefit = { + { Type = '威力值', Value = 590, Unit = '' }, + { Type = '射击伤害%', Value = 0.20, Unit = '%' }, + } + }, + [151] = { + Type = '盔', + Stage = '将级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_10.Icon_UGC_inherit_10'), + Cost = 39000, + Benefit = { + { Type = '威力值', Value = 670, Unit = '' }, + { Type = '射击伤害%', Value = 0.25, Unit = '%' }, + } + }, + [152] = { + Type = '盔', + Stage = '将级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_10.Icon_UGC_inherit_10'), + Cost = 44000, + Benefit = { + { Type = '威力值', Value = 720, Unit = '' }, + { Type = '射击伤害%', Value = 0.25, Unit = '%' }, + } + }, + [153] = { + Type = '盔', + Stage = '将级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_10.Icon_UGC_inherit_10'), + Cost = 49000, + Benefit = { + { Type = '威力值', Value = 770, Unit = '' }, + { Type = '射击伤害%', Value = 0.25, Unit = '%' }, + } + }, + [154] = { + Type = '盔', + Stage = '将级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_10.Icon_UGC_inherit_10'), + Cost = 54000, + Benefit = { + { Type = '威力值', Value = 820, Unit = '' }, + { Type = '射击伤害%', Value = 0.25, Unit = '%' }, + } + }, + [155] = { + Type = '盔', + Stage = '将级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_10.Icon_UGC_inherit_10'), + Cost = '突破', + Benefit = { + { Type = '威力值', Value = 870, Unit = '' }, + { Type = '射击伤害%', Value = 0.25, Unit = '%' }, + } + }, + [161] = { + Type = '盔', + Stage = '王级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_12.Icon_UGC_inherit_12'), + Cost = 56000, + Benefit = { + { Type = '威力值', Value = 960, Unit = '' }, + { Type = '射击伤害%', Value = 0.30, Unit = '%' }, + } + }, + [162] = { + Type = '盔', + Stage = '王级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_12.Icon_UGC_inherit_12'), + Cost = 62000, + Benefit = { + { Type = '威力值', Value = 1020, Unit = '' }, + { Type = '射击伤害%', Value = 0.30, Unit = '%' }, + } + }, + [163] = { + Type = '盔', + Stage = '王级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_12.Icon_UGC_inherit_12'), + Cost = 68000, + Benefit = { + { Type = '威力值', Value = 1080, Unit = '' }, + { Type = '射击伤害%', Value = 0.30, Unit = '%' }, + } + }, + [164] = { + Type = '盔', + Stage = '王级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_12.Icon_UGC_inherit_12'), + Cost = 74000, + Benefit = { + { Type = '威力值', Value = 1140, Unit = '' }, + { Type = '射击伤害%', Value = 0.30, Unit = '%' }, + } + }, + [165] = { + Type = '盔', + Stage = '王级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_12.Icon_UGC_inherit_12'), + Cost = '突破', + Benefit = { + { Type = '威力值', Value = 1200, Unit = '' }, + { Type = '射击伤害%', Value = 0.30, Unit = '%' }, + } + }, + [171] = { + Type = '盔', + Stage = '皇级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_14.Icon_UGC_inherit_14'), + Cost = 76000, + Benefit = { + { Type = '威力值', Value = 1300, Unit = '' }, + { Type = '射击伤害%', Value = 0.35, Unit = '%' }, + } + }, + [172] = { + Type = '盔', + Stage = '皇级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_14.Icon_UGC_inherit_14'), + Cost = 83000, + Benefit = { + { Type = '威力值', Value = 1370, Unit = '' }, + { Type = '射击伤害%', Value = 0.35, Unit = '%' }, + } + }, + [173] = { + Type = '盔', + Stage = '皇级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_14.Icon_UGC_inherit_14'), + Cost = 90000, + Benefit = { + { Type = '威力值', Value = 1440, Unit = '' }, + { Type = '射击伤害%', Value = 0.35, Unit = '%' }, + } + }, + [174] = { + Type = '盔', + Stage = '皇级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_14.Icon_UGC_inherit_14'), + Cost = 97000, + Benefit = { + { Type = '威力值', Value = 1510, Unit = '' }, + { Type = '射击伤害%', Value = 0.35, Unit = '%' }, + } + }, + [175] = { + Type = '盔', + Stage = '皇级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_14.Icon_UGC_inherit_14'), + Cost = '突破', + Benefit = { + { Type = '威力值', Value = 1580, Unit = '' }, + { Type = '射击伤害%', Value = 0.35, Unit = '%' }, + } + }, + [210] = { + Type = '甲', + Stage = '初级', + Level = 0, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.Icon_UGC_inherit_01'), + Cost = 500, + Benefit = { + { Type = '生命值', Value = 0, Unit = '' }, + { Type = '防御值', Value = 0, Unit = '' }, + } + }, + [211] = { + Type = '甲', + Stage = '初级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.Icon_UGC_inherit_01'), + Cost = 1000, + Benefit = { + { Type = '生命值', Value = 100, Unit = '' }, + { Type = '防御值', Value = 2, Unit = '' }, + } + }, + [212] = { + Type = '甲', + Stage = '初级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.Icon_UGC_inherit_01'), + Cost = 2000, + Benefit = { + { Type = '生命值', Value = 200, Unit = '' }, + { Type = '防御值', Value = 4, Unit = '' }, + } + }, + [213] = { + Type = '甲', + Stage = '初级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.Icon_UGC_inherit_01'), + Cost = 3000, + Benefit = { + { Type = '生命值', Value = 300, Unit = '' }, + { Type = '防御值', Value = 6, Unit = '' }, + } + }, + [214] = { + Type = '甲', + Stage = '初级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.Icon_UGC_inherit_01'), + Cost = 4000, + Benefit = { + { Type = '生命值', Value = 400, Unit = '' }, + { Type = '防御值', Value = 8, Unit = '' }, + } + }, + [215] = { + Type = '甲', + Stage = '初级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_01.Icon_UGC_inherit_01'), + Cost = '突破', + Benefit = { + { Type = '生命值', Value = 500, Unit = '' }, + { Type = '防御值', Value = 10, Unit = '' }, + } + }, + [221] = { + Type = '甲', + Stage = '中级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_03.Icon_UGC_inherit_03'), + Cost = 6000, + Benefit = { + { Type = '生命值', Value = 1000, Unit = '' }, + { Type = '防御值', Value = 20, Unit = '' }, + } + }, + [222] = { + Type = '甲', + Stage = '中级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_03.Icon_UGC_inherit_03'), + Cost = 8000, + Benefit = { + { Type = '生命值', Value = 1200, Unit = '' }, + { Type = '防御值', Value = 24, Unit = '' }, + } + }, + [223] = { + Type = '甲', + Stage = '中级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_03.Icon_UGC_inherit_03'), + Cost = 10000, + Benefit = { + { Type = '生命值', Value = 1400, Unit = '' }, + { Type = '防御值', Value = 28, Unit = '' }, + } + }, + [224] = { + Type = '甲', + Stage = '中级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_03.Icon_UGC_inherit_03'), + Cost = 12000, + Benefit = { + { Type = '生命值', Value = 1600, Unit = '' }, + { Type = '防御值', Value = 32, Unit = '' }, + } + }, + [225] = { + Type = '甲', + Stage = '中级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_03.Icon_UGC_inherit_03'), + Cost = '突破', + Benefit = { + { Type = '生命值', Value = 1800, Unit = '' }, + { Type = '防御值', Value = 36, Unit = '' }, + } + }, + [231] = { + Type = '甲', + Stage = '高级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_05.Icon_UGC_inherit_05'), + Cost = 14000, + Benefit = { + { Type = '生命值', Value = 2400, Unit = '' }, + { Type = '防御值', Value = 48, Unit = '' }, + } + }, + [232] = { + Type = '甲', + Stage = '高级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_05.Icon_UGC_inherit_05'), + Cost = 17000, + Benefit = { + { Type = '生命值', Value = 2700, Unit = '' }, + { Type = '防御值', Value = 54, Unit = '' }, + } + }, + [233] = { + Type = '甲', + Stage = '高级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_05.Icon_UGC_inherit_05'), + Cost = 20000, + Benefit = { + { Type = '生命值', Value = 3000, Unit = '' }, + { Type = '防御值', Value = 60, Unit = '' }, + } + }, + [234] = { + Type = '甲', + Stage = '高级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_05.Icon_UGC_inherit_05'), + Cost = 23000, + Benefit = { + { Type = '生命值', Value = 3300, Unit = '' }, + { Type = '防御值', Value = 66, Unit = '' }, + } + }, + [235] = { + Type = '甲', + Stage = '高级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_05.Icon_UGC_inherit_05'), + Cost = '突破', + Benefit = { + { Type = '生命值', Value = 3600, Unit = '' }, + { Type = '防御值', Value = 72, Unit = '' }, + } + }, + [241] = { + Type = '甲', + Stage = '超级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_07.Icon_UGC_inherit_07'), + Cost = 25000, + Benefit = { + { Type = '生命值', Value = 4300, Unit = '' }, + { Type = '防御值', Value = 86, Unit = '' }, + } + }, + [242] = { + Type = '甲', + Stage = '超级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_07.Icon_UGC_inherit_07'), + Cost = 29000, + Benefit = { + { Type = '生命值', Value = 4700, Unit = '' }, + { Type = '防御值', Value = 94, Unit = '' }, + } + }, + [243] = { + Type = '甲', + Stage = '超级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_07.Icon_UGC_inherit_07'), + Cost = 33000, + Benefit = { + { Type = '生命值', Value = 5100, Unit = '' }, + { Type = '防御值', Value = 102, Unit = '' }, + } + }, + [244] = { + Type = '甲', + Stage = '超级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_07.Icon_UGC_inherit_07'), + Cost = 37000, + Benefit = { + { Type = '生命值', Value = 5500, Unit = '' }, + { Type = '防御值', Value = 110, Unit = '' }, + } + }, + [245] = { + Type = '甲', + Stage = '超级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_07.Icon_UGC_inherit_07'), + Cost = '突破', + Benefit = { + { Type = '生命值', Value = 5900, Unit = '' }, + { Type = '防御值', Value = 118, Unit = '' }, + } + }, + [251] = { + Type = '甲', + Stage = '将级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_09.Icon_UGC_inherit_09'), + Cost = 39000, + Benefit = { + { Type = '生命值', Value = 6700, Unit = '' }, + { Type = '防御值', Value = 134, Unit = '' }, + } + }, + [252] = { + Type = '甲', + Stage = '将级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_09.Icon_UGC_inherit_09'), + Cost = 44000, + Benefit = { + { Type = '生命值', Value = 7200, Unit = '' }, + { Type = '防御值', Value = 144, Unit = '' }, + } + }, + [253] = { + Type = '甲', + Stage = '将级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_09.Icon_UGC_inherit_09'), + Cost = 49000, + Benefit = { + { Type = '生命值', Value = 7700, Unit = '' }, + { Type = '防御值', Value = 154, Unit = '' }, + } + }, + [254] = { + Type = '甲', + Stage = '将级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_09.Icon_UGC_inherit_09'), + Cost = 54000, + Benefit = { + { Type = '生命值', Value = 8200, Unit = '' }, + { Type = '防御值', Value = 164, Unit = '' }, + } + }, + [255] = { + Type = '甲', + Stage = '将级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_09.Icon_UGC_inherit_09'), + Cost = '突破', + Benefit = { + { Type = '生命值', Value = 8700, Unit = '' }, + { Type = '防御值', Value = 174, Unit = '' }, + } + }, + [261] = { + Type = '甲', + Stage = '王级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_11.Icon_UGC_inherit_11'), + Cost = 56000, + Benefit = { + { Type = '生命值', Value = 9600, Unit = '' }, + { Type = '防御值', Value = 192, Unit = '' }, + } + }, + [262] = { + Type = '甲', + Stage = '王级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_11.Icon_UGC_inherit_11'), + Cost = 62000, + Benefit = { + { Type = '生命值', Value = 10200, Unit = '' }, + { Type = '防御值', Value = 204, Unit = '' }, + } + }, + [263] = { + Type = '甲', + Stage = '王级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_11.Icon_UGC_inherit_11'), + Cost = 68000, + Benefit = { + { Type = '生命值', Value = 10800, Unit = '' }, + { Type = '防御值', Value = 216, Unit = '' }, + } + }, + [264] = { + Type = '甲', + Stage = '王级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_11.Icon_UGC_inherit_11'), + Cost = 74000, + Benefit = { + { Type = '生命值', Value = 11400, Unit = '' }, + { Type = '防御值', Value = 228, Unit = '' }, + } + }, + [265] = { + Type = '甲', + Stage = '王级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_11.Icon_UGC_inherit_11'), + Cost = '突破', + Benefit = { + { Type = '生命值', Value = 12000, Unit = '' }, + { Type = '防御值', Value = 240, Unit = '' }, + } + }, + [271] = { + Type = '甲', + Stage = '皇级', + Level = 1, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_13.Icon_UGC_inherit_13'), + Cost = 76000, + Benefit = { + { Type = '生命值', Value = 13000, Unit = '' }, + { Type = '防御值', Value = 260, Unit = '' }, + } + }, + [272] = { + Type = '甲', + Stage = '皇级', + Level = 2, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_13.Icon_UGC_inherit_13'), + Cost = 83000, + Benefit = { + { Type = '生命值', Value = 13700, Unit = '' }, + { Type = '防御值', Value = 274, Unit = '' }, + } + }, + [273] = { + Type = '甲', + Stage = '皇级', + Level = 3, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_13.Icon_UGC_inherit_13'), + Cost = 90000, + Benefit = { + { Type = '生命值', Value = 14400, Unit = '' }, + { Type = '防御值', Value = 288, Unit = '' }, + } + }, + [274] = { + Type = '甲', + Stage = '皇级', + Level = 4, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_13.Icon_UGC_inherit_13'), + Cost = 97000, + Benefit = { + { Type = '生命值', Value = 15100, Unit = '' }, + { Type = '防御值', Value = 302, Unit = '' }, + } + }, + [275] = { + Type = '甲', + Stage = '皇级', + Level = 5, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/inherit_Icon/Textures/Icon_UGC_inherit_13.Icon_UGC_inherit_13'), + Cost = '突破', + Benefit = { + { Type = '生命值', Value = 15800, Unit = '' }, + { Type = '防御值', Value = 316, Unit = '' }, + } + } +} + +function InheritTable.GetNextId(InId) + local NewId = InId + 1 + local Info = InheritTable.Items[NewId] + if Info ~= nil then + return NewId + end + + NewId = (InId // 10 + 1) * 10 + 1 + Info = InheritTable.Items[NewId] + if Info ~= nil then + return NewId + end + + -- 此时说明到底了 + return -1 +end diff --git a/GZJ/Script/Global/LevelReward.lua b/GZJ/Script/Global/LevelReward.lua new file mode 100644 index 00000000..43e509e1 --- /dev/null +++ b/GZJ/Script/Global/LevelReward.lua @@ -0,0 +1,52 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by vspo. +--- DateTime: 2023/6/23 16:33 +--- + + +-- 升级等级获取的东西 +LevelRewards = { +} + +-- key:等级 / 10 +LevelRewards.Rewards = { + [1] = { + Health = 1500, + Attack = 500, + AttackSpeed = 0.1, + }, + [2] = { + Health = 12000, + Attack = 2500, + AttackSpeed = 0.2, + }, + [3] = { + Health = 20000, + Attack = 5000, + AttackSpeed = 0.3, + }, + [4] = { + Health = 30000, + Attack = 10000, + AttackSpeed = 0.4, + }, + [5] = { + Health = 30000, + Attack = 20000, + AttackSpeed = 0.5, + }, + [6] = { + Health = 30000, + Attack = 30000, + AttackSpeed = 0.6, + }, +} + +LevelRewards.EachLevel = { + Health = 500, + Attack = 50, + Defence = 5 +} + +return LevelRewards; \ No newline at end of file diff --git a/GZJ/Script/Global/NewPlayerGuideConfig.lua b/GZJ/Script/Global/NewPlayerGuideConfig.lua new file mode 100644 index 00000000..c688de12 --- /dev/null +++ b/GZJ/Script/Global/NewPlayerGuideConfig.lua @@ -0,0 +1,416 @@ +NewPlayerGuideConfig = NewPlayerGuideConfig or {} + +NewPlayerGuideConfig.GuideTable = { + --[1] = { + -- GuideType = EGuideWidgetType.Round, + -- ExistType = EGuideExistType.Duration, + -- Duration = 60.0, + -- TriggerType = EGuideTriggerType.CustomCondition, + -- LinkedUIType = EUIType.Main, + -- LinkedComponent = "Panel_Guide", + -- GuideTextType = EGuideTextType.Down, + -- GuideText = "点击这里查看玩法指引", + -- Root = UIRoot.BattleGuideRoot, + -- MaxTriggerCount = 1, + -- MutalExclusionIndex = 0, + --}, + [2] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.SelectDifficulty, + LinkedComponent = "CanvasPanel_Area", + GuideTextType = EGuideTextType.Left, + GuideText = "选择一个难度吧", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 0, + }, + [3] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.SelectSkill, + LinkedComponent = "CanvasPanel_SkillBox", + GuideTextType = EGuideTextType.Right, + GuideText = "请选择一个天赋吧,天赋很强大请仔细选择", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 0, + }, + [4] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "CanvasPanel_Breach", + GuideTextType = EGuideTextType.Top, + GuideText = "点击进行武器进化", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 0, + }, + [5] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.DifficultInfo, + LinkedComponent = "ScrollBox_Texts", + GuideTextType = EGuideTextType.Left, + GuideText = "请仔细查看难度信息哦", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 0, + }, + [6] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.SelectWeapon, + LinkedComponent = "Panel_Main", + GuideTextType = EGuideTextType.Left, + GuideText = "选择想要进化的武器,建议选择克制首领技能的武器", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 0, + }, + [7] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "Panel_Interact.Panel_Button_AttributeUpgrade", + GuideTextType = EGuideTextType.Top, + GuideText = "点击这里显示属性提升相关按钮", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 99, + MutalExclusionIndex = 8, + }, + [8] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "Panel_Interact.Panel_Button_ResourceUpgrade", + GuideTextType = EGuideTextType.Top, + GuideText = "点击这里显示资源提升相关按钮", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 99, + MutalExclusionIndex = 7, + }, + [9] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "Panel_Interact.Panel_Button1", + GuideTextType = EGuideTextType.Top, + GuideText = "点击这里打开购买面板", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {7, 8, 10, 11, 12, 13}, + }, + [10] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "InteractButton_Technology", + GuideTextType = EGuideTextType.Left, + GuideText = "点击这里打开兑换面板", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {7, 8, 9, 11, 12, 13}, + }, + [11] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "InteractButton_Unpacking", + GuideTextType = EGuideTextType.Down, + GuideText = "点击这里打开抽奖面板", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {7, 8, 9, 10, 12, 13}, + }, + [12] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "Panel_Interact.Panel_Button4", + GuideTextType = EGuideTextType.Top, + GuideText = "点击这里打开升阶面板", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {7, 8, 9, 10, 11, 13}, + }, + [13] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "InteractButton_Challenge", + GuideTextType = EGuideTextType.Down, + GuideText = "点击这里打开获取面板", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {7, 8, 9, 10, 11, 12}, + }, + [14] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "Panel_Interact.Panel_Button_Seal", + GuideTextType = EGuideTextType.Down, + GuideText = "点击这里触发奖励", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 15, + }, + [15] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "CanvasPanel_BossInfo", + GuideTextType = EGuideTextType.Down, + GuideText = "点击这里查看首领信息", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 14, + }, + [16] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.Tech, + LinkedComponent = "UniformGridPanel_Technology", + GuideTextType = EGuideTextType.Left, + GuideText = "请仔细挑选需要兑换的属性", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 10, + }, + [17] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.Inherit, + LinkedComponent = "WBP_InheritSelectItem", + GuideTextType = EGuideTextType.Left, + GuideText = "点此购买盔的属性", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 9, + }, + [18] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.Inherit, + LinkedComponent = "WBP_InheritSelectItem_0", + GuideTextType = EGuideTextType.Right, + GuideText = "点此购买甲的属性", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 9, + }, + [19] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "InteractButton_Pickup", + GuideTextType = EGuideTextType.Top, + GuideText = "地上掉落了好多东西,点此一键拾取", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 20, + }, + [20] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "InteractButton_Backpack", + GuideTextType = EGuideTextType.Top, + GuideText = "点此查看已获取装备", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 19, + }, + -- [21] = { + -- GuideType = EGuideWidgetType.Square, + -- ExistType = EGuideExistType.Duration, + -- Duration = 5.0, + -- TriggerType = EGuideTriggerType.UIVisibile, + -- LinkedUIType = EUIType.Backpack, + -- LinkedComponent = "CanvasPanel_Buttons", + -- GuideTextType = EGuideTextType.Top, + -- GuideText = "点击切换装备类型", + -- Root = UIRoot.CommonGuideRoot, + -- MaxTriggerCount = 1, + -- MutalExclusionIndex = 20, + -- }, + -----------------技能&装备,专用----------------- + ----------技能专用---------- + -- [22] = { + -- GuideType = EGuideWidgetType.Square, + -- ExistType = EGuideExistType.Duration, + -- Duration = 5.0, + -- TriggerType = EGuideTriggerType.CustomCondition, + -- LinkedUIType = EUIType.Backpack, + -- LinkedComponent = "Guide_Item_1", + -- GuideTextType = EGuideTextType.Left, + -- GuideText = "长按可查看技能说明,点击装备技能", + -- Root = UIRoot.CommonGuideRoot, + -- MaxTriggerCount = 1, + -- MutalExclusionIndex = {23, 24, 25, 26, 27, 28}, + -- }, + ----------装备专用---------- + [23] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Backpack, + LinkedComponent = "Guide_Item_1", + GuideTextType = EGuideTextType.Left, + GuideText = "长按可查看装备属性,拖动到武器上即可装备", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {22, 24, 25, 26, 27, 28}, + }, + [24] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Backpack, + LinkedComponent = "Guide_Item_2", + GuideTextType = EGuideTextType.Left, + GuideText = "长按可查看装备属性,拖动到武器上即可装备", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {22, 23, 25, 26, 27, 28}, + }, + [25] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Backpack, + LinkedComponent = "Guide_Item_3", + GuideTextType = EGuideTextType.Left, + GuideText = "长按可查看装备属性,拖动到武器上即可装备", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {22, 23, 24, 26, 27, 28}, + }, + [26] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Backpack, + LinkedComponent = "Guide_Item_4", + GuideTextType = EGuideTextType.Left, + GuideText = "长按可查看装备属性,拖动到武器上即可装备", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {22, 23, 24, 25, 27, 28}, + }, + [27] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Backpack, + LinkedComponent = "Guide_Item_5", + GuideTextType = EGuideTextType.Left, + GuideText = "长按可查看装备属性,拖动到武器上即可装备", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {22, 23, 24, 25, 26, 28}, + }, + [28] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Backpack, + LinkedComponent = "Guide_Item_6", + GuideTextType = EGuideTextType.Left, + GuideText = "长按可查看装备属性,拖动到武器上即可装备", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = {22, 23, 24, 25, 26, 27}, + }, + --------------------------------------------------- + [29] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.CustomCondition, + LinkedUIType = EUIType.Main, + LinkedComponent = "InteractButton_SelectBoss", + GuideTextType = EGuideTextType.Top, + GuideText = "点击可激活/取消锁定高阶怪物", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 0, + }, + [30] = { + GuideType = EGuideWidgetType.Round, + ExistType = EGuideExistType.Duration, + Duration = 5.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.Unpacking, + LinkedComponent = "WBP_Unpacking_Item_C_3.Overlay_UnpackInfo", + GuideTextType = EGuideTextType.Right, + GuideText = "长按可查看抽奖奖励", + Root = UIRoot.CommonGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 0, + }, + -------------------------存档按钮-------------------------- + [31] = { + GuideType = EGuideWidgetType.Square, + ExistType = EGuideExistType.Duration, + Duration = 120.0, + TriggerType = EGuideTriggerType.UIVisibile, + LinkedUIType = EUIType.Main, + LinkedComponent = "Button_Save", + GuideTextType = EGuideTextType.Top, + GuideText = "点击查看已解锁存档内容", + Root = UIRoot.BattleGuideRoot, + MaxTriggerCount = 1, + MutalExclusionIndex = 0, + }, +} + + + +return NewPlayerGuideConfig \ No newline at end of file diff --git a/GZJ/Script/Global/NoticeTipsTools.lua b/GZJ/Script/Global/NoticeTipsTools.lua new file mode 100644 index 00000000..3ae5758f --- /dev/null +++ b/GZJ/Script/Global/NoticeTipsTools.lua @@ -0,0 +1,115 @@ +NoticeTipsTools = NoticeTipsTools or {} + +NoticeTipsTools.HasRegPlayerController = false + +---广播客户端显示UI(客户端发出无效) +function NoticeTipsTools.MulticastShowPanel(InUIType, ...) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false or GameState:HasAuthority() == false then + return + end + + UnrealNetwork.CallUnrealRPC_Multicast(GameState, "Client_MulticastRPC_ShowPanel", InUIType, ...) +end + +---广播客户端关闭UI(客户端发出无效) +function NoticeTipsTools.MulticastClosePanel(InUIType) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false or GameState:HasAuthority() == false then + return + end + + UnrealNetwork.CallUnrealRPC_Multicast(GameState, "Client_MulticastRPC_ClosePanel", InUIType) +end + +---广播客户端自定义事件(客户端发出无效) +function NoticeTipsTools.MulticastSendEvent(InEventType, ...) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false or GameState:HasAuthority() == false then + return + end + + UnrealNetwork.CallUnrealRPC_Multicast(GameState, "Client_MulticastRPC_SendEvent", InEventType, ...) +end + +---服务器发出全体客户端广播普通通知(客户端发出无效) +---@param InText string 提示内容 +---@param ShowAlert boolean 是否显示警告图标(可选,默认false) +---@param ShowTime number 提示时长(可选,默认2秒) +function NoticeTipsTools.MulticastGeneralNoticeTips(InText, ShowAlert, ShowTime) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false or GameState:HasAuthority() == false then + return + end + if ShowAlert == nil then + ShowAlert = false + end + + if ShowTime == nil then + ShowTime = 2.0 + end + + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(GameState, "Client_MulticastRPC_ShowGeneralNoticeTips", InText, ShowAlert, ShowTime) +end + +---服务器发出全体客户端广播通知(客户端发出无效) +---@param InNoticeType ECustomNoticeType 指定提示内容 +function NoticeTipsTools.MulticastNoticeTips(InNoticeType, ...) + local GameState = UGCGameSystem.GameState + if GameState == nil or UE.IsValid(GameState) == false or GameState:HasAuthority() == false then + return + end + + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(GameState, "Client_MulticastRPC_ShowNoticeTips", InNoticeType, ...) +end + +---服务器发出给特定客户端普通通知(客户端发出无效) +---@param PlayerKey number PlayerKey +---@param InText string 提示内容 +---@param ShowAlert boolean 是否显示警告图标(可选,默认false) +---@param ShowTime number 提示时长(可选,默认2秒) +function NoticeTipsTools.ServerGeneralNoticeTips(PlayerKey, InText, ShowAlert, ShowTime) + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) + if PlayerController == nil or UE.IsValid(PlayerController) == false or PlayerController:HasAuthority() == false then + return + end + if ShowAlert == nil then + ShowAlert = false + end + if ShowTime == nil then + ShowTime = 2.0 + end + + UnrealNetwork.CallUnrealRPC_Unreliable(PlayerController, PlayerController, "ClientRPC_ShowGeneralNoticeTips", InText, ShowAlert, ShowTime) +end + +---服务器发出给特定客户端通知(客户端发出无效) +---@param PlayerKey number PlayerKey +---@param InNoticeType ECustomNoticeType 指定提示内容 +function NoticeTipsTools.ServerNoticeTips(PlayerKey, InNoticeType, ...) + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) + if PlayerController == nil or UE.IsValid(PlayerController) == false or PlayerController:HasAuthority() == false then + return + end + + UnrealNetwork.CallUnrealRPC_Unreliable(PlayerController, PlayerController, "ClientRPC_ShowNoticeTips", InNoticeType, ...) +end + +---@param NoticeType ECustomNoticeType +function NoticeTipsTools.ClientNoticeTips(NoticeType, ...) + if UIManager then + UIManager:ShowNotice(NoticeType, ...) + end +end + +---指定客户端显示UI(客户端发出无效) +function NoticeTipsTools.ServerSendShowPanel(PlayerKey, InUIType, ...) + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) + if PlayerController == nil or UE.IsValid(PlayerController) == false or PlayerController:HasAuthority() == false then + return + end + + UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ClientRPC_ShowPanel", InUIType, ...) +end + +return NoticeTipsTools \ No newline at end of file diff --git a/GZJ/Script/Global/SaveGameConfigs.lua b/GZJ/Script/Global/SaveGameConfigs.lua new file mode 100644 index 00000000..1c7f29e0 --- /dev/null +++ b/GZJ/Script/Global/SaveGameConfigs.lua @@ -0,0 +1,128 @@ +SaveGameConfigs = SaveGameConfigs or {} + +SaveGameConfigs.Icons = { + GameClearance = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/InterfaceUI/Textures/ZD_UGC_function_01_1.ZD_UGC_function_01_1'), + Score = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_05.Icon_UGC_file_05'), + EasterEggs = { + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_Interface_5.Icon_UGC_Interface_5'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_18.Icon_UGC_file_18'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_25.Icon_UGC_file_25'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.Icon_UGC_file_28'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_27.Icon_UGC_file_27'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_23.Icon_UGC_file_23'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_26.Icon_UGC_file_26'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_20.Icon_UGC_file_20'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_24.Icon_UGC_file_24'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_17.Icon_UGC_file_17'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_16.Icon_UGC_file_16'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_22.Icon_UGC_file_22'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_21.Icon_UGC_file_21'), + UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_65.Icon_UGC_file_65'), + }, + Achievements = { + ['通关'] = { + [1] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_11.Icon_UGC_file_11'), + [5] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_12.Icon_UGC_file_12'), + [20] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_13.Icon_UGC_file_13'), + [50] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_14.Icon_UGC_file_14'), + [100] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_15.Icon_UGC_file_15'), + }, + ['击败'] = { + [4] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_63.Icon_UGC_file_63'), + [20] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_63.Icon_UGC_file_63'), + [80] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_63.Icon_UGC_file_63'), + [200] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_63.Icon_UGC_file_63'), + [400] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_63.Icon_UGC_file_63'), + }, + ['金币'] = { + [100] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_06.Icon_UGC_file_06'), + [500] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_07.Icon_UGC_file_07'), + [2000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_08.Icon_UGC_file_08'), + [5000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_09.Icon_UGC_file_09'), + [10000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_10.Icon_UGC_file_10'), + }, + ['科技点'] = { + [12000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_62.Icon_UGC_file_62'), + [60000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_62.Icon_UGC_file_62'), + [240000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_62.Icon_UGC_file_62'), + [600000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_62.Icon_UGC_file_62'), + [1200000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_62.Icon_UGC_file_62'), + }, + ['技能'] = { + [10] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_59.Icon_UGC_file_59'), + [50] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_59.Icon_UGC_file_59'), + [200] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_59.Icon_UGC_file_59'), + [500] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_59.Icon_UGC_file_59'), + [1000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_59.Icon_UGC_file_59'), + }, + ['配件'] = { + [20] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_61.Icon_UGC_file_61'), + [100] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_61.Icon_UGC_file_61'), + [400] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_61.Icon_UGC_file_61'), + [1000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_61.Icon_UGC_file_61'), + [2000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_61.Icon_UGC_file_61'), + }, + ['开箱'] = { + [350] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_60.Icon_UGC_file_60'), + [1750] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_60.Icon_UGC_file_60'), + [7000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_60.Icon_UGC_file_60'), + [17500] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_60.Icon_UGC_file_60'), + [35000] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_60.Icon_UGC_file_60'), + }, + }, + BossDropItems = { + ['幻'] = { + [1] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_35.Icon_UGC_file_35'), + [2] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_36.Icon_UGC_file_36'), + [3] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_37.Icon_UGC_file_37'), + [4] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_38.Icon_UGC_file_38'), + [5] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_34.Icon_UGC_file_34'), + }, + ['慎'] = { + [1] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_52.Icon_UGC_file_52'), + [2] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_49.Icon_UGC_file_49'), + [3] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_51.Icon_UGC_file_51'), + [4] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_53.Icon_UGC_file_53'), + [5] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_50.Icon_UGC_file_50'), + }, + ['魅'] = { + [1] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_45.Icon_UGC_file_45'), + [2] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_46.Icon_UGC_file_46'), + [3] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_47.Icon_UGC_file_47'), + [4] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_48.Icon_UGC_file_48'), + [5] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_44.Icon_UGC_file_44'), + }, + ['瞬'] = { + [1] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_55.Icon_UGC_file_55'), + [2] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_56.Icon_UGC_file_56'), + [3] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_57.Icon_UGC_file_57'), + [4] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_58.Icon_UGC_file_58'), + [5] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_54.Icon_UGC_file_54'), + }, + ['春'] = { + [1] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_30.Icon_UGC_file_30'), + [2] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_31.Icon_UGC_file_31'), + [3] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_32.Icon_UGC_file_32'), + [4] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_33.Icon_UGC_file_33'), + [5] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_29.Icon_UGC_file_29'), + }, + ['蛮'] = { + [1] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_40.Icon_UGC_file_40'), + [2] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_41.Icon_UGC_file_41'), + [3] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_42.Icon_UGC_file_42'), + [4] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_43.Icon_UGC_file_43'), + [5] = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_39.Icon_UGC_file_39'), + } + }, + GameDropItems = { + ['握把'] = '/Game/Arts/UI/TableIcons/ItemIcon/Attach/Icon_WB_Vertical.Icon_WB_Vertical', + ['枪口'] = '/Game/Arts/UI/TableIcons/ItemIcon/Attach/Icon_QK_Sniper_Suppressor.Icon_QK_Sniper_Suppressor', + ['弹夹'] = '/Game/Arts/UI/TableIcons/ItemIcon/Attach/Icon_DJ_Large_E.Icon_DJ_Large_E', + ['枪托'] = '/Game/Arts/UI/TableIcons/ItemIcon/Attach/Icon_QT_Sniper.Icon_QT_Sniper', + ['瞄准镜'] = '/Game/Arts/UI/TableIcons/ItemIcon/Attach/Icon_MZJ_8X.Icon_MZJ_8X', + ['套装'] = '/Game/Arts/UI/TableIcons/ProfessionResult_Icon/MS_Icon_hoqinbing.MS_Icon_hoqinbing', + ['碎片'] = '/Game/Arts/UI/TableIcons/ProfessionResult_Icon/MS_Icon_hoqinbing.MS_Icon_hoqinbing', + } +} + +return SaveGameConfigs; \ No newline at end of file diff --git a/GZJ/Script/Global/SealTables.lua b/GZJ/Script/Global/SealTables.lua new file mode 100644 index 00000000..b54c740a --- /dev/null +++ b/GZJ/Script/Global/SealTables.lua @@ -0,0 +1,33 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by yh. +--- DateTime: 2023/4/18 10:14 +--- + +SealTables = {} + +-- 叠加数量(每多少只怪给奖励,且奖励二选一) +SealTables.MultiCount = 50 + +-- 每次封印奖励 +SealTables.Rewards = { + ["生命值"] = 1000, + ["防御值"] = 10, + ["最终伤害%"] = 0.5 * 0.01, + ["生命值加成%"] = 0.5 * 0.01, + ["防御值加成%"] = 0.05 * 0.01, + ["金币"] = 1250, + ["科技点"] = 10, + ["金币加成%"] = 2 * 0.01, + ["科技点加成%"] = 2 * 0.01, + ["经验加成%"] = 2 * 0.01, + ["掉宝率加成%"] = 2 * 0.01, + ["威力值"] = 50, + ["防御穿透"] = 5, + ["暴击伤害%"] = 3 * 0.01, + ["暴击伤害加成%"] = 0.5 * 0.01, + ["射击伤害%"] = 2 * 0.01, + ["威力值加成%"] = 0.5 * 0.01, + ["配件"] = 1, + ["技能书"] = 1 +} diff --git a/GZJ/Script/Global/SoundConfig.lua b/GZJ/Script/Global/SoundConfig.lua new file mode 100644 index 00000000..19cb6294 --- /dev/null +++ b/GZJ/Script/Global/SoundConfig.lua @@ -0,0 +1,59 @@ +SoundConfig = SoundConfig or {} + +SoundConfig.FX2D = { + ------------------------------------游戏背景音乐------------------------------------ + + [1] = '/Game/WwiseEvent/Music/Music_Main/Play_CG016_Music_Christmas_Theme.Play_CG016_Music_Christmas_Theme', --胜利:圣诞舞会 + [2] = '/Game/WwiseEvent/Music/Music_Main/Play_Music_Hall_InfectionTDM_CG010.Play_Music_Hall_InfectionTDM_CG010', --失败:精英之战 + [3] = '/Game/WwiseEvent/Music/Music_Main/Play_Music_Cyberpunk_Theme.Play_Music_Cyberpunk_Theme', --首领来临:赛博纪元 + [4] = '/Game/WwiseEvent/Music/Music_Main/Play_Music_CG008_Island_Theme.Play_Music_CG008_Island_Theme', --战斗音乐:无畏险境 +} + +SoundConfig.FX3D = { + ------------------------------------武器开火音效------------------------------------ + + [1] = '/Game/WwiseEvent/Weapon_Player/AK47/Weapon_AK47_Fire_Suppressed.Weapon_AK47_Fire_Suppressed', --AKM开火 + [2] = '/Game/WwiseEvent/Weapon_Player/M16A4/Weapon_M16A4_Fire_Suppressed.Weapon_M16A4_Fire_Suppressed', --M16开火 + [3] = '/Game/WwiseEvent/Weapon_Player/M14EBR/Weapon_M14EBR_Fire_Suppressed.Weapon_M14EBR_Fire_Suppressed', --SKS开火 + [4] = '/Game/WwiseEvent/Weapon_Player/HK416/Weapon_HK416_Fire_Suppressed.Weapon_HK416_Fire_Suppressed', --AWM开火 + [5] = '/Game/WwiseEvent/Weapon_Player/Groza/Weapon_Groza_Fire_Suppressed.Weapon_Groza_Fire_Suppressed', --S12K开火 + [6] = '/Game/WwiseEvent/Weapon_Player/AUG/Weapon_AUG_Fire_Suppressed.Weapon_AUG_Fire_Suppressed', --R1895开火 + [7] = '/Game/WwiseEvent/Weapon_Player/Bizon/Play_Bizon_Fire_Suppressed.Play_Bizon_Fire_Suppressed', --UZI开火 + + --------------------------------------技能音效-------------------------------------- + + [101] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Heal_1.Skill_Heal_1'), + [102] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Dash_1.Skill_Dash_1'), + [103] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Anger_1.Skill_Anger_1'), + [104] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_ShadowKill_1.Skill_ShadowKill_1'), + [105] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Slash_1.Skill_Dash_1'), + [106] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Stun_1.Skill_Stun_1'), + [107] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Exhaust_1.Skill_Exhaust_1'), + [108] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Penetration_1.Skill_Penetration_1'), + [109] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Counter_1.Skill_Counter_1'), + [110] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_ElectricShock_1.Skill_ElectricShock_1'), + [111] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_StarFall_1.Skill_StarFall_1'), + [112] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Ray_1.Skill_Ray_1'), + [113] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Crack_1.Skill_Crack_1'), + [114] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Weaken_1.Skill_Weaken_1'), + [115] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Scabbing_1.Skill_Scabbing_1'), + [116] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_DeathStrike_1.Skill_DeathStrike_1'), + [117] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Roar_1.Skill_Roar_1'), + [118] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_LightWave_1.Skill_LightWave_1'), + [119] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_IceFrost_1.Skill_IceFrost_1'), + [120] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_ToxicRain_1.Skill_ToxicRain_1'), + [121] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Puncture_1.Skill_Puncture_1'), + [122] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Seal_1.Skill_Seal_1'), + [123] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_AbsorbSoul_1.Skill_AbsorbSoul_1'), + [124] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Tread_1.Skill_Tread_1'), + [125] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Stomp_1.Skill_Stomp_1'), + [126] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_StrongWind_1.Skill_StrongWind_1'), + [127] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_FireDomain_1.Skill_FireDomain_1'), + [128] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Flowing_1.Skill_Flowing_1'), + [129] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Tear_1.Skill_Tear_1'), + [130] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_StickStrike_1.Skill_StickStrike_1'), + [131] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Shuttle_1.Skill_Shuttle_1'), + [132] = UGCGameSystem.GetUGCResourcesFullPath('Asset/WwiseEvent/SkillAudio/Skill_Bombing_1.Skill_Bombing_1'), +} + +return SoundConfig; \ No newline at end of file diff --git a/GZJ/Script/Global/TableHelper.lua b/GZJ/Script/Global/TableHelper.lua new file mode 100644 index 00000000..d59a492e --- /dev/null +++ b/GZJ/Script/Global/TableHelper.lua @@ -0,0 +1,57 @@ +TableHelper = TableHelper or {} + +function TableHelper.DeepCopy(obj) + local InTable = {}; + local function Func(obj) + if type(obj) ~= "table" then --判断表中是否有表 + return obj; + end + local NewTable = {}; --定义一个新表 + InTable[obj] = NewTable; --若表中有表,则先把表给InTable,再用NewTable去接收内嵌的表 + for k,v in pairs(obj) do --把旧表的key和Value赋给新表 + NewTable[Func(k)] = Func(v); + end + return setmetatable(NewTable, getmetatable(obj))--赋值元表 + end + return Func(obj) --若表中有表,则把内嵌的表也复制了 +end + +function TableHelper.DeepCopyTable(TableData) + if TableData == nil then + return {} + end + + local TmpTab = {} + for k, v in pairs(TableData) do + if type(v) == "table" then + local SubTab = TableHelper.DeepCopyTable(v) + TmpTab[k] = SubTab + else + TmpTab[k] = v + end + end + + return TmpTab +end + +function TableHelper.GetName(Actor) + if UE.IsValid(Actor) then + return UE.GetPathName(Actor) + elseif Actor ~= nil then + return type(Actor) + end + + return "[NullActor]" +end + +function TableHelper.Contains(tab, val) + for i, Val in pairs(tab) do + if Val == val then + return true + end + end + + return false +end + +return TableHelper \ No newline at end of file diff --git a/GZJ/Script/Global/Tables.lua b/GZJ/Script/Global/Tables.lua new file mode 100644 index 00000000..0d215778 --- /dev/null +++ b/GZJ/Script/Global/Tables.lua @@ -0,0 +1,1150 @@ +Tables = Tables or {} + +Tables.WeaponConstruct = nil + +Tables.GameStageTips = { + [EGameStage.WaitForPlayer] = "", +} + +Tables.HUDConfig = { + [EUIType.Main] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_MainUI.WBP_MainUI_C'), Layer = EUILayerGroup.MainUI}, + [EUIType.SelectDifficulty] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SelectDifficultyPanel.WBP_SelectDifficultyPanel_C'), Layer = EUILayerGroup.Medium}, + [EUIType.SelectSkill] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SelectSkill.WBP_SelectSkill_C'), Layer = EUILayerGroup.Medium}, + [EUIType.Attribute] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_AttributePanel.WBP_AttributePanel_C'), Layer = EUILayerGroup.Top}, + [EUIType.Notice] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_NoticeLayer.WBP_NoticeLayer_C'), Layer = EUILayerGroup.Notice}, + [EUIType.Backpack] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_Bag.WBP_Bag_C'), Layer = EUILayerGroup.Top}, + [EUIType.Settlement] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SettlementPanel.WBP_SettlementPanel_C'), Layer = EUILayerGroup.Toppest}, + [EUIType.Tech] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_TechnologyPanel.WBP_TechnologyPanel_C'), Layer = EUILayerGroup.Top}, + [EUIType.SelectWeapon] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SelectWeaponPanel.WBP_SelectWeaponPanel_C'), Layer = EUILayerGroup.Top}, + [EUIType.BossInfo] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_BossInfoPanel_V2.WBP_BossInfoPanel_V2_C'), Layer = EUILayerGroup.Top}, + [EUIType.Unpacking] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_Unpacking.WBP_Unpacking_C'), Layer = EUILayerGroup.Top}, + [EUIType.WeaponDetailsDesc] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_WeaponDetailsDesc.WBP_WeaponDetailsDesc_C'), Layer = EUILayerGroup.Top}, + [EUIType.WeaponAttribute] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_WeaponAttribute.WBP_WeaponAttribute_C'), Layer = EUILayerGroup.Top}, + [EUIType.Challenge] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_Challenge_V2.WBP_Challenge_V2_C'), Layer = EUILayerGroup.Top}, + [EUIType.SkillButton] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Skill/WBP_SkillBtn.WBP_SkillBtn_C'), Layer = EUILayerGroup.Medium}, + [EUIType.UseSkill] = { Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_SelectSkillSlots.WBP_SelectSkillSlots_C'), Layer = EUILayerGroup.Toppest }, + [EUIType.SealRewards] = { Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SealRewards.WBP_SealRewards_C'), Layer = EUILayerGroup.Top }, + [EUIType.Inherit] = { Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_InheritPanel.WBP_InheritPanel_C'), Layer = EUILayerGroup.Top }, + [EUIType.ResourceGrade] = { Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_ResourceGrade.WBP_ResourceGrade_C'), Layer = EUILayerGroup.Top }, + [EUIType.SaveGame] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SaveGamePanel.WBP_SaveGamePanel_C'), Layer = EUILayerGroup.Top}, + [EUIType.NewPlayerGuide] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Guide/WBP_GuidePanel.WBP_GuidePanel_C'), Layer = EUILayerGroup.Guide}, + [EUIType.DifficultInfo] = {Widget = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_DifficultInfo.WBP_DifficultInfo_C'), Layer = EUILayerGroup.Toppest}, +} + +Tables.MonsterPawn = { + DullMonsters = + { + UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_DullMonster1.BP_DullMonster1_C'), + }, + + AttackMonsters = + { + Normal = + { + --UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossMoment.BP_BossMoment_C') + MonsterDesc[10001].Path + }, + Boss = + { + + }, + } +} + +Tables.MonsterBaseConfig = { + [1001] = { + ID = 1001, + Name = "MonsterInherit_1", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterInherit_1.BP_MonsterInherit_1_C'), + Type = EMonsterType.Inherit, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1002] = { + ID = 1002, + Name = "MonsterInherit_2", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterInherit_2.BP_MonsterInherit_2_C') , + Type = EMonsterType.Inherit, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1003] = { + ID = 1003, + Name = "WeaponRecasting", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterWeaponRecasting.BP_MonsterWeaponRecasting_C') , + Type = EMonsterType.ChallengeWeaponRecasting, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1004] = { + ID = 1004, + Name = "SkillMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterSkillMonster.BP_MonsterSkillMonster_C') , + Type = EMonsterType.ChallengeSkill, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1005] = { + ID = 1005, + Name = "AccessoryMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterAccessoryMonster.BP_MonsterAccessoryMonster_C') , + Type = EMonsterType.ChallengeAccessory, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1006] = { + ID = 1006, + Name = "GoldEfficiencyMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterGoldEfficiencyMonster.BP_MonsterGoldEfficiencyMonster_C') , + Type = EMonsterType.ChallengeGoldEfficiency, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1007] = { + ID = 1007, + Name = "ExerciseRoom", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterExerciseRoom.BP_MonsterExerciseRoom_C') , + Type = EMonsterType.HangupRoom, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1008] = { + ID = 1008, + Name = "GoldMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterGoldMonster.BP_MonsterGoldMonster_C') , + Type = EMonsterType.ChallengeGold, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1009] = { + ID = 1009, + Name = "GradeBreakthrough", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterGradeBreakthrough.BP_MonsterGradeBreakthrough_C') , + Type = EMonsterType.Breach, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1010] = { + ID = 1010, + Name = "LittleMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterLittleMonster.BP_MonsterLittleMonster_C') , + Type = EMonsterType.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1011] = { + ID = 1011, + Name = "LittleMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterLittleMonster2.BP_MonsterLittleMonster2_C'), + Type = EMonsterType.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1012] = { + ID = 1012, + Name = "LittleMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterLittleMonster3.BP_MonsterLittleMonster3_C'), + Type = EMonsterType.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1013] = { + ID = 1013, + Name = "LittleMonster", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterLittleMonster6.BP_MonsterLittleMonster6_C'), + Type = EMonsterType.Common, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [1100] = { + ID = 1100, + Name = "Unseal", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_MonsterUnseal.BP_MonsterUnseal_C') , + Type = EMonsterType.Unseal, + SkillDescs = { + {SkillName = "", SkillDesc = ""}, + {SkillName = "", SkillDesc = ""} + } + }, + [10001] = { + ID = 10001, + Name = "Boorish", + ChineseName = "蛮", + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossBoorish.BP_BossBoorish_C') , + Type = EMonsterType.Boss, + WeaponType = EWeaponClassType.WT_Sniper, -- + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.Icon_UGC_file_28'), + SkillDescs = { + {SkillName = "蛮身诀", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_05.Icon_UGC_Boss_05'), SkillDesc = "防御值加成提高400%,每秒提升1%防御值加成"}, + {SkillName = "蛮跃击", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_06.Icon_UGC_Boss_06'), SkillDesc = "闪到跟前,然后对敌人周围600码所有敌人造成攻击力*(5+防御值加成)的伤害"} + }, + Characteristic = "强防御,突击" + }, + [10002] = { + ID = 10002, + Name = "Charm", + ChineseName = "魅", + WeaponType = EWeaponClassType.WT_SubmachineGun, -- + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossCharm.BP_BossCharm_C') , + Type = EMonsterType.Boss, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.Icon_UGC_file_28'), + SkillDescs = { + {SkillName = "魅魂咒", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_07.Icon_UGC_Boss_07'), SkillDesc = "每攻击5次,下次攻击会释放哀嚎,恐惧所有敌人2s,使敌人无法行动"}, + {SkillName = "魅之泽", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_08.Icon_UGC_Boss_08'), SkillDesc = "在所有敌人释放一个500码范围沼泽,2s后造成法术强度*5的法术伤害,对被恐惧的敌人造成伤害提升200%"} + }, + Characteristic = "强控制,群伤" + }, + [10003] = { + ID = 10003, + Name = "Moment", + ChineseName = "瞬", + WeaponType = EWeaponClassType.WT_ShooterRifle, -- + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossMoment.BP_BossMoment_C') , + Type = EMonsterType.Boss, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.Icon_UGC_file_28'), + SkillDescs = { + {SkillName = "瞬影步", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_09.Icon_UGC_Boss_09'), SkillDesc = "移动速度+180,攻击造成300%伤害,攻击距离降低50%"}, + {SkillName = "瞬暴风", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_10.Icon_UGC_Boss_10'), SkillDesc = "快速转动身体,2秒后自身周围产生一个400码范围的风暴,风暴内的敌人移动速度降低60%,且每0.2秒攻击一次风暴内的敌人"} + }, + Characteristic = "移速快,追击" + }, + [10004] = { + ID = 10004, + Name = "Spring", + ChineseName = "春", + WeaponType = EWeaponClassType.WT_AssaultRifle, -- + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossSpring.BP_BossSpring_C') , + Type = EMonsterType.Boss, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.Icon_UGC_file_28'), + SkillDescs = { + {SkillName = "春之术", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_11.Icon_UGC_Boss_11'), SkillDesc = "每秒回复6%最大生命值,且进入战斗20秒后,生命值高于80%时,造成伤害提升500%"}, + {SkillName = "春物语", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_12.Icon_UGC_Boss_12'), SkillDesc = "进入低语状态,每0.5秒向所有敌人脚下释放一个范围300码的雨泽,1秒后造成当前生命值的伤害"} + }, + Characteristic = "强恢复,群伤" + }, + [10005] = { + ID = 10005, + Name = "Careful", + ChineseName = "慎", + WeaponType = EWeaponClassType.WT_MachineGun, -- + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossCareful.BP_BossCareful_C') , + Type = EMonsterType.Boss, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.Icon_UGC_file_28'), + SkillDescs = { + {SkillName = "慎御盾", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_03.Icon_UGC_Boss_03'), SkillDesc = "生成一个自身100%生命值的护盾,被攻击优先消耗护盾,自身生命值100%持续10秒后,每秒会提升1%最大生命值,,直至生命值少于80%,最高提升至150%"}, + {SkillName = "慎升术", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_04.Icon_UGC_Boss_04'), SkillDesc = "进入战斗10秒后,每秒造成伤害提升2%,该效果不会消失,直至淘汰,期间每击败一名敌人,造成伤害提升20%"} + }, + Characteristic = "护盾,成长" + }, + [10006] = { + ID = 10006, + Name = "Magical", + ChineseName = "幻", + WeaponType = EWeaponClassType.WT_ShotGun, -- + Path = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/Monster/BP_BossMagical.BP_BossMagical_C') , + Type = EMonsterType.Boss, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/file_Icon/Textures/Icon_UGC_file_28.Icon_UGC_file_28'), + SkillDescs = { + {SkillName = "幻分身", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_01.Icon_UGC_Boss_01'), SkillDesc = "复制出4个与本体同样属性的分身"}, + {SkillName = "幻闪击", Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/Boss_Icon/Textures/Icon_UGC_Boss_02.Icon_UGC_Boss_02'), SkillDesc = "释放幻闪击,幻与其分身同时出现在随机玩家周围攻击"} + }, + Characteristic = "分身,爆发" + } + +} + +Tables.CommonAttackWave = { + {CommonID = 1010, AttackWaveNumber = 3, Order = 4}, + {CommonID = 1011, AttackWaveNumber = 3, Order = 3}, + {CommonID = 1012, AttackWaveNumber = 3, Order = 2}, + {CommonID = 1013, AttackWaveNumber = 3, Order = 1}, +} + + +Tables.Desc = {} + +Tables.Desc.Weapon = { + ["R1895"] = "攻击速度+30%,击败攻击力+0.5,溅射伤害+30%", + ["R45"] = "施法冷却缩短+20%,击败法术强度+0.6,溅射伤害+30%", + ["S12K"] = "攻击速度+30%,击败攻击力+0.5,溅射伤害+30%; 对分身造成400%的伤害", + ["S686"] = "施法冷却缩短+20%,击败法术强度+0.6,溅射伤害+30%; 对分身造成600%的伤害", + ["M249"] = "攻击速度+30%,击败攻击力+0.5,溅射伤害+30%; 造成伤害时,无视敌人护盾", + ["DP-28"] = "施法冷却缩短+20%,击败法术强度+0.6,溅射伤害+30%; 造成伤害时,无视敌人护盾", + ["UZI"] = "攻击速度+30%,击败攻击力+0.5,溅射伤害+30%; 免疫控制", + ["Vector"] = "施法冷却缩短+20%,击败法术强度+0.6,溅射伤害+30%; 免疫控制", + ["SKS"] = "攻击速度+30%,击败攻击力+0.5,溅射伤害+30%; 造成伤害时,降低敌人70%移动速度", + ["Mini14"] = "施法冷却缩短+20%,击败法术强度+0.6,溅射伤害+30%; 造成伤害时,降低敌人70%移动速度", + ["AKM"] = "攻击速度+30%,击败攻击力+0.5,溅射伤害+30%; 造成伤害时,敌人回血效果降低100%", + ["M416"] = "施法冷却缩短+20%,击败法术强度+0.6,溅射伤害+30%; 造成伤害时,敌人回血效果降低100%", + ["AWM"] = "攻击速度+30%,击败攻击力+0.5,溅射伤害+30%; 造成伤害时,直接移除敌人的物理和法术防御加成", + ["Kar98k"] = "施法冷却缩短+20%,击败法术强度+0.6,溅射伤害+30%; 造成伤害时,直接移除敌人的物理和法术防御加成", +} + +-- 存放武器配件的具体类型,因为大类是按照配件类型(比如枪口,瞄准镜等)分类,因此需要通过具体ID能找到他的类型 +--Tables.ItemParentType = { +-- [] = {""}, +--} + +-- 物品品质对应的颜色 +Tables.ItemRarityColor = { + [EQualityType.Primary] = { + --Color = { R = 0, G = 1, B = 0, A = 0.4 }, + Color = { R = 0.246201, G = 0.450786, B = 0.318547, A = 1.0 }, + LinearColor = "3F7351FF", + sRGB = "88B399FF", + }, -- 绿色,最垃圾 + [EQualityType.Middle] = { + --Color = { R = 0.07, G = 0.124, B = 0.354, A = 0.4 }, + -- 0.250158;0.462077;0.564712;1.0 + Color = { R = 0.250158, G = 0.462077, B = 0.564712, A = 1 }, + LinearColor = "407690FF", + sRGB = "89B5C6FF" + }, -- 蓝色,倒数第二 + [EQualityType.Senior] = { + --Color = { R = 0.7, G = 0.07, B = 1, A = 0.4 }, + --0.412543;0.291771;0.491021;1.0 + Color = { R = 0.412543, G = 0.291771, B = 0.491021, A = 1 }, + LinearColor = "694A7DFF", + sRGB = "AC93BAFF" + }, -- 紫色,倒数第三 + [EQualityType.Super] = { + --Color = { R = 1, G = 0, B = 0, A = 0.4 }, + --0.630757;0.155926;0.104616;1.0 + Color = { R = 0.630757, G = 0.155926, B = 0.104616, A = 1 }, + LinearColor = "A1271AFF", + sRGB = "D06D5AFF" + }, -- 红色,第一 + [5] = { + Color = { R = 0, G = 0, B = 0, A = 0.4 }, + }, -- 黑色,默认 +} + +Tables.WeaponClassTypeDesc = { + [EWeaponClassType.WT_Pistol] = { "手枪" }, + [EWeaponClassType.WT_ShotGun] = { "霰弹枪" }, + [EWeaponClassType.WT_MachineGun] = { "机枪" }, + [EWeaponClassType.WT_SubmachineGun] = { "冲锋枪" }, + [EWeaponClassType.WT_ShooterRifle] = { "射手步枪" }, + [EWeaponClassType.WT_AssaultRifle] = { "突击步枪" }, + [EWeaponClassType.WT_Sniper] = { "狙击枪" }, +} + +-- 品质 {描述,金币} +Tables.QualityInfo = { + [EQualityType.Primary] = {"初级", 1250}, + [EQualityType.Middle ] = {"中级", 3750}, + [EQualityType.Senior ] = {"高级", 11250}, + [EQualityType.Super ] = {"超级", 33750}, +} + +-- 这是物品 +Tables.ItemMeshConfig = { + [EItemType.SkillBook] = '/Game/Arts_Timeliness/CG005_Hero/Arts_Sence/CG005_SecretRoomBook.CG005_SecretRoomBook', + [EItemType.ScouringStone] = '/Game/Arts_Player/Weapon/Grenades/Mesh/ST_SignalSmoke.ST_SignalSmoke', + [EItemType.SubstituteStone] = '/Game/Arts_Player/Weapon/Grenades/Mesh/ST_Somke.ST_Somke', + [EItemType.Muzzle] = { + [EWeaponClassType.WT_ShotGun] = '/Game/Arts_Player/Weapon/Accessories/QK/QK_Large_Compensator/ST_QK_Large_Compensator_lod.ST_QK_Large_Compensator_lod', + [EWeaponClassType.WT_MachineGun] = '/Game/Arts_Player/Weapon/Accessories/QK/QK_Large_FlashHider/ST_QK_Large_Sniper_FlashHider_Lod.ST_QK_Large_Sniper_FlashHider_Lod', + [EWeaponClassType.WT_SubmachineGun] = '/Game/Arts_Player/Weapon/Accessories/QK/QK_Mid_Compensator/ST_QK_Mid_Compensator_Lod.ST_QK_Mid_Compensator_Lod', + [EWeaponClassType.WT_ShooterRifle] = '/Game/Arts_Player/Weapon/Accessories/QK/QK_Sniper_FlashHider/ST_QK_Sniper_FlashHider_Lod.ST_QK_Sniper_FlashHider_Lod', + [EWeaponClassType.WT_AssaultRifle] = '/Game/Arts_Player/Weapon/MainWeapon/Rifle/MK47/Mesh/ST_WEP_MK47_Muzzle.ST_WEP_MK47_Muzzle', + [EWeaponClassType.WT_Sniper] = '/Game/Arts_Player/Weapon/Accessories/Muzzle/Compensator/Compensator_AKM/ST_Muzzle_Compensater_AKM.ST_Muzzle_Compensater_AKM', + }, + [EItemType.Grip] = { + [EWeaponClassType.WT_ShotGun] = '/Game/Arts_Player/Weapon/Accessories/Grip/Angled/ST_Grip_Angled.ST_Grip_Angled', + [EWeaponClassType.WT_MachineGun] = '/Game/Arts_Player/Weapon/Accessories/Grip/HalfGrip/ST_Grip_HalfGrip.ST_Grip_HalfGrip', + [EWeaponClassType.WT_SubmachineGun] = '/Game/Arts_Player/Weapon/Accessories/Grip/LaserPointer/ST_Grip_Laserpointer.ST_Grip_Laserpointer', + [EWeaponClassType.WT_ShooterRifle] = '/Game/Arts_Player/Weapon/Accessories/Grip/LightGrip/ST_Grip_LightGrip.ST_Grip_LightGrip', + [EWeaponClassType.WT_AssaultRifle] = '/Game/Arts_Player/Weapon/Accessories/Grip/ThumbGrip/ST_Grip_ThumbGrip.ST_Grip_ThumbGrip', + [EWeaponClassType.WT_Sniper] = '/Game/Arts_Player/Weapon/Accessories/Grip/Vertical/ST_Grip_Vertical.ST_Grip_Vertical', + }, + [EItemType.Mag] = { + [EWeaponClassType.WT_ShotGun] = '/Game/Arts_Player/Weapon/Accessories/Mag/MAG_Saiga12/ST_MAG_EX_Saiga12.ST_MAG_EX_Saiga12', + [EWeaponClassType.WT_MachineGun] = '/Game/Arts_Player/Weapon/Accessories/Mag/Mag_M249/ST_MAG_EX_M249.ST_MAG_EX_M249', + [EWeaponClassType.WT_SubmachineGun] = '/Game/Arts_Player/Weapon/MainWeapon/Pistol/Vz61Skorpion/Mesh/ST_WEP_Vz61Skorpion_QE_Mag.ST_WEP_Vz61Skorpion_QE_Mag', + [EWeaponClassType.WT_ShooterRifle] = '/Game/Arts_Player/Weapon/Accessories/Mag/MAG_G36C/ST_Mag_QE_G36C.ST_Mag_QE_G36C', + [EWeaponClassType.WT_AssaultRifle] = '/Game/Arts_Player/Weapon/Accessories/Mag/MAG_Thompson/ST_MAG_EX_Drum.ST_MAG_EX_Drum', + [EWeaponClassType.WT_Sniper] = '/Game/Arts_Player/Weapon/Accessories/Mag/MAG_VSS/ST_MAG_Q_VSS.ST_MAG_Q_VSS', + }, + [EItemType.Stock] = { + [EWeaponClassType.WT_ShotGun] = '/Game/Arts_Player/Weapon/Accessories/BLS/BLS_K98k/ST_BLS_K98K.ST_BLS_K98K', + [EWeaponClassType.WT_MachineGun] = '/Game/Arts_Player/Weapon/Accessories/Stock/CheekPad/CheekPad_Winchester/ST_Stock_CheekPad_Winchester.ST_Stock_CheekPad_Winchester', + [EWeaponClassType.WT_SubmachineGun] = '/Game/Arts_Player/Weapon/Accessories/Stock/Stock/Stock_UZI/ST_Stock_UZI.ST_Stock_UZI', + [EWeaponClassType.WT_ShooterRifle] = '/Game/Arts_Player/Weapon/Accessories/BLS/BLS_Quiver/Quiver_setting.Quiver_setting', + [EWeaponClassType.WT_AssaultRifle] = '/Game/Arts_Player/Weapon/Accessories/MZJ/MZJ_RMR/ST_Scope_CantedRMR/ST_Scope_CantedRMR_L_lod.ST_Scope_CantedRMR_L_lod', + [EWeaponClassType.WT_Sniper] = '/Game/Arts_Player/Weapon/Accessories/Mag/Pickup/DJ_Small_Q/ST_DJ_Small_Q.ST_DJ_Small_Q', + }, + [EItemType.Scope] = { + [EWeaponClassType.WT_ShotGun] = '/Game/Arts_Player/Weapon/Accessories/MZJ/MZJ_HD/ST_MZJ_HD_Pickup.ST_MZJ_HD_Pickup', + [EWeaponClassType.WT_MachineGun] = '/Game/Arts_Player/Weapon/Accessories/MZJ/MZJ_QX/ST_MZJ_QX_Pickup.ST_MZJ_QX_Pickup', + [EWeaponClassType.WT_SubmachineGun] = '/Game/Arts_Player/Weapon/Accessories/MZJ/MZJ_2X/ST_MZJ_2X_Pickup.ST_MZJ_2X_Pickup', + [EWeaponClassType.WT_ShooterRifle] = '/Game/Arts_Player/Weapon/Accessories/MZJ/MZJ_4X/ST_MZJ_4X_Pickup.ST_MZJ_4X_Pickup', + [EWeaponClassType.WT_AssaultRifle] = '/Game/Arts_Player/Weapon/Accessories/MZJ/MZJ_6X/ST_Scope_6x_Pickup.ST_Scope_6x_Pickup', + [EWeaponClassType.WT_Sniper] = '/Game/Arts_Player/Weapon/Accessories/MZJ/MZJ_8X/ST_MZJ_8X_Pickup.ST_MZJ_8X_Pickup', + }, +} + +-- 预制的武器类型 +Tables.DefaultWeaponId = { + [103] = EWeaponClassType.WT_ShotGun, --霰弹枪 + [105] = EWeaponClassType.WT_MachineGun, --机枪 + [107] = EWeaponClassType.WT_SubmachineGun, --冲锋枪 + [109] = EWeaponClassType.WT_ShooterRifle, --射手步枪 + [111] = EWeaponClassType.WT_AssaultRifle, --突击步枪 + [113] = EWeaponClassType.WT_Sniper, --狙击枪 +} + +Tables.WeaponSoundConfig = { + [101] = 6, --手枪 + [103] = 5, --霰弹枪 + [105] = 2, --机枪 + [107] = 7, --冲锋枪 + [109] = 3, --射手步枪 + [111] = 1, --突击步枪 + [113] = 4, --狙击枪 +} + +--这是玩家高级属性词条随机表, (Min, Max] +Tables.WeaponPropertyConfig = { + [1] = { + PropName = "生命值", + RandomMin = 6000.00, + RandomMax = 12000.00, + Property = 0.170, + ProbabilityMin = 0, + ProbabilityMax = 34 + }, + [2] = { + PropName = "能量值", + RandomMin = 20.00, + RandomMax = 40.00, + Property = 0.080, + ProbabilityMin = 34, + ProbabilityMax = 50 + }, + [3] = { + PropName = "生命值回复", + RandomMin = 120.00, + RandomMax = 360.00, + Property = 0.100, + ProbabilityMin = 50, + ProbabilityMax = 70 + }, + [4] = { + PropName = "能量值回复", + RandomMin = 5.00, + RandomMax = 10.00, + Property = 0.050, + ProbabilityMin = 70, + ProbabilityMax = 80 + }, + [5] = { + PropName = "防御", + RandomMin = 100.00, + RandomMax = 300.00, + Property = 0.140, + ProbabilityMin = 80, + ProbabilityMax = 108 + }, + [6] = { + PropName = "生命值加成", + RandomMin = 0.20, + RandomMax = 0.40, + Property = 0.030, + ProbabilityMin = 108, + ProbabilityMax = 114 + }, + [7] = { + PropName = "最终伤害%", + RandomMin = 0.10, + RandomMax = 0.20, + Property = 0.010, + ProbabilityMin = 114, + ProbabilityMax = 116 + }, + [8] = { + PropName = "射速", + RandomMin = 0.20, + RandomMax = 0.40, + Property = 0.030, + ProbabilityMin = 116, + ProbabilityMax = 122 + }, + [9] = { + PropName = "附加伤害", + RandomMin = 0.20, + RandomMax = 0.40, + Property = 0.030, + ProbabilityMin = 122, + ProbabilityMax = 128 + }, + [10] = { + PropName = "威力值", + RandomMin = 600.00, + RandomMax = 1200.00, + Property = 0.140, + ProbabilityMin = 128, + ProbabilityMax = 156 + }, + [11] = { + PropName = "暴击概率", + RandomMin = 0.10, + RandomMax = 0.15, + Property = 0.030, + ProbabilityMin = 156, + ProbabilityMax = 162 + }, + [12] = { + PropName = "射击伤害", + RandomMin = 0.20, + RandomMax = 0.40, + Property = 0.050, + ProbabilityMin = 162, + ProbabilityMax = 172 + }, + [13] = { + PropName = "射击伤害加成", + RandomMin = 0.15, + RandomMax = 0.25, + Property = 0.015, + ProbabilityMin = 172, + ProbabilityMax = 175 + }, + [14] = { + PropName = "威力值加成", + RandomMin = 0.20, + RandomMax = 0.40, + Property = 0.030, + ProbabilityMin = 175, + ProbabilityMax = 181 + }, + [15] = { + PropName = "暴击伤害", + RandomMin = 0.30, + RandomMax = 0.60, + Property = 0.080, + ProbabilityMin = 181, + ProbabilityMax = 197 + }, + [16] = { + PropName = "暴击伤害加成", + RandomMin = 0.15, + RandomMax = 0.25, + Property = 0.015, + ProbabilityMin = 197, + ProbabilityMax = 200 + } +} + +Tables.GameReadyStageConfig = { + [1] = { + Stage = EGameReadyStage.SelectGameDifficulty, + TriggerUI = EUIType.SelectDifficulty, + WaitTime = 15, + CheckFunction = "CheckAllPlayersGameDifficultySelection" + }, + [2] = { + Stage = EGameReadyStage.SelectDefaultTalentSkill, + TriggerUI = EUIType.SelectSkill, + WaitTime = 15, + CheckFunction = "CheckAllPlayersDefaultTelentSelection" + }, +} + +Tables.GameFightStageConfig = { + [1] = { + [1] = { + WaitTime = 150.0, MonsterNum = {Normal = 1, Boss = 0} + }, + [2] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [3] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [4] = { + WaitTime = 150.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [5] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [6] = { + WaitTime = 180.0, MonsterNum = {Normal = 20, Boss = 1} + }, + --[7] = { + -- WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + --}, + --[8] = { + -- WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + --}, + --[9] = { + -- WaitTime = 180.0, MonsterNum = {Normal = 20, Boss = 1} + --}, + }, + [2] = { + [1] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [2] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [3] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [4] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [5] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [6] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [7] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [8] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [9] = { + WaitTime = 180.0, MonsterNum = {Normal = 20, Boss = 1} + }, + }, + [3] = { + [1] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [2] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [3] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [4] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [5] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [6] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [7] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [8] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [9] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [10] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [11] = { + WaitTime = 180.0, MonsterNum = {Normal = 20, Boss = 1} + }, + }, + [4] = { + [1] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [2] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [3] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [4] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [5] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [6] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [7] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [8] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [9] = { + WaitTime = 120.0, MonsterNum = {Normal = 20, Boss = 1} + }, + [10] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [11] = { + WaitTime = 90.0, MonsterNum = {Normal = 20, Boss = 0} + }, + [12] = { + WaitTime = 180.0, MonsterNum = {Normal = 20, Boss = 1} + }, + }, + +} + + + +Tables.Tech = { + [1001] = { + TypeName = "金币加成%" , bLimit = false, LimitNum = 0 , KillingPoints = function (Num) return 10+2*(Num-1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_03.Icon_UGC_technology_03'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Eco_CoinPoint = TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Eco_CoinPoint + 0.02 + end + }, + [1002] = { + TypeName = "科技点加成%" , bLimit = false, LimitNum = 0 , KillingPoints = function (Num) return 10+2*(Num-1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_05.Icon_UGC_technology_05'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Eco_KillPoint = TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Eco_KillPoint + 0.02 + end + }, + [1003] = { + TypeName = "掉宝率加成%" , bLimit = false, LimitNum = 0 , KillingPoints = function (Num) return 10+2*(Num-1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_02.Icon_UGC_technology_02'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Eco_DropRate = TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Eco_DropRate + 0.02 + end + }, + [1004] = { + TypeName = "经验加成%" , bLimit = true , LimitNum = 50 , KillingPoints = function (Num) return 10+2*(Num-1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_04.Icon_UGC_technology_04'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Eco_Exp = TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Eco_Exp + 0.02 + end + }, + [1005] = { + TypeName = "射击伤害%" , bLimit = false, LimitNum = 0 , KillingPoints = function (Num) return 10+2*(Num-1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_01.Icon_UGC_technology_01'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Adv_FireAttack = TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Adv_FireAttack + 0.02 + end + }, + [1006] = { + TypeName = "暴击伤害%" , bLimit = false, LimitNum = 0 , KillingPoints = function (Num) return 10+2*(Num-1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_06.Icon_UGC_technology_06'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Adv_CriticalAttack = TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Adv_CriticalAttack + 0.03 + end + }, + [1007] = { + TypeName = "置换石" , bLimit = true , LimitNum = 3 , KillingPoints = function (Num) return 80+40*(Num-1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_07.Icon_UGC_technology_07'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:UpdateItemMap(32000, 1) + end + }, + [1008] = { + TypeName = "重铸石" , bLimit = false, LimitNum = 0 , KillingPoints = function (Num) return 80+40*(Num-1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_08.Icon_UGC_technology_08'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:UpdateItemMap(31000, 1) + end + }, + [1009] = { + TypeName = "威力值", bLimit = false, LimitNum = 0, KillingPoints = function(Num) return 10 + 2 * (Num - 1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_06.Icon_UGC_technology_06'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Base_Attack = TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Base_Attack + 10 + end + }, + [1010] = { + TypeName = "射击速度", bLimit = false, LimitNum = 0, KillingPoints = function(Num) return 10 + 2 * (Num - 1) end, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/technology_Icon/Textures/Icon_UGC_technology_05.Icon_UGC_technology_05'), + ChangeTechParam = function (TargetPlayerController) + TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Base_AttackSpeed = TargetPlayerController:GetCurPlayerState().Attributes[AttributeType.Base].Base_AttackSpeed + 0.01 + end + } +} + +Tables.Unpacking = { + LevelCoinPoint = { + [1] = { + CoinPoint1 = 1250, + CoinPoint10 = 12250, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_01.Icon_UGC_chest_01'), + Info = "20%概率获得初级技能*1,80%概率获得生命值50-100,或威力值5-10;\n十连抽时,必定获得初级技能*1" + }, + [2] = { + CoinPoint1 = 3750, + CoinPoint10 = 36750, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_02.Icon_UGC_chest_02'), + Info = "20%概率获得中级技能*1,,80%概率获得生命值150-300,或威力值15-30;\n十连抽时,必定获得中级技能*1" + }, + [3] = { + CoinPoint1 = 11250, + CoinPoint10 = 110250, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/chest_Icon/Textures/Icon_UGC_chest_03.Icon_UGC_chest_03'), + Info = "20%概率获得高级技能*1,80%概率获得生命值500-900,或威力值50-90;\n十连抽时,必定获得者高级技能*1" + } + }, + CardDropping = { + Name = "", + Rate = 1.0, + Children = { + [1] = { + Name = "属性加成", + Rate = 0.80, + Children = { + [1] = { + Name = "生命值", + Rate = 0.70, + AddDataFun = function(TargetController, UnpackingLevel) + local MinHP = {50, 150, 500} + local MaxHP = {100, 300, 900} + local AddHP = math.random(MinHP[UnpackingLevel], MaxHP[UnpackingLevel]) + TargetController:GetCurPlayerState().Attributes[AttributeType.Base].Base_MaxHP = TargetController:GetCurPlayerState().Attributes[AttributeType.Base].Base_MaxHP + AddHP + TargetController:GetCurPlayerState():ApplyAttributes() + return {Name = "生命值 " .. tostring(AddHP), IsAttribute = true, UnpackingLevel = 1} + end + }, + [2] = { + Name = "威力值", + Rate = 0.30, + AddDataFun = function(TargetController, UnpackingLevel) + local MinAttack = {5, 15, 50} + local MaxAttack = {10, 30, 90} + local AddAttack = math.random(MinAttack[UnpackingLevel], MaxAttack[UnpackingLevel]) + TargetController:GetCurPlayerState().Attributes[AttributeType.Base].Base_Attack = TargetController:GetCurPlayerState().Attributes[AttributeType.Base].Base_Attack + AddAttack + TargetController:GetCurPlayerState():ApplyAttributes() + return {Name = "威力值 " .. tostring(AddAttack), IsAttribute = true, UnpackingLevel = 1} + end + } + } + }, + [2] = { + Name = "掉落物", + Rate = 0.20, + Children = { + [1] = { + Name = "配件", + Rate = 0, + AddDataFun = function(TargetController, UnpackingLevel) + local GameState = UGCGameSystem.GameState + if GameState then + if UnpackingLevel == 1 then + UnpackingLevel = UnpackingLevel + GameState:GetRandomIndex({9, 1}) - 1 + elseif UnpackingLevel == 2 then + UnpackingLevel = UnpackingLevel + GameState:GetRandomIndex({95, 5}) - 1 + elseif UnpackingLevel == 3 then + UnpackingLevel = UnpackingLevel + GameState:GetRandomIndex({99, 1}) - 1 + end + end + local ID = DropItemMap.RandomFun.FittingItem(UnpackingLevel) + TargetController:UpdateItemMap(ID, 1) + + return { Name = + DropItemMap.FittingItemMap[ID].Quality .. "-" .. + DropItemMap.FittingItemMap[ID].WeaponType .. "-" .. + DropItemMap.FittingItemMap[ID].FittingType, + IsAttribute = false, UnpackingLevel = UnpackingLevel} + end + }, + [2] = { + Name = "技能", + Rate = 1, + AddDataFun = function (TargetController, UnpackingLevel) + local GameState = UGCGameSystem.GameState + if GameState then + if UnpackingLevel == 1 then + UnpackingLevel = UnpackingLevel + GameState:GetRandomIndex({9, 1}) - 1 + elseif UnpackingLevel == 2 then + UnpackingLevel = UnpackingLevel + GameState:GetRandomIndex({95, 5}) - 1 + elseif UnpackingLevel == 3 then + UnpackingLevel = UnpackingLevel + GameState:GetRandomIndex({99, 1}) - 1 + end + end + local ID = DropItemMap.RandomFun.SkillItem(UnpackingLevel) + TargetController:UpdateItemMap(ID, 1) + + return { Name = + DropItemMap.SkillItemMap[ID].SkillName .. "+1", + IsAttribute = false, UnpackingLevel = UnpackingLevel} + end + }, + [3] = { + Name = "道具", + Rate = 0, + AddDataFun = function (TargetController, UnpackingLevel) + local propID = {32000, 31000} + local ID = propID[1] + if math.random(1, 5) == 1 then + ID = propID[2] + end + TargetController:UpdateItemMap(ID, 1) + + if ID == 32000 then + return { Name = "置换石+1", IsAttribute = false, UnpackingLevel = 3} + else + return { Name = "重铸石+1", IsAttribute = false, UnpackingLevel = 3} + end + end + } + } + } + } + } +} + +-- 突破 奖励 +Tables.BreachRewards = { + [0] = {}, + [1] = { + Health = 1000, + Attack = 250, + Bonus_Gold = 0.1, + Attack_Speed = 0.1, + Attack_Damage = 0.1, + Move_Speed = 10, + SelectWeaponTimes = 1, + Stone = 1, + }, + [2] = { + Health = 2000, + Attack = 200, + Bonus_Gold = 0.15, + Attack_Speed = 0.15, + Attack_Damage = 0.15, + Move_Speed = 10, + SelectWeaponTimes = 1, + Stone = 1, + }, + [3] = { + Health = 3000, + Attack = 550, + Bonus_Gold = 0.2, + Attack_Speed = 0.2, + Attack_Damage = 0.2, + Move_Speed = 10, + SelectWeaponTimes = 1, + Stone = 1, + }, + [4] = { + Health = 4000, + Attack = 400, + Bonus_Gold = 0.25, + Attack_Speed = 0.25, + Attack_Damage = 0.25, + Move_Speed = 10, + SelectWeaponTimes = 1, + Stone = 1, + }, + [5] = { + Health = 5000, + Attack = 500, + Bonus_Gold = 0.3, + Attack_Speed = 0.3, + Attack_Damage = 0.3, + Move_Speed = 10, + SelectWeaponTimes = 1, + Stone = 1, + }, + [6] = { + Health = 6000, + Attack = 600, + Bonus_Gold = 0.5, + Attack_Speed = 0.5, + Attack_Damage = 0.5, + Move_Speed = 10, + SelectWeaponTimes = 1, + Stone = 1, + }, +} +Tables.ChallengeInfo = { + [1] = { + MonsterName = "金币怪", + MonsterID = 1008, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_02.Icon_UGC_challenge_02'), + SkillIcon = nil, + DifficultyLimit = {1, 1, 2, 3}, + CoolingTime = 30, + LifeTime = 30, + IncomeIndex = 0, -- 收益显示切换界面的索引 + IncomeGold = {1200, 3000, 8400, 12000}, + IncomeInfo = nil, + IncomeFun = function(PlayerKey, MonsterLevel) end, -- 金币收益怪物死亡调整 + Recommend = { 205, 334, 607, 1520, }, + RecommendFunc = function(InNum) + return 1.1 ^ (InNum - 1) + end + }, + [2] = { + MonsterName = "金币效率怪", + MonsterID = 1006, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_05.Icon_UGC_challenge_05'), + SkillIcon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_04.Icon_UGC_monster_04'), + DifficultyLimit = {1, 1, 2, 3}, + CoolingTime = 60, + LifeTime = 60, + IncomeIndex = 1, -- 收益显示切换界面的索引 + IncomeGold = {0, 0, 0, 0}, + IncomeInfo = {{"金币加成%+5%"}, {"金币加成%+10%"}, {"金币加成%+15%"}, {"金币加成%+20%"}}, + IncomeFun = function(PlayerKey, MonsterLevel) + local GoldAddition = {0.05, 0.10, 0.15, 0.20} + local TargetPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + TargetPlayerState.Attributes[AttributeType.Base].Eco_CoinPoint = TargetPlayerState.Attributes[AttributeType.Base].Eco_CoinPoint + GoldAddition[MonsterLevel] + end, + Recommend = { 284, 463, 843, 2099 }, + RecommendFunc = function(InNum) -- N:难度 + return 1.1 ^ (InNum - 1) + end, + SkillDesc = { + Skill1 = "坚韧:受到伤害降低30%", + Skill2 = "荆棘:每隔10秒,触发荆棘,在接下来3秒内,反弹所受伤害的30%" + } + }, + [3] = { + MonsterName = "配件怪", + MonsterID = 1005, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_03.Icon_UGC_challenge_03'), + SkillIcon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_15.Icon_UGC_monster_15'), + DifficultyLimit = {1, 1, 2, 3}, + CoolingTime = 90, + LifeTime = 90, + IncomeIndex = 1, -- 收益显示切换界面的索引 + IncomeGold = {0, 0, 0, 0}, + IncomeInfo = { + {"低级配件+1", "生命值+100", "威力值+10"}, + {"低级配件+1", "生命值+250", "威力值+25"}, + {"中级配件+1", "生命值+400", "威力值+40"}, + {"中级配件+1", "生命值+800", "威力值+80"} + }, + IncomeFun = function(PlayerKey, MonsterLevel) + local HPAddition = {100, 250, 400, 800} + local AttackAddition = {100, 250, 400, 800} + local FittingItemLevel = {1, 1, 2, 3} + local TargetPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + TargetPlayerState.Attributes[AttributeType.Base].Base_MaxHP = TargetPlayerState.Attributes[AttributeType.Base].Base_MaxHP + HPAddition[MonsterLevel] + TargetPlayerState.Attributes[AttributeType.Base].Base_Attack = TargetPlayerState.Attributes[AttributeType.Base].Base_Attack + AttackAddition[MonsterLevel] + TargetPlayerState:ApplyAttributes() + -- 添加配件 + local FittingItemID = DropItemMap.RandomFun.FittingItem(FittingItemLevel[MonsterLevel]) + local TargetPlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) + TargetPlayerController:UpdateItemMap(FittingItemID, 1) + end , + Recommend = {1392, 2294, 4386, 9784}, + RecommendFunc = function(InNum) + return 1.1 ^ (InNum - 1) + end, + SkillDesc = { + Skill1 = "旋风:每隔10秒,释放一个100码范围的旋风,延时1秒后,旋风会朝正前方快速移动,对击中目标造成攻击力*10的伤害", + Skill2 = "收割:旋风击中目标,提升50%攻击力,直至淘汰" + } + }, + [4] = { + MonsterName = "技能怪", + MonsterID = 1004, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_01.Icon_UGC_challenge_01'), + SkillIcon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_02.Icon_UGC_monster_02'), + DifficultyLimit = {1, 1, 2, 3}, + CoolingTime = 90, + LifeTime = 90, + IncomeIndex = 1, -- 收益显示切换界面的索引 + IncomeGold = {0, 0, 0, 0}, + IncomeInfo = { + {"低级技能+1", "生命值+100", "威力值+10"}, + {"低级技能+1", "生命值+250", "威力值+25"}, + {"中级技能+1", "生命值+400", "威力值+40"}, + {"中级技能+1", "生命值+800", "威力值+80"} + }, + IncomeFun = function(PlayerKey, MonsterLevel) + local HPAddition = {100, 250, 400, 800} + local AttackAddition = {100, 250, 400, 800} + local SkillItemLevel = {1, 1, 2, 3} + local TargetPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + TargetPlayerState.Attributes[AttributeType.Base].Base_MaxHP = TargetPlayerState.Attributes[AttributeType.Base].Base_MaxHP + HPAddition[MonsterLevel] + TargetPlayerState.Attributes[AttributeType.Base].Base_Attack = TargetPlayerState.Attributes[AttributeType.Base].Base_Attack + AttackAddition[MonsterLevel] + TargetPlayerState:ApplyAttributes() + -- 添加技能书 + local SkillItemID = DropItemMap.RandomFun.SkillItem(SkillItemLevel[MonsterLevel]) + local TargetPlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) + TargetPlayerController:UpdateItemMap(SkillItemID, 1) + --UnrealNetwork.CallUnrealRPC(TargetPlayerController, TargetPlayerController, "ClientRPC_UpdateBackpackItemMap", TargetPlayerController:GetItemMap()) + end, + Recommend = {1392, 2294, 4386, 9784}, + RecommendFunc = function(InNum) + return 1.1 ^ (InNum - 1) + end, + SkillDesc = { + Skill1 = "末日:持续施法,每秒在目标脚下释放一个200码范围的末日,延时1秒后,对范围内敌人造成攻击力*5的伤害", + Skill2 = "附魂:末日每击中敌人一次,提升自身50%攻击力,直至淘汰" + } + }, + [5] = { + MonsterName = "武器重铸怪", + MonsterID = 1003, + Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/challenge_Icon/Textures/Icon_UGC_challenge_04.Icon_UGC_challenge_04'), + SkillIcon = UGCGameSystem.GetUGCResourcesFullPath('Asset/IconTexture/monster_Icom/Textures/Icon_UGC_monster_03.Icon_UGC_monster_03'), + DifficultyLimit = {1, 1, 2, 3}, + CoolingTime = 120, + LifeTime = 120, + IncomeIndex = 1, -- 收益显示切换界面的索引 + IncomeGold = {0, 0, 0, 0}, + IncomeInfo = { + {"重铸石+1", "生命值+600" , "威力值+60"}, + {"重铸石+1", "生命值+1000", "威力值+100"}, + {"重铸石+2", "生命值+1200", "威力值+120"}, + {"重铸石+2", "生命值+1800", "威力值+180"} + }, + IncomeFun = function(PlayerKey, MonsterLevel) + local HPAddition = {600, 1000, 1200, 1800} + local AttackAddition = {60, 100, 120, 180} + local propNum = {1, 1, 2, 2} + local TargetPlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(PlayerKey) + TargetPlayerState.Attributes[AttributeType.Base].Base_MaxHP = TargetPlayerState.Attributes[AttributeType.Base].Base_MaxHP + HPAddition[MonsterLevel] + TargetPlayerState.Attributes[AttributeType.Base].Base_Attack = TargetPlayerState.Attributes[AttributeType.Base].Base_Attack + AttackAddition[MonsterLevel] + TargetPlayerState:ApplyAttributes() + -- 添加重铸石 + local TargetPlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) + TargetPlayerController:UpdateItemMap(31000, propNum[MonsterLevel]) + --UnrealNetwork.CallUnrealRPC(TargetPlayerController, TargetPlayerController, "ClientRPC_UpdateBackpackItemMap", TargetPlayerController:GetItemMap()) + end, + Recommend = {2088, 3442, 6580, 14677}, + RecommendFunc = function(InNum) + return 1.1 ^ (InNum - 1) + end, + SkillDesc = { + Skill1 = "护体:每隔20秒,身体周围出现一个生命值*50%的护盾,护盾被击破后,对敌人造成攻击力*100%伤害", + Skill2 = "嗜血:每隔15秒,攻击速度提升50%,持续5秒", + }, + }, +} + +--index = challengeMonsterType, value = Tables.ChallengeInfo.index +Tables.ChallengeMonsterTypeInfo = { + [EMonsterType.ChallengeGold] = 1, + [EMonsterType.ChallengeGoldEfficiency] = 2, + [EMonsterType.ChallengeAccessory] = 3, + [EMonsterType.ChallengeSkill] = 4, + [EMonsterType.ChallengeWeaponRecasting] = 5, +} \ No newline at end of file diff --git a/GZJ/Script/Global/UIConfig.lua b/GZJ/Script/Global/UIConfig.lua new file mode 100644 index 00000000..4e729495 --- /dev/null +++ b/GZJ/Script/Global/UIConfig.lua @@ -0,0 +1,120 @@ +UIConfig = UIConfig or {} + +UIConfig.General = { + ----------------------Notice---------------------- + [EUIType.Notice] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_NoticeLayer.WBP_NoticeLayer_C'), + Root = UIRoot.CommonNoticeRoot, + }, + + --------------------Settlement-------------------- + [EUIType.Settlement] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SettlementPanel.WBP_SettlementPanel_C'), + Root = UIRoot.SettlementRoot, + }, + + ----------------------Battle---------------------- + [EUIType.Main] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_MainUI.WBP_MainUI_C'), + Root = UIRoot.BattleRoot, + }, + [EUIType.SkillButton] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Skill/WBP_SkillBtn.WBP_SkillBtn_C'), + Root = UIRoot.BattleRoot, + }, + + ----------------------Middle---------------------- + [EUIType.SelectDifficulty] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SelectDifficultyPanel.WBP_SelectDifficultyPanel_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.SelectSkill] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SelectSkill.WBP_SelectSkill_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.Attribute] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_AttributePanel.WBP_AttributePanel_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.Backpack] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_Bag.WBP_Bag_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.SelectWeapon] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SelectWeaponPanel.WBP_SelectWeaponPanel_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.BossInfo] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_BossInfoPanel_V2.WBP_BossInfoPanel_V2_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.Unpacking] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_Unpacking.WBP_Unpacking_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.WeaponDetailsDesc] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_WeaponDetailsDesc.WBP_WeaponDetailsDesc_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.WeaponAttribute] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_WeaponAttribute.WBP_WeaponAttribute_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.Challenge] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_Challenge_V2.WBP_Challenge_V2_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.SealRewards] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SealRewards.WBP_SealRewards_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.Inherit] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_InheritPanel.WBP_InheritPanel_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.ResourceGrade] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_ResourceGrade.WBP_ResourceGrade_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.SaveGame] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SaveGamePanel.WBP_SaveGamePanel_C'), + Root = UIRoot.MiddleRoot, + }, + [EUIType.Tech] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_TechnologyPanel.WBP_TechnologyPanel_C'), + Root = UIRoot.MiddleRoot, + }, + + ----------------------Common---------------------- + [EUIType.UseSkill] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_SelectSkillSlots.WBP_SelectSkillSlots_C'), + Root = UIRoot.CommonRoot, + }, + [EUIType.DifficultInfo] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_DifficultInfo.WBP_DifficultInfo_C'), + Root = UIRoot.CommonRoot, + }, + + ----------------------Guide----------------------- + [EUIType.GeneralGuide] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Guide/WBP_GuideTips_0.WBP_GuideTips_0_C'), + Root = UIRoot.GeneralGuideRoot, + }, + [EUIType.ForceGuide] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Guide/WBP_ForceGuidePanel.WBP_ForceGuidePanel_C'), + Root = UIRoot.GeneralGuideRoot, + }, + + ----------------------GM-------------------------- + [EUIType.GM] = { + WidgetClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/GM/WBP_GM.WBP_GM_C'), + Root = UIRoot.GeneralGuideRoot, + }, +} + +UIConfig.Guide = { + [EGuideWidgetType.Square] = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Guide/WBP_GuideTips_1.WBP_GuideTips_1_C'), + [EGuideWidgetType.Round] = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Guide/WBP_GuideTips_2.WBP_GuideTips_2_C'), +} + +return UIConfig \ No newline at end of file diff --git a/GZJ/Script/Global/VectorHelper.lua b/GZJ/Script/Global/VectorHelper.lua new file mode 100644 index 00000000..7418f7ae --- /dev/null +++ b/GZJ/Script/Global/VectorHelper.lua @@ -0,0 +1,109 @@ +VectorHelper = VectorHelper or {} + +function VectorHelper.Dot(v1, v2) + return v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z +end + +function VectorHelper.Mul(v1, v2) + return Vector.New(v1.X * v2.X, v1.Y * v2.Y, v1.Z * v2.Z) +end + +function VectorHelper.MulNumber(v1, number) + return Vector.New(v1.X * number, v1.Y * number, v1.Z * number) +end + +function VectorHelper.Sub(v1, v2) + return Vector.New(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z) +end + +function VectorHelper.Add(v1, v2) + return Vector.New(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z) +end + +function VectorHelper.NewVec(X, Y, Z) + return Vector.New(X, Y, Z) +end + +function VectorHelper.VecToString(v) + return string.format("(%.2f,%.2f,%.2f)", v.X, v.Y, v.Z) +end + +function VectorHelper.RotToString(v) + return string.format("(Roll = %.2f, Pitch = %.2f, Yaw = %.2f)", v.Roll, v.Pitch, v.Yaw) +end + +function VectorHelper.Cross(v1, v2) + return Vector.New( + v1.Y * v2.Z - v2.Y * v1.Z, + v1.Z * v2.X - v2.Z * v1.X, + v1.X * v2.Y - v2.X * v1.Y) +end + +function VectorHelper.GetDistance(vector1, vector2) + if vector1 == nil or vector2 == nil then return 0 end + if vector1.X == nil or vector2.X == nil then return 0 end + if vector1.Y == nil or vector2.Y == nil then return 0 end + if vector1.Z == nil or vector2.Z == nil then return 0 end + local disX = vector1.X - vector2.X + local disY = vector1.Y - vector2.Y + local disZ = vector1.Z - vector2.Z + return math.sqrt(disX ^ 2 + disY ^ 2 + disZ ^ 2) +end + +function VectorHelper.GetDistance2D(vector1, vector2) + if vector1 == nil or vector2 == nil then return 0 end + if vector1.X == nil or vector2.X == nil then return 0 end + if vector1.Y == nil or vector2.Y == nil then return 0 end + local disX = vector1.X - vector2.X + local disY = vector1.Y - vector2.Y + return math.sqrt(disX ^ 2 + disY ^ 2) +end + +function VectorHelper.LengthSquared(v) + return v.X ^ 2 + v.Y ^ 2 + v.Z ^ 2 +end + +function VectorHelper.Length(v) + return math.sqrt(VectorHelper.LengthSquared(v)) +end + +function VectorHelper.ToLuaTable(v) + return {X = v.X, Y = v.Y, Z = v.Z} +end + +function VectorHelper.RotToLuaTable(v) + return {Roll = v.Roll, Pitch = v.Pitch, Yaw = v.Yaw} +end + +function VectorHelper.RotZero() + return {Roll = 0, Pitch = 0, Yaw = 0} +end + +function VectorHelper.NewRot(Roll, Pitch, Yaw) + return {Roll = Roll, Pitch = Pitch, Yaw = Yaw} +end + +function VectorHelper.VectorZero() + return {X = 0, Y = 0, Z = 0} +end + +function VectorHelper.ScaleOne() + return {X = 1, Y = 1, Z = 1} +end + +function VectorHelper.Scale(InScalar) + return {X = InScalar, Y = InScalar, Z = InScalar} +end + +function VectorHelper.RandomVector(v, radius) + local rx = math.random(-radius, radius); + local ry = math.random(-radius, radius); + return {X = v.X + rx, Y = v.Y + ry, Z = v.Z} +end + +function VectorHelper.RandomRotatorYaw(r) + local rz = math.random(-360, 360); + return {Roll = r.Roll, Pitch = r.Pitch, Yaw = r.Yaw + rz} +end + +return VectorHelper \ No newline at end of file diff --git a/GZJ/Script/Global/Version.lua b/GZJ/Script/Global/Version.lua new file mode 100644 index 00000000..7109a8c6 --- /dev/null +++ b/GZJ/Script/Global/Version.lua @@ -0,0 +1,37 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by yh. +--- DateTime: 2023/5/6 10:51 +--- + + +Version = {} + +Version.MajorVersion = 0 +Version.MinorVersion = 3 + +Version.WhiteList = { + 1000, + 1001, + 1002, + 1003, + 410373679, + 410383482, + 410383537, +} + + +function Version.GetCurrentVersion() + return string.format("%d.%d", Version.MajorVersion, Version.MinorVersion) +end + +function Version.CheckTestWhiteList(UID) + for _, WhiteID in pairs(Version.WhiteList) do + if UID == WhiteID then + return true + end + end + return false +end + +return Version diff --git a/GZJ/Script/Manager/CameraManager.lua b/GZJ/Script/Manager/CameraManager.lua new file mode 100644 index 00000000..708a73cd --- /dev/null +++ b/GZJ/Script/Manager/CameraManager.lua @@ -0,0 +1,41 @@ +local CameraManager = LuaClass("CameraManager") + +CameraManager.OwnerController = nil +CameraManager.OverlookCamera = nil + +function CameraManager:ctor(OwnerController) + UE.Log("[CameraManager:ctor]") + + if OwnerController == nil then + local Controller = GameDataManager.OwnerPlayerController + self.OwnerController = Controller + return + end + + self.OwnerController = OwnerController +end + +function CameraManager:SetupOverlookCamera() + if self.OwnerController == nil or UE.IsValid(self.OwnerController) == false then + UE.LogError("[CameraManager:SetupOverlookCamera] invalid OwnerController") + return + end + + local WorldContextObject = self.OwnerController + AsyncLoadTools:LoadObject(BPClassPath.CustomCameraActor, + function(CameraClass) + local Pawn = WorldContextObject:K2_GetPawn() + if Pawn then + local Camera = UGCGameSystem.SpawnActor(WorldContextObject, CameraClass, Pawn:K2_GetActorLocation(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), WorldContextObject) + Camera:K2_AttachToComponent(Pawn.CameraSocket, "", EAttachmentRule.SnapToTarget, EAttachmentRule.SnapToTarget, EAttachmentRule.SnapToTarget, false) + self.OverlookCamera = Camera + WorldContextObject:SetViewTargetWithBlend(Camera, 0, EViewTargetBlendFunction.VTBlend_Linear, 0, false) + end + end) +end + +function CameraManager:GetCamera() + return self.OverlookCamera +end + +return CameraManager \ No newline at end of file diff --git a/GZJ/Script/Manager/CommandQueneManager.lua b/GZJ/Script/Manager/CommandQueneManager.lua new file mode 100644 index 00000000..d2d40bf0 --- /dev/null +++ b/GZJ/Script/Manager/CommandQueneManager.lua @@ -0,0 +1,111 @@ +---@class CommandQueneManager +CommandQueneManager = CommandQueneManager or { + bGameStateReady = false; + bPlayerCtrlReady = false; + bPlayerPawnReady = false; + bPlayerStateReady = false; + + bHasInit = false; + + InitCommandList = {}; + CommandList = {}; +}; + +require('Script.Global.GlobalFunctions') +local TableHelper = require('Script.Global.TableHelper') + +function __FILE__() return debug.getinfo(2, 'S').source end +function __LINE__() return debug.getinfo(2, 'l').currentline end +function __FUNC__() return debug.getinfo(2, 'n').name end + +--- 添加初始化命令 +---@param InObject any +---@param InFunc function @函数变量 +function CommandQueneManager:AddInitCommand(InObject, InFunc) + if UE.IsValid(InObject) == false then + return + end + UE.Log("[CommandQueneManager] *** 新增初始化命令 Object[%s] InFunc[%s]", TableHelper.GetName(InObject), tostring(InFunc)) + table.insert(CommandQueneManager.InitCommandList, {Object=InObject, Func=InFunc}) +end + +function CommandQueneManager:RemoveInitCommand(InObject) + local RemovedFuncNum = 0 + for index, FuncData in pairs(CommandQueneManager.InitCommandList) do + if FuncData.Object == InObject then + CommandQueneManager.InitCommandList[index] = nil + RemovedFuncNum = RemovedFuncNum + 1 + end + end + UE.Log("[CommandQueneManager] *** 删除初始化命令 Object[%s] RemovedNum=%d", TableHelper.GetName(InObject), RemovedFuncNum) +end + +--- 添加常规执行命令 +---@param InObject any +---@param InFunc function @函数变量 +function CommandQueneManager:AddCommand(InObject, InFunc) + UE.Log("[CommandQueneManager] *** 新增命令 Object[%s] InFunc[%s]", TableHelper.GetName(InObject), tostring(InFunc)) + table.insert(CommandQueneManager.CommandList, {Object=InObject, Func=InFunc}) +end + + +function CommandQueneManager:Update() + --- 没有初始化前先调用初始化命令 + if not CommandQueneManager.bHasInit + and CommandQueneManager.bGameStateReady + and CommandQueneManager.bPlayerCtrlReady + and CommandQueneManager.bPlayerPawnReady + and CommandQueneManager.bPlayerStateReady then + CommandQueneManager.bHasInit = true + + local PendingKillObject = {} + UE.Log("[CommandQueneManager] *** >>> =====开始处理初始化命令===== Num = %d", table.getCount(CommandQueneManager.InitCommandList)) + local CommandIndex = 1 + for _, FuncData in pairs(CommandQueneManager.InitCommandList) do + if FuncData.Object ~= nil then + if UE.IsValid(FuncData.Object) then + FuncData.Func(FuncData.Object) + UE.Log("[CommandQueneManager] *** >>> Index = %d, objName = %s, Func = %s", CommandIndex, TableHelper.GetName(FuncData.Object), tostring(FuncData.Func)) + else + UE.Log("[CommandQueneManager] *** >>> Index = %d, objName = %s is invalid, skipped!", CommandIndex, TableHelper.GetName(FuncData.Object)) + table.insert(PendingKillObject, FuncData.Object) + end + else + FuncData.Func() + UE.Log("[CommandQueneManager] *** >>> Index = %d, Func = %s", CommandIndex, tostring(FuncData.Func)) + end + CommandIndex = CommandIndex + 1 + end + UE.Log("[CommandQueneManager] *** >>> =====处理初始化命令完毕=====") + + for _, obj in ipairs(PendingKillObject) do + for index, FuncData in pairs(CommandQueneManager.InitCommandList) do + if obj == FuncData.Object then + CommandQueneManager.InitCommandList[index] = nil + end + end + end + end + + if CommandQueneManager.bHasInit then + if #CommandQueneManager.CommandList <= 0 then + return + end + + UE.Log("[CommandQueneManager] *** >>> 处理命令 %d", #CommandQueneManager.CommandList) + for _, FuncData in pairs(CommandQueneManager.CommandList) do + if FuncData.Object ~= nil then + if UE.IsValid(FuncData.Object) then + FuncData.Func(FuncData.Object) + end + else + FuncData.Func() + end + end + + -- 调用完就清除 + CommandQueneManager.CommandList = {} + end +end + +return CommandQueneManager; \ No newline at end of file diff --git a/GZJ/Script/Manager/EffectSystemManager.lua b/GZJ/Script/Manager/EffectSystemManager.lua new file mode 100644 index 00000000..078f03dd --- /dev/null +++ b/GZJ/Script/Manager/EffectSystemManager.lua @@ -0,0 +1,359 @@ +---技能特效系统,仅存在于客户端 +EffectSystemManager = LuaClass("EffectSystemManager") + +--存储所有特效实例 +EffectSystemManager.ExistedEffectList = {} + +EffectSystemManager.EffectTable = require('Script.Global.EffectTables') + +--调试信息开关 +EffectSystemManager.OpenDebug = GlobalConfigs.OpenDebug + +function EffectSystemManager.ctor() +end + +------------------------------------------------------ [[外部接口]] --------------------------------------------------------------- + +---播放粒子特效: 默认生成在CasterActor上,若ActorList不为nil则生成在ActorList中Actor的位置 +---@param InstanceId number 特效实例ID +---@param EffectId number 特效ID(保存在EffectTables.lua文件中) +---@param CasterActor AActor 特效发起Actor +---@param ActorList AActor[] 特效目标Actor列表(可为空) +---@param Duration number 特效持续时间(0则表示AutoDestroy) +---@param SpawnLocationType EEffectSpawnLocationType 特效生成位置(Bottom 脚下, Middle 中间, Top 头顶, Attach 吸附骨骼,) +---@param BoneName string 特效吸附骨骼(仅当SpawnLocationType为Attach时才生效) +function EffectSystemManager.PlayEffect(InstanceId, EffectId, CasterActor, ActorList, Duration, SpawnLocationType, BoneName) + EffectSystemManager.ApplyEffect(InstanceId, EffectId, CasterActor, ActorList, Duration, SpawnLocationType, BoneName) +end + +---播放指向型粒子特效: 默认CasterActor为起点, DestActor为终点; 若DestActor为nil, 则Rotation为指定角度 +---@param InstanceId number 特效实例ID +---@param EffectId number 特效ID(保存在EffectTables.lua文件中) +---@param CasterActor AActor 特效起始Actor +---@param DestActor AActor 特效终点Actor +---@param Duration number 特效持续时间(0则表示AutoDestroy) +---@param Rotation FRotator 指定角度(DestActor为空时才生效) +function EffectSystemManager.PlayDirectionalEffect(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation) + EffectSystemManager.ApplyDirectionalEffect(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation) +end + +---播放粒子特效在世界坐标 +---@param InstanceId number 特效实例ID +---@param EffectId number 特效ID(保存在EffectTables.lua文件中) +---@param CasterActor AActor 特效发起Actor(可为空) +---@param Location FVector 指定位置 +---@param Rotation FRotator 指定旋转 +---@param Duration number 特效持续时间(0则表示AutoDestroy) +---@return UParticleSystemComponent +function EffectSystemManager.PlayEffectAtLocation(InstanceId, EffectId, CasterActor, Location, Rotation, Duration) + return EffectSystemManager.ApplyEffectAtLocation(InstanceId, EffectId, CasterActor, Location, Rotation, Duration) +end + +---获取特效实例 +---可在获取后做进一步处理,如调整特效位置 + +---根据InstanceId获取EffectInstance +---@param InstanceId number 特效实例ID +---@return EffectInstance +function EffectSystemManager.GetEffectInstanceWithId(InstanceId) + for _, v in pairs(EffectSystemManager.ExistedEffectList) do + if v.InstanceId == InstanceId then + return v + end + end +end + +---根据CasterActor获取所有关联EffectInstance +---@param CasterActor AActor 特效发起Actor +------@return EffectInstance[] +function EffectSystemManager.GetEffectInstanceListOfActor(CasterActor) + local EffectInstanceList = {} + for _, v in pairs(EffectSystemManager.ExistedEffectList) do + if v.CasterActor == CasterActor then + table.insert(EffectInstanceList, v) + end + end + return EffectInstanceList +end + +--------------------------------------------------------- [[内部调用]] --------------------------------------------------------- + +function EffectSystemManager.ApplyEffect(InstanceId, EffectId, CasterActor, ActorList, Duration, SpawnLocationType, BoneName) + if InstanceId == nil or EffectId == nil or CasterActor == nil then + return + end + if Duration == nil or type(Duration) ~= "number" then + Duration = 0 + end + if SpawnLocationType == nil then + SpawnLocationType = EEffectSpawnLocationType.Bottom + end + local bAutoDestroy = Duration < 0.01 + + local bSpawnEmitterSuccess = EffectSystemManager.PlayParticleSystem(InstanceId, EffectId, CasterActor, ActorList, SpawnLocationType, BoneName, bAutoDestroy) + if not bSpawnEmitterSuccess then + UE.LogError("[EffectSystemManager.ApplyEffect] Failed. EffectId: %d", EffectId) + return + end + + if bAutoDestroy == false then + CasterActor.EffectDurationTimer = EventSystem.SetTimer(CasterActor, function() + EffectSystemManager.RemoveEffectByInstanceId(InstanceId) + CasterActor.EffectDurationTimer = nil + end, Duration) + end + + UE.Log("[EffectSystemManager.ApplyEffect] Success. InstanceId: %d, EffectId: %d", InstanceId, EffectId) +end + +function EffectSystemManager.ApplyDirectionalEffect(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation) + if InstanceId == nil or EffectId == nil or CasterActor == nil then + return + end + if Duration == nil or type(Duration) ~= "number" then + Duration = 0 + end + + local bAutoDestroy = Duration < 0.01 + + local bSpawnEmitterSuccess = EffectSystemManager.PlayDirectionalParticleSystem(InstanceId, EffectId, CasterActor, DestActor, Rotation, bAutoDestroy) + if not bSpawnEmitterSuccess then + UE.LogError("[EffectSystemManager.ApplyDirectionalEffect] Failed. EffectId: %d", EffectId) + return + end + + if bAutoDestroy == false then + CasterActor.EffectDurationTimer = EventSystem.SetTimer(CasterActor, function() + EffectSystemManager.RemoveEffectByInstanceId(InstanceId) + CasterActor.EffectDurationTimer = nil + end, Duration) + end + + UE.Log("[EffectSystemManager.ApplyDirectionalEffect] Success. InstanceId: %d, EffectId: %d", InstanceId, EffectId) +end + +function EffectSystemManager.ApplyEffectAtLocation(InstanceId, EffectId, CasterActor, Location, Rotation, Duration) + local ParticleTemplate = EffectSystemManager.GetEffectTemplateById(EffectId) + if ParticleTemplate == nil then + UE.LogError("[EffectSystemManager.ApplyEffectAtLocation] invalid EffectId: %d", EffectId) + return nil + end + if Duration == nil or type(Duration) ~= "number" then + Duration = 0 + end + + local bAutoDestroy = Duration < 0.01 + local CurEmitter = GameplayStatics.SpawnEmitterAtLocation(CasterActor, ParticleTemplate, Location, Rotation, VectorHelper.ScaleOne(), bAutoDestroy) + + if CurEmitter ~= nil and bAutoDestroy == false then + CasterActor.EffectDurationTimer = EventSystem.SetTimer(CasterActor, function() + EffectSystemManager.RemoveEffectByInstanceId(InstanceId) + CasterActor.EffectDurationTimer = nil + end, Duration) + end + + UE.Log("[EffectSystemManager.ApplyEffectAtLocation] %s. InstanceId: %d, EffectId: %d", CurEmitter ~= nil and "Success" or "Failed", InstanceId, EffectId) + + return CurEmitter +end + +function EffectSystemManager.GetEffectTemplateById(EffectId) + local EffectTemplate = AsyncLoadTools.GetEffectByIndex(EffectId) + if EffectTemplate == nil then + local Path = EffectSystemManager.EffectTable.Paths[EffectId] + if Path ~= nil then + EffectTemplate = UE.LoadObject(Path) + end + end + return EffectTemplate +end + +function EffectSystemManager.UpdateEffectInstanceList(InstanceId, EffectId, EmitterList, CasterActor) + local EffectInstance = {} + EffectInstance.InstanceId = InstanceId + EffectInstance.EffectName = EffectId + EffectInstance.EmitterList = EmitterList + EffectInstance.CasterActor = CasterActor + table.insert(EffectSystemManager.ExistedEffectList, EffectInstance) +end + +function EffectSystemManager.PlayParticleSystem(InstanceId, EffectId, CasterActor, ActorList, SpawnLocationType, BoneName, bAutoDestroy) + local ParticleTemplate = EffectSystemManager.GetEffectTemplateById(EffectId) + if ParticleTemplate == nil then + UE.LogError("[EffectSystemManager.PlayParticleSystem] invalid EffectId: "..tostring(EffectId)) + return false + end + + local EmitterList = {} + + if ActorList == nil then + local CurEmitter = nil + if SpawnLocationType == EEffectSpawnLocationType.Attach then + if BoneName == nil then + BoneName = "" + end + CurEmitter = GameplayStatics.SpawnEmitterAttached(ParticleTemplate, CasterActor.Mesh, BoneName, VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, bAutoDestroy) + else + local SpawnRot = CasterActor:K2_GetActorRotation() + local SpawnLoc = CasterActor:K2_GetActorLocation() + local SpawnLocZ = SpawnLoc.Z + + if SpawnLocationType == EEffectSpawnLocationType.Bottom then + SpawnLocZ = SpawnLocZ - CasterActor.CapsuleComponent.CapsuleHalfHeight + elseif SpawnLocationType == EEffectSpawnLocationType.Top then + SpawnLocZ = SpawnLocZ + CasterActor.CapsuleComponent.CapsuleHalfHeight + end + SpawnLoc = {X = SpawnLoc.X, Y = SpawnLoc.Y, Z = SpawnLocZ} + + CurEmitter = GameplayStatics.SpawnEmitterAtLocation(CasterActor, ParticleTemplate, SpawnLoc, SpawnRot, VectorHelper.ScaleOne(), bAutoDestroy) + end + + if CurEmitter ~= nil then + table.insert(EmitterList, CurEmitter) + end + else + for _, Actor in pairs(ActorList) do + local CurEmitter = nil + if SpawnLocationType == EEffectSpawnLocationType.Attach then + if BoneName == nil then + BoneName = "" + end + CurEmitter = GameplayStatics.SpawnEmitterAttached(ParticleTemplate, Actor.Mesh, BoneName, VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), EAttachLocation.SnapToTarget, bAutoDestroy) + else + local SpawnRot = Actor:K2_GetActorRotation() + local SpawnLoc = Actor:K2_GetActorLocation() + local SpawnLocZ = SpawnLocationType == EEffectSpawnLocationType.Bottom and SpawnLoc.Z - CasterActor.CapsuleComponent.CapsuleHalfHeight or SpawnLoc.Z + CasterActor.CapsuleComponent.CapsuleHalfHeight + SpawnLoc = {X = SpawnLoc.X, Y = SpawnLoc.Y, Z = SpawnLocZ} + + CurEmitter = GameplayStatics.SpawnEmitterAtLocation(Actor, ParticleTemplate, SpawnLoc, SpawnRot, VectorHelper.ScaleOne(), bAutoDestroy) + end + + if CurEmitter ~= nil then + table.insert(EmitterList, CurEmitter) + --EffectSystemManager.UpdateEffectInstanceList(InstanceId, EffectId, {CurEmitter}, Actor) + end + end + end + + EffectSystemManager.UpdateEffectInstanceList(InstanceId, EffectId, EmitterList, CasterActor) + return not table.isEmpty(EmitterList) +end + +function EffectSystemManager.PlayDirectionalParticleSystem(InstanceId, EffectId, CasterActor, DestActor, Rotation, bAutoDestroy) + local ParticleTemplate = EffectSystemManager.GetEffectTemplateById(EffectId) + if ParticleTemplate == nil then + UE.LogError("[EffectSystemManager.PlayDirectionalParticleSystem] invalid EffectId: "..tostring(EffectId)) + return false + end + + local EmitterList = {} + + local SpawnLoc = CasterActor:K2_GetActorLocation() + local SpawnRot = VectorHelper.RotZero() + + if DestActor ~= nil then + local DestLoc = DestActor:K2_GetActorLocation() + SpawnRot = KismetMathLibrary.FindLookAtRotation(SpawnLoc, DestLoc) + + if GlobalConfigs.OpenDebug then + STExtraGameplayStatics.ClientDrawDebugLine(SpawnLoc, DestLoc, {R=1,G=0,B=0,A=1}, 5, 1) + end + else + SpawnRot = Rotation + end + + local CurEmitter = GameplayStatics.SpawnEmitterAtLocation(CasterActor, ParticleTemplate, SpawnLoc, Rotation, VectorHelper.ScaleOne(), bAutoDestroy) + if CurEmitter ~= nil then + table.insert(EmitterList, CurEmitter) + end + + EffectSystemManager.UpdateEffectInstanceList(InstanceId, EffectId, EmitterList, CasterActor) + return not table.isEmpty(EmitterList) +end + +--------------------------------------------------------- 移除技能效果[外部接口] --------------------------------------------------------- + +---移除指定Id对应的效果 +function EffectSystemManager.RemoveEffectByInstanceId(InstanceId) + if InstanceId == nil then + UE.Log("[EffectSystemManager.RemoveEffectByInstanceId] InstanceId is nil") + return + end + + local PendingEffectInstances = {} + for i, v in pairs(EffectSystemManager.ExistedEffectList) do + if v.InstanceId == InstanceId then + PendingEffectInstances[i] = v + end + + -- 顺便把一些可能没正确去除的去掉 + if v.CasterActor == nil or UE.IsValid(v.CasterActor) == false then + EffectSystemManager.RemoveEffectInstance(v) + EffectSystemManager.ExistedEffectList[i] = nil + end + end + + if not table.isEmpty(PendingEffectInstances) then + for i, EffectInstance in pairs(PendingEffectInstances) do + EffectSystemManager.RemoveEffectInstance(EffectInstance) + EffectSystemManager.ExistedEffectList[i] = nil + end + else + UE.LogError("[EffectSystemManager.RemoveEffectByInstanceId] Can't find EffectInstance with InstanceId: %d", InstanceId) + end +end + +---移除指定Name的效果 +function EffectSystemManager.RemoveEffectByEffectName(CasterActor, EffectName) + if EffectName == nil then + UE.Log("[EffectSystemManager.RemoveEffectByEffectName] EffectName is nil") + return + end + + local PendingEffectInstances = {} + for i, v in pairs(EffectSystemManager.ExistedEffectList) do + if v.EffectName == EffectName and v.CasterActor == CasterActor then + PendingEffectInstances[i] = v + end + + -- 顺便把一些可能没正确去除的去掉 + if v.CasterActor == nil or UE.IsValid(v.CasterActor) == false then + EffectSystemManager.ExistedEffectList[i] = nil + end + end + + if not table.isEmpty(PendingEffectInstances) then + for i, EffectInstance in pairs(PendingEffectInstances) do + EffectSystemManager.RemoveEffectInstance(EffectInstance) + EffectSystemManager.ExistedEffectList[i] = nil + end + else + UE.LogError("[EffectSystemManager.RemoveEffectByEffectName] Can't find EffectInstance with EffectName: "..tostring(EffectName)) + end +end + +---移除指定Actor的所有效果 +function EffectSystemManager.RemoveAllEffectOfActor(CasterActor) + for i, v in pairs(EffectSystemManager.ExistedEffectList) do + if v.CasterActor == CasterActor then + EffectSystemManager.RemoveEffectInstance(v) + EffectSystemManager.ExistedEffectList[i] = nil + end + end +end + +------------------------------------------- 移除效果实例[内部接口] ------------------------------------------- + +---@param CasterActor AActor +---@param EffectInstance int +function EffectSystemManager.RemoveEffectInstance(EffectInstance) + if EffectInstance.EmitterList ~= nil and table.getCount(EffectInstance.EmitterList) > 0 then + for _, Emitter in pairs(EffectInstance.EmitterList) do + if Emitter ~= nil and UE.IsValid(Emitter) then + Emitter:K2_DestroyComponent() + end + end + end +end + +return EffectSystemManager \ No newline at end of file diff --git a/GZJ/Script/Manager/GameDataManager.lua b/GZJ/Script/Manager/GameDataManager.lua new file mode 100644 index 00000000..f0408a6e --- /dev/null +++ b/GZJ/Script/Manager/GameDataManager.lua @@ -0,0 +1,505 @@ +--[[------------------------------------------游戏数据管理中心------------------------------------------------------]]-- +GameDataManager = GameDataManager or {} + +GameDataManager.HasInitialized = false + +--[[------------------------------------------动态数据------------------------------------------------------]]-- + +--游戏准备阶段配置表 +GameDataManager.GameReadyStageConfigTable = {} + +--技能配置表 +GameDataManager.SkillConfigTable = {} + +--武器初始化表 +GameDataManager.WeaponConstructTable = {} + +--物品初始化表 +GameDataManager.ItemConfigTable = {} + +--物品模型表 +GameDataManager.ItemMeshConfigTable = {} + +--怪物信息表(已分类) +GameDataManager.MonsterBaseConfigTable = {} + +--结算数据(仅用于Client) +GameDataManager.GameResultData = {} + +-- 表示视觉效果的全局ID +GameDataManager.EffectInstanceId = 0 + +--[[------------------------------------------常用指针------------------------------------------------------]]-- + +--当前PlayerState (仅用于Client) +GameDataManager.OwnerPlayerState = nil + +--当前PlayerController (仅用于Client) +GameDataManager.OwnerPlayerController = nil + +GameDataManager.CommonAttackWaveList = {} + +function GameDataManager:Init() + if GameDataManager.HasInitialized then + return + end + + self:LoadGameReadyStageConfigTable() + self:LoadSkillConfigTable() + self:LoadWeaponConstructTable() + self:LoadItemConfigTable() + self:LoadMonsterBaseConfigTable() + + GameDataManager.InitCommonAttackWaveList() + + GameDataManager.HasInitialized = true +end + +function GameDataManager:UnInit() + GameDataManager.MonsterBaseConfigTable = nil + GameDataManager.ItemConfigTable = nil + GameDataManager.ItemMeshConfigTable = nil + GameDataManager.GameReadyStageConfigTable = nil + GameDataManager.SkillConfigTable = nil + GameDataManager.WeaponConstructTable = nil + GameDataManager.GameResultData = nil + GameDataManager.OwnerPlayerState = nil + GameDataManager.OwnerPlayerController = nil +end + +function GameDataManager.GetEffectInstanceId() + GameDataManager.EffectInstanceId = GameDataManager.EffectInstanceId + 1 + return GameDataManager.EffectInstanceId +end + +function GameDataManager:LoadGameReadyStageConfigTable() + GameDataManager.GameReadyStageConfigTable = CSVLoader.LoadTable("CSV/GameReadyStageConfigTable", nil) + + table.sort(GameDataManager.GameReadyStageConfigTable, function(a, b) return a.Stage < b.Stage end) + + for i, v in pairs(GameDataManager.GameReadyStageConfigTable) do + UE.Log("[CSV][GameReadyStageConfig] 游戏准备阶段配置: Index = %d, Stage = %d, WaitTime = %.2f", i, v.Stage, v.WaitTime) + end +end + +function GameDataManager:LoadSkillConfigTable() + local SkillConfig = require("Script.SimpleSkill.SkillConfig") + GameDataManager.SkillConfigTable = SkillConfig + + for i, v in pairs(GameDataManager.SkillConfigTable) do + UE.Log("[CSV][SkillConfig] 技能参数配置: SkillName = %s, Desc = %s", i, v.Description) + end +end + +function GameDataManager:LoadWeaponConstructTable() + GameDataManager.WeaponConstructTable = CSVLoader.LoadTable("CSV/WeaponAppearanceTable", nil) + + for i, v in pairs(GameDataManager.WeaponConstructTable) do + UE.Log("[CSV][WeaponConstruct] 武器初始化配置: WeaponID = %s, WeaponName = %s", i, v.WeaponName) + end +end + +function GameDataManager:LoadItemConfigTable() + local ItemDataConfigTable = CSVLoader.LoadTable("CSV/ItemDataConfigTable", "ItemID") + + GameDataManager.ItemMeshConfigTable = Tables.ItemMeshConfig + GameDataManager.ItemConfigTable = ItemDataConfigTable + + for i, v in pairs(GameDataManager.ItemConfigTable) do + UE.Log("[CSV][ItemConfig] 道具配置: ItemID = %s, ItemType = %s", i, v.ItemType) + end +end + +function GameDataManager:LoadMonsterBaseConfigTable() + local InfoTable = {} + for MonsterID, MonsterConfig in pairs(Tables.MonsterBaseConfig) do + if InfoTable[MonsterConfig.Type] == nil then + InfoTable[MonsterConfig.Type] = {} + end + table.insert(InfoTable[MonsterConfig.Type], MonsterConfig) + end + GameDataManager.MonsterBaseConfigTable = InfoTable +end + +function GameDataManager.GetItemMeshPathByItemType(InItemType, WeaponClassType) + local MeshPath = GameDataManager.ItemMeshConfigTable[InItemType] + if MeshPath == nil then + return nil + end + if WeaponClassType == nil then + return KismetSystemLibrary.MakeSoftObjectPath(MeshPath) + end + return KismetSystemLibrary.MakeSoftObjectPath(MeshPath[WeaponClassType]) +end + +function GameDataManager.GetItemInfoByItemID(InItemID) + --首先获取各种类型 + --操作一下Id + if DropItemConfigTable.Items[InItemID] ~= nil then + return DropItemConfigTable.Items[InItemID] + end + + InItemID = InItemID // 100 * 100 + if DropItemConfigTable.Items[InItemID] ~= nil then + return DropItemConfigTable.Items[InItemID] + end + + local ItemType = GetItemTypeByItemId(InItemID) + if DropItemConfigTable.Items[ItemType] ~= nil then + return DropItemConfigTable.Items[ItemType + 1] + end + + -- 这个就是具体的大类 + local val = InItemID // 1000 * 1000 + if ItemType == EItemType.SkillBook then + val = 21000 + end + if DropItemConfigTable.Items[val] ~= nil then + return DropItemConfigTable.Items[val] + end + + print("[GameDataManager.GetItemInfoByItemID] 查看是否其他方式进行找到对应数据的,通过现有的方法无法找到") + return nil +end + +function GameDataManager.GetItemIconByItemID(InItemID) + return GameDataManager.GetItemInfoByItemID(InItemID).Icon +end + +function GameDataManager.GetItemDescByItemID(InItemID) + InItemID = InItemID - InItemID % 1000 + return GameDataManager.ItemConfigTable[InItemID].Desc +end + +function GameDataManager.GetItemNameByItemID(InItemID) + +end + +function GameDataManager.GetItemTypeByItemID(InItemID) + InItemID = InItemID - InItemID % 1000 + return GameDataManager.ItemConfigTable[InItemID].ItemType +end + +function GameDataManager.GetGameReadyStageConfig() + if table.isEmpty(GameDataManager.GameReadyStageConfigTable) then + GameDataManager:LoadGameReadyStageConfigTable() + end + + return GameDataManager.GameReadyStageConfigTable +end + +function GameDataManager.GetGameReadyStageInfoByStage(InStage) + if table.isEmpty(GameDataManager.GameReadyStageConfigTable) then + GameDataManager:LoadGameReadyStageConfigTable() + end + + for _, v in pairs(GameDataManager.GameReadyStageConfigTable) do + if v.Stage == InStage then + return v + end + end + + return nil +end + +function GameDataManager.GetWeaponMeshInfo(ID) + local WeaponConstructData = GameDataManager.GetWeaponConstructDataByID(ID) + if WeaponConstructData then + return WeaponConstructData.MeshConfig + end + return nil +end + +function GameDataManager.GetWeaponIcon(ID) + local WeaponConstructData = GameDataManager.GetWeaponConstructDataByID(ID) + if WeaponConstructData then + return WeaponConstructData.Icon + end + return nil +end + +function GameDataManager.GetWeaponType(ID) + local WeaponConstructData = GameDataManager.GetWeaponConstructDataByID(ID) + if WeaponConstructData then + return WeaponConstructData.WeaponType + end + return nil +end + +function GameDataManager.GetSkillData(SkillName) + if table.isEmpty(GameDataManager.SkillConfigTable) then + GameDataManager:LoadSkillConfigTable() + end + + for i, v in pairs(GameDataManager.SkillConfigTable) do + if tonumber(i) == tonumber(SkillName) then + UE.Log("[GameDataManager][GetSkillData] find skillname: InSkillName = %s", tostring(SkillName)) + return v + end + end + UE.Log("[GameDataManager][GetSkillData] can't find skill: InSkillName = %s", tostring(SkillName)) + return nil +end + +function GameDataManager.GetSkillTypeByName(SkillName) + if table.isEmpty(GameDataManager.SkillConfigTable) then + GameDataManager:LoadSkillConfigTable() + end + + for i, v in pairs(GameDataManager.SkillConfigTable) do + if tonumber(i) == tonumber(SkillName) then + UE.Log("[GameDataManager][GetSkillTypeByName] skillname = %d, Find SkillType=%d", SkillName, v.SkillType) + return v.SkillType + end + end + UE.Log("[GameDataManager][GetSkillTypeByName] skillname = %d, cant Find SkillType", SkillName) + return nil +end + +function GameDataManager.GetSkillNamesByAccessType(InAccessType) + if InAccessType > ESkillAccessType.Acquired or InAccessType < ESkillAccessType.BuiltIn then + return {} + end + + if table.isEmpty(GameDataManager.SkillConfigTable) then + GameDataManager:LoadSkillConfigTable() + end + + local SkillNames = {} + for SkillName, SkillConfig in pairs(GameDataManager.SkillConfigTable) do + if SkillConfig.SkillAccess == InAccessType then + table.insert(SkillNames, SkillName) + end + end + + return SkillNames +end + +function GameDataManager.GetSkillDescByName(SkillName) + local SkillInfo = GlobalConfigs.SkillInfo[SkillName] + if SkillInfo then + return SkillInfo.Desc + end + + return "" +end + +function GameDataManager.GetTalentSkillShortDescByName(SkillName) + local SkillInfo = GlobalConfigs.SkillInfo[SkillName] + if SkillInfo then + local ShortDesc = SkillInfo.ShortDesc + return ShortDesc or "" + end + + return "" +end + +function GameDataManager.GetSkillNameStrByName(SkillName) + local SkillInfo = GlobalConfigs.SkillInfo[SkillName] + if SkillInfo then + return SkillInfo.Name + end + + return "" +end + +function GameDataManager.GetSkillIconPathByName(SkillName) + local SkillInfo = GlobalConfigs.SkillInfo[SkillName] + local IconIndex = -1 + if SkillInfo then + IconIndex = SkillInfo.IconIndex + end + if IconIndex <= 0 then + return "" + end + + return UGCGameSystem.GetUGCResourcesFullPath(string.format('Asset/IconTexture/Role_Icon/Textures/Icon_UGC_role_%02d.Icon_UGC_role_%02d', IconIndex, IconIndex)) +end + +function GameDataManager.GetWeaponConstructDataByID(ID) + if table.isEmpty(GameDataManager.WeaponConstructTable) then + GameDataManager:LoadWeaponConstructTable() + end + + local WeaponConstructData = GameDataManager.WeaponConstructTable[ID] + if WeaponConstructData then + return WeaponConstructData + end + UE.Log("[GameDataManager][GetWeaponConstructDataByID] ID = %s, Failed", tostring(ID)) + return nil +end + +function GameDataManager.GetMonsterTypeByID(InID) + local MonsterInfo = Tables.MonsterBaseConfig[InID] + if MonsterInfo then + return MonsterInfo.Type + end + return EMonsterType.Default +end + +function GameDataManager.GetRandCommonMonsterClass() + return GameDataManager.GetRandMonsterClassByType(EMonsterType.Common) +end +function GameDataManager.InitCommonAttackWaveList() + local TempCommonAttackWave = TableHelper.DeepCopy(Tables.CommonAttackWave) + table.sort(TempCommonAttackWave, function (CommonAttackWave1, CommonAttackWave2) return CommonAttackWave1.Order < CommonAttackWave2.Order end) + local TempAttackWave = 1 + for k, v in pairs(TempCommonAttackWave) do + for i = 1 ,TempCommonAttackWave[k].AttackWaveNumber do + GameDataManager.CommonAttackWaveList[TempAttackWave] = TempCommonAttackWave[k].CommonID + print("InitCommonAttackWaveList_TempAttackWave " .. TempAttackWave .." CommonID " .. TempCommonAttackWave[k].CommonID) + TempAttackWave = TempAttackWave + 1 + + end + end +end +function GameDataManager.GetAttackWaveCommonMonsterClass() + local MonsterClass = nil + if GameDataManager.CommonAttackWaveList[UGCGameSystem.GameState.CurAttackWave] then + local MonsterPath = Tables.MonsterBaseConfig[GameDataManager.CommonAttackWaveList[UGCGameSystem.GameState.CurAttackWave]].Path + MonsterClass = UE.LoadClass(MonsterPath) + UE.Log("GetAttackWaveCommonMonsterClass_Succeed") + else + MonsterClass = GameDataManager.GetRandCommonMonsterClass() + UE.Log("[Error] GameDataManager.GetAttackWaveCommonMonsterClass CommonAttackWaveList: %d is nil", UGCGameSystem.GameState.CurAttackWave) + end + return MonsterClass +end + +function GameDataManager.GetRandBossMonsterClass() + if GameDataManager.BossIndex == nil then + GameDataManager.BossIndex = 0 + end + GameDataManager.BossIndex = GameDataManager.BossIndex + 1 + local CurBossID = UGCGameSystem.GameState.BossList[GameDataManager.BossIndex] + + return GameDataManager.GetMonsterClassByID(CurBossID) +end + +function GameDataManager.GetRandHangupMonsterClass() + return GameDataManager.GetRandMonsterClassByType(EMonsterType.HangupRoom) +end + +function GameDataManager.GetRandBreachMonsterClass() + return GameDataManager.GetRandMonsterClassByType(EMonsterType.Breach) +end + +function GameDataManager.GetRandMonsterClassByType(InMonsterType) + if table.isEmpty(GameDataManager.MonsterBaseConfigTable) then + GameDataManager:LoadMonsterBaseConfigTable() + end + + local MonsterConfig = GameDataManager.MonsterBaseConfigTable[InMonsterType] + if MonsterConfig then + local Index = math.random(1, #MonsterConfig) + return UE.LoadClass(MonsterConfig[Index].Path) + end + return nil +end + +function GameDataManager.GetMonsterConfigsByType(InMonsterType) + if table.isEmpty(GameDataManager.MonsterBaseConfigTable) then + GameDataManager:LoadMonsterBaseConfigTable() + end + + return GameDataManager.MonsterBaseConfigTable[InMonsterType] +end + +function GameDataManager.GetMonsterClassByID(InID) + local MonsterConfig = Tables.MonsterBaseConfig[InID] + if MonsterConfig then + return UE.LoadClass(MonsterConfig.Path) + end + return nil +end + +function GameDataManager.GetRandDullMonsterClass() + local DullMonsters = Tables.MonsterPawn.DullMonsters + if DullMonsters then + local Index = math.random(1, #DullMonsters) + return UE.LoadClass(DullMonsters[Index]) + end + return nil + --return UE.LoadClass(Tables.MonsterPawn.AttackMonsters.Normal[1]) +end + +function GameDataManager.GetChallengeInfoIndex(InMonsterType) + return Tables.ChallengeMonsterTypeInfo[InMonsterType] +end + +function GameDataManager.GetChallengeMonsterLifeSpan(InMonsterType) + local ChallengeInfoIndex = Tables.ChallengeMonsterTypeInfo[InMonsterType] + if ChallengeInfoIndex then + local ChallengeInfo = Tables.ChallengeInfo[ChallengeInfoIndex] + return ChallengeInfo.LifeTime + end + return -1 +end + +function GameDataManager:SetLocalPlayerController(InController) + GameDataManager.OwnerPlayerController = InController +end + +function GameDataManager:SetLocalPlayerState(InPlayerState) + GameDataManager.OwnerPlayerState = InPlayerState +end + +function GameDataManager.GetLocalPlayerState() + if GameDataManager.OwnerPlayerState == nil or UE.IsValid(GameDataManager.OwnerPlayerState) == false then + local LocalPC = GameDataManager.GetLocalPlayerController() + if LocalPC then + local PlayerState = LocalPC.PlayerState + if PlayerState ~= nil and UE.IsValid(PlayerState) then + GameDataManager:SetLocalPlayerState(PlayerState) + end + end + end + + return GameDataManager.OwnerPlayerState +end + +function GameDataManager.GetLocalPlayerKey() + local LocalPC = GameDataManager.GetLocalPlayerController() + if LocalPC then + return LocalPC.PlayerKey + end + + return -1 +end + +function GameDataManager.GetLocalPlayerController() + if GameDataManager.OwnerPlayerController == nil or UE.IsValid(GameDataManager.OwnerPlayerController) == false then + local GameState = UGCGameSystem.GameState + if GameState ~= nil and UE.IsValid(GameState) then + local PC = STExtraGameplayStatics.GetFirstPlayerController(GameState) + if PC ~= nil and UE.IsValid(PC) then + GameDataManager:SetLocalPlayerController(PC) + end + end + end + + return GameDataManager.OwnerPlayerController +end + +function GameDataManager.GetLocalPlayerPawn() + if GameDataManager.GetLocalPlayerController() == nil then + return nil + end + return GameDataManager.OwnerPlayerController:GetPlayerCharacterSafety() +end + + +-------------------------------- Skill ---------------------------------- +function GameDataManager.GetSkillNameById(InId) + return InId // 100 % 100 +end + +function GameDataManager.GetSkillLevelById(InID) + return InID // 10 % 10 +end + +function GameDataManager.GetSkillIdByNameAndLevel(InSkillName, InLevel) + return 20000 + InSkillName * 100 + InLevel * 10 +end + +return GameDataManager \ No newline at end of file diff --git a/GZJ/Script/Manager/GameEndManager.lua b/GZJ/Script/Manager/GameEndManager.lua new file mode 100644 index 00000000..6ab09349 --- /dev/null +++ b/GZJ/Script/Manager/GameEndManager.lua @@ -0,0 +1,271 @@ +GameEndManager = LuaClass("GameEndManager") + +GameEndManager.HasTriggered = false + +function GameEndManager:Init() + self.HasTriggered = false + EventSystem:AddListener(EventType.OnSendGameEnd, GameEndManager.OnReceiveGameEnd, self) +end + +function GameEndManager:OnReceiveGameEnd(EndReason) + if self.HasTriggered then + return + end + self.HasTriggered = true + + local GameState = UGCGameSystem.GameState + GameState.GameStage = EGameStage.GameEnd + GameState.GameEndTimeStamp = GameplayStatics.GetRealTimeSeconds(GameState) + + local NoticeStr = "" + if EndReason == "LastBossDefeated" then + GameState:SetIsGameWin(true) + NoticeStr = "已击败最终首领,游戏胜利!" + elseif EndReason == "TimeOut" then + GameState:SetIsGameWin(false) + NoticeStr = "时间已耗尽,游戏失败!" + elseif EndReason == "ChickenDead" then + GameState:SetIsGameWin(false) + NoticeStr = "光子鸡被击败,游戏结束!" + elseif EndReason == "AllPlayerExited" then + GameState:SetIsGameWin(false) + NoticeStr = "所有玩家已退出游戏,游戏自动结算!" + end + NoticeTipsTools.MulticastGeneralNoticeTips(NoticeStr, true, 3.0) + UE.Log("[GameEndManager][OnReceiveGameEnd] NoticeStr: %s", NoticeStr) + + self:ClearAllMonsters() + self:SendGameResultData() + self:SendUGCModeBattleResult() + + UGCGameSystem.SendModeCustomEvent("GameEnd") +end + +function GameEndManager:ClearAllMonsters() + local GameState = UGCGameSystem.GameState + if not GameState then + return + end + + local AllSpawners = GameState:GetAllSpawners() + for _, Spawner in pairs(AllSpawners) do + local SpawnedMonsters = Spawner.SpawnedMonsters + for _, Monster in pairs(SpawnedMonsters) do + if Monster ~= nil and UE.IsValid(Monster) and Monster:IsAlive() then + Monster:K2_DestroyActor() + end + end + Spawner.SpawnedMonsters = {} + Spawner.IsActivate = false + end +end + +--发送游戏结算 +function GameEndManager:SendGameResultData() + print(string.format("[GameEndManager:SendGameResultData] 执行")) + local GameState = UGCGameSystem.GameState + if not GameState then + return false + end + + local GameResultData = {}; + + GameResultData.IsWin = GameState:GetIsGameWin() + GameResultData.GameDifficulty = GameState.GameDifficulty + GameResultData.GameDuration = GameState:GetGameDuration() + GameResultData.PlayerResultDatas = {} + + SoundManager.MulticastPlaySound2D(GameResultData.IsWin and 1 or 2) + + local GameTotalDamage = 0.0 + for PlayerKey, DamageInfoList in pairs(UGCGameSystem.GameState.PlayerDamageList) do + for BossID, DamageValue in pairs(DamageInfoList) do + GameTotalDamage = GameTotalDamage + DamageValue + end + end + + local PlayerStates = UGCGameSystem.GetAllPlayerState(false); + UE.Log("[GameEndManager][SendGameResultData] PlayerState Count=%d", table.getCount(PlayerStates)) + + --获取所有玩家信息并汇总 + for i, PlayerState in ipairs(PlayerStates) do + if PlayerState then + print(string.format('[GameEndManager][SendGameResultData] 序号: %d', i)) + local PlayerResultData = {} + local PlayerGlobalSaveData = {} + + PlayerResultData.UID = PlayerState.UID + PlayerResultData.PlayerKey = PlayerState.PlayerKey + PlayerResultData.PlayerName = PlayerState.PlayerName + PlayerResultData.Level = PlayerState.Level + PlayerResultData.CombatPoint = PlayerState.CombatPoint + PlayerResultData.Gender = PlayerState.PlatformGender + + -- 计算 PlayerState里面的存档数据 + PlayerGlobalSaveData.UID = PlayerState.UID + PlayerState.ArchiveData.GameTimes = PlayerState.ArchiveData.GameTimes + 1 + + -- 判断一下当前有多少个技能 + local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerState.PlayerKey) + --local AddCount = 0; + --log_tree(string.format("[Action_GameEnd:SendGameResultData] PlayerKey = %d PC.ItemMap[5] = ", PlayerState.PlayerKey), PC.ItemMap[5]) + --for c, v in pairs(PC.ItemMap[5]) do + -- if GetItemQualityLevel(c) == EQualityType.Super then + -- AddCount = AddCount + v; + -- end + --end + + -- 判断当前装备了几个技能 + --local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerState.PlayerKey); + -- Slot: SkillInst + --log_tree(string.format("[Action_GameEnd:SendGameResultData] PlayerKey = %d Pawn.SkillSystemComponent.SlotToSkillList = ", PlayerState.PlayerKey), Pawn.SkillSystemComponent.SlotToSkillList) + --for k, v in pairs(Pawn.SkillSystemComponent.SlotToSkillList) do + -- if v.SkillLevel - 1 == EQualityType.Super then + -- AddCount = AddCount + 1 + -- end + --end + + --PlayerState.ArchiveData.TotalSuperSkill = PlayerState.ArchiveData.TotalSuperSkill + AddCount; + + -- 阉割版 + + if GameResultData.IsWin then + -- 阉割版 + --PlayerState.ArchiveData.GameClearanceTimes = PlayerState.ArchiveData.GameClearanceTimes + 1 + PlayerResultData.Score = 10 + GameState.GameDifficulty * 1 + + -- 此处计算游戏通关掉落 + -- 阉割版 + if PlayerState.ArchiveData.GameDropItems == nil then + PlayerState.ArchiveData.GameDropItems = {} + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] = {} + end + + -- 遍历查找对应数据 + local NextDropIndex = 0 + local TotalCount = table.getCount(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty]) + local Temp = {1, 2, 3, 4, 5} + if TotalCount > 0 then + if TotalCount >= 5 then + NextDropIndex = 6 -- 表示掉落碎片 + Temp = {} + else + if table.getCount(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty]) == 5 then + -- 说明已经满了 + NextDropIndex = 6; + else + local RemovePos = {} + for d, v in pairs(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty]) do + table.insert(RemovePos, d) + end + + for c = 1, #RemovePos, -1 do + table.remove(Temp, RemovePos[c]); + end + end + end + end + + if NextDropIndex == 0 then + NextDropIndex = Temp[math.random(1, #Temp)] + if PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] == nil then + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] = {} + end + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1 + else + if PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] == nil then + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1 + else + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1 + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] + end + end + log_tree("[GameEndManager:SendGameResultData] PlayerState.ArchiveData = ", PlayerState.ArchiveData); + else + print(string.format("[GameEndManager][SendGameResultData] 游戏输了")) + -- 失败积分 + PlayerResultData.Score = PlayerState.KillCount.Boss * 2 + end + + print(string.format('[GameEndManager][SendGameResultData] 开始记录存档数据')) + + PlayerState.ArchiveData.Score = PlayerResultData.Score + PlayerState.ArchiveData.Score; + PlayerState.ArchiveData.TotalCoinPoint = PlayerState.ArchiveData.TotalCoinPoint + PlayerState.CoinPoint.Total + PlayerState.ArchiveData.TotalKillPoint = PlayerState.ArchiveData.TotalKillPoint + PlayerState.KillPoint.Total + PlayerState.ArchiveData.GameTimes = PlayerState.ArchiveData.GameTimes + 1 + + if GameResultData.IsWin then + if PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] == nil then + PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] = 0 + end + PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] = PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] + 1 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 2); + end + + -- 判断一下一共有多少个通关的 + local Times = 0; + for c, v in pairs(PlayerState.ArchiveData.PlayedGames) do + Times = Times + v; + end + + PlayerState.ArchiveData.GameClearanceTimes = Times; + + local TotalDamage = 0.0 + local DamageInfoList = UGCGameSystem.GameState.PlayerDamageList[PlayerState.PlayerKey] + for BossID, DamageValue in pairs(DamageInfoList) do + TotalDamage = TotalDamage + DamageValue + end + -- TODO: 临时数据 + PlayerResultData.IsMVP = false + PlayerResultData.TotalDamage = TotalDamage + PlayerResultData.DamagePercent = GameTotalDamage > 0 and TotalDamage / GameTotalDamage or 0 + + if GameResultData.IsWin then + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 5, PlayerResultData.DamagePercent) + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 8) + end + + log_tree("[GameEndManager][SendGameResultData] PlayerState.ArchiveData = ", PlayerState.ArchiveData) + + table.insert(GameResultData.PlayerResultDatas, PlayerResultData); + + -- 同步一下属性 + UnrealNetwork.CallUnrealRPC(PC, PC, "Client_UpdateArchiveData", PlayerState.ArchiveData); + else + UE.Log("[GameEndManager][SendGameResultData] Error: PlayerState is nil!") + end + end + + table.sort(GameResultData.PlayerResultDatas,function(a,b) return a.DamagePercent > b.DamagePercent end) + if GameResultData.IsWin then + GameResultData.PlayerResultDatas[1].IsMVP = true + -- 积分 + GameResultData.PlayerResultDatas[1].Score = GameResultData.PlayerResultDatas[1].Score + 2 + local PS = UGCGameSystem.GetPlayerStateByUID(GameResultData.PlayerResultDatas[1].UID) + PS.ArchiveData.Score = PS.ArchiveData.Score + 2 + end + + -- 保存玩家数据到云端 + GameState:SavePlayersData(nil) + + GameState.GameResultData = GameResultData + UnrealNetwork.RepLazyProperty(UGCGameSystem.GameState, "GameResultData") + + --EventSystem:SendEvent(EventType.GameEnd, GameResultData); + UnrealNetwork.CallUnrealRPC_Multicast(UGCGameSystem.GameState ,"Client_MulticastRPC_SendEvent", EventType.GameEnd, GameResultData); +end + +--UGC模式结算,发送至后台记录 +function GameEndManager:SendUGCModeBattleResult() + local PlayerStates = UGCGameSystem.GetAllPlayerState(false) + UE.Log("[GameEndManager][SendUGCModeBattleResult] #PlayerStates[%d]", #PlayerStates) + + for i, PlayerState in ipairs(PlayerStates) do + if PlayerState then + UGCGameSystem.SendPlayerSettlement(PlayerState.PlayerKey); + else + UE.Log("[GameEndManager][SendUGCModeBattleResult] Error: PlayerState is nil!") + end + end +end + +return GameEndManager; \ No newline at end of file diff --git a/GZJ/Script/Manager/NewPlayerGuideManager.lua b/GZJ/Script/Manager/NewPlayerGuideManager.lua new file mode 100644 index 00000000..00383365 --- /dev/null +++ b/GZJ/Script/Manager/NewPlayerGuideManager.lua @@ -0,0 +1,251 @@ +---新手引导管理器 +NewPlayerGuideManager = LuaClass("NewPlayerGuideManager") + +NewPlayerGuideManager.bHasInit = false +NewPlayerGuideManager.CanTriggerGuide = false + +---table> +NewPlayerGuideManager.UITriggerMap = {} + +---table +NewPlayerGuideManager.CustomTriggerMap = {} + +---table +NewPlayerGuideManager.GuideTriggerCountMap = {} + +---table<_, CongfigID> +NewPlayerGuideManager.TriggeredCountMap = {} + +---table +NewPlayerGuideManager.RemoveGuideTimerHandles = {} + +function NewPlayerGuideManager.ctor() +end + +function NewPlayerGuideManager:Init() + if NewPlayerGuideManager.bHasInit then + return + end + NewPlayerGuideManager.bHasInit = true + + self:LoadGuideConfigTable() + self:BindEvents() + self:OnGameStageChanged(UGCGameSystem.GameState.GameStage) + + if UGCGameSystem.GameState.GameStage < EGameStage.GameFight then + EventSystem.SetTimer(UGCGameSystem.GameState, function() + self:TriggerGuide(1) + end, 1.0) + end +end + +function NewPlayerGuideManager:UnInit() + self:RemoveAllGuide() + self:UnBindEvents() + NewPlayerGuideManager.UITriggerMap = nil + NewPlayerGuideManager.CustomTriggerMap = nil + NewPlayerGuideManager.GuideTriggerCountMap = nil + NewPlayerGuideManager.RemoveGuideTimerHandles = nil + NewPlayerGuideManager.TriggeredCountMap = nil +end + +function NewPlayerGuideManager:BindEvents() + EventSystem:AddListener(EventType.OnGameStageChanged, NewPlayerGuideManager.OnGameStageChanged, self) + EventSystem:AddListener(EventType.OnWidgetShowed, NewPlayerGuideManager.OnWidgetPanelShowed, self) + EventSystem:AddListener(EventType.OnWidgetClosed, NewPlayerGuideManager.OnWidgetPanelClosed, self) +end + +function NewPlayerGuideManager:UnBindEvents() + EventSystem:RemoveListener(EventType.OnGameStageChanged, NewPlayerGuideManager.OnGameStageChanged, self) + EventSystem:RemoveListener(EventType.OnWidgetShowed, NewPlayerGuideManager.OnWidgetPanelShowed, self) + EventSystem:RemoveListener(EventType.OnWidgetClosed, NewPlayerGuideManager.OnWidgetPanelClosed, self) +end + +function NewPlayerGuideManager:LoadGuideConfigTable() + require('Script.Global.NewPlayerGuideConfig') + local ConfigTable = NewPlayerGuideConfig.GuideTable + + for i, v in pairs(ConfigTable) do + if v.TriggerType == EGuideTriggerType.UIVisibile then + if NewPlayerGuideManager.UITriggerMap[v.LinkedUIType] == nil then + NewPlayerGuideManager.UITriggerMap[v.LinkedUIType] = {} + end + table.insert(NewPlayerGuideManager.UITriggerMap[v.LinkedUIType], i) + + elseif v.TriggerType == EGuideTriggerType.CustomCondition then + table.insert(NewPlayerGuideManager.CustomTriggerMap, i) + end + end +end + +function NewPlayerGuideManager:GetGuideDuration(ConfigID) + local Config = NewPlayerGuideConfig.GuideTable[ConfigID] + if Config ~= nil and Config.ExistType == EGuideExistType.Duration and Config.Duration > 0.1 then + return Config.Duration + end + return 0 +end + +function NewPlayerGuideManager:IsGuideExisted(ConfigID) + return table.hasValue(NewPlayerGuideManager.TriggeredCountMap, ConfigID) +end + +function NewPlayerGuideManager:HasGuideMaxTriggered(ConfigID) + local Config = NewPlayerGuideConfig.GuideTable[ConfigID] + if Config == nil then + return false + end + if NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] == nil then + return false + end + + return NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] >= Config.MaxTriggerCount +end + +function NewPlayerGuideManager:OnGameStageChanged(GameStage) + if GameStage == EGameStage.GameFight then + self.CanTriggerGuide = true + else + self.CanTriggerGuide = false + end +end + +function NewPlayerGuideManager:OnWidgetPanelShowed(InUIType) + for UIType, ConfigIDs in pairs(NewPlayerGuideManager.UITriggerMap) do + if UIType == InUIType then + for _, ConfigID in pairs(ConfigIDs) do + self:TriggerGuide(ConfigID) + end + break + end + end +end + +function NewPlayerGuideManager:OnWidgetPanelClosed(InUIType) + for UIType, ConfigIDs in pairs(NewPlayerGuideManager.UITriggerMap) do + if UIType == InUIType then + for _, ConfigID in pairs(ConfigIDs) do + NewPlayerGuideManager:RemoveGuide(ConfigID) + end + break + end + end +end + +function NewPlayerGuideManager:TriggerGuide(ConfigID) + if NewPlayerGuideConfig == nil then + NewPlayerGuideManager:Init() + end + + if NewPlayerGuideManager.CanTriggerGuide == false then + if ConfigID > 3 then --1~3都是准备阶段的引导 + UE.Log("[NewPlayerGuideManager][TriggerGuide] Can't Trigger Guide Now! GameStage=%d, ConfigID=%d", UGCGameSystem.GameState.GameStage, ConfigID) + return + end + end + + local Config = NewPlayerGuideConfig.GuideTable[ConfigID] + if Config == nil then + return false + end + + if self:IsGuideExisted(ConfigID) then + return false + end + + if NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] == nil then + NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] = 0 + end + + if NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] >= Config.MaxTriggerCount then + return false + end + + local PS = GameDataManager.GetLocalPlayerState() + if PS and PS:GetNeedTriggerForceGuide() then + local ValidStepIndex = PS.ForceGuideInfo.ValidStepIndex + if ValidStepIndex == nil then + ValidStepIndex = -2 + end + + -----------判断是否是强引导 + local RelatedForceGuideID = { + [10] = 1, --兑换 + [15] = 2, --首领信息 + [11] = 3, --开箱 + [4] = 4, --武器进阶 + [29] = 5, --锁定 + [19] = 6, --一键拾取 + [20] = 7, --背包 + [13] = 8, --获取 + } + local ForceGuideID = RelatedForceGuideID[ConfigID] + if ForceGuideID ~= nil and ForceGuideID >= ValidStepIndex then + local ForceGuidePanel = UIManager:GetPanel(EUIType.ForceGuide) + if ForceGuidePanel and UE.IsValid(ForceGuidePanel) and ForceGuidePanel.bHasTriggeredAllForceGuide == false then + if ForceGuidePanel:TryTriggerForceGuide(ForceGuideID) then + table.insert(NewPlayerGuideManager.TriggeredCountMap, ConfigID) + NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] = NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] + 1 + return + end + end + end + end + + + local GuideData = { + ID = ConfigID, + LinkedUIType = Config.LinkedUIType, + LinkedComponent = Config.LinkedComponent, + GuideTextType = Config.GuideTextType, + GuideText = Config.GuideText, + } + + if type(Config.MutalExclusionIndex) == "number" then + if Config.MutalExclusionIndex > 0 then + NewPlayerGuideManager:RemoveGuide(Config.MutalExclusionIndex) + end + elseif type(Config.MutalExclusionIndex) == "table" then + for _, ConfigID in pairs(Config.MutalExclusionIndex) do + NewPlayerGuideManager:RemoveGuide(ConfigID) + end + end + + if Config.ExistType == EGuideExistType.Duration and Config.Duration > 0.1 then + NewPlayerGuideManager.RemoveGuideTimerHandles[ConfigID] = EventSystem.SetTimer(UGCGameSystem.GameState, function() + NewPlayerGuideManager:RemoveGuide(ConfigID) + end, Config.Duration) + end + + if UIManager:ShowPlayerGuide(Config.GuideType, GuideData, Config.Root) then + NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] = NewPlayerGuideManager.GuideTriggerCountMap[ConfigID] + 1 + table.insert(NewPlayerGuideManager.TriggeredCountMap, ConfigID) + + return true + end + + return false +end + +function NewPlayerGuideManager:RemoveGuide(ConfigID) + if NewPlayerGuideManager.RemoveGuideTimerHandles[ConfigID] ~= nil then + EventSystem.StopTimer(NewPlayerGuideManager.RemoveGuideTimerHandles[ConfigID]) + NewPlayerGuideManager.RemoveGuideTimerHandles[ConfigID] = nil + end + if self:IsGuideExisted(ConfigID) then + UIManager:RemovePlayerGuide(ConfigID) + table.removeValue(NewPlayerGuideManager.TriggeredCountMap, ConfigID) + end +end + +function NewPlayerGuideManager:RemoveAllGuide() + for ID, Handle in pairs(NewPlayerGuideManager.RemoveGuideTimerHandles) do + EventSystem.StopTimer(Handle) + NewPlayerGuideManager.RemoveGuideTimerHandles[ID] = nil + end + NewPlayerGuideManager.TriggeredCountMap = {} + + UIManager:RemoveAllPlayerGuide() +end + +return NewPlayerGuideManager \ No newline at end of file diff --git a/GZJ/Script/Manager/SoundManager.lua b/GZJ/Script/Manager/SoundManager.lua new file mode 100644 index 00000000..5732cda0 --- /dev/null +++ b/GZJ/Script/Manager/SoundManager.lua @@ -0,0 +1,127 @@ +---@class SoundManager @音效系统接口库 +SoundManager = SoundManager or {} + +---@type table +SoundManager.LoadedFX2D = {} + +---@type table +SoundManager.LoadedFX3D = {} + +-----------------------------------------------------[Client]----------------------------------------------------- + +---播放2D音效 +---@return EventId int @音效ID +---@param ConfigId int @音效资源ID(SoundConfig.lua文件中添加) +function SoundManager.PlaySound2D(ConfigId) + local Audio = SoundManager.GetSound2D(ConfigId) + return UGCSoundManagerSystem.PlaySound2D(Audio) +end + +---在指定位置播放音效 +---@return EventId int @音效ID +---@param ConfigId int @音效资源ID(SoundConfig.lua文件中添加) +---@param Location Vector @位置 +---@param Rotation Rotator @旋转 可使用Rotator.New(Roll,Pitch,Yaw)创建,结构{Roll=Roll, Pitch=Pitch, Yaw=Yaw} +function SoundManager.PlaySoundAtLocation(ConfigId, Location, Rotation) + local Audio = SoundManager.GetSound3D(ConfigId) + return UGCSoundManagerSystem.PlaySoundAtLocation(Audio, Location, Rotation) +end + +---依附于Actor播放音效 +---@return EventId int @音效ID +---@param ConfigId int @音效资源ID(SoundConfig.lua文件中添加) +---@param AttachedActor AActor @依附的Actor +---@param StopWhenAttachedToDestroyed bool @依附的Actor销毁时是否停止音效播放 +function SoundManager.PlaySoundAttachActor(ConfigId, AttachedActor, StopWhenAttachedToDestroyed) + local Audio = SoundManager.GetSound3D(ConfigId) + return UGCSoundManagerSystem.PlaySoundAttachActor(Audio, AttachedActor, StopWhenAttachedToDestroyed) +end + +---停止全部音效 +function SoundManager.StopAllSound() + UGCSoundManagerSystem.StopAllSound() +end + +---停止指定Actor上的所有音效 +---@param Actor AActor @指定的Actor +function SoundManager.StopSoundByActor(Actor) + UGCSoundManagerSystem.StopSoundByActor(Actor) +end + +---停止指定ID的音效 +---@param ID int @音效ID(非音效资源ID) +function SoundManager.StopSoundByID(ID) + UGCSoundManagerSystem.StopSoundByID(ID) +end + +---获取指定2D音效资源 +---@return AKEvent UAkAudioEvent* @音效资源 +---@param ConfigId int @音效ID +function SoundManager.GetSound2D(ConfigId) + local CachedAudio2D = SoundManager.LoadedFX2D[ConfigId] + if CachedAudio2D == nil or UE.IsValid(CachedAudio2D) == false then + local SoundConfig = require('Script.Global.SoundConfig') + local AudioPath = SoundConfig.FX2D[ConfigId] + CachedAudio2D = UE.LoadObject(AudioPath) + SoundManager.LoadedFX2D[ConfigId] = CachedAudio2D + end + return CachedAudio2D +end + +---获取指定3D音效资源 +---@return AKEvent UAkAudioEvent* @音效资源 +---@param ConfigId int @音效ID +function SoundManager.GetSound3D(ConfigId) + local CachedAudio3D = SoundManager.LoadedFX3D[ConfigId] + if CachedAudio3D == nil or UE.IsValid(CachedAudio3D) == false then + local SoundConfig = require('Script.Global.SoundConfig') + local AudioPath = SoundConfig.FX3D[ConfigId] + CachedAudio3D = UE.LoadObject(AudioPath) + SoundManager.LoadedFX3D[ConfigId] = CachedAudio3D + end + return CachedAudio3D +end + +-----------------------------------------------------[Server]----------------------------------------------------- + +---广播播放2D音效 +---@param ConfigId int +function SoundManager.MulticastPlaySound2D(ConfigId) + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(UGCGameSystem.GameState, "Client_MulticastRPC_PlaySound2D", ConfigId) +end + +---广播在指定位置播放音效 +---@param ConfigId int @音效资源ID(SoundConfig.lua文件中添加) +---@param Location Vector @位置 +---@param Rotation Rotator @旋转 可使用Rotator.New(Roll,Pitch,Yaw)创建,结构{Roll=Roll, Pitch=Pitch, Yaw=Yaw} +function SoundManager.MulticastPlaySoundAtLocation(ConfigId, Location, Rotation) + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(UGCGameSystem.GameState, "Client_MulticastRPC_PlaySoundAtLocation", ConfigId, VectorHelper.ToLuaTable(Location), VectorHelper.RotToLuaTable(Rotation)) +end + +---广播依附于Actor播放音效 +---@param ConfigId int @音效资源ID(SoundConfig.lua文件中添加) +---@param AttachedActor AActor @依附的Actor +---@param StopWhenAttachedToDestroyed bool @依附的Actor销毁时是否停止音效播放 +function SoundManager.MulticastPlaySoundAttachActor(ConfigId, AttachedActor, StopWhenAttachedToDestroyed) + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(UGCGameSystem.GameState, "Client_MulticastRPC_PlaySoundAttachActor", ConfigId, AttachedActor, StopWhenAttachedToDestroyed) +end + +---广播停止全部音效 +function SoundManager.MulticastStopAllSound() + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(UGCGameSystem.GameState, "Client_MulticastRPC_StopAllSound") +end + +---广播停止指定Actor上的所有音效 +---@param Actor AActor @指定的Actor +function SoundManager.MulticastStopSoundByActor(Actor) + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(UGCGameSystem.GameState, "Client_MulticastRPC_StopSoundByActor", Actor) +end + +---广播停止指定ID的音效 +---@param ID int @音效ID(非音效资源ID) +function SoundManager.MulticastStopSoundByID(ID) + UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(UGCGameSystem.GameState, "Client_MulticastRPC_StopSoundByID", ID) +end + + +return SoundManager; \ No newline at end of file diff --git a/GZJ/Script/Manager/UIManager.lua b/GZJ/Script/Manager/UIManager.lua new file mode 100644 index 00000000..eeda237a --- /dev/null +++ b/GZJ/Script/Manager/UIManager.lua @@ -0,0 +1,485 @@ +--[[------------------------------------------UI管理器------------------------------------------------------]]-- +UIManager = UIManager or { +} + +UIManager.HasInitialized = false +UIManager.MainControlPanel = nil +UIManager.PlayerInfoPanel = nil + +UIManager.OpenedWidgetTable = {} +UIManager.SameLevelWidgetTable = {} +UIManager.PreCachedWidgetTable = {} +UIManager.TriggeredGuideTable = {} + +UIManager.AllPanel = {} + +function UIManager:Init() + require('Script.Global.UIConfig') + + self:Bind() + self:InitBaseUI() + self:PreLoadUIAsset() + + self.HasInitialized = true + + self:ShowPanel(EUIType.Main) + self:OnWaitPlayerJoinTimeChange(UGCGameSystem.GameState.GameStage) + self:OnGameStageChange(UGCGameSystem.GameState.GameStage) +end + +function UIManager:UnInit() + self:UnBind() + self:Release() +end + +function UIManager:Bind() + if UIManager.HasInitialized then + return + end + EventSystem:AddListener(EventType.OnGameStageChanged, UIManager.OnGameStageChange, self) + EventSystem:AddListener(EventType.RequestShowPanel, UIManager.ShowPanel, self) + EventSystem:AddListener(EventType.RequestClosePanel, UIManager.ClosePanel, self) + EventSystem:AddListener(EventType.GameEnd, UIManager.OnGameEnd, self) + EventSystem:AddListener(EventType.ShowNotice, UIManager.ShowNotice, self) + EventSystem:AddListener(EventType.OnWaitPlayerJoinTimeChanged, UIManager.OnWaitPlayerJoinTimeChange, self) +end + +function UIManager:UnBind() + EventSystem:RemoveListener(EventType.RequestShowPanel, UIManager.ShowPanel, self) + EventSystem:RemoveListener(EventType.RequestClosePanel, UIManager.ClosePanel, self) + EventSystem:RemoveListener(EventType.GameEnd, UIManager.OnGameEnd, self) + EventSystem:RemoveListener(EventType.ShowNotice, UIManager.ShowNotice, self) + EventSystem:RemoveListener(EventType.OnWaitPlayerJoinTimeChanged, UIManager.OnWaitPlayerJoinTimeChange, self) +end + +function UIManager:Release() + for _, Panel in pairs(self.AllPanel) do + if UE.IsValid(Panel) then + Panel:RemoveFromParent() + end + end + self.AllPanel = nil +end + +function UIManager:InitBaseUI() + self.MainControlPanel = GameBusinessManager.GetWidgetFromName(ingame, "MainControlPanelTochButton_C") + if self.MainControlPanel ~= nil then + local MainControlBaseUI = self.MainControlPanel.MainControlBaseUI; + MainControlBaseUI.Image_IngameLogo:AddAdvancedCollapsedCount(1) --局内游戏Logo + MainControlBaseUI.Image_0:AddAdvancedCollapsedCount(1) --指南针指针 + MainControlBaseUI.NavigatorPanel:AddAdvancedCollapsedCount(1) --指南针界面 + MainControlBaseUI.SurviveInfoPanel:AddAdvancedCollapsedCount(1) --存活人数 + MainControlBaseUI.CanvasPanel_BackpackPanel:AddAdvancedCollapsedCount(1) --背包按钮 + MainControlBaseUI.CanvasPanel_HelmetArmor:AddAdvancedCollapsedCount(1) --头盔、护甲按钮 + MainControlBaseUI.CanvasPanel_FreeCamera:AddAdvancedCollapsedCount(1) --自由视角眼睛 + MainControlBaseUI.CanvasPanelSurviveKill:AddAdvancedCollapsedCount(1) --剩余人数、淘汰数 + MainControlBaseUI.SignalReceivingAreaTIPS_UIBP:AddAdvancedCollapsedCount(1) --信号区提示 + MainControlBaseUI.CircleChasingProgress:AddAdvancedCollapsedCount(1) --刷圈进度 + MainControlBaseUI.PlayerInfoSocket:AddAdvancedCollapsedCount(1) --玩家血条 + + -- 隐藏小地图 + MainControlBaseUI.CanvasPanel_MiniMapAndSetting:AddAdvancedCollapsedCount(1) --玩家血条 + MainControlBaseUI.IsNeedTeamPanel = false --不显示队友面板 + local ShootingUIPanel = self.MainControlPanel.ShootingUIPanel + ShootingUIPanel:AddAdvancedCollapsedCount(1) --不显示战斗界面 + end + + self.PlayerInfoPanel = GameBusinessManager.GetWidgetFromName(ingame, "PlayerInfoPanel_C") + if self.PlayerInfoPanel ~= nil then + local PlayerInfoPanel = self.PlayerInfoPanel.VerticalLifeInfo + PlayerInfoPanel.VerticalLifeInfo:AddAdvancedCollapsedCount(1) --玩家血条和能量条 + end +end + +function UIManager:OnGameStageChange(GameStage) + if GameStage == EGameStage.GameEnd then + self:CloseAllPanel(true) + + self:GetPanel(EUIType.Notice):CloseRemainGeneralNotice() + self:GetPanel(EUIType.ForceGuide):SetVisibility(ESlateVisibility.Collapsed) + + self:ShowPanel(EUIType.Settlement) + + EventSystem.SetTimer(UGCGameSystem.GameState, function() + --停止检测DS连接 + if NetUtil then + NetUtil.StopCheckDSActive(); + end + + --忽略DS链接报错 + if BattleResult then + BattleResult.IgnoreDSError = true + end + + end, 1.0) + end +end + +function UIManager:OnGameEnd(GameResultData) + -- UE.Log("[UIManager:OnGameEnd]") + + -- self:CloseAllPanel(true) + + -- self:GetPanel(EUIType.Notice):CloseRemainGeneralNotice() + -- self:GetPanel(EUIType.ForceGuide):SetVisibility(ESlateVisibility.Collapsed) + + -- EventSystem.SetTimer(UGCGameSystem.GameState, function() + -- self:ShowPanel(EUIType.Settlement, GameResultData); + + -- --停止检测DS连接 + -- if NetUtil then + -- NetUtil.StopCheckDSActive(); + -- end + + -- --忽略DS链接报错 + -- if BattleResult then + -- BattleResult.IgnoreDSError = true + -- end + + -- end, 1.0) +end + +function UIManager:LoadUI(Config) + local Widget = self:CreateUserWidget(Config.WidgetClassPath) + if Widget == nil or UE.IsValid(Widget) == false then + UE.LogError("[UIManager:LoadUI] invalid config: path=%s, root=%s", tostring(Config.WidgetClassPath), tostring(Config.Root)) + return nil + end + + self.UIRoot:SetUIRoot(Widget, Config.Root) + + if Widget['Hide'] ~= nil then --如果继承自UAEUserWidget的UI + Widget:Hide() + else + Widget:SetVisibility(ESlateVisibility.Collapsed) + end + + return Widget +end + +function UIManager:CreateUserWidget(WidgetClassPath) + return UserWidget.NewWidgetObjectBP(GameDataManager.GetLocalPlayerController(), UE.LoadClass(WidgetClassPath)) +end + +function UIManager:PreLoadUIAsset() + if self.UIRoot == nil then + self:InitUIRoot() + end + for UIType, Config in pairs(UIConfig.General) do + local CachedPanel = self.AllPanel[UIType] + if CachedPanel == nil or UE.IsValid(CachedPanel) == false then + local Widget = self:LoadUI(Config) + Widget.UIName = UIType + self.AllPanel[UIType] = Widget + end + end +end + +function UIManager:InitUIRoot() + self.UIRoot = self:CreateUserWidget(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/UI_Root.UI_Root_C')) + + if self.UIRoot and UE.IsValid(self.UIRoot) then + self.UIRoot:AddToViewport(10000) + UE.Log("[UIManager:InitUIRoot] UIRoot Initialized") + end +end + +function UIManager:ShowPanel(UIType, ...) + if UIManager.HasInitialized == false then + UE.Log("[UIManager:ShowPanel] UIManager.HasInitialized == false") + return + end + + if UIType == nil or UIType == EUIType.Default then + UE.Log("[UIManager:ShowPanel] Invalid UIType") + return + end + + if self.UIRoot == nil then + self:InitUIRoot() + end + + if self.UIRoot and UE.IsValid(self.UIRoot) and (not self.UIRoot:IsInViewport()) then + self.UIRoot:AddToViewport(10000) + end + + local Widget = self.AllPanel[UIType] + if Widget == nil or UE.IsValid(Widget) == false then + UE.Log("[UIManager:ShowPanel] invalid Widget, UIType=%d", UIType) + return + end + + local RootName = Widget.MyRoot + if RootName == nil then + RootName = UIRoot.MiddleRoot + end + + if select("#", ...) > 0 then + if Widget["InitFromParam"] ~= nil then + Widget:InitFromParam(...) + end + end + + self:HandleOpenWidget(Widget, RootName) + + EventSystem:SendEvent(EventType.OnWidgetShowed, UIType) +end + +function UIManager:HandleOpenWidget(Widget, RootName) + if Widget == nil then + return + end + + local GuideAndNoticeRoot = { + UIRoot.BattleRoot, + UIRoot.BattleGuideRoot, + UIRoot.BattleNoticeRoot, + UIRoot.CommonGuideRoot, + UIRoot.CommonNoticeRoot + } + + if not table.hasValue(GuideAndNoticeRoot, RootName) then + local CurSameLevelWidget = self.SameLevelWidgetTable[RootName] + if CurSameLevelWidget ~= nil and Widget ~= CurSameLevelWidget then + self:SetWidgetVisible(CurSameLevelWidget, false) + EventSystem:SendEvent(EventType.OnWidgetClosed, CurSameLevelWidget.UIName) + table.removeKey(self.OpenedWidgetTable, CurSameLevelWidget.UIName) + end + self.SameLevelWidgetTable[RootName] = Widget + end + + self.OpenedWidgetTable[Widget.UIName] = Widget + + self:SetWidgetVisible(Widget, true) +end + +function UIManager:HandleCloseWidget(Widget) + if self.SameLevelWidgetTable[Widget.MyRoot] == Widget then + self.SameLevelWidgetTable[Widget.MyRoot] = nil + end + + self:SetWidgetVisible(Widget, false) + self.OpenedWidgetTable[Widget.UIName] = nil +end + +function UIManager:SetWidgetVisible(Widget, bIsVisible) + if Widget == nil or UE.IsValid(Widget) == false then + return + end + + local VisibleFuncName = bIsVisible and "Show" or "Hide" + local Visibility = bIsVisible and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed + local OnVisibilityChangedFuncName = bIsVisible and "OnShowPanel" or "OnClosePanel" + + if Widget[VisibleFuncName] ~= nil then --如果继承自UAEUserWidget的UI + Widget[VisibleFuncName](Widget) + else + Widget:SetVisibility(Visibility) + end + + if Widget[OnVisibilityChangedFuncName] ~= nil then + Widget[OnVisibilityChangedFuncName](Widget) + end +end + +function UIManager:CloseWidgetByRoot(RootName) + local CurLevelWidget = self.SameLevelWidgetTable[RootName] + if CurLevelWidget == nil or UE.IsValid(CurLevelWidget) == false then + return + end + + self:HandleCloseWidget(CurLevelWidget) + + EventSystem:SendEvent(EventType.OnWidgetClosed, CurLevelWidget.UIName) +end + +function UIManager:ClosePanel(UIType) + local CloseWidget = self.OpenedWidgetTable[UIType] + if CloseWidget == nil or UE.IsValid(CloseWidget) == false then + return + end + + self:HandleCloseWidget(CloseWidget) + + EventSystem:SendEvent(EventType.OnWidgetClosed, UIType) +end + +function UIManager:DestroyPanel(UIType) + local Panel = self.AllPanel[UIType] + + if Panel ~= nil and UE.IsValid(Panel) then + Panel:RemoveFromParent() + self.AllPanel[UIType] = nil + self.OpenedWidgetTable[UIType] = nil + + EventSystem:SendEvent(EventType.OnWidgetClosed, UIType) + end +end + +function UIManager:CloseAllPanel(bRemainNotice) + for UIType, _ in pairs(self.OpenedWidgetTable) do + if bRemainNotice then + if UIType ~= EUIType.Notice then + self:ClosePanel(UIType) + end + else + self:ClosePanel(UIType) + end + end +end + +function UIManager:DestroyAllPanel(bRemainNotice) + for UIType, _ in pairs(self.AllPanel) do + if UIType == EUIType.SkillButton then + self:ClosePanel(UIType) + else + if bRemainNotice then + if UIType ~= EUIType.Notice then + self:DestroyPanel(UIType) + end + else + self:DestroyPanel(UIType) + end + end + end +end + +function UIManager:GetPanel(UIType) + local Panel = self.AllPanel[UIType] + if Panel ~= nil and UE.IsValid(Panel) then + return Panel + end + return nil +end + +function UIManager:IsVisiblePanel(UIType) + return self.OpenedWidgetTable[UIType] ~= nil +end + +function UIManager:VisiblePanel(UIType) + local Panel = self.AllPanel[UIType] + if Panel then + self:HandleOpenWidget(Panel, Panel.MyRoot) + end +end + +function UIManager:HidePanel(UIType) + self:ClosePanel(UIType) +end + +function UIManager:ShowGeneralNotice(...) + self:ShowPanel(EUIType.Notice, ECustomNoticeType.GeneralNotice, ...) +end + +function UIManager:ShowNotice(InNoticeType, ...) + self:ShowPanel(EUIType.Notice, InNoticeType, ...) +end + +function UIManager:OnWaitPlayerJoinTimeChange(RemainTime) + if RemainTime > 0 and UGCGameSystem.GameState.GameStage == EGameStage.WaitForPlayer then + --self:ShowPanel(EUIType.Notice, ECustomNoticeType.InitialNotice, {}) + end +end + +function UIManager:ShowPlayerGuide(GuideWidgetType, GuideData, GuideRoot) + if UIManager.HasInitialized == false then + UE.Log("[UIManager][ShowPlayerGuide] UIManager.HasInitialized == false") + return false + end + local GuideID = GuideData.ID + if GuideID == nil or self.TriggeredGuideTable[GuideID] ~= nil then + UE.Log("[UIManager][ShowPlayerGuide] invalid GuideID") + return false + end + + local GuideClassPath = UIConfig.Guide[GuideWidgetType] + if GuideClassPath == nil then + UE.Log("[UIManager][ShowPlayerGuide] invalid GuideClassPath. GuideID = %d", GuideID) + return false + end + + local WidgetComponent = self:GetPanelComponentByWidgetName(GuideData.LinkedUIType, GuideData.LinkedComponent) + if WidgetComponent == nil or UE.IsValid(WidgetComponent) == false then + UE.Log("[UIManager][ShowPlayerGuide] invalid WidgetComponent. GuideID = %d, UIType = %d, ComponentName = %s", GuideID, GuideData.LinkedUIType, GuideData.LinkedComponent) + return false + end + + local GuideClass = UE.LoadClass(GuideClassPath) + local GuideWidget = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, GuideClass) + self.UIRoot:SetUIRoot(GuideWidget, GuideRoot) + + local Data = { + UIConfig = WidgetComponent, + TextConfig = {TextType = GuideData.GuideTextType, Text = GuideData.GuideText} + } + + GuideWidget:SetGuideActionInfo(Data) + self.TriggeredGuideTable[GuideID] = GuideWidget + + return true +end + +function UIManager:RemovePlayerGuide(GuideID) + local GuideWidget = self.TriggeredGuideTable[GuideID] + if GuideWidget == nil or UE.IsValid(GuideWidget) == false then + return + end + + GuideWidget:RemoveFromParent() + self.TriggeredGuideTable[GuideID] = nil +end + +function UIManager:RemoveAllPlayerGuide() + for GuideID, GuideWidget in pairs(self.TriggeredGuideTable) do + if GuideWidget and UE.IsValid(GuideWidget) then + GuideWidget:RemoveFromParent() + self.TriggeredGuideTable[GuideID] = nil + end + end +end + +function UIManager:GetPanelComponentByWidgetName(InUIType, ComponentName) + if not UIManager:IsVisiblePanel(InUIType) then + return nil + end + local UIPanel = self:GetPanel(InUIType) + if UIPanel == nil or UE.IsValid(UIPanel) == false then + return nil + end + + local ComponentNamesTable = string.split(ComponentName, ".") + for _, value in ipairs(ComponentNamesTable) do + if UIPanel and UE.IsValid(UIPanel) then + UIPanel = UIPanel[value] + else + return nil + end + end + return UIPanel +end + +--- 异步加载一张图给UImage对象 +---@param UIImageObj UImage +---@param ResPath string +function UIManager.LoadTexture(UIImageObj, ResPath) + + local softObjPath = KismetSystemLibrary.MakeSoftObjectPath(ResPath); + if softObjPath == nil then + UE.LogError("[UIManager.LoadTexture] LoadTexture Path load failed:%s", ResPath); + return; + end + + STExtraBlueprintFunctionLibrary.GetAssetByAssetReferenceAsync( + softObjPath, + ObjectExtend.CreateDelegate(UGCGameSystem.GameState, function (texture) + if texture ~= nil then + UIImageObj:SetBrushFromTexture(texture); + else + UE.LogError("[UIManager.LoadTexture] LoadTexture nil:%s", ResPath); + end + end), + true + ); +end + +return UIManager \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Condition/SimpleSkillCastCondition.lua b/GZJ/Script/SimpleSkill/Condition/SimpleSkillCastCondition.lua new file mode 100644 index 00000000..34ddc6e5 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Condition/SimpleSkillCastCondition.lua @@ -0,0 +1,10 @@ +local SimpleSkillCastCondition = LuaClass("SimpleSkillCastCondition"); + + +-- 重载这条函数进行条件判定并返回true或false +function SimpleSkillCastCondition:Check(CasterPlayerPawn) + return false +end + + +return SimpleSkillCastCondition; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Condition/SimpleSkillCastCondition_IsNeedHeal.lua b/GZJ/Script/SimpleSkill/Condition/SimpleSkillCastCondition_IsNeedHeal.lua new file mode 100644 index 00000000..05dc1ce7 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Condition/SimpleSkillCastCondition_IsNeedHeal.lua @@ -0,0 +1,14 @@ +local SimpleSkillCastCondition = LuaClass("SimpleSkillCastCondition"); +local SimpleSkillCastCondition_IsNeedHeal = LuaClass("SimpleSkillCastCondition_IsNeedHeal", SimpleSkillCastCondition); + + +function SimpleSkillCastCondition_IsNeedHeal:Check(CasterPlayerPawn) + local IsFullHealth = CasterPlayerPawn:IsFullHealth() + local IsFullEnergy = CasterPlayerPawn:IsFullEnergy() + local Result = not (IsFullHealth == true and IsFullEnergy == true) + UE.Log("[SimpleSkillCastCondition_IsNeedHeal] Check = "..tostring(Result)) + return Result +end + + +return SimpleSkillCastCondition_IsNeedHeal; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Factory/SimpleSkillCastConditionFactory.lua b/GZJ/Script/SimpleSkill/Factory/SimpleSkillCastConditionFactory.lua new file mode 100644 index 00000000..7ce32a79 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Factory/SimpleSkillCastConditionFactory.lua @@ -0,0 +1,20 @@ +local SimpleSkillCastConditionFactory = LuaClass("SimpleSkillCastConditionFactory"); + +local SimpleSkillCastCondition_IsNeedHeal = require("Script.SimpleSkill.Condition.SimpleSkillCastCondition_IsNeedHeal") + +SimpleSkillCastConditionFactory.ConditionType = +{ + [ESkillCastConditionType.IsNeedHeal] = SimpleSkillCastCondition_IsNeedHeal, +}; + +---@param ConditionType ESkillCastCondition +function SimpleSkillCastConditionFactory.GetConditionByType(ConditionType) + for k, v in pairs(SimpleSkillCastConditionFactory.ConditionType) do + if k == ConditionType then + return v + end + end + return nil +end + +return SimpleSkillCastConditionFactory; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Factory/SimpleSkillSelectorFactory.lua b/GZJ/Script/SimpleSkill/Factory/SimpleSkillSelectorFactory.lua new file mode 100644 index 00000000..65b5261a --- /dev/null +++ b/GZJ/Script/SimpleSkill/Factory/SimpleSkillSelectorFactory.lua @@ -0,0 +1,21 @@ +local SimpleSkillSelectorFactory = LuaClass("SimpleSkillSelectorFactory") + +local SimpleSkillSelector_SelfPawn = require("Script.SimpleSkill.Selector.SimpleSkillSelector_SelfPawn") +local SimpleSkillSelector_NearestPawn = require("Script.SimpleSkill.Selector.SimpleSkillSelector_NearestPawn") +local SimpleSkillSelector_CircleRange = require("Script.SimpleSkill.Selector.SimpleSkillSelector_CircleRange") +local SimpleSkillSelector_Straightforward = require("Script.SimpleSkill.Selector.SimpleSkillSelector_Straightforward") + +SimpleSkillSelectorFactory.SelectorList = { + [ESkillSelectorType.SelfPawn] = SimpleSkillSelector_SelfPawn, + [ESkillSelectorType.NearestPawn] = SimpleSkillSelector_NearestPawn, + [ESkillSelectorType.CircleRange] = SimpleSkillSelector_CircleRange, + [ESkillSelectorType.Straightforward] = SimpleSkillSelector_Straightforward, +} + +---@param SelectorType ESkillSelectorType +---@return SimpleSkillSelector +function SimpleSkillSelectorFactory.GetSelectorByType(SelectorType) + return SimpleSkillSelectorFactory.SelectorList[SelectorType] +end + +return SimpleSkillSelectorFactory; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Factory/SimpleSkillTaskFactory.lua b/GZJ/Script/SimpleSkill/Factory/SimpleSkillTaskFactory.lua new file mode 100644 index 00000000..2913b129 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Factory/SimpleSkillTaskFactory.lua @@ -0,0 +1,77 @@ +local SimpleSkillTaskFactory = LuaClass("SimpleSkillTaskFactory") + +local SimpleSkillTask_Heal = require("Script.SimpleSkill.Task.SimpleSkillTask_Heal") +local SimpleSkillTask_Dash = require("Script.SimpleSkill.Task.SimpleSkillTask_Dash") +local SimpleSkillTask_Anger = require("Script.SimpleSkill.Task.SimpleSkillTask_Anger") +local SimpleSkillTask_ShadowKill = require("Script.SimpleSkill.Task.SimpleSkillTask_ShadowKill") +local SimpleSkillTask_Counter = require("Script.SimpleSkill.Task.SimpleSkillTask_Counter") +local SimpleSkillTask_ElectricShock = require("Script.SimpleSkill.Task.SimpleSkillTask_ElectricShock") +local SimpleSkillTask_DeathStrike = require("Script.SimpleSkill.Task.SimpleSkillTask_DeathStrike") +local SimpleSkillTask_Roar = require("Script.SimpleSkill.Task.SimpleSkillTask_Roar") +local SimpleSkillTask_LightWave = require("Script.SimpleSkill.Task.SimpleSkillTask_LightWave") +local SimpleSkillTask_IceFrost = require("Script.SimpleSkill.Task.SimpleSkillTask_IceFrost") +local SimpleSkillTask_Slash = require("Script.SimpleSkill.Task.SimpleSkillTask_Slash") +local SimpleSkillTask_Stun = require("Script.SimpleSkill.Task.SimpleSkillTask_Stun") +local SimpleSkillTask_Exhaust = require("Script.SimpleSkill.Task.SimpleSkillTask_Exhaust") +local SimpleSkillTask_Penetration = require("Script.SimpleSkill.Task.SimpleSkillTask_Penetration") +local SimpleSkillTask_StarFall = require("Script.SimpleSkill.Task.SimpleSkillTask_StarFall") +local SimpleSkillTask_Ray = require("Script.SimpleSkill.Task.SimpleSkillTask_Ray") +local SimpleSkillTask_Crack = require("Script.SimpleSkill.Task.SimpleSkillTask_Crack") +local SimpleSkillTask_Weaken = require("Script.SimpleSkill.Task.SimpleSkillTask_Weaken") +local SimpleSkillTask_Scabbing = require("Script.SimpleSkill.Task.SimpleSkillTask_Scabbing") +local SimpleSkillTask_ToxicRain = require("Script.SimpleSkill.Task.SimpleSkillTask_ToxicRain") +local SimpleSkillTask_Puncture = require("Script.SimpleSkill.Task.SimpleSkillTask_Puncture") +local SimpleSkillTask_Seal = require("Script.SimpleSkill.Task.SimpleSkillTask_Seal") +local SimpleSkillTask_AbsorbSoul = require("Script.SimpleSkill.Task.SimpleSkillTask_AbsorbSoul") +local SimpleSkillTask_Tread = require("Script.SimpleSkill.Task.SimpleSkillTask_Tread") +local SimpleSkillTask_Stomp = require("Script.SimpleSkill.Task.SimpleSkillTask_Stomp") +local SimpleSkillTask_StrongWind = require("Script.SimpleSkill.Task.SimpleSkillTask_StrongWind") +local SimpleSkillTask_FireDomain = require("Script.SimpleSkill.Task.SimpleSkillTask_FireDomain") +local SimpleSkillTask_Flowing = require("Script.SimpleSkill.Task.SimpleSkillTask_Flowing") +local SimpleSkillTask_Tear = require("Script.SimpleSkill.Task.SimpleSkillTask_Tear") +local SimpleSkillTask_StickStrike = require("Script.SimpleSkill.Task.SimpleSkillTask_StickStrike") +local SimpleSkillTask_Shuttle = require("Script.SimpleSkill.Task.SimpleSkillTask_Shuttle") +local SimpleSkillTask_Bombing = require("Script.SimpleSkill.Task.SimpleSkillTask_Bombing") + +SimpleSkillTaskFactory.TaskList = { + [ESkillName.Heal] = SimpleSkillTask_Heal, + [ESkillName.Dash] = SimpleSkillTask_Dash, + [ESkillName.Anger] = SimpleSkillTask_Anger, + [ESkillName.ShadowKill] = SimpleSkillTask_ShadowKill, + [ESkillName.Slash] = SimpleSkillTask_Slash, + [ESkillName.Stun] = SimpleSkillTask_Stun, + [ESkillName.Exhaust] = SimpleSkillTask_Exhaust, + [ESkillName.Penetration] = SimpleSkillTask_Penetration, + [ESkillName.Counter] = SimpleSkillTask_Counter, + [ESkillName.ElectricShock] = SimpleSkillTask_ElectricShock, + [ESkillName.StarFall] = SimpleSkillTask_StarFall, + [ESkillName.Ray] = SimpleSkillTask_Ray, + [ESkillName.Crack] = SimpleSkillTask_Crack, + [ESkillName.Weaken] = SimpleSkillTask_Weaken, + [ESkillName.Scabbing] = SimpleSkillTask_Scabbing, + [ESkillName.DeathStrike] = SimpleSkillTask_DeathStrike, + [ESkillName.Roar] = SimpleSkillTask_Roar, + [ESkillName.LightWave] = SimpleSkillTask_LightWave, + [ESkillName.IceFrost] = SimpleSkillTask_IceFrost, + [ESkillName.ToxicRain] = SimpleSkillTask_ToxicRain, + [ESkillName.Puncture] = SimpleSkillTask_Puncture, + [ESkillName.Seal] = SimpleSkillTask_Seal, + [ESkillName.AbsorbSoul] = SimpleSkillTask_AbsorbSoul, + [ESkillName.Tread] = SimpleSkillTask_Tread, + [ESkillName.Stomp] = SimpleSkillTask_Stomp, + [ESkillName.StrongWind] = SimpleSkillTask_StrongWind, + [ESkillName.FireDomain] = SimpleSkillTask_FireDomain, + [ESkillName.Flowing] = SimpleSkillTask_Flowing, + [ESkillName.Tear] = SimpleSkillTask_Tear, + [ESkillName.StickStrike] = SimpleSkillTask_StickStrike, + [ESkillName.Shuttle] = SimpleSkillTask_Shuttle, + [ESkillName.Bombing] = SimpleSkillTask_Bombing, +} + +---@param SkillName ESkillName +---@return SkillTask +function SimpleSkillTaskFactory.GetTaskBySkillName(SkillName) + return SimpleSkillTaskFactory.TaskList[SkillName] +end + +return SimpleSkillTaskFactory; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector.lua b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector.lua new file mode 100644 index 00000000..21426a5b --- /dev/null +++ b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector.lua @@ -0,0 +1,63 @@ +-- 技能目标选取器,找到要释放的对象 +local SimpleSkillSelector = LuaClass("SimpleSkillSelector") + +SimpleSkillSelector.CasterPawn = nil +SimpleSkillSelector.TargetPawns = {} + +SimpleSkillSelector.ForwardOffset = 0 +SimpleSkillSelector.Param_Float = 0 +SimpleSkillSelector.Param_Vector = {X = 0, Y = 0, Z = 0} + +function SimpleSkillSelector:ctor() +end + +function SimpleSkillSelector:InitSelectorFromData(SelectorData, CasterPawn) + self.CasterPawn = CasterPawn + + self.LimitNum = SelectorData.LimitNum + self.ForwardOffset = SelectorData.ForwardOffset + self.Param_Float = SelectorData.Param_Float + self.Param_Vector = SelectorData.Param_Vector +end + +function SimpleSkillSelector:GetIgnoredActors() + local ActorsToIgnore = {} + table.insert(ActorsToIgnore, self.CasterPawn) + + if self.CasterPawn.IsInArena then + --如果在场内,则忽略所有练功房的怪物 + local AllHangUpRoomSpawners = UGCGameSystem.GameState:GetAllHangUpRoomSpawners() + for _, HangUpRoomSpawner in pairs(AllHangUpRoomSpawners) do + for _, SpawnedMonster in pairs(HangUpRoomSpawner.SpawnedMonsters) do + if SpawnedMonster ~= nil and UE.IsValid(SpawnedMonster) and UGCSimpleCharacterSystem.GetHealth(SpawnedMonster) > 0 then + table.insert(ActorsToIgnore, SpawnedMonster) + end + end + end + else + --如果在练功房,则忽略场内进攻怪 + local AttackWaveSpawner = UGCGameSystem.GameState:GetAttackWaveSpawner() + if AttackWaveSpawner then + for _, SpawnedMonster in pairs(AttackWaveSpawner.SpawnedMonsters) do + if SpawnedMonster ~= nil and UE.IsValid(SpawnedMonster) and UGCSimpleCharacterSystem.GetHealth(SpawnedMonster) > 0 then + table.insert(ActorsToIgnore, SpawnedMonster) + end + end + end + end + + return ActorsToIgnore +end + +--- 子类实现 +function SimpleSkillSelector:ActivateSelector() + UE.Log("[SimpleSkillSelector] activated") +end + +function SimpleSkillSelector:GetTargetPawns() + self.TargetPawns = {} + self:ActivateSelector() + return self.TargetPawns +end + +return SimpleSkillSelector; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_CircleRange.lua b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_CircleRange.lua new file mode 100644 index 00000000..23963f86 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_CircleRange.lua @@ -0,0 +1,47 @@ +local SimpleSkillSelector = require("Script.SimpleSkill.Selector.SimpleSkillSelector") +local SimpleSkillSelector_CircleRange = LuaClass("SimpleSkillSelector_CircleRange", SimpleSkillSelector) + +function SimpleSkillSelector_CircleRange:ctor() + SimpleSkillSelector_CircleRange.super.ctor(self) +end + +function SimpleSkillSelector_CircleRange:InitSelectorFromData(SelectorData, CasterPawn) + SimpleSkillSelector.InitSelectorFromData(self, SelectorData, CasterPawn) +end + +--- 子类实现 +function SimpleSkillSelector_CircleRange:ActivateSelector() + SimpleSkillSelector.ActivateSelector(self) + + UE.Log("[SimpleSkillSelector_CircleRange] activated") + + self:GetPawnsInCircleRange() +end + +function SimpleSkillSelector_CircleRange:GetPawnsInCircleRange() + local Radius = self.Param_Float + + local Forward = self.CasterPawn:GetActorForwardVector() + local SphereLoc = VectorHelper.Add(self.CasterPawn:K2_GetActorLocation(), VectorHelper.MulNumber(KismetMathLibrary.Normal(Forward), self.ForwardOffset)) + + --减去人物半高才能贴到地面 + SphereLoc.Z = SphereLoc.Z - 88.0 + + local ObjectTypes = {} + local ActorClassFilter = UE.LoadClass(BPClassPath.MonsterBase) + local ActorsToIgnore = self:GetIgnoredActors() + local RetVal, OutActors = KismetSystemLibrary.SphereOverlapActors(self.CasterPawn, SphereLoc, Radius, ObjectTypes, ActorClassFilter, ActorsToIgnore) + + if GlobalConfigs.OpenDebug then + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "DrawDebugSphere", VectorHelper.ToLuaTable(SphereLoc), {1,0,0,1}, Radius) + end + + if RetVal then + local RetLimitNum = self.LimitNum > 0 and (self.LimitNum > #OutActors and #OutActors or self.LimitNum) or #OutActors + for i = 1, RetLimitNum, 1 do + table.insert(self.TargetPawns, OutActors[i]) + end + end +end + +return SimpleSkillSelector_CircleRange; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_NearestPawn.lua b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_NearestPawn.lua new file mode 100644 index 00000000..5787fa6e --- /dev/null +++ b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_NearestPawn.lua @@ -0,0 +1,58 @@ +local SimpleSkillSelector = require("Script.SimpleSkill.Selector.SimpleSkillSelector") +local SimpleSkillSelector_NearestPawn = LuaClass("SimpleSkillSelector_NearestPawn", SimpleSkillSelector) + +function SimpleSkillSelector_NearestPawn:ctor() + SimpleSkillSelector_NearestPawn.super.ctor(self) +end + +function SimpleSkillSelector_NearestPawn:InitSelectorFromData(SelectorData, CasterPawn) + SimpleSkillSelector.InitSelectorFromData(self, SelectorData, CasterPawn) +end + +--- 子类实现 +function SimpleSkillSelector_NearestPawn:ActivateSelector() + SimpleSkillSelector.ActivateSelector(self) + + UE.Log("[SimpleSkillSelector_NearestPawn] activated") + + self:GetNearestPawn() +end + +function SimpleSkillSelector_NearestPawn:GetNearestPawn() + local PawnLoc = self.CasterPawn:K2_GetActorLocation() + + local AllMonsters = {} + + if self.CasterPawn.IsInArena then + local AttackWaveSpawner = UGCGameSystem.GameState:GetAttackWaveSpawner() + if AttackWaveSpawner then + AllMonsters = AttackWaveSpawner.SpawnedMonsters + end + else + local TargetSpawner = UGCGameSystem.GameState:GetSpawnerByPlayerKey(self.CasterPawn.PlayerKey) + if TargetSpawner then + AllMonsters = TargetSpawner.SpawnedMonsters + end + end + + local Target = nil + local MinDist = 999999 + for _, Monster in pairs(AllMonsters) do + if Monster ~= nil and UE.IsValid(Monster) then + if UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + local MonsterLoc = Monster:K2_GetActorLocation() + local Dist = VectorHelper.GetDistance(PawnLoc, MonsterLoc) + if Dist <= MinDist then + MinDist = Dist + Target = Monster + end + end + end + end + + if Target ~= nil then + table.insert(self.TargetPawns, Target) + end +end + +return SimpleSkillSelector_NearestPawn; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_SelfPawn.lua b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_SelfPawn.lua new file mode 100644 index 00000000..b64e4633 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_SelfPawn.lua @@ -0,0 +1,25 @@ +local SimpleSkillSelector = require("Script.SimpleSkill.Selector.SimpleSkillSelector") +local SimpleSkillSelector_SelfPawn = LuaClass("SimpleSkillSelector_SelfPawn", SimpleSkillSelector) + +function SimpleSkillSelector_SelfPawn:ctor() + SimpleSkillSelector_SelfPawn.super.ctor(self) +end + +function SimpleSkillSelector_SelfPawn:InitSelectorFromData(SelectorData, CasterPawn) + SimpleSkillSelector.InitSelectorFromData(self, SelectorData, CasterPawn) +end + +--- 子类实现 +function SimpleSkillSelector_SelfPawn:ActivateSelector() + SimpleSkillSelector.ActivateSelector(self) + + UE.Log("[SimpleSkillSelector_SelfPawn] activated") + + self:GetSelfPawn() +end + +function SimpleSkillSelector_SelfPawn:GetSelfPawn() + table.insert(self.TargetPawns, self.CasterPawn) +end + +return SimpleSkillSelector_SelfPawn; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_StraightForward.lua b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_StraightForward.lua new file mode 100644 index 00000000..699ca171 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Selector/SimpleSkillSelector_StraightForward.lua @@ -0,0 +1,51 @@ +local SimpleSkillSelector = require("Script.SimpleSkill.Selector.SimpleSkillSelector") +local SimpleSkillSelector_Straightforward = LuaClass("SimpleSkillSelector_Straightforward", SimpleSkillSelector) + +function SimpleSkillSelector_Straightforward:ctor() + SimpleSkillSelector_Straightforward.super.ctor(self) +end + +function SimpleSkillSelector_Straightforward:InitSelectorFromData(SelectorData, CasterPawn) + SimpleSkillSelector.InitSelectorFromData(self, SelectorData, CasterPawn) + self.ForwardOffset = self.ForwardOffset > 0.001 and self.ForwardOffset or 1 --此时ForwardOffset为碰撞盒前向偏移的系数,必须为1以上 +end + +--- 子类实现 +function SimpleSkillSelector_Straightforward:ActivateSelector() + SimpleSkillSelector.ActivateSelector(self) + + + + self:GetPawnsInRectangle() +end + +function SimpleSkillSelector_Straightforward:GetPawnsInRectangle() + local Length = self.Param_Vector.X + local Width = self.Param_Vector.Y + local Height = self.Param_Vector.Z + + local Forward = self.CasterPawn:GetActorForwardVector() + local BoxLoc = VectorHelper.Add(self.CasterPawn:K2_GetActorLocation(), VectorHelper.MulNumber(KismetMathLibrary.Normal(Forward), Length / 2 * self.ForwardOffset)) + + local CasterRotation = self.CasterPawn:K2_GetActorRotation() + local BoxRotation = {Yaw = CasterRotation.Yaw, Pitch = CasterRotation.Pitch, Roll = CasterRotation.Roll} + local BoxExtent = {X = Length/2, Y = Width/2, Z = Height/2} + + local ObjectTypes = {} + local ActorClassFilter = UE.LoadClass(BPClassPath.MonsterBase) + local ActorsToIgnore = self:GetIgnoredActors() + local RetVal, OutActors = KismetSystemLibrary.BoxOverlapActors(self.CasterPawn, BoxLoc, BoxRotation, BoxExtent, ObjectTypes, ActorClassFilter, ActorsToIgnore) + + if GlobalConfigs.OpenDebug then + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn , "DrawDebugBox" , VectorHelper.ToLuaTable(BoxLoc), BoxExtent, {1,0,0,1}, BoxRotation) + end + + if RetVal then + local RetLimitNum = self.LimitNum > 0 and (self.LimitNum > #OutActors and #OutActors or self.LimitNum) or #OutActors + for i = 1, RetLimitNum, 1 do + table.insert(self.TargetPawns, OutActors[i]) + end + end +end + +return SimpleSkillSelector_Straightforward; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/SimpleSkill.lua b/GZJ/Script/SimpleSkill/SimpleSkill.lua new file mode 100644 index 00000000..a130401c --- /dev/null +++ b/GZJ/Script/SimpleSkill/SimpleSkill.lua @@ -0,0 +1,178 @@ +local SimpleSkillTaskFactory = require("Script.SimpleSkill.Factory.SimpleSkillTaskFactory") +local SimpleSkillSelectorFactory = require("Script.SimpleSkill.Factory.SimpleSkillSelectorFactory") +local SimpleSkillCastConditionFactory = require("Script.SimpleSkill.Factory.SimpleSkillCastConditionFactory") +-- 简单技能类 +local SimpleSkill = LuaClass("SimpleSkill") + +SimpleSkill.SkillName = -1 +SimpleSkill.CasterPawn = nil +SimpleSkill.OwnerSkillSystemComponent = nil + +SimpleSkill.IsReady = true +SimpleSkill.SkillType = ESkillType.Active +SimpleSkill.EnergyCost = 0 +SimpleSkill.CoolDownDuration = 0 +SimpleSkill.CoolDownTimer = 0 +SimpleSkill.bEndSkill = false +SimpleSkill.NeedCheckTargetBeforeCast = false + +SimpleSkill.Task = nil +SimpleSkill.Selector = nil + +--- 技能释放的目标 +SimpleSkill.TargetPawns = {} + +--- 用来设置额外的技能条件 +SimpleSkill.CasterConditionList = {} + +-- 技能等级 +SimpleSkill.SkillLevel = 1 +SimpleSkill.MaxSkillLevel = 4 + + +function SimpleSkill:ctor(CasterPawn) + self.CasterPawn = CasterPawn + self.OwnerSkillSystemComponent = self.CasterPawn.SkillSystemComponent +end + +function SimpleSkill:SetSkillSystemComponent(SSC) + self.OwnerSkillSystemComponent = SSC; +end + +function SimpleSkill:GetSkillItemID() + if self.SkillName <= 0 then + return 0 + end + + return 20000 + self.SkillName * 100 + self.SkillLevel * 10 +end + +function SimpleSkill:InitConfig(SkillData) + self.SkillType = SkillData.SkillType + self.CoolDownDuration = SkillData.CoolDownDuration + self.EnergyCost = SkillData.EnergyCost + self.NeedCheckTargetBeforeCast = SkillData.NeedCheckTargetBeforeCast + + local TaskClass = SimpleSkillTaskFactory.GetTaskBySkillName(self.SkillName) + self.Task = TaskClass.New(self) + self.Task:InitTaskFromData(SkillData.TaskData, self.CasterPawn) + self.Task:UpdateSkillLevel(self.SkillLevel) + + local SelectorClass = SimpleSkillSelectorFactory.GetSelectorByType(SkillData.SelectorData.SelectorType) + self.Selector = SelectorClass.New() + self.Selector:InitSelectorFromData(SkillData.SelectorData, self.CasterPawn) + + self.CasterConditionList = {} + for k, ConditionType in pairs(UE.ToTable(SkillData.Conditions)) do + local Condition = SimpleSkillCastConditionFactory.GetConditionByType(ConditionType) + if Condition ~= nil then + table.insert(self.CasterConditionList, Condition) + end + end + + if self.SkillType == ESkillType.Passive then --若是被动技能,初始化后直接运行 + self:CastSkill() + end +end + +function SimpleSkill:IsReadyToCastSkill() + -- 还在CD阶段就直接返回false + if not self.IsReady then + return false + end + + -- 技能条件不满足返回false + for i, v in pairs(self.CasterConditionList) do + if v:Check(self.CasterPawn) == false then + UE.Log("[SimpleSkill:IsReadyToCastSkill] CastCondition failed") + NoticeTipsTools.ServerGeneralNoticeTips(self.CasterPawn.PlayerKey, "技能条件不满足") + return false + end + end + + -- 能量值不够返回false + if self.CasterPawn:GetCurEnergy() < self.EnergyCost then + NoticeTipsTools.ServerGeneralNoticeTips(self.CasterPawn.PlayerKey, "能量值不足") + return false + end + + -- 没有可用目标则返回false + if self.NeedCheckTargetBeforeCast == true then + self.TargetPawns = self:GetTargetPawns() + if table.isEmpty(self.TargetPawns) then + NoticeTipsTools.ServerGeneralNoticeTips(self.CasterPawn.PlayerKey, "无可施法目标") + return false + end + end + + return true +end + +function SimpleSkill:CastSkill() + UE.Log("[Skill][CastSkill] SkillName:%s, Begin", self.SkillName) + if self.SkillType == ESkillType.Active then + self.IsReady = false + self.bEndSkill = false + self.CoolDownTimer = self.CoolDownDuration + + if self.EnergyCost > 0.001 then + self.CasterPawn:ConsumeEnergy(self.EnergyCost) + end + end + + self:InternalCastSkill() +end + +function SimpleSkill:InternalCastSkill() + -- 执行任务 + self.Task:ActivateTask() +end + +-- 结束技能 +function SimpleSkill:EndSkill() + self.Task:EndTask() +end + +function SimpleSkill:OnTick(DeltaTime) + if not self.IsReady then + self.CoolDownTimer = self.CoolDownTimer - DeltaTime + if self.CoolDownTimer <= 0 then + self.IsReady = true + end + end +end + +function SimpleSkill:SetSkillLevel(NewSkillLevel) + UE.Log("[SimpleSkill] Set Skill Level: %s", NewSkillLevel); + + NewSkillLevel = math.min(NewSkillLevel, self.MaxSkillLevel); + self.SkillLevel = NewSkillLevel; + + self:OnSkillLevelChanged(NewSkillLevel); +end + +function SimpleSkill:GetSkillLevel() + return self.SkillLevel; +end + +--- 技能等级变化引起的其他逻辑 +--- 例如改变技能CD +function SimpleSkill:OnSkillLevelChanged(NewSkillLevel) + if self.Task ~= nil then + self.Task:UpdateSkillLevel(NewSkillLevel) + end +end + +function SimpleSkill:ResetSkillCD() + self.CoolDownTimer = 0 +end + +function SimpleSkill:GetTargetPawns() + if self.Selector then + return self.Selector:GetTargetPawns() + end + + return nil +end + +return SimpleSkill; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/SkillConfig.lua b/GZJ/Script/SimpleSkill/SkillConfig.lua new file mode 100644 index 00000000..e5d0034e --- /dev/null +++ b/GZJ/Script/SimpleSkill/SkillConfig.lua @@ -0,0 +1,750 @@ +---技能配置表 +---@type table +SkillConfig = SkillConfig or { + -----------------------------------自带技能----------------------------------- + + [ESkillName.Heal] = { + SkillName = ESkillName.Heal, --技能名称 + SkillType = ESkillType.Active, --技能类型(主动、被动技能) + SkillAccess = ESkillAccessType.BuiltIn, --技能的获取方式(BuiltIn为自带技能,Talented为天赋技能,Aquired为角色技能,影响的是技能所能适配的槽位) + CoolDownDuration = 20.0, --技能的冷却时间 + EnergyCost = 0.0, --技能的能量消耗 + Conditions = { ESkillCastConditionType.IsNeedHeal }, --技能执行前的附加条件(通用条件) + NeedCheckTargetBeforeCast = false, --是否需要在判断技能能否施放时判断有没有目标(仅对主动技能有效,用于指向特定目标的技能,默认不判断,即值为false) + SelectorData = { + SelectorType = ESkillSelectorType.SelfPawn, --目标选取器类型(SelfPawn表示施法者自己,NearestPawn表示离施法者最近的Pawn,CircleRange表示施法者圆形范围内的Pawn,Straightforward表示施法者矩形范围内的Pawn) + LimitNum = 0, --选取目标的个数(选取器类型不为SelfPawn时才有效,0则不作个数上的限制) + ForwardOffset = 0, --选取点离施法者前方的偏移距离 + Param_Float = 0.0, --用于CircleRange类型选取器,表示圆形范围的半径 + Param_Vector = {X = 0, Y = 0, Z = 0}, --用于StraightForward类型选取器,X表示选取范围的长度,Y表示选取范围的宽度,Z表示选取范围的高度 + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, --技能持续类型(Instant表示瞬时,HasDuration表示持续一段时间) + Duration = 0.0, --技能持续时间(时长类型为HasDuration时才生效) + Period = 0.0, --循环执行的周期(时长类型为HasDuration且Duration>0时才生效) + ExecuteOnApply = false, --是否刚开始就执行(时长类型为HasDuration且Period>0时才生效) + EffectId = 1, --技能特效ID(EffectTables表中) + }, + }, + + -----------------------------------天赋技能----------------------------------- + + [ESkillName.Dash] = { + SkillName = ESkillName.Dash, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Talented, + CoolDownDuration = 5.0, + EnergyCost = 10.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.SelfPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 2, + }, + }, + [ESkillName.Anger] = { + SkillName = ESkillName.Anger, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Talented, + CoolDownDuration = 50.0, + EnergyCost = 20.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.SelfPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 8.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 3, + }, + }, + [ESkillName.ShadowKill] = { + SkillName = ESkillName.ShadowKill, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Talented, + CoolDownDuration = 50.0, + EnergyCost = 20.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.SelfPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 8.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 4, + }, + }, + [ESkillName.Slash] = { + SkillName = ESkillName.Slash, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Talented, + CoolDownDuration = 25.0, + EnergyCost = 20.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 300.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 5, + }, + }, + [ESkillName.Stun] = { + SkillName = ESkillName.Stun, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Talented, + CoolDownDuration = 30.0, + EnergyCost = 20.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 300.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 3.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 6, + }, + }, + [ESkillName.Exhaust] = { + SkillName = ESkillName.Exhaust, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Talented, + CoolDownDuration = 45.0, + EnergyCost = 20.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 300.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 8.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 8, + }, + }, + [ESkillName.Penetration] = { + SkillName = ESkillName.Penetration, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Talented, + CoolDownDuration = 50.0, + EnergyCost = 20.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.SelfPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 8.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 9, + }, + }, + + -----------------------------------角色技能----------------------------------- + + [ESkillName.Counter] = { + SkillName = ESkillName.Counter, + SkillType = ESkillType.Passive, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 0.0, + EnergyCost = 0.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 300.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 10, + }, + }, + [ESkillName.ElectricShock] = { + SkillName = ESkillName.ElectricShock, + SkillType = ESkillType.Passive, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 0.0, + EnergyCost = 0.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 5, + ForwardOffset = 0, + Param_Float = 500.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 11, + }, + }, + [ESkillName.StarFall] = { + SkillName = ESkillName.StarFall, + SkillType = ESkillType.Passive, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 0.0, + EnergyCost = 0.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 12, + }, + }, + [ESkillName.Ray] = { + SkillName = ESkillName.Ray, + SkillType = ESkillType.Passive, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 0.0, + EnergyCost = 0.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.Straightforward, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 13, + }, + }, + [ESkillName.Crack] = { + SkillName = ESkillName.Crack, + SkillType = ESkillType.Passive, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 0.0, + EnergyCost = 0.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.SelfPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 14, + }, + }, + [ESkillName.Weaken] = { + SkillName = ESkillName.Weaken, + SkillType = ESkillType.Passive, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 0.0, + EnergyCost = 0.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.SelfPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 15, + }, + }, + [ESkillName.Scabbing] = { + SkillName = ESkillName.Scabbing, + SkillType = ESkillType.Passive, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 0.0, + EnergyCost = 0.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.SelfPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 16, + }, + }, + [ESkillName.DeathStrike] = { + SkillName = ESkillName.DeathStrike, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 35.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = true, + SelectorData = { + SelectorType = ESkillSelectorType.NearestPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 17, + }, + }, + [ESkillName.Roar] = { + SkillName = ESkillName.Roar, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 400.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 18, + }, + }, + [ESkillName.LightWave] = { + SkillName = ESkillName.LightWave, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.Straightforward, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 5000, Y = 300, Z = 300}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 19, + }, + }, + [ESkillName.IceFrost] = { + SkillName = ESkillName.IceFrost, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 1000.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 3.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 20, + }, + }, + [ESkillName.ToxicRain] = { + SkillName = ESkillName.ToxicRain, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = true, + SelectorData = { + SelectorType = ESkillSelectorType.NearestPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 3.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 21, + }, + }, + [ESkillName.Puncture] = { + SkillName = ESkillName.Puncture, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.Straightforward, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 1000, Y = 100, Z = 200}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 22, + }, + }, + [ESkillName.Seal] = { + SkillName = ESkillName.Seal, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.NearestPawn, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 23, + }, + }, + [ESkillName.AbsorbSoul] = { + SkillName = ESkillName.AbsorbSoul, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 400.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 24, + }, + }, + [ESkillName.Tread] = { + SkillName = ESkillName.Tread, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 300.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 25, + }, + }, + [ESkillName.Stomp] = { + SkillName = ESkillName.Stomp, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 25.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 500.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 26, + }, + }, + [ESkillName.StrongWind] = { + SkillName = ESkillName.StrongWind, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 30.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 300.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 27, + }, + }, + [ESkillName.FireDomain] = { + SkillName = ESkillName.FireDomain, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 22.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.Straightforward, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 400, Y = 100, Z = 200}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 3.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 28, + }, + }, + [ESkillName.Flowing] = { + SkillName = ESkillName.Flowing, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.Straightforward, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 800, Y = 200, Z = 200}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 3.0, + Period = 1.0, + ExecuteOnApply = true, + EffectId = 29, + }, + }, + [ESkillName.Tear] = { + SkillName = ESkillName.Tear, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 30.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 200.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 5.0, + Period = 1.0, + ExecuteOnApply = true, + EffectId = 30, + }, + }, + [ESkillName.StickStrike] = { + SkillName = ESkillName.StickStrike, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 20.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.Straightforward, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0.0, + Param_Vector = {X = 1000, Y = 200, Z = 200}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 31, + }, + }, + [ESkillName.Shuttle] = { + SkillName = ESkillName.Shuttle, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 35.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = true, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 400.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.Instant, + Duration = 0.0, + Period = 0.0, + ExecuteOnApply = false, + EffectId = 33, + }, + }, + [ESkillName.Bombing] = { + SkillName = ESkillName.Bombing, + SkillType = ESkillType.Active, + SkillAccess = ESkillAccessType.Acquired, + CoolDownDuration = 35.0, + EnergyCost = 40.0, + Conditions = {}, + NeedCheckTargetBeforeCast = false, + SelectorData = { + SelectorType = ESkillSelectorType.CircleRange, + LimitNum = 8, + ForwardOffset = 0, + Param_Float = 400.0, + Param_Vector = {X = 0, Y = 0, Z = 0}, + }, + TaskData = { + DurationPolicy = ETaskDurationPolicy.HasDuration, + Duration = 5.0, + Period = 0.5, + ExecuteOnApply = false, + EffectId = 34, + }, + }, +} + +return SkillConfig; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/SkillSystemComponent.lua b/GZJ/Script/SimpleSkill/SkillSystemComponent.lua new file mode 100644 index 00000000..1ce5a3ec --- /dev/null +++ b/GZJ/Script/SimpleSkill/SkillSystemComponent.lua @@ -0,0 +1,263 @@ +---@class SkillSystemComponent + +local SkillSystemComponent = LuaClass("SkillSystemComponent") + +SkillSystemComponent.OwnerChatacter = nil + +--- 存储所有玩家拥有过的技能实例 +---@type table +SkillSystemComponent.SkillsMap = {} + +--- 记录技能与槽位间的匹配信息 +---@type table +SkillSystemComponent.SlotToSkillList = {} + + +function SkillSystemComponent:ctor(OwnerActor) + self.Owner = OwnerActor +end + +function SkillSystemComponent:OnTick(DeltaTime) + --- Skill的Tick + for _, SimpleSkill in pairs(self.SlotToSkillList) do + if SimpleSkill ~= nil then + SimpleSkill:OnTick(DeltaTime) + end + end +end + +------------------------------------------------ Skill 相关 ------------------------------------------------ +---@param SkillNameList ESkillName[] +function SkillSystemComponent:GiveSkillWithList(SkillNameList) + for k, SkillName in pairs(SkillNameList) do + self:GiveSkill(SkillName) + end +end + +---@param SkillName ESkillName +---@param SkillSlot ESkillSlot +---@param SkillLevel int +---@return SkillItemID +function SkillSystemComponent:GiveSkill(SkillName, SkillSlot, SkillLevel) + if not UGCGameSystem.IsServer() then + UE.Log("[SkillSystemComponent:GiveSkill] 未在服务端调用") + return -1 + end + + local SkillDat = GameDataManager.GetSkillData(SkillName) + if SkillDat == nil then + UE.Log("[SkillSystemComponent:GiveSkill] 配置表中无此技能: %s", tostring(SkillName)) + return -1 + end + + if SkillSlot == nil then + local AvaliableSlot = self:GetSkillAvaliableSlot(SkillDat.SkillAccess) + if AvaliableSlot == nil then + UE.Log("[SkillSystemComponent:GiveSkill] 无可用技能插槽,需指定") + return -1 + else + SkillSlot = AvaliableSlot + end + elseif SkillSlot < ESkillSlot.Slot0 or SkillSlot > ESkillSlot.Slot4 then + UE.Log("[SkillSystemComponent:GiveSkill] 技能插槽非法: %s", tostring(SkillSlot)) + return -1 + end + + ---无指定技能等级则默认为1级技能 + if SkillLevel == nil or SkillLevel <= 0 then + SkillLevel = 1 + end + + ---验证是否有相同的技能,即名字相同且等级相同,此时插槽视为无效 + local OwnedSkills = self.SkillsMap[SkillName] + if OwnedSkills ~= nil and table.getCount(OwnedSkills) > 0 then + for _, SimpleSkill in pairs(OwnedSkills) do + if SimpleSkill.SkillLevel == SkillLevel then + UE.Log("[SkillSystemComponent:GiveSkill] 相同技能已存在: Skill=%d, Level=%d", SkillName, SkillLevel) + return -1 + end + end + end + + for Slot, SkillInfo in pairs(self.Owner.Controller.ActiveSkillNameList) do + if SkillInfo.SkillName == SkillName then + if Slot == SkillSlot then + if SkillLevel ~= SkillInfo.SkillLevel then + ---同名技能若在同一插槽且等级不同,则进行替换操作 + local CurSkill = self.SlotToSkillList[Slot] + local CurSkillItemID = CurSkill:GetSkillItemID() + CurSkill:SetSkillLevel(SkillLevel) + + self.Owner.Controller.ActiveSkillNameList[Slot] = {SkillName = SkillName, SkillLevel = SkillLevel} + UnrealNetwork.CallUnrealRPC(self.Owner.Controller, self.Owner.Controller, "ClientRPC_SetupSkillButton", SkillName, SkillSlot, SkillLevel) --TODO:后期还需加上等级 + + UE.Log("[SkillSystemComponent:GiveSkill] 更新技能slot=%d", SkillSlot) + + ---返回已有技能的ID + return CurSkillItemID + else + ---同名技能不在同一插槽且等级不同,则进行普通添加技能流程 + end + end + end + end + + local CurSkillItemID = 0 + local CurSkill = self:GetSkillBySlot(SkillSlot) + if CurSkill ~= nil then + CurSkillItemID = CurSkill:GetSkillItemID() + self:RemoveSkillBySlot(SkillSlot) --TODO:移除流程 + end + + -- 新的技能实例 + local SimpleSkill = require("Script.SimpleSkill.SimpleSkill") + local Skill = SimpleSkill.New(self.Owner) + + Skill.SkillName = SkillName + Skill:SetSkillLevel(SkillLevel) + Skill:InitConfig(SkillDat) + + self:AddSkillToMap(SkillName, Skill) + self.SlotToSkillList[SkillSlot] = Skill + + --将Slot-SkillName对应关系写入PlayerController + self.Owner.Controller.ActiveSkillNameList[SkillSlot] = {SkillName = SkillName, SkillLevel = SkillLevel} + + UnrealNetwork.CallUnrealRPC(self.Owner.Controller, self.Owner.Controller, "ClientRPC_SetupSkillButton", SkillName, SkillSlot, SkillLevel) + UnrealNetwork.CallUnrealRPC(self.Owner.Controller, self.Owner.Controller, "ClientRPC_SetSkillCD", SkillSlot, 0.1) + + UE.Log("[SkillSystemComponent:GiveSkill] AddSimpleSkill OwnerPawn:%d SkillName:%d", self.Owner.PlayerKey, SkillName) + + return CurSkillItemID +end + +---@param SkillAccessType ESkillAccessType +function SkillSystemComponent:GetSkillAvaliableSlot(SkillAccessType) + if SkillAccessType == ESkillAccessType.Acquired then + for i = ESkillSlot.Slot1, ESkillSlot.Slot3 do + if self:GetSkillBySlot(i) == nil then + return i + end + end + elseif SkillAccessType == ESkillAccessType.Talented then + return ESkillSlot.Slot0 + elseif SkillAccessType == ESkillAccessType.BuiltIn then + return ESkillSlot.Slot4 + end + + return nil +end + +---@param SkillSlot ESkillSlot +---@return SimpleSkill +function SkillSystemComponent:GetSkillBySlot(SkillSlot) + return self.SlotToSkillList[SkillSlot] +end + +---@param SkillName ESkillName +---@param SimpleSkill SimpleSkill +function SkillSystemComponent:AddSkillToMap(SkillName, SimpleSkill) + if self.SkillsMap[SkillName] == nil then + self.SkillsMap[SkillName] = {} + end + table.insert(self.SkillsMap[SkillName], SimpleSkill) +end + +---@param SimpleSkill SimpleSkill +function SkillSystemComponent:RemoveSkill(SimpleSkill) + if SimpleSkill == nil then + UE.Log("[SkillSystemComponent:RemoveSkill] invalid Skill!") + return -1 + end + + SimpleSkill:EndSkill() + + for SkillName, Skills in pairs(self.SkillsMap) do + for index, SkillInst in pairs(Skills) do + if SkillInst == SimpleSkill then + self.SkillsMap[SkillName][index] = nil + break + end + end + end + + for Slot, SkillInst in pairs(self.SlotToSkillList) do + if SkillInst == SimpleSkill then + self.SlotToSkillList[Slot] = nil + end + end + + local RemovedSkillItemID = SimpleSkill:GetSkillItemID() + SimpleSkill = nil + + UE.Log("[SkillSystemComponent:RemoveSkillBySlot] Remove Success!") + + return RemovedSkillItemID +end + +---@param SkillName ESkillName +function SkillSystemComponent:RemoveSkillBySlot(SkillSlot) + local CurSkill = self.SlotToSkillList[SkillSlot] + if CurSkill == nil then + UE.Log("[SkillSystemComponent:RemoveSkillBySlot] invalid SkillSlot! OwnerPawn:%d SkillSlot:%d", self.Owner.PlayerKey, SkillSlot) + return -1 + end + + local RemovedSkillItemID = CurSkill:GetSkillItemID() + CurSkill:EndSkill() + + for SkillName, Skills in pairs(self.SkillsMap) do + for index, SkillInst in pairs(Skills) do + if SkillInst == CurSkill then + self.SkillsMap[SkillName][index] = nil + break + end + end + end + + self.SlotToSkillList[SkillSlot] = nil + + UE.Log("[SkillSystemComponent:RemoveSkillBySlot] RemoveSimpleSkill OwnerPawn:%d SkillSlot:%d", self.Owner.PlayerKey, SkillSlot) + + return RemovedSkillItemID +end + +function SkillSystemComponent:RemoveAllSkill() + for _, SimpleSkill in pairs(self.SlotToSkillList) do + SimpleSkill:EndSkill() + end + self.SkillsMap = nil + self.SlotToSkillList = nil +end + +---@param SkillSlot ESkillSlot +function SkillSystemComponent:TryActiveSkillBySlot(SkillSlot) + local SkillInst = self.SlotToSkillList[SkillSlot] + if SkillInst == nil then + UE.Log("[SkillSystemComponent:TryActiveSkillBySlot] invalid SkillSlot[%d]", SkillSlot) + return + end + + if not SkillInst:IsReadyToCastSkill() then + UE.Log("[SkillSystemComponent:TryActiveSkillBySlot] Skill[%d] is not ready", SkillInst.SkillName) + return + end + + UnrealNetwork.CallUnrealRPC(self.Owner.Controller, self.Owner.Controller, "ClientRPC_SetSkillCD", SkillSlot, SkillInst.CoolDownDuration) + + SkillInst:CastSkill() + UE.Log("[SkillSystemComponent:TryActiveSkillBySlot] ActiveSimpleSkill SkillSlot:%d, SkillName:%d", SkillSlot, SkillInst.SkillName) +end + +--- 外部传入技能目标 +---@param SkillName ESkillName +---@param TargetPawnsList UGCPlayerPawn[] +function SkillSystemComponent:SetTargetPawnsToSkill(SkillName, TargetPawnsList) + local CurSkill = self.SkillsMap[SkillName] + if SkillName ~= nil and CurSkill ~= nil then + CurSkill.TargetActors = {} + CurSkill.TargetPawns = TargetPawnsList + end +end + +return SkillSystemComponent; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask.lua new file mode 100644 index 00000000..9e6074fb --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask.lua @@ -0,0 +1,180 @@ +-- 技能任务脚本,实际技能效果实现在此 +local SimpleSkillTask = LuaClass("SimpleSkillTask") + +SimpleSkillTask.OwnerSkill = nil +SimpleSkillTask.SkillName = ESkillName.Default +SimpleSkillTask.TaskName = "" +SimpleSkillTask.SkillLevel = 1 + +SimpleSkillTask.CasterPawn = nil +SimpleSkillTask.DurationPolicy = ETaskDurationPolicy.Instant +SimpleSkillTask.Duration = 0 +SimpleSkillTask.DurationTimer = 0 +SimpleSkillTask.Period = 0 +SimpleSkillTask.ExecuteOnApply = true + +SimpleSkillTask.IsActivated = false + +SimpleSkillTask.EffectId = 0 +SimpleSkillTask.TaskTimer = nil +SimpleSkillTask.Selector = nil + +SimpleSkillTask.SkillEffects = {} +SimpleSkillTask.TargetPawns = {} + +function SimpleSkillTask:ctor(OwnerSkill) + self.OwnerSkill = OwnerSkill + self.SkillName = OwnerSkill.SkillName + self.SkillLevel = OwnerSkill.SkillLevel +end + +function SimpleSkillTask:UpdateSkillLevel(NewSkillLevel) + self.SkillLevel = NewSkillLevel +end + +function SimpleSkillTask:InitTaskFromData(TaskData, CasterPawn) + self.CasterPawn = CasterPawn + self.DurationPolicy = TaskData.DurationPolicy + self.Duration = TaskData.Duration + self.Period = TaskData.Period + self.ExecuteOnApply = TaskData.ExecuteOnApply + self.EffectId = TaskData.EffectId + + self.IsActivated = false +end + +--子类实现 +function SimpleSkillTask:ActivateTask() + if self.IsActivated then + return + end + + UE.Log("[SimpleSkillTask] [%s][%s] Task Activated", KismetSystemLibrary.GetObjectName(self.CasterPawn), self.TaskName) + + if self.DurationPolicy == ETaskDurationPolicy.HasDuration and self.Duration > 0 then + self.IsActivated = true + + if self.Period > 0 then + if self.ExecuteOnApply then + self:ActivateTaskInTimer() + self:PlaySkillSound(self.CasterPawn) + end + + self.TaskTimer = EventSystem.SetTimerLoop(self.CasterPawn, function() + self:ActivateTaskInTimer() + self:PlaySkillSound(self.CasterPawn) + self.DurationTimer = self.DurationTimer + self.Period + UE.Log("[SimpleSkillTask] [%s][%s] DurationTimer = %.2f", KismetSystemLibrary.GetObjectName(self.CasterPawn), self.TaskName, self.DurationTimer) + if self.DurationTimer >= self.Duration then + self:EndTask() + end + end, self.Period) + else + --- 如果Period小于等于0,则直接执行一次任务,在Duration后进行移除 + self:ActivateTaskInTimer() + self:PlaySkillSound(self.CasterPawn) + self.TaskTimer = EventSystem.SetTimer(self.CasterPawn, function() + self:EndTask() + end, self.Duration) + end + else + self:PlaySkillSound(self.CasterPawn) + end +end + +function SimpleSkillTask:EndTask() + UE.Log("[SimpleSkillTask] [%s][%s] Task End", KismetSystemLibrary.GetObjectName(self.CasterPawn), self.TaskName) + if self.TaskTimer ~= nil then + EventSystem.StopTimer(self.TaskTimer) + end + + self:DeactivateTask() + + self.IsActivated = false +end + +-- 子类实现,非瞬时的技能任务结束时执行 +function SimpleSkillTask:DeactivateTask() +end + +-- 如果Task需要周期性执行,则子类需将Task执行逻辑实现 +function SimpleSkillTask:ActivateTaskInTimer() +end + +---播放技能特效: 默认SpawnLocationType为Attach +---@param Pawn APawn 玩家 +---@param ActorList BP_MonsterBase_C[] 目标怪物 +---@param SpawnLocationType EEffectSpawnLocationType 位置类型 +---@param BoneName string 绑定骨骼名称 +function SimpleSkillTask:EnableSkillEffect(Pawn, ActorList, SpawnLocationType, BoneName) + UE.Log("[SimpleSkillTask:EnableSkillEffect] SkillName: %d", self.SkillName) + if SpawnLocationType == nil then + SpawnLocationType = EEffectSpawnLocationType.Attach + end + local Duration = 0 + if self.DurationPolicy == ETaskDurationPolicy.HasDuration and self.Duration > 0 then + Duration = self.Duration + end + local InstanceId = GameDataManager.GetEffectInstanceId() + local EffectId = self.EffectId + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "Client_MulticastRPC_PlayEffect", InstanceId, EffectId, Pawn, ActorList, Duration, SpawnLocationType, BoneName) +end + +---@param EffectId number 特效实例ID +---@param Pawn APawn 特效起始 +---@param ActorList APawn[] 特效终点(若为空,则需填入指定旋转) +---@param Duration number 持续时间(默认0,自动销毁) +---@param SpawnLocationType EEffectSpawnLocationType 位置类型(默认为Bottom) +---@param BoneName string 绑定骨骼名称 +function SimpleSkillTask:EnableEffectWithId(EffectId, Pawn, ActorList, Duration, SpawnLocationType, BoneName) + UE.Log("[SimpleSkillTask:EnableEffectWithId] SkillName: %d", self.SkillName) + if SpawnLocationType == nil then + SpawnLocationType = EEffectSpawnLocationType.Bottom + end + if Duration == nil then + Duration = 0 + end + local InstanceId = GameDataManager.GetEffectInstanceId() + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "Client_MulticastRPC_PlayEffect", InstanceId, EffectId, Pawn, ActorList, Duration, SpawnLocationType, BoneName) +end + +---播放指向型特效(InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation) +---@param EffectId number 特效实例ID +---@param CasterActor APawn 特效起始 +---@param DestActor APawn 特效终点(若为空,则需填入指定旋转) +---@param Duration number 持续时间(默认0,自动销毁) +---@param Rotation FRotator 指定旋转(DestActor为空时才生效) +function SimpleSkillTask:EnableDirectionalEffect(EffectId, CasterActor, DestActor, Duration, Rotation) + UE.Log("[SimpleSkillTask:EnableDirectionalEffect] SkillName: %d", self.SkillName) + local InstanceId = GameDataManager.GetEffectInstanceId() + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "Client_MulticastRPC_PlayDirectionalEffect", InstanceId, EffectId, CasterActor, DestActor, Duration, Rotation) +end + +---生成技能Actor +function SimpleSkillTask:SpawnSkillActor(BPClassPath, CasterActor, Location, Rotation) + local Class = UE.LoadClass(BPClassPath) + local SkillActor = UGCGameSystem.SpawnActor(CasterActor, Class, Location, Rotation, VectorHelper.ScaleOne(), nil) + if not SkillActor then + return nil + end + SkillActor:SetOwner(CasterActor) + SkillActor:SetCasterPawn(CasterActor) + SkillActor:SetLevel(self.SkillLevel) + + return SkillActor +end + +---播放技能音效 +function SimpleSkillTask:PlaySkillSound(CasterActor) + SoundManager.MulticastPlaySoundAtLocation(100 + self.SkillName, CasterActor:K2_GetActorLocation(), CasterActor:K2_GetActorRotation()) +end + +---获取目标Pawn +---@return TargetPawns[] +function SimpleSkillTask:GetTargetPawns() + self.OwnerSkill.TargetPawns = self.OwnerSkill:GetTargetPawns() + + return self.OwnerSkill.TargetPawns +end + +return SimpleSkillTask; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_AbsorbSoul.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_AbsorbSoul.lua new file mode 100644 index 00000000..33158016 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_AbsorbSoul.lua @@ -0,0 +1,35 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_AbsorbSoul = LuaClass("SimpleSkillTask_AbsorbSoul", SimpleSkillTask) + +SimpleSkillTask_AbsorbSoul.AdditionDamageRateTable = {1.5, 2.5, 3.5, 4.5} --伤害加成百分比 +SimpleSkillTask_AbsorbSoul.CurDamageRate = 0.0 + +function SimpleSkillTask_AbsorbSoul:ctor(OwnerSkill) + SimpleSkillTask_AbsorbSoul.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_AbsorbSoul:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) +end + +function SimpleSkillTask_AbsorbSoul:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] +end + +function SimpleSkillTask_AbsorbSoul:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 180 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + self:EnableEffectWithId(24, TargetPawn, nil, 0, EEffectSpawnLocationType.Attach, "spine_01") + end +end + +return SimpleSkillTask_AbsorbSoul; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Anger.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Anger.lua new file mode 100644 index 00000000..a67498de --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Anger.lua @@ -0,0 +1,72 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Anger = LuaClass("SimpleSkillTask_Anger", SimpleSkillTask) + +SimpleSkillTask_Anger.PawnAttackMultiplier = 2.0 +SimpleSkillTask_Anger.PawnReceiveDamageMultiplier = 1.2 + +SimpleSkillTask_Anger.CasterPlayerState = nil +SimpleSkillTask_Anger.CachedGetDamageFunction = nil +SimpleSkillTask_Anger.CachedMakeDamageFunction = nil + +function SimpleSkillTask_Anger:ctor(OwnerSkill) + SimpleSkillTask_Anger.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Anger:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Anger" +end + +function SimpleSkillTask_Anger:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +function SimpleSkillTask_Anger:ActivateTaskInTimer() + UE.Log("[SimpleSkillTask_Anger] Activated PlayerKey = %s", tostring(self.CasterPawn.PlayerKey)) + + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey) + if not UE.IsValid(PlayerState) then + UE.Log("[SimpleSkillTask_Anger] Invalid PlayerState, PlayerKey = %s", tostring(self.CasterPawn.PlayerKey)) + return + end + self.CasterPlayerState = PlayerState + if self.CasterPlayerState["GetDamage"] ~= nil then + self.CachedGetDamageFunction = self.CasterPlayerState["GetDamage"] + local NewGetDamageFunction = function(PlayerState, InEnemy, InNum) + local DamageAmount = self.CachedGetDamageFunction(PlayerState, InEnemy, InNum) + local New = DamageAmount * self.PawnReceiveDamageMultiplier + UE.Log("[SimpleSkillTask_Anger] GetDamage In=%.2f, Out=%.2f", DamageAmount, New) + return New + end + self.CasterPlayerState["GetDamage"] = NewGetDamageFunction + else + UE.Log("[SimpleSkillTask_Anger] PlayerKey = %s has no func GetDamage", tostring(self.CasterPawn.PlayerKey)) + end + + if self.CasterPlayerState["MakeDamage"] ~= nil then + self.CachedMakeDamageFunction = self.CasterPlayerState["MakeDamage"] + local NewMakeDamageFunction = function(PlayerState, InEnemy) + local Damage = self.CachedMakeDamageFunction(PlayerState, InEnemy) + local New = Damage * self.PawnAttackMultiplier + UE.Log("[SimpleSkillTask_Anger] MakeDamage In=%.2f, Out=%.2f", Damage, New) + return New + end + self.CasterPlayerState["MakeDamage"] = NewMakeDamageFunction + else + UE.Log("[SimpleSkillTask_Anger] PlayerKey = %s has no func MakeDamage", tostring(self.CasterPawn.PlayerKey)) + end +end + +function SimpleSkillTask_Anger:DeactivateTask() + if self.CachedGetDamageFunction ~= nil then + self.CasterPlayerState["GetDamage"] = self.CachedGetDamageFunction + end + if self.CachedMakeDamageFunction ~= nil then + self.CasterPlayerState["MakeDamage"] = self.CachedMakeDamageFunction + end +end + +return SimpleSkillTask_Anger; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Bombing.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Bombing.lua new file mode 100644 index 00000000..2aa6c454 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Bombing.lua @@ -0,0 +1,44 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Bombing = LuaClass("SimpleSkillTask_Bombing", SimpleSkillTask) + +SimpleSkillTask_Bombing.AdditionDamageRateTable = {0.8, 1.1, 1.5, 2.0} +SimpleSkillTask_Bombing.CurDamageRate = 0.0 + +function SimpleSkillTask_Bombing:ctor(OwnerSkill) + SimpleSkillTask_Bombing.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Bombing:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Bombing" +end + +function SimpleSkillTask_Bombing:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[NewSkillLevel] +end + +function SimpleSkillTask_Bombing:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +function SimpleSkillTask_Bombing:ActivateTaskInTimer() + local DamageAmount = 120 + self.CurDamageRate * UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + for _, Monster in pairs(self:GetTargetPawns()) do + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end +end + +function SimpleSkillTask_Bombing:DeactivateTask() + +end + +return SimpleSkillTask_Bombing; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Counter.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Counter.lua new file mode 100644 index 00000000..05925cfc --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Counter.lua @@ -0,0 +1,59 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Counter = LuaClass("SimpleSkillTask_Counter", SimpleSkillTask) + +SimpleSkillTask_Counter.TriggerRateTable = {10, 12, 15, 20} --触发几率 +SimpleSkillTask_Counter.AdditionDamageRateTable = {0.05, 0.08, 0.12, 0.18} --伤害加成百分比 + +SimpleSkillTask_Counter.CurTriggerRate = 0 +SimpleSkillTask_Counter.CurDamageRate = 0.0 + +function SimpleSkillTask_Counter:ctor(OwnerSkill) + SimpleSkillTask_Counter.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Counter:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Counter" +end + +function SimpleSkillTask_Counter:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurTriggerRate = self.TriggerRateTable[self.SkillLevel] + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] +end + +function SimpleSkillTask_Counter:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self.CasterPawn.OnReceiveDamageDelegate:Add(self.OnCasterPawnReceiveDamage, self) +end + +function SimpleSkillTask_Counter:DeactivateTask() + self.CasterPawn.OnReceiveDamageDelegate:Remove(self.OnCasterPawnReceiveDamage, self) +end + +function SimpleSkillTask_Counter:OnCasterPawnReceiveDamage(Pawn, DamageAmount, EventInstigator, DamageCauser) + if Pawn ~= self.CasterPawn then + UE.Log("[SimpleSkillTask_Counter] invalid Pawn. Pawn.PlayerKey=%d, CasterPawn.PlayerKey=%d", Pawn.PlayerKey, self.CasterPawn.PlayerKey) + return + end + + local Rand = math.random(1, 100) + if Rand > self.CurTriggerRate then + return + end + + local DamageAmount = 200 + UGCPawnAttrSystem.GetHealthMax(self.CasterPawn) * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, MonsterPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(MonsterPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +return SimpleSkillTask_Counter; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Crack.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Crack.lua new file mode 100644 index 00000000..dd8c85b6 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Crack.lua @@ -0,0 +1,100 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Crack = LuaClass("SimpleSkillTask_Crack", SimpleSkillTask) + +SimpleSkillTask_Crack.CrackTargetLimitNumTable = {1, 2, 3, 4} +SimpleSkillTask_Crack.CurCrackTargetLimitNum = 0 + +SimpleSkillTask_Crack.BindWeapon = nil + +function SimpleSkillTask_Crack:ctor(OwnerSkill) + SimpleSkillTask_Crack.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Crack:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + self.TaskName = "Crack" +end + +function SimpleSkillTask_Crack:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurCrackTargetLimitNum = self.CrackTargetLimitNumTable[NewSkillLevel] +end + +function SimpleSkillTask_Crack:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + else + self.CasterPawn.OnWeaponSpawnedDelegate:Add(self.OnWeaponSpawned, self) + end +end + +function SimpleSkillTask_Crack:DeactivateTask() + self.CasterPawn.OnWeaponSpawnedDelegate:Remove(self.OnWeaponSpawned, self) + + if self.BindWeapon ~= nil and UE.IsValid(self.BindWeapon) then + self.BindWeapon.OnFireDelegate:Remove(self.OnCasterPawnFire, self) + self.BindWeapon = nil + end +end + +function SimpleSkillTask_Crack:OnWeaponSpawned(Pawn) + if Pawn ~= self.CasterPawn then + return + end + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + end +end + +function SimpleSkillTask_Crack:OnCasterPawnFire(Weapon, BaseDamage) + if self.BindWeapon ~= Weapon then + return + end + + local ShootTarget = Weapon.TargetMonster + local SphereLoc = ShootTarget:K2_GetActorLocation() + SphereLoc.Z = SphereLoc.Z - ShootTarget.CapsuleComponent.CapsuleHalfHeight + + local ObjectTypes = {} + local ActorClassFilter = UE.LoadClass(BPClassPath.MonsterBase) + local ActorsToIgnore = {self.CasterPawn, ShootTarget} + local Radius = 200 + local RetVal, OutActors = KismetSystemLibrary.SphereOverlapActors(self.CasterPawn, SphereLoc, Radius, ObjectTypes, ActorClassFilter, ActorsToIgnore) + + if GlobalConfigs.OpenDebug then + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "DrawDebugSphere", VectorHelper.ToLuaTable(SphereLoc), {1,0,0,1}, Radius) + end + + local NearbyPawns = {} + if RetVal then + local PickedMonsterNum = 0 + for _, Monster in pairs(OutActors) do + if PickedMonsterNum >= self.CurCrackTargetLimitNum then + break + end + + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + table.insert(NearbyPawns, Monster) + PickedMonsterNum = PickedMonsterNum + 1 + end + end + end + if not table.isEmpty(NearbyPawns) then + local DamageAmount = BaseDamage * 0.25 + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + for _, Monster in pairs(NearbyPawns) do + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + self:EnableSkillEffect(self.CasterPawn, NearbyPawns, EEffectSpawnLocationType.Middle) + end +end + +return SimpleSkillTask_Crack; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Dash.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Dash.lua new file mode 100644 index 00000000..cb3c3c8d --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Dash.lua @@ -0,0 +1,25 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Dash = LuaClass("SimpleSkillTask_Dash", SimpleSkillTask) + +function SimpleSkillTask_Dash:ctor(OwnerSkill) + SimpleSkillTask_Dash.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Dash:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Dash" +end + +function SimpleSkillTask_Dash:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local DashDir = self.CasterPawn:GetActorForwardVector() + local DashDuration = 1 + local DashForce = 30000 + self.CasterPawn:DashTo(DashDir, DashDuration, DashForce) + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +return SimpleSkillTask_Dash; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_DeathStrike.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_DeathStrike.lua new file mode 100644 index 00000000..94297f3a --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_DeathStrike.lua @@ -0,0 +1,38 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_DeathStrike = LuaClass("SimpleSkillTask_DeathStrike", SimpleSkillTask) + +SimpleSkillTask_DeathStrike.AdditionDamageRateTable = {6.0, 8.0, 10.0, 15.0} --伤害加成百分比 +SimpleSkillTask_DeathStrike.CurDamageRate = 0.0 + +function SimpleSkillTask_DeathStrike:ctor(OwnerSkill) + SimpleSkillTask_DeathStrike.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_DeathStrike:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "DeathStrike" +end + +function SimpleSkillTask_DeathStrike:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] +end + +function SimpleSkillTask_DeathStrike:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 200 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + + self:EnableSkillEffect(self.CasterPawn, TargetPawns, EEffectSpawnLocationType.Middle) +end + +return SimpleSkillTask_DeathStrike; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ElectricShock.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ElectricShock.lua new file mode 100644 index 00000000..1ee3d5a4 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ElectricShock.lua @@ -0,0 +1,87 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_ElectricShock = LuaClass("SimpleSkillTask_ElectricShock", SimpleSkillTask) + +SimpleSkillTask_ElectricShock.TriggerRateTable = {10, 12, 15, 20} --触发几率 +SimpleSkillTask_ElectricShock.AdditionDamageRateTable = {2.0, 3.2, 4.8, 7.2} --伤害加成百分比 + +SimpleSkillTask_ElectricShock.CurTriggerRate = 0 +SimpleSkillTask_ElectricShock.CurDamageRate = 0.0 +SimpleSkillTask_ElectricShock.BindWeapon = nil + +function SimpleSkillTask_ElectricShock:ctor(OwnerSkill) + SimpleSkillTask_ElectricShock.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_ElectricShock:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + self.TaskName = "ElectricShock" +end + +function SimpleSkillTask_ElectricShock:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurTriggerRate = self.TriggerRateTable[self.SkillLevel] + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] +end + +function SimpleSkillTask_ElectricShock:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + else + self.CasterPawn.OnWeaponSpawnedDelegate:Add(self.OnWeaponSpawned, self) + end +end + +function SimpleSkillTask_ElectricShock:DeactivateTask() + self.CasterPawn.OnWeaponSpawnedDelegate:Remove(self.OnWeaponSpawned, self) + + if self.BindWeapon ~= nil and UE.IsValid(self.BindWeapon) then + self.BindWeapon.OnFireDelegate:Remove(self.OnCasterPawnFire, self) + self.BindWeapon = nil + end +end + +function SimpleSkillTask_ElectricShock:OnWeaponSpawned(Pawn) + if Pawn ~= self.CasterPawn then + UE.Log("[SimpleSkillTask_ElectricShock] invalid Pawn. Pawn.PlayerKey=%d, CasterPawn.PlayerKey=%d", Pawn.PlayerKey, self.CasterPawn.PlayerKey) + return + end + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + else + UE.Log("[SimpleSkillTask_ElectricShock] BindWeaponFaied") + end +end + +function SimpleSkillTask_ElectricShock:OnCasterPawnFire(Weapon) + if self.BindWeapon ~= Weapon then + UE.Log("[SimpleSkillTask_ElectricShock] invalid Weapon.") + return + end + + local Rand = math.random(1, 100) + if Rand > self.CurTriggerRate then + return + end + + UE.Log("[SimpleSkillTask_ElectricShock] triggered") + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 200 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, MonsterPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(MonsterPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + + self:EnableSkillEffect(self.CasterPawn, TargetPawns, EEffectSpawnLocationType.Middle) +end + +return SimpleSkillTask_ElectricShock; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Exhaust.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Exhaust.lua new file mode 100644 index 00000000..49012e91 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Exhaust.lua @@ -0,0 +1,83 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Exhaust = LuaClass("SimpleSkillTask_Exhaust", SimpleSkillTask) +local SimpleSkillSelectorFactory = require("Script.SimpleSkill.Factory.SimpleSkillSelectorFactory") + + +function SimpleSkillTask_Exhaust:ctor(OwnerSkill) + SimpleSkillTask_Exhaust.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Exhaust:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Exhaust" + + local SelectorData = { + LimitNum = 0, + ForwardOffset = 0, + Param_Float = 0, + Param_Vector = VectorHelper.VectorZero(), + } + local SelectorClass = SimpleSkillSelectorFactory.GetSelectorByType(ESkillSelectorType.SelfPawn) + self.MonsterSelector = SelectorClass.New() + self.MonsterSelector:InitSelectorFromData(SelectorData, self.CasterPawn) + + self.MonsterClass = UE.LoadClass(BPClassPath.MonsterBase) + self.AffectedMonsters = {} +end + +function SimpleSkillTask_Exhaust:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +function SimpleSkillTask_Exhaust:ActivateTaskInTimer() + self.LoopTimerHandle = EventSystem.SetTimerLoop(self.CasterPawn, function() + if self.MonsterSelector == nil then + return + end + + local AttackMonsters = UGCGameSystem.GameState:GetAttackWaveSpawner().SpawnedMonsters + local HangUpRoomMonsters = UGCGameSystem.GameState:GetSpawnerByPlayerKey(self.CasterPawn.PlayerKey).SpawnedMonsters + + for _, Monster in pairs(HangUpRoomMonsters) do + table.insert(AttackMonsters, Monster) + end + + for _, Monster in pairs(AttackMonsters) do + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + local MonsterLoc = Monster:K2_GetActorLocation() + local PlayerLoc = self.CasterPawn:K2_GetActorLocation() + if VectorHelper.GetDistance2D(MonsterLoc, PlayerLoc) <= 300.0 then + Monster:AddModifyDamageDelegationFun( + "ActivateExhaust"..KismetSystemLibrary.GetObjectName(self.CasterPawn), + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + return DamageAmount * 1.3 + end + ) + table.insert(self.AffectedMonsters, Monster) + else + Monster:RemoveModifyDamageDelegation("ActivateExhaust"..KismetSystemLibrary.GetObjectName(self.CasterPawn)) + table.removeValue(self.AffectedMonsters, Monster) + end + end + end + end, 0.2) +end + +function SimpleSkillTask_Exhaust:DeactivateTask() + if self.LoopTimerHandle ~= nil then + EventSystem.StopTimer(self.LoopTimerHandle) + + for _, Monster in pairs(self.AffectedMonsters) do + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + Monster:RemoveModifyDamageDelegation("ActivateExhaust"..KismetSystemLibrary.GetObjectName(self.CasterPawn)) + end + end + + self.AffectedMonsters = {} + end +end + +return SimpleSkillTask_Exhaust; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_FireDomain.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_FireDomain.lua new file mode 100644 index 00000000..1808ee72 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_FireDomain.lua @@ -0,0 +1,57 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_FireDomain = LuaClass("SimpleSkillTask_FireDomain", SimpleSkillTask) + +SimpleSkillTask_FireDomain.AdditionDamageRateTable = {1.5, 2.2, 3.2, 4.5} +SimpleSkillTask_FireDomain.CurDamageRate = 0.0 + +function SimpleSkillTask_FireDomain:ctor(OwnerSkill) + SimpleSkillTask_FireDomain.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_FireDomain:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "FireDomain" +end + +function SimpleSkillTask_FireDomain:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + if self.SpawnedActor ~= nil and UE.IsValid(self.SpawnedActor) then + self.SpawnedActor:SetLevel(NewSkillLevel) + end + + self.CurDamageRate = self.AdditionDamageRateTable[NewSkillLevel] +end + +function SimpleSkillTask_FireDomain:ActivateTask() + SimpleSkillTask.ActivateTask(self) +end + +function SimpleSkillTask_FireDomain:ActivateTaskInTimer() + local DamageAmount = 140 + self.CurDamageRate * UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + for _, Monster in pairs(self:GetTargetPawns()) do + if Monster ~= nil and UE.IsValid(Monster) and Monster.bIsDead == false then + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end + + local Rotation = self.CasterPawn:K2_GetActorRotation() + local Forward = KismetMathLibrary.Conv_RotatorToVector(Rotation) + local Location = VectorHelper.Add(self.CasterPawn:K2_GetActorLocation(), VectorHelper.MulNumber(KismetMathLibrary.Normal(Forward), 400)) + + Location.Z = Location.Z - self.CasterPawn.CapsuleComponent.CapsuleHalfHeight + + self.SpawnedActor = self:SpawnSkillActor(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/SceneObject/SkillActor/BP_Skill_FireDomain.BP_Skill_FireDomain_C'), self.CasterPawn, Location, Rotation) +end + +function SimpleSkillTask_FireDomain:DeactivateTask() + if self.SpawnedActor ~= nil and UE.IsValid(self.SpawnedActor) then + self.SpawnedActor:K2_DestroyActor() + self.SpawnedActor = nil + end +end + +return SimpleSkillTask_FireDomain; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Flowing.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Flowing.lua new file mode 100644 index 00000000..799d8a79 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Flowing.lua @@ -0,0 +1,113 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Flowing = LuaClass("SimpleSkillTask_Flowing", SimpleSkillTask) + +SimpleSkillTask_Flowing.AdditionDamageRateTable = {1.0, 1.2, 1.5, 2.0} +SimpleSkillTask_Flowing.CurDamageRate = 0.0 +SimpleSkillTask_Flowing.DefenceReductionRateTable = {0.9, 0.85, 0.8, 0.7} +SimpleSkillTask_Flowing.CurDefenceReductionRate = 0.0 + +function SimpleSkillTask_Flowing:ctor(OwnerSkill) + SimpleSkillTask_Flowing.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Flowing:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Flowing" +end + +function SimpleSkillTask_Flowing:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[NewSkillLevel] + self.CurDefenceReductionRate = self.DefenceReductionRateTable[NewSkillLevel] +end + +function SimpleSkillTask_Flowing:ActivateTask() + SimpleSkillTask.ActivateTask(self) +end + +function SimpleSkillTask_Flowing:ActivateTaskInTimer() + local TargetMonsters = self:GetRandBoxOverlapActors() + if TargetMonsters == nil then + return + end + + local CachedMonsterDefence = {} + + local DamageAmount = self.CurDamageRate * UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + for _, Monster in pairs(TargetMonsters) do + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + CachedMonsterDefence[Monster] = Monster.PhysicalDefense + Monster.PhysicalDefense = Monster.PhysicalDefense * self.CurDefenceReductionRate + end + end + + EventSystem.SetTimer(UGCGameSystem.GameState, function() + for Monster, Defence in pairs(CachedMonsterDefence) do + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + Monster.PhysicalDefense = Defence + end + end + end, 3.0) +end + +function SimpleSkillTask_Flowing:DeactivateTask() + +end + +function SimpleSkillTask_Flowing:GetRandBoxOverlapActors() + local BoxRotation = VectorHelper.RandomRotatorYaw(self.CasterPawn:K2_GetActorRotation()) + local TraceForward = KismetMathLibrary.Conv_RotatorToVector(BoxRotation) + local BoxLoc = VectorHelper.Add(self.CasterPawn:K2_GetActorLocation(), VectorHelper.MulNumber(KismetMathLibrary.Normal(TraceForward), 400)) + local BoxExtent = {X = 400, Y = 100, Z = 100} + + local ObjectTypes = {} + local ActorClassFilter = UE.LoadClass(BPClassPath.MonsterBase) + local ActorsToIgnore = self:GetIgnoredActors() + local RetVal, OutActors = KismetSystemLibrary.BoxOverlapActors(self.CasterPawn, BoxLoc, BoxRotation, BoxExtent, ObjectTypes, ActorClassFilter, ActorsToIgnore) + + self:EnableDirectionalEffect(29, self.CasterPawn, nil, 0, BoxRotation) + + if GlobalConfigs.OpenDebug then + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn , "DrawDebugBox" , VectorHelper.ToLuaTable(BoxLoc), BoxExtent, {1,0,0,1}, BoxRotation) + end + + if RetVal then + return OutActors + else + return nil + end +end + +function SimpleSkillTask_Flowing:GetIgnoredActors() + local ActorsToIgnore = {} + table.insert(ActorsToIgnore, self.CasterPawn) + + if self.CasterPawn.IsInArena then + local AllHangUpRoomSpawners = UGCGameSystem.GameState:GetAllHangUpRoomSpawners() + for _, HangUpRoomSpawner in pairs(AllHangUpRoomSpawners) do + for _, SpawnedMonster in pairs(HangUpRoomSpawner.SpawnedMonsters) do + if SpawnedMonster ~= nil and UE.IsValid(SpawnedMonster) and UGCSimpleCharacterSystem.GetHealth(SpawnedMonster) > 0 then + table.insert(ActorsToIgnore, SpawnedMonster) + end + end + end + else + local AttackWaveSpawner = UGCGameSystem.GameState:GetAttackWaveSpawner() + if AttackWaveSpawner then + for _, SpawnedMonster in pairs(AttackWaveSpawner.SpawnedMonsters) do + if SpawnedMonster ~= nil and UE.IsValid(SpawnedMonster) and UGCSimpleCharacterSystem.GetHealth(SpawnedMonster) > 0 then + table.insert(ActorsToIgnore, SpawnedMonster) + end + end + end + end + + return ActorsToIgnore +end + +return SimpleSkillTask_Flowing; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Heal.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Heal.lua new file mode 100644 index 00000000..0cf4e7aa --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Heal.lua @@ -0,0 +1,42 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Heal = LuaClass("SimpleSkillTask_Heal", SimpleSkillTask) + +function SimpleSkillTask_Heal:ctor(OwnerSkill) + SimpleSkillTask_Heal.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Heal:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Heal" +end + +function SimpleSkillTask_Heal:ActivateTask() + SimpleSkillTask.ActivateTask(self) + local Pawns = self:GetTargetPawns() + for k, Pawn in pairs(Pawns) do + local MaxHP = UGCPawnAttrSystem.GetHealthMax(Pawn) + if Pawn:IsFullHealth() == false and MaxHP > 0 then + local CurHP = UGCPawnAttrSystem.GetHealth(Pawn) + local LosedHP = MaxHP - CurHP + local HealHPDelta = LosedHP * 0.4 + local ResultCurHP = CurHP + HealHPDelta + MaxHP * 0.2 + UGCPawnAttrSystem.SetHealth(Pawn, ResultCurHP) + UE.Log("[SimpleSkillTask_Heal] Player:%s, Healed HP = %.2f", KismetSystemLibrary.GetObjectName(Pawn), ResultCurHP) + end + + local MaxEnergy = Pawn.EnergyData.Max + if Pawn:IsFullEnergy() == false and MaxEnergy > 0 then + local CurEnergy = Pawn.EnergyData.Cur + local LosedEnergy = MaxEnergy - CurEnergy + local HealEnergyDelta = LosedEnergy * 0.4 + local ResultCurEnergy = CurEnergy + HealEnergyDelta + Pawn.EnergyData.Cur = math.clamp(ResultCurEnergy, CurEnergy, MaxEnergy) + UE.Log("[SimpleSkillTask_Heal] Player:%s, Healed Energy = %.2f", KismetSystemLibrary.GetObjectName(Pawn), ResultCurEnergy) + end + + self:EnableSkillEffect(Pawn, nil) + end +end + +return SimpleSkillTask_Heal; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_IceFrost.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_IceFrost.lua new file mode 100644 index 00000000..22a83197 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_IceFrost.lua @@ -0,0 +1,63 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_IceFrost = LuaClass("SimpleSkillTask_IceFrost", SimpleSkillTask) + +function SimpleSkillTask_IceFrost:ctor(OwnerSkill) + SimpleSkillTask_IceFrost.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_IceFrost:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) +end + +function SimpleSkillTask_IceFrost:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + if self.SpawnedActor ~= nil and UE.IsValid(self.SpawnedActor) then + self.SpawnedActor:SetLevel(NewSkillLevel) + end +end + +function SimpleSkillTask_IceFrost:ActivateTask() + SimpleSkillTask.ActivateTask(self) +end + +function SimpleSkillTask_IceFrost:ActivateTaskInTimer() + local TargetPawn = nil + local TargetPawns = self:GetTargetPawns() + + local MinDist = 999999 + for _, Monster in pairs(TargetPawns) do + if Monster ~= nil and UE.IsValid(Monster) then + if UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + local MonsterLoc = Monster:K2_GetActorLocation() + local Dist = VectorHelper.GetDistance(PawnLoc, MonsterLoc) + if Dist <= MinDist then + MinDist = Dist + TargetPawn = Monster + end + end + end + end + + local Location = nil + local Rotation = nil + if TargetPawn ~= nil then + Location = TargetPawn:K2_GetActorLocation() + Rotation = TargetPawn:K2_GetActorRotation() + Location.Z = Location.Z - TargetPawn.CapsuleComponent.CapsuleHalfHeight + else + local SpawnPos = VectorHelper.Add(self.CasterPawn:K2_GetActorLocation(), VectorHelper.MulNumber(KismetMathLibrary.Normal(self.CasterPawn:GetActorForwardVector()), 500)) + Location = UGCGameSystem.GameState:GetDropLocation(SpawnPos) + Rotation = self.CasterPawn:K2_GetActorRotation() + end + + self.SpawnedActor = self:SpawnSkillActor(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/SceneObject/SkillActor/BP_Skill_IceFrost.BP_Skill_IceFrost_C'), self.CasterPawn, Location, Rotation) +end + +function SimpleSkillTask_IceFrost:DeactivateTask() + if self.SpawnedActor ~= nil and UE.IsValid(self.SpawnedActor) then + self.SpawnedActor:K2_DestroyActor() + end +end + +return SimpleSkillTask_IceFrost; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_LightWave.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_LightWave.lua new file mode 100644 index 00000000..ff90dc28 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_LightWave.lua @@ -0,0 +1,38 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_LightWave = LuaClass("SimpleSkillTask_LightWave", SimpleSkillTask) + +SimpleSkillTask_LightWave.AdditionDamageRateTable = {3.0, 4.2, 5.6, 7.6} --伤害加成百分比 +SimpleSkillTask_LightWave.CurDamageRate = 0.0 + +function SimpleSkillTask_LightWave:ctor(OwnerSkill) + SimpleSkillTask_LightWave.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_LightWave:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "LightWave" +end + +function SimpleSkillTask_LightWave:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] +end + +function SimpleSkillTask_LightWave:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 250 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + + self:EnableSkillEffect(self.CasterPawn, nil, EEffectSpawnLocationType.Middle) +end + +return SimpleSkillTask_LightWave; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Penetration.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Penetration.lua new file mode 100644 index 00000000..55e964f5 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Penetration.lua @@ -0,0 +1,30 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Penetration = LuaClass("SimpleSkillTask_Penetration", SimpleSkillTask) + +function SimpleSkillTask_Penetration:ctor(OwnerSkill) + SimpleSkillTask_Penetration.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Penetration:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Penetration" +end + +function SimpleSkillTask_Penetration:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +function SimpleSkillTask_Penetration:ActivateTaskInTimer() + self.CasterPawn.IsInTrueDamage = true +end + +function SimpleSkillTask_Penetration:DeactivateTask() + if UE.IsValid(self.CasterPawn) then + self.CasterPawn.IsInTrueDamage = false + end +end + +return SimpleSkillTask_Penetration; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Puncture.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Puncture.lua new file mode 100644 index 00000000..60986bd6 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Puncture.lua @@ -0,0 +1,41 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Puncture = LuaClass("SimpleSkillTask_Puncture", SimpleSkillTask) + +SimpleSkillTask_Puncture.AdditionDamageRateTable = {1.5, 2.5, 3.5, 5.0} +SimpleSkillTask_Puncture.StunDurationTable = {2, 2.2, 2.5, 3} +SimpleSkillTask_Puncture.CurDamageRate = 0.0 +SimpleSkillTask_Puncture.CurStunDuration = 0.0 + +function SimpleSkillTask_Puncture:ctor(OwnerSkill) + SimpleSkillTask_Puncture.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Puncture:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Puncture" +end + +function SimpleSkillTask_Puncture:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] + self.CurStunDuration = self.StunDurationTable[self.SkillLevel] +end + +function SimpleSkillTask_Puncture:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:EnableSkillEffect(self.CasterPawn, nil, EEffectSpawnLocationType.Bottom) + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 150 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + TargetPawn:SetIsStun(true, self.CurStunDuration) + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end +end + +return SimpleSkillTask_Puncture; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Ray.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Ray.lua new file mode 100644 index 00000000..1342b745 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Ray.lua @@ -0,0 +1,153 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Ray = LuaClass("SimpleSkillTask_Ray", SimpleSkillTask) + +SimpleSkillTask_Ray.AdditionDamageRateTable = {0.1, 0.2, 0.3, 0.4} --伤害加成百分比 + +SimpleSkillTask_Ray.CurDamageRate = 0.0 +SimpleSkillTask_Ray.BindWeapon = nil + +function SimpleSkillTask_Ray:ctor(OwnerSkill) + SimpleSkillTask_Ray.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Ray:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + self.TaskName = "Ray" +end + +function SimpleSkillTask_Ray:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] +end + +function SimpleSkillTask_Ray:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + else + self.CasterPawn.OnWeaponSpawnedDelegate:Add(self.OnWeaponSpawned, self) + end +end + +function SimpleSkillTask_Ray:DeactivateTask() + self.CasterPawn.OnWeaponSpawnedDelegate:Remove(self.OnWeaponSpawned, self) + + if self.BindWeapon ~= nil and UE.IsValid(self.BindWeapon) then + self.BindWeapon.OnFireDelegate:Remove(self.OnCasterPawnFire, self) + self.BindWeapon = nil + end +end + +function SimpleSkillTask_Ray:OnWeaponSpawned(Pawn) + if Pawn ~= self.CasterPawn then + return + end + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + end +end + +function SimpleSkillTask_Ray:OnCasterPawnFire(Weapon) + if self.BindWeapon ~= Weapon then + return + end + + local Length, Width, Height = 1000, 50, 200 + + local BoxExtent = {X = Length/2, Y = Width/2, Z = Height/2} + + local ObjectTypes = {} + local ActorClassFilter = UE.LoadClass(BPClassPath.MonsterBase) + local ActorsToIgnore = {} + + local RotList = self:GetTargetRotationList() + for _, Rotation in pairs(RotList) do + local Forward = KismetMathLibrary.Conv_RotatorToVector(Rotation) + local BoxLoc = VectorHelper.Add(self.CasterPawn:K2_GetActorLocation(), VectorHelper.MulNumber(KismetMathLibrary.Normal(Forward), Length / 2)) + local RetVal, OutMonsters = KismetSystemLibrary.BoxOverlapActors(self.CasterPawn, BoxLoc, Rotation, BoxExtent, ObjectTypes, ActorClassFilter, ActorsToIgnore) + if RetVal then + self:ApplyRayDamage(OutMonsters) + end + + if GlobalConfigs.OpenDebug then + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn , "DrawDebugBox" , VectorHelper.ToLuaTable(BoxLoc), BoxExtent, {1,0,0,1}, Rotation) + end + end + + self:EnableSkillEffect(self.CasterPawn, nil, EEffectSpawnLocationType.Middle) +end + +function SimpleSkillTask_Ray:EnableSkillEffect(Pawn, ActorList, SpawnLocationType, BoneName) + local Duration = 0 + local InstanceId = GameDataManager.GetEffectInstanceId() + local EffectId = 1000 + self.SkillLevel + + local OwnerSkillComp = self.CasterPawn.SkillSystemComponent + if OwnerSkillComp then + local AllRaySkillInst = {} + for Slot, SimpleSkill in pairs(OwnerSkillComp.SlotToSkillList) do + if SimpleSkill.SkillName == ESkillName.Ray then + table.insert(AllRaySkillInst, SimpleSkill) + end + end + local RaySkillInstNum = table.getCount(AllRaySkillInst) + if not table.isEmpty(AllRaySkillInst) and RaySkillInstNum > 1 then + local RaySkillIndex = 0 + table.sort(AllRaySkillInst, function(a, b) return a.SkillLevel > b.SkillLevel end) + for Index, RaySkillInst in pairs(AllRaySkillInst) do + if RaySkillInst.SkillLevel == self.SkillLevel then + RaySkillIndex = Index + break + end + end + if RaySkillIndex ~= 0 then + local OffsetMulti = RaySkillInstNum == 3 and 2 or 1.5 + local Offset = 35 + local OriginLocation = self.CasterPawn:K2_GetActorLocation() + local EffectRotation = VectorHelper.RotToLuaTable(self.CasterPawn:K2_GetActorRotation()) + local EffectLocation = {X = OriginLocation.X, Y = OriginLocation.Y, Z = OriginLocation.Z + Offset * (RaySkillIndex - OffsetMulti)} + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "Client_MulticastRPC_PlayEffectAtLocation", InstanceId, EffectId, self.CasterPawn, EffectLocation, EffectRotation, 0) + return + end + end + end + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "Client_MulticastRPC_PlayEffect", InstanceId, EffectId, Pawn, ActorList, Duration, SpawnLocationType, BoneName) +end + +function SimpleSkillTask_Ray:ApplyRayDamage(InMonsters) + local DamageAmount = 100 + self.CurDamageRate * UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + for _, Monster in pairs(InMonsters) do + if Monster ~= nil and UE.IsValid(Monster) and self:CheckValidMonsterType(Monster) then + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end +end + +function SimpleSkillTask_Ray:GetTargetRotationList() + local CasterRotation = self.CasterPawn:K2_GetActorRotation() + local BoxRotation1 = {Yaw = CasterRotation.Yaw, Pitch = CasterRotation.Pitch, Roll = CasterRotation.Roll} + local BoxRotation2 = {Yaw = CasterRotation.Yaw + 30, Pitch = CasterRotation.Pitch, Roll = CasterRotation.Roll} + local BoxRotation3 = {Yaw = CasterRotation.Yaw - 30, Pitch = CasterRotation.Pitch, Roll = CasterRotation.Roll} + return {BoxRotation1, BoxRotation2, BoxRotation3} +end + +function SimpleSkillTask_Ray:CheckValidMonsterType(Monster) + local MonsterType = Monster:GetMonsterType() + local IsAttackMonster = MonsterType == EMonsterType.Common or MonsterType == EMonsterType.Boss + if self.CasterPawn.IsInArena then + return IsAttackMonster + else + return not IsAttackMonster + end +end + +return SimpleSkillTask_Ray; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Roar.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Roar.lua new file mode 100644 index 00000000..cf6be509 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Roar.lua @@ -0,0 +1,37 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Roar = LuaClass("SimpleSkillTask_Roar", SimpleSkillTask) + +SimpleSkillTask_Roar.AdditionDamageRateTable = {2.5, 3.2, 4.2, 5.5} --伤害加成百分比 +SimpleSkillTask_Roar.CurDamageRate = 0.0 + +function SimpleSkillTask_Roar:ctor(OwnerSkill) + SimpleSkillTask_Roar.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Roar:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) +end + +function SimpleSkillTask_Roar:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] +end + +function SimpleSkillTask_Roar:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 200 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + + self:EnableSkillEffect(self.CasterPawn, nil) + +end + +return SimpleSkillTask_Roar; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Scabbing.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Scabbing.lua new file mode 100644 index 00000000..3d9150a9 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Scabbing.lua @@ -0,0 +1,118 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Scabbing = LuaClass("SimpleSkillTask_Scabbing", SimpleSkillTask) + +SimpleSkillTask_Scabbing.DefenceReductionTable = {5, 10, 15, 25} +SimpleSkillTask_Scabbing.CurDefenceReduction = 0 + +SimpleSkillTask_Scabbing.BindWeapon = nil + +function SimpleSkillTask_Scabbing:ctor(OwnerSkill) + SimpleSkillTask_Scabbing.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Scabbing:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + self.TaskName = "Scabbing" + + self.AffectedMonsterInfoList = {} --@type table +end + +function SimpleSkillTask_Scabbing:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDefenceReduction = self.DefenceReductionTable[NewSkillLevel] +end + +function SimpleSkillTask_Scabbing:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + else + self.CasterPawn.OnWeaponSpawnedDelegate:Add(self.OnWeaponSpawned, self) + end +end + +function SimpleSkillTask_Scabbing:DeactivateTask() + self.CasterPawn.OnWeaponSpawnedDelegate:Remove(self.OnWeaponSpawned, self) + + if self.BindWeapon ~= nil and UE.IsValid(self.BindWeapon) then + self.BindWeapon.OnFireDelegate:Remove(self.OnCasterPawnFire, self) + self.BindWeapon = nil + end + + for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do + EventSystem.StopTimer(MonsterInfo.TimerHandle) + self.AffectedMonsterInfoList[index] = nil + end + self.AffectedMonsterInfoList = {} +end + +function SimpleSkillTask_Scabbing:OnWeaponSpawned(Pawn) + if Pawn ~= self.CasterPawn then + return + end + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + end +end + +function SimpleSkillTask_Scabbing:OnCasterPawnFire(Weapon, BaseDamage) + if self.BindWeapon ~= Weapon then + return + end + local ShootTarget = Weapon.TargetMonster + + local MonsterInfo = self:GetAffectedMonsterInfo(ShootTarget) + if MonsterInfo == nil then + local TimerHandle = EventSystem.SetTimer(self.CasterPawn, function() + if ShootTarget ~= nil and UE.IsValid(ShootTarget) and UGCSimpleCharacterSystem.GetHealth(ShootTarget) > 0 then + local CachedMonsterInfo = self:GetAffectedMonsterInfo(ShootTarget) + if CachedMonsterInfo then + ShootTarget.PhysicalDefense = CachedMonsterInfo.CachedDefence + end + end + self:RemoveMonsterInfo(ShootTarget) + end, 5.0) + local MonsterInfo = { + Monster = ShootTarget, + CachedDefence = ShootTarget.PhysicalDefense, + TimerHandle = TimerHandle, + } + table.insert(self.AffectedMonsterInfoList, MonsterInfo) + + self:EnableEffectWithId(16, ShootTarget, nil, 5.0, EEffectSpawnLocationType.Attach, "spine_01") + end + + ShootTarget.PhysicalDefense = math.clamp(ShootTarget.PhysicalDefense - self.CurDefenceReduction, 0, ShootTarget.PhysicalDefense) +end + +function SimpleSkillTask_Scabbing:GetAffectedMonsterInfo(Monster) + for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do + if MonsterInfo.Monster == Monster then + return MonsterInfo + end + end + return nil +end + +function SimpleSkillTask_Scabbing:RemoveMonsterInfo(Monster) + for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do + if MonsterInfo.Monster == Monster then + EventSystem.StopTimer(MonsterInfo.TimerHandle) + self.AffectedMonsterInfoList[index] = nil + return + end + end +end + +function SimpleSkillTask_Scabbing:OnMonsterDeath(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + self:RemoveMonsterInfo(DeadMonster) +end + +return SimpleSkillTask_Scabbing; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Seal.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Seal.lua new file mode 100644 index 00000000..d3cdb9cb --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Seal.lua @@ -0,0 +1,67 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Seal = LuaClass("SimpleSkillTask_Seal", SimpleSkillTask) + +SimpleSkillTask_Seal.AdditionDamageRateTable = {2.0, 2.6, 3.2, 4.0} +SimpleSkillTask_Seal.StunDurationTable = {1.0, 1.2, 1.4, 2.0} +SimpleSkillTask_Seal.CurDamageRate = 0.0 +SimpleSkillTask_Seal.CurStunDuration = 0.0 + +function SimpleSkillTask_Seal:ctor(OwnerSkill) + SimpleSkillTask_Seal.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Seal:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) +end + +function SimpleSkillTask_Seal:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurStunDuration = self.StunDurationTable[NewSkillLevel] + self.CurDamageRate = self.AdditionDamageRateTable[NewSkillLevel] +end + +function SimpleSkillTask_Seal:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local TargetPawn = nil + local TargetPawns = self:GetTargetPawns() + if TargetPawns[1] ~= nil and UE.IsValid(TargetPawns[1]) then + TargetPawn = TargetPawns[1] + else + return + end + + self:EnableEffectWithId(23, self.CasterPawn, {TargetPawn}, self.CurStunDuration, EEffectSpawnLocationType.Bottom) + + local Radius = 150 + local SphereLoc = TargetPawn:K2_GetActorLocation() + SphereLoc.Z = SphereLoc.Z - 88.0 + + local ObjectTypes = {} + local ActorClassFilter = UE.LoadClass(BPClassPath.MonsterBase) + local ActorsToIgnore = {self.CasterPawn} + local RetVal, OutActors = KismetSystemLibrary.SphereOverlapActors(self.CasterPawn, SphereLoc, Radius, ObjectTypes, ActorClassFilter, ActorsToIgnore) + + if GlobalConfigs.OpenDebug then + UnrealNetwork.CallUnrealRPC_Multicast(self.CasterPawn, "DrawDebugSphere", VectorHelper.ToLuaTable(SphereLoc), {1,0,0,1}, Radius) + end + + if RetVal then + local DamageAmount = 120 + UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + for i, Monster in pairs(OutActors) do + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + Monster:SetIsStun(true, self.CurStunDuration) + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end + end +end + +function SimpleSkillTask_Seal:DeactivateTask() + +end + +return SimpleSkillTask_Seal; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ShadowKill.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ShadowKill.lua new file mode 100644 index 00000000..a33c7885 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ShadowKill.lua @@ -0,0 +1,62 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_ShadowKill = LuaClass("SimpleSkillTask_ShadowKill", SimpleSkillTask) + +SimpleSkillTask_ShadowKill.CachedSpeedScale = 0 +SimpleSkillTask_ShadowKill.CachedDodgeFunction = nil + +SimpleSkillTask_ShadowKill.SpeedScaleMultiplier = 1.5 +SimpleSkillTask_ShadowKill.EvadeRateMultiplier = 1.5 + +SimpleSkillTask_ShadowKill.CasterPlayerState = nil + +function SimpleSkillTask_ShadowKill:ctor(OwnerSkill) + SimpleSkillTask_ShadowKill.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_ShadowKill:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "ShadowKill" +end + +function SimpleSkillTask_ShadowKill:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +function SimpleSkillTask_ShadowKill:ActivateTaskInTimer() + UE.Log("[SimpleSkillTask_ShadowKill] Activated PlayerKey = %s", tostring(self.CasterPawn.PlayerKey)) + + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey) + if not UE.IsValid(PlayerState) then + UE.Log("[SimpleSkillTask_ShadowKill] Invalid PlayerState, PlayerKey = %s", tostring(self.CasterPawn.PlayerKey)) + return + end + + self.CasterPlayerState = PlayerState + + if self.CasterPlayerState["Dodge"] ~= nil then + self.CachedDodgeFunction = self.CasterPlayerState["Dodge"] + local NewDodgeFunction = function(PlayerState) + local Dodge = self.CachedDodgeFunction(PlayerState) + local New = Dodge * self.EvadeRateMultiplier + UE.Log("[SimpleSkillTask_ShadowKill] Dodge In=%.2f, Out=%.2f", Dodge, New) + return New + end + self.CasterPlayerState["Dodge"] = NewDodgeFunction + end + + self.CachedSpeedScale = UGCPawnAttrSystem.GetSpeedScale(self.CasterPawn) + UGCPawnAttrSystem.SetSpeedScale(self.CasterPawn, self.CachedSpeedScale * self.SpeedScaleMultiplier) +end + +function SimpleSkillTask_ShadowKill:DeactivateTask() + if self.CachedDodgeFunction ~= nil then + self.CasterPlayerState["Dodge"] = self.CachedDodgeFunction + end + + UGCPawnAttrSystem.SetSpeedScale(self.CasterPawn, self.CachedSpeedScale) +end + +return SimpleSkillTask_ShadowKill; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Shuttle.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Shuttle.lua new file mode 100644 index 00000000..a02f633f --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Shuttle.lua @@ -0,0 +1,64 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Shuttle = LuaClass("SimpleSkillTask_Shuttle", SimpleSkillTask) + +SimpleSkillTask_Shuttle.AdditionDamageRateTable = {0.6, 0.9, 1.2, 1.5} +SimpleSkillTask_Shuttle.CurDamageRate = 0.0 + +SimpleSkillTask_Shuttle.AttackTimesTable = {6, 7, 8, 9} +SimpleSkillTask_Shuttle.CurAttackTimes = 0.0 + +function SimpleSkillTask_Shuttle:ctor(OwnerSkill) + SimpleSkillTask_Shuttle.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Shuttle:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Shuttle" +end + +function SimpleSkillTask_Shuttle:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[NewSkillLevel] + self.CurAttackTimes = self.AttackTimesTable[NewSkillLevel] +end + +function SimpleSkillTask_Shuttle:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local AffectedMonsters = {} + local AllAttackTimerHandles = {} + local DamageAmount = 150 + self.CurDamageRate * UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + for _, Monster in pairs(self:GetTargetPawns()) do + if Monster ~= nil and UE.IsValid(Monster) and Monster.bIsDead == false then + local TimerHandle = EventSystem.SetTimerLoop(UGCGameSystem.GameState, function() + if self.CasterPawn ~= nil and UE.IsValid(self.CasterPawn) then + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end, 0.2) + table.insert(AllAttackTimerHandles, TimerHandle) + table.insert(AffectedMonsters, Monster) + self:EnableDirectionalEffect(32, self.CasterPawn, Monster) + end + end + + if table.isEmpty(AllAttackTimerHandles) then + return + end + + EventSystem.SetTimer(UGCGameSystem.GameState, function() + for _, TimerHandle in pairs(AllAttackTimerHandles) do + EventSystem.StopTimer(TimerHandle) + end + end, 0.2 * self.CurAttackTimes) + + self:EnableEffectWithId(33, self.CasterPawn, AffectedMonsters, 0, EEffectSpawnLocationType.Middle) +end + +function SimpleSkillTask_Shuttle:DeactivateTask() + +end + +return SimpleSkillTask_Shuttle; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Slash.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Slash.lua new file mode 100644 index 00000000..2ad926c7 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Slash.lua @@ -0,0 +1,32 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Slash = LuaClass("SimpleSkillTask_Slash", SimpleSkillTask) + +function SimpleSkillTask_Slash:ctor(OwnerSkill) + SimpleSkillTask_Slash.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Slash:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Slash" +end + +function SimpleSkillTask_Slash:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:ApplyRadialDamage() +end + +function SimpleSkillTask_Slash:ApplyRadialDamage() + local DamageAmount = UGCPawnAttrSystem.GetHealthMax(self.CasterPawn) * 0.1 + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, MonsterPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(MonsterPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +return SimpleSkillTask_Slash; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StarFall.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StarFall.lua new file mode 100644 index 00000000..0286d66e --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StarFall.lua @@ -0,0 +1,69 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_StarFall = LuaClass("SimpleSkillTask_StarFall", SimpleSkillTask) +local SimpleSkillSelectorFactory = require("Script.SimpleSkill.Factory.SimpleSkillSelectorFactory") + +SimpleSkillTask_StarFall.AdditionAttackRateTable = {0.36, 0.48, 0.63, 0.9} --威力值加成 +SimpleSkillTask_StarFall.TargetLimitNumTable = {2, 3, 4, 5} --目标个数 + +SimpleSkillTask_StarFall.CurAdditionAttackRate = 0.0 +SimpleSkillTask_StarFall.CurTargetLimitNum = 0 + +function SimpleSkillTask_StarFall:ctor(OwnerSkill) + SimpleSkillTask_StarFall.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_StarFall:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "StarFall" + +end + +function SimpleSkillTask_StarFall:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurAdditionAttackRate = self.AdditionAttackRateTable[self.SkillLevel] + self.CurTargetLimitNum = self.TargetLimitNumTable[self.SkillLevel] + + if self.TaskSelector ~= nil then + self.TaskSelector = nil + end + local SelectorData = { + LimitNum = self.CurTargetLimitNum, + ForwardOffset = 0, + Param_Float = 200, + Param_Vector = VectorHelper.VectorZero(), + } + local SelectorClass = SimpleSkillSelectorFactory.GetSelectorByType(ESkillSelectorType.CircleRange) + self.TaskSelector = SelectorClass.New() + self.TaskSelector:InitSelectorFromData(SelectorData, self.CasterPawn) +end + +function SimpleSkillTask_StarFall:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self.TaskLoopHandle = EventSystem.SetTimerLoop(self.CasterPawn, + function() + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 240 + Base_Attack * self.CurAdditionAttackRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetMonsters = self.TaskSelector:GetTargetPawns() + for _, Monster in pairs(TargetMonsters) do + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + + if not table.isEmpty(TargetMonsters) then + self:EnableSkillEffect(self.CasterPawn, TargetMonsters, EEffectSpawnLocationType.Bottom) + end + end, 3.0) +end + +function SimpleSkillTask_StarFall:DeactivateTask() + if self.TaskLoopHandle then + EventSystem.StopTimer(self.TaskLoopHandle) + end +end + + +return SimpleSkillTask_StarFall; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StickStrike.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StickStrike.lua new file mode 100644 index 00000000..b2807aaf --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StickStrike.lua @@ -0,0 +1,42 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_StickStrike = LuaClass("SimpleSkillTask_StickStrike", SimpleSkillTask) + +SimpleSkillTask_StickStrike.AdditionDamageRateTable = {5.0, 7.0, 9.0, 12.0} +SimpleSkillTask_StickStrike.CurDamageRate = 0.0 + +function SimpleSkillTask_StickStrike:ctor(OwnerSkill) + SimpleSkillTask_StickStrike.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_StickStrike:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "StickStrike" +end + +function SimpleSkillTask_StickStrike:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[NewSkillLevel] +end + +function SimpleSkillTask_StickStrike:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local DamageAmount = self.CurDamageRate * UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + for _, Monster in pairs(self:GetTargetPawns()) do + if Monster ~= nil and UE.IsValid(Monster) and Monster.bIsDead == false then + Monster:SetIsStun(true, 1.0) + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end + + self:EnableSkillEffect(self.CasterPawn, nil, EEffectSpawnLocationType.Bottom) +end + +function SimpleSkillTask_StickStrike:DeactivateTask() + +end + +return SimpleSkillTask_StickStrike; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Stomp.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Stomp.lua new file mode 100644 index 00000000..4f9a165c --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Stomp.lua @@ -0,0 +1,74 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Stomp = LuaClass("SimpleSkillTask_Stomp", SimpleSkillTask) + +SimpleSkillTask_Stomp.AdditionDamageRateTable = {1.8, 2.2, 2.8, 3.5} +SimpleSkillTask_Stomp.CurDamageRate = 0.0 +SimpleSkillTask_Stomp.CurStunDuration = 5.0 + +SimpleSkillTask_Stomp.AffectedMonsters = {} +SimpleSkillTask_Stomp.CachedSpeedScales = {} + +function SimpleSkillTask_Stomp:ctor(OwnerSkill) + SimpleSkillTask_Stomp.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Stomp:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Stomp" +end + +function SimpleSkillTask_Stomp:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] +end + +function SimpleSkillTask_Stomp:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + if self.TimerHandle ~= nil then + for _, AffectedPawn in pairs(self.AffectedMonsters) do + if AffectedPawn ~= nil and UE.IsValid(AffectedPawn) and AffectedPawn.bIsDead == false then + if self.CachedSpeedScales[AffectedPawn] ~= nil then + UGCSimpleCharacterSystem.SetSpeedScale(AffectedPawn, self.CachedSpeedScales[AffectedPawn]) + end + end + end + EventSystem.StopTimer(self.TimerHandle) + end + + self.AffectedMonsters = {} + + self:EnableSkillEffect(self.CasterPawn, nil, EEffectSpawnLocationType.Bottom) + + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 100 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + TargetPawn:SetIsStun(true, self.CurStunDuration) + + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + local SpeedScale = UGCSimpleCharacterSystem.GetSpeedScale(TargetPawn) + self.CachedSpeedScales[TargetPawn] = SpeedScale + UGCSimpleCharacterSystem.SetSpeedScale(TargetPawn, SpeedScale * 0.5) + + table.insert(self.AffectedMonsters, TargetPawn) + end + + if not table.isEmpty(self.AffectedMonsters) then + self.TimerHandle = EventSystem.SetTimer(self.CasterPawn, function() + for _, AffectedPawn in pairs(self.AffectedMonsters) do + if AffectedPawn ~= nil and UE.IsValid(AffectedPawn) and AffectedPawn.bIsDead == false then + if self.CachedSpeedScales[AffectedPawn] ~= nil then + UGCSimpleCharacterSystem.SetSpeedScale(AffectedPawn, self.CachedSpeedScales[AffectedPawn]) + end + end + end + end, self.CurStunDuration) + end +end + +return SimpleSkillTask_Stomp; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StrongWind.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StrongWind.lua new file mode 100644 index 00000000..3c7dbc6e --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_StrongWind.lua @@ -0,0 +1,70 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_StrongWind = LuaClass("SimpleSkillTask_StrongWind", SimpleSkillTask) + +SimpleSkillTask_StrongWind.AdditionDamageRateTable = {0.15, 0.22, 0.3, 0.4} +SimpleSkillTask_StrongWind.SkillDurationTable = {5, 6, 7, 8} +SimpleSkillTask_StrongWind.CurDamageRate = 0.0 +SimpleSkillTask_StrongWind.CurSkillDuration = 5.0 + +SimpleSkillTask_StrongWind.CachedSpeedScale = 0 + +function SimpleSkillTask_StrongWind:ctor(OwnerSkill) + SimpleSkillTask_StrongWind.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_StrongWind:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "StrongWind" +end + +function SimpleSkillTask_StrongWind:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[NewSkillLevel] + self.CurSkillDuration = self.SkillDurationTable[NewSkillLevel] +end + +function SimpleSkillTask_StrongWind:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + if self.TimerHandle ~= nil then + EventSystem.StopTimer(self.LoopTimerHandle) + EventSystem.StopTimer(self.TimerHandle) + if self.CachedSpeedScale > 0.1 then + UGCPawnAttrSystem.SetSpeedScale(self.CasterPawn, self.CachedSpeedScale) + end + end + + self:EnableEffectWithId(self.EffectId, self.CasterPawn, nil, self.CurSkillDuration, EEffectSpawnLocationType.Attach) + + self.CachedSpeedScale = UGCPawnAttrSystem.GetSpeedScale(self.CasterPawn) + UGCPawnAttrSystem.SetSpeedScale(self.CasterPawn, self.CachedSpeedScale * 1.5) + + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 80 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + + self.LoopTimerHandle = EventSystem.SetTimerLoop(self.CasterPawn, function() + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end, 1.0) + + self.TimerHandle = EventSystem.SetTimer(self.CasterPawn, function() + if self.LoopTimerHandle ~= nil then + EventSystem.StopTimer(self.LoopTimerHandle) + end + if self.CachedSpeedScale > 0.1 then + UGCPawnAttrSystem.SetSpeedScale(self.CasterPawn, self.CachedSpeedScale) + end + end, self.CurSkillDuration) +end + +return SimpleSkillTask_StrongWind; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Stun.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Stun.lua new file mode 100644 index 00000000..0767050d --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Stun.lua @@ -0,0 +1,34 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Stun = LuaClass("SimpleSkillTask_Stun", SimpleSkillTask) + +SimpleSkillTask_Stun.CachedAffectedMonsters = {} + +function SimpleSkillTask_Stun:ctor(OwnerSkill) + SimpleSkillTask_Stun.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Stun:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Stun" +end + +function SimpleSkillTask_Stun:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:EnableSkillEffect(self.CasterPawn, nil) +end + +function SimpleSkillTask_Stun:ActivateTaskInTimer() + local TargetPawns = self:GetTargetPawns() + for _, Monster in pairs(TargetPawns) do + if Monster ~= nil and UE.IsValid(Monster) and Monster.bIsDead == false then + Monster:SetIsStun(true, 3.0) + end + end +end + +function SimpleSkillTask_Stun:DeactivateTask() +end + +return SimpleSkillTask_Stun; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Tear.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Tear.lua new file mode 100644 index 00000000..fa2a28c4 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Tear.lua @@ -0,0 +1,44 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Tear = LuaClass("SimpleSkillTask_Tear", SimpleSkillTask) + +SimpleSkillTask_Tear.AdditionDamageRateTable = {2.0, 2.5, 3.2, 4.0} +SimpleSkillTask_Tear.CurDamageRate = 0.0 + +function SimpleSkillTask_Tear:ctor(OwnerSkill) + SimpleSkillTask_Tear.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Tear:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Tear" +end + +function SimpleSkillTask_Tear:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[NewSkillLevel] +end + +function SimpleSkillTask_Tear:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self:EnableSkillEffect(self.CasterPawn, nil, EEffectSpawnLocationType.Attach) +end + +function SimpleSkillTask_Tear:ActivateTaskInTimer() + local DamageAmount = 100 + self.CurDamageRate * UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + for _, Monster in pairs(self:GetTargetPawns()) do + if Monster ~= nil and UE.IsValid(Monster) and UGCSimpleCharacterSystem.GetHealth(Monster) > 0 then + UGCGameSystem.ApplyDamage(Monster, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end + end +end + +function SimpleSkillTask_Tear:DeactivateTask() + +end + +return SimpleSkillTask_Tear; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ToxicRain.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ToxicRain.lua new file mode 100644 index 00000000..41626dd8 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_ToxicRain.lua @@ -0,0 +1,47 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_ToxicRain = LuaClass("SimpleSkillTask_ToxicRain", SimpleSkillTask) + +function SimpleSkillTask_ToxicRain:ctor(OwnerSkill) + SimpleSkillTask_ToxicRain.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_ToxicRain:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) +end + +function SimpleSkillTask_ToxicRain:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + if self.SpawnedActor ~= nil and UE.IsValid(self.SpawnedActor) then + self.SpawnedActor:SetLevel(NewSkillLevel) + end +end + +function SimpleSkillTask_ToxicRain:ActivateTask() + SimpleSkillTask.ActivateTask(self) +end + +function SimpleSkillTask_ToxicRain:ActivateTaskInTimer() + local TargetPawn = nil + local TargetPawns = self:GetTargetPawns() + if TargetPawns[1] ~= nil and UE.IsValid(TargetPawns[1]) then + TargetPawn = TargetPawns[1] + else + return + end + + local Location = TargetPawn:K2_GetActorLocation() + local Rotation = TargetPawn:K2_GetActorRotation() + + Location.Z = Location.Z - TargetPawn.CapsuleComponent.CapsuleHalfHeight + + self.SpawnedActor = self:SpawnSkillActor(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/SceneObject/SkillActor/BP_Skill_ToxicRain.BP_Skill_ToxicRain_C'), self.CasterPawn, Location, Rotation) +end + +function SimpleSkillTask_ToxicRain:DeactivateTask() + if self.SpawnedActor ~= nil and UE.IsValid(self.SpawnedActor) then + self.SpawnedActor:K2_DestroyActor() + end +end + +return SimpleSkillTask_ToxicRain; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Tread.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Tread.lua new file mode 100644 index 00000000..d2e31afb --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Tread.lua @@ -0,0 +1,46 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Tread = LuaClass("SimpleSkillTask_Tread", SimpleSkillTask) + +SimpleSkillTask_Tread.AdditionDamageRateTable = {1.5, 2.0, 2.5, 3.0} +SimpleSkillTask_Tread.StunDurationTable = {1, 1.2, 1.4, 2} +SimpleSkillTask_Tread.CurDamageRate = 0.0 +SimpleSkillTask_Tread.CurStunDuration = 0.0 + +SimpleSkillTask_Tread.AffectedMonsters = {} + +function SimpleSkillTask_Tread:ctor(OwnerSkill) + SimpleSkillTask_Tread.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Tread:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + + self.TaskName = "Tread" +end + +function SimpleSkillTask_Tread:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurDamageRate = self.AdditionDamageRateTable[self.SkillLevel] + self.CurStunDuration = self.StunDurationTable[self.SkillLevel] +end + +function SimpleSkillTask_Tread:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + self.AffectedMonsters = {} + + self:EnableEffectWithId(self.EffectId, self.CasterPawn, nil, 0, EEffectSpawnLocationType.Bottom) + + local Base_Attack = UGCGameSystem.GetPlayerStateByPlayerKey(self.CasterPawn.PlayerKey).Attributes[AttributeType.Base].Base_Attack + local DamageAmount = 180 + Base_Attack * self.CurDamageRate + local EventInstigator = UGCGameSystem.GetPlayerControllerByPlayerKey(self.CasterPawn.PlayerKey) + + local TargetPawns = self:GetTargetPawns() + for _, TargetPawn in pairs(TargetPawns) do + TargetPawn:SetIsStun(true, self.CurStunDuration) + UGCGameSystem.ApplyDamage(TargetPawn, DamageAmount, EventInstigator, self.CasterPawn, EDamageType.ShootDamage) + end +end + +return SimpleSkillTask_Tread; \ No newline at end of file diff --git a/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Weaken.lua b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Weaken.lua new file mode 100644 index 00000000..28fbf389 --- /dev/null +++ b/GZJ/Script/SimpleSkill/Task/SimpleSkillTask_Weaken.lua @@ -0,0 +1,129 @@ +local SimpleSkillTask = require("Script.SimpleSkill.Task.SimpleSkillTask") +local SimpleSkillTask_Weaken = LuaClass("SimpleSkillTask_Weaken", SimpleSkillTask) + +SimpleSkillTask_Weaken.AdditionalAttackRateTable = {0.01, 0.02, 0.03, 0.04} +SimpleSkillTask_Weaken.CurAdditionalAttackRate = 0 + +SimpleSkillTask_Weaken.BindWeapon = nil + +function SimpleSkillTask_Weaken:ctor(OwnerSkill) + SimpleSkillTask_Weaken.super.ctor(self, OwnerSkill) +end + +function SimpleSkillTask_Weaken:InitTaskFromData(TaskData, CasterPawn) + SimpleSkillTask.InitTaskFromData(self, TaskData, CasterPawn) + self.TaskName = "Weaken" + + self.AffectedMonsterInfoList = {} --@type table +end + +function SimpleSkillTask_Weaken:UpdateSkillLevel(NewSkillLevel) + SimpleSkillTask.UpdateSkillLevel(self, NewSkillLevel) + + self.CurAdditionalAttackRate = self.AdditionalAttackRateTable[NewSkillLevel] +end + +function SimpleSkillTask_Weaken:ActivateTask() + SimpleSkillTask.ActivateTask(self) + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + else + self.CasterPawn.OnWeaponSpawnedDelegate:Add(self.OnWeaponSpawned, self) + end +end + +function SimpleSkillTask_Weaken:DeactivateTask() + self.CasterPawn.OnWeaponSpawnedDelegate:Remove(self.OnWeaponSpawned, self) + + if self.BindWeapon ~= nil and UE.IsValid(self.BindWeapon) then + self.BindWeapon.OnFireDelegate:Remove(self.OnCasterPawnFire, self) + self.BindWeapon = nil + end + + for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do + MonsterInfo.Monster:RemoveModifyDamageDelegation("ActivateWeaken"..KismetSystemLibrary.GetObjectName(self.CasterPawn)) + EventSystem.StopTimer(MonsterInfo.TimerHandle) + self.AffectedMonsterInfoList[index] = nil + end + self.AffectedMonsterInfoList = {} +end + +function SimpleSkillTask_Weaken:OnWeaponSpawned(Pawn) + if Pawn ~= self.CasterPawn then + return + end + + local CasterPawnWeapon = self.CasterPawn:GetWeaponComponent() + if CasterPawnWeapon ~= nil and UE.IsValid(CasterPawnWeapon) then + self.BindWeapon = CasterPawnWeapon + self.BindWeapon.OnFireDelegate:Add(self.OnCasterPawnFire, self) + end +end + +function SimpleSkillTask_Weaken:OnCasterPawnFire(Weapon, BaseDamage) + if self.BindWeapon ~= Weapon then + return + end + local ShootTarget = Weapon.TargetMonster + + local HitCount = self:GetMonsterHitCount(ShootTarget) + HitCount = HitCount + 1 + if HitCount == 1 then + local TimerHandle = EventSystem.SetTimer(self.CasterPawn, function() + ShootTarget:RemoveModifyDamageDelegation("ActivateWeaken"..KismetSystemLibrary.GetObjectName(self.CasterPawn)) + self:RemoveMonsterInfo(ShootTarget) + end, 5.0) + local MonsterInfo = { + Monster = ShootTarget, + HitCount = HitCount, + TimerHandle = TimerHandle, + } + table.insert(self.AffectedMonsterInfoList, MonsterInfo) + + self:EnableEffectWithId(self.EffectId, ShootTarget, nil, 5.0, EEffectSpawnLocationType.Attach, 'spine_01') + end + + ShootTarget:AddModifyDamageDelegationFun( + "ActivateExhaust"..KismetSystemLibrary.GetObjectName(self.CasterPawn), + function (DamageAmount, DamageEvent, EventInstigator, DamageCauser) + return DamageAmount * (1 + HitCount * self.CurAdditionalAttackRate) + end + ) +end + +function SimpleSkillTask_Weaken:GetAffectedMonsterInfo(Monster) + for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do + if MonsterInfo.Monster == Monster then + return MonsterInfo + end + end + return nil +end + +function SimpleSkillTask_Weaken:GetMonsterHitCount(Monster) + for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do + if MonsterInfo.Monster == Monster then + return MonsterInfo.HitCount + end + end + return 0 +end + +function SimpleSkillTask_Weaken:RemoveMonsterInfo(Monster) + for index, MonsterInfo in pairs(self.AffectedMonsterInfoList) do + if MonsterInfo.Monster == Monster then + EventSystem.StopTimer(MonsterInfo.TimerHandle) + self.AffectedMonsterInfoList[index] = nil + return + end + end +end + +function SimpleSkillTask_Weaken:OnMonsterDeath(DeadMonster, KillerController, DamageCauser, KillingHitInfo, KillingHitImpulseDir, KillingHitDamageTypeID, DamageTypeClass, IsHeadShotDamage) + self:RemoveMonsterInfo(DeadMonster) +end + +return SimpleSkillTask_Weaken; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/BP_FittingDragDropData.lua b/GZJ/Script/UI/ChildWidgets/BP_FittingDragDropData.lua new file mode 100644 index 00000000..1e517064 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/BP_FittingDragDropData.lua @@ -0,0 +1,32 @@ +---@class BP_FittingDragDropData_C:DragDropOperation +--Edit Below-- +local BP_FittingDragDropData = { + -- 可以存放一些其他数据 + ItemData = nil, + DropItemType = EItemDropType.None, +}; + +function BP_FittingDragDropData:ReceiveBeginPlay() + self.SuperClass.ReceiveBeginPlay(self); +end + +function BP_FittingDragDropData:SetOperationData(InData, InType) + self.ItemData = InData + self.DropItemType = InType +end + +function BP_FittingDragDropData:GetItemData() + return self.ItemData +end + +function BP_FittingDragDropData:GetDropItemType() + return self.DropItemType +end + +--[[ +function BP_FittingDragDropData:ReceiveEndPlay() + self.SuperClass.ReceiveEndPlay(self); +end +--]] + +return BP_FittingDragDropData; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_BagWeaponItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_BagWeaponItem.lua new file mode 100644 index 00000000..bbdb4689 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_BagWeaponItem.lua @@ -0,0 +1,189 @@ +---@class WBP_BagWeaponItem_C:UUserWidget +---@field Button_Reset UButton +---@field CanvasPanel_Fittings UCanvasPanel +---@field Image_WeaponIcon UImage +---@field TextBlock_Desc UTextBlock +---@field TextBlock_WeaponName UTextBlock +--Edit Below-- +local WBP_BagWeaponItem = { + bInitDoOnce = false; + WeaponItem = nil, + WeaponItemId = 0, -- 武器Id + Fittings = {}, + WeaponComponent = nil, + bHasConstruct = false, +}; + +function WBP_BagWeaponItem:Construct() + self.SuperClass:Construct() + + print(string.format("[WBP_BagWeaponItem:Construct] 构造好了")) + self.bHasConstruct = true + print(string.format("[WBP_BagWeaponItem:Construct] 设置好了")) + self:InitData() +end + +function WBP_BagWeaponItem:GetHasConstruct() + return self.bHasConstruct +end + +-- 初始化 +function WBP_BagWeaponItem:InitData() + print(string.format("[WBP_BagWeaponItem:InitData] 初始化数据")) + -- 在开始的时候把它们全部隐藏 + for i = 1, 5 do + self.CanvasPanel_Fittings:GetChildAt(i - 1).Image_Icon:SetVisibility(ESlateVisibility.Collapsed) + --再给他们设置 ItemType + self.CanvasPanel_Fittings:GetChildAt(i - 1).FittingItemType = i - 1 + end + + self.Button_Reset.OnClicked:Add(WBP_BagWeaponItem.OnClickResetWeapon, self) +end + +function WBP_BagWeaponItem:GetFittingItemByItemType(InItemType) + return self.CanvasPanel_Fittings:GetChildAt(InItemType) +end + +-- function WBP_BagWeaponItem:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_BagWeaponItem:Destruct() + +-- end + +function WBP_BagWeaponItem:OnMouseButtonDown(MyGeometry, PointerEvent) + self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) + -- local PlayerController = STExtraGameplayStatics.GetFirstPlayerController(self) + -- UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_ChangeCurrentWeaponId", self.WeaponItemId) +end + +function WBP_BagWeaponItem:OnMouseButtonUp(MyGeometry, InTouchEvent) + self.SuperClass:OnMouseButtonUp(MyGeometry, InTouchEvent) +end + +function WBP_BagWeaponItem:OnFocusLost(InFocusEvent) + return WBP_BagWeaponItem.SuperClass:OnFocusLost(InFocusEvent) +end + +-- 当拖拽到该元素上的时候,并释放的时候 +function WBP_BagWeaponItem:OnDrop(MyGeometry, PointerEvent, Operation) + local Data = Operation:GetItemData() + if Data == nil then + print(string.format("[WBP_BagWeaponItem:OnDrop] 有问题,请检查一下")) + return + end + + self:SetDragData(Data) + self.SuperClass:OnDrop(MyGeometry, PointerEvent, Operation) +end + +-- 数据类型 {ItemID, 1} -- 数量为1 +function WBP_BagWeaponItem:SetDragData(InData) + self:AddFittingItem(InData.ItemID) +end + +-- 这是客户端设置武器 +function WBP_BagWeaponItem:SetWeaponId(InId, bIsNewAdd) + self.WeaponItemId = InId + local Data = GameDataManager.GetWeaponConstructDataByID(InId) + if Data == nil then + UE.Log("[WBP_BagWeaponItem:SetWeaponId] Data is nil") + return + end + if Data.Icon ~= nil then + self.Image_WeaponIcon:SetBrushFromTexture(Data.Icon) + end + + self.TextBlock_WeaponName:SetText(Tables.WeaponClassTypeDesc[Data.WeaponType][1]) + self.TextBlock_Desc:SetText(DropItemMap.WeaponTable[Data.WeaponType].Text) + + -- 从武器组件中读取对应数据 + self:RefreshFittings() +end + +function WBP_BagWeaponItem:GetWeaponComponent() + local PlayerController = STExtraGameplayStatics.GetFirstPlayerController(self) + if PlayerController then + local OwningPawn = PlayerController:GetPlayerCharacterSafety() + if OwningPawn then + local WC = OwningPawn:GetWeaponComponent() + if WC ~= nil and UE.IsValid(WC) then + self.WeaponComponent = WC + end + end + end +end + +function WBP_BagWeaponItem:RefreshFittings() + local PlayerState = GameDataManager.GetLocalPlayerState() + if PlayerState == nil then + print(string.format("[WBP_BagWeaponItem:RefreshFittings] 没有 PlayerState,请检查一下")) + return + end + print(string.format("[WBP_BagWeaponItem:RefreshFittings] 当前的Id = %d", self.WeaponItemId)) + local Val = PlayerState:GetWeaponFittingsById(self.WeaponItemId) + self.Fittings = TableHelper.DeepCopyTable(Val) + self:SetFittingList(self.Fittings) +end + +function WBP_BagWeaponItem:SetFittingList(InDataArr) + print(string.format("[WBP_BagWeaponItem:SetFittingList] 开始设置 Fitting List")) + self:HideFittingList() + -- 注意,从左往右依次是 + + for i = 1, #InDataArr do + local ItemId = InDataArr[i] + self:SetFittingItem(ItemId) + end +end + +function WBP_BagWeaponItem:HideFittingList() + for i = 1, 5 do + self.CanvasPanel_Fittings:GetChildAt(i - 1):SetItemHidden() + end +end + +function WBP_BagWeaponItem:AddFittingItem(InItemId) + print(string.format("[WBP_BagWeaponItem:AddFittingItem] 开始添加配件 %d", InItemId)) + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_AddFittingItem", self.WeaponItemId, InItemId) +end + +function WBP_BagWeaponItem:SetFittingItem(InItemId) + local ItemType = GetItemTypeByItemId(InItemId) + local Icon = GameDataManager.GetItemInfoByItemID(InItemId).Icon + self.CanvasPanel_Fittings:GetChildAt(ItemType):SetItemIcon(Icon) + self.CanvasPanel_Fittings:GetChildAt(ItemType):SetItemBGColor(GetItemQualityLevel(InItemId)) + self.CanvasPanel_Fittings:GetChildAt(ItemType):SetVisibility(ESlateVisibility.Visible) +end + +function WBP_BagWeaponItem:RemoveFittingItem(InItemId) + local ItemType = GetItemTypeByItemId(InItemId) + self.CanvasPanel_Fittings:GetChildAt(ItemType):SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_BagWeaponItem:OnClickResetWeapon() + --首先判断有没有足够的石头 + local PC = GameDataManager.GetLocalPlayerController() + local Items = PC.ItemMap[EItemType.ScouringStone] + local bFindStone = false + local Count = 0 + if Items ~= nil then + for _, v in pairs(Items) do + Count = Count + v + end + end + if Count > 0 then + bFindStone = true + end + if not bFindStone then + UIManager:ShowGeneralNotice("没有足够多的重铸石") + return + end + + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_ResetWeapon", self.WeaponItemId) +end + +return WBP_BagWeaponItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_Challenge_Button.lua b/GZJ/Script/UI/ChildWidgets/WBP_Challenge_Button.lua new file mode 100644 index 00000000..ff82fc15 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_Challenge_Button.lua @@ -0,0 +1,42 @@ +---@class WBP_Challenge_Button_C:UUserWidget +---@field Button_Challenge UButton +---@field Image_Icon UImage +---@field Image_Select UImage +--Edit Below-- +local WBP_Challenge_Button = { + bInitDoOnce = false; + ButtonIndex = 0; +}; + +function WBP_Challenge_Button:Construct() + WBP_Challenge_Button.SuperClass.Construct(self) + + self.Button_Challenge.OnClicked:Add(WBP_Challenge_Button.OnClickChallenge, self) + self:ShowSelect(false) +end + +-- function WBP_Challenge_Button:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_Challenge_Button:Destruct() + +-- end + +function WBP_Challenge_Button:ShowSelect(IsSelect) + if IsSelect then + self.Image_Select:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + self.Image_Select:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_Challenge_Button:SetIndex(InNum) + self.ButtonIndex = InNum; +end + +function WBP_Challenge_Button:OnClickChallenge() + UIManager:GetPanel(EUIType.Challenge):ShowChallenge(self.ButtonIndex, self) +end + +return WBP_Challenge_Button; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_CloseWidget.lua b/GZJ/Script/UI/ChildWidgets/WBP_CloseWidget.lua new file mode 100644 index 00000000..baaea0ff --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_CloseWidget.lua @@ -0,0 +1,33 @@ +---@class WBP_CloseWidget_C:UUserWidget +--Edit Below-- +local WBP_CloseWidget = { + bInitDoOnce = false; + WidgetToClose = nil +}; + +--[==[ Construct +function WBP_CloseWidget:Construct() + +end +-- Construct ]==] + +-- function WBP_CloseWidget:Destruct() + +-- end + +-- 表示随意点击其他地方都会关闭要关闭的页面 +function WBP_CloseWidget:OnMouseButtonDown(MyGeometry, PointerEvent) + print(string.format('[WBP_CloseWidget:OnMouseButtonDown] 执行')) + if UE.IsValid(self.WidgetToClose) then + --self.WidgetToClose:Close(); + self.WidgetToClose:SetVisibility(ESlateVisibility.Collapsed) + end + return self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) +end + +function WBP_CloseWidget:SetWidgetToClose(InWidget) + print(string.format('[WBP_CloseWidget:SetWidgetToClose] 执行了')) + self.WidgetToClose = InWidget +end + +return WBP_CloseWidget; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_DifficultyItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_DifficultyItem.lua new file mode 100644 index 00000000..3893927d --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_DifficultyItem.lua @@ -0,0 +1,73 @@ +---@class WBP_DifficultyItem_C:UUserWidget +---@field Button_Select UButton +---@field Image_0 UImage +---@field Image_Select UImage +---@field TextBlock_Select UTextBlock +---@field WidgetSwitcher_BG UWidgetSwitcher +--Edit Below-- +local WBP_DifficultyItem = { + bInitDoOnce = false; + Difficulty = 0; --难度 + CanSelect = false; --是否可以选择 +}; + +function WBP_DifficultyItem:Construct() + self.SuperClass:Construct(); + self.Button_Select.OnClicked:Add(WBP_DifficultyItem.OnSelected, self); + self.WidgetSwitcher_BG:SetActiveWidgetIndex(0); +end + +function WBP_DifficultyItem:OnSelected() + -- 发送过去难度 + -- 需要判断当前是否选择过了 + print(string.format('[WBP_DifficultyItem:OnSelected] 执行')) + if UIManager:GetPanel(EUIType.SelectDifficulty).SelectDifficulty ~= 0 then + return + end + if not self.CanSelect then + return + end + -- 打开界面 + local UI = UIManager:GetPanel(EUIType.DifficultInfo) + UI:SetDifficult(self.Difficulty, self) + UIManager:ShowPanel(EUIType.DifficultInfo) + + NewPlayerGuideManager:RemoveGuide(2) + --self:SetVisualType(2) +end + +function WBP_DifficultyItem:SetDifficulty(InNum) + self.Difficulty = InNum + -- 显示文本 + self.TextBlock_Select:SetText('难度\n' .. tostring(InNum)) +end + +-- function WBP_DifficultyItem:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_DifficultyItem:Destruct() + +-- end + +--- 0: 隐藏 +--- 1: 显示 +--- 2: 点击 +function WBP_DifficultyItem:SetVisualType(InType) + print(string.format('[WBP_DifficultyItem:SetVisualType] Type = %d', InType)) + if InType == 1 then + self.CanSelect = true + self.WidgetSwitcher_BG:SetActiveWidgetIndex(1) + self.Image_Select:SetVisibility(ESlateVisibility.Hidden) + elseif InType == 0 then + self.CanSelect = false + self.WidgetSwitcher_BG:SetActiveWidgetIndex(0) + self.Image_Select:SetVisibility(ESlateVisibility.Hidden) + elseif InType == 2 then + self.CanSelect = false + self.WidgetSwitcher_BG:SetActiveWidgetIndex(1) + self.Image_Select:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +return WBP_DifficultyItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_DifficultyRangeItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_DifficultyRangeItem.lua new file mode 100644 index 00000000..91f421c7 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_DifficultyRangeItem.lua @@ -0,0 +1,44 @@ +---@class WBP_DifficultyRangeItem_C:UUserWidget +---@field Button_Select UButton +---@field TextBlock_Value UTextBlock +---@field WidgetSwitcher_Select UWidgetSwitcher +--Edit Below-- +local WBP_DifficultyRangeItem = { + bInitDoOnce = false; + RangeNum = 0; +}; + +function WBP_DifficultyRangeItem:Construct() + self.Button_Select.OnClicked:Add(WBP_DifficultyRangeItem.OnClickSelect, self) + self.Button_Select:SetTouchMethod(EButtonTouchMethod.PreciseTap) +end + +-- function WBP_DifficultyRangeItem:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_DifficultyRangeItem:Destruct() + self.Button_Select.OnClicked:Remove(WBP_DifficultyRangeItem.OnClickSelect, self) +end + +function WBP_DifficultyRangeItem:SetRangeNum(InNum, InMax) + self.RangeNum = InNum + local WriteNum = InNum * 10 + if InNum * 10 > InMax then + WriteNum = InMax + end + self.TextBlock_Value:SetText('难度 '.. string.format('%d-%d', (InNum - 1) * 10 + 1, WriteNum)) +end + +function WBP_DifficultyRangeItem:SetIsClick(IsClick) + +end + +function WBP_DifficultyRangeItem:OnClickSelect() + print(string.format('[WBP_DifficultyRangeItem:OnClickSelect] 执行')) + self:SetIsClick(true) + UIManager.AllPanel[EUIType.SelectDifficulty]:SetRangeNum(self.RangeNum) + NewPlayerGuideManager:RemoveGuide(2) +end + +return WBP_DifficultyRangeItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_DragItemVisual.lua b/GZJ/Script/UI/ChildWidgets/WBP_DragItemVisual.lua new file mode 100644 index 00000000..a5c92ab0 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_DragItemVisual.lua @@ -0,0 +1,64 @@ +---@class WBP_DragItemVisual_C:UUserWidget +---@field CanvasPanel_Images UCanvasPanel +---@field Image_Icon UImage +---@field WidgetSwitcher_BG UWidgetSwitcher +--Edit Below-- +local WBP_DragItemVisual = { + bInitDoOnce = false; + bHasInit = false +}; + +function WBP_DragItemVisual:Construct() + WBP_DragItemVisual.SuperClass:Construct() + self.bHasInit = true + self.Image_Icon:SetVisibility(ESlateVisibility.SelfHitTestInvisible) +end + +-- function WBP_DragItemVisual:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_DragItemVisual:Destruct() + +-- end + +-- 这个数据只会是一个 Id,一个 Count +function WBP_DragItemVisual:SetVisualItemData(InData, InBrush) + if self == nil then + print("此时还未创建,说明有问题") + else + print("此时已经创建") + end + if not self.bHasInit then + return + end + --让数据为空的不要进行拖拽 + if InData == nil then + self:SetVisibility(ESlateVisibility.Collapsed) + return + end + + print(string.format("实现了 OnDragDetected 方法")) + print(string.format("[WBP_FittingDragVisual:SetVisualItemData] 获取 ItemData 里面的数据:Id:%d, Count: %d", InData.ItemID, InData.ItemCount)) + -- 通过表查找对应的图片并加载 + local Icon = nil + if GameDataManager ~= nil then + Icon = GameDataManager.GetItemInfoByItemID(InData.ItemID).Icon + end + + self:SetItemBGColor(GetItemQualityLevel(InData.ItemID)) + if Icon ~= nil then + print("Icon 是有值的") + UIManager.LoadTexture(self.Image_Icon, Icon) + self.Image_Icon:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + print("Icon 为空~") + self.Image_Icon:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +function WBP_DragItemVisual:SetItemBGColor(InLevel) + self.WidgetSwitcher_BG:SetActiveWidgetIndex(InLevel) +end + +return WBP_DragItemVisual; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_DropItemWidget.lua b/GZJ/Script/UI/ChildWidgets/WBP_DropItemWidget.lua new file mode 100644 index 00000000..922b3e0e --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_DropItemWidget.lua @@ -0,0 +1,32 @@ +---@class WBP_DropItemWidget_C:UUserWidget +--Edit Below-- +local WBP_DropItemWidget = { bInitDoOnce = false; }; + +--[==[ Construct +function WBP_DropItemWidget:Construct() + +end +-- Construct ]==] + +-- function WBP_DropItemWidget:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_DropItemWidget:Destruct() + +-- end + +function WBP_DropItemWidget:OnDrop(MyGeometry, PointerEvent, Operation) + local ItemData = Operation:GetItemData() + if ItemData ~= nil then + -- 判断当前有几个元素 + if ItemData.ItemCount == 1 then + UIManager.AllPanel[EUIType.Backpack]:OnSendGeneralSlideNum(EBagOperateType.Drop, ItemData) + else + EventSystem:SendEvent(EventType.ShowGeneralSlideWidget, EBagOperateType.Drop, Operation:GetItemData()) + end + end + return self.SuperClass:OnDrop(MyGeometry, PointerEvent, Operation) +end + +return WBP_DropItemWidget; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_FittingDragVisual.lua b/GZJ/Script/UI/ChildWidgets/WBP_FittingDragVisual.lua new file mode 100644 index 00000000..52313510 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_FittingDragVisual.lua @@ -0,0 +1,32 @@ +---@class WBP_FittingDragVisual_C:UUserWidget +---@field CanvasPanel_Images UCanvasPanel +---@field Image_Icon UImage +---@field Image_Main UImage +--Edit Below-- +local WBP_FittingDragVisual = { bInitDoOnce = false; }; + +function WBP_FittingDragVisual:Construct() + WBP_FittingDragVisual.SuperClass:Construct() +end + +-- 这个数据只会是一个 Id,一个 Count +function WBP_FittingDragVisual:SetVisualItemData(InData) + print(string.format("实现了 OnDragDetected 方法")) + print(string.format("[WBP_FittingDragVisual:SetVisualItemData] 获取 ItemData 里面的数据:Id:%d, Count: %d", InData.ItemID, InData.ItemCount)) + -- 通过表查找对应的图片并加载 + local Icon = nil + if GameDataManager ~= nil then + Icon = GameDataManager.GetItemInfoByItemID(InData.ItemID).Icon + end + if Icon ~= nil then + print("Icon 是有值的") + UIManager.LoadTexture(self.CanvasPanel_Images:GetChildAt(1), Icon) + --self.CanvasPanel_Images:GetChildAt(1):SetBrushFromTexture(Icon) + self.CanvasPanel_Images:GetChildAt(1):SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + print("Icon 为空~") + self.CanvasPanel_Images:GetChildAt(1):SetVisibility(ESlateVisibility.Collapsed) + end +end + +return WBP_FittingDragVisual; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_FittingItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_FittingItem.lua new file mode 100644 index 00000000..dd28feaf --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_FittingItem.lua @@ -0,0 +1,205 @@ +---@class WBP_FittingItem_C:UAEUserWidget +---@field CanvasPanel_Main UCanvasPanel +---@field ItemIconAndBG UWBP_WeaponItemFitting_C +---@field TextBlock_ItemCount UTextBlock +---@field TextBlock_ItemType UTextBlock +---@field TextBlock_Quality UTextBlock +--Edit Below-- +local WBP_FittingItem = { + bInitDoOnce = false; + -- 拖拽数据的类 + DragDropClass = nil, + --拖拽显示的类 + DragVisualClass = nil, + -- 存放的物品数据 + FittingData = nil, + --是否正在点击按钮 + bClickLeftButton = false, + --按压时间 + PressTime = 0, + --按压多长时间之后会执行操作 + FunctionPressTime = 0.6, + + bStartMove = false, + bFirstButtonClick = false, + VisualWidget = nil, + + DragTimerHandler = nil +}; + +function WBP_FittingItem:Construct() + self.DragDropClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/BP_FittingDragDropData.BP_FittingDragDropData_C')) + self.DragVisualClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_DragItemVisual.WBP_DragItemVisual_C')) + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed) + self.bCanEverTick = true +end + +function WBP_FittingItem:Tick(MyGeometry, InDeltaTime) + -- 当没有需要选择操作的时候就不用执行操作 + if UIManager.AllPanel[EUIType.Backpack]:GetOperateType() ~= EBagOperateType.None then + return + end + if self.bClickLeftButton and not self.bStartMove then + -- 开始即时 + self.PressTime = self.PressTime + InDeltaTime + if self.PressTime > self.FunctionPressTime then + -- 执行操作 + if not self.bFirstButtonClick then + self.bFirstButtonClick = true + end + end + + if self.bFirstButtonClick then + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, true) + end + else + self.PressTime = 0 + end +end + +function WBP_FittingItem:Destruct() + self.DragDropClass = nil + self.DragVisualClass = nil +end + +-- 该方法只会在开始的时候设置一次 +-- 设置当前Item的数据,数据类型: {id, count} +function WBP_FittingItem:SetFittingItemData(InData) + --首先保存 + print(string.format("开始设置数据:Id:%d, count:%d", InData.ItemID, InData.ItemCount)) + self.FittingData = InData + + if GameDataManager then + local Val = GameDataManager.GetItemInfoByItemID(InData.ItemID) + -- TODO 这个设置需要根据 具体强型修改 + self.ItemIconAndBG:SetItemIcon(Val.Icon) + self.ItemIconAndBG:SetItemBGColor(GetItemQualityLevel(InData.ItemID)) + self.TextBlock_ItemCount:SetText(tostring(InData.ItemCount)) + -- 设置信息 + -- 先处理技能书 + local TextVal + if InData.ItemID > 20000 then + --local TheId = InData.ItemID // 100 % 100 + TextVal = DropItemMap.SkillItemMap[InData.ItemID].SkillName + else + TextVal = DropItemMap.FittingItemMap[InData.ItemID].WeaponType + end + + self.TextBlock_ItemType:SetText(TextVal) + + -- 设置质量 + local Quality = Tables.QualityInfo[GetItemQualityLevel(InData.ItemID)][1] + + if Quality == nil then + print(string.format("Can't Find Quality Type, ItemId = %d", InData.ItemID)) + else + print(string.format("Find Item Weapon, Quality Is %s", Quality)) + end + + self.TextBlock_Quality:SetText(string.format("%s", Quality)) + + -- 根据品质设置颜色 + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + print("[WBP_FittingItem:SetItemData] 当前 GameDataManager 没有值,请检查一下是否有保存") + end + + print(string.format("数据设置完成")) +end + +function WBP_FittingItem:OnDragDetected(MyGeometry, PointerEvent, Operation) + print("[WBP_FittingItem:OnDragDetected] 检测到 拖拽行为") + + self.bFirstButtonClick = false + self.bClickLeftButton = false + self.PressTime = 0 + self.bStartMove = false + + Operation = UE.NewObject(nil, self.DragDropClass) + --由于不知道是什么,因此使用 None + Operation:SetOperationData(self.FittingData, EItemDropType.None) + Operation.DefaultDragVisual = self.VisualWidget + return Operation +end + +function WBP_FittingItem:OnMouseMove(MyGeometry, MouseEvent) + -- 隐藏 ItemInfo 界面 + local ret = WBP_FittingItem.SuperClass:OnMouseMove(MyGeometry, MouseEvent); + if not self.bClickLeftButton then + return ret + end + + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, false) + + if not self.bStartMove then + self.bStartMove = true + + local GameState = UGCGameSystem.GameState + if self.FittingData == nil then + return ret + end + if UE.IsValid(self.DragVisualClass) and UE.IsValid(GameState) then + self.VisualWidget = UserWidget.NewWidgetObjectBP(GameState, self.DragVisualClass) + self.VisualWidget:SetVisibility(ESlateVisibility.Collapsed) + local that = self + self.DragTimerHandler = EventSystem.SetTimerLoop(self, function() + if that.VisualWidget.bHasInit then + EventSystem.StopTimer(that.DragTimerHandler) + that.VisualWidget:SetVisualItemData(that.FittingData, that.ItemIconAndBG:GetItemIcon()) + end + that.VisualWidget:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end, 0.05) + end + return WidgetBlueprintLibrary.DetectDragIfPressed(MouseEvent, self, "LeftMouseButton") + end + return ret +end + +function WBP_FittingItem:OnMouseButtonDown(MyGeometry, PointerEvent) + --开始即时 + -- 检测当前是否可以执行操作 + self.bClickLeftButton = true + return self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) +end + +-- 当鼠标抬起来的时候 +function WBP_FittingItem:OnMouseButtonUp(MyGeometry, InTouchEvent) + -- 检查当前时间是否够了 + if UIManager.AllPanel[EUIType.Backpack]:GetOperateType() ~= EBagOperateType.None then + -- 说明此时要进行操作了,此时发送具体数据 + EventSystem:SendEvent(EventType.SelectedItem, self.FittingData) + else + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, false) + end + self:RestProperty() +end + +function WBP_FittingItem:RestProperty() + self.bFirstButtonClick = false + self.bClickLeftButton = false + self.PressTime = 0 + self.bStartMove = false +end + +-- 开始触摸的时候 +function WBP_FittingItem:OnTouchStarted(MyGeometry, InTouchEvent) + self.bClickLeftButton = true + return WidgetBlueprintLibrary.DetectDragIfPressed(InTouchEvent, self, "LeftMouseButton") +end + +--结束触摸 +function WBP_FittingItem:OnTouchEnded(MyGeometry, InTouchEvent) + self.bClickLeftButton = false + self.bFirstButtonClick = false + self.PressTime = 0 +end + +function WBP_FittingItem:CloseWidget() + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_FittingItem:GetItemData() + return self.FittingData +end + +return WBP_FittingItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_FittingItemInfo.lua b/GZJ/Script/UI/ChildWidgets/WBP_FittingItemInfo.lua new file mode 100644 index 00000000..862dc6b3 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_FittingItemInfo.lua @@ -0,0 +1,101 @@ +---@class WBP_FittingItemInfo_C:UUserWidget +---@field TextBlock_Desc UTextBlock +---@field TextBlock_Name UTextBlock +---@field TextBlock_Pos UTextBlock +---@field WBP_CloseWidget UWBP_CloseWidget_C +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +-- 这个界面是显示物品具体属性的界面 +local WBP_FittingItemInfo = { + bInitDoOnce = false; + CurrentVisualItemWidget = nil, +}; + +function WBP_FittingItemInfo:Construct() + self.WBP_CloseWidget:SetWidgetToClose(self) + self.WBP_WidgetHeader:Construct() +end + +-- function WBP_FittingItemInfo:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_FittingItemInfo:Destruct() + +-- end + +function WBP_FittingItemInfo:SetInfoItemData(InData, InWidget) + -- 这里是显示具体的内容的位置 + -- 获取品质 + self.CurrentVisualItemWidget = InWidget + + local Id = InData.ItemID + if Id > 20000 then + if Id < 20900 then + --天赋技能,不用进行赋值 + else + local Quality = DropItemMap.SkillItemMap[Id].Quality + local Desc = DropItemMap.SkillItemMap[Id].Desc + local Name = DropItemMap.SkillItemMap[Id].SkillName + local ColdDown = DropItemMap.SkillItemMap[Id].ColdDown + local Cost = DropItemMap.SkillItemMap[Id].Cost + self.TextBlock_Name:SetText(string.format("%s-%s", Quality, Name)) + self.TextBlock_Pos:SetText(string.format('冷却时间:%d\n消耗能量值:%d', ColdDown, Cost)) + self.TextBlock_Desc:SetText("属性:".. Desc) + end + else + local Quality = DropItemMap.FittingItemMap[Id].Quality + local FittingType = DropItemMap.FittingItemMap[Id].FittingType + local WeaponType = DropItemMap.FittingItemMap[Id].WeaponType + local Props = DropItemMap.FittingItemMap[Id].Props + + local str = "" + for _, v in pairs(Props) do + local c = v.Value == 0 + local r = '' + if not c then + r = tostring(v.Value) + end + local Val = '' + local PercentIndex = string.find(v.Type, '%%') + if PercentIndex ~= nil then + Val = string.gsub(v.Type, '%%', '') + end + + str = str .. Val + if v.Unit ~= 'Special' then + str = str .. '+' .. r + str = str .. v.Unit + end + str = str .. '\n' + end + + self.TextBlock_Name:SetText(string.format("%s-%s", Quality, FittingType)) + self.TextBlock_Pos:SetText( WeaponType ) + self.TextBlock_Desc:SetText( "属性:".. str) + end +end + +function WBP_FittingItemInfo:OnMouseButtonUp(MyGeometry, InTouchEvent) + if UIManager.AllPanel[EUIType.Backpack]:GetOperateType() == EBagOperateType.None then + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, false) + end + if self.CurrentVisualItemWidget ~= nil then + self.CurrentVisualItemWidget:RestProperty() + end +end + +function WBP_FittingItemInfo:OnMouseMove(MyGeometry, MouseEvent) + --当鼠标移动的时候 + self:SetVisibility(ESlateVisibility.Collapsed) + return WBP_FittingItemInfo.SuperClass:OnMouseMove(MyGeometry, MouseEvent) +end + +--当移除的时候 +function WBP_FittingItemInfo:OnFocusLost(InFocusEvent) + print('[WBP_FittingItemInfo:OnFocusLost] 开始执行') + self:SetVisibility(ESlateVisibility.Collapsed) + return WBP_FittingItemInfo.SuperClass:OnFocusLost(InFocusEvent) +end + +return WBP_FittingItemInfo; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_FittingList.lua b/GZJ/Script/UI/ChildWidgets/WBP_FittingList.lua new file mode 100644 index 00000000..8188de50 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_FittingList.lua @@ -0,0 +1,76 @@ +---@class WBP_FittingList_C:UAEUserWidget +---@field VerticalBox_WidgetList UVerticalBox +---@field WBP_FittingItem_C_0 UWBP_FittingItem_C +---@field WBP_FittingItem_C_1 UWBP_FittingItem_C +---@field WBP_FittingItem_C_2 UWBP_FittingItem_C +---@field WBP_FittingItem_C_3 UWBP_FittingItem_C +--Edit Below-- +local WBP_FittingList = { bInitDoOnce = false; }; + +--function WBP_FittingList:Construct() +-- -- 将所有的都设置为空 +--end + +-- 这里传入的是一个具体的列表{{id, count}, {id, count}, ...} +function WBP_FittingList:SetFittingListData(InDataArr) + for i = 1, 4 do + -- 通过 Id 进行数据获取 + if i <= #InDataArr then + self:SetFittingListItemData(i, InDataArr[i]) + else + self:CloseItemWidget(i) + end + end +end + +function WBP_FittingList:SetFittingListItemData(InNum, InData) + local Widget = self:GetItemByIndex(InNum) + Widget:SetFittingItemData(InData) +end + +function WBP_FittingList:CloseItemWidget(InNum) + local Widget = self:GetItemByIndex(InNum) + Widget:CloseWidget() +end + +function WBP_FittingList:GetItemByIndex(InIndex) + return self.VerticalBox_WidgetList:GetChildAt(InIndex - 1) +end + +function WBP_FittingList:Clear() + for i = 1, self.VerticalBox_WidgetList:GetChildrenCount() do + self:CloseItemWidget(i) + end +end + +function WBP_FittingList:Tick(MyGeometry, InDeltaTime) + --print(string.format("[WBP_FittingList:Tick] 列表组件执行 Tick")) + --for i = 1, self.VerticalBox_WidgetList:GetChildrenCount() do + -- self.VerticalBox_WidgetList:GetChildAt(i - 1):Tick(MyGeometry, InDeltaTime) + --end +end + +-- function WBP_FittingList:Destruct() + +-- end + +function WBP_FittingList:GetListItems() + local ret = {} + for i = 1, 4 do + table.insert(ret, self.VerticalBox_WidgetList:GetChildAt(i - 1)) + end + return ret +end + +-- +function WBP_FittingList:OnDrop(MyGeometry, PointerEvent, Operation) + local ItemData = Operation:GetItemData() + local Type = Operation:GetDropItemType() + if Type == EItemDropType.CancelGenerate then + EventSystem:SendEvent(EventType.CloseGenerateItem, ItemData.ItemID) + else + return + end +end + +return WBP_FittingList; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_GenerateAllButton.lua b/GZJ/Script/UI/ChildWidgets/WBP_GenerateAllButton.lua new file mode 100644 index 00000000..92966dab --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_GenerateAllButton.lua @@ -0,0 +1,27 @@ +---@class WBP_GenerateAllButton_C:UUserWidget +---@field Button_GenerateAll UButton +---@field Image_0 UImage +--Edit Below-- +local WBP_GenerateAllButton = { + bInitDoOnce = false; +}; + +function WBP_GenerateAllButton:Construct() + WBP_GenerateAllButton.SuperClass.Construct(self) + + self.Button_GenerateAll.OnClicked:Add(self.OnClickGenerateAll, self); +end + +-- function WBP_GenerateAllButton:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_GenerateAllButton:OnClickGenerateAll() + UIManager:GetPanel(EUIType.Backpack):GenerateAllItem() +end + +-- function WBP_GenerateAllButton:Destruct() + +-- end + +return WBP_GenerateAllButton; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_GenerateInfo.lua b/GZJ/Script/UI/ChildWidgets/WBP_GenerateInfo.lua new file mode 100644 index 00000000..08dc7660 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_GenerateInfo.lua @@ -0,0 +1,194 @@ +---@class WBP_GenerateInfo_C:UUserWidget +---@field Button_Cancel UButton +---@field Button_Ok UButton +---@field VerticalBox_ItemList UVerticalBox +--Edit Below-- +local WBP_GenerateInfo = { + bInitDoOnce = false; + SelectedItems = {}, -- 这里面只是几个Id + OwningPawn = nil, +}; + +function WBP_GenerateInfo:Construct() + EventSystem:AddListener(EventType.CloseGenerateItem, WBP_GenerateInfo.OnCancelGenerateItem, self) + self.Button_Ok.OnClicked:Add(WBP_GenerateInfo.OnClickOk, self) + self.Button_Cancel.OnClicked:Add(WBP_GenerateInfo.OnClickCancel, self) + for i = 1, 3 do + self.VerticalBox_ItemList:GetChildAt(i - 1):SetVisibility(ESlateVisibility.Collapsed) + end +end + +-- function WBP_GenerateInfo:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_GenerateInfo:Destruct() + EventSystem:RemoveListener(EventType.CloseGenerateItem, WBP_GenerateInfo.OnCancelGenerateItem, self) + self.Button_Ok.OnClicked:Remove(WBP_GenerateInfo.OnClickOk, self) + self.Button_Cancel.OnClicked:Remove(WBP_GenerateInfo.OnClickCancel, self) +end + +function WBP_GenerateInfo:OnClickOk() + if #self.SelectedItems ~= 3 then + UIManager:ShowGeneralNotice(string.format("当前选择的数量太少,无法进行合成")) + return + end + -- 判断一下是否都是同样的东西(配件 / 技能) + local PC = GameDataManager.GetLocalPlayerController() + PC:GenerateItemList(self.SelectedItems) + print(string.format('合成结束,检查一下')) + UIManager.AllPanel[EUIType.Backpack]:CloseOperation(EBagOperateType.Generate) + self:Clear() +end + +function WBP_GenerateInfo:Clear() + for i = 1, 3 do + self.VerticalBox_ItemList:GetChildAt(i - 1):SetVisibility(ESlateVisibility.Collapsed) + end + self.SelectedItems = {} +end + +function WBP_GenerateInfo:GetOwningBackpackComponent() + local PlayerController = STExtraGameplayStatics.GetFirstPlayerController(self) + if PlayerController then + self.OwningPawn = PlayerController:GetPlayerCharacterSafety() + end +end + +function WBP_GenerateInfo:OnClickCancel() + self:Clear() + UIManager.AllPanel[EUIType.Backpack]:CloseOperation(EBagOperateType.Generate) +end + +function WBP_GenerateInfo:OnCancelGenerateItem(InItemId) + -- 查找一下 + local AttRemoveId = 0 + for i, v in pairs(self.SelectedItems) do + if v == InItemId then + AttRemoveId = i + end + end + + table.remove(self.SelectedItems, AttRemoveId) + -- 刷新一下 + self:RefreshItems() +end + +--当拖拽的时候放到的位置 +function WBP_GenerateInfo:OnDrop(MyGeometry, PointerEvent, Operation) + WBP_GenerateInfo.SuperClass:OnDrop(MyGeometry, PointerEvent, Operation) + local ItemData = Operation:GetItemData() + + if ItemData ~= nil then + self:AddItem(ItemData) + end +end + +function WBP_GenerateInfo:RemoveItem(InItemId) + local RemoveIdIndex = 0 + print(string.format('[WBP_GenerateInfo:RemoveItem] 开始移除物品')) + for i = 1, #self.SelectedItems do + print(string.format('拥有的 Id == %d', self.SelectedItems[i])) + if self.SelectedItems[i] == InItemId then + RemoveIdIndex = i + --break + end + end + + if RemoveIdIndex ~= 0 then + table.remove(self.SelectedItems, RemoveIdIndex) + print('[WBP_GenerateInfo:RemoveItem] 移除成功') + else + print(string.format('[WBP_GenerateInfo:RemoveItem] 未找到对应Id的,请检查 Id = %d', InItemId)) + end + self:RefreshItems() +end + +function WBP_GenerateInfo:CheckItemType(InItemId) + local NewAddItemQuality = GetItemQualityLevel(InItemId) + local CurrentItemQuality = 0 + local bHadCheck = false + if #self.SelectedItems > 0 then + CurrentItemQuality = GetItemQualityLevel(self.SelectedItems[1]) + if CurrentItemQuality == NewAddItemQuality then + bHadCheck = true + else + UIManager:ShowGeneralNotice(string.format("您选择的物品品质跟之前选择的不同,请选择相同品质的物品进行合成")) + end + else + bHadCheck = true + end + + if bHadCheck then + if #self.SelectedItems > 0 then + if GetItemGrantTypeById(InItemId) ~= GetItemGrantTypeById(self.SelectedItems[1]) then + bHadCheck = false + UIManager:ShowGeneralNotice(string.format("您选择的物品类型跟之前选择的不同,请选择相同类型的物品进行合成")) + end + end + end + + return bHadCheck +end + +function WBP_GenerateInfo:FindInnerCountById(InId) + local TotalCount = 0 + for _, v in pairs(self.SelectedItems) do + if InId == v then + TotalCount = TotalCount + 1 + end + end + return TotalCount +end + +function WBP_GenerateInfo:AddItem(ItemData) + print('【WBP_GenerateInfo:AddItem】进入') + + if GetItemQualityLevel(ItemData.ItemID) >= EQualityType.Super then + UIManager:ShowGeneralNotice("超级的物品无法合成", true) + return + end + + local Count = UIManager.AllPanel[EUIType.Backpack]:FindItemCountById(ItemData.ItemID) + local HadAddCount = self:FindInnerCountById(ItemData.ItemID) + + local bHadCheck = self:CheckItemType(ItemData.ItemID) + if not bHadCheck then + return + end + if Count <= HadAddCount then + --提示一下 + UIManager:ShowGeneralNotice(string.format("当前选择的数量已经足够了,无法继续添加")) + else + if table.getCount(self.SelectedItems) < 3 then + --放进来 + table.insert(self.SelectedItems, ItemData.ItemID) + --else + -- UIManager:ShowGeneralNotice(string.format("当前已经满员了,请移除之后再添加")) + end + end + + self:RefreshItems() +end + +function WBP_GenerateInfo:RefreshItems() + for i = 1, 3 do + if i <= #self.SelectedItems then + self.VerticalBox_ItemList:GetChildAt(i - 1):SetGenerateData(self.SelectedItems[i]) + self.VerticalBox_ItemList:GetChildAt(i - 1):SetVisibility(ESlateVisibility.Visible) + else + self.VerticalBox_ItemList:GetChildAt(i - 1):SetVisibility(ESlateVisibility.Collapsed) + end + end +end + +-- 获取当前将要合成的类型 +function WBP_GenerateInfo:GetCurrentType() + if #self.SelectedItems == 0 then + return -1 + end + + return GetItemTypeByItemId(self.SelectedItems[1]) +end + +return WBP_GenerateInfo; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_GenerateItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_GenerateItem.lua new file mode 100644 index 00000000..0c919a3f --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_GenerateItem.lua @@ -0,0 +1,107 @@ +---@class WBP_GenerateItem_C:UUserWidget +---@field CanvasPanel_Main UCanvasPanel +---@field ItemIconAndBG UWBP_WeaponItemFitting_C +---@field TextBlock_ItemCount UTextBlock +---@field TextBlock_ItemType UTextBlock +---@field TextBlock_Quality UTextBlock +--Edit Below-- +local WBP_GenerateItem = { + bInitDoOnce = false; + DragDropClass = nil, + --拖拽显示的类 + DragVisualClass = nil, + ItemId = 0, + VisualWidget = nil, + GenerateDragTimerHandler = nil, +}; + +function WBP_GenerateItem:Construct() + -- 设置数据 + self.DragDropClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/BP_FittingDragDropData.BP_FittingDragDropData_C')) + self.DragVisualClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_DragItemVisual.WBP_DragItemVisual_C')) +end + +function WBP_GenerateItem:SetGenerateData(InItemId) + self.ItemId = InItemId + print(string.format("开始设置数据:Id:%d", InItemId)) + if GameDataManager then + local Val = GameDataManager.GetItemInfoByItemID(InItemId) + self.ItemIconAndBG:SetItemIcon(Val.Icon) + self.ItemIconAndBG:SetItemBGColor(GetItemQualityLevel(InItemId)) + self.TextBlock_ItemCount:SetText('1') + local TextVal + if InItemId > 20000 then + TextVal = DropItemMap.SkillItemMap[InItemId].SkillName + else + local val = GetItemWeaponTypeByItemId(InItemId) + TextVal = Tables.WeaponClassTypeDesc[val][1] + end + + self.TextBlock_ItemType:SetText(TextVal) + + -- 设置质量 + local Quality = Tables.QualityInfo[GetItemQualityLevel(InItemId)][1] + self.TextBlock_Quality:SetText(string.format("%s", Quality)) + + -- 根据品质设置颜色 + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + print("[WBP_FittingItem:SetItemData] 当前 GameDataManager 没有值,请检查一下是否有保存") + end + +end + +-- function WBP_GenerateItem:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_GenerateItem:Destruct() + +-- end + +function WBP_GenerateItem:OnMouseButtonDown(MyGeometry, PointerEvent) + --当点击的时候 + local ret = self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) + print(string.format('[WBP_GenerateItem:OnMouseButtonDown] 识别到鼠标按下')) + local GameState = UGCGameSystem.GameState + if UE.IsValid(self.DragVisualClass) and UE.IsValid(GameState) then + self.VisualWidget = UserWidget.NewWidgetObjectBP(GameState, self.DragVisualClass) + local that = self + self.GenerateDragTimerHandler = EventSystem.SetTimerLoop(self, function() + if that.VisualWidget.bHasInit then + EventSystem.StopTimer(that.GenerateDragTimerHandler) + local ItemData = { + ItemID = that.ItemId, + ItemCount = 1 + } + that.VisualWidget:SetVisualItemData(ItemData, that.ItemIconAndBG:GetItemIcon()) + end + end, 0.05) + end + print(string.format('[WBP_GenerateItem:OnMouseButtonDown] 开始进行拖拽')) + WidgetBlueprintLibrary.DetectDragIfPressed(PointerEvent, self, "LeftMouseButton") + + return ret +end + +function WBP_GenerateItem:OnMouseButtonUp(MyGeometry, InTouchEvent) + print('[WBP_GenerateItem:OnMouseButtonUp] 检测到鼠标抬起') + -- 移除即可 + UIManager.AllPanel[EUIType.Backpack].WBP_GenerateInfo:RemoveItem(self.ItemId) + return self.SuperClass:OnMouseButtonUp(MyGeometry, InTouchEvent) +end + +function WBP_GenerateItem:OnDragDetected(MyGeometry, PointerEvent, Operation) + print(string.format('[WBP_GenerateItem:OnDragDetected] 鼠标开始拖拽,开始进行赋值操作')) + Operation = UE.NewObject(nil, self.DragDropClass) + local ItemData = { + ItemID = self.ItemId, + ItemCount = 1 + } + Operation:SetOperationData(ItemData, EItemDropType.CancelGenerate) + Operation:SetOperationData(self.FittingData, EItemDropType.None) + Operation.DefaultDragVisual = self.VisualWidget + return Operation +end + +return WBP_GenerateItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_InheritItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_InheritItem.lua new file mode 100644 index 00000000..4969e74d --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_InheritItem.lua @@ -0,0 +1,27 @@ +---@class WBP_InheritItem_C:UUserWidget +---@field Image_Icon UImage +---@field TextBlock_Name UTextBlock +--Edit Below-- +local WBP_InheritItem = { bInitDoOnce = false; }; + +--[==[ Construct +function WBP_InheritItem:Construct() + +end +-- Construct ]==] + +-- function WBP_InheritItem:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_InheritItem:Destruct() + +-- end + +function WBP_InheritItem:SetItemInheritId(InId) + local Info = InheritTable.Items[InId] + self.TextBlock_Name:SetText(Info.Stage .. tostring(Info.Level) .. '级') + UIManager.LoadTexture(self.Image_Icon, Info.Icon) +end + +return WBP_InheritItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_InheritPanel.lua b/GZJ/Script/UI/ChildWidgets/WBP_InheritPanel.lua new file mode 100644 index 00000000..0fa692a4 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_InheritPanel.lua @@ -0,0 +1,158 @@ +---@class WBP_InheritPanel_C:UUserWidget +---@field Button_Operate UButton +---@field CanvasPanel_Select UCanvasPanel +---@field HorizontalBox_Money UHorizontalBox +---@field InheritItem_New UWBP_InheritItem_C +---@field InheritItem_Old UWBP_InheritItem_C +---@field TextBlock_ UTextBlock +---@field TextBlock_Benefit UTextBlock +---@field TextBlock_Inherit UTextBlock +---@field TextBlock_Money UTextBlock +---@field WBP_InheritSelectItem UWBP_InheritSelectItem_C +---@field WBP_InheritSelectItem_0 UWBP_InheritSelectItem_C +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +---@field WidgetSwitcher_Main UWidgetSwitcher +---@field WidgetSwitcher_Text UWidgetSwitcher +--Edit Below-- +local WBP_InheritPanel = { + bInitDoOnce = false; + IsBreak = false; -- 是否是突破 + SelectItem = ''; + CanOperate = true; +}; + +function WBP_InheritPanel:Construct() + self.WBP_WidgetHeader:Construct() + self.Button_Operate.OnClicked:Add(WBP_InheritPanel.ClickOperate, self) +end + +-- 在显示的时候执行的 +function WBP_InheritPanel:OnShowPanel() + -- 从 PS 获取 + local PS = GameDataManager.GetLocalPlayerState() + local KuiNum = PS.InheritItems['盔'] + local JiaNum = PS.InheritItems['甲'] + self.CanvasPanel_Select:GetChildAt(0):SetFirstData(KuiNum) + self.CanvasPanel_Select:GetChildAt(1):SetFirstData(JiaNum) + + self.WidgetSwitcher_Main:SetActiveWidgetIndex(0) + + NewPlayerGuideManager:RemoveGuide(9) +end + +function WBP_InheritPanel:Destruct() + self.Button_Operate.OnClicked:Remove(WBP_InheritPanel.ClickOperate, self) +end + +-- function WBP_InheritPanel:Tick(MyGeometry, InDeltaTime) + +-- end + +-- 设置老的 Id +function WBP_InheritPanel:SetInheritId(InInheritId) + -- 找到对应Id + local NextId = InheritTable.GetNextId(InInheritId) + self.InheritItem_Old:SetItemInheritId(InInheritId) + self.InheritItem_New:SetItemInheritId(NextId) + + -- 判断是否是 突破 + local Cost = InheritTable.Items[InInheritId].Cost + if Cost == '突破' then + self.IsBreak = true + self.WidgetSwitcher_Text:SetActiveWidgetIndex(1) + self.TextBlock_Benefit:SetVisibility(ESlateVisibility.Collapsed) + + else + self.IsBreak = false + self.TextBlock_Money:SetText(string.format('%d', Cost)) + self.WidgetSwitcher_Text:SetActiveWidgetIndex(0) + self.HorizontalBox_Money:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + local Benefit = InheritTable.Items[NextId].Benefit + + local FinalText = '' + for i = 1, #Benefit do + local Text = DropItemMap.ToText(Benefit[i]) + FinalText = FinalText .. Text .. '\n' + end + + self.TextBlock_Benefit:SetText(FinalText) + self.TextBlock_Benefit:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +function WBP_InheritPanel:SetSelectItem(InSelectText) + self.SelectItem = InSelectText + local PS = GameDataManager.GetLocalPlayerState() + local CurrId = PS.InheritItems[self.SelectItem] + self:SetInheritId(CurrId) + self.WidgetSwitcher_Main:SetActiveWidgetIndex(1) +end + +function WBP_InheritPanel:ClickOperate() + print(string.format('[WBP_InheritPanel:ClickOperate] 点击 Operate 按钮')) + if not self.CanOperate then + print(string.format('[WBP_InheritPanel:ClickOperate] 莫名其妙中断了')) + return + end + --print(string.format('[WBP_InheritPanel:ClickOperate] 可以点击')) + self.CanOperate = false + local PS = GameDataManager.GetLocalPlayerState() + local CurrId = PS.InheritItems[self.SelectItem] + --local NextId = InheritTable.GetNextId(CurrId) + + if not self.IsBreak then + -- 判断金币够不够 + local Info = InheritTable.Items[CurrId] + if Info ~= nil and Info.Cost > PS.CoinPoint.Current then + self:SetInheritId(CurrId) + UIManager:ShowGeneralNotice(string.format('您当前的金币不足')) + self.CanOperate = true + return + end + end + + print(string.format('[WBP_InheritPanel:ClickOperate] 确保已经发送出去了')) + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_Inherit", self.IsBreak, self.SelectItem, CurrId) +end + +function WBP_InheritPanel:CloseInheritWidget() + UIManager:ClosePanel(EUIType.Inherit) +end + +function WBP_InheritPanel:UpdateInherit(IsSuccess) + print(string.format('[WBP_InheritPanel:UpdateInherit] 更新一下')) + self.CanOperate = true + + -- 击杀成功 + if IsSuccess == 0 then + local PS = GameDataManager.GetLocalPlayerState() + local CurrId = PS.InheritItems[self.SelectItem] + local NextId = InheritTable.GetNextId(CurrId) + self.IsBreak = false + self:SetInheritId(NextId) + elseif IsSuccess == 1 then -- 扣除金币成功 + local PS = GameDataManager.GetLocalPlayerState() + local CurrId = PS.InheritItems[self.SelectItem] + local NextId = InheritTable.GetNextId(CurrId) + self.IsBreak = false + self:SetInheritId(NextId) + elseif IsSuccess == 2 then + self.IsBreak = true + elseif IsSuccess == 3 then + self.IsBreak = false + elseif IsSuccess == 4 then + + end + --if IsSuccess then + -- local PS = GameDataManager.GetLocalPlayerState() + -- local CurrId = PS.InheritItems[self.SelectItem] + -- local NextId = InheritTable.GetNextId(CurrId) + -- self.IsBreak = false + -- self:SetInheritId(NextId) + --else + -- self.IsBreak = true + --end +end + +return WBP_InheritPanel; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_InheritSelectItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_InheritSelectItem.lua new file mode 100644 index 00000000..b4db70e3 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_InheritSelectItem.lua @@ -0,0 +1,31 @@ +---@class WBP_InheritSelectItem_C:UUserWidget +---@field Button_Select UButton +---@field WBP_InheritItem UWBP_InheritItem_C +---@field NameText FText +--Edit Below-- +local WBP_InheritSelectItem = { bInitDoOnce = false; }; + +function WBP_InheritSelectItem:Construct() + self.Button_Select.OnClicked:Add(WBP_InheritSelectItem.OnClickSelect, self) +end + +-- function WBP_InheritSelectItem:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_InheritSelectItem:Destruct() + +-- end + +function WBP_InheritSelectItem:OnClickSelect() + UIManager.AllPanel[EUIType.Inherit]:SetSelectItem(self.NameText) + + NewPlayerGuideManager:RemoveGuide(17) + NewPlayerGuideManager:RemoveGuide(18) +end + +function WBP_InheritSelectItem:SetFirstData(InId) + self.WBP_InheritItem:SetItemInheritId(InId) +end + +return WBP_InheritSelectItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_InteractButton.lua b/GZJ/Script/UI/ChildWidgets/WBP_InteractButton.lua new file mode 100644 index 00000000..9e263ca9 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_InteractButton.lua @@ -0,0 +1,24 @@ +---@class WBP_InteractButton_C:UUserWidget +---@field Button_Trigger UNewButton +---@field Image_Icon UImage +---@field Icon FSlateBrush +---@field ButtonText FString +---@field BGIcon FSlateBrush +--Edit Below-- +local WBP_InteractButton = { + bInitDoOnce = false; +}; + +function WBP_InteractButton:Construct() + +end + +-- function WBP_InteractButton:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_InteractButton:Destruct() + +-- end + +return WBP_InteractButton; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_OperateButton.lua b/GZJ/Script/UI/ChildWidgets/WBP_OperateButton.lua new file mode 100644 index 00000000..5ec3bc89 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_OperateButton.lua @@ -0,0 +1,75 @@ +---@class WBP_OperateButton_C:UUserWidget +---@field Button_Title UButton +---@field TextBlock_Title UTextBlock +---@field WidgetSwitcher_BG UWidgetSwitcher +---@field ButtonText FText +---@field OperateType TEnumAsByte +--Edit Below-- +local WBP_OperateButton = { + bInitDoOnce = false, + FittingType = nil, + bClickButton = false, + ValText = nil, +}; + +function WBP_OperateButton:Construct() + self.Button_Title.OnClicked:Add(WBP_OperateButton.OnClickTitle, self) + self.WidgetSwitcher_BG:SetActiveWidgetIndex(1) + self:SetDefaultText() +end + +function WBP_OperateButton:Destruct() + self.Button_Title.OnClicked:Remove(WBP_OperateButton.OnClickTitle, self) +end + +function WBP_OperateButton:OnClickTitle() + -- 设置数据进去 + -- 设置对应数据进去 + self:ClickTitle(self.bClickButton) + UIManager:ClosePanel(EUIType.UseSkill) +end + +function WBP_OperateButton:ClickTitle(bClicked) + -- 需要根据具体类型进行判断 + if bClicked then self:OtherOperate() else self:StartOperate() end +end + +function WBP_OperateButton:StartOperate() + -- 是执行对应操作,比如合成就是要选择三个 + -- 说明此时是显示 + if self.OperateType == EBagOperateType.Reset then + -- 检查一下背包中的数量 + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + local Stones = PC:GetItemMapByItemType(EItemType.SubstituteStone) + local ItemCount = 0 + if Stones ~= nil then + for _, v in pairs(Stones) do + ItemCount = ItemCount + v + end + end + if ItemCount <= 0 then + UIManager:ShowGeneralNotice("置换石的数量不足,请检查一下", true) + return + end + end + EventSystem:SendEvent(EventType.BagOperation, self.OperateType) + + print(string.format('当前点击的按钮的类型是:%d', self.OperateType)) + self.TextBlock_Title:SetText("取消") + self.WidgetSwitcher_BG:SetActiveWidgetIndex(0) + self.bClickButton = true +end + +function WBP_OperateButton:OtherOperate() + EventSystem:SendEvent(EventType.CancelBagOperation, self.OperateType) + -- 说明此时就是取消 + self:SetDefaultText() +end + +function WBP_OperateButton:SetDefaultText() + self.bClickButton = false + self.TextBlock_Title:SetText(self.ButtonText) + self.WidgetSwitcher_BG:SetActiveWidgetIndex(1) +end + +return WBP_OperateButton; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_OperationIcon.lua b/GZJ/Script/UI/ChildWidgets/WBP_OperationIcon.lua new file mode 100644 index 00000000..169552f7 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_OperationIcon.lua @@ -0,0 +1,22 @@ +---@class WBP_OperationIcon_C:UUserWidget +---@field Image_Icon UImage +---@field TextBlock_Operate UTextBlock +---@field ButtonText FText +---@field StoneIcon FSlateBrush +--Edit Below-- +local WBP_OperationIcon = {}; + +function WBP_OperationIcon:Construct() + WBP_OperationIcon.SuperClass.Construct(self) + self:SetStoneText(self.ButtonText) +end + +function WBP_OperationIcon:Destruct() + WBP_OperationIcon.SuperClass.Destruct(self) +end + +function WBP_OperationIcon:SetStoneText(InText) + self.TextBlock_Operate:SetText(InText) +end + +return WBP_OperationIcon; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_PlayerInfo.lua b/GZJ/Script/UI/ChildWidgets/WBP_PlayerInfo.lua new file mode 100644 index 00000000..e7850dd4 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_PlayerInfo.lua @@ -0,0 +1,59 @@ +---@class WBP_PlayerInfo_C:UUserWidget +---@field ProgressBar_Energy UProgressBar +---@field ProgressBar_Exp UProgressBar +---@field ProgressBar_Health UProgressBar +---@field TextBlock_Health UTextBlock +--Edit Below-- +local WBP_PlayerInfo = { + bInitDoOnce = false; +}; + +function WBP_PlayerInfo:Construct() + self.SuperClass:Construct() + + local OwningPawn = GameDataManager.GetLocalPlayerController():GetPlayerCharacterSafety() + self.PlayerKey = GameDataManager.GetLocalPlayerController().PlayerKey + self:OnHealthChanged(self.PlayerKey, UGCPawnAttrSystem.GetHealth(OwningPawn), UGCPawnAttrSystem.GetHealth(OwningPawn), 0) + self:OnEnergyChanged(self.PlayerKey, OwningPawn.EnergyData.Cur, OwningPawn.EnergyData.Max) + self:OnExpChanged(UGCGameSystem.GameState:GetAllPlayerExp()) + + EventSystem:AddListener(EventType.OnPlayerExpChanged, WBP_PlayerInfo.OnExpChanged, self) + EventSystem:AddListener(EventType.OnPlayerHPChanged, WBP_PlayerInfo.OnHealthChanged, self) + EventSystem:AddListener(EventType.OnPlayerEnergyChanged, WBP_PlayerInfo.OnEnergyChanged, self) +end + +-- function WBP_PlayerInfo:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_PlayerInfo:Destruct() + EventSystem:RemoveListener(EventType.OnPlayerExpChanged, WBP_PlayerInfo.OnExpChanged, self) + EventSystem:RemoveListener(EventType.OnPlayerHPChanged, WBP_PlayerInfo.OnHealthChanged, self) + EventSystem:RemoveListener(EventType.OnPlayerEnergyChanged, WBP_PlayerInfo.OnEnergyChanged, self) +end + +function WBP_PlayerInfo:OnExpChanged(PlayerAllExp) + for PlayerKey, ExpInfo in pairs(PlayerAllExp) do + if self.PlayerKey == PlayerKey then + self.ProgressBar_Exp:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.ProgressBar_Exp:SetPercent(ExpInfo.CurExp / ExpInfo.TotalExp) + return + end + end + self.ProgressBar_Exp:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_PlayerInfo:OnHealthChanged(InPlayerKey, CurHP, MaxHP, PrevHP) + if self.PlayerKey == InPlayerKey then + self.ProgressBar_Health:SetPercent(CurHP / MaxHP) + self.TextBlock_Health:SetText(string.format('%d / %d', math.floor(CurHP), math.floor(MaxHP))) + end +end + +function WBP_PlayerInfo:OnEnergyChanged(InPlayerKey, CurEnergy, MaxEnergy) + if self.PlayerKey == InPlayerKey then + self.ProgressBar_Energy:SetPercent(CurEnergy / MaxEnergy) + end +end + +return WBP_PlayerInfo; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_RewardItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_RewardItem.lua new file mode 100644 index 00000000..e7523cb4 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_RewardItem.lua @@ -0,0 +1,50 @@ +---@class WBP_RewardItem_C:UUserWidget +---@field Button_Rewards UButton +---@field Image_0 UImage +---@field TextBlock_Rewards UTextBlock +--Edit Below-- +local WBP_RewardItem = { bInitDoOnce = false; RewardsItem = nil}; + +function WBP_RewardItem:Construct() + self.Button_Rewards.OnClicked:Add(WBP_RewardItem.OnSelectRewards, self) +end + +-- function WBP_RewardItem:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_RewardItem:Destruct() + self.Button_Rewards.OnClicked:Remove(WBP_RewardItem.OnSelectRewards, self) +end + +function WBP_RewardItem:SetRewardsData(InData) + self.RewardsItem = InData + + -- 拼装 Text + local Unit = '+' + if InData.Type == '配件' or InData.Type == '技能书' then + Unit = '*' + end + + local Value, Type + if math.type(InData.Value) == 'float' then + Value = string.format('%2.2f', InData.Value) + else + Value = tostring(InData.Value) + end + Type = InData.Type + if string.find(Type, '%%') ~= nil then + Type = string.gsub(Type, '%%', '') + Value = string.format('%.1f%%', InData.Value * 100) + end + self.TextBlock_Rewards:SetText(Type .. Unit .. Value) +end + +function WBP_RewardItem:OnSelectRewards() + UIManager:HidePanel(EUIType.SealRewards) + + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_ApplyRewards", self.RewardsItem) +end + +return WBP_RewardItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillButton.lua b/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillButton.lua new file mode 100644 index 00000000..7dc500f8 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillButton.lua @@ -0,0 +1,33 @@ +---@class WBP_SelectSkillButton_C:UUserWidget +---@field Button_Select UButton +---@field Image_BG_1 UImage +---@field Image_BG_2 UImage +---@field ButtonText FString +--Edit Below-- +local WBP_SelectSkillButton = { bInitDoOnce = false; }; + +function WBP_SelectSkillButton:Construct() + self.Button_Select.OnClicked:Add(WBP_SelectSkillButton.OnClickSelect, self) +end + +-- function WBP_SelectSkillButton:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_SelectSkillButton:OnClickSelect() + UIManager:GetPanel(EUIType.SelectSkill):SelectSkillType(self.ButtonText); + + NewPlayerGuideManager:RemoveGuide(3) +end + +function WBP_SelectSkillButton:SetIsSelected(Flag) + if Flag then + self.Image_BG_1:SetVisibility(ESlateVisibility.Collapsed) + self.Image_BG_2:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + self.Image_BG_1:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.Image_BG_2:SetVisibility(ESlateVisibility.Collapsed) + end +end + +return WBP_SelectSkillButton; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillItem.lua new file mode 100644 index 00000000..abd880e7 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillItem.lua @@ -0,0 +1,60 @@ +---@class WBP_SelectSkillItem_C:UUserWidget +---@field Button_Main UButton +---@field IconAndBG UWBP_WeaponItemFitting_C +---@field TextBlock_SkillName UTextBlock +---@field SlotNum int32 +--Edit Below-- +local WBP_SelectSkillItem = { + bInitDoOnce = false; + SkillItemID = 0; + SkillIdToReplace = 0; + ParentWidget = nil; +}; + +function WBP_SelectSkillItem:Construct() + self.Button_Main.OnClicked:Add(WBP_SelectSkillItem.ClickSkill, self) +end + +-- function WBP_SelectSkillItem:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_SelectSkillItem:SetParentWidget(InWidget) + self.ParentWidget = InWidget +end + +function WBP_SelectSkillItem:SetSlotNum(InNum) + self.SlotNum = InNum +end + +function WBP_SelectSkillItem:Destruct() + self.Button_Main.OnClicked:Remove(WBP_SelectSkillItem.ClickSkill, self) +end + +function WBP_SelectSkillItem:ClickSkill() + if self.SkillIdToReplace ~= 0 then + -- 调用 PlayerController 中的方法进行更换 + local PC = GameDataManager.GetLocalPlayerController() + print(string.format('[WBP_SelectSkillItem:ClickSkill] 选择Skill:%d', self.SkillIdToReplace)) + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GiveSkill", GameDataManager.GetSkillNameById(self.SkillIdToReplace), self.SlotNum, GameDataManager.GetSkillLevelById(self.SkillIdToReplace)) + UIManager:ClosePanel(EUIType.UseSkill) + end +end + +function WBP_SelectSkillItem:SetReplaceItemId(InId) + -- 检查当前是否有 + self.SkillIdToReplace = InId; +end + +function WBP_SelectSkillItem:SetLastItemId(InId) + -- 显示出来对应的 + -- 找到对应描述和图标 + self.SkillItemID = InId + print(string.format('[WBP_SelectSkillItem:SetLastItemId] ItemId = %d', InId)) + local ItemInfo = GameDataManager.GetItemInfoByItemID(InId) + self.IconAndBG:SetItemIcon(ItemInfo.Icon) + self.IconAndBG:SetItemBGColor(GetItemQualityLevel(InId)) + self.TextBlock_SkillName:SetText(DropItemMap.SkillItemMap[InId].SkillName) +end + +return WBP_SelectSkillItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillSlots.lua b/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillSlots.lua new file mode 100644 index 00000000..daaa30f3 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_SelectSkillSlots.lua @@ -0,0 +1,72 @@ +---@class WBP_SelectSkillSlots_C:UUserWidget +---@field CanvasPanel_Main UCanvasPanel +---@field HorizontalBox_Skills UHorizontalBox +---@field WBP_SelectSkillItem UWBP_SelectSkillItem_C +---@field WBP_SelectSkillItem_0 UWBP_SelectSkillItem_C +---@field WBP_SelectSkillItem_1 UWBP_SelectSkillItem_C +---@field WBP_SkillSelectButton UWBP_SkillSelectButton_C +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +---@field WidgetSwitcher_Main UWidgetSwitcher +--Edit Below-- +local WBP_SelectSkillSlots = { + bInitDoOnce = false; + SkillItemId = 0; +}; + +function WBP_SelectSkillSlots:Construct() + WBP_SelectSkillSlots.SuperClass:Construct() + self.WBP_WidgetHeader:Construct() +end + +function WBP_SelectSkillSlots:InitFromParam(InData, InPos) + self:ShowSelectSkill(InData, InPos) +end + +function WBP_SelectSkillSlots:ShowSelectSkill(InItem, InPosition) + print(string.format('[WBP_SelectSkillSlots:ShowSelectSkill] 显示选择')) + local CanvasSlot = self.CanvasPanel_Main.Slot + CanvasSlot:SetPosition(InPosition) + self:InitData(InItem.ItemID) +end + +function WBP_SelectSkillSlots:InitData(InId) + -- 初始化数据 + print(string.format('[WBP_SelectSkillSlots:InitData] 初始化Id = %d', InId)) + self.SkillItemId = InId + local PC = GameDataManager.GetLocalPlayerController() + local InitiativeSkillSlots = PC:GetInitiativeSkillSlots() + if #InitiativeSkillSlots < 3 then + -- 此时是 select Button + self.WidgetSwitcher_Main:SetActiveWidgetIndex(1) + self.WBP_SkillSelectButton:SetSkillId(self.SkillItemId) + else + self.WidgetSwitcher_Main:SetActiveWidgetIndex(0) + self:FillDatas() + end +end + +-- 填充数据到背包中 +function WBP_SelectSkillSlots:FillDatas() + print(string.format('[WBP_SelectSkillSlots:FillDatas] 填充数据')) + local PC = GameDataManager.GetLocalPlayerController() + local InitiativeSkillSlots = PC:GetInitiativeSkillSlots() + print(string.format('[WBP_SelectSkillSlots:FillDatas] 主动技能数量:%d', #InitiativeSkillSlots)) + for i = 1, #InitiativeSkillSlots do + local Slot = InitiativeSkillSlots[i] + if i <= 3 then + local ItemId = PC.ActiveSkillNameList[Slot].SkillName * 100 + PC.ActiveSkillNameList[Slot].SkillLevel * 10 + 20000 + self.HorizontalBox_Skills:GetChildAt(i - 1):SetLastItemId(ItemId) + self.HorizontalBox_Skills:GetChildAt(i - 1):SetReplaceItemId(self.SkillItemId) + end + end +end + +-- function WBP_SelectSkillSlots:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_SelectSkillSlots:Destruct() + +-- end + +return WBP_SelectSkillSlots; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_SelectWeaponItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_SelectWeaponItem.lua new file mode 100644 index 00000000..d93958c2 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_SelectWeaponItem.lua @@ -0,0 +1,91 @@ +---@class WBP_SelectWeaponItem_C:UUserWidget +---@field Button_WeaponItem UNewButton +---@field Image_Icon UImage +---@field Image_Selected UImage +---@field Image_Weapon UImage +---@field Panel_Weapon_1 UCanvasPanel +---@field TextBlock_Desc UTextBlock +---@field TextBlock_WeaponName UTextBlock +---@field WeaponName FText +--Edit Below-- +local WBP_SelectWeaponItem = { + bInitDoOnce = false, + bHasClick = false, + WeaponId = 0, +}; + +function WBP_SelectWeaponItem:Construct() + self.Button_WeaponItem.OnClicked:Add(WBP_SelectWeaponItem.OnClickWeaponItem, self) + self.Button_WeaponItem:SetTouchMethod(EButtonTouchMethod.PreciseTap) +end + +-- function WBP_SelectWeaponItem:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_SelectWeaponItem:Destruct() + self.Button_WeaponItem.OnClicked:Remove(WBP_SelectWeaponItem.OnClickWeaponItem, self) +end + +function WBP_SelectWeaponItem:SetIsSelect(InIsSelect) + if InIsSelect then + self.Image_Selected:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + self.Image_Selected:SetVisibility(ESlateVisibility.Collapsed) + end +end + +-- 设置默认数据 +function WBP_SelectWeaponItem:SetDefaultData(InWeaponId) + self.WeaponId = InWeaponId + local Data = GameDataManager.GetWeaponConstructDataByID(InWeaponId) + if Data == nil then + UE.Log("[WBP_SelectWeaponItem:SetDefaultData] Data is nil") + return + end + local Val = DropItemMap.WeaponTable[Data.WeaponType] + + self.TextBlock_WeaponName:SetText(Val.ChineseName) + self.TextBlock_Desc:SetText(Val.Text) + local Icon = UE.LoadObject(Val.Sign) + self.Image_Icon:SetBrushFromTexture(Icon) + + local WeaponIcon = UE.LoadObject(Val.Icon) + + -- 调整 + local IconSlot = WidgetLayoutLibrary.SlotAsCanvasSlot(self.Image_Weapon) + -- 算一下比例 + local NewIconX = 32 / 80 * WeaponIcon:Blueprint_GetSizeX() + IconSlot:SetSize({ X = NewIconX, Y = 32 }) + + self.Image_Weapon:SetBrushFromTexture(WeaponIcon) + self.Image_Selected:SetVisibility(ESlateVisibility.Collapsed) +end + +--现在是点一下就拿到 +function WBP_SelectWeaponItem:OnClickWeaponItem() + --添加到背包中 + + -- local PlayerController = GameDataManager.GetLocalPlayerController() + -- --local Pawn = PlayerController.Pawn + -- local OwningPawn = PlayerController:GetPlayerCharacterSafety() + -- print(string.format("[WBP_SelectWeaponItem:OnClickWeaponItem] 要添加的武器 Id = %d", self.WeaponId)) + -- -- 获取当前玩家 + -- local PlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(OwningPawn) + -- print(string.format("[WBP_SelectWeaponItem:OnClickWeaponItem] InPlayerKey = %d", PlayerKey)) + -- UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_AddWeapon", self.WeaponId, PlayerKey) + + -- 提示背包添加 + + local PlayerController = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_StartSpawnBreachMonster", self.WeaponId) + + UIManager:ShowGeneralNotice("已选择突破奖励,即将生成突破怪") + + EventSystem:SendEvent(EventType.ToggleBreachButton, false) + UIManager:HidePanel(EUIType.SelectWeapon) + + NewPlayerGuideManager:TriggerGuide(29) +end + +return WBP_SelectWeaponItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_SettleSave.lua b/GZJ/Script/UI/ChildWidgets/WBP_SettleSave.lua new file mode 100644 index 00000000..3bd04f8b --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_SettleSave.lua @@ -0,0 +1,431 @@ +---@class WBP_SettleSave_C:UUserWidget +---@field ScrollBox_SaveItems UScrollBox +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_SettleSave = { + bInitDoOnce = false; + + -- 存放数组,如果之后需要改变排序,直接改变即可,不需要在计算一遍 + SaveGames = { + }, + -- 对象池初始化数量 + InitCount = 0, + FirstOpen = true; +}; + +function WBP_SettleSave:Construct() + WBP_SettleSave.SuperClass.Construct(self) + + self.ScrollBox_SaveItems:ClearChildren() +end + +-- function WBP_SettleSave:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_SettleSave:Destruct() + +-- end + +function WBP_SettleSave:ShowArchive() + print(string.format("[WBP_SettleSave:ShowArchive] 进入")) + if self.FirstOpen == false then + return + end + self.FirstOpen = false; + -- 这里面就是变化,还是要根据每一个具体显示 + local Results = self:CompareArchive() + log_tree("[WBP_SettleSave:ShowArchive] Results = ", Results) + -- 显示存档,根据顺序进行排列 + self:ShowItem_GameClearance(Results.GameClearanceDiff) + self:ShowItem_Credit(Results.CreditDiff) + self:ShowItem_EasterEggs(Results.EasterEggsDiff) + self:ShowItem_Achievement(Results.AchievementDiff) + self:ShowItem_GameDrop(Results.GameDropDiff) + self:ShowItem_BossDrop(Results.BossDropDiff) + print(string.format("[WBP_SettleSave:ShowArchive] 显示完全")) + -- 设置数据 + self:SetItemInfos(); + print(string.format("[WBP_SettleSave:ShowArchive] 设置完全")) +end + +function WBP_SettleSave:SetItemInfos() + log_tree("[WBP_SettleSave:SetItemInfos] self.SaveGames = ", self.SaveGames) + local ChildrenCount = self.ScrollBox_SaveItems:GetChildrenCount() + local SaveGameCount = #self.SaveGames + if ChildrenCount < SaveGameCount then + self:InitObjectPool(SaveGameCount - ChildrenCount) + end + for i, Info in pairs(self.SaveGames) do + self.ScrollBox_SaveItems:GetChildAt(i - 1):SetSaveInfo(Info) + self.ScrollBox_SaveItems:GetChildAt(i - 1):SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +--比较前后变化 +function WBP_SettleSave:CompareArchive() + local BeforeArchive = GameDataManager.GetLocalPlayerState().SavedArchiveData + local LastArchive = GameDataManager.GetLocalPlayerState().ArchiveData; + + local Results = {} + + Results.GameClearanceDiff = self:GameClearanceDiff(BeforeArchive["PlayedGames"], LastArchive["PlayedGames"]) + Results.CreditDiff = self:CreditDiff(BeforeArchive["Score"], LastArchive["Score"]) + Results.EasterEggsDiff = self:EasterEggsDiff(BeforeArchive["EasterEggs"], LastArchive["EasterEggs"]) + + -- 成就类 + Results.AchievementDiff = {} + Results.AchievementDiff["通关"] = self:AchievementDiff("通关", BeforeArchive.GameClearanceTimes, LastArchive.GameClearanceTimes) + Results.AchievementDiff["击败"] = self:AchievementDiff("击败", BeforeArchive.TotalBossKilledTimes, LastArchive.TotalBossKilledTimes) + Results.AchievementDiff["金币"] = self:AchievementDiff("金币", BeforeArchive.TotalCoinPoint / 10000, LastArchive.TotalCoinPoint / 10000) + Results.AchievementDiff["科技点"] = self:AchievementDiff("科技点", BeforeArchive.TotalKillPoint, LastArchive.TotalKillPoint) + Results.AchievementDiff["技能"] = self:AchievementDiff("技能", BeforeArchive.TotalSuperSkill, LastArchive.TotalSuperSkill) + Results.AchievementDiff["配件"] = self:AchievementDiff("配件", BeforeArchive.TotalSuperFitting, LastArchive.TotalSuperFitting) + Results.AchievementDiff["开箱"] = self:AchievementDiff("开箱", BeforeArchive.TotalUnpackTimes, LastArchive.TotalUnpackTimes) + + Results.GameDropDiff = self:GameDropDiff(BeforeArchive.GameDropItems, LastArchive.GameDropItems) + + Results.BossDropDiff = self:BossDropDiff(BeforeArchive.BossDropItems, LastArchive.BossDropItems) + + -- 精简一下 + for i, v in pairs(Results) do + if table.isEmpty(v) == true then + Results[i] = nil; + end + end + + return Results; +end + +-- 返回新增的存档,数据结构如下 +-- { +-- [Difficult] = { Time1 } +-- } +--- 例如: +--- { +--- [10] = { 3, 5 } +---} +function WBP_SettleSave:GameClearanceDiff(InOld, InLast) + local Results = {} + -- 记录增量变化 + + -- 去检查一下 ArchiveTable 中当前的存档 + local Func = function(InDiff, InTimes) + local ValTable = { + [InDiff] = {} + } + ValTable[InDiff] = {} + for i, v in pairs(ArchiveTable.GameClearanceRewards[InDiff]) do + if InTimes >= i then + table.insert(ValTable[InDiff], i); + end + end + return ValTable; + end + + -- InTable: Results; InAddTable: [Diff] = { Times } + local AddResultFunc = function(InAddTable) + for i, v in pairs(InAddTable) do + Results[i] = v + end + end + + for Diff, Times in pairs(InLast) do + if InOld[Diff] == nil then + -- 说明全部是新的 + local NewAdd = Func(Diff, Times) + AddResultFunc(NewAdd) + else + -- 判断当前已经打到第几个阶段了 + local OldTable = Func(Diff, InOld[Diff]) + local NewTable = Func(Diff, Times) + -- 做插值 + local DiffTable = table.Diff(OldTable, NewTable) + AddResultFunc(DiffTable) + end + end + + return Results; +end + +function WBP_SettleSave:CreditDiff(InOld, InLast) + local Results = {} + + -- 获取积分的最大值 + local Func = function(Val) + local Max = 0 + for i, v in pairs(ArchiveTable.CreditRewards) do + if v.Reach >= Val then + return i - 1 + end + Max = i; + end + return Max; + end + + local Old = Func(InOld) + local New = Func(InLast) + if Old ~= New then + for i = Old + 1, New do + table.insert(Results, i) + end + end + return Results +end + +function WBP_SettleSave:EasterEggsDiff(InOld, InLast) + local Results = {} + for i, v in pairs(InLast) do + if v.Active == true and InOld[i].Active == false then + table.insert(Results, i) + end + end + return Results; +end + +-- 成就类型: { Val } +function WBP_SettleSave:AchievementDiff(InKey, InOld, InLast) + -- 做成数组 + local MakeArrFunc = function(TheKey) + local Ret = {} + for i, v in pairs(ArchiveTable.AchievementRewards[TheKey]) do + table.insert(Ret, i) + end + return Ret; + end + local Arr = MakeArrFunc(InKey) + local Func = function(InArr, Val) + for i, v in pairs(InArr) do + if v > Val then + return i - 1 + end + end + return 0 + end + + local OldMax = Func(Arr, InOld) + local LastMax = Func(Arr, InLast) + local Results = {} + + if OldMax ~= LastMax then + for i = OldMax + 1, LastMax do + table.insert(Results, Arr[i]) + end + end + return Results; +end + +-- 游戏掉落物 +-- { [Diff] = { Type: Count } } +function WBP_SettleSave:GameDropDiff(InOld, InLast) + local Results = {} + for Diff, Table in pairs(InLast) do + if InOld[Diff] ~= nil then + for Type, Count in pairs(Table) do + local OldVal = InOld[Diff][Type] + if OldVal == nil then + Results[Diff] = { + [Type] = Count + } + else + Results[Diff] = { + [Type] = Count - OldVal + } + end + end + else + Results[Diff] = Table; + end + end + return Results; +end + +function WBP_SettleSave:BossDropDiff(InOld, InLast) + -- Table: { Type: Count } + local Results = {} + for BossName, Table in pairs(InLast) do + if InOld[BossName] == nil then + Results[BossName] = Table + else + Results[BossName] = {} + for Type, Count in pairs(Table) do + local OldVal = InOld[BossName][Type] + if OldVal == nil then + Results[BossName][Type] = Count + else + Results[BossName][Type] = Count - OldVal + end + end + end + end + return Results +end + +function WBP_SettleSave:GetTypeValue(InArchive, InNum) + local Archive = InArchive + if InArchive.Type == nil then + local Val = '' + for i, v in pairs(InArchive) do + Val = self:GetTypeValue(v, InNum) .. '\n' .. Val + end + return Val + end + if InNum == nil then + InNum = 1 + end + local Num = Archive.Value * InNum + + local Type = Archive.Type + -- 替换掉 % + if string.find(Type, '%%') ~= nil then + Type = string.gsub(Type, '%%', '') + end + local Unit = "" + + if Archive.Unit == '%' then + Unit = '%' + Num = Num * 100 + end + + if math.type(Archive.Value) == 'float' then + Num = string.format("%.2f", Num) + elseif math.type(Archive.Value) == 'integer' then + Num = string.format("%d", Archive.Value) + end + return string.format('%s + %s', Type, Num .. Unit) +end + +function WBP_SettleSave:ShowItem_GameClearance(InData) + -- 存放到数组中 + if InData == nil then + return + end + for Diff, TimeTable in pairs(InData) do + for i, Times in pairs(TimeTable) do + -- 处理 Desc + local ItemData = { + Type = ArchiveTable.ArchiveType.GameClearance, + TextVal = string.format("难%d %d次", Diff, Times), + Icon = SaveGameConfigs.Icons.GameClearance, + Desc = self:GetTypeValue(ArchiveTable.GameClearanceRewards[Diff][Times]) + } + table.insert(self.SaveGames, ItemData) + end + end +end + +function WBP_SettleSave:ShowItem_Credit(InData) + if InData == nil then + return + end + for i, CreditRewardsIndex in pairs(InData) do + local ItemData = { + Type = ArchiveTable.ArchiveType.Credit, + TextVal = tostring(ArchiveTable.CreditRewards[CreditRewardsIndex].Reach), + Icon = SaveGameConfigs.Icons.Score, + Desc = self:GetTypeValue(ArchiveTable.CreditRewards[CreditRewardsIndex]["Reward"]) + } + table.insert(self.SaveGames, ItemData) + end +end + +function WBP_SettleSave:ShowItem_EasterEggs(InData) + if InData == nil then + return + end + for i, v in pairs(InData) do + local ItemData = { + Type = ArchiveTable.ArchiveType.EasterEggs, + Desc = self:GetTypeValue(ArchiveTable.EasterEggs[v]["Reward"]), + Icon = SaveGameConfigs.Icons.EasterEggs[v], + TextVal = ArchiveTable.EasterEggs[i].Name, + } + table.insert(self.SaveGames, ItemData) + end +end + +function WBP_SettleSave:ShowItem_Achievement(InData) + if InData == nil then + return + end + for Name, ValTable in pairs(InData) do + for i, v in pairs(ValTable) do + local ItemData = { + Type = ArchiveTable.ArchiveType.Achievement, + TextVal = ArchiveTable.AchievementRewards[Name][i].Name, + Icon = SaveGameConfigs.Icons.Achievements[Name][v], + Desc = self:GetTypeValue(ArchiveTable.AchievementRewards[Name][v].Reward), + } + table.insert(self.SaveGames, ItemData) + end + end +end + +-- 表示新增的 +function WBP_SettleSave:ShowItem_GameDrop(InData) + if InData == nil then + return + end + -- Diff: 难度;TypeCountTable: 物品:数量 + -- 统计所有的 + for Diff, TypeCountTable in pairs(InData) do + for Type, Count in pairs(TypeCountTable) do + local Name = ArchiveTable.DropGameItemIndex[Type] + --if self.SaveGames.GameDrop[Name] == nil then + -- self.SaveGames.GameDrop[Name] = {} + --end + local ItemData = { + Type = ArchiveTable.ArchiveType.DropGameItems, + TextVal = string.format('难%d %s', Diff, Name), + Desc = self:GetTypeValue(ArchiveTable.DropGameItems[Name], Diff * Count), + Icon = SaveGameConfigs.Icons.GameDropItems[Name], + } + table.insert(self.SaveGames, ItemData) + end + end +end + +function WBP_SettleSave:ShowItem_BossDrop(InData) + if InData == nil then + return + end + -- 检查新增 + local Func = function(Index) + for c, d in pairs(ArchiveTable.BossDropItemIndexs) do + if Index == d then + return c + end + end + end + for BossName, Table in pairs(InData) do + for i, v in pairs(Table) do + local ItemData = { + Desc = self:GetTypeValue(ArchiveTable.BossDropItems[BossName][i].Rewards, v), + Icon = SaveGameConfigs.Icons.BossDropItems[BossName][i], + Type = ArchiveTable.ArchiveType.DropBossItems, + TextVal = string.format('%s之%s', BossName, Func(i)) + } + table.insert(self.SaveGames, ItemData); + end + end +end + +-- 初始化对象池 +function WBP_SettleSave:InitObjectPool(InSize) + if InSize == nil then + InSize = self.InitCount + end + -- 先清空 + self.ScrollBox_SaveItems:ClearChildren() + local ClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_SettlementSaveItem.WBP_SettlementSaveItem_C') + local ItemClass = UE.LoadClass(ClassPath) + for i = 1, InSize do + local Item = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, ItemClass) + -- 添加进去 + self.ScrollBox_SaveItems:AddChild(Item) + -- 设置隐藏 + Item:SetVisibility(ESlateVisibility.Collapsed) + end +end + +return WBP_SettleSave; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_SettlementSaveItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_SettlementSaveItem.lua new file mode 100644 index 00000000..7a70ce2a --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_SettlementSaveItem.lua @@ -0,0 +1,32 @@ +---@class WBP_SettlementSaveItem_C:UUserWidget +---@field Button_Achievement UButton +---@field Image_Achievement_Icon UImage +---@field TextBlock_AchieveText UTextBlock +---@field TextBlock_Desc UTextBlock +--Edit Below-- +local WBP_SettlementSaveItem = { + bInitDoOnce = false; +}; + +function WBP_SettlementSaveItem:Construct() + WBP_SettlementSaveItem.SuperClass.Construct(self) + +end + +-- function WBP_SettlementSaveItem:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_SettlementSaveItem:Destruct() + +-- end + +-- Info: Type, TextVal, Desc, Icon +function WBP_SettlementSaveItem:SetSaveInfo(InInfo) + local Icon = UE.LoadObject(InInfo.Icon); + self.Image_Achievement_Icon:SetBrushFromTexture(Icon); + self.TextBlock_AchieveText:SetText(InInfo.TextVal); + self.TextBlock_Desc:SetText(InInfo.Desc); +end + +return WBP_SettlementSaveItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_SkillSelectButton.lua b/GZJ/Script/UI/ChildWidgets/WBP_SkillSelectButton.lua new file mode 100644 index 00000000..9ffdf74a --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_SkillSelectButton.lua @@ -0,0 +1,40 @@ +---@class WBP_SkillSelectButton_C:UUserWidget +---@field Button_UseSkill UButton +---@field Image_0 UImage +--Edit Below-- +local WBP_SkillSelectButton = { + bInitDoOnce = false; + SkillId = 0; + +}; + +function WBP_SkillSelectButton:Construct() + self.Button_UseSkill.OnClicked:Add(WBP_SkillSelectButton.OnClickUseSkill, self) +end + +-- function WBP_SkillSelectButton:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_SkillSelectButton:Destruct() + self.Button_UseSkill.OnClicked:Remove(WBP_SkillSelectButton.OnClickUseSkill, self) +end + +-- 直接在空插槽处应用技能 +function WBP_SkillSelectButton:OnClickUseSkill() + print(string.format('[WBP_SkillSelectButton:OnClickUseSkill] 使用技能:%d', self.SkillId)) + local PC = GameDataManager.GetLocalPlayerController() + local SkillName = GameDataManager.GetSkillNameById(self.SkillId) + local SkillLevel = GameDataManager.GetSkillLevelById(self.SkillId) + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GiveSkill", SkillName, PC:GetNearEmptySlot(), SkillLevel) + + -- 关闭 UI + UIManager:ClosePanel(EUIType.UseSkill) +end + +function WBP_SkillSelectButton:SetSkillId(InId) + print(string.format('[WBP_SkillSelectButton:SetSkillId] 设置技能ID = %d', InId)) + self.SkillId = InId +end + +return WBP_SkillSelectButton; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_TitleButton.lua b/GZJ/Script/UI/ChildWidgets/WBP_TitleButton.lua new file mode 100644 index 00000000..00afa679 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_TitleButton.lua @@ -0,0 +1,57 @@ +---@class WBP_TitleButton_C:UUserWidget +---@field Button_Title UButton +---@field TextBlock_Title UTextBlock +---@field WidgetSwitcher_Click UWidgetSwitcher +---@field TitleText FText +---@field ItemType TEnumAsByte +--Edit Below-- +local WBP_TitleButton = { + bInitDoOnce = false; +}; + +function WBP_TitleButton:Construct() + self.Button_Title.OnClicked:Add(WBP_TitleButton.OnClickTitle, self) +end + +-- function WBP_TitleButton:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_TitleButton:Destruct() + self.Button_Title.OnClicked:Remove(WBP_TitleButton.OnClickTitle, self) +end + +function WBP_TitleButton:OnClickTitle() + -- 在此处判断一下 + local BackpackPanel = UIManager:GetPanel(EUIType.Backpack) + if BackpackPanel == nil then + return + end + local It = BackpackPanel.WBP_GenerateInfo:GetCurrentType() + local bCanAdd = false; + if It == -1 then + bCanAdd = true + else + if self.ItemType == It then + bCanAdd = true + else + UIManager:ShowGeneralNotice("当前合成的物品类型不符合,请选择相同类型的物品进行合成", true) + end + end + + if bCanAdd then + EventSystem:SendEvent(EventType.ClickTitle, self.ItemType) + end + + NewPlayerGuideManager:RemoveGuide(21) +end + +function WBP_TitleButton:SetClick(InClick) + if InClick then + self.WidgetSwitcher_Click:SetActiveWidgetIndex(1) + else + self.WidgetSwitcher_Click:SetActiveWidgetIndex(0) + end +end + +return WBP_TitleButton; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_WeaponAttributeItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_WeaponAttributeItem.lua new file mode 100644 index 00000000..14b88027 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_WeaponAttributeItem.lua @@ -0,0 +1,51 @@ +---@class WBP_WeaponAttributeItem_C:UUserWidget +---@field TextBlock_Name UTextBlock +---@field TextBlock_Value UTextBlock +---@field AttributeName FText +--Edit Below-- +local WBP_WeaponAttributeItem = { + bInitDoOnce = false; + bHasConstruct = false; +}; + +function WBP_WeaponAttributeItem:Construct() + self.SuperClass:Construct() + self.bHasConstruct = true +end +-- Construct ]==] + +-- function WBP_WeaponAttributeItem:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_WeaponAttributeItem:Destruct() + +-- end + +function WBP_WeaponAttributeItem:SetAttributeItem(InData) + print(string.format("[WBP_WeaponAttributeItem:SetAttributeItem] 开始设置数据,Type = %s", InData.Type)) + local Name = InData.Type + local PercentIndex = string.find(Name, '%%') + local Val = '' + local ItemVal = 0 + if PercentIndex ~= nil then + --print(string.format("[WBP_WeaponAttributeItem:SetAttributeItem] Name = %s, Index = %d", Name, PercentIndex)) + Val = string.gsub(Name, '%%', '') + ItemVal = InData.Value * 100 + self.TextBlock_Name:SetText(Val .. ':') + self.TextBlock_Value:SetText(tostring(ItemVal) .. '%') + else + ItemVal = InData.Value + if ItemVal > 1 then + ItemVal = math.ceil(ItemVal) + end + self.TextBlock_Name:SetText(Name .. ':') + if math.type(ItemVal) == 'float' then + self.TextBlock_Value:SetText(string.format('%2.2f', ItemVal)) + else + self.TextBlock_Value:SetText(tostring(ItemVal)) + end + end +end + +return WBP_WeaponAttributeItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_WeaponFittingItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_WeaponFittingItem.lua new file mode 100644 index 00000000..34f20ecc --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_WeaponFittingItem.lua @@ -0,0 +1,267 @@ +---@class WBP_WeaponFittingItem_C:UAEUserWidget +---@field CanvasPanel_Main UCanvasPanel +---@field ItemIconAndBG UWBP_WeaponItemFitting_C +---@field TextBlock_ItemCount UTextBlock +---@field TextBlock_ItemType UTextBlock +---@field TextBlock_Quality UTextBlock +--Edit Below-- +local WBP_WeaponFittingItem = { + bInitDoOnce = false; + -- 拖拽数据的类 + DragDropClass = nil, + --拖拽显示的类 + DragVisualClass = nil, + -- 存放的物品数据 + FittingData = nil, + --是否正在点击按钮 + bClickLeftButton = false, + --按压时间 + PressTime = 0, + --按压多长时间之后会执行操作 + FunctionPressTime = 0.6, + + bStartMove = false, + bFirstButtonClick = false, + VisualWidget = nil, + + DragTimerHandler = nil; +}; + +function WBP_WeaponFittingItem:Construct() + print(string.format("[WBP_WeaponFittingItem:Construct] 执行构造")) + self.DragDropClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/BP_FittingDragDropData.BP_FittingDragDropData_C')) + self.DragVisualClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_DragItemVisual.WBP_DragItemVisual_C')) + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed) + self.bCanEverTick = true +end + +function WBP_WeaponFittingItem:Tick(MyGeometry, InDeltaTime) + -- 当没有需要选择操作的时候就不用执行操作 + if self.bClickLeftButton and not self.bStartMove then + -- 开始即时 + self.PressTime = self.PressTime + InDeltaTime + if self.PressTime > self.FunctionPressTime then + -- 执行操作 + if not self.bFirstButtonClick then + self.bFirstButtonClick = true + end + end + + if self.bFirstButtonClick then + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, true) + end + else + self.PressTime = 0 + end +end + +function WBP_WeaponFittingItem:Destruct() + self.DragDropClass = nil + self.DragVisualClass = nil +end + +-- 该方法只会在开始的时候设置一次 +-- 设置当前Item的数据,数据类型: {id, count} +function WBP_WeaponFittingItem:SetFittingItemData(InData) + --首先保存 + print(string.format("开始设置数据:Id:%d, count:%d", InData.ItemID, InData.ItemCount)) + self.FittingData = InData + + if GameDataManager then + local Val = GameDataManager.GetItemInfoByItemID(InData.ItemID) + + self.ItemIconAndBG:SetItemIcon(Val.Icon) + self.ItemIconAndBG:SetItemBGColor(GetItemQualityLevel(InData.ItemID)) + self.TextBlock_ItemCount:SetText(tostring(InData.ItemCount)) + -- 设置信息 + -- 先处理技能书 + local TextVal + if InData.ItemID > 20000 then + --local TheId = InData.ItemID // 100 % 100 + TextVal = DropItemMap.SkillItemMap[InData.ItemID].SkillName + else + TextVal = DropItemMap.FittingItemMap[InData.ItemID].WeaponType + end + + self.TextBlock_ItemType:SetText(TextVal) + + -- 设置质量 + local Quality = Tables.QualityInfo[GetItemQualityLevel(InData.ItemID)][1] + + if Quality == nil then + print(string.format("Can't Find Quality Type, ItemId = %d", InData.ItemID)) + else + print(string.format("Find Item Weapon, Quality Is %s", Quality)) + end + + self.TextBlock_Quality:SetText(string.format("%s", Quality)) + local Color = Tables.ItemRarityColor[GetItemQualityLevel(InData.ItemID)].Color + local SlateColor_ = { SpecifiedColor = Color, ColorUseRule = 0, } + self.TextBlock_Quality:SetColorAndOpacity(SlateColor_) + + -- 根据品质设置颜色 + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + print("[WBP_WeaponFittingItem:SetItemData] 当前 GameDataManager 没有值,请检查一下是否有保存") + end + + print(string.format("数据设置完成")) +end + +function WBP_WeaponFittingItem:OnDragDetected(MyGeometry, PointerEvent, Operation) + self:RemoveRelatedGuide() + + print("[WBP_WeaponFittingItem:OnDragDetected] 检测到 拖拽行为") + self.bFirstButtonClick = false + self.bClickLeftButton = false + self.PressTime = 0 + self.bStartMove = false + + Operation = UE.NewObject(nil, self.DragDropClass) + --由于不知道是什么,因此使用 None + Operation:SetOperationData(self.FittingData, EItemDropType.None) + Operation.DefaultDragVisual = self.VisualWidget + return Operation +end + +function WBP_WeaponFittingItem:OnMouseMove(MyGeometry, MouseEvent) + + -- 隐藏 ItemInfo 界面 + print(string.format("[WBP_WeaponFittingItem:OnMouseMove] 执行")) + local ret = WBP_WeaponFittingItem.SuperClass:OnMouseMove(MyGeometry, MouseEvent); + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, false) + if not self.bClickLeftButton then + print(string.format('[WBP_WeaponFittingItem:OnMouseMove] 没有点击左键')) + return ret + end + + local PC = GameDataManager.GetLocalPlayerController() + local IsKeyDown = PC:IsInputKeyDown({KeyName = "LeftMouseButton"}) + --if IsKeyDown == false then + -- print(string.format('[WBP_WeaponFittingItem:OnMouseMove] 直接返回了')) + -- self.bClickLeftButton = false + -- self.bFirstButtonClick = false + -- self.bStartMove = false + -- return + --end + + print(string.format('[WBP_WeaponFittingItem:OnMouseMove] 开始执行拖拽')) + if not self.bStartMove then + self.bStartMove = true + + local GameState = UGCGameSystem.GameState + if self.FittingData == nil then + return ret + end + + if UE.IsValid(self.DragVisualClass) and UE.IsValid(GameState) then + self.VisualWidget = UserWidget.NewWidgetObjectBP(GameState, self.DragVisualClass) + self.VisualWidget:SetVisibility(ESlateVisibility.Collapsed) + print(string.format('[WBP_WeaponFittingItem:OnMouseMove] 创建好Visual Widget')) + local that = self + self.DragTimerHandler = EventSystem.SetTimerLoop(self, function() + if that.VisualWidget.bHasInit then + print(string.format('[WBP_WeaponFittingItem:OnMouseMove] 初始化完成 VisualWidget')) + EventSystem.StopTimer(that.DragTimerHandler) + that.VisualWidget:SetVisualItemData(that.FittingData, that.ItemIconAndBG:GetItemIcon()) + end + that.VisualWidget:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end, 0.05) + end + print(string.format('[WBP_WeaponFittingItem:OnMouseMove] 开始拖拽')) + UIManager.AllPanel[EUIType.Backpack]:SetIsDrop(true) + return WidgetBlueprintLibrary.DetectDragIfPressed(MouseEvent, self, {KeyName="LeftMouseButton"}) + end + return ret +end + +function WBP_WeaponFittingItem:OnMouseButtonDown(MyGeometry, PointerEvent) + self:RemoveRelatedGuide() + + --开始即时 + -- 检测当前是否可以执行操作 + print(string.format("[WBP_WeaponFittingItem:OnMouseButtonDown] 执行")) + self.bClickLeftButton = true + return self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) +end + +-- 当鼠标抬起来的时候 +function WBP_WeaponFittingItem:OnMouseButtonUp(MyGeometry, InTouchEvent) + self:RemoveRelatedGuide() + UIManager:ClosePanel(EUIType.UseSkill) + + -- 检查当前时间是否够了 + print(string.format("[WBP_WeaponFittingItem:OnMouseButtonUp] 鼠标抬起")) + if UIManager.AllPanel[EUIType.Backpack]:GetOperateType() ~= EBagOperateType.None then + -- 说明此时要进行操作了,此时发送具体数据 + EventSystem:SendEvent(EventType.SelectedItem, self.FittingData) + else + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, false) + UIManager.AllPanel[EUIType.Backpack]:SetIsDrop(false) + if self.FittingData == nil then + UIManager.AllPanel[EUIType.Backpack]:HideSelectSkill() + else + if GetItemTypeByItemId(self.FittingData.ItemID) == EItemType.SkillBook then + -- 检查是否已经满了 + -- local Pos = WidgetLayoutLibrary.GetMousePositionOnViewport(self) + -- local PC = GameDataManager.GetLocalPlayerController() + -- local PosX, PosY = 0, 0 + -- local bSuccess, PositionX, PositionY = PC:GetMousePosition(PosX, PosY) + + -- if math.isNearlyEqual(PositionY, 0) or math.isNearlyEqual(PositionX, 0) then + -- Pos.X = 1980/2 + -- Pos.Y = 1260/2 + -- else + -- Pos.X = PositionX + -- Pos.Y = PositionY + -- end + + local _, Pos = SlateBlueprintLibrary.LocalToViewport(self, MyGeometry,{X = 0, Y = 0}) + UIManager:ShowPanel(EUIType.UseSkill, self.FittingData, Pos) + end + end + end + + self:RestProperty() +end + +function WBP_WeaponFittingItem:RestProperty() + self.bFirstButtonClick = false + self.bClickLeftButton = false + self.PressTime = 0 + self.bStartMove = false +end + +-- 开始触摸的时候 +function WBP_WeaponFittingItem:OnTouchStarted(MyGeometry, InTouchEvent) + self:RemoveRelatedGuide() + + self.bClickLeftButton = true + return WidgetBlueprintLibrary.DetectDragIfPressed(InTouchEvent, self, "LeftMouseButton") +end + +--结束触摸 +function WBP_WeaponFittingItem:OnTouchEnded(MyGeometry, InTouchEvent) + self:RemoveRelatedGuide() + + self.bClickLeftButton = false + self.bFirstButtonClick = false + self.PressTime = 0 +end + +function WBP_WeaponFittingItem:CloseWidget() + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed) + self.FittingData = nil +end + +function WBP_WeaponFittingItem:GetItemData() + return self.FittingData +end + +function WBP_WeaponFittingItem:RemoveRelatedGuide() + for i = 21, 28 do + NewPlayerGuideManager:RemoveGuide(i) + end +end + +return WBP_WeaponFittingItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_WeaponFittingList.lua b/GZJ/Script/UI/ChildWidgets/WBP_WeaponFittingList.lua new file mode 100644 index 00000000..7e460231 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_WeaponFittingList.lua @@ -0,0 +1,88 @@ +---@class WBP_WeaponFittingList_C:UUserWidget +---@field REINST_WBP_WeaponFittingItem_C_0 UWBP_WeaponFittingItem_C +---@field REINST_WBP_WeaponFittingItem_C_1 UWBP_WeaponFittingItem_C +---@field REINST_WBP_WeaponFittingItem_C_2 UWBP_WeaponFittingItem_C +---@field REINST_WBP_WeaponFittingItem_C_3 UWBP_WeaponFittingItem_C +---@field VerticalBox_WidgetList UDynaVerticalBox +---@field WBP_WeaponFittingItem UWBP_WeaponFittingItem_C +---@field WBP_WeaponFittingItem_0 UWBP_WeaponFittingItem_C +---@field WBP_WeaponFittingItem_1 UWBP_WeaponFittingItem_C +---@field WBP_WeaponFittingItem_2 UWBP_WeaponFittingItem_C +--Edit Below-- +local WBP_WeaponFittingList = { bInitDoOnce = false; }; + +-- 这里传入的是一个具体的列表{{id, count}, {id, count}, ...} +function WBP_WeaponFittingList:SetFittingListData(InDataArr) + for i = 1, 4 do + -- 通过 Id 进行数据获取 + if i <= #InDataArr then + self:SetFittingListItemData(i, InDataArr[i]) + else + self:CloseItemWidget(i) + end + end +end + +function WBP_WeaponFittingList:SetFittingListItemData(InNum, InData) + local Widget = self:GetItemByIndex(InNum) + Widget:SetFittingItemData(InData) +end + +function WBP_WeaponFittingList:CloseItemWidget(InNum) + local Widget = self:GetItemByIndex(InNum) + Widget:CloseWidget() +end + +function WBP_WeaponFittingList:GetItemByIndex(InIndex) + return self.VerticalBox_WidgetList:GetChildAt(InIndex - 1) +end + +function WBP_WeaponFittingList:Clear() + for i = 1, self.VerticalBox_WidgetList:GetChildrenCount() do + self:CloseItemWidget(i) + end +end + +function WBP_WeaponFittingList:Tick(MyGeometry, InDeltaTime) + print(string.format("[WBP_WeaponFittingList:Tick] 列表组件执行 Tick")) +end + +-- function WBP_WeaponFittingList:Destruct() + +-- end + +function WBP_WeaponFittingList:GetListItems() + local ret = {} + for i = 1, 4 do + table.insert(ret, self.VerticalBox_WidgetList:GetChildAt(i - 1)) + end + return ret +end + +-- {{ItemID, ItemCount}, {ItemID, ItemCount}} +function WBP_WeaponFittingList:SetItemListData(InData) + -- 将所有的都设置为空 + self:Clear() + if InData == nil or #InData == 0 then + return + else + for i = 1, self.VerticalBox_WidgetList:GetChildrenCount() do + if i <= #InData then + self.VerticalBox_WidgetList:GetChildAt(i - 1):SetFittingItemData(InData[i]) + end + end + end +end + +-- +function WBP_WeaponFittingList:OnDrop(MyGeometry, PointerEvent, Operation) + local ItemData = Operation:GetItemData() + local Type = Operation:GetDropItemType() + if Type == EItemDropType.CancelGenerate then + EventSystem:SendEvent(EventType.CloseGenerateItem, ItemData.ItemID) + else + return + end +end + +return WBP_WeaponFittingList; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_WeaponInfo.lua b/GZJ/Script/UI/ChildWidgets/WBP_WeaponInfo.lua new file mode 100644 index 00000000..6995eafb --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_WeaponInfo.lua @@ -0,0 +1,125 @@ +---@class WBP_WeaponInfo_C:UUserWidget +---@field Button_ChooseWeapon_Left UButton +---@field Button_ChooseWeapon_Right UButton +---@field Image_Weapon UImage +---@field Panel_WeaponInfo UCanvasPanel +---@field TextBlock_WeaponName UTextBlock +--Edit Below-- +local WBP_WeaponInfo = { + bInitDoOnce = false; +}; + +function WBP_WeaponInfo:Construct() + self.SuperClass:Construct() + + self:SetWeaponComponent() + if self.WeaponComponent then + self:OnUpdateWeapon(self.WeaponComponent.CurrentWeaponId, GameDataManager.GetLocalPlayerController().PlayerKey) + end + + EventSystem:AddListener(EventType.ClientUpdateWeapon, WBP_WeaponInfo.OnUpdateWeapon, self) + self.Button_ChooseWeapon_Left.OnClicked:Add(WBP_WeaponInfo.OnMinusWeapon, self) + self.Button_ChooseWeapon_Right.OnClicked:Add(WBP_WeaponInfo.OnAddWeapon, self) +end + +-- function WBP_WeaponInfo:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_WeaponInfo:Destruct() + EventSystem:RemoveListener(EventType.ClientUpdateWeapon, WBP_WeaponInfo.OnUpdateWeapon, self) + self.Button_ChooseWeapon_Left.OnClicked:Add(WBP_WeaponInfo.OnMinusWeapon, self) + self.Button_ChooseWeapon_Right.OnClicked:Add(WBP_WeaponInfo.OnAddWeapon, self) + + self.SuperClass:Destruct() +end + + +function WBP_WeaponInfo:OnUpdateWeapon(InNewId, InPlayerKey) + if InPlayerKey ~= GameDataManager.GetLocalPlayerController().PlayerKey then + return + end + + -- 找到对应 图标 + local WeaponType = GameDataManager.GetWeaponType(InNewId) + if WeaponType == nil then + UE.Log("[WBP_WeaponInfo:OnUpdateWeapon] Data is nil") + return + end + local Val = DropItemMap.WeaponTable[WeaponType] + if Val ~= nil then + if Val.Icon == nil then + self.Image_Weapon:SetVisibility(ESlateVisibility.Collapsed) + UE.Log("[WBP_WeaponInfo:OnUpdateWeapon] ID[%d] can't find Icon", InNewId) + else + local Icon = UE.LoadObject(Val.Icon) + if Icon == nil then + self.Image_Weapon:SetVisibility(ESlateVisibility.Collapsed) + else + self:SetWeaponIcon(Icon) + self.TextBlock_WeaponName:SetText(Val.Text) + self.TextBlock_WeaponName:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + end + end +end + +function WBP_WeaponInfo:SetWeaponIcon(InIcon) + self.Image_Weapon:SetBrushFromTexture(InIcon) + self.Image_Weapon:SetVisibility(ESlateVisibility.SelfHitTestInvisible) +end + +function WBP_WeaponInfo:SetWeaponComponent() + local PlayerController = GameDataManager.GetLocalPlayerController() + if PlayerController then + local OwningPawn = PlayerController:GetPlayerCharacterSafety() + if OwningPawn then + local WC = OwningPawn:GetWeaponComponent() + if WC ~= nil and UE.IsValid(WC) then + self.WeaponComponent = WC + return + end + end + end + self.WeaponComponent = nil +end + +function WBP_WeaponInfo:OnMinusWeapon() + -- 找到当前的 Id + if self.WeaponComponent == nil then + self:SetWeaponComponent() + end + + local CurrentIndex = self.WeaponComponent:GetCurrentWeaponIndex() + local TotalWeaponCount = self.WeaponComponent:GetWeaponCount() + print(string.format("[WBP_InteractPanel:OnMinusWeapon] Total Weapon Count = %d", TotalWeaponCount)) + local NextIndex = (CurrentIndex + TotalWeaponCount - 1) % TotalWeaponCount + if NextIndex == 0 then + NextIndex = TotalWeaponCount + end + print(string.format("[WBP_InteractPanel:OnMinusWeapon] Next Index = %d", NextIndex)) + local NextWeaponId = self.WeaponComponent:FindWeaponIdByIndex(NextIndex) + local PlayerController = GameDataManager.GetLocalPlayerController() + print(string.format("[WBP_InteractPanel:OnMinusWeapon] NextWeapon Id = %d" , NextWeaponId)) + UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_ChangeCurrentWeaponId", NextWeaponId) +end + +function WBP_WeaponInfo:OnAddWeapon() + if self.WeaponComponent == nil then + self:SetWeaponComponent() + end + local CurrentIndex = self.WeaponComponent:GetCurrentWeaponIndex() + local TotalWeaponCount = self.WeaponComponent:GetWeaponCount() + print(string.format("[WBP_InteractPanel:OnAddWeapon] Total Weapon Count = %d", TotalWeaponCount)) + local NextIndex = (CurrentIndex + TotalWeaponCount + 1) % TotalWeaponCount + if NextIndex == 0 then + NextIndex = TotalWeaponCount + end + print(string.format("[WBP_InteractPanel:OnAddWeapon] Next Index = %d", NextIndex)) + local NextWeaponId = self.WeaponComponent:FindWeaponIdByIndex(NextIndex) + local PlayerController = GameDataManager.GetLocalPlayerController() + print(string.format("[WBP_InteractPanel:OnAddWeapon] NextWeapon Id = %d" , NextWeaponId)) + UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_ChangeCurrentWeaponId", NextWeaponId) +end + +return WBP_WeaponInfo; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_WeaponItemFitting.lua b/GZJ/Script/UI/ChildWidgets/WBP_WeaponItemFitting.lua new file mode 100644 index 00000000..29c6eb38 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_WeaponItemFitting.lua @@ -0,0 +1,66 @@ +---@class WBP_WeaponItemFitting_C:UUserWidget +---@field Image_Icon UImage +---@field WidgetSwitcher_BG UWidgetSwitcher +--Edit Below-- +local WBP_WeaponItemFitting = { + bInitDoOnce = false; +}; + +--[==[ Construct +function WBP_WeaponItemFitting:Construct() + +end +-- Construct ]==] + +-- function WBP_WeaponItemFitting:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_WeaponItemFitting:Destruct() + +-- end + +-- 这是一个地址 +function WBP_WeaponItemFitting:SetItemIcon(InIcon) + UIManager.LoadTexture(self.Image_Icon, InIcon) + self.Image_Icon:SetVisibility(ESlateVisibility.SelfHitTestInvisible) +end + +-- 设置物品显示 +function WBP_WeaponItemFitting:SetItemHidden() + self.Image_Icon:SetVisibility(ESlateVisibility.Collapsed) + self.WidgetSwitcher_BG:SetActiveWidgetIndex(5) + --self.Image_BG:SetVisibility(ESlateVisibility.SelfHitTestInvisible) +end + +function WBP_WeaponItemFitting:OnMouseButtonDown(MyGeometry, PointerEvent) + self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) +end + +function WBP_WeaponItemFitting:OnMouseButtonUp(MyGeometry, InTouchEvent) + self.SuperClass:OnMouseButtonUp(MyGeometry, InTouchEvent) + + --点击即移除 + if self.FittingItemType == nil then + return + end + if self.FittingItemType >= 5 then + return + end + + EventSystem:SendEvent(EventType.ClickFittingItem, self.ItemId) +end + +function WBP_WeaponItemFitting:OnFocusLost(InFocusEvent) + self.SuperClass:OnFocusLost(InFocusEvent) +end + +function WBP_WeaponItemFitting:GetItemIcon() + return self.Image_Icon.Brush +end + +function WBP_WeaponItemFitting:SetItemBGColor(InLevel) + self.WidgetSwitcher_BG:SetActiveWidgetIndex(InLevel) +end + +return WBP_WeaponItemFitting; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_WeaponPartItem.lua b/GZJ/Script/UI/ChildWidgets/WBP_WeaponPartItem.lua new file mode 100644 index 00000000..12b420cd --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_WeaponPartItem.lua @@ -0,0 +1,209 @@ +---@class WBP_WeaponPartItem_C:UAEUserWidget +---@field CanvasPanel_Main UCanvasPanel +---@field ItemIconAndBG UWBP_WeaponItemFitting_C +---@field TextBlock_ItemCount UTextBlock +---@field TextBlock_ItemType UTextBlock +---@field TextBlock_Quality UTextBlock +--Edit Below-- +local WBP_WeaponPartItem = { + bInitDoOnce = false; + -- 拖拽数据的类 + DragDropClass = nil, + --拖拽显示的类 + DragVisualClass = nil, + -- 存放的物品数据 + FittingData = nil, + --是否正在点击按钮 + bClickLeftButton = false, + --按压时间 + PressTime = 0, + --按压多长时间之后会执行操作 + FunctionPressTime = 0.6, + + bStartMove = false, + bFirstButtonClick = false, + VisualWidget = nil, + + DragTimerHandler = nil +}; + +function WBP_WeaponPartItem:Construct() + self.DragDropClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/BP_FittingDragDropData.BP_FittingDragDropData_C')) + self.DragVisualClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_DragItemVisual.WBP_DragItemVisual_C')) + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed) + self.bCanEverTick = true +end + +function WBP_WeaponPartItem:Tick(MyGeometry, InDeltaTime) + -- 当没有需要选择操作的时候就不用执行操作 + print(string.format("[WBP_WeaponPartItem:Tick] 执行")) + if UIManager.AllPanel[EUIType.Backpack]:GetOperateType() ~= EBagOperateType.None then + return + end + if self.bClickLeftButton and not self.bStartMove then + -- 开始即时 + self.PressTime = self.PressTime + InDeltaTime + if self.PressTime > self.FunctionPressTime then + -- 执行操作 + if not self.bFirstButtonClick then + self.bFirstButtonClick = true + end + end + + if self.bFirstButtonClick then + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, true) + end + else + self.PressTime = 0 + end +end + +function WBP_WeaponPartItem:Destruct() + self.DragDropClass = nil + self.DragVisualClass = nil +end + +-- 该方法只会在开始的时候设置一次 +-- 设置当前Item的数据,数据类型: {id, count} +function WBP_WeaponPartItem:SetFittingItemData(InData) + --首先保存 + print(string.format("开始设置数据:Id:%d, count:%d", InData.ItemID, InData.ItemCount)) + self.FittingData = InData + + if GameDataManager then + local Val = GameDataManager.GetItemInfoByItemID(InData.ItemID) + -- TODO 这个设置需要根据 具体强型修改 + self.ItemIconAndBG:SetItemIcon(Val.Icon) + self.ItemIconAndBG:SetItemBGColor(GetItemQualityLevel(InData.ItemID)) + self.TextBlock_ItemCount:SetText(tostring(InData.ItemCount)) + -- 设置信息 + -- 先处理技能书 + local TextVal + if InData.ItemID > 20000 then + --local TheId = InData.ItemID // 100 % 100 + TextVal = DropItemMap.SkillItemMap[InData.ItemID].SkillName + else + TextVal = DropItemMap.FittingItemMap[InData.ItemID].WeaponType + end + + self.TextBlock_ItemType:SetText(TextVal) + + -- 设置质量 + local Quality = Tables.QualityInfo[GetItemQualityLevel(InData.ItemID)][1] + + if Quality == nil then + print(string.format("Can't Find Quality Type, ItemId = %d", InData.ItemID)) + else + print(string.format("Find Item Weapon, Quality Is %s", Quality)) + end + + self.TextBlock_Quality:SetText(string.format("%s", Quality)) + + -- 根据品质设置颜色 + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + print("[WBP_WeaponPartItem:SetItemData] 当前 GameDataManager 没有值,请检查一下是否有保存") + end + + print(string.format("数据设置完成")) +end + +function WBP_WeaponPartItem:OnDragDetected(MyGeometry, PointerEvent, Operation) + print("[WBP_WeaponPartItem:OnDragDetected] 检测到 拖拽行为") + + self.bFirstButtonClick = false + self.bClickLeftButton = false + self.PressTime = 0 + self.bStartMove = false + + Operation = UE.NewObject(nil, self.DragDropClass) + --由于不知道是什么,因此使用 None + Operation:SetOperationData(self.FittingData, EItemDropType.None) + Operation.DefaultDragVisual = self.VisualWidget + return Operation +end + +function WBP_WeaponPartItem:OnMouseMove(MyGeometry, MouseEvent) + -- 隐藏 ItemInfo 界面 + print(string.format("[WBP_WeaponPartItem:OnMouseMove] 执行")) + local ret = WBP_WeaponPartItem.SuperClass:OnMouseMove(MyGeometry, MouseEvent); + if not self.bClickLeftButton then + return ret + end + + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, false) + + if not self.bStartMove then + self.bStartMove = true + + local GameState = UGCGameSystem.GameState + if self.FittingData == nil then + return ret + end + if UE.IsValid(self.DragVisualClass) and UE.IsValid(GameState) then + self.VisualWidget = UserWidget.NewWidgetObjectBP(GameState, self.DragVisualClass) + self.VisualWidget:SetVisibility(ESlateVisibility.Collapsed) + local that = self + self.DragTimerHandler = EventSystem.SetTimerLoop(self, function() + if that.VisualWidget.bHasInit then + EventSystem.StopTimer(that.DragTimerHandler) + that.VisualWidget:SetVisualItemData(that.FittingData, that.ItemIconAndBG:GetItemIcon()) + end + that.VisualWidget:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end, 0.05) + end + return WidgetBlueprintLibrary.DetectDragIfPressed(MouseEvent, self, "LeftMouseButton") + end + return ret +end + +function WBP_WeaponPartItem:OnMouseButtonDown(MyGeometry, PointerEvent) + --开始即时 + -- 检测当前是否可以执行操作 + print(string.format("[WBP_WeaponPartItem:OnMouseButtonDown] 执行")) + self.bClickLeftButton = true + return self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) +end + +-- 当鼠标抬起来的时候 +function WBP_WeaponPartItem:OnMouseButtonUp(MyGeometry, InTouchEvent) + -- 检查当前时间是否够了 + print(string.format("[WBP_WeaponPartItem:OnMouseButtonUp] 鼠标抬起")) + if UIManager.AllPanel[EUIType.Backpack]:GetOperateType() ~= EBagOperateType.None then + -- 说明此时要进行操作了,此时发送具体数据 + EventSystem:SendEvent(EventType.SelectedItem, self.FittingData) + else + EventSystem:SendEvent(EventType.ShowItemDescribe, self.FittingData, false) + end + self:RestProperty() +end + +function WBP_WeaponPartItem:RestProperty() + self.bFirstButtonClick = false + self.bClickLeftButton = false + self.PressTime = 0 + self.bStartMove = false +end + +-- 开始触摸的时候 +function WBP_WeaponPartItem:OnTouchStarted(MyGeometry, InTouchEvent) + self.bClickLeftButton = true + return WidgetBlueprintLibrary.DetectDragIfPressed(InTouchEvent, self, "LeftMouseButton") +end + +--结束触摸 +function WBP_WeaponPartItem:OnTouchEnded(MyGeometry, InTouchEvent) + self.bClickLeftButton = false + self.bFirstButtonClick = false + self.PressTime = 0 +end + +function WBP_WeaponPartItem:CloseWidget() + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_WeaponPartItem:GetItemData() + return self.FittingData +end + +return WBP_WeaponPartItem; \ No newline at end of file diff --git a/GZJ/Script/UI/ChildWidgets/WBP_WidgetHeader.lua b/GZJ/Script/UI/ChildWidgets/WBP_WidgetHeader.lua new file mode 100644 index 00000000..bfe32b58 --- /dev/null +++ b/GZJ/Script/UI/ChildWidgets/WBP_WidgetHeader.lua @@ -0,0 +1,49 @@ +---@class WBP_WidgetHeader_C:UUserWidget +---@field Button_ClosePanel UButton +---@field TextBlock_Title UTextBlock +---@field bHideCloseButton bool +---@field TitleText FText +---@field UIType TEnumAsByte +--Edit Below-- +local WBP_WidgetHeader = { + bInitDoOnce = false; + bIsCloseUITypeUI = true; +}; + +WBP_WidgetHeader.CloseUIFunc = nil; + +function WBP_WidgetHeader:Construct() + UE.Log("[WBP_WidgetHeader:Construct]") + self.Button_ClosePanel.OnClicked:Add(WBP_WidgetHeader.OnClickCloseButton, self) + + if self.bHideCloseButton then + self.Button_ClosePanel:SetVisibility(ESlateVisibility.Collapsed) + end + + self.TextBlock_Title:SetText(self.TitleText) +end + +-- function WBP_WidgetHeader:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_WidgetHeader:Destruct() + self.Button_ClosePanel.OnClicked:Remove(WBP_WidgetHeader.OnClickCloseButton, self) +end + +function WBP_WidgetHeader:OnClickCloseButton() + UE.Log("[WBP_WidgetHeader:OnClickCloseButton]") + if self.bIsCloseUITypeUI then + UIManager:ClosePanel(self.UIType) + else + if self.CloseUIFunc ~= nil then + self.CloseUIFunc() + end + end +end + +function WBP_WidgetHeader:SetHeaderText(InText) + self.TextBlock_Title:SetText(InText) +end + +return WBP_WidgetHeader; \ No newline at end of file diff --git a/GZJ/Script/UI/GM/WBP_GM.lua b/GZJ/Script/UI/GM/WBP_GM.lua new file mode 100644 index 00000000..41a80bef --- /dev/null +++ b/GZJ/Script/UI/GM/WBP_GM.lua @@ -0,0 +1,169 @@ +---@class WBP_GM_C:UUserWidget +---@field Button_AddCoin UButton +---@field Button_AddSkill UButton +---@field Button_AddTech UButton +---@field Button_ChangeTimeScale UButton +---@field Button_DecreaseCoin UButton +---@field Button_DecreaseTech UButton +---@field Button_DecreaseTimeScale UButton +---@field Button_GM UButton +---@field Button_IncreaseCoin UButton +---@field Button_IncreaseTech UButton +---@field Button_IncreaseTimeScale UButton +---@field ComboBox_SkillLevel UComboBoxString +---@field ComboBox_SkillName UComboBoxString +---@field Panel_GM UCanvasPanel +---@field TextBlock_CoinPoint UTextBlock +---@field TextBlock_TechPoint UTextBlock +---@field TextBlock_TimeScale UTextBlock +--Edit Below-- +local WBP_GM = { + bInitDoOnce = false, + SelectedSkillName = "", + SelectedSkillLevel = 1, + SelectedCoinPoint = 10000, + SelectedTechPoint = 100, + SelectedTimeScale = 1.0 +}; + + +function WBP_GM:Construct() + self:LuaInit(); + + self.Panel_GM:SetVisibility(ESlateVisibility.Collapsed) + + self.SelectedSkillLevel = "1" + self.SelectedSkillName = "Null" + + self.ComboBox_SkillName:ClearOptions() + for i = ESkillName.Counter, ESkillName.Bombing do + local SkillNameStr = GameDataManager.GetSkillNameStrByName(i) + self.ComboBox_SkillName:AddOption(SkillNameStr) + end + self.ComboBox_SkillName:SetSelectedOption(self.SelectedSkillName) +end + +-- [Editor Generated Lua] function define Begin: +function WBP_GM:LuaInit() + if self.bInitDoOnce then + return; + end + self.bInitDoOnce = true; + -- [Editor Generated Lua] BindingProperty Begin: + self.ComboBox_SkillName.OnOpening:Add(self.ComboBox_SkillName_OnOnOpening, self); + self.ComboBox_SkillName.OnSelectionChanged:Add(self.ComboBox_SkillName_OnSelectionChanged, self) + self.ComboBox_SkillLevel.OnSelectionChanged:Add(self.ComboBox_SkillLevel_OnSelectionChanged, self) + self.Button_GM.OnClicked:Add(self.Button_GM_OnClicked, self) + self.Button_AddSkill.OnClicked:Add(self.Button_AddSkill_OnClicked, self) + self.Button_AddCoin.OnClicked:Add(self.Button_AddCoin_OnClicked, self) + self.Button_IncreaseCoin.OnClicked:Add(self.Button_IncreaseCoin_OnClicked, self) + self.Button_DecreaseCoin.OnClicked:Add(self.Button_DecreaseCoin_OnClicked, self) + self.Button_AddTech.OnClicked:Add(self.Button_AddTech_OnClicked, self) + self.Button_IncreaseTech.OnClicked:Add(self.Button_IncreaseTech_OnClicked, self) + self.Button_DecreaseTech.OnClicked:Add(self.Button_DecreaseTech_OnClicked, self) + self.Button_ChangeTimeScale.OnClicked:Add(self.Button_ChangeTimeScale_OnClicked, self) + self.Button_IncreaseTimeScale.OnClicked:Add(self.Button_IncreaseTimeScale_OnClicked, self) + self.Button_DecreaseTimeScale.OnClicked:Add(self.Button_DecreaseTimeScale_OnClicked, self) + self.TextBlock_CoinPoint:BindingProperty("Text", self.TextBlock_CoinPoint_Text, self); + self.TextBlock_TechPoint:BindingProperty("Text", self.TextBlock_TechPoint_Text, self); + self.TextBlock_TimeScale:BindingProperty("Text", self.TextBlock_TimeScale_Text, self); + -- [Editor Generated Lua] BindingProperty End; + + -- [Editor Generated Lua] BindingEvent Begin: + -- [Editor Generated Lua] BindingEvent End; +end + +function WBP_GM:ComboBox_SkillName_OnOnOpening() + self.ComboBox_SkillName:SetSelectedOption(self.SelectedSkillName) +end + +function WBP_GM:ComboBox_SkillName_OnSelectionChanged(SelectedItem, SelectionType) + self.SelectedSkillName = SelectedItem +end + +function WBP_GM:ComboBox_SkillLevel_OnSelectionChanged(SelectedItem, SelectionType) + self.SelectedSkillLevel = SelectedItem +end + +function WBP_GM:Button_GM_OnClicked() + if self.Panel_GM:IsVisible() then + self.Panel_GM:SetVisibility(ESlateVisibility.Collapsed) + else + self.Panel_GM:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +function WBP_GM:Button_AddSkill_OnClicked() + local SkillName = ESkillName.Default + local SkillLevel = tonumber(self.SelectedSkillLevel) + + for Name, SkillInfo in pairs(GlobalConfigs.SkillInfo) do + if SkillInfo.Name == self.SelectedSkillName then + SkillName = Name + end + end + + if SkillName ~= ESkillName.Default and SkillLevel > 0 then + local ItemData = { + ItemID = 20000 + SkillLevel * 10 + SkillName * 100, + ItemCount = 1, + } + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GM_AddItems", {ItemData}) + end +end + +function WBP_GM:Button_AddCoin_OnClicked() + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GM_AddCoinPoint", self.SelectedCoinPoint) +end + +function WBP_GM:Button_IncreaseCoin_OnClicked() + self.SelectedCoinPoint = math.floor(math.clamp(self.SelectedCoinPoint + 10000, 10000, 1000000)) +end + +function WBP_GM:Button_DecreaseCoin_OnClicked() + self.SelectedCoinPoint = math.floor(math.clamp(self.SelectedCoinPoint - 10000, 10000, 1000000)) +end + +function WBP_GM:Button_AddTech_OnClicked() + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GM_AddTechPoint", self.SelectedTechPoint) +end + +function WBP_GM:Button_IncreaseTech_OnClicked() + self.SelectedTechPoint = math.floor(math.clamp(self.SelectedTechPoint + 100, 100, 100000)) +end + +function WBP_GM:Button_DecreaseTech_OnClicked() + self.SelectedTechPoint = math.floor(math.clamp(self.SelectedTechPoint - 100, 100, 100000)) +end + +function WBP_GM:Button_ChangeTimeScale_OnClicked() + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GM_ChangeTimeScale", self.SelectedTimeScale) +end + +function WBP_GM:Button_IncreaseTimeScale_OnClicked() + self.SelectedTimeScale = math.floor(math.clamp(self.SelectedTimeScale + 1.0, 1.0, 10.0)) +end + +function WBP_GM:Button_DecreaseTimeScale_OnClicked() + self.SelectedTimeScale = math.floor(math.clamp(self.SelectedTimeScale - 1.0, 1.0, 10.0)) +end + +function WBP_GM:TextBlock_CoinPoint_Text(ReturnValue) + return string.format("%d", math.floor(self.SelectedCoinPoint)) +end + +function WBP_GM:TextBlock_TechPoint_Text(ReturnValue) + return string.format("%d", math.floor(self.SelectedTechPoint)) +end + +function WBP_GM:TextBlock_TimeScale_Text(ReturnValue) + return string.format("x%d", math.floor(self.SelectedTimeScale)) +end + +-- [Editor Generated Lua] function define End; + +return WBP_GM; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_ForceGuidePanel.lua b/GZJ/Script/UI/Guide/WBP_ForceGuidePanel.lua new file mode 100644 index 00000000..d57316f7 --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_ForceGuidePanel.lua @@ -0,0 +1,325 @@ +---@class WBP_ForceGuidePanel_C:UUserWidget +---@field Button_Backpack UNewButton +---@field Button_BossInfo UNewButton +---@field Button_Breach UNewButton +---@field Button_Challenge UNewButton +---@field Button_Pickup UNewButton +---@field Button_SelectBoss UNewButton +---@field Button_Tech UNewButton +---@field Button_Unpacking UNewButton +---@field GuidePanel_Backpack UWBP_ForceGuide_Backpack_C +---@field GuidePanel_BossInfo UWBP_ForceGuide_BossInfo_C +---@field GuidePanel_Challenge UWBP_ForceGuide_Challenge_C +---@field GuidePanel_Tech UWBP_ForceGuide_Tech_C +---@field GuidePanel_Unpacking UWBP_ForceGuide_Unpacking_C +---@field Image_SelectBossIcon UImage +---@field Overlay_GuideRoot UOverlay +---@field Panel_Backpack UCanvasPanel +---@field Panel_BossInfo UCanvasPanel +---@field Panel_Breach UCanvasPanel +---@field Panel_Challenge UCanvasPanel +---@field Panel_CoinPoint UCanvasPanel +---@field Panel_CoinTip UCanvasPanel +---@field Panel_Pickup UCanvasPanel +---@field Panel_SelectBoss UCanvasPanel +---@field Panel_Tech UCanvasPanel +---@field Panel_TechPoint UCanvasPanel +---@field Panel_TechTip UCanvasPanel +---@field Panel_Unpacking UCanvasPanel +---@field TextBlock_CoinPoint UTextBlock +---@field TextBlock_KillPoint UTextBlock +--Edit Below-- +local WBP_ForceGuidePanel = { + bInitDoOnce = false, + bHasTriggeredAllForceGuide = false, + CurValidStepIndex = 1, + CurStepIndex = -1, + bIsInStepProgress = false, + StepPendingList = {}, +}; + +function WBP_ForceGuidePanel:Construct() + if self.bInitDoOnce then + return + end + self.bInitDoOnce = true + + self.CurValidStepIndex = 1 + self.CurStepIndex = -1 + + self.bIsInStepProgress = false + self.StepPendingList = {} + + self.AllPanels = { + ["Tech"] = self.Panel_Tech, + ["Backpack"] = self.Panel_Backpack, + ["BossInfo"] = self.Panel_BossInfo, + ["Breach"] = self.Panel_Breach, + ["Challenge"] = self.Panel_Challenge, + ["Pickup"] = self.Panel_Pickup, + ["SelectBoss"] = self.Panel_SelectBoss, + ["Unpacking"] = self.Panel_Unpacking, + ["CoinPoint"] = self.Panel_CoinPoint, + ["TechPoint"] = self.Panel_TechPoint, + ["CoinTip"] = self.Panel_CoinTip, + ["TechTip"] = self.Panel_TechTip, + } + self.AllButtons = { + ["Tech"] = self.Button_Tech, + ["Backpack"] = self.Button_Backpack, + ["BossInfo"] = self.Button_BossInfo, + ["Breach"] = self.Button_Breach, + ["Challenge"] = self.Button_Challenge, + ["Pickup"] = self.Button_Pickup, + ["SelectBoss"] = self.Button_SelectBoss, + ["Unpacking"] = self.Button_Unpacking, + } + for Name, Button in pairs(self.AllButtons) do + Button.OnClicked:Add(self[string.format("OnButton_%sClicked", Name)], self) + end + + self.GuidePanel_Tech:SetVisibility(ESlateVisibility.Collapsed) + self.GuidePanel_Backpack:SetVisibility(ESlateVisibility.Collapsed) + self.GuidePanel_BossInfo:SetVisibility(ESlateVisibility.Collapsed) + self.GuidePanel_Unpacking:SetVisibility(ESlateVisibility.Collapsed) + self.GuidePanel_Challenge:SetVisibility(ESlateVisibility.Collapsed) + + self:OnPlayerCoinPointChanged(GameDataManager.GetLocalPlayerState().CoinPoint.Current) + self:OnPlayerKillPointChanged(GameDataManager.GetLocalPlayerState().KillPoint.Current) + + EventSystem:AddListener(EventType.PlayerCoinPointChanged, WBP_ForceGuidePanel.OnPlayerCoinPointChanged, self) + EventSystem:AddListener(EventType.PlayerKillPointChanged, WBP_ForceGuidePanel.OnPlayerKillPointChanged, self) + EventSystem:AddListener(EventType.ForceGuide_OnGuideTriggered, WBP_ForceGuidePanel.OnGuideTriggered, self) + EventSystem:AddListener(EventType.ForceGuide_OnGuideFinished, WBP_ForceGuidePanel.OnGuideFinished, self) + +end + +function WBP_ForceGuidePanel:OnPlayerCoinPointChanged(InCoinPoint) + self.TextBlock_CoinPoint:SetText(tostring(math.ceil(InCoinPoint).." ")) +end + +function WBP_ForceGuidePanel:OnPlayerKillPointChanged(InKillPoint) + self.TextBlock_KillPoint:SetText(tostring(math.ceil(InKillPoint).." ")) +end + +function WBP_ForceGuidePanel:InitByRecordedInfo(ForceGuideInfo) + local RecordedCurStepIndex = ForceGuideInfo.CurStepIndex + self.CurStepIndex = (RecordedCurStepIndex and RecordedCurStepIndex > 0) and RecordedCurStepIndex or -1 + + local RecordedValidStepIndex = ForceGuideInfo.ValidStepIndex + self.CurValidStepIndex = (RecordedValidStepIndex and RecordedValidStepIndex > 0) and RecordedValidStepIndex or 1 + + if self.CurValidStepIndex > 8 then + self.bHasTriggeredAllForceGuide = true + return + end + + local RecordedStepPendingList = ForceGuideInfo.StepPendingList + self.StepPendingList = (RecordedStepPendingList and not table.isEmpty(RecordedStepPendingList)) and RecordedStepPendingList or {} + + local PSIsInProgress = ForceGuideInfo.bIsInStepProgress + if PSIsInProgress ~= nil and PSIsInProgress then + self:TryTriggerForceGuide(self.CurStepIndex) + end +end + +function WBP_ForceGuidePanel:TryTriggerForceGuide(StepIndex) + if self.bHasTriggeredAllForceGuide == true or self.CurValidStepIndex > StepIndex then + return false + end + + if not table.hasValue(self.StepPendingList, StepIndex) then + table.insert(self.StepPendingList, StepIndex) + table.sort(self.StepPendingList, function(a, b) return a < b end) + end + + + if not self.bIsInStepProgress and self.CurValidStepIndex == StepIndex then + UE.Log("[WBP_ForceGuidePanel] TryTriggerForceGuide: %d", StepIndex) + self:SetupStepIndex(StepIndex) + end + + return true +end + +function WBP_ForceGuidePanel:SetupStepIndex(StepIndex) + if self.CurValidStepIndex ~= StepIndex then + return + end + + self:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + + UIManager:CloseWidgetByRoot(UIRoot.MiddleRoot) + + self.bIsInStepProgress = true + self.CurStepIndex = StepIndex + + UE.Log("[WBP_ForceGuidePanel] Guide Index Triggered: %d", StepIndex) + + local MainUI = UIManager:GetPanel(EUIType.Main) + if self.CurStepIndex == 1 then --兑换 + self:ShowGuidePanelByName("Tech") + MainUI.InteractButton_Technology:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + elseif self.CurStepIndex == 2 then + self:ShowGuidePanelByName("BossInfo") + MainUI.CanvasPanel_BossInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + elseif self.CurStepIndex == 3 then + self:ShowGuidePanelByName("Unpacking") + MainUI.InteractButton_Unpacking:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + elseif self.CurStepIndex == 4 then + self:ShowGuidePanelByName("Breach") + MainUI.CanvasPanel_Breach:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + elseif self.CurStepIndex == 5 then + self:ShowGuidePanelByName('SelectBoss') + MainUI.InteractButton_SelectBoss:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + elseif self.CurStepIndex == 6 then + self:ShowGuidePanelByName('Pickup') + MainUI.InteractButton_Pickup:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + elseif self.CurStepIndex == 7 then + self:ShowGuidePanelByName("Backpack") + MainUI.InteractButton_Backpack:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + elseif self.CurStepIndex == 8 then + self:ShowGuidePanelByName("Challenge") + MainUI.InteractButton_Challenge:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +function WBP_ForceGuidePanel:ShowGuidePanelByName(...) + if select("#", ...) <= 0 then + return + end + + local PanelNames = {...} + for PanelName, Panel in pairs(self.AllPanels) do + if table.hasValue(PanelNames, PanelName) then + Panel:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + Panel:SetVisibility(ESlateVisibility.Collapsed) + end + end +end + +function WBP_ForceGuidePanel:HideGuidePanelByName(...) + if select("#", ...) <= 0 then + return + end + + local PanelNames = {...} + for _, PanelName in pairs(PanelNames) do + self.AllPanels[PanelName]:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_ForceGuidePanel:OnButton_TechClicked() + self.GuidePanel_Tech:OnStartGuideProgress() +end + +function WBP_ForceGuidePanel:OnButton_BackpackClicked() + self.GuidePanel_Backpack:OnStartGuideProgress() +end + +function WBP_ForceGuidePanel:OnButton_BossInfoClicked() + self.GuidePanel_BossInfo:OnStartGuideProgress() +end + +function WBP_ForceGuidePanel:OnButton_ChallengeClicked() + self.GuidePanel_Challenge:OnStartGuideProgress() +end + +function WBP_ForceGuidePanel:OnButton_UnpackingClicked() + self.GuidePanel_Unpacking:OnStartGuideProgress() +end + +function WBP_ForceGuidePanel:OnButton_BreachClicked() + EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 4) + EventSystem:SendEvent(EventType.ToggleBreachButton, false) +end + +function WBP_ForceGuidePanel:OnButton_SelectBossClicked() + local Pawn = GameDataManager.GetLocalPlayerPawn() + if Pawn and UE.IsValid(Pawn) then + local WeaponComp = Pawn:GetWeaponComponent() + if WeaponComp and UE.IsValid(WeaponComp) then + WeaponComp.IsAttackNearestMonster = not WeaponComp.IsAttackNearestMonster + local MainUI = UIManager:GetPanel(EUIType.Main) + if MainUI then + MainUI:SetSelectBossIcon(WeaponComp.IsAttackNearestMonster) + end + end + end + + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_OnBreach", PC.PlayerKey) + + EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 5) +end + +function WBP_ForceGuidePanel:OnButton_PickupClicked() + local PC = GameDataManager.GetLocalPlayerController() + PC:RequestPickupNearbyItems(true) + + self:HideGuidePanelByName('Pickup') + + EventSystem.SetTimer(self, function() + EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 6) + end, 0.5) +end + +function WBP_ForceGuidePanel:OnGuideTriggered(StepIndex) + if StepIndex == 1 then + self:ShowGuidePanelByName('TechPoint', 'TechTip') + elseif StepIndex == 2 then + self:HideGuidePanelByName('BossInfo') + elseif StepIndex == 3 then + self:ShowGuidePanelByName('CoinPoint', 'CoinTip') + elseif StepIndex == 7 then + self:HideGuidePanelByName('Backpack') + elseif StepIndex == 8 then + self:HideGuidePanelByName('Challenge') + end +end + +function WBP_ForceGuidePanel:OnGuideFinished(StepIndex) + if self.CurStepIndex == StepIndex and self.CurValidStepIndex == StepIndex then + UE.Log("[WBP_ForceGuidePanel] Guide Index Finished: %d", StepIndex) + + self.CurValidStepIndex = self.CurValidStepIndex + 1 + + table.remove(self.StepPendingList, 1) + + self.bIsInStepProgress = false + + if StepIndex == 1 then + if not table.hasValue(self.StepPendingList, 2) then + table.insert(self.StepPendingList, 1, 2) + end + elseif StepIndex == 4 then + if not table.hasValue(self.StepPendingList, 5) then + table.insert(self.StepPendingList, 1, 5) + end + + elseif StepIndex == 6 then + if not table.hasValue(self.StepPendingList, 7) then + table.insert(self.StepPendingList, 1, 7) + end + end + + local NextIndex, NextStepIndex = next(self.StepPendingList) + if NextIndex ~= nil and NextStepIndex ~= nil then + if NextStepIndex == self.CurValidStepIndex then + self:SetupStepIndex(NextStepIndex) + else + self:SetVisibility(ESlateVisibility.Collapsed) + end + else + self:SetVisibility(ESlateVisibility.Collapsed) + end + + if StepIndex == 8 then + self.bHasTriggeredAllForceGuide = true + UE.Log("[WBP_ForceGuidePanel] All Force Guide Triggered") + end + end +end + +return WBP_ForceGuidePanel; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_ForceGuide_Backpack.lua b/GZJ/Script/UI/Guide/WBP_ForceGuide_Backpack.lua new file mode 100644 index 00000000..016f42a0 --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_ForceGuide_Backpack.lua @@ -0,0 +1,275 @@ +---@class WBP_ForceGuide_Backpack_C:UUserWidget +---@field Button_Item UButton +---@field Button_UseSkill UButton +---@field HorizontalBox_ItemList UHorizontalBox +---@field Image_Icon_1 UImage +---@field Image_Icon_2 UImage +---@field Image_Icon_3 UImage +---@field Image_Icon_4 UImage +---@field Item_1 UCanvasPanel +---@field Item_2 UCanvasPanel +---@field Item_3 UCanvasPanel +---@field Item_4 UCanvasPanel +---@field ItemBG_1 UCanvasPanel +---@field ItemBG_2 UCanvasPanel +---@field ItemBG_3 UCanvasPanel +---@field ItemBG_4 UCanvasPanel +---@field ItemText_1 UCanvasPanel +---@field ItemText_2 UCanvasPanel +---@field ItemText_3 UCanvasPanel +---@field ItemText_4 UCanvasPanel +---@field Panel_Backpack UCanvasPanel +---@field Panel_BG UWBP_WidgetHeader_C +---@field Panel_SkillSlot UCanvasPanel +---@field SkillBtn_Slot1 UWBP_SkillBtn_Item_C +---@field SkillBtn_Slot2 UWBP_SkillBtn_Item_C +---@field SkillBtn_Slot3 UWBP_SkillBtn_Item_C +---@field TextBlock_Count_1 UTextBlock +---@field TextBlock_Count_2 UTextBlock +---@field TextBlock_Count_3 UTextBlock +---@field TextBlock_Count_4 UTextBlock +---@field TextBlock_ItemType_1 UTextBlock +---@field TextBlock_ItemType_2 UTextBlock +---@field TextBlock_ItemType_3 UTextBlock +---@field TextBlock_ItemType_4 UTextBlock +---@field TextBlock_Quality_1 UTextBlock +---@field TextBlock_Quality_2 UTextBlock +---@field TextBlock_Quality_3 UTextBlock +---@field TextBlock_Quality_4 UTextBlock +---@field TextBlock_SkillItem_Tips UTextBlock +---@field TextBlock_Tip_Slot1 UTextBlock +---@field TextBlock_Tip_Slot2 UTextBlock +---@field TextBlock_Tip_Slot3 UTextBlock +---@field Tips_Item UCanvasPanel +---@field Tips_Slot1 UCanvasPanel +---@field Tips_Slot2 UCanvasPanel +---@field Tips_Slot3 UCanvasPanel +---@field Tips_UseSkill UCanvasPanel +---@field UseSkill UCanvasPanel +---@field WidgetSwitcher_BG_1 UWidgetSwitcher +---@field WidgetSwitcher_BG_2 UWidgetSwitcher +---@field WidgetSwitcher_BG_3 UWidgetSwitcher +---@field WidgetSwitcher_BG_4 UWidgetSwitcher +--Edit Below-- +local WBP_ForceGuide_Backpack = { + bInitDoOnce = false, + CurUseSkillTimes = 0, --已装备技能次数 +}; +function WBP_ForceGuide_Backpack:OnStartGuideProgress() + self:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.Panel_Backpack:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.Panel_BG:Construct() + + self.PendingEndGuide = false + + self.OwningPawn = GameDataManager.GetLocalPlayerPawn() + self.OwningPC = GameDataManager.GetLocalPlayerController() + + self:UpdateItemMap(false) + self.CurUseSkillTimes = 0 + self.Panel_SkillSlot:SetVisibility(ESlateVisibility.Collapsed) + self.Button_Item.OnClicked:Add(self.OnItemClicked, self) + self.Button_UseSkill.OnClicked:Add(self.OnUseSkillClicked, self) + EventSystem:SendEvent(EventType.ForceGuide_OnGuideTriggered, 7) +end + +function WBP_ForceGuide_Backpack:OnEndGuideProgress() + self:SetVisibility(ESlateVisibility.Collapsed) + + EventSystem:RemoveListener(EventType.OnSetupSkillButton, WBP_ForceGuide_Backpack.OnSetupSkillButton, self) + EventSystem:RemoveListener(EventType.PlayerSkillCDTriggered, WBP_ForceGuide_Backpack.OnSkillCDTriggered, self) + self.Button_Item.OnClicked:Remove(self.OnItemClicked, self) + self.Button_UseSkill.OnClicked:Remove(self.OnUseSkillClicked, self) + EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 7) +end + +function WBP_ForceGuide_Backpack:UpdateItemMap(IsBackpackPanelInViewPort) + local ItemMap = self.OwningPC:GetItemMapByItemType(EItemType.SkillBook) + local ItemList = {} + for ID, Count in pairs(ItemMap) do + local Item = { + ItemID = ID, + Count = Count, + } + table.insert(ItemList, Item) + end + + self.ItemList = {} + + local ActiveSkillData = nil + local RaySkillData = nil + for i = 1, table.getCount(ItemList) do + local Data = ItemList[i] + local SkillName = GameDataManager.GetSkillNameById(Data.ItemID) + local SkillLevel = GameDataManager.GetSkillLevelById(Data.ItemID) + local Type = GameDataManager.GetSkillTypeByName(SkillName) + if Type == ESkillType.Active and ActiveSkillData == nil then + ActiveSkillData = Data + end + if Type == ESkillType.Passive and SkillName == ESkillName.Ray and SkillLevel == 4 and RaySkillData == nil then + RaySkillData = Data + end + end + + if ActiveSkillData ~= nil then + table.insert(self.ItemList, ActiveSkillData) + end + + if RaySkillData ~= nil then + table.insert(self.ItemList, 1, RaySkillData) + end + + if ActiveSkillData == nil and RaySkillData == nil then + return + end + + self:UpdateDisplayedItemList(self.ItemList) +end + +function WBP_ForceGuide_Backpack:SetupItemDatas(ItemList) + for i = 1, 4 do + local IndexStr = tostring(i) + local ItemData = ItemList[i] + if ItemData then + self["Item_"..IndexStr]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self["ItemText_"..IndexStr]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self["ItemBG_"..IndexStr]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self:SetItemData(i, ItemData) + else + self["Item_"..IndexStr]:SetVisibility(ESlateVisibility.Collapsed) + end + end +end + +function WBP_ForceGuide_Backpack:SetItemData(Index, InData) + local IndexStr = tostring(Index) + local ItemInfo = GameDataManager.GetItemInfoByItemID(InData.ItemID) + local Quality = GetItemQualityLevel(InData.ItemID) + UIManager.LoadTexture(self["Image_Icon_"..IndexStr], ItemInfo.Icon) + self["WidgetSwitcher_BG_"..IndexStr]:SetActiveWidgetIndex(Quality) + self["TextBlock_Quality_"..IndexStr]:SetText(Tables.QualityInfo[Quality][1]) + self["TextBlock_ItemType_"..IndexStr]:SetText(DropItemMap.SkillItemMap[InData.ItemID].SkillName) + self["TextBlock_Count_"..IndexStr]:SetText(tostring(InData.Count)) +end + +function WBP_ForceGuide_Backpack:UpdateDisplayedItemList(ItemList) + self:SetupItemDatas(ItemList) + self.UseSkill:SetVisibility(ESlateVisibility.Collapsed) + if not table.isEmpty(ItemList) then + self.Tips_Item:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + if self.CurUseSkillTimes < 1 then + self.TextBlock_SkillItem_Tips:SetText("您已获得一个新技能\n点击装备它吧") + else + self.TextBlock_SkillItem_Tips:SetText("还有一个技能\n同样装备上吧") + end + else + self.Tips_Item:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_ForceGuide_Backpack:OnItemClicked() + if table.isEmpty(self.ItemList) then + return + end + local ItemData = self.ItemList[1] + if ItemData == nil then + return + end + self.Tips_Item:SetVisibility(ESlateVisibility.Collapsed) + self.UseSkill:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.Tips_UseSkill:SetVisibility(ESlateVisibility.HitTestInvisible) +end + +function WBP_ForceGuide_Backpack:OnUseSkillClicked() + if table.isEmpty(self.ItemList) then + return + end + local ItemData = self.ItemList[1] + if ItemData == nil then + return + end + self.Tips_UseSkill:SetVisibility(ESlateVisibility.Collapsed) + local PC = GameDataManager.GetLocalPlayerController() + local SkillName = GameDataManager.GetSkillNameById(ItemData.ItemID) + local SkillLevel = GameDataManager.GetSkillLevelById(ItemData.ItemID) + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GiveSkill", SkillName, self.CurUseSkillTimes + 1, SkillLevel) + + table.remove(self.ItemList, 1) + self:UpdateDisplayedItemList(self.ItemList) + + self.CurUseSkillTimes = self.CurUseSkillTimes + 1 + if self.CurUseSkillTimes >= 2 then + self.Panel_Backpack:SetVisibility(ESlateVisibility.Collapsed) + self:SetupSkillButton() + end +end + +function WBP_ForceGuide_Backpack:SetupSkillButton() + self.Panel_SkillSlot:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.SkillButtons = { + [ESkillSlot.Slot1] = self.SkillBtn_Slot1, + [ESkillSlot.Slot2] = self.SkillBtn_Slot2, + [ESkillSlot.Slot3] = self.SkillBtn_Slot3, + } + self.SkillsMapping = { + [ESkillSlot.Slot1] = -1, + [ESkillSlot.Slot2] = -1, + [ESkillSlot.Slot3] = -1, + } + for _, Button in pairs(self.SkillButtons) do + if Button then + Button:Show() + end + end + local LocalPC = GameDataManager.GetLocalPlayerController() + if UE.IsValid(LocalPC) then + for Slot, SkillInfo in pairs(LocalPC.ActiveSkillNameList) do + self:OnSetupSkillButton(SkillInfo.SkillName, Slot, SkillInfo.SkillLevel) + end + end + EventSystem:AddListener(EventType.OnSetupSkillButton, WBP_ForceGuide_Backpack.OnSetupSkillButton, self) + EventSystem:AddListener(EventType.PlayerSkillCDTriggered, WBP_ForceGuide_Backpack.OnSkillCDTriggered, self) +end + +function WBP_ForceGuide_Backpack:OnSetupSkillButton(SkillName, SkillSlot, SkillLevel) + self.SkillsMapping[SkillSlot] = SkillName + local Button = self.SkillButtons[SkillSlot] + if Button then + Button:Show() + Button:SetupSkillButton(SkillName, SkillLevel) + self["Tips_Slot"..tostring(SkillSlot)]:SetVisibility(ESlateVisibility.HitTestInvisible) + if Button.IsPassiveSkill then + self["TextBlock_Tip_Slot"..tostring(SkillSlot)]:SetText("技能图标灰色为被动技能\n达到条件自动施放") + else + self["TextBlock_Tip_Slot"..tostring(SkillSlot)]:SetText("点击施放主动技能") + end + end +end + +function WBP_ForceGuide_Backpack:OnSkillCDTriggered(Slot, CD) + local Button = self:GetSkillButtonBySlot(Slot) + if Button then + UE.Log("[WBP_ForceGuide_Backpack:OnSkillCDTriggered] Slot=%d, CD=%.2f", Slot, CD) + Button:OnSkillCD(Slot, CD) + if CD > 1.0 then + if self.PendingEndGuide then + return + end + self.PendingEndGuide = true + + if self.Timer ~= nil then + EventSystem.StopTimer(self.Timer) + end + self.Timer = EventSystem.SetTimer(self, function() + self:OnEndGuideProgress() ---结束本阶段引导 + EventSystem.StopTimer(self.Timer) + self.Timer = nil + end, 0.5) + end + end +end + +function WBP_ForceGuide_Backpack:GetSkillButtonBySlot(InSkillSlot) + return self.SkillButtons[InSkillSlot] +end +return WBP_ForceGuide_Backpack; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_ForceGuide_BossInfo.lua b/GZJ/Script/UI/Guide/WBP_ForceGuide_BossInfo.lua new file mode 100644 index 00000000..843eb464 --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_ForceGuide_BossInfo.lua @@ -0,0 +1,210 @@ +---@class WBP_ForceGuide_BossInfo_C:UUserWidget +---@field Boss_1 UOverlay +---@field Boss_2 UOverlay +---@field Boss_3 UOverlay +---@field Boss_4 UBorder +---@field Button_1 UButton +---@field Button_2 UButton +---@field Button_3 UButton +---@field Button_4 UButton +---@field Image_Icon1 UImage +---@field Image_Icon2 UImage +---@field Image_Icon3 UImage +---@field Image_Icon4 UImage +---@field Image_Select1 UImage +---@field Image_Select2 UImage +---@field Image_Select3 UImage +---@field Image_Select4 UImage +---@field Image_SkillIcon1 UImage +---@field Image_SkillIcon2 UImage +---@field Panel_BG UWBP_WidgetHeader_C +---@field Panel_Tip_1 UCanvasPanel +---@field Panel_Tip_2 UCanvasPanel +---@field TextBlock_Attack UTextBlock +---@field TextBlock_BossName UTextBlock +---@field TextBlock_Characteristic UTextBlock +---@field TextBlock_Desc1 UTextBlock +---@field TextBlock_Desc2 UTextBlock +---@field TextBlock_Health UTextBlock +---@field TextBlock_SkillName1 UTextBlock +---@field TextBlock_SkillName2 UTextBlock +---@field TextBlock_SpawnTime UTextBlock +--Edit Below-- +local WBP_ForceGuide_BossInfo = { bInitDoOnce = false; }; + + +function WBP_ForceGuide_BossInfo:OnStartGuideProgress() + self:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + + self.Panel_BG:Construct() + + for i = 1, 4 do + self["Button_"..tostring(i)].OnClicked:Add(function() + self:SetupBossInfoPanel(i) + end, self) + end + + local BossList = UGCGameSystem.GameState.BossList + self:UpdateBossInfo(BossList) + + self.NextAllowedIndex = 1 + self:SetupBossInfoPanel(1) + + EventSystem:SendEvent(EventType.ForceGuide_OnGuideTriggered, 2) +end + +function WBP_ForceGuide_BossInfo:OnEndGuideProgress() + self:SetVisibility(ESlateVisibility.Collapsed) + + EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 2) +end + +function WBP_ForceGuide_BossInfo:UpdateBossInfo(BossList) + self.Panel_Tip_1:SetVisibility(ESlateVisibility.Collapsed) + self.Panel_Tip_2:SetVisibility(ESlateVisibility.Collapsed) + + if BossList == nil or #BossList <= 0 then return end + + for i = 1, 4 do + self["Boss_"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed) + end + + local BossNum = 0 + for _, ID in pairs(BossList) do + BossNum = BossNum + 1 + self:SetupBossData(BossNum, ID); + end + + self.TotalBossNum = BossNum + + for i = 1, 4 do + local BossData = self.BossInfo[i] + if BossData then + self["Boss_"..tostring(i)]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self["Image_Select"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed) + + UIManager.LoadTexture(self["Image_Icon"..tostring(i)], BossData.BossIcon) + end + end +end + +function WBP_ForceGuide_BossInfo:SetupBossData(Index, BossID) + if Tables.MonsterBaseConfig[BossID] == nil or Tables.MonsterBaseConfig[BossID].Type ~= EMonsterType.Boss then return end + + if self.BossInfo == nil then + self.BossInfo = {} + end + + local BossData = { + ID = 0, + SpawnWave = "", + BossName = "", + BossIcon = "", --放按钮上 + Characteristic = "", + SkillName1 = "", + SkillDesc1 = "", + SkillIcon1 = "", + SkillName2 = "", + SkillDesc2 = "", + SkillIcon2 = "", + } + BossData.ID = BossID + + local FightStageIndex = UGCGameSystem.GameState.GameDifficulty <= 3 and UGCGameSystem.GameState.GameDifficulty or 3 + local MonsterSpawnNum = Tables.GameFightStageConfig[FightStageIndex] + local BossSpawnInnings = {} + for i = 1, #MonsterSpawnNum do + if MonsterSpawnNum[i].MonsterNum.Boss > 0 then + table.insert(BossSpawnInnings, i) + end + end + if BossSpawnInnings[Index] then + BossData.SpawnWave = string.format("第%d回合", BossSpawnInnings[Index]) + else + return + end + + local TempBossConfig = Tables.MonsterBaseConfig[BossID] + + BossData.BossName = TempBossConfig.ChineseName + BossData.BossIcon = TempBossConfig.Icon + BossData.Characteristic = TempBossConfig.Characteristic + BossData.SkillName1 = TempBossConfig.SkillDescs[1].SkillName + BossData.SkillDesc1 = TempBossConfig.SkillDescs[1].SkillDesc + BossData.SkillIcon1 = TempBossConfig.SkillDescs[1].Icon + BossData.SkillName2 = TempBossConfig.SkillDescs[2].SkillName + BossData.SkillDesc2 = TempBossConfig.SkillDescs[2].SkillDesc + BossData.SkillIcon2 = TempBossConfig.SkillDescs[2].Icon + + self.BossInfo[Index] = BossData +end + +function WBP_ForceGuide_BossInfo:SetupBossInfoPanel(Index) + local BossData = self.BossInfo[Index] + if BossData == nil then + return + end + + if self.NextAllowedIndex ~= 0 and Index ~= self.NextAllowedIndex then + return + end + + if Index == self.TotalBossNum then + self.Panel_Tip_1:SetVisibility(ESlateVisibility.Collapsed) + self.Panel_Tip_2:SetVisibility(ESlateVisibility.Collapsed) + self.NextAllowedIndex = 0 + + if self.CloseHandle == nil then + self.CloseHandle = EventSystem.SetTimer(self, function() + self:OnEndGuideProgress() + EventSystem.StopTimer(self.CloseHandle) + self.CloseHandle = nil + end, 1.0) + end + elseif Index == 1 then + if self.NextAllowedIndex ~= 0 then + self.Panel_Tip_1:SetVisibility(ESlateVisibility.HitTestInvisible) + self.Panel_Tip_2:SetVisibility(ESlateVisibility.Collapsed) + self.NextAllowedIndex = 2 + end + elseif Index == 2 then + if self.NextAllowedIndex ~= 0 then + self.Panel_Tip_2:SetVisibility(ESlateVisibility.HitTestInvisible) + self.Panel_Tip_1:SetVisibility(ESlateVisibility.Collapsed) + self.NextAllowedIndex = 3 + end + else + self.Panel_Tip_1:SetVisibility(ESlateVisibility.Collapsed) + self.Panel_Tip_2:SetVisibility(ESlateVisibility.Collapsed) + self.NextAllowedIndex = 0 + end + + for i = 1, 4 do + if Index == i then + self["Image_Select"..tostring(i)]:SetVisibility(ESlateVisibility.Visible) + else + self["Image_Select"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed) + end + end + + self.TextBlock_BossName:SetText(BossData.BossName) + self.TextBlock_Characteristic:SetText(BossData.Characteristic) + self.TextBlock_SpawnTime:SetText(BossData.SpawnWave) + self.TextBlock_SkillName1:SetText(BossData.SkillName1) + self.TextBlock_SkillName2:SetText(BossData.SkillName2) + self.TextBlock_Desc1:SetText(BossData.SkillDesc1) + self.TextBlock_Desc2:SetText(BossData.SkillDesc2) + + UIManager.LoadTexture(self.Image_SkillIcon1, BossData.SkillIcon1) + UIManager.LoadTexture(self.Image_SkillIcon2, BossData.SkillIcon2) + + local MonsterGradeParam = MonsterParam["Boss"].GradeParam[Index] + self.TextBlock_Health:SetText(string.format('生命值:%.1fw', MonsterGradeParam.Health / 10000)) + + local AttackValue = MonsterGradeParam.AttackValue + local AttackTxt = AttackValue > 10000 and string.format('威力值:%.1fw', AttackValue / 10000) or string.format('威力值:%d', math.ceil(AttackValue)) + self.TextBlock_Attack:SetText(AttackTxt) +end + + +return WBP_ForceGuide_BossInfo; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_ForceGuide_Challenge.lua b/GZJ/Script/UI/Guide/WBP_ForceGuide_Challenge.lua new file mode 100644 index 00000000..af986a4a --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_ForceGuide_Challenge.lua @@ -0,0 +1,72 @@ +---@class WBP_ForceGuide_Challenge_C:UUserWidget +---@field Button_ChallengeMonsterInfo UButton +---@field Button_RequestChallenge UButton +---@field Image_Challenge1_Mask UImage +---@field Panel_BG UWBP_WidgetHeader_C +---@field Panel_Tip_ChallengeMonsterInfo UCanvasPanel +---@field Panel_Tip_RequestChallenge UCanvasPanel +--Edit Below-- +local WBP_ForceGuide_Challenge = { bInitDoOnce = false; }; + +function WBP_ForceGuide_Challenge:OnStartGuideProgress() + self:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + + self.Panel_BG:Construct() + + self.Image_Challenge1_Mask:SetVisibility(ESlateVisibility.Visible) + + self.Panel_Tip_ChallengeMonsterInfo:SetVisibility(ESlateVisibility.HitTestInvisible) + self.Panel_Tip_RequestChallenge:SetVisibility(ESlateVisibility.Collapsed) + + self.HasClickedInfoButton = false + self.PendingEndGuide = false + + self.Button_ChallengeMonsterInfo.OnClicked:Add(self.OnButton_ChallengeMonsterInfoClicked, self) + self.Button_RequestChallenge.OnClicked:Add(self.OnButton_RequestChallengeClicked, self) + + EventSystem:SendEvent(EventType.ForceGuide_OnGuideTriggered, 8) +end + +function WBP_ForceGuide_Challenge:OnEndGuideProgress() + self:SetVisibility(ESlateVisibility.Collapsed) + + self.Button_ChallengeMonsterInfo.OnClicked:Remove(self.OnButton_ChallengeMonsterInfoClicked, self) + self.Button_RequestChallenge.OnClicked:Remove(self.OnButton_RequestChallengeClicked, self) + + EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 8) +end + +function WBP_ForceGuide_Challenge:OnButton_ChallengeMonsterInfoClicked() + self.Panel_Tip_ChallengeMonsterInfo:SetVisibility(ESlateVisibility.Collapsed) + self.Panel_Tip_RequestChallenge:SetVisibility(ESlateVisibility.HitTestInvisible) + self.Image_Challenge1_Mask:SetVisibility(ESlateVisibility.Collapsed) + + self.HasClickedInfoButton = true +end + +function WBP_ForceGuide_Challenge:OnButton_RequestChallengeClicked() + if self.HasClickedInfoButton == false then + return + end + + if self.PendingEndGuide then + return + end + self.PendingEndGuide = true + + if self.Timer ~= nil then + EventSystem.StopTimer(self.Timer) + end + self.Timer = EventSystem.SetTimer(self, function() + self:SetVisibility(ESlateVisibility.Collapsed) + self:OnEndGuideProgress() + EventSystem.StopTimer(self.Timer) + self.Timer = nil + end, 0.5) + + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_ChallengeSucceed", 1, PC.PlayerKey, EMonsterType.ChallengeGold, 1, true) +end + + +return WBP_ForceGuide_Challenge; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_ForceGuide_Tech.lua b/GZJ/Script/UI/Guide/WBP_ForceGuide_Tech.lua new file mode 100644 index 00000000..5b7cd754 --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_ForceGuide_Tech.lua @@ -0,0 +1,53 @@ +---@class WBP_ForceGuide_Tech_C:UUserWidget +---@field Panel_BG UWBP_WidgetHeader_C +---@field TextBlock_KillPoint UTextBlock +---@field UniformGridPanel_Technology UUniformGridPanel +--Edit Below-- +local WBP_ForceGuide_Tech = { bInitDoOnce = false; }; + +function WBP_ForceGuide_Tech:OnStartGuideProgress() + self:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + + self.PendingEndGuide = false + + self.Panel_BG:Construct() + + EventSystem:AddListener(EventType.ForceGuide_TechBuy, self.OnTechBuy, self) + EventSystem:AddListener(EventType.PlayerKillPointChanged, self.ChangeKillPoint, self) + local TargetPlayerState = GameDataManager.GetLocalPlayerState() + self:ChangeKillPoint(TargetPlayerState.KillPoint.Current) + + EventSystem:SendEvent(EventType.ForceGuide_OnGuideTriggered, 1) +end + +function WBP_ForceGuide_Tech:OnEndGuideProgress() + self:SetVisibility(ESlateVisibility.Collapsed) + + EventSystem:RemoveListener(EventType.PlayerKillPointChanged, self.ChangeKillPoint, self) + EventSystem:RemoveListener(EventType.ForceGuide_TechBuy, self.OnTechBuy, self) + + EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 1) +end + +function WBP_ForceGuide_Tech:ChangeKillPoint(NewKillPoint) + self.TextBlock_KillPoint:SetText(string.format('%d', NewKillPoint)) +end + +function WBP_ForceGuide_Tech:OnTechBuy() + if self.PendingEndGuide then + return + end + self.PendingEndGuide = true + + if self.Timer ~= nil then + EventSystem.StopTimer(self.Timer) + end + self.Timer = EventSystem.SetTimer(self, function() + self:SetVisibility(ESlateVisibility.Collapsed) + self:OnEndGuideProgress() + EventSystem.StopTimer(self.Timer) + self.Timer = nil + end, 0.5) +end + +return WBP_ForceGuide_Tech; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_ForceGuide_Unpacking.lua b/GZJ/Script/UI/Guide/WBP_ForceGuide_Unpacking.lua new file mode 100644 index 00000000..72022340 --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_ForceGuide_Unpacking.lua @@ -0,0 +1,61 @@ +---@class WBP_ForceGuide_Unpacking_C:UUserWidget +---@field Button_Unpacking UButton +---@field Panel_BG UWBP_WidgetHeader_C +---@field TextBlock_CoinPoint UTextBlock +--Edit Below-- +local WBP_ForceGuide_Unpacking = { bInitDoOnce = false; }; + +function WBP_ForceGuide_Unpacking:OnStartGuideProgress() + self:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + + self.PendingEndGuide = false + + self.Panel_BG:Construct() + + self.Button_Unpacking.OnClicked:Add(self.OnButton_UnpackingClicked, self) + + local TargetPlayerState = GameDataManager.GetLocalPlayerState() + self:ChangeCoinPoint(TargetPlayerState.CoinPoint.Current) + + EventSystem:AddListener(EventType.PlayerCoinPointChanged, self.ChangeCoinPoint, self) + EventSystem:SendEvent(EventType.ForceGuide_OnGuideTriggered, 3) +end + +function WBP_ForceGuide_Unpacking:OnEndGuideProgress() + self:SetVisibility(ESlateVisibility.Collapsed) + + self.Button_Unpacking.OnClicked:Remove(self.OnButton_UnpackingClicked, self) + + EventSystem:RemoveListener(EventType.PlayerCoinPointChanged, self.ChangeCoinPoint, self) + EventSystem:SendEvent(EventType.ForceGuide_OnGuideFinished, 3) +end + +function WBP_ForceGuide_Unpacking:ChangeCoinPoint(NewCoinPoint) + self.TextBlock_CoinPoint:SetText(tostring(math.ceil(NewCoinPoint))) +end + +function WBP_ForceGuide_Unpacking:OnUnpackingSuccess() + if self.PendingEndGuide then + return + end + self.PendingEndGuide = true + + if self.Timer ~= nil then + EventSystem.StopTimer(self.Timer) + end + self.Timer = EventSystem.SetTimer(self, function() + self:SetVisibility(ESlateVisibility.Collapsed) + self:OnEndGuideProgress() + EventSystem.StopTimer(self.Timer) + self.Timer = nil + end, 0.5) +end + +function WBP_ForceGuide_Unpacking:OnButton_UnpackingClicked() + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, UGCGameSystem.GameState, "Server_RPC_Unpacking", PC.PlayerKey, 1, 1) + + self:OnUnpackingSuccess() +end + +return WBP_ForceGuide_Unpacking; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_GuidePanel.lua b/GZJ/Script/UI/Guide/WBP_GuidePanel.lua new file mode 100644 index 00000000..791af3af --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_GuidePanel.lua @@ -0,0 +1,68 @@ +---@class WBP_GuidePanel_C:UUserWidget +---@field Overlay_GuideRoot UOverlay +--Edit Below-- +local WBP_GuidePanel = { + TriggeredGuide = {} +}; + +function WBP_GuidePanel:Construct() + WBP_GuidePanel.SuperClass.Construct(self) + + self.TipsPanel = {} + self.TipWidgetClasses = { + [EGuideWidgetType.Square] = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Guide/WBP_GuideTips_1.WBP_GuideTips_1_C')), + [EGuideWidgetType.Round] = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Guide/WBP_GuideTips_2.WBP_GuideTips_2_C')), + } +end + +function WBP_GuidePanel:Destruct() + WBP_GuidePanel.SuperClass.Destruct(self) +end + +function WBP_GuidePanel:RemoveAllGuide() + for ID, GuideTip in pairs(self.TriggeredGuide) do + if GuideTip and UE.IsValid(GuideTip) then + GuideTip:RemoveFromParent() + self.TriggeredGuide[ID] = nil + end + end +end + +function WBP_GuidePanel:InitFromParam(GuideData) + self:SetupGuideWidget(GuideData) +end + +function WBP_GuidePanel:SetupGuideWidget(InGuideData) + local GuideID = InGuideData.ID + if GuideID == nil or self.TriggeredGuide[GuideID] ~= nil then + return + end + + local TipClass = self.TipWidgetClasses[InGuideData.GuideType] + if TipClass == nil or UE.IsValid(TipClass) == false then + return + end + + local WidgetData = { + UIConfig = {UIType = InGuideData.LinkedUIType, Component = InGuideData.LinkedComponent}, + TextConfig = {TextType = InGuideData.GuideTextType, Text = InGuideData.GuideText} + } + + local TipWidget = UserWidget.NewWidgetObjectBP(self, TipClass) + self.Overlay_GuideRoot:AddChild(TipWidget) + + TipWidget:SetGuideActionInfo(WidgetData) + self.TriggeredGuide[GuideID] = TipWidget +end + +function WBP_GuidePanel:RemoveGuideWidget(InID) + local TipWidget = self.TriggeredGuide[InID] + if TipWidget == nil or UE.IsValid(TipWidget) == false then + return + end + + TipWidget:RemoveFromParent() + self.TriggeredGuide[InID] = nil +end + +return WBP_GuidePanel; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_GuideTipsBase.lua b/GZJ/Script/UI/Guide/WBP_GuideTipsBase.lua new file mode 100644 index 00000000..a40b4936 --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_GuideTipsBase.lua @@ -0,0 +1,29 @@ +---@class NewUGCWidgetBlueprint_C:UAEUserWidget +--Edit Below-- +local WBP_GuideTipsBase = {}; + +function WBP_GuideTipsBase:Construct() + WBP_GuideTipsBase.SuperClass.Construct(self) +end + +function WBP_GuideTipsBase:Destruct() + WBP_GuideTipsBase.SuperClass.Destruct(self) +end + +function WBP_GuideTipsBase:SetGuideActionInfo(Data) + self.ResetPositionHandle = EventSystem.SetTimer(self, function() + self:ResetPosition(Data.UIConfig) + self:ResetGuideText(Data.TextConfig) + self.ResetPositionHandle = nil + end, 0.1) +end + +---Virtual +function WBP_GuideTipsBase:ResetPosition(UIConfig) +end + +---Virtual +function WBP_GuideTipsBase:ResetGuideText(TextConfig) +end + +return WBP_GuideTipsBase; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_GuideTips_0.lua b/GZJ/Script/UI/Guide/WBP_GuideTips_0.lua new file mode 100644 index 00000000..b1179ddf --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_GuideTips_0.lua @@ -0,0 +1,83 @@ +---@class WBP_GuideTips_0_C:UAEUserWidget +---@field Button_Close UButton +---@field Button_L UButton +---@field Button_R UButton +---@field CanvasPanel_IPX UCanvasPanel +---@field Image_Paging_00 UImage +---@field Image_Paging_01 UImage +---@field Image_Paging_02 UImage +---@field Image_Paging_03 UImage +---@field WidgetSwitcher_Tips UWidgetSwitcher +--Edit Below-- +local WBP_GuideTips_0 = { + bInitDoOnce = false; + CurIndex = 0, +}; + +local ColorList = { + {R = 0.287441, G = 0.287441, B = 0.287441, A = 1.0}, + {R = 1, G = 0.508881, B = 0.138432, A = 1.0}, +} + +function WBP_GuideTips_0:Construct() + self.Button_R.OnClicked:Add(WBP_GuideTips_0.OnButtonRClicked, self) + self.Button_L.OnClicked:Add(WBP_GuideTips_0.OnButtonLClicked, self) + self.Button_Close.OnClicked:Add(WBP_GuideTips_0.OnButtonCloseClicked, self) + + self.PagingImgs = { + self.Image_Paging_00, + self.Image_Paging_01, + self.Image_Paging_02, + self.Image_Paging_03, + } + + self.CurIndex = 0 + self:OnCurIndexChanged(self.CurIndex) +end + +function WBP_GuideTips_0:Destruct() + self.Button_R.OnClicked:Remove(WBP_GuideTips_0.OnButtonRClicked, self) + self.Button_L.OnClicked:Remove(WBP_GuideTips_0.OnButtonLClicked, self) + self.Button_Close.OnClicked:Remove(WBP_GuideTips_0.OnButtonCloseClicked, self) +end + +function WBP_GuideTips_0:OnShowPanel() + if NewPlayerGuideManager then + NewPlayerGuideManager:RemoveGuide(1) + end +end + +function WBP_GuideTips_0:OnButtonRClicked() + self.CurIndex = math.clamp(self.CurIndex + 1, 0, 3) + self:OnCurIndexChanged(self.CurIndex) +end + +function WBP_GuideTips_0:OnButtonLClicked() + self.CurIndex = math.clamp(self.CurIndex - 1, 0, 3) + self:OnCurIndexChanged(self.CurIndex) +end + +function WBP_GuideTips_0:OnCurIndexChanged(CurIndex) + self.WidgetSwitcher_Tips:SetActiveWidgetIndex(CurIndex) + self:SetPagingImg(CurIndex) +end + +function WBP_GuideTips_0:SetPagingImg(Index) + for i, PagingImg in pairs(self.PagingImgs) do + if i == (Index + 1) then + PagingImg:SetColorAndOpacity(ColorList[2]) + else + PagingImg:SetColorAndOpacity(ColorList[1]) + end + end +end + +function WBP_GuideTips_0:OnButtonCloseClicked() + --close UI + if UIManager:IsVisiblePanel(EUIType.GeneralGuide) then + UIManager:ClosePanel(EUIType.GeneralGuide) + end +end + + +return WBP_GuideTips_0; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_GuideTips_1.lua b/GZJ/Script/UI/Guide/WBP_GuideTips_1.lua new file mode 100644 index 00000000..51be7568 --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_GuideTips_1.lua @@ -0,0 +1,91 @@ +---@class WBP_GuideTips_1_C:WBP_GuideTipsBase_C +---@field CanvasPanel_Tips_1 UCanvasPanel +---@field CanvasPanel_Tips_2 UCanvasPanel +---@field CanvasPanel_Tips_3 UCanvasPanel +---@field CanvasPanel_Tips_4 UCanvasPanel +---@field Panel_Root UCanvasPanel +---@field Panel_Tips UCanvasPanel +---@field RichText_Tips_1 UUTRichTextBlock +---@field RichText_Tips_2 UUTRichTextBlock +---@field RichText_Tips_3 UUTRichTextBlock +---@field RichText_Tips_4 UUTRichTextBlock +--Edit Below-- + +local GuideBase = require('Script.UI.Guide.WBP_GuideTipsBase') +local WBP_GuideTips_1 = setmetatable( + { + bInitDoOnce = false, + + TipTextPanels = {}, + TipRichTexts = {}, + }, + { + __index = GuideBase, + __metatable = GuideBase + } +); + +function WBP_GuideTips_1:Construct() + self.TipTextPanels = { + [EGuideTextType.Right] = self.CanvasPanel_Tips_1, + [EGuideTextType.Top] = self.CanvasPanel_Tips_2, + [EGuideTextType.Left] = self.CanvasPanel_Tips_3, + [EGuideTextType.Down] = self.CanvasPanel_Tips_4, + } + + self.TipRichTexts = { + [EGuideTextType.Right] = self.RichText_Tips_1, + [EGuideTextType.Top] = self.RichText_Tips_2, + [EGuideTextType.Left] = self.RichText_Tips_3, + [EGuideTextType.Down] = self.RichText_Tips_4, + } +end + +function WBP_GuideTips_1:ResetPosition(UIConfig) + local MappingWidget = UIConfig + + self.Panel_Root:SetVisibility(ESlateVisibility.HitTestInvisible) + + if MappingWidget then + local SlotSize = MappingWidget.Slot:GetSize() + local SlotAlignment = MappingWidget.Slot:GetAlignment() + local _, Pos = SlateBlueprintLibrary.LocalToViewport(self, MappingWidget:GetCachedGeometry(), + {X = SlotAlignment.X * SlotSize.X, Y = SlotAlignment.Y * SlotSize.Y}) + Pos.X = Pos.X + SlotSize.X * (0.5 - SlotAlignment.X) + Pos.Y = Pos.Y + SlotSize.Y * (0.5 - SlotAlignment.Y) + self.Panel_Root.Slot:SetPosition(Pos) + + local GuideSize = self.Panel_Tips.Slot:GetSize() + local HLXScale = SlotSize.X / self.Panel_Tips.Slot:GetSize().X + local HLYScale = SlotSize.Y / self.Panel_Tips.Slot:GetSize().Y + local TransScale = MappingWidget.RenderTransform.Scale + local SizeXY = {X = GuideSize.X * HLXScale * TransScale.X, Y = GuideSize.Y * HLYScale * TransScale.Y} + self.Panel_Tips.Slot:SetSize(SizeXY) + end +end + +function WBP_GuideTips_1:ResetGuideText(TextConfig) + local TextType = TextConfig.TextType + local TipText = TextConfig.Text + self:SetupTipPanel(TextType, TipText) +end + +function WBP_GuideTips_1:SetupTipPanel(TextType, TipText) + if TextType == nil or TextType <= EGuideTextType.None or TipText == nil or TipText == "" then + for _, Panel in pairs(self.TipTextPanels) do + Panel:SetVisibility(ESlateVisibility.Collapsed) + end + return + end + + for Type, Panel in pairs(self.TipTextPanels) do + if Type == TextType then + Panel:SetVisibility(ESlateVisibility.HitTestInvisible) + self.TipRichTexts[TextType]:SetText(TipText) + else + Panel:SetVisibility(ESlateVisibility.Collapsed) + end + end +end + +return WBP_GuideTips_1; \ No newline at end of file diff --git a/GZJ/Script/UI/Guide/WBP_GuideTips_2.lua b/GZJ/Script/UI/Guide/WBP_GuideTips_2.lua new file mode 100644 index 00000000..2e6e6f87 --- /dev/null +++ b/GZJ/Script/UI/Guide/WBP_GuideTips_2.lua @@ -0,0 +1,93 @@ +---@class WBP_GuideTips_2_C:WBP_GuideTipsBase_C +---@field CanvasPanel_Tips_1 UCanvasPanel +---@field CanvasPanel_Tips_2 UCanvasPanel +---@field CanvasPanel_Tips_3 UCanvasPanel +---@field CanvasPanel_Tips_4 UCanvasPanel +---@field Panel_Root UCanvasPanel +---@field Panel_Tips UCanvasPanel +---@field RichText_Tips_1 UUTRichTextBlock +---@field RichText_Tips_2 UUTRichTextBlock +---@field RichText_Tips_3 UUTRichTextBlock +---@field RichText_Tips_4 UUTRichTextBlock +--Edit Below-- + +local GuideBase = require('Script.UI.Guide.WBP_GuideTipsBase') +local WBP_GuideTips_2 = setmetatable( + { + bInitDoOnce = false, + + TipTextPanels = {}, + TipRichTexts = {}, + }, + { + __index = GuideBase, + __metatable = GuideBase + } +); + +function WBP_GuideTips_2:Construct() + self.TipTextPanels = { + [EGuideTextType.Right] = self.CanvasPanel_Tips_1, + [EGuideTextType.Top] = self.CanvasPanel_Tips_2, + [EGuideTextType.Left] = self.CanvasPanel_Tips_3, + [EGuideTextType.Down] = self.CanvasPanel_Tips_4, + } + + self.TipRichTexts = { + [EGuideTextType.Right] = self.RichText_Tips_1, + [EGuideTextType.Top] = self.RichText_Tips_2, + [EGuideTextType.Left] = self.RichText_Tips_3, + [EGuideTextType.Down] = self.RichText_Tips_4, + } +end + +function WBP_GuideTips_2:ResetPosition(UIConfig) + local MappingWidget = UIConfig + + self.Panel_Root:SetVisibility(ESlateVisibility.HitTestInvisible) + + if MappingWidget then + local SlotSize = MappingWidget.Slot:GetSize() + local SlotAlignment = MappingWidget.Slot:GetAlignment() + local _, Pos = SlateBlueprintLibrary.LocalToViewport(self, MappingWidget:GetCachedGeometry(), + {X = SlotAlignment.X * SlotSize.X, Y = SlotAlignment.Y * SlotSize.Y}) + Pos.X = Pos.X + SlotSize.X * (0.5 - SlotAlignment.X) + Pos.Y = Pos.Y + SlotSize.Y * (0.5 - SlotAlignment.Y) + self.Panel_Root.Slot:SetPosition(Pos) + + local GuideSize = self.Panel_Tips.Slot:GetSize() + local HLXScale = SlotSize.X / self.Panel_Tips.Slot:GetSize().X + local HLYScale = SlotSize.Y / self.Panel_Tips.Slot:GetSize().Y + local TransScale = MappingWidget.RenderTransform.Scale + local SizeXY = {X = GuideSize.X * HLXScale * TransScale.X, Y = GuideSize.Y * HLYScale * TransScale.Y} + self.Panel_Tips.Slot:SetSize(SizeXY) + else + self:SetVisibility(ESlateVisibility.Collapsed); + end +end + +function WBP_GuideTips_2:ResetGuideText(TextConfig) + local TextType = TextConfig.TextType + local TipText = TextConfig.Text + self:SetupTipPanel(TextType, TipText) +end + +function WBP_GuideTips_2:SetupTipPanel(TextType, TipText) + if TextType == nil or TextType <= EGuideTextType.None or TipText == nil or TipText == "" then + for _, Panel in pairs(self.TipTextPanels) do + Panel:SetVisibility(ESlateVisibility.Collapsed) + end + return + end + + for Type, Panel in pairs(self.TipTextPanels) do + if Type == TextType then + Panel:SetVisibility(ESlateVisibility.HitTestInvisible) + self.TipRichTexts[TextType]:SetText(TipText) + else + Panel:SetVisibility(ESlateVisibility.Collapsed) + end + end +end + +return WBP_GuideTips_2; \ No newline at end of file diff --git a/GZJ/Script/UI/Monster/WBP_MonsterHealth.lua b/GZJ/Script/UI/Monster/WBP_MonsterHealth.lua new file mode 100644 index 00000000..08995491 --- /dev/null +++ b/GZJ/Script/UI/Monster/WBP_MonsterHealth.lua @@ -0,0 +1,20 @@ +---@class WBP_MonsterHealth_C:UUserWidget +---@field ProgressBar_0 UProgressBar +--Edit Below-- +local WBP_MonsterHealth = { bInitDoOnce = false; }; + +--[==[ Construct +function WBP_MonsterHealth:Construct() + +end +-- Construct ]==] + +-- function WBP_MonsterHealth:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_MonsterHealth:Destruct() + +-- end + +return WBP_MonsterHealth; \ No newline at end of file diff --git a/GZJ/Script/UI/Narration/WBP_BossNarration.lua b/GZJ/Script/UI/Narration/WBP_BossNarration.lua new file mode 100644 index 00000000..007708df --- /dev/null +++ b/GZJ/Script/UI/Narration/WBP_BossNarration.lua @@ -0,0 +1,65 @@ +---@class WBP_BossNarration_C:UUserWidget +---@field TextBlock_Narration UTextBlock +--Edit Below-- +local WBP_BossNarration = { + bInitDoOnce = false, + VisibilityTimerHandle = nil, +}; + +local KillPlayerNarrationTxt = { + [0] = "蝼蚁们,来迎接世界末日,体验地狱的味道吧!", + [1] = "小喽啰,不堪一击。", + [2] = "以卵击石?", + [3] = "就跟宰小鸡仔一样,无趣的很啊。", + [4] = "换一批吧,这批太弱了。", +} + +local HealthPercentNarrationTxt = { + {value = 0.8, txt = "哟,居然还有点疼,再用点力哦!"}, + {value = 0.5, txt = "好吧,你们有资格让我重视,小心了。"}, + {value = 0.3, txt = "啊,居然受伤了!你们惹怒我了!"}, + {value = 0.1, txt = "停停停,不要得寸进尺!我们可以坐下来谈!"}, + {value = 0.0, txt = "等着!我还会再来的!"}, +} + +function WBP_BossNarration:Construct() + self:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_BossNarration:UpdateKilledPlayerNum(KilledPlayerNum) + if self.VisibilityTimerHandle ~= nil then + EventSystem.StopTimer(self.VisibilityTimerHandle) + end + KilledPlayerNum = math.clamp(KilledPlayerNum, 0, 4) + self:UpdateNarrationText(KillPlayerNarrationTxt[KilledPlayerNum]) +end + +function WBP_BossNarration:UpdateOwnerHealth(CurrentHP, MaxHP) + local NarrationText = "" + for i, v in pairs(HealthPercentNarrationTxt) do + local Percent = CurrentHP / MaxHP + if math.isNearlyEqual(Percent, v.value, 0.01) then + NarrationText = v.txt + self:UpdateNarrationText(v.txt) + break + end + end +end + +function WBP_BossNarration:UpdateNarrationText(InText) + self:SetVisibility(ESlateVisibility.HitTestInvisible) + self.TextBlock_Narration:SetText(InText) + + if self.VisibilityTimerHandle ~= nil then + EventSystem.StopTimer(self.VisibilityTimerHandle) + end + self:SetupTimer() +end + +function WBP_BossNarration:SetupTimer() + self.VisibilityTimerHandle = EventSystem.SetTimer(self, function() + self:SetVisibility(ESlateVisibility.Collapsed) + end, 3) +end + +return WBP_BossNarration; \ No newline at end of file diff --git a/GZJ/Script/UI/Narration/WBP_CrystalNarration.lua b/GZJ/Script/UI/Narration/WBP_CrystalNarration.lua new file mode 100644 index 00000000..0e9ad733 --- /dev/null +++ b/GZJ/Script/UI/Narration/WBP_CrystalNarration.lua @@ -0,0 +1,44 @@ +---@class WBP_CrystalNarration_C:UUserWidget +---@field TextBlock_Narration UTextBlock +--Edit Below-- +local WBP_CrystalNarration = { + bInitDoOnce = false, + VisibilityTimerHandle = nil, +}; + +local HealthPercentNarrationTxt = { + {value = 0.5, txt = "兄弟们在干啥呢?还不快来帮我嘎了这些小垃圾!"}, + {value = 0.1, txt = "兄弟们使点劲啊!不然,不然我就要生气啦!"}, + {value = 0.0, txt = "哎,所托非人啊!来世一定要擦亮眼睛,选好良人托付!"}, +} + +function WBP_CrystalNarration:Construct() + self:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_CrystalNarration:UpdateOwnerHealthPercent(Percent) + for i, v in pairs(HealthPercentNarrationTxt) do + if math.isNearlyEqual(Percent, v.value, 0.01) then + self:UpdateNarrationText(v.txt) + break + end + end +end + +function WBP_CrystalNarration:UpdateNarrationText(InText) + self:SetVisibility(ESlateVisibility.HitTestInvisible) + self.TextBlock_Narration:SetText(InText) + + if self.VisibilityTimerHandle ~= nil then + EventSystem.StopTimer(self.VisibilityTimerHandle) + end + self:SetupTimer() +end + +function WBP_CrystalNarration:SetupTimer() + self.VisibilityTimerHandle = EventSystem.SetTimer(self, function() + self:SetVisibility(ESlateVisibility.Collapsed) + end, 3) +end + +return WBP_CrystalNarration; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_AttackWaveNotice.lua b/GZJ/Script/UI/Notice/WBP_AttackWaveNotice.lua new file mode 100644 index 00000000..350e1ada --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_AttackWaveNotice.lua @@ -0,0 +1,43 @@ +---@class WBP_AttackWaveNotice_C:WBP_NoticeBase_C +---@field FadeOut UWidgetAnimation +---@field FadeIn UWidgetAnimation +---@field TextBlock_CurWave UTextBlock +---@field TextBlock_TotalWave UTextBlock +--Edit Below-- + +local NoticeBase = require('Script.UI.Notice.WBP_NoticeBase') +local WBP_AttackWaveNotice = setmetatable( + { + bInitDoOnce = false, + }, + { + __index = NoticeBase, + __metatable = NoticeBase + } +); + +function WBP_AttackWaveNotice:InitNoticeFromParam(InParams) + if type(InParams) ~= "table" then + return + end + + local CurWave = InParams.CurWave + local TotalWave = InParams.TotalWave + if type(CurWave) == "string" or type(CurWave) == "number" then + self.TextBlock_CurWave:SetText(CurWave) + end + + if type(TotalWave) == "string" or type(TotalWave) == "number" then + self.TextBlock_TotalWave:SetText(TotalWave) + end +end + +function WBP_AttackWaveNotice:GetEnterAnimation() + return self.FadeIn +end + +function WBP_AttackWaveNotice:GetExitAnimation() + return self.FadeOut +end + +return WBP_AttackWaveNotice; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_AttackWaveRemainTimeNotice.lua b/GZJ/Script/UI/Notice/WBP_AttackWaveRemainTimeNotice.lua new file mode 100644 index 00000000..f78dc387 --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_AttackWaveRemainTimeNotice.lua @@ -0,0 +1,74 @@ +---@class WBP_AttackWaveRemainTimeNotice_C:UUserWidget +---@field FadeOut UWidgetAnimation +---@field FadeIn UWidgetAnimation +---@field TextBlock_Minute UTextBlock +---@field TextBlock_RecommandAttackValue UTextBlock +---@field TextBlock_Second UTextBlock +--Edit Below-- + +local NoticeBase = require('Script.UI.Notice.WBP_NoticeBase') +local WBP_AttackWaveRemainTimeNotice = setmetatable( + { + bInitDoOnce = false, + }, + { + __index = NoticeBase, + __metatable = NoticeBase + } +); + +local RecommandAttackValueTable = { + 421, + 793, + 1453, + 2421, + 3871, + 5406, + 8637, + 10416, + 15157, + 18949, + 29138, + 34304, +} + +function WBP_AttackWaveRemainTimeNotice:Construct() + EventSystem:AddListener(EventType.OnCurAttackWaveChanged, WBP_AttackWaveRemainTimeNotice.OnCurAttackWaveChanged, self) +end + +function WBP_AttackWaveRemainTimeNotice:InitNoticeFromParam(InParams) + if type(InParams) ~= "table" then + return + end + + local RemainTime = InParams.RemainTime + if type(RemainTime) == "number" then + local Min = string.format("%02d", RemainTime // 60) + local Sec = string.format("%02d", RemainTime % 60) + + self.TextBlock_Minute:SetText(Min) + self.TextBlock_Second:SetText(Sec) + end +end + +function WBP_AttackWaveRemainTimeNotice:GetEnterAnimation() + return self.FadeIn +end + +function WBP_AttackWaveRemainTimeNotice:GetExitAnimation() + return self.FadeOut +end + +function WBP_AttackWaveRemainTimeNotice:OnCurAttackWaveChanged(CurAttackWave) + if CurAttackWave > 0 then + local CurAttackValue = RecommandAttackValueTable[CurAttackWave] + if CurAttackValue then + self.TextBlock_RecommandAttackValue:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.TextBlock_RecommandAttackValue:SetText("推荐战斗力: "..tostring(math.floor(CurAttackValue))) + end + else + self.TextBlock_RecommandAttackValue:SetVisibility(ESlateVisibility.Collapsed) + end +end + +return WBP_AttackWaveRemainTimeNotice; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_CountDownNotice.lua b/GZJ/Script/UI/Notice/WBP_CountDownNotice.lua new file mode 100644 index 00000000..173dc936 --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_CountDownNotice.lua @@ -0,0 +1,57 @@ +---@class WBP_CountDownNotice_C:WBP_NoticeBase_C +---@field FadeOut UWidgetAnimation +---@field FadeIn UWidgetAnimation +---@field Img_Alert UImage +---@field TextBlock_CountDownHeader UTextBlock +---@field TextBlock_CountDownRemainTime UTextBlock +--Edit Below-- + +local NoticeBase = require('Script.UI.Notice.WBP_NoticeBase') +local WBP_CountDownNotice = setmetatable( + { + bInitDoOnce = false, + RemainTime = -1, + }, + { + __index = NoticeBase, + __metatable = NoticeBase + } +); + +function WBP_CountDownNotice:Construct() + WBP_CountDownNotice.SuperClass.Construct(self) +end + +function WBP_CountDownNotice:Tick(MyGeometry, InDeltaTime) + if self.RemainTime >= 0.0 then + self.RemainTime = self.RemainTime - InDeltaTime + self.TextBlock_CountDownRemainTime:SetText(tostring(math.ceil(self.RemainTime))) + else + self.bCanEverTick = false + return + end +end + +function WBP_CountDownNotice:InitNoticeFromParam(InParams) + if type(InParams) ~= "table" then + return + end + + local AlertVisibility = InParams.ShowAlert and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed + self.Img_Alert:SetVisibility(AlertVisibility) + + self.TextBlock_CountDownHeader:SetText(InParams.Txt) + + self.RemainTime = tonumber(InParams.Time) + self.bCanEverTick = true +end + +function WBP_CountDownNotice:GetEnterAnimation() + return self.FadeIn +end + +function WBP_CountDownNotice:GetExitAnimation() + return self.FadeOut +end + +return WBP_CountDownNotice; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_GlobalNotice.lua b/GZJ/Script/UI/Notice/WBP_GlobalNotice.lua new file mode 100644 index 00000000..7f252dc1 --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_GlobalNotice.lua @@ -0,0 +1,64 @@ +---@class WBP_GlobalNotice_C:WBP_NoticeBase_C +---@field FadeOut UWidgetAnimation +---@field FadeIn UWidgetAnimation +---@field Img_Alert UImage +---@field TextBlock_Txt1 UTextBlock +---@field TextBlock_Txt2 UTextBlock +---@field TextBlock_Txt3 UTextBlock +--Edit Below-- + +local NoticeBase = require('Script.UI.Notice.WBP_NoticeBase') +local WBP_GlobalNotice = setmetatable( + { + bInitDoOnce = false, + }, + { + __index = NoticeBase, + __metatable = NoticeBase + } +); + +function WBP_GlobalNotice:InitNoticeFromParam(InParams) + if type(InParams) ~= "table" then + return + end + + local AlertVisibility = InParams.ShowAlert and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed + self.Img_Alert:SetVisibility(AlertVisibility) + + self.TextBlock_Txt1:SetVisibility(ESlateVisibility.Collapsed) + self.TextBlock_Txt2:SetVisibility(ESlateVisibility.Collapsed) + self.TextBlock_Txt3:SetVisibility(ESlateVisibility.Collapsed) + + local Log ="" + local Txt = InParams.Txt + local TxtType = type(Txt) + if type(Txt) == "table" then + for index, str in pairs(Txt) do + if type(str) == "string" then + local TextBlock = self["TextBlock_Txt"..tostring(index)] + if UE.IsValid(TextBlock) then + TextBlock:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + TextBlock:SetText(str) + Log = Log..str..", index = "..tostring(index) + end + end + end + elseif type(Txt) == "string" then + Log = Log..Txt..", " + self.TextBlock_Txt1:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.TextBlock_Txt1:SetText(Txt) + Log = Log.."Txt1" + end + UE.Log("[WBP_GlobalNotice:InitNoticeFromParam] Type=%s, ShowAlert = %d, Txt = %s", TxtType, AlertVisibility, Log) +end + +function WBP_GlobalNotice:GetEnterAnimation() + return self.FadeIn +end + +function WBP_GlobalNotice:GetExitAnimation() + return self.FadeOut +end + +return WBP_GlobalNotice; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_InitialNotice.lua b/GZJ/Script/UI/Notice/WBP_InitialNotice.lua new file mode 100644 index 00000000..4c0206bb --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_InitialNotice.lua @@ -0,0 +1,44 @@ +---@class WBP_InitialNotice_C:WBP_NoticeBase_C +---@field FadeOut UWidgetAnimation +---@field FadeIn UWidgetAnimation +---@field NewButton_Close UNewButton +---@field TextBlock_Txt1 UTextBlock +--Edit Below-- + +local NoticeBase = require('Script.UI.Notice.WBP_NoticeBase') +local WBP_InitialNotice = setmetatable( + { + bInitDoOnce = false, + }, + { + __index = NoticeBase, + __metatable = NoticeBase + } +); + +function WBP_InitialNotice:Construct() + self.SuperClass:Construct() + print(string.format('[WBP_InitialNotice:Construct] 执行')) + + self.NewButton_Close.OnClicked:Add(self.OnClickClose, self); +end + +function WBP_InitialNotice:GetEnterAnimation() + return self.FadeIn +end + +function WBP_InitialNotice:GetExitAnimation() + return self.FadeOut +end + +function WBP_InitialNotice:OnClickClose() + print(string.format('[WBP_InitialNotice:OnClickClose] 执行关闭')) + self:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_InitialNotice:OnMouseButtonDown(MyGeometry, PointerEvent) + self.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) + print(string.format('[WBP_InitialNotice:OnMouseButtonDown] 鼠标点下')) +end + +return WBP_InitialNotice; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_InitialNotice_V2.lua b/GZJ/Script/UI/Notice/WBP_InitialNotice_V2.lua new file mode 100644 index 00000000..884f2265 --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_InitialNotice_V2.lua @@ -0,0 +1,29 @@ +---@class WBP_InitialNotice_V2_C:UUserWidget +---@field Button_Close UButton +---@field TextBlock_Txt1 UTextBlock +--Edit Below-- +local WBP_InitialNotice_V2 = { bInitDoOnce = false; }; + +function WBP_InitialNotice_V2:Construct() + self.SuperClass:Construct() + + self.Button_Close.OnClicked:Add(WBP_InitialNotice_V2.OnClickClose, self) +end + +-- function WBP_InitialNotice_V2:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_InitialNotice_V2:Destruct() + +-- end + +function WBP_InitialNotice_V2:OnClickClose() + print(string.format('[WBP_InitialNotice_V2:OnClickClose] 执行')) + self:SetVisibility(ESlateVisibility.Collapsed) + -- 发送一个 RPC + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_CloseInitialNotice", PC.PlayerKey); +end + +return WBP_InitialNotice_V2; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_NoticeBase.lua b/GZJ/Script/UI/Notice/WBP_NoticeBase.lua new file mode 100644 index 00000000..efc78ae0 --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_NoticeBase.lua @@ -0,0 +1,58 @@ +---@class WBP_NoticeBase_C:UUserWidget +--Edit Below-- +local WBP_NoticeBase = { + bInitDoOnce = false, +} + +function WBP_NoticeBase:Construct() + WBP_NoticeBase.SuperClass.Construct(self) +end + +function WBP_NoticeBase:Destruct() + WBP_NoticeBase.SuperClass.Destruct(self) +end + +function WBP_NoticeBase:InitNoticeFromParam(InParams) +end + +function WBP_NoticeBase:GetEnterAnimation() + return nil +end + +function WBP_NoticeBase:GetExitAnimation() + return nil +end + +function WBP_NoticeBase:ShowEnterAnimation() + self:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + local ExitAnim = self:GetExitAnimation() + if ExitAnim and self:IsAnimationPlaying(ExitAnim) then + self:UnbindAllFromAnimationFinished(ExitAnim) + self:StopAnimation(ExitAnim) + end + + local EnterAnim = self:GetEnterAnimation() + if EnterAnim then + self:PlayAnimation(EnterAnim, 0.0, 1, EUMGSequencePlayMode.Forward, 1.0) + end +end + +function WBP_NoticeBase:DefaultClose() + local ExitAnim = self:GetExitAnimation() + if ExitAnim then + local AnimFinishDelegate = ObjectExtend.CreateDelegate(self, + function() + self:CloseNotice() + end) + self:BindToAnimationFinished(ExitAnim, AnimFinishDelegate) + self:PlayAnimation(ExitAnim, 0.0, 1, EUMGSequencePlayMode.Forward, 1.0) + else + self:CloseNotice() + end +end + +function WBP_NoticeBase:CloseNotice() + self:SetVisibility(ESlateVisibility.Collapsed) +end + +return WBP_NoticeBase; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_RespawnNotice.lua b/GZJ/Script/UI/Notice/WBP_RespawnNotice.lua new file mode 100644 index 00000000..e3f7e88e --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_RespawnNotice.lua @@ -0,0 +1,53 @@ +---@class WBP_RespawnNotice_C:WBP_NoticeBase_C +---@field FadeOut UWidgetAnimation +---@field FadeIn UWidgetAnimation +---@field TextBlock_RespawnRemainTime UTextBlock +--Edit Below-- + +local NoticeBase = require('Script.UI.Notice.WBP_NoticeBase') +local WBP_RespawnNotice = setmetatable( + { + bInitDoOnce = false, + RemainRespawnTime = -1, + }, + { + __index = NoticeBase, + __metatable = NoticeBase + } +); + +function WBP_RespawnNotice:Construct() + WBP_RespawnNotice.SuperClass.Construct(self) +end + +function WBP_RespawnNotice:Tick(MyGeometry, InDeltaTime) + if self.RemainRespawnTime >= 0.0 then + self.RemainRespawnTime = self.RemainRespawnTime - InDeltaTime + self.TextBlock_RespawnRemainTime:SetText(tostring(math.ceil(self.RemainRespawnTime))) + else + self.bCanEverTick = false + return + end +end + +function WBP_RespawnNotice:InitNoticeFromParam(InParams) + if type(InParams) ~= "table" then + return + end + + local Type = type(InParams.Time) + if Type == 'string' or Type == 'number' then + self.RemainRespawnTime = tonumber(InParams.Time) + self.bCanEverTick = true + end +end + +function WBP_RespawnNotice:GetEnterAnimation() + return self.FadeIn +end + +function WBP_RespawnNotice:GetExitAnimation() + return self.FadeOut +end + +return WBP_RespawnNotice; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_RollingNotice.lua b/GZJ/Script/UI/Notice/WBP_RollingNotice.lua new file mode 100644 index 00000000..f7519adb --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_RollingNotice.lua @@ -0,0 +1,52 @@ +---@class WBP_RollingNotice_C:WBP_NoticeBase_C +---@field FadeOut UWidgetAnimation +---@field FadeIn UWidgetAnimation +---@field TextBlock_Text UUTRichTextBlock +--Edit Below-- + +local NoticeBase = require('Script.UI.Notice.WBP_NoticeBase') +local WBP_RollingNotice = setmetatable( + { + bInitDoOnce = false, + ParentWidget = nil, + }, + { + __index = NoticeBase, + __metatable = NoticeBase + } +); + +function WBP_RollingNotice:SetParentWidget(InParent) + self.ParentWidget = InParent +end + +function WBP_RollingNotice:InitNoticeFromParam(InParams) + local Type = InParams.Type + local RichText = "" + if Type == ERollingNoticeType.Gain then + RichText = RichText..'获得' + elseif Type == ERollingNoticeType.Drop then + RichText = RichText..'丢弃' + end + + RichText = RichText..string.format('%s', InParams.Color, InParams.Text) + RichText = InParams.Num <= 0 and RichText or RichText..string.format('%s', '+'..tostring(InParams.Num)) + + self.TextBlock_Text:SetText(RichText) +end + +function WBP_RollingNotice:GetEnterAnimation() + return self.FadeIn +end + +function WBP_RollingNotice:GetExitAnimation() + return self.FadeOut +end + +function WBP_RollingNotice:CloseNotice() + if UE.IsValid(self.ParentWidget) then + self.ParentWidget:RequestPopup() + end +end + +return WBP_RollingNotice; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_RollingNoticePanel.lua b/GZJ/Script/UI/Notice/WBP_RollingNoticePanel.lua new file mode 100644 index 00000000..e4a91296 --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_RollingNoticePanel.lua @@ -0,0 +1,99 @@ +---@class WBP_RollingNoticePanel_C:UUserWidget +---@field VerticalBox_Notice UVerticalBox +---@field WBP_RollingNotice UWBP_RollingNotice_C +---@field WBP_RollingNotice_0 UWBP_RollingNotice_C +---@field WBP_RollingNotice_2 UWBP_RollingNotice_C +---@field WBP_RollingNotice_3 UWBP_RollingNotice_C +---@field WBP_RollingNotice_4 UWBP_RollingNotice_C +---@field WBP_RollingNotice_5 UWBP_RollingNotice_C +--Edit Below-- +local WBP_RollingNoticePanel = { + bInitDoOnce = false, + + NoticeItemWidgetClass = nil, + + NoticeMap = {}, + NoticeNumLimit = 6, +}; + +function WBP_RollingNoticePanel:Construct() + self.bCanEverTick = true + self.NoticeMap = {} + + self.VerticalBox_Notice:ClearChildren() + self.NoticeItemWidgetClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/Notice/WBP_RollingNotice.WBP_RollingNotice_C')) + + EventSystem:AddListener(EventType.ShowRollingNotice, WBP_RollingNoticePanel.OnReceiveRollingNoticeData, self) +end + +function WBP_RollingNoticePanel:Destruct() + EventSystem:RemoveListener(EventType.ShowRollingNotice, WBP_RollingNoticePanel.OnReceiveRollingNoticeData, self) + + self.NoticeMap = nil +end + +function WBP_RollingNoticePanel:Tick(MyGeometry, InDeltaTime) + if table.getCount(self.NoticeMap) > 0 then + local NoticeNow = self.NoticeMap[1] + NoticeNow.Duration = NoticeNow.Duration + InDeltaTime + if NoticeNow.Duration >= NoticeNow.ShowTime then + local NoticeNowWidget = self.VerticalBox_Notice:GetChildAt(0) + if UE.IsValid(NoticeNowWidget) then + NoticeNowWidget:DefaultClose() + table.remove(self.NoticeMap, 1) + end + end + end +end + +---接收滚动提示 +---@param NoticeData table table{Text, Color, Num} (Color, Num可选) +---@param NoticeType ERollingNoticeType 滚动提示类型(可选) +---@param ShowTime number 该词条显示时间(可选) +function WBP_RollingNoticePanel:OnReceiveRollingNoticeData(NoticeData, NoticeType, ShowTime) + if type(NoticeData) ~= 'table' or NoticeData.Text == nil then + return + end + + local RollingNoticeData = { + ShowTime = ShowTime and ShowTime + 0.1 or 0.5, + Duration = 0, + Params = { + Type = NoticeType or ERollingNoticeType.None, + Text = NoticeData.Text, + Color = NoticeData.Color or "FFFFFFFF", + Num = NoticeData.Num or 0, + } + } + + self:ShowRollingNotice(RollingNoticeData) +end + +function WBP_RollingNoticePanel:ShowRollingNotice(InNoticeData) + if self.VerticalBox_Notice:GetChildrenCount() < self.NoticeNumLimit then + self:CreateNewNotice(InNoticeData) + end + table.insert(self.NoticeMap, InNoticeData) +end + +function WBP_RollingNoticePanel:CreateNewNotice(NoticeData) + local NoticeWidget = UserWidget.NewWidgetObjectBP(self, self.NoticeItemWidgetClass) + self.VerticalBox_Notice:AddChild(NoticeWidget) + NoticeWidget:InitNoticeFromParam(NoticeData.Params) + NoticeWidget:SetParentWidget(self) + NoticeWidget:ShowEnterAnimation() + return NoticeWidget +end + +function WBP_RollingNoticePanel:RequestPopup() + self.VerticalBox_Notice:RemoveChildAt(0) + + local RemainNoticeNum = table.getCount(self.NoticeMap) + local Count = self.VerticalBox_Notice:GetChildrenCount() + if RemainNoticeNum > Count and Count < self.NoticeNumLimit then + local NoticeData = self.NoticeMap[Count + 1] + self:CreateNewNotice(NoticeData) + end +end + +return WBP_RollingNoticePanel; \ No newline at end of file diff --git a/GZJ/Script/UI/Notice/WBP_WarningFrameNotice.lua b/GZJ/Script/UI/Notice/WBP_WarningFrameNotice.lua new file mode 100644 index 00000000..0f6ca2d2 --- /dev/null +++ b/GZJ/Script/UI/Notice/WBP_WarningFrameNotice.lua @@ -0,0 +1,65 @@ +---@class WBP_WarningFrameNotice_C:WBP_NoticeBase_C +---@field FadeOut UWidgetAnimation +---@field WarningLoop UWidgetAnimation +---@field FadeIn UWidgetAnimation +---@field Img_Alert UImage +---@field Img_Warning UImage +---@field TextBlock_Warning UTextBlock +--Edit Below-- + +local NoticeBase = require('Script.UI.Notice.WBP_NoticeBase') +local WBP_WarningFrameNotice = setmetatable( + { + bInitDoOnce = false, + }, + { + __index = NoticeBase, + __metatable = NoticeBase + } +); + +function WBP_WarningFrameNotice:Construct() + WBP_WarningFrameNotice.SuperClass.Construct(self) + + self.Img_Warning:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_WarningFrameNotice:InitNoticeFromParam(InParams) + if type(InParams) ~= "table" then + return + end + + self.TextBlock_Warning:SetText(InParams.Txt) + self:SetupAnimation(InParams.NeedFrame) +end + +function WBP_WarningFrameNotice:SetupAnimation(bNeedFrame) + self:UnbindAllFromAnimationFinished(self.FadeIn) + if bNeedFrame then + local AnimFinishDelegate = ObjectExtend.CreateDelegate(self, + function() + self.Img_Warning:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self:PlayAnimation(self.WarningLoop, 0.0, 0, EUMGSequencePlayMode.Forward, 1.0) + end) + self:BindToAnimationFinished(self.FadeIn, AnimFinishDelegate) + end +end + +function WBP_WarningFrameNotice:GetEnterAnimation() + return self.FadeIn +end + +function WBP_WarningFrameNotice:GetExitAnimation() + return self.FadeOut +end + +function WBP_WarningFrameNotice:CloseNotice() + if self:IsAnimationPlaying(self.WarningLoop) then + self:StopAnimation(self.WarningLoop) + end + self.Img_Warning:SetVisibility(ESlateVisibility.Collapsed) + + self:SetVisibility(ESlateVisibility.Collapsed) +end + +return WBP_WarningFrameNotice; \ No newline at end of file diff --git a/GZJ/Script/UI/SceneObject/WBP_SceneObject.lua b/GZJ/Script/UI/SceneObject/WBP_SceneObject.lua new file mode 100644 index 00000000..153ced5d --- /dev/null +++ b/GZJ/Script/UI/SceneObject/WBP_SceneObject.lua @@ -0,0 +1,44 @@ +---@class WBP_SceneObject_C:UUserWidget +---@field TextBlock_ItemName UTextBlock +--Edit Below-- +local WBP_SceneObject = { bInitDoOnce = false; }; + +--[==[ Construct +function WBP_SceneObject:Construct() + +end +-- Construct ]==] + +-- function WBP_SceneObject:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_SceneObject:Destruct() + +-- end + +function WBP_SceneObject:SetItemData(InData) + -- 找到对应表 + -- print(string.format('[WBP_SceneObject:SetItemData] 执行')) + local FittingItemInfo = DropItemMap.FittingItemMap[InData] + local TheText = "" + if FittingItemInfo == nil then + FittingItemInfo = DropItemMap.SkillItemMap[InData] + if FittingItemInfo == nil then + print(string.format('[WBP_SceneObject:SetItemData] 当前不存在值 = %s 的元素', tostring(InData))) + return false + end + TheText = FittingItemInfo.SkillName + else + TheText = FittingItemInfo.WeaponType .. FittingItemInfo.FittingType + end + --TheText = FittingItemInfo.Quality .. TheText + self.TextBlock_ItemName:SetText(TheText) + local Color = Tables.ItemRarityColor[GetItemQualityLevel(InData)].Color + local SlateColor_ = { SpecifiedColor = Color, ColorUseRule = 0, } + self.TextBlock_ItemName:SetColorAndOpacity(SlateColor_) + -- print(string.format('[WBP_SceneObject:SetItemData] 设置完全')) + return true +end + +return WBP_SceneObject; \ No newline at end of file diff --git a/GZJ/Script/UI/Skill/WBP_SkillBtn.lua b/GZJ/Script/UI/Skill/WBP_SkillBtn.lua new file mode 100644 index 00000000..f890db91 --- /dev/null +++ b/GZJ/Script/UI/Skill/WBP_SkillBtn.lua @@ -0,0 +1,99 @@ +---@class WBP_SkillBtn_C:UAEUserWidget +---@field SkillBtn_Slot0 UWBP_SkillBtn_Item_2_C +---@field SkillBtn_Slot1 UWBP_SkillBtn_Item_C +---@field SkillBtn_Slot2 UWBP_SkillBtn_Item_C +---@field SkillBtn_Slot3 UWBP_SkillBtn_Item_C +---@field SkillBtn_Slot4 UWBP_SkillBtn_Item_C +--Edit Below-- +local WBP_SkillBtn = { + bInitOnce = false, + SkillButtons = {}, + SkillsMapping = {}, +}; + +function WBP_SkillBtn:Construct() + if self.bInitOnce then + return + end + + self.bInitOnce = true + self.bCanEverTick = true + + self.SkillButtons = { + [ESkillSlot.Slot0] = self.SkillBtn_Slot0, + [ESkillSlot.Slot1] = self.SkillBtn_Slot1, + [ESkillSlot.Slot2] = self.SkillBtn_Slot2, + [ESkillSlot.Slot3] = self.SkillBtn_Slot3, + [ESkillSlot.Slot4] = self.SkillBtn_Slot4, + } + self.SkillsMapping = { + [ESkillSlot.Slot0] = -1, + [ESkillSlot.Slot1] = -1, + [ESkillSlot.Slot2] = -1, + [ESkillSlot.Slot3] = -1, + [ESkillSlot.Slot4] = -1, + } + + for _, Button in pairs(self.SkillButtons) do + if Button then + Button:Show() + end + end + + local LocalPC = GameDataManager.GetLocalPlayerController() + if UE.IsValid(LocalPC) then + for Slot, SkillInfo in pairs(LocalPC.ActiveSkillNameList) do + self:OnSetupSkillButton(SkillInfo.SkillName, Slot, SkillInfo.SkillLevel) + end + end + + self:OnGameStageChange(UGCGameSystem.GameState.GameStage) + + EventSystem:AddListener(EventType.OnGameStageChanged, WBP_SkillBtn.OnGameStageChange, self) + EventSystem:AddListener(EventType.OnSetupSkillButton, WBP_SkillBtn.OnSetupSkillButton, self) + EventSystem:AddListener(EventType.PlayerSkillCDTriggered, WBP_SkillBtn.OnSkillCDTriggered, self) +end + +function WBP_SkillBtn:Destruct() + EventSystem:RemoveListener(EventType.OnGameStageChanged, WBP_SkillBtn.OnGameStageChange, self) + EventSystem:RemoveListener(EventType.OnSetupSkillButton, WBP_SkillBtn.OnSetupSkillButton, self) + EventSystem:RemoveListener(EventType.PlayerSkillCDTriggered, WBP_SkillBtn.OnSkillCDTriggered, self) +end + +---@param InGameStage EGameStage +function WBP_SkillBtn:OnGameStageChange(InGameStage) + if InGameStage == EGameStage.GameFight then + UIManager:VisiblePanel(EUIType.SkillButton) + end +end + +---@param SkillName ESkillName +---@param SkillSlot ESkillSlot +function WBP_SkillBtn:OnSetupSkillButton(SkillName, SkillSlot, SkillLevel) + UE.Log("[WBP_SkillBtn:OnSetupSkillButton] SkillName=%d, SkillSlot=%d, PlayerKey=%d", SkillName, SkillSlot, GameDataManager.GetLocalPlayerController().PlayerKey) + + self:OnGameStageChange(UGCGameSystem.GameState.GameStage) + + self.SkillsMapping[SkillSlot] = SkillName + local Button = self.SkillButtons[SkillSlot] + Button:Show() + Button:SetupSkillButton(SkillName, SkillLevel) +end + +---@param SkillName ESkillName +---@param CD float +function WBP_SkillBtn:OnSkillCDTriggered(Slot, CD) + local Button = self:GetSkillButtonBySlot(Slot) + if Button then + UE.Log("[WBP_SkillBtn:OnSkillCDTriggered] Slot=%d, CD=%.2f", Slot, CD) + Button:OnSkillCD(Slot, CD) + end +end + +---@param InSkillSlot ESkillSlot +---@return SkillButton +function WBP_SkillBtn:GetSkillButtonBySlot(InSkillSlot) + return self.SkillButtons[InSkillSlot] +end + +return WBP_SkillBtn; \ No newline at end of file diff --git a/GZJ/Script/UI/Skill/WBP_SkillBtn_Item.lua b/GZJ/Script/UI/Skill/WBP_SkillBtn_Item.lua new file mode 100644 index 00000000..94ec6a76 --- /dev/null +++ b/GZJ/Script/UI/Skill/WBP_SkillBtn_Item.lua @@ -0,0 +1,142 @@ +---@class WBP_SkillBtn_Item_C:UAEUserWidget +---@field Button_Skill UButton +---@field CanvasPanel_CD UCanvasPanel +---@field CanvasPanel_SkillSlot UCanvasPanel +---@field Image_BG UImage +---@field Image_BG_Level UImage +---@field Image_CDTime UImage +---@field Image_SkillIcon UImage +---@field TextBlock_CDTime UTextBlock +---@field TextBlock_SkillName UTextBlock +---@field SkillSlot TEnumAsByte +--Edit Below-- +local WBP_SkillBtn_Item = { + SkillName = -1, + SkillLevel = 1, + + CurrentSkillCDDurationTimer = 0, + CurrentSkillCDDuration = 0, + LastCDSeconds = 0, + + MatInst_CD = nil, + + IsPassiveSkill = false, + + Color_Normal = {R = 1.0, G = 1.0, B = 1.0, A = 1.0}, + Color_Disable = {R = 0.2, G = 0.2, B = 0.2, A = 1.0}, + + SkillBGColor = { R = 0, G = 0, B = 0, A = 0.4 }, -- 默认颜色 +}; + +function WBP_SkillBtn_Item:Construct() + self.bCanEverTick = true + + self.Button_Skill.OnPressed:Add(self.OnSkillButtonPressed, self) + + self.MatInst_CD = self.Image_CDTime:GetDynamicMaterial() + self.MatInst_CD:SetScalarParameterValue("Mask_Percent", 0) + + self.Image_BG_Level:BindingProperty("ColorAndOpacity", self.SetLevelBGColorAndOpacity, self) + self.Image_SkillIcon:BindingProperty("Visibility", self.SetIconVisibility, self) + self.Image_SkillIcon:BindingProperty("ColorAndOpacity", self.SetIconColorAndOpacity, self) + self.Image_CDTime:BindingProperty("Visibility", self.SetCDTimeVisibility, self) + self.TextBlock_SkillName:BindingProperty("Text", self.SetSkillNameText, self) + self.TextBlock_CDTime:BindingProperty("Visibility", self.SetCDTimeVisibility, self) + self.TextBlock_CDTime:BindingProperty("Text", self.SetCDTimeText, self) +end + +function WBP_SkillBtn_Item:Destruct() + self.MatInst_CD = nil +end + +function WBP_SkillBtn_Item:SetIconVisibility(ReturnValue) + return self.SkillName > 0 and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed +end + +function WBP_SkillBtn_Item:SetIconColorAndOpacity(ReturnValue) ---区分主动/被动技能 + return self.IsPassiveSkill and self.Color_Disable or self.Color_Normal +end + +function WBP_SkillBtn_Item:SetLevelBGColorAndOpacity(ReturnValue) + return self.SkillName > ESkillName.Heal and GlobalConfigs.QualityColor[self.SkillLevel] or self.SkillBGColor +end + +function WBP_SkillBtn_Item:SetCDTimeText(ReturnValue) + return tostring(self.LastCDSeconds) +end + +function WBP_SkillBtn_Item:SetCDTimeVisibility(ReturnValue) + return self.CurrentSkillCDDurationTimer > 0 and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed +end + +function WBP_SkillBtn_Item:SetSkillNameText(ReturnValue) + return self.SkillName > -1 and GameDataManager.GetSkillNameStrByName(SkillName) or "未装备" +end + +function WBP_SkillBtn_Item:SetIconTexture(InTexture) + UIManager.LoadTexture(self.Image_SkillIcon, InTexture) +end + +function WBP_SkillBtn_Item:SetupSkillButton(SkillName, SkillLevel) + self.SkillLevel = SkillLevel + self.SkillName = SkillName + self.IsPassiveSkill = GameDataManager.GetSkillTypeByName(SkillName) == ESkillType.Passive --主动/被动技能处理 + + local IconPath = GameDataManager.GetSkillIconPathByName(SkillName) + if IconPath ~= "" then + self:SetIconTexture(IconPath) + end + + self.TextBlock_SkillName:SetText(GameDataManager.GetSkillNameStrByName(SkillName)) +end + +function WBP_SkillBtn_Item:OnSkillButtonPressed() + if self.SkillName < 0 then + return + end + + if self.IsPassiveSkill == true then + UE.Log("[WBP_SkillBtn_Item:OnSkillButtonPressed] SkillName = %d is Passive Skill", self.SkillName) + return + end + + if self.CurrentSkillCDDurationTimer > 0 then + UE.Log("[WBP_SkillBtn_Item:OnSkillButtonPressed] SkillName = %d is in CD", self.SkillName) + return + end + + UE.Log("[WBP_SkillBtn_Item:OnSkillButtonPressed] Request cast skill. SkillName = %d", self.SkillName) + GameDataManager.GetLocalPlayerController():ClientOnCastSkill(self.SkillSlot) +end + +function WBP_SkillBtn_Item:OnSkillCD(Slot, CoolDownDuration) + if self.SkillSlot ~= Slot then + return + end + + self.CurrentSkillCDDuration = CoolDownDuration + self.CurrentSkillCDDurationTimer = CoolDownDuration + self.LastCDSeconds = math.floor(CoolDownDuration) +end + +function WBP_SkillBtn_Item:Tick(MyGeometry, InDeltaTime) + if self.CurrentSkillCDDurationTimer > 0 then + self.CurrentSkillCDDurationTimer = self.CurrentSkillCDDurationTimer - InDeltaTime + if self.CurrentSkillCDDurationTimer <= 0 then + self.CurrentSkillCDDurationTimer = 0 + return + end + + local CDSeconds = math.ceil(self.CurrentSkillCDDurationTimer) + if CDSeconds ~= self.LastCDSeconds then + self.LastCDSeconds = CDSeconds + UE.Log("[WBP_SkillBtn_Item:Tick] SkillName=%d, CurCD=%d", self.SkillName, CDSeconds) + end + + local CDPercent = self.CurrentSkillCDDurationTimer / self.CurrentSkillCDDuration + self.MatInst_CD:SetScalarParameterValue("Mask_Percent", CDPercent) + end +end + + +return WBP_SkillBtn_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/Skill/WBP_SkillBtn_Item_2.lua b/GZJ/Script/UI/Skill/WBP_SkillBtn_Item_2.lua new file mode 100644 index 00000000..7d75b51e --- /dev/null +++ b/GZJ/Script/UI/Skill/WBP_SkillBtn_Item_2.lua @@ -0,0 +1,124 @@ +---@class WBP_SkillBtn_Item_2_C:UAEUserWidget +---@field Button_Skill UButton +---@field CanvasPanel_CD UCanvasPanel +---@field CanvasPanel_SkillSlot UCanvasPanel +---@field Image_BG UImage +---@field Image_BG_Level UImage +---@field Image_CDTime UImage +---@field Image_SkillIcon UImage +---@field TextBlock_CDTime UTextBlock +---@field TextBlock_SkillName UTextBlock +---@field SkillSlot TEnumAsByte +--Edit Below-- +local WBP_SkillBtn_Item_2 = { + SkillName = -1, + SkillLevel = 1, + + CurrentSkillCDDurationTimer = 0, + CurrentSkillCDDuration = 0, + LastCDSeconds = 0, + + MatInst_CD = nil, + + IsPassiveSkill = false, + + Color_Normal = {R = 1.0, G = 1.0, B = 1.0, A = 1.0}, + Color_Disable = {R = 0.2, G = 0.2, B = 0.2, A = 1.0}, + +}; + +function WBP_SkillBtn_Item_2:Construct() + self.bCanEverTick = true + + self.Button_Skill.OnPressed:Add(self.OnSkillButtonPressed, self) + + self.MatInst_CD = self.Image_CDTime:GetDynamicMaterial() + self.MatInst_CD:SetScalarParameterValue("Mask_Percent", 0) + + self.Image_SkillIcon:BindingProperty("ColorAndOpacity", self.SetIconColorAndOpacity, self) + self.Image_CDTime:BindingProperty("Visibility", self.SetCDTimeVisibility, self) + self.TextBlock_CDTime:BindingProperty("Visibility", self.SetCDTimeVisibility, self) + self.TextBlock_CDTime:BindingProperty("Text", self.SetCDTimeText, self) +end + +function WBP_SkillBtn_Item_2:Destruct() + self.MatInst_CD = nil +end + +function WBP_SkillBtn_Item_2:SetIconColorAndOpacity(ReturnValue) ---区分主动/被动技能 + return self.IsPassiveSkill and self.Color_Disable or self.Color_Normal +end + +function WBP_SkillBtn_Item_2:SetCDTimeText(ReturnValue) + return tostring(self.LastCDSeconds) +end + +function WBP_SkillBtn_Item_2:SetCDTimeVisibility(ReturnValue) + return self.CurrentSkillCDDurationTimer > 0 and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed +end + +function WBP_SkillBtn_Item_2:SetIconTexture(InTexture) + UIManager.LoadTexture(self.Image_SkillIcon, InTexture) +end + +function WBP_SkillBtn_Item_2:SetupSkillButton(SkillName, SkillLevel) + self.SkillName = SkillName + self.IsPassiveSkill = GameDataManager.GetSkillTypeByName(SkillName) == ESkillType.Passive --主动/被动技能处理 + + local IconPath = GameDataManager.GetSkillIconPathByName(SkillName) + if IconPath ~= "" then + self:SetIconTexture(IconPath) + end + + self.TextBlock_SkillName:SetText(GameDataManager.GetSkillNameStrByName(SkillName)) +end + +function WBP_SkillBtn_Item_2:OnSkillButtonPressed() + if self.SkillName < 0 then + return + end + + if self.IsPassiveSkill == true then + UE.Log("[WBP_SkillBtn_Item_2:OnSkillButtonPressed] SkillName = %d is Passive Skill", self.SkillName) + return + end + + if self.CurrentSkillCDDurationTimer > 0 then + UE.Log("[WBP_SkillBtn_Item_2:OnSkillButtonPressed] SkillName = %d is in CD", self.SkillName) + return + end + + UE.Log("[WBP_SkillBtn_Item_2:OnSkillButtonPressed] Request cast skill. SkillName = %d", self.SkillName) + GameDataManager.GetLocalPlayerController():ClientOnCastSkill(self.SkillSlot) +end + +function WBP_SkillBtn_Item_2:OnSkillCD(Slot, CoolDownDuration) + if self.SkillSlot ~= Slot then + return + end + + self.CurrentSkillCDDuration = CoolDownDuration + self.CurrentSkillCDDurationTimer = CoolDownDuration + self.LastCDSeconds = math.floor(CoolDownDuration) +end + +function WBP_SkillBtn_Item_2:Tick(MyGeometry, InDeltaTime) + if self.CurrentSkillCDDurationTimer > 0 then + self.CurrentSkillCDDurationTimer = self.CurrentSkillCDDurationTimer - InDeltaTime + if self.CurrentSkillCDDurationTimer <= 0 then + self.CurrentSkillCDDurationTimer = 0 + return + end + + local CDSeconds = math.ceil(self.CurrentSkillCDDurationTimer) + if CDSeconds ~= self.LastCDSeconds then + self.LastCDSeconds = CDSeconds + UE.Log("[WBP_SkillBtn_Item_2:Tick] SkillName=%d, CurCD=%d", self.SkillName, CDSeconds) + end + + local CDPercent = self.CurrentSkillCDDurationTimer / self.CurrentSkillCDDuration + self.MatInst_CD:SetScalarParameterValue("Mask_Percent", CDPercent) + end +end + +return WBP_SkillBtn_Item_2; \ No newline at end of file diff --git a/GZJ/Script/UI/UI_Root.lua b/GZJ/Script/UI/UI_Root.lua new file mode 100644 index 00000000..617c928a --- /dev/null +++ b/GZJ/Script/UI/UI_Root.lua @@ -0,0 +1,52 @@ +---@class UI_Root_C:UAEUserWidget +---@field BattleGuideRoot UOverlay +---@field BattleNoticeRoot UOverlay +---@field BattleRoot UOverlay +---@field CommonGuideRoot UOverlay +---@field CommonNoticeRoot UOverlay +---@field CommonRoot UOverlay +---@field GeneralGuideRoot UOverlay +---@field MiddleRoot UOverlay +---@field SettlementRoot UOverlay +--Edit Below-- +local UI_Root = {}; + +function UI_Root:Construct() + self.Root = {} + self.Root[UIRoot.BattleRoot] = self.BattleRoot + self.Root[UIRoot.BattleGuideRoot] = self.BattleGuideRoot + self.Root[UIRoot.BattleNoticeRoot] = self.BattleNoticeRoot + self.Root[UIRoot.MiddleRoot] = self.MiddleRoot + self.Root[UIRoot.CommonRoot] = self.CommonRoot + self.Root[UIRoot.CommonGuideRoot] = self.CommonGuideRoot + self.Root[UIRoot.CommonNoticeRoot] = self.CommonNoticeRoot + self.Root[UIRoot.GeneralGuideRoot] = self.GeneralGuideRoot + self.Root[UIRoot.SettlementRoot] = self.SettlementRoot +end + +function UI_Root:SetUIRoot(InWidget, RootName) + if RootName == nil then + RootName = UIRoot.MiddleRoot + end + + if InWidget.MyRoot == RootName then + return + end + + local ParentRoot = self:GetParentPanel(RootName) + if ParentRoot == nil then + return + end + + local OverlaySlot = ParentRoot:AddChildToOverlay(InWidget) + OverlaySlot:SetHorizontalAlignment(EHorizontalAlignment.HAlign_Fill) + OverlaySlot:SetVerticalAlignment(EVerticalAlignment.VAlign_Fill) + + InWidget.MyRoot = RootName +end + +function UI_Root:GetParentPanel(RootName) + return self.Root[RootName] +end + +return UI_Root; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_ActiveMonsterTalk.lua b/GZJ/Script/UI/WBP_ActiveMonsterTalk.lua new file mode 100644 index 00000000..1d8016f1 --- /dev/null +++ b/GZJ/Script/UI/WBP_ActiveMonsterTalk.lua @@ -0,0 +1,29 @@ +---@class WBP_ActiveMonsterTalk_C:ObjectPositionWidget +---@field TextBlock_Talk UTextBlock +--Edit Below-- +local WBP_ActiveMonsterTalk = { bInitDoOnce = false; }; + +--[==[ Construct +function WBP_ActiveMonsterTalk:Construct() + +end +-- Construct ]==] + +-- function WBP_ActiveMonsterTalk:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_ActiveMonsterTalk:Destruct() + +-- end + +function WBP_ActiveMonsterTalk:SetTalkText(InType) + local Talk = MonsterTalkContent[InType] + if Talk == nil then + return + else + self.TextBlock_Talk:SetText(Talk.Content); + end +end + +return WBP_ActiveMonsterTalk; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_AttackBossPanel.lua b/GZJ/Script/UI/WBP_AttackBossPanel.lua new file mode 100644 index 00000000..4e1fdcb3 --- /dev/null +++ b/GZJ/Script/UI/WBP_AttackBossPanel.lua @@ -0,0 +1,157 @@ +---@class WBP_AttackBossPanel_C:UUserWidget +---@field Anim_Fade_Out UWidgetAnimation +---@field Anim_Fade_In UWidgetAnimation +---@field Button_Trigger UButton +---@field CheckBox_Boss_1 UCheckBox +---@field CheckBox_Boss_2 UCheckBox +---@field CheckBox_Boss_3 UCheckBox +---@field CheckBox_Boss_4 UCheckBox +---@field Panel_Button_Trigger UCanvasPanel +---@field Panel_Info UCanvasPanel +---@field Panel_Player_1 UCanvasPanel +---@field Panel_Player_2 UCanvasPanel +---@field Panel_Player_3 UCanvasPanel +---@field Panel_Player_4 UCanvasPanel +---@field ProogressBar_Damage_Player_1 UProgressBar +---@field ProogressBar_Damage_Player_2 UProgressBar +---@field ProogressBar_Damage_Player_3 UProgressBar +---@field ProogressBar_Damage_Player_4 UProgressBar +---@field TextBlock_Damage_Player_1 UTextBlock +---@field TextBlock_Damage_Player_2 UTextBlock +---@field TextBlock_Damage_Player_3 UTextBlock +---@field TextBlock_Damage_Player_4 UTextBlock +---@field TextBlock_Name_Player_1 UTextBlock +---@field TextBlock_Name_Player_2 UTextBlock +---@field TextBlock_Name_Player_3 UTextBlock +---@field TextBlock_Name_Player_4 UTextBlock +---@field TextBlock_Percent_Player_1 UTextBlock +---@field TextBlock_Percent_Player_2 UTextBlock +---@field TextBlock_Percent_Player_3 UTextBlock +---@field TextBlock_Percent_Player_4 UTextBlock +---@field WidgetSwitcher_Trigger UWidgetSwitcher +--Edit Below-- +local WBP_AttackBossPanel = { + bInitDoOnce = false, + bHasTriggered = false, + CheckBoxList = {}, + CurIndex = 0, + PlayerDamageList = {}, +} + +function WBP_AttackBossPanel:Construct() + WBP_AttackBossPanel.SuperClass.Construct(self) + + if self.bInitDoOnce then + return + end + + self.bInitDoOnce = true + + self.CurIndex = 1 + + local AnimFinishDelegate = ObjectExtend.CreateDelegate(self, + function() + if self.bHasTriggered then + self.Panel_Info:SetRenderOpacity(1) + else + self.Panel_Info:SetRenderOpacity(0) + end + end) + self:BindToAnimationFinished(self.Anim_Fade_In, AnimFinishDelegate) + self.Button_Trigger.OnClicked:Add(WBP_AttackBossPanel.OnTriggerButtonClicked, self) + + self.CheckBoxList ={ + self.CheckBox_Boss_1, + self.CheckBox_Boss_2, + self.CheckBox_Boss_3, + self.CheckBox_Boss_4, + } + + for index, CheckBox in ipairs(self.CheckBoxList) do + CheckBox.OnCheckStateChanged:Add( + function(bIsChecked) + if bIsChecked then + self.CurIndex = index + self:OnCurIndexChanged(self.CurIndex) + end + end, self) + end + + EventSystem:AddListener(EventType.OnPlayerDamageChanged, WBP_AttackBossPanel.OnPlayerDamageChanged, self) +end + +function WBP_AttackBossPanel:Destruct() + EventSystem:RemoveListener(EventType.OnPlayerDamageChanged, WBP_AttackBossPanel.OnPlayerDamageChanged, self) + self:UnbindAllFromAnimationFinished(self.Anim_Fade_In) + self.Button_Trigger.OnClicked:Remove(WBP_AttackBossPanel.OnTriggerButtonClicked, self) + + WBP_AttackBossPanel.SuperClass.Destruct(self) +end + +function WBP_AttackBossPanel:OnTriggerButtonClicked() + self.bHasTriggered = not self.bHasTriggered + + local Anim = self.bHasTriggered and self.Anim_Fade_In or self.Anim_Fade_Out + self:PlayAnimation(Anim, 0.0, 1, EUMGSequencePlayMode.Forward, 1.0) + + local WidgetIndex = self.bHasTriggered and 1 or 0 + self.WidgetSwitcher_Trigger:SetActiveWidgetIndex(WidgetIndex) + + if self.bHasTriggered then + self:OnPlayerDamageChanged(UGCGameSystem.GameState.PlayerDamageList) + end +end + +function WBP_AttackBossPanel:OnCurIndexChanged(InIndex) + for index, CheckBox in ipairs(self.CheckBoxList) do + if index ~= InIndex then + CheckBox:SetIsChecked(false) + end + end + + for i = 1, 4 do + self["Panel_Player_"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed) + self["CheckBox_Boss_"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed) + end + for index, _ in pairs(self.BossList) do + self["CheckBox_Boss_"..tostring(index)]:SetVisibility(ESlateVisibility.Visible) + end + + local TotalDamage = 0.0 + local CurBossID = self.BossList[self.CurIndex] + local CurDamageInfoList = {} + + for PlayerKey, DamageInfo in pairs(self.PlayerDamageList) do + local DamageValue = tonumber(DamageInfo[CurBossID]) + TotalDamage = TotalDamage + DamageValue + + local CurDamageInfo = {PlayerName = "", CurDamage = 0.0} + CurDamageInfo.PlayerName = self.PlayerDataList[PlayerKey].PlayerName + CurDamageInfo.CurDamage = DamageValue + + table.insert(CurDamageInfoList, CurDamageInfo) + end + + for index, DamageInfo in pairs(CurDamageInfoList) do + self["Panel_Player_"..tostring(index)]:SetVisibility(ESlateVisibility.HitTestInvisible) + self["TextBlock_Name_Player_"..tostring(index)]:SetText(DamageInfo.PlayerName) + self["TextBlock_Damage_Player_"..tostring(index)]:SetText(tostring(math.ceil(DamageInfo.CurDamage))) + + local DamagePercent = math.isNearlyEqual(TotalDamage, 0.0, 0.001) and 0 or DamageInfo.CurDamage / TotalDamage + self["ProogressBar_Damage_Player_"..tostring(index)]:SetPercent(DamagePercent) + self["TextBlock_Percent_Player_"..tostring(index)]:SetText(tostring(math.ceil(DamagePercent * 100).."%")) + end +end + +function WBP_AttackBossPanel:OnPlayerDamageChanged(InPlayerDamageList) + if self.bHasTriggered then + self.PlayerDamageList = InPlayerDamageList + self.BossList = UGCGameSystem.GameState.BossList + self.PlayerDataList = UGCGameSystem.GameState.PlayerDataList + self.CheckBoxList[self.CurIndex]:SetIsChecked(true) + self:OnCurIndexChanged(self.CurIndex) + end +end + + +return WBP_AttackBossPanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_AttributePanel.lua b/GZJ/Script/UI/WBP_AttributePanel.lua new file mode 100644 index 00000000..68b24c44 --- /dev/null +++ b/GZJ/Script/UI/WBP_AttributePanel.lua @@ -0,0 +1,132 @@ +---@class WBP_AttributePanel_C:UUserWidget +---@field NewButton_Toggle UNewButton +---@field Panel_AdvanceAttributes UCanvasPanel +---@field Panel_BaseAttributes UCanvasPanel +---@field Panel_BG UWBP_WidgetHeader_C +---@field Panel_BonusAttributes UCanvasPanel +---@field Panel_EconomyAttributes UCanvasPanel +---@field Panel_GrowthAttributes UCanvasPanel +---@field Panel_Main UCanvasPanel +---@field TextBlock_Adv_AdditionalAttack UTextBlock +---@field TextBlock_Adv_CriticalAttack UTextBlock +---@field TextBlock_Adv_CriticalAttackRate UTextBlock +---@field TextBlock_Adv_DefencePenetration UTextBlock +---@field TextBlock_Adv_DefencePenetrationPercent UTextBlock +---@field TextBlock_Adv_FinalAttack UTextBlock +---@field TextBlock_Adv_FireAttack UTextBlock +---@field TextBlock_Base_Attack UTextBlock +---@field TextBlock_Base_AttackIntervalReduction UTextBlock +---@field TextBlock_Base_AttackRange UTextBlock +---@field TextBlock_Base_AttackSpeed UTextBlock +---@field TextBlock_Base_DamageReduction UTextBlock +---@field TextBlock_Base_Defence UTextBlock +---@field TextBlock_Base_EvadeRate UTextBlock +---@field TextBlock_Base_MaxEnergy UTextBlock +---@field TextBlock_Base_MaxHP UTextBlock +---@field TextBlock_Base_RecoverEnergy UTextBlock +---@field TextBlock_Base_RecoverEnergyPercent UTextBlock +---@field TextBlock_Base_RecoverHP UTextBlock +---@field TextBlock_Base_RecoverHPPercent UTextBlock +---@field TextBlock_Base_Toughness UTextBlock +---@field TextBlock_Base_Vamp UTextBlock +---@field TextBlock_Bonus_Attack UTextBlock +---@field TextBlock_Bonus_CriticalAttack UTextBlock +---@field TextBlock_Bonus_DamageReduction UTextBlock +---@field TextBlock_Bonus_Defence UTextBlock +---@field TextBlock_Bonus_FireAttack UTextBlock +---@field TextBlock_Bonus_MaxHP UTextBlock +---@field TextBlock_Eco_CoinPoint UTextBlock +---@field TextBlock_Eco_DropRate UTextBlock +---@field TextBlock_Eco_Exp UTextBlock +---@field TextBlock_Eco_HangupRoomMonsterNum UTextBlock +---@field TextBlock_Eco_HangupRoomRefreshRate UTextBlock +---@field TextBlock_Eco_KillPoint UTextBlock +---@field TextBlock_Growth_Attack UTextBlock +---@field TextBlock_Growth_Fire_Attack UTextBlock +---@field TextBlock_Growth_Fire_MaxHP UTextBlock +---@field TextBlock_Growth_Kill_Attack UTextBlock +---@field TextBlock_Growth_Kill_CoinPoint UTextBlock +---@field TextBlock_Growth_Kill_MaxHP UTextBlock +---@field TextBlock_Growth_KillPoint UTextBlock +---@field TextBlock_Growth_MaxHP UTextBlock +--Edit Below-- +local WBP_AttributePanel = { + bInitDoOnce = false, + Collapsed = true, +}; + +function WBP_AttributePanel:Construct() + self.Panel_BG:Construct() + + self.Collapsed = true + local MainPanelSlot = WidgetLayoutLibrary.SlotAsCanvasSlot(self.Panel_Main) + MainPanelSlot:SetSize({X = 320.0, Y = 400}) + + self.Panel_BonusAttributes:SetVisibility(ESlateVisibility.Collapsed) + self.Panel_EconomyAttributes:SetVisibility(ESlateVisibility.Collapsed) + + local PlayerState = GameDataManager.GetLocalPlayerState() + if UE.IsValid(PlayerState) then + self:OnPlayerAttributeChanged(PlayerState.Attributes) + end + + EventSystem:AddListener(EventType.OnPlayerAttributeChanged, WBP_AttributePanel.OnPlayerAttributeChanged, self) + self.NewButton_Toggle.OnClicked:Add(WBP_AttributePanel.OnToggleButtonClicked, self) +end + +function WBP_AttributePanel:Destruct() + self.NewButton_Toggle.OnClicked:Remove(WBP_AttributePanel.OnToggleButtonClicked, self) + EventSystem:RemoveListener(EventType.OnPlayerAttributeChanged, WBP_AttributePanel.OnPlayerAttributeChanged, self) +end + +function WBP_AttributePanel:OnPlayerAttributeChanged(InAttributes) + local NewAttribute = {} + for i, v in pairs(InAttributes) do + -- 只能取 j: + for j, k in pairs(v) do + local Val = 0 + for c, d in pairs(InAttributes) do + Val = Val + InAttributes[c][j] + end + NewAttribute[j] = Val + end + break + end + for AttributeName, Value in pairs(NewAttribute) do + local TextBlockName = "TextBlock_"..AttributeName + local TextBlock = self[TextBlockName] + if UE.IsValid(TextBlock) then + local Txt = "" + local DisplayType = GlobalFunctions.GetAttributeDisplayType(AttributeName) + if DisplayType == EAttributeDisplayType.Percent then + Txt = Txt.." "..tostring(math.ceil(Value * 100.0)).."%" + else + Txt = Txt..tostring(math.ceil(Value)) + end + TextBlock:SetText(Txt) + end + end +end + +function WBP_AttributePanel:OnToggleButtonClicked() + local MainPanelSlot = WidgetLayoutLibrary.SlotAsCanvasSlot(self.Panel_Main) + if self.Collapsed == true then + self.Collapsed = false + MainPanelSlot:SetSize({X = 320.0, Y = 570}) + + self.NewButton_Toggle:SetRenderScale({X=1, Y=-1}) + + self.Panel_BonusAttributes:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.Panel_EconomyAttributes:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + self.Collapsed = true + MainPanelSlot:SetSize({X = 320.0, Y = 400}) + + self.NewButton_Toggle:SetRenderScale({X=1, Y=1}) + + self.Panel_BonusAttributes:SetVisibility(ESlateVisibility.Collapsed) + self.Panel_EconomyAttributes:SetVisibility(ESlateVisibility.Collapsed) + end +end + +return WBP_AttributePanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_AvatarFrame.lua b/GZJ/Script/UI/WBP_AvatarFrame.lua new file mode 100644 index 00000000..f74fd6dd --- /dev/null +++ b/GZJ/Script/UI/WBP_AvatarFrame.lua @@ -0,0 +1,25 @@ +---@class WBP_AvatarFrame_C:UUserWidget +---@field Image_1 UImage +---@field Img_Frame UImage +---@field Panel_Avatar UWBP_PlayerAvatar_C +---@field TextBlock_PlayerName UTextBlock +--Edit Below-- +local WBP_AvatarFrame = { bInitDoOnce = false; }; + +function WBP_AvatarFrame:Construct() + +end + +function WBP_AvatarFrame:Destruct() + +end + +function WBP_AvatarFrame:InitView(UID, IconURL, Gender, FrameLevel, PlayerLevel, bIgnoreFrame, bIsMySelf) + self.Panel_Avatar:InitView(1, UID, IconURL, Gender, FrameLevel, PlayerLevel, bIgnoreFrame, bIsMySelf) +end + +function WBP_AvatarFrame:SetPlayerName(InPlayerName) + self.TextBlock_PlayerName:SetText(InPlayerName) +end + +return WBP_AvatarFrame; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_Bag.lua b/GZJ/Script/UI/WBP_Bag.lua new file mode 100644 index 00000000..3b9e1358 --- /dev/null +++ b/GZJ/Script/UI/WBP_Bag.lua @@ -0,0 +1,605 @@ +---@class WBP_Bag_C:UAEUserWidget +---@field CanvasPanel_Buttons UHorizontalBox +---@field CanvasPanel_Operation UCanvasPanel +---@field GeneralSlide_Select UWBP_GeneralSlide_C +---@field Guide_Item_1 UCanvasPanel +---@field Guide_Item_2 UCanvasPanel +---@field Guide_Item_3 UCanvasPanel +---@field Guide_Item_4 UCanvasPanel +---@field Guide_Item_5 UCanvasPanel +---@field Guide_Item_6 UCanvasPanel +---@field Header_Bag UWBP_WidgetHeader_C +---@field HorizontalBox_ItemList UHorizontalBox +---@field OperationButton_Replace UWBP_OperationIcon_C +---@field OperationButton_Reset UWBP_OperationIcon_C +---@field TextBlock_Replace UTextBlock +---@field TextBlock_Reset UTextBlock +---@field TextBlock_Stone UTextBlock +---@field WBP_DropItemWidget UWBP_DropItemWidget_C +---@field WBP_FittingItemInfo UWBP_FittingItemInfo_C +---@field WBP_GenerateAllButton UWBP_GenerateAllButton_C +---@field WBP_GenerateInfo UWBP_GenerateInfo_C +--Edit Below-- +local WBP_Bag = { + bInitDoOnce = false; + + -- 保存一下数据内容:就是背包中的数据,需要同步的时候改变即可 + ItemList = {}, + -- 可以通过Id查找到对应的行列,数据类型; {UI, UI, UI, UI} + -- 存放所有 Item 的引用 + ItemWidgetList = {}, + + -- 选择三个物品 {{数据, UI}, {数据, UI}, {数据, UI}} + SelectedItemList = {}, + + -- 第一个选择的类型 + BagOperateType = EBagOperateType.None, + + --默认 + CurrentItemType = EItemType.SkillBook, + + OwningPawn = nil, + PlayerState = nil, + + BagWeaponItemClass = nil, + + AddWeaponTimeHandler = nil, + + WeaponItemWidgetClass = nil, + + SelectSkillId = 0; +}; + +function WBP_Bag:Construct() + self.Header_Bag:Construct() + WBP_Bag.SuperClass.Construct(self) + self:BindEvents() + self:InitData() --设置基础数据(显示第一个元素的数据) + self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_Bag:OnShowPanel() + self:UnbindEvents() + self:BindEvents() + self:InitData() --设置基础数据(显示第一个元素的数据) + self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_Bag:OnClosePanel() + for i = 21, 28 do + NewPlayerGuideManager:RemoveGuide(i) + end + + -- 关闭界面 + UIManager:ClosePanel(EUIType.UseSkill) +end + +function WBP_Bag:BindEvents() + EventSystem:AddListener(EventType.UpdateItemList, WBP_Bag.OnUpdateItemList, self) + EventSystem:AddListener(EventType.UpdateStones, WBP_Bag.UpdateResetStone, self) + + EventSystem:AddListener(EventType.ShowGeneralSlideWidget, WBP_Bag.OnShowGeneralSlideWidget, self) + EventSystem:AddListener(EventType.BagOperation, WBP_Bag.OnBagOperate, self) + EventSystem:AddListener(EventType.CancelBagOperation, WBP_Bag.OnCancelBagOperation, self) + EventSystem:AddListener(EventType.SelectedItem, WBP_Bag.OnSelectedItem, self) + + EventSystem:AddListener(EventType.SendGeneralSlideNum, WBP_Bag.OnSendGeneralSlideNum, self) + EventSystem:AddListener(EventType.ClickTitle, WBP_Bag.OnClickTitle, self) + EventSystem:AddListener(EventType.ShowItemDescribe, WBP_Bag.OnShowItemDescribe, self) +end + +function WBP_Bag:Destruct() + self:UnbindEvents() +end + +function WBP_Bag:UnbindEvents() + EventSystem:RemoveListener(EventType.UpdateItemList, WBP_Bag.OnUpdateItemList, self) + EventSystem:RemoveListener(EventType.UpdateStones, WBP_Bag.UpdateResetStone, self) + + EventSystem:RemoveListener(EventType.ShowGeneralSlideWidget, WBP_Bag.OnShowGeneralSlideWidget, self) + EventSystem:RemoveListener(EventType.BagOperation, WBP_Bag.OnBagOperate, self) + EventSystem:RemoveListener(EventType.CancelBagOperation, WBP_Bag.OnCancelBagOperation, self) + EventSystem:RemoveListener(EventType.SelectedItem, WBP_Bag.OnSelectedItem, self) + + EventSystem:RemoveListener(EventType.SendGeneralSlideNum, WBP_Bag.OnSendGeneralSlideNum, self) + EventSystem:RemoveListener(EventType.ClickTitle, WBP_Bag.OnClickTitle, self) + EventSystem:RemoveListener(EventType.ShowItemDescribe, WBP_Bag.OnShowItemDescribe, self) +end + +function WBP_Bag:InitData() + self:ListBagItems() + self:SetOwningPawn() + + self:SetIsDrop(false) + self.WeaponItemWidgetClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_BagWeaponItem.WBP_BagWeaponItem_C')) + + -- 设置 Title + local ButtonsCount = self.CanvasPanel_Buttons:GetChildrenCount() + for i = 1, ButtonsCount do + -- 注意此处是从 0 开始的 + self.CanvasPanel_Buttons:GetChildAt(i - 1):SetClick(false) + end + + -- 检查一下当前点击的 + self.CanvasPanel_Buttons:GetChildAt(0):SetClick(true) + + -- 将第一个变回去 + for i = 1, 6 do + self.CanvasPanel_Buttons:GetChildAt(i - 1):SetClick(i - 1 == self.CurrentItemType) + end + self:UpdateItemMap(self.CurrentItemType) + + local PS = GameDataManager.GetLocalPlayerState() + PS:OnRep_OwnerWeapons() + + -- 试一下相机旋转 + --UGCGameSystem.SetLookInputEventEnable(GameDataManager.GetLocalPlayerController(), false, true) + self:UpdateResetStone(nil) +end + +function WBP_Bag:ClearBag() + self.ItemList = {} + -- 再将所有ItemWidget 清空 + self:ClearListBagItems() +end + +function WBP_Bag:UpdateItemMap(InItemType) + for i = 22, 28 do + NewPlayerGuideManager:RemoveGuide(i) + end + + -- 寻找当前控制的玩家 + print(string.format("[WBP_Bag:UpdateItemMap] 执行")) + self:ClearBag() -- 清空一下数组 + if UE.IsValid(self.OwningPawn) == false or self.OwningPawn == nil then + self:SetOwningPawn() + end + local PC = GameDataManager.GetLocalPlayerController() + local ItemMap = PC:GetItemMapByItemType(InItemType) + -- i是Id,v是数量 + for i, v in pairs(ItemMap) do + local Item = { + ItemID = i, + ItemCount = v + } + -- 在最后面插入 + -- 判断当前数据量 + table.insert(self.ItemList, Item) + end + + self:SortItemList(self.ItemList) + --设置数据 + -- Replace 置换石 + self:UpdateStone(EItemType.SubstituteStone, self.TextBlock_Replace) + -- Reset 重铸石 + self:UpdateStone(EItemType.ScouringStone, self.TextBlock_Reset) + + self:FillWithData(InItemType, self.ItemList) +end + +function WBP_Bag:UpdateResetStone(InNum) + if InNum == nil then + InNum = self:GetStoneCount(EItemType.SubstituteStone) + if InNum == nil then + InNum = 0 + end + end + self.TextBlock_Stone:SetText(string.format("置换石:%d", InNum)) +end + +function WBP_Bag:SortItemList(InList) + table.sort(InList, function(a, b) + local a_type = GetItemQualityLevel(a.ItemID) + local b_type = GetItemQualityLevel(b.ItemID) + local _is_type_ = a_type == b_type + if _is_type_ then + if a.ItemCount == b.ItemCount then + return a.ItemID > b.ItemID + end + return a.ItemCount > b.ItemCount + end + return a_type > b_type + end) +end + +function WBP_Bag:GetStoneCount(InType) + local PC = GameDataManager.GetLocalPlayerController() + local Stones = PC:GetItemMapByItemType(InType) + local ItemCount = 0 + if Stones ~= nil then + for _, v in pairs(Stones) do + ItemCount = ItemCount + v + end + end + return ItemCount +end + +function WBP_Bag:UpdateStone(InType, InItem) + InItem:SetText(tostring(self:GetStoneCount(InType))) +end + +function WBP_Bag:SetOwningPawn() + self.OwningPawn = GameDataManager.GetLocalPlayerPawn() + print(string.format("[WBP_Bag:SetOwningPawn] OwnerName = %s", KismetSystemLibrary.GetObjectName(self.OwningPawn))) +end + +function WBP_Bag:FindItemCountById(InItemId) + local PC = GameDataManager.GetLocalPlayerController() + local Count = PC:FindItemCount(GetItemTypeByItemId(InItemId), InItemId) + return Count +end + +function WBP_Bag:ListBagItems() + -- 依次获取 + self.ItemWidgetList = {} + -- 其实一共24个 + + local ChildrenCount = self.HorizontalBox_ItemList:GetChildrenCount() + for i = 1, ChildrenCount do + local ItemList = self.HorizontalBox_ItemList:GetChildAt(i - 1) + + for j = 1, ItemList:GetChildrenCount() do + table.insert(self.ItemWidgetList, ItemList:GetChildAt(j - 1)) + end + end +end + +function WBP_Bag:ClearListBagItems() + for i = 1, #self.ItemWidgetList do + self.ItemWidgetList[i]:CloseWidget() + end +end + +-- 说明一下 Arr 中包含的数据 +-- 再UI中是从上往下进行操作的 +-- {{id, count}, {id, count}, ...},该数组必定包含全部配件,如果没有的话就是空的 +-- SingleItem 表示一个具体的配件对象 +function WBP_Bag:FillWithData(InType, DataArr) + -- 首先清空所有 + if InType == EItemType.SkillBook then + local ActiveSkillNum = 0 + for i = 1, #self.ItemWidgetList do + if i <= #DataArr then + ActiveSkillNum = ActiveSkillNum + 1 + self.ItemWidgetList[i]:SetFittingItemData(DataArr[i]) + else + self.ItemWidgetList[i]:CloseWidget() + end + end + if ActiveSkillNum > 0 then + NewPlayerGuideManager:TriggerGuide(22) + end + return + end + local ListArr = {} + + for i = 1, #DataArr do + local Data = DataArr[i] + local WeaponId = GetItemWeaponTypeByItemId(Data.ItemID) + if ListArr[WeaponId] == nil then + ListArr[WeaponId] = {} + end + table.insert(ListArr[WeaponId], Data) + end + + ---- 在此处根据不同类型,塞入不同数据 + for i = 1, self.HorizontalBox_ItemList:GetChildrenCount() do + local Widget = self.HorizontalBox_ItemList:GetChildAt(i - 1) + local Data = ListArr[i] + if Data == nil then + for j = 1, Widget:GetChildrenCount() do + Widget:GetChildAt(j - 1):CloseWidget() + end + else + for j = 1, Widget:GetChildrenCount() do + if j <= #Data then + Widget:GetChildAt(j - 1):SetFittingItemData(Data[j]) + else + Widget:GetChildAt(j - 1):CloseWidget() + end + end + end + end +end + +-- 通过 Id 找到对应的 WidgetItem +function WBP_Bag:GetFittingItemById(InId) + for _, v in pairs(self.ItemWidgetList) do + if v:GetItemData().ItemID ~= nil and v:GetItemData().ItemID == InId then + return v + end + end + return nil +end + +function WBP_Bag:Clear() + for i = 1, self.HorizontalBox_ItemList:GetChildrenCount() do + local Item = self.HorizontalBox_ItemList:GetChildAt(i - 1) + for j = 1, Item:GetChildrenCount() do + Item:GetChildAt(j - 1):Clear() + end + end +end + +-- 显示对应 UI +function WBP_Bag:OnShowGeneralSlideWidget(InOperateType, InData) + -- 往里面设置数据 + self.GeneralSlide_Select:SetSlideValue(InData) + self.GeneralSlide_Select:SetOperateType(InOperateType) + self.GeneralSlide_Select:SetVisibility(ESlateVisibility.Visible) +end + +function WBP_Bag:OnBagOperate(InType) + -- 首先判断一下是否已经点击过其他按钮了 + if self.BagOperateType ~= EBagOperateType.None then + -- 将其他按钮变回去 + for i = 1, 4 do + if i ~= InType then + self.CanvasPanel_Operation:GetChildAt(i - 1):SetDefaultText() + end + end + if self.BagOperateType == EBagOperateType.Generate then + self.WBP_GenerateInfo:Clear() + self.WBP_GenerateInfo:SetVisibility(ESlateVisibility.Collapsed) + end + + self.BagOperateType = EBagOperateType.None + end + + -- 分发事件 + print(string.format("开始操作:%d", InType)) + if InType == EBagOperateType.Generate then + --显示框 + self.WBP_GenerateInfo:SetVisibility(ESlateVisibility.Visible) + --初始化一下 + self.WBP_GenerateInfo:Clear() + end + self.BagOperateType = InType +end + +function WBP_Bag:OnCancelBagOperation(InType) + print(string.format("取消操作:%d", InType)) + self:CloseOperation(InType) + self.WBP_GenerateInfo:OnClickCancel() +end + +-- 这里面是单个 Item 的数据{Id, count} +function WBP_Bag:OnSelectedItem(InData) + -- 这里处理的是具体选择的数据 + if self.BagOperateType == EBagOperateType.None then + return + elseif self.BagOperateType == EBagOperateType.Generate then + self:SelectGenerateItem(InData) + elseif self.BagOperateType == EBagOperateType.Drop then + -- 判断此时 + if InData.ItemCount == 1 then + self:OnSendGeneralSlideNum(EBagOperateType.Drop, InData) + else + self:SelectDropItem(InData) + end + elseif self.BagOperateType == EBagOperateType.Sell then + self:SelectSellItem(InData) + elseif self.BagOperateType == EBagOperateType.Reset then -- 置换 + -- 不弹框,仅置换第一个,如果背包满了,那就丢到地上 + if InData.ItemCount == 1 then + self:OnSendGeneralSlideNum(EBagOperateType.Reset, InData) + else + self:SelectResetItem(InData) + end + end +end + +function WBP_Bag:SelectGenerateItem(InData) + --添加到物品中 + self.WBP_GenerateInfo:AddItem(InData) +end + +function WBP_Bag:SelectDropItem(InData) + -- 弹框 + self:OnShowGeneralSlideWidget(EBagOperateType.Drop, InData) +end + +function WBP_Bag:SelectSellItem(InData) + self:OnShowGeneralSlideWidget(EBagOperateType.Sell, InData) +end + +function WBP_Bag:SetIsDrop(IsDrop) + if IsDrop then + self.WBP_DropItemWidget:SetVisibility(ESlateVisibility.Visible); + else + self.WBP_DropItemWidget:SetVisibility(ESlateVisibility.Collapsed); + end +end + +function WBP_Bag:SelectResetItem(InData) + --此时谈一个框吧 + -- 首先判断当前置换石的个数 + if InData == nil then + return + end + local PC = GameDataManager.GetLocalPlayerController() + local Item = PC:GetItemMapByItemType(EItemType.SubstituteStone) -- 32000 + local StoneCount = 0 + for _, v in pairs(Item) do + StoneCount = v + end + + if StoneCount <= 0 then + return + end + + --选取一个小的 + if InData.ItemCount > StoneCount then + InData.ItemCount = StoneCount + end + + self:OnShowGeneralSlideWidget(EBagOperateType.Reset, InData) +end + +function WBP_Bag:GetOperateType() + return self.BagOperateType +end + +-- 这是当点击确认操作的时候执行的操作,传进来是一个 数据 +function WBP_Bag:OnSendGeneralSlideNum(InOperateType, InData) + self.GeneralSlide_Select:SetVisibility(ESlateVisibility.Collapsed) + print(string.format("[WBP_Bag:OnSendGeneralSlideNum] OperateType = %d", InOperateType)) + local PC = GameDataManager.GetLocalPlayerController() + local Pawn = GameDataManager.GetLocalPlayerPawn(); + if InOperateType == EBagOperateType.None then + return + elseif InOperateType == EBagOperateType.Drop then + if not Pawn.IsInArena then + UIManager:ShowGeneralNotice("在练功房不能丢弃~") + return + end + local DropPos = VectorHelper.Sub(self.OwningPawn:K2_GetActorLocation(), {X = 0, Y = 0, Z = 10}) + EventSystem:SendEvent(EventType.SpawnDropItem, DropPos, self.OwningPawn:K2_GetActorRotation(), -1, InData) + + -- 从背包中移除一个,再刷新当前背包即可 + local ItemData = {} + ItemData[InData.ItemID] = - InData.ItemCount + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_DiscardItems", ItemData) + + self:UpdateItemMap(self.CurrentItemType) + elseif self.BagOperateType == EBagOperateType.Sell then + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_SellItem", InData) + elseif self.BagOperateType == EBagOperateType.Reset then -- 置换 + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_ResetItem", InData) + end + + self:CloseOperation(InOperateType) +end + +function WBP_Bag:OnClickTitle(InFittingType) + -- 根据 Item 筛选一下 + -- 先将现在的变换一下 + self.CanvasPanel_Buttons:GetChildAt(self.CurrentItemType):SetClick(false) + + if self.CurrentItemType == EItemType.SkillBook then + UIManager:HidePanel(EUIType.UseSkill) + end + + self.CurrentItemType = InFittingType + self.CanvasPanel_Buttons:GetChildAt(self.CurrentItemType):SetClick(true) + self:UpdateItemMap(InFittingType) +end + +function WBP_Bag:OnUpdateItemList(InShow) + -- 当显示了再传递 + if InShow then + self:UpdateItemMap(self.CurrentItemType) + else + if self:IsVisible() then + self:UpdateItemMap(self.CurrentItemType) + end + end + self:UpdateResetStone(nil) +end + +function WBP_Bag:OnShowItemDescribe(InData, InShow) + if InShow then + print(string.format("[WBP_Bag:OnShowItemDescribe] 执行了该方法,其中 Id = %d, Count = %d", InData.ItemID, InData.ItemCount)) + self.WBP_FittingItemInfo:SetInfoItemData(InData, self) + self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.Collapsed) + end +end + +--重点 +function WBP_Bag:CloseOperation(InType) + print(string.format('[WBP_Bag:CloseOperation] Type = %d', InType)) + self.WBP_FittingItemInfo:SetVisibility(ESlateVisibility.Collapsed) + self.WBP_GenerateInfo:SetVisibility(ESlateVisibility.Collapsed) + self.CanvasPanel_Operation:GetChildAt(InType - 1):SetDefaultText() + self.BagOperateType = EBagOperateType.None +end + +-- 一键合成 +function WBP_Bag:GenerateAllItem() + -- 传入一个 类型,然后进行合成 + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GenerateAllItem", self.CurrentItemType) + + if self.BagOperateType == EBagOperateType.Generate then + -- 关闭 + self.CanvasPanel_Operation:OnClickTitle() + end + + UIManager:ClosePanel(EUIType.UseSkill) +end + +function WBP_Bag:GetSelectSkillSlotsXY(InItemWidget) + local SelectIndex = 0 + for i = 1, #self.ItemWidgetList do + if self.ItemWidgetList[i] == InItemWidget then + SelectIndex = i + break + end + end + local Y = SelectIndex % 6 + local X = SelectIndex // 4 + + return {X = X, Y = Y} +end + +function WBP_Bag:GetAdd() + +end + +function WBP_Bag:ShowSelectSkill(IsFullSkill, InFittingData, InPosition) + self:InitSelectSkill(InFittingData.ItemID) + local CanvasSlot = self.WBP_SelectSkillSlots.Slot + CanvasSlot:SetPosition({ X = InPosition.X, Y = InPosition.Y }) + self.WBP_SelectSkillSlots:SetVisibility(ESlateVisibility.SelfHitTestInvisible) +end + +function WBP_Bag:HideSelectSkill() + UIManager:ClosePanel(EUIType.UseSkill) +end + +function WBP_Bag:OnMouseMove(MyGeometry, MouseEvent) + +end + +function WBP_Bag:InitSelectSkill(InId) + print(string.format('[WBP_SelectSkillSlots:InitData] 初始化Id = %d', InId)) + self.SelectSkillId = InId + local PC = GameDataManager.GetLocalPlayerController() + local InitiativeSkillSlots = PC:GetInitiativeSkillSlots() + if #InitiativeSkillSlots < 3 then + -- 此时是 select Button + self.WidgetSwitcher_Main:SetActiveWidgetIndex(1) + self.WBP_SkillSelectButton:SetSkillId(self.SkillItemId) + else + self.WidgetSwitcher_Main:SetActiveWidgetIndex(0) + self:FillSkillDatas() + end +end + +function WBP_Bag:FillSkillDatas() + print(string.format('[WBP_SelectSkillSlots:FillDatas] 填充数据')) + local PC = GameDataManager.GetLocalPlayerController() + local InitiativeSkillSlots = PC:GetInitiativeSkillSlots() + print(string.format('[WBP_SelectSkillSlots:FillDatas] 主动技能数量:%d', #InitiativeSkillSlots)) + for i = 1, #InitiativeSkillSlots do + local Slot = InitiativeSkillSlots[i] + if i <= 3 then + local ItemId = PC.ActiveSkillNameList[Slot].SkillName * 100 + PC.ActiveSkillNameList[Slot].SkillLevel * 10 + 20000 + self.HorizontalBox_Skills:GetChildAt(i - 1):SetLastItemId(ItemId) + end + end +end + +function WBP_Bag:OnMouseButtonDown(MyGeometry, PointerEvent) + WBP_Bag.SuperClass:OnMouseButtonDown(MyGeometry, PointerEvent) + UIManager:HidePanel(EUIType.UseSkill) +end + +--当关闭界面的时候执行的函数 +function WBP_Bag:OnCloseWidget() + UIManager:HidePanel(EUIType.UseSkill) +end + +return WBP_Bag; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_BossHealth.lua b/GZJ/Script/UI/WBP_BossHealth.lua new file mode 100644 index 00000000..1ac15399 --- /dev/null +++ b/GZJ/Script/UI/WBP_BossHealth.lua @@ -0,0 +1,29 @@ +---@class WBP_BossHealth_C:UUserWidget +---@field HPProgressBar UProgressBar +--Edit Below-- +local WBP_BossHealth = { bInitDoOnce = false; }; + +--[==[ Construct +function WBP_BossHealth:Construct() + +end +-- Construct ]==] + +-- function WBP_BossHealth:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_BossHealth:Destruct() + +-- end + +function WBP_BossHealth:UpdateOwnerHealth(CurHP, MaxHP) + local NewPercentage = MaxHP > 0 and CurHP / MaxHP or 0.0 + self.HPProgressBar:SetPercent(NewPercentage) + + if math.isNearlyEqual(NewPercentage, 0) then + self:SetVisibility(ESlateVisibility.Collapsed) + end +end + +return WBP_BossHealth; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_BossInfoPanel_V2.lua b/GZJ/Script/UI/WBP_BossInfoPanel_V2.lua new file mode 100644 index 00000000..8b4b82a6 --- /dev/null +++ b/GZJ/Script/UI/WBP_BossInfoPanel_V2.lua @@ -0,0 +1,181 @@ +---@class WBP_BossInfoPanel_V2_C:UUserWidget +---@field Boss_1 UOverlay +---@field Boss_2 UOverlay +---@field Boss_3 UOverlay +---@field Boss_4 UOverlay +---@field Button_1 UButton +---@field Button_2 UButton +---@field Button_3 UButton +---@field Button_4 UButton +---@field Image_Icon1 UImage +---@field Image_Icon2 UImage +---@field Image_Icon3 UImage +---@field Image_Icon4 UImage +---@field Image_Select1 UImage +---@field Image_Select2 UImage +---@field Image_Select3 UImage +---@field Image_Select4 UImage +---@field Image_SkillIcon1 UImage +---@field Image_SkillIcon2 UImage +---@field Panel_BG UWBP_WidgetHeader_C +---@field TextBlock_Attack UTextBlock +---@field TextBlock_BossName UTextBlock +---@field TextBlock_Characteristic UTextBlock +---@field TextBlock_Desc1 UTextBlock +---@field TextBlock_Desc2 UTextBlock +---@field TextBlock_Health UTextBlock +---@field TextBlock_SkillName1 UTextBlock +---@field TextBlock_SkillName2 UTextBlock +---@field TextBlock_SpawnTime UTextBlock +--Edit Below-- +local WBP_BossInfoPanel_V2 = { + bInitDoOnce = false, + BossList = {}, + BossInfo = {}, + + TotalBossNum = 0, + CurSelectedIndex = -1, +}; + +function WBP_BossInfoPanel_V2:Construct() + self.Panel_BG.UIType = EUIType.BossInfo + self.Panel_BG:Construct() + + for i = 1, 4 do + self["Button_"..tostring(i)].OnClicked:Add(function() + self:SetupBossInfoPanel(i) + end, self) + end + + self.BossList = UGCGameSystem.GameState.BossList + self:UpdateBossInfo(self.BossList) + + EventSystem:AddListener(EventType.ChangeBossList, WBP_BossInfoPanel_V2.UpdateBossInfo, self) +end + +function WBP_BossInfoPanel_V2:OnShowPanel() + if self.CurSelectedIndex <= 0 then + self.CurSelectedIndex = 1 + end + + self:SetupBossInfoPanel(self.CurSelectedIndex) + + NewPlayerGuideManager:RemoveGuide(15) +end + +function WBP_BossInfoPanel_V2:UpdateBossInfo(BossList) + if BossList == nil or table.isEmpty(BossList) or table.getCount(BossList) <= 0 then return end + + for i = 1, 4 do + self["Boss_"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed) + end + + local BossNum = 0 + for _, ID in pairs(BossList) do + BossNum = BossNum + 1 + self:SetupBossData(BossNum, ID); + end + + self.TotalBossNum = BossNum + + for i = 1, 4 do + local BossData = self.BossInfo[i] + if BossData then + self["Boss_"..tostring(i)]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self["Image_Select"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed) + + UIManager.LoadTexture(self["Image_Icon"..tostring(i)], BossData.BossIcon) + end + end +end + +function WBP_BossInfoPanel_V2:SetupBossData(Index, BossID) + if Tables.MonsterBaseConfig[BossID] == nil or Tables.MonsterBaseConfig[BossID].Type ~= EMonsterType.Boss then return end + + local BossData = { + ID = 0, + SpawnWave = "", + BossName = "", + BossIcon = "", --放按钮上 + Characteristic = "", + SkillName1 = "", + SkillDesc1 = "", + SkillIcon1 = "", + SkillName2 = "", + SkillDesc2 = "", + SkillIcon2 = "", + } + BossData.ID = BossID + + local FightStageIndex = math.clamp(UGCGameSystem.GameState.GameDifficulty, 1, 4) + local MonsterSpawnNum = Tables.GameFightStageConfig[FightStageIndex] + local BossSpawnInnings = {} + for i = 1, #MonsterSpawnNum do + if MonsterSpawnNum[i].MonsterNum.Boss > 0 then + table.insert(BossSpawnInnings, i) + end + end + + if BossSpawnInnings[Index] then + BossData.SpawnWave = string.format("第%d回合", BossSpawnInnings[Index]) + else + return + end + + local TempBossConfig = Tables.MonsterBaseConfig[BossID] + + BossData.BossName = TempBossConfig.ChineseName + BossData.BossIcon = TempBossConfig.Icon + BossData.Characteristic = TempBossConfig.Characteristic + BossData.SkillName1 = TempBossConfig.SkillDescs[1].SkillName + BossData.SkillDesc1 = TempBossConfig.SkillDescs[1].SkillDesc + BossData.SkillIcon1 = TempBossConfig.SkillDescs[1].Icon + BossData.SkillName2 = TempBossConfig.SkillDescs[2].SkillName + BossData.SkillDesc2 = TempBossConfig.SkillDescs[2].SkillDesc + BossData.SkillIcon2 = TempBossConfig.SkillDescs[2].Icon + + self.BossInfo[Index] = BossData +end + +function WBP_BossInfoPanel_V2:SetupBossInfoPanel(Index) + local BossData = self.BossInfo[Index] + if BossData == nil then + return + end + + for i = 1, 4 do + if Index == i then + self["Image_Select"..tostring(i)]:SetVisibility(ESlateVisibility.Visible) + else + self["Image_Select"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed) + end + end + + self.TextBlock_BossName:SetText(BossData.BossName) + self.TextBlock_Characteristic:SetText(BossData.Characteristic) + self.TextBlock_SpawnTime:SetText(BossData.SpawnWave) + self.TextBlock_SkillName1:SetText(BossData.SkillName1) + self.TextBlock_SkillName2:SetText(BossData.SkillName2) + self.TextBlock_Desc1:SetText(BossData.SkillDesc1) + self.TextBlock_Desc2:SetText(BossData.SkillDesc2) + + UIManager.LoadTexture(self.Image_SkillIcon1, BossData.SkillIcon1) + UIManager.LoadTexture(self.Image_SkillIcon2, BossData.SkillIcon2) + + local AllPlayers = UGCGameSystem.GetAllPlayerPawn() + local BossHealthMultiplier = GlobalConfigs.PlayerNumMultiplier[#AllPlayers] + + local GameDifficulty = UGCGameSystem.GameState.GameDifficulty + local HealthMultiplier = GlobalConfigs.DifficultyMultiplier["Health"][GameDifficulty] + local AttackMultiplier = GlobalConfigs.DifficultyMultiplier["Attack"][GameDifficulty] + + local MonsterGradeParam = MonsterParam["Boss"].GradeParam[Index] + self.TextBlock_Health:SetText(string.format('生命值:%.1fw', MonsterGradeParam.Health * BossHealthMultiplier * HealthMultiplier / 10000)) + + local AttackValue = MonsterGradeParam.AttackValue * AttackMultiplier + local AttackTxt = AttackValue > 10000 and string.format('威力值:%.1fw', AttackValue / 10000) or string.format('威力值:%d', math.ceil(AttackValue)) + self.TextBlock_Attack:SetText(AttackTxt) + +end + +return WBP_BossInfoPanel_V2; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_BossInfo_Item_V2.lua b/GZJ/Script/UI/WBP_BossInfo_Item_V2.lua new file mode 100644 index 00000000..96a5e392 --- /dev/null +++ b/GZJ/Script/UI/WBP_BossInfo_Item_V2.lua @@ -0,0 +1,107 @@ +---@class WBP_BossInfo_Item_V2_C:UUserWidget +---@field Button_1 UButton +---@field Image_1 UImage +---@field Image_Icon1 UImage +---@field Image_Select UImage +--Edit Below-- +local WBP_BossInfo_Item_V2 = { + bInitDoOnce = false; + bBossIDIsUpdate = false; + + BossID = 0; + BossName = ""; + SpawnTime = ""; + Characteristic = ""; + SkillIcon1 = nil; + SkillIcon2 = nil; + SkillName1 = ""; + SkillName2 = ""; + SkillDesc1 = ""; + SkillDesc2 = ""; + BossLevel = 0; +}; + + +function WBP_BossInfo_Item_V2:Construct() + self.Button_1.OnClicked:Add(WBP_BossInfo_Item_V2.ClickBossInfo, self) + EventSystem:AddListener(EventType.ChangeBossList, WBP_BossInfo_Item_V2.UpdateBossSpawnTime, self) + self:ShowSelect(false) +end + + +-- function WBP_BossInfo_Item_V2:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_BossInfo_Item_V2:Destruct() + +-- end + +function WBP_BossInfo_Item_V2:OnShowPanel() + if not self.bBossIDIsUpdate then return end + self.bBossIDIsUpdate = false + if UGCGameSystem.GameState.BossList and #UGCGameSystem.GameState.BossList > 0 then + self.UpdateBossSpawnTime(UGCGameSystem.GameState.BossList) + end + + local TempBossConfig = Tables.MonsterBaseConfig[self.BossID] + + self.BossName = TempBossConfig.ChineseName + if TempBossConfig.Icon then + UIManager.LoadTexture(self.Image_Icon1, TempBossConfig.Icon) + else + print("WBP_BossInfo_Item_V2_Fun_" .. "UpdateInfo_TempBossConfig.Icon is nil") + end + self.Characteristic = TempBossConfig.Characteristic + + self.SkillName1 = TempBossConfig.SkillDescs[1].SkillName + self.SkillDesc1 = TempBossConfig.SkillDescs[1].SkillDesc + self.SkillIcon1 = UE.LoadObject(TempBossConfig.SkillDescs[1].Icon) + + self.SkillName2 = TempBossConfig.SkillDescs[2].SkillName + self.SkillDesc2 = TempBossConfig.SkillDescs[2].SkillDesc + self.SkillIcon2 = UE.LoadObject(TempBossConfig.SkillDescs[2].Icon) +end + +function WBP_BossInfo_Item_V2:UpdateInfo(BossID) + + print("WBP_BossInfo_Item_V2_Fun_" .. "UpdateInfo_BossID: " .. BossID) + if Tables.MonsterBaseConfig[BossID] == nil or Tables.MonsterBaseConfig[BossID].Type == EMonsterType.Bossthen then return end + self.BossID = BossID + self.bBossIDIsUpdate = true + +end + +function WBP_BossInfo_Item_V2:ClickBossInfo() + EventSystem:SendEvent(EventType.UpdateBossInfoToWidget, self, self.BossLevel) +end + +function WBP_BossInfo_Item_V2:ShowSelect(IsShow) + if IsShow then + self.Image_Select:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + self.Image_Select:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_BossInfo_Item_V2:UpdateBossSpawnTime(BossList) + if BossList == nil or #BossList <= 0 then return end + local FightStageIndex = UGCGameSystem.GameState.GameDifficulty <= 4 and UGCGameSystem.GameState.GameDifficulty or 4 + local MonsterSpawnNum = Tables.GameFightStageConfig[FightStageIndex] + local BossSpawnInnings = {} + for i = 1, #MonsterSpawnNum do + if MonsterSpawnNum[i].MonsterNum.Boss > 0 then + table.insert(BossSpawnInnings, i) + end + end + for i = 1, #BossList do + if BossList[i] == self.BossID then + if BossSpawnInnings[i] then + self.SpawnTime = string.format("第%d回合", BossSpawnInnings[i]) + break + end + end + end +end + +return WBP_BossInfo_Item_V2; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_ChallengeInfo.lua b/GZJ/Script/UI/WBP_ChallengeInfo.lua new file mode 100644 index 00000000..af6469af --- /dev/null +++ b/GZJ/Script/UI/WBP_ChallengeInfo.lua @@ -0,0 +1,29 @@ +---@class WBP_ChallengeInfo_C:UUserWidget +---@field TextBlock_Skill UTextBlock +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_ChallengeInfo = { bInitDoOnce = false; }; + +function WBP_ChallengeInfo:Construct() + WBP_ChallengeInfo.SuperClass.Construct(self) +end + +-- function WBP_ChallengeInfo:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_ChallengeInfo:Destruct() + +-- end + +function WBP_ChallengeInfo:SetSkillId(InId) + local Desc = Tables.ChallengeInfo[InId].SkillDesc + if Desc == nil then + return + end + + self.TextBlock_Skill:SetText(string.format("%s\ +%s", Desc.Skill1, Desc.Skill2)) +end + +return WBP_ChallengeInfo; diff --git a/GZJ/Script/UI/WBP_ChallengeText.lua b/GZJ/Script/UI/WBP_ChallengeText.lua new file mode 100644 index 00000000..436b3d6f --- /dev/null +++ b/GZJ/Script/UI/WBP_ChallengeText.lua @@ -0,0 +1,23 @@ +---@class WBP_ChallengeText_C:UUserWidget +---@field TextBlock_Challenge UTextBlock +---@field Text FString +--Edit Below-- +local WBP_ChallengeText = { bInitDoOnce = false; }; + +function WBP_ChallengeText:Construct() + self.TextBlock_Challenge:BindingProperty("Text", self.TextBlock_Challenge_Text, self) + +end + +-- function WBP_ChallengeText:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_ChallengeText:Destruct() + +-- end +function WBP_ChallengeText:TextBlock_Challenge_Text(ReturnValue) + return self.Text +end + +return WBP_ChallengeText; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_Challenge_Item_V2.lua b/GZJ/Script/UI/WBP_Challenge_Item_V2.lua new file mode 100644 index 00000000..4a845702 --- /dev/null +++ b/GZJ/Script/UI/WBP_Challenge_Item_V2.lua @@ -0,0 +1,217 @@ +---@class WBP_Challenge_Item_V2_C:UUserWidget +---@field Btn_Challenge1 UButton +---@field Btn_Challenge2 UButton +---@field Btn_Challenge3 UButton +---@field Btn_Challenge5 UButton +---@field Button_Skill UButton +---@field Image_Skill UImage +---@field TextBlock_CanChallenge1 UTextBlock +---@field TextBlock_CanChallenge2 UTextBlock +---@field TextBlock_CanChallenge3 UTextBlock +---@field TextBlock_CanChallenge5 UTextBlock +---@field TextBlock_ChallengeTimeLimit UTextBlock +---@field TextBlock_CoolingTime UTextBlock +---@field TextBlock_Gold1 UTextBlock +---@field TextBlock_Gold2 UTextBlock +---@field TextBlock_Gold3 UTextBlock +---@field TextBlock_Gold5 UTextBlock +---@field TextBlock_MonsterName UTextBlock +---@field TextBlock_Recommend1 UTextBlock +---@field TextBlock_Recommend2 UTextBlock +---@field TextBlock_Recommend3 UTextBlock +---@field TextBlock_Recommend4 UTextBlock +---@field VerticalBox_Challenge1 UVerticalBox +---@field VerticalBox_Challenge2 UVerticalBox +---@field VerticalBox_Challenge3 UVerticalBox +---@field VerticalBox_Challenge5 UVerticalBox +---@field WidgetSwitcher_1 UWidgetSwitcher +---@field WidgetSwitcher_2 UWidgetSwitcher +---@field WidgetSwitcher_3 UWidgetSwitcher +---@field WidgetSwitcher_5 UWidgetSwitcher +---@field ChallengeID int32 +---@field ChallengeMonsterType TEnumAsByte +--Edit Below-- +local WBP_Challenge_Item = { + bInitDoOnce = false; + ChallengeMonsterInfo = nil; + ChallengeWidgetList = {}; + ChallengeTextClass = nil; + UpdateTimer = nil; + + GameDuration = 0.0, +}; + +function WBP_Challenge_Item:Construct() + self.ChallengeMonsterInfo = Tables.ChallengeInfo[self.ChallengeID] + if self.ChallengeMonsterInfo == nil then + print("WBP_Challenge_Item_Fun_" .. "Construct_" .. "[Error] Unable to find ChallengeID in ChallengeInfo " .."ChallengeID:" .. self.ChallengeID) + return + end + + self.Btn_Challenge1.OnClicked:Add(self.SelectDifficulty1, self) + self.Btn_Challenge2.OnClicked:Add(self.SelectDifficulty2, self) + self.Btn_Challenge3.OnClicked:Add(self.SelectDifficulty3, self) + self.Btn_Challenge5.OnClicked:Add(self.SelectDifficulty4, self) + + self:InitWidget() + self.Button_Skill.OnClicked:Add(self.OnShowSkill, self) + self.Button_Skill.OnPressed:Add(self.OnPressedSkill, self) + self.Button_Skill.OnReleased:Add(self.OnReleasedSkill, self) +end + +function WBP_Challenge_Item:OnShowPanel() + self.GameDuration = UGCGameSystem.GameState.GameDuration + self:OnGameDurationChanged(self.GameDuration) + + EventSystem:AddListener(EventType.OnGameDurationChanged, WBP_Challenge_Item.OnGameDurationChanged, self) +end + +function WBP_Challenge_Item:OnClosePanel() + EventSystem:RemoveListener(EventType.OnGameDurationChanged, WBP_Challenge_Item.OnGameDurationChanged, self) +end + +function WBP_Challenge_Item:InitWidget() + self.ChallengeTextClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_ChallengeText.WBP_ChallengeText_C')) + if self.ChallengeTextClass == nil then + print("WBP_Challenge_Item_Fun_" .. "InitWidget_" .. "[Error] self.ChallengeTextClass is nil") + return + end + self.ChallengeWidgetList = { + [1] = {self.WidgetSwitcher_1, self.TextBlock_Gold1, self.Btn_Challenge1, self.TextBlock_CanChallenge1, self.VerticalBox_Challenge1}, + [2] = {self.WidgetSwitcher_2, self.TextBlock_Gold2, self.Btn_Challenge2, self.TextBlock_CanChallenge2, self.VerticalBox_Challenge2}, + [3] = {self.WidgetSwitcher_3, self.TextBlock_Gold3, self.Btn_Challenge3, self.TextBlock_CanChallenge3, self.VerticalBox_Challenge3}, + [4] = {self.WidgetSwitcher_5, self.TextBlock_Gold5, self.Btn_Challenge5, self.TextBlock_CanChallenge5, self.VerticalBox_Challenge5} + } + for i = 1, 4 do + + self.ChallengeWidgetList[i][1]:SetActiveWidgetIndex(self.ChallengeMonsterInfo.IncomeIndex) + + self.ChallengeWidgetList[i][2]:SetText(self.ChallengeMonsterInfo.IncomeGold[i]) + if UGCGameSystem.GameState.GameDifficulty < self.ChallengeMonsterInfo.DifficultyLimit[i] then + self.ChallengeWidgetList[i][3]:SetIsEnabled(false) + self.ChallengeWidgetList[i][4]:SetText(string.format("难%d开启", self.ChallengeMonsterInfo.DifficultyLimit[i])) + else + self.ChallengeWidgetList[i][3]:SetIsEnabled(true) + self.ChallengeWidgetList[i][4]:SetText(string.format("挑战", self.ChallengeMonsterInfo.DifficultyLimit[i])) + end + if self.ChallengeMonsterInfo.IncomeInfo then + self.ChallengeWidgetList[i][5]:ClearChildren() + for _,Info in pairs(self.ChallengeMonsterInfo.IncomeInfo[i]) do + local TempChallengeInfo = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.ChallengeTextClass); + TempChallengeInfo.Text = Info + self.ChallengeWidgetList[i][5]:AddChildToVerticalBox(TempChallengeInfo) + end + end + + for c, v in pairs(self.ChallengeMonsterInfo.Recommend) do + self['TextBlock_Recommend' .. tostring(c)]:SetText(string.format('推荐战斗力:%.0f', v * self.ChallengeMonsterInfo.RecommendFunc(UGCGameSystem.GameState.GameDifficulty))) + end + end + self.TextBlock_MonsterName:SetText(self.ChallengeMonsterInfo.MonsterName) + self.TextBlock_CoolingTime:SetText(string.format("挑战冷却%ds" ,self.ChallengeMonsterInfo.CoolingTime)) + self.TextBlock_ChallengeTimeLimit:SetText(string.format("挑战限时%ds" ,self.ChallengeMonsterInfo.LifeTime)) + --self.Image_Icon:SetBrushFromTexture(UE.LoadObject(self.ChallengeMonsterInfo.Icon)) + if self.ChallengeMonsterInfo.SkillIcon then + UIManager.LoadTexture(self.Image_Skill, self.ChallengeMonsterInfo.SkillIcon) + else + self.Image_Skill:SetVisibility(ESlateVisibility.Hidden) + end +end + +function WBP_Challenge_Item:OnGameDurationChanged(GameDuration) + self.GameDuration = GameDuration + + for i = 1, 4 do + self:UpdateCanChallengeText(i) + end +end + +function WBP_Challenge_Item:SelectDifficulty1() + self:SpawnChallengeMonster(1) + UIManager:ClosePanel(EUIType.Challenge); +end + +function WBP_Challenge_Item:SelectDifficulty2() + self:SpawnChallengeMonster(2) + UIManager:ClosePanel(EUIType.Challenge); +end + +function WBP_Challenge_Item:SelectDifficulty3() + self:SpawnChallengeMonster(3) + UIManager:ClosePanel(EUIType.Challenge); +end + +function WBP_Challenge_Item:SelectDifficulty4() + self:SpawnChallengeMonster(4) + UIManager:ClosePanel(EUIType.Challenge); +end + +function WBP_Challenge_Item:UpdateCanChallengeText(Index) + if self.ChallengeMonsterInfo == nil or self.ChallengeMonsterInfo.DifficultyLimit[Index] == nil then + UE.Log("[WBP_Challenge_Item:UpdateCanChallengeText] Error") + return + end + if UGCGameSystem.GameState.GameDifficulty < self.ChallengeMonsterInfo.DifficultyLimit[Index] then + self.ChallengeWidgetList[Index][3]:SetIsEnabled(false) + self.ChallengeWidgetList[Index][4]:SetText(string.format("难%d开启", self.ChallengeMonsterInfo.DifficultyLimit[Index])) + return + end + + local TargetPlayState = GameDataManager.GetLocalPlayerState() + local NowTime = self.GameDuration + local LastChallengeTime = TargetPlayState.ChallengeMonsterTime[self.ChallengeID].LastChallengeTime + local CoolingTime = TargetPlayState.ChallengeMonsterTime[self.ChallengeID].CoolingTime + + local ElapsedTime = NowTime - LastChallengeTime + if ElapsedTime >= CoolingTime then + self.ChallengeWidgetList[Index][4]:SetText("挑战") + self:UpdateAttack() + else + self.ChallengeWidgetList[Index][3]:SetIsEnabled(false) + local ShowTime = math.floor(math.clamp(CoolingTime - ElapsedTime, 0, CoolingTime)) + self.ChallengeWidgetList[Index][4]:SetText(string.format("%ds", ShowTime)) + end +end +-- +function WBP_Challenge_Item:UpdateAttack(InNum) + local AttackValue = 0 + local PS = GameDataManager.GetLocalPlayerState() + for i, v in pairs(PS.Attributes) do + AttackValue = AttackValue + v.Base_Attack + end + InNum = AttackValue + for i = 1, 4 do + if InNum >= self.ChallengeMonsterInfo.Recommend[i] then + self.ChallengeWidgetList[i][3]:SetIsEnabled(true) + end + end +end +function WBP_Challenge_Item:SpawnChallengeMonster(MonsterLevel) + --TODO:检测是否该挑战在CD中 + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_ChallengeSucceed", self.ChallengeID, PC.PlayerKey, self.ChallengeMonsterType, MonsterLevel) +end +function WBP_Challenge_Item:OnPlayerAttributeChanged(InAttributes) + print(string.format('[WBP_Challenge_Item:OnPlayerAttributeChanged] 执行!')) + local AttackValue = 0 + for i, v in pairs(InAttributes) do + AttackValue = AttackValue + v.Base_Attack + end + + self:UpdateAttack(AttackValue) +end + +function WBP_Challenge_Item:OnShowSkill() + +end + +function WBP_Challenge_Item:OnPressedSkill() + -- 显示 + UIManager:GetPanel(EUIType.Challenge):ShowSkillInfo(true, self.ChallengeID) +end + +function WBP_Challenge_Item:OnReleasedSkill() + UIManager:GetPanel(EUIType.Challenge):ShowSkillInfo(false) +end + +return WBP_Challenge_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_Challenge_V2.lua b/GZJ/Script/UI/WBP_Challenge_V2.lua new file mode 100644 index 00000000..8cd24c8c --- /dev/null +++ b/GZJ/Script/UI/WBP_Challenge_V2.lua @@ -0,0 +1,77 @@ +---@class WBP_Challenge_V2_C:UUserWidget +---@field Image_34 UImage +---@field VerticalBox_Button UVerticalBox +---@field WBP_ChallengeInfo UWBP_ChallengeInfo_C +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +---@field WidgetSwitcher_MonsterInfo UWidgetSwitcher +--Edit Below-- +local WBP_Challenge_V2 = { + bInitDoOnce = false; + SelectItem = nil; +}; + +function WBP_Challenge_V2:Construct() + self.WBP_WidgetHeader.UIType = EUIType.Challenge + self.WBP_WidgetHeader:Construct() + + local Num = self.VerticalBox_Button:GetChildrenCount() + for i = 1, Num do + local Item = self.VerticalBox_Button:GetChildAt(i - 1) + Item:SetIndex(i - 1) + Item.Image_Icon:SetBrushFromTexture(UE.LoadObject(Tables.ChallengeInfo[i].Icon)) + end + + self.SelectItem = self.VerticalBox_Button:GetChildAt(0) + self:SelectCurrItem(true) + + self:ShowSkillInfo(false) +end + +function WBP_Challenge_V2:OnShowPanel() + for i = 0, self.WidgetSwitcher_MonsterInfo:GetChildrenCount() - 1 do + if self.WidgetSwitcher_MonsterInfo:GetChildAt(i).OnShowPanel then + self.WidgetSwitcher_MonsterInfo:GetChildAt(i):OnShowPanel() + end + end + NewPlayerGuideManager:RemoveGuide(13) +end + +function WBP_Challenge_V2:OnClosePanel() + for i = 0, self.WidgetSwitcher_MonsterInfo:GetChildrenCount() - 1 do + if self.WidgetSwitcher_MonsterInfo:GetChildAt(i).OnClosePanel then + self.WidgetSwitcher_MonsterInfo:GetChildAt(i):OnClosePanel() + end + end +end +-- function WBP_Challenge_V2:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_Challenge_V2:Destruct() + +-- end + +function WBP_Challenge_V2:ShowChallenge(InIndex, Item) + self.WidgetSwitcher_MonsterInfo:SetActiveWidgetIndex(InIndex) + self:SelectCurrItem(false) + self.SelectItem = Item + self:SelectCurrItem(true) +end + +function WBP_Challenge_V2:SelectCurrItem(IsShow) + self.SelectItem:ShowSelect(IsShow) +end + +function WBP_Challenge_V2:ShowSkillInfo(IsShow, ShowId) + if ShowId == 1 then + IsShow = false + end + if IsShow then + self.WBP_ChallengeInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.WBP_ChallengeInfo:SetSkillId(ShowId) + else + self.WBP_ChallengeInfo:SetVisibility(ESlateVisibility.Collapsed) + end +end + +return WBP_Challenge_V2; diff --git a/GZJ/Script/UI/WBP_CrystalHealth.lua b/GZJ/Script/UI/WBP_CrystalHealth.lua new file mode 100644 index 00000000..cceced78 --- /dev/null +++ b/GZJ/Script/UI/WBP_CrystalHealth.lua @@ -0,0 +1,18 @@ +---@class WBP_CrystalHealth_C:UUserWidget +---@field CrystalHPProgressBar UProgressBar +--Edit Below-- +local WBP_CrystalHealth = { bInitDoOnce = false; }; + +function WBP_CrystalHealth:Construct() + EventSystem:AddListener(EventType.OnCrystalHPChanged, WBP_CrystalHealth.UpdateCrystalHealthPercent, self) +end + +function WBP_CrystalHealth:Destruct() + EventSystem:RemoveListener(EventType.OnCrystalHPChanged, WBP_CrystalHealth.UpdateCrystalHealthPercent, self) +end + +function WBP_CrystalHealth:UpdateCrystalHealthPercent(NewPercentage) + UE.Log("[WBP_CrystalHealth:UpdateCrystalHealthPercent] percent = %.2f", NewPercentage) + self.CrystalHPProgressBar:SetPercent(NewPercentage) +end +return WBP_CrystalHealth; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_DifficultInfo.lua b/GZJ/Script/UI/WBP_DifficultInfo.lua new file mode 100644 index 00000000..fb0202ca --- /dev/null +++ b/GZJ/Script/UI/WBP_DifficultInfo.lua @@ -0,0 +1,144 @@ +---@class WBP_DifficultInfo_C:UUserWidget +---@field Button_Close UButton +---@field Button_Select UButton +---@field ScrollBox_Texts UScrollBox +---@field TextBlock_Credit UTextBlock +---@field TextBlock_Difficult UTextBlock +---@field TextBlock_Drop1 UTextBlock +---@field TextBlock_Drop2 UTextBlock +---@field TextBlock_Drop3 UTextBlock +---@field TextBlock_Drop4 UTextBlock +---@field TextBlock_Drop5 UTextBlock +---@field TextBlock_GameClearance1 UTextBlock +---@field TextBlock_GameClearance3 UTextBlock +---@field TextBlock_GameClearance5 UTextBlock +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_DifficultInfo = { + bInitDoOnce = false; + SelectDifficult = 0; -- 选择的难度 + SelectWidget = nil; +}; + +function WBP_DifficultInfo:Construct() + self.WBP_WidgetHeader:Construct() + self.ScrollBox_Texts:SetScrollBarVisibility(ESlateVisibility.Hidden) + --self.WBP_CloseWidget:SetWidgetToClose(self) + self.Button_Select.OnClicked:Add(WBP_DifficultInfo.OnClickSelect, self) + self.Button_Close.OnClicked:Add(WBP_DifficultInfo.OnClickClose, self) +end + +-- function WBP_DifficultInfo:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_DifficultInfo:Destruct() + self.Button_Select.OnClicked:Remove(WBP_DifficultInfo.OnClickSelect, self) + self.Button_Close.OnClicked:Remove(WBP_DifficultInfo.OnClickClose, self) +end + +function WBP_DifficultInfo:InitFromParam(InNum, InWidget) + self:SetDifficult(InNum, InWidget) +end + +function WBP_DifficultInfo:OnClickClose() + UIManager:ClosePanel(EUIType.DifficultInfo) +end + +function WBP_DifficultInfo:OnClosePanel() + +end + +function WBP_DifficultInfo:SetDifficult(InNum, InWidget) + print(string.format('[WBP_DifficultInfo:SetDifficult] 执行设置难度')) + self.SelectDifficult = InNum + self.SelectWidget = InWidget + -- 设置 难度 + local Credit = InNum + 10 + local GameClearance = ArchiveTable.GameClearanceRewards[InNum] + local TheText = '难度说明 \ +奖励:(所有奖励均可在游戏内存档中查询) \ + 积分:%d \ + 通关成就:\ + 1次:%s\ + 3次:%s\ + 5次:%s\ + 掉落:\ + 属性套装:(以下属性随机获得一条)\ + %s\ + %s\ + %s\ + %s\ + %s\ + 随机装备:\ + 掉落本剧首领的其中一件装备\ + 武器,盔甲,腿铠,足屐\ +\ +难度系数:%.02f' + + local Func = function(InStr, InVal) + local PercentIndex = string.find(InStr, '%%') + if PercentIndex ~= nil then + InStr = string.gsub(InStr, '%%', '') + end + + if math.type(InVal) == 'float' then + return string.format('%s+%.02f%%', InStr, InVal * 100) + else + return InStr .. tostring(InVal) + end + end + + local Func1 = function(InVal, InNo) + return Func(InVal[InNo].Type, InVal[InNo].Value) + end + + local Func2 = function(InNo) + return Func(ArchiveTable.DropGameItems[ArchiveTable.DropGameItemIndex[InNo]].Type, ArchiveTable.DropGameItems[ArchiveTable.DropGameItemIndex[InNo]].Value) + end + local Val = string.format( + TheText, + Credit, + Func1(GameClearance, 1), + Func1(GameClearance, 3), + Func1(GameClearance, 5), + Func2(1), + Func2(2), + Func2(3), + Func2(4), + Func2(5), + GlobalConfigs.DifficultyMultiplier["Attack"][InNum] + 0.0 + ) + + print(string.format('[WBP_DifficultInfo:SetDifficult] 设置成功')) + --self.TextBlock_Info:SetText(Val) + + self.TextBlock_Credit:SetText(string.format('%d', Credit)) + + self.TextBlock_GameClearance1:SetText(string.format('%s', Func1(GameClearance, 1))) + self.TextBlock_GameClearance3:SetText(string.format('%s', Func1(GameClearance, 3))) + self.TextBlock_GameClearance5:SetText(string.format('%s', Func1(GameClearance, 5))) + + self.TextBlock_Drop1:SetText(string.format(' %s', Func2(1))) + self.TextBlock_Drop2:SetText(string.format(' %s', Func2(2))) + self.TextBlock_Drop3:SetText(string.format(' %s', Func2(3))) + self.TextBlock_Drop4:SetText(string.format(' %s', Func2(4))) + self.TextBlock_Drop5:SetText(string.format(' %s', Func2(5))) + + self.TextBlock_Difficult:SetText(string.format('%.02f', GlobalConfigs.DifficultyMultiplier["Attack"][InNum] + 0.0)) +end + +function WBP_DifficultInfo:OnClickSelect() + -- 直接发送过去 + -- 先将 Item 设置为 2 + print(string.format('[WBP_DifficultInfo:OnClickSelect] 执行')) + if self.SelectWidget ~= nil then + self.SelectWidget:SetVisualType(2) + end + + -- 设置 Click + UIManager:GetPanel(EUIType.SelectDifficulty):SetCurrentDifficulty(self.SelectDifficult) + UIManager:HidePanel(EUIType.DifficultInfo) +end + +return WBP_DifficultInfo; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_GeneralSlide.lua b/GZJ/Script/UI/WBP_GeneralSlide.lua new file mode 100644 index 00000000..0124bd6a --- /dev/null +++ b/GZJ/Script/UI/WBP_GeneralSlide.lua @@ -0,0 +1,78 @@ +---@class WBP_GeneralSlide_C:UUserWidget +---@field Button_Cancel UButton +---@field Button_Ok UButton +---@field Button_SlideMode_add UButton +---@field Button_SlideMode_minus UButton +---@field SlideMode_Value UTextBlock +---@field WBP_CloseWidget UWBP_CloseWidget_C +--Edit Below-- +local WBP_GeneralSlide = { + bInitDoOnce = false; + Num = 0, + ItemData = nil, + OperateType = EBagOperateType.None +}; + +function WBP_GeneralSlide:Construct() + self.Button_SlideMode_minus.OnClicked:Add(WBP_GeneralSlide.OnClickMinus, self) + self.Button_SlideMode_add.OnClicked:Add(WBP_GeneralSlide.OnClickAdd, self) + self.Button_Ok.OnClicked:Add(WBP_GeneralSlide.OnClickOk, self) + self.Button_Cancel.OnClicked:Add(WBP_GeneralSlide.OnClickCancel, self) +end + +-- function WBP_GeneralSlide:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_GeneralSlide:Destruct() + self.Button_SlideMode_minus.OnClicked:Remove(WBP_GeneralSlide.OnClickMinus, self) + self.Button_SlideMode_add.OnClicked:Remove(WBP_GeneralSlide.OnClickAdd, self) + self.Button_Ok.OnClicked:Remove(WBP_GeneralSlide.OnClickOk, self) + self.Button_Cancel.OnClicked :Remove(WBP_GeneralSlide.OnClickCancel, self) +end + +function WBP_GeneralSlide:OnClickMinus() + if self.Num <= 1 then + return + end + self.Num = self.Num - 1 + self.SlideMode_Value:SetText(tostring(self.Num)) +end + +function WBP_GeneralSlide:OnClickAdd() + -- 需要获取 Max + if self.Num >= self.ItemData.ItemCount then + return + end + + self.Num = self.Num + 1 + --需要显示 + self.SlideMode_Value:SetText(tostring(self.Num)) +end + +function WBP_GeneralSlide:OnClickOk() + -- 执行提交操作 + self.ItemData.ItemCount = self.Num + EventSystem:SendEvent(EventType.SendGeneralSlideNum, self.OperateType, self.ItemData) +end + +function WBP_GeneralSlide:OnClickCancel() + -- 执行隐藏操作 + self:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_GeneralSlide:SetSlideValue(InData) + self.Num = 1 + self.ItemData = InData + self.SlideMode_Value:SetText(tostring(self.Num)) +end + +function WBP_GeneralSlide:GetSlideValue() + return self.Num +end + +function WBP_GeneralSlide:SetOperateType(InOperateType) + self.OperateType = InOperateType +end + +return WBP_GeneralSlide; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_InteractPanel.lua b/GZJ/Script/UI/WBP_InteractPanel.lua new file mode 100644 index 00000000..e4d7d0d8 --- /dev/null +++ b/GZJ/Script/UI/WBP_InteractPanel.lua @@ -0,0 +1,731 @@ +---@class WBP_InteractPanel_C:UUserWidget +---@field Button_FadeIn_2 UWidgetAnimation +---@field Button_FadeIn_1 UWidgetAnimation +---@field Button_AttributeUpgrade UNewButton +---@field Button_Backpack UNewButton +---@field Button_BossInfo UNewButton +---@field Button_Breach UNewButton +---@field Button_Challenge UNewButton +---@field Button_ChooseWeapon_Left UButton +---@field Button_ChooseWeapon_Right UButton +---@field Button_Inherit UNewButton +---@field Button_Pickup UNewButton +---@field Button_ResourceGrade UNewButton +---@field Button_ResourceUpgrade UNewButton +---@field Button_Save UNewButton +---@field Button_Seal UNewButton +---@field Button_SelectBoss UNewButton +---@field Button_ShowAttribute UNewButton +---@field Button_SkillInfo UNewButton +---@field Button_Technology UNewButton +---@field Button_Unpacking UNewButton +---@field Button_WeaponAttribute UNewButton +---@field Image_SelectBoss UImage +---@field Image_Weapon UImage +---@field Overlay_AttributeButton UOverlay +---@field Overlay_SaveButton UOverlay +---@field Panel_Button1 UCanvasPanel +---@field Panel_Button2 UCanvasPanel +---@field Panel_Button3 UCanvasPanel +---@field Panel_Button4 UCanvasPanel +---@field Panel_Button5 UCanvasPanel +---@field Panel_Button_AttributeUpgrade UCanvasPanel +---@field Panel_Button_Backpack UCanvasPanel +---@field Panel_Button_BossInfo UCanvasPanel +---@field Panel_Button_Breach UCanvasPanel +---@field Panel_Button_Pickup UCanvasPanel +---@field Panel_Button_ResourceUpgrade UCanvasPanel +---@field Panel_Button_Seal UCanvasPanel +---@field Panel_PlayerInfo UCanvasPanel +---@field Panel_SelectBoss UCanvasPanel +---@field Panel_WeaponInfo UCanvasPanel +---@field ProgressBar_Energy UProgressBar +---@field ProgressBar_Exp UProgressBar +---@field ProgressBar_Health UProgressBar +---@field TextBlock_AttackValue UTextBlock +---@field TextBlock_Health UTextBlock +---@field TextBlock_Level UTextBlock +---@field TextBlock_WeaponName UTextBlock +--Edit Below-- +local WBP_InteractPanel = { + bInitDoOnce = false, + WeaponComponent = nil, + + bHasShowAttributeUpgrade = false, + bHasShowResourceUpgrade = false, +}; + +local ButtonTriggerColor = { + Normal = {R = 1.0, G = 1.0, B = 1.0, A = 1.0}, + Triggered = {R = 1, G = 0.12, B = 0.0, A = 1.0}, +} + +function WBP_InteractPanel:Construct() + WBP_InteractPanel.SuperClass.Construct(self) + + self:OnToggleBreachButton(false) + self:OnToggleSealButton(false) + + for i = 2, 5 do + --self[string.format("Panel_Button%d", i)]:SetVisibility(ESlateVisibility.Collapsed) + end + + self:Init() + + self:BindEvents() +end + +function WBP_InteractPanel:Destruct() + self:UnBindEvents() + WBP_InteractPanel.SuperClass.Destruct(self) +end + +function WBP_InteractPanel:Init() + local OwningPawn = GameDataManager.GetLocalPlayerController():GetPlayerCharacterSafety() + local LocalPlayerState = GameDataManager.GetLocalPlayerState() + self.PlayerKey = LocalPlayerState.PlayerKey + + self:OnExpChanged(UGCGameSystem.GameState:GetAllPlayerExp()) + self:OnPlayerLevelChange(UGCGameSystem.GameState:GetAllPlayerLevel()) + + self:OnHealthChanged(self.PlayerKey, UGCPawnAttrSystem.GetHealth(OwningPawn), UGCPawnAttrSystem.GetHealth(OwningPawn), 0) + self:OnEnergyChanged(self.PlayerKey, OwningPawn.EnergyData.Cur, OwningPawn.EnergyData.Max) + if LocalPlayerState.Attributes[AttributeType.Base] and LocalPlayerState.Attributes[AttributeType.Base].Base_Attack then + self:OnBaseAttackChanged(self.PlayerKey, LocalPlayerState.Attributes[AttributeType.Base].Base_Attack) + end + + local Pawn = GameDataManager.GetLocalPlayerPawn() + if Pawn and UE.IsValid(Pawn) then + local WeaponComp = Pawn:GetWeaponComponent() + if WeaponComp and UE.IsValid(WeaponComp) then + if WeaponComp.IsAttackNearestMonster then + self.Image_SelectBoss:SetColorAndOpacity(ButtonTriggerColor.Normal) + else + self.Image_SelectBoss:SetColorAndOpacity(ButtonTriggerColor.Triggered) + end + end + end + + self.HasTriggeredGuideChallenge = false + self.HasTriggeredGuideResourceGrade = false + self.HasTriggeredGuideUnpacking = false + self.HasTriggeredGuideTechnology = false + self.HasTriggeredGuideIherit = false +end + +function WBP_InteractPanel:BindEvents() + EventSystem:AddListener(EventType.ToggleBreachButton, WBP_InteractPanel.OnToggleBreachButton, self) + EventSystem:AddListener(EventType.ShowSealButton, WBP_InteractPanel.OnToggleSealButton, self) + EventSystem:AddListener(EventType.ClientUpdateWeapon, WBP_InteractPanel.OnUpdateWeapon, self) + EventSystem:AddListener(EventType.OnPlayerExpChanged, WBP_InteractPanel.OnExpChanged, self) + EventSystem:AddListener(EventType.OnPlayerHPChanged, WBP_InteractPanel.OnHealthChanged, self) + EventSystem:AddListener(EventType.OnPlayerEnergyChanged, WBP_InteractPanel.OnEnergyChanged, self) + EventSystem:AddListener(EventType.OnPlayerBaseAttackValueChanged, WBP_InteractPanel.OnBaseAttackChanged, self) + EventSystem:AddListener(EventType.PlayerCoinPointChanged, WBP_InteractPanel.OnPlayerCoinPointChanged, self) + EventSystem:AddListener(EventType.PlayerKillPointChanged, WBP_InteractPanel.OnPlayerKillPointChanged, self) + EventSystem:AddListener(EventType.PlayerInheritItemsChanged, WBP_InteractPanel.OnPlayerInheritItemsChanged, self) + EventSystem:AddListener(EventType.OnPlayerLevelChanged, WBP_InteractPanel.OnPlayerLevelChange, self) + + self.Button_Pickup.OnClicked:Add(WBP_InteractPanel.OnPickupButtonClicked, self) + self.Button_ShowAttribute.OnClicked:Add(WBP_InteractPanel.OnShowAttributeButtonClicked, self) + self.Button_Backpack.OnClicked:Add(WBP_InteractPanel.ClickBackpackButton, self) + self.Button_Breach.OnClicked:Add(WBP_InteractPanel.OnBreach, self) + self.Button_ChooseWeapon_Left.OnClicked:Add(WBP_InteractPanel.OnMinusWeapon, self) + self.Button_ChooseWeapon_Right.OnClicked:Add(WBP_InteractPanel.OnAddWeapon, self) + self.Button_BossInfo.OnClicked:Add(WBP_InteractPanel.OnBossInfoPanel, self) + + self.Button_Technology.OnClicked:Add(WBP_InteractPanel.OnTechnologyPanel, self) + self.Button_Unpacking.OnClicked:Add(WBP_InteractPanel.OnUnpackingPanel, self) + self.Button_Challenge.OnClicked:Add(WBP_InteractPanel.OnChallenge, self) + self.Button_Inherit.OnClicked:Add(WBP_InteractPanel.OnInherit, self) + self.Button_ResourceGrade.OnClicked:Add(WBP_InteractPanel.OnResourceGradePanel, self) + + self.Button_WeaponAttribute.OnClicked:Add(WBP_InteractPanel.OnClickWeaponAttribute, self) + self.Button_SkillInfo.OnClicked:Add(WBP_InteractPanel.OnClickSkillInfo, self) + self.Button_Seal.OnClicked:Add(WBP_InteractPanel.OnClickSeal, self) + self.Button_Save.OnClicked:Add(WBP_InteractPanel.OnClickSaveGame, self) +end + +function WBP_InteractPanel:UnBindEvents() + EventSystem:RemoveListener(EventType.ToggleBreachButton, WBP_InteractPanel.OnToggleBreachButton, self) + EventSystem:RemoveListener(EventType.ClientUpdateWeapon, WBP_InteractPanel.OnUpdateWeapon, self) + EventSystem:RemoveListener(EventType.ShowSealButton, WBP_InteractPanel.OnToggleSealButton, self) + EventSystem:RemoveListener(EventType.OnPlayerEnergyChanged, WBP_InteractPanel.OnEnergyChanged, self) + EventSystem:RemoveListener(EventType.OnPlayerHPChanged, WBP_InteractPanel.OnHealthChanged, self) + EventSystem:RemoveListener(EventType.OnPlayerExpChanged, WBP_InteractPanel.OnExpChanged, self) + EventSystem:RemoveListener(EventType.OnPlayerBaseAttackValueChanged, WBP_InteractPanel.OnBaseAttackChanged, self) + EventSystem:RemoveListener(EventType.PlayerCoinPointChanged, WBP_InteractPanel.OnPlayerCoinPointChanged, self) + EventSystem:RemoveListener(EventType.PlayerKillPointChanged, WBP_InteractPanel.OnPlayerKillPointChanged, self) + EventSystem:RemoveListener(EventType.PlayerInheritItemsChanged, WBP_InteractPanel.OnPlayerInheritItemsChanged, self) + EventSystem:RemoveListener(EventType.OnPlayerLevelChanged, WBP_InteractPanel.OnPlayerLevelChange, self) + + self.Button_Pickup.OnClicked:Remove(WBP_InteractPanel.OnPickupButtonClicked, self) + self.Button_ShowAttribute.OnClicked:Remove(WBP_InteractPanel.OnShowAttributeButtonClicked, self) + self.Button_Backpack.OnClicked:Remove(WBP_InteractPanel.ClickBackpackButton, self) + self.Button_Breach.OnClicked:Remove(WBP_InteractPanel.OnBreach, self) + self.Button_ChooseWeapon_Left.OnClicked:Remove(WBP_InteractPanel.OnMinusWeapon, self) + self.Button_ChooseWeapon_Right.OnClicked:Remove(WBP_InteractPanel.OnAddWeapon, self) + self.Button_BossInfo.OnClicked:Remove(WBP_InteractPanel.OnBossInfoPanel, self) + + self.Button_Technology.OnClicked:Remove(WBP_InteractPanel.OnTechnologyPanel, self) + self.Button_Unpacking.OnClicked:Remove(WBP_InteractPanel.OnUnpackingPanel, self) + self.Button_Challenge.OnClicked:Remove(WBP_InteractPanel.OnChallenge, self) + self.Button_Inherit.OnClicked:Remove(WBP_InteractPanel.OnInherit, self) + self.Button_ResourceGrade.OnClicked:Remove(WBP_InteractPanel.OnResourceGradePanel, self) + + self.Button_WeaponAttribute.OnClicked:Remove(WBP_InteractPanel.OnClickWeaponAttribute, self) + self.Button_SkillInfo.OnClicked:Remove(WBP_InteractPanel.OnClickSkillInfo, self) + self.Button_Seal.OnClicked:Remove(WBP_InteractPanel.OnClickSeal, self) + self.Button_Save.OnClicked:Remove(WBP_InteractPanel.OnClickSaveGame, self) +end + +function WBP_InteractPanel:OnShowAttributeButtonClicked() + if UIManager:IsVisiblePanel(EUIType.Attribute) then + UIManager:ClosePanel(EUIType.Attribute) + else + UIManager:ShowPanel(EUIType.Attribute) + end +end + +function WBP_InteractPanel:OnPickupButtonClicked() + local PC = GameDataManager.GetLocalPlayerController() + if not UE.IsValid(PC) then + return + end + PC:RequestPickupNearbyItems(true) + NewPlayerGuideManager:RemoveGuide(19) + NewPlayerGuideManager:TriggerGuide(20) +end + +function WBP_InteractPanel:OnToggleBreachButton(Toggle) + if Toggle then + self.Panel_Button_Breach:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + NewPlayerGuideManager:TriggerGuide(4) + else + self.Panel_Button_Breach:SetVisibility(ESlateVisibility.Collapsed) + UIManager:HidePanel(EUIType.SelectWeapon) + NewPlayerGuideManager:RemoveGuide(4) + end +end + +function WBP_InteractPanel:OnToggleSealButton(IsShow) + if IsShow then + self.Panel_Button_Seal:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.CanClickSeal = true + --NewPlayerGuideManager:TriggerGuide(14) + else + self.CanClickSeal = false + self.Panel_Button_Seal:SetVisibility(ESlateVisibility.Collapsed) + --NewPlayerGuideManager:RemoveGuide(14) + end +end + +function WBP_InteractPanel:ClickBackpackButton() + if UIManager:IsVisiblePanel(EUIType.Backpack) then + UIManager:HidePanel(EUIType.UseSkill) + UIManager:HidePanel(EUIType.Backpack) + else + EventSystem:SendEvent(EventType.UpdateItemList, true) + UIManager:ShowPanel(EUIType.Backpack) + + NewPlayerGuideManager:RemoveGuide(20) + end +end + +function WBP_InteractPanel:OnBreach() + print(string.format('[WBP_InteractPanel:OnBreach] 执行')) + if UIManager:IsVisiblePanel(EUIType.SelectWeapon) then + UIManager:HidePanel(EUIType.SelectWeapon) + else + -- 直接生成一个怪物,再给玩家赋予能力即可 + print(string.format('[WBP_InteractPanel:OnBreach] 可以执行')) + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_OnBreach", PC.PlayerKey) + + self.Panel_Button_Breach:SetVisibility(ESlateVisibility.Collapsed) + NewPlayerGuideManager:RemoveGuide(4) + end +end + +function WBP_InteractPanel:SetWeaponComponent() + local PlayerController = STExtraGameplayStatics.GetFirstPlayerController(self) + if PlayerController then + local OwningPawn = PlayerController:GetPlayerCharacterSafety() + if OwningPawn then + local WC = OwningPawn:GetWeaponComponent() + if WC ~= nil and UE.IsValid(WC) then + self.WeaponComponent = WC + end + end + end +end + +function WBP_InteractPanel:SetWeaponIcon(InIcon) + local IconSlot = WidgetLayoutLibrary.SlotAsCanvasSlot(self.Image_Weapon) + local NewIconX = 40 / 80 * InIcon:Blueprint_GetSizeX() + IconSlot:SetSize({X = NewIconX, Y = 40}) + self.Image_Weapon:SetBrushFromTexture(InIcon) + self.Image_Weapon:SetVisibility(ESlateVisibility.SelfHitTestInvisible) +end + +function WBP_InteractPanel:OnMinusWeapon() + -- 找到当前的 Id + if self.WeaponComponent == nil then + self:SetWeaponComponent() + end + + local CurrentIndex = self.WeaponComponent:GetCurrentWeaponIndex() + local TotalWeaponCount = self.WeaponComponent:GetWeaponCount() + print(string.format("[WBP_InteractPanel:OnMinusWeapon] Total Weapon Count = %d", TotalWeaponCount)) + local NextIndex = (CurrentIndex + TotalWeaponCount - 1) % TotalWeaponCount + if NextIndex == 0 then + NextIndex = TotalWeaponCount + end + print(string.format("[WBP_InteractPanel:OnMinusWeapon] Next Index = %d", NextIndex)) + local NextWeaponId = self.WeaponComponent:FindWeaponIdByIndex(NextIndex) + local PlayerController = GameDataManager.GetLocalPlayerController() + print(string.format("[WBP_InteractPanel:OnMinusWeapon] NextWeapon Id = %d" , NextWeaponId)) + UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_ChangeCurrentWeaponId", NextWeaponId) +end + +function WBP_InteractPanel:OnAddWeapon() + if self.WeaponComponent == nil then + self:SetWeaponComponent() + end + local CurrentIndex = self.WeaponComponent:GetCurrentWeaponIndex() + local TotalWeaponCount = self.WeaponComponent:GetWeaponCount() + print(string.format("[WBP_InteractPanel:OnAddWeapon] Total Weapon Count = %d", TotalWeaponCount)) + local NextIndex = (CurrentIndex + TotalWeaponCount + 1) % TotalWeaponCount + if NextIndex == 0 then + NextIndex = TotalWeaponCount + end + print(string.format("[WBP_InteractPanel:OnAddWeapon] Next Index = %d", NextIndex)) + local NextWeaponId = self.WeaponComponent:FindWeaponIdByIndex(NextIndex) + local PlayerController = GameDataManager.GetLocalPlayerController() + print(string.format("[WBP_InteractPanel:OnAddWeapon] NextWeapon Id = %d" , NextWeaponId)) + UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_ChangeCurrentWeaponId", NextWeaponId) +end + +function WBP_InteractPanel:OnUpdateWeapon(InNewId, InPlayerKey) + if InPlayerKey ~= GameDataManager.GetLocalPlayerController().PlayerKey then + return + end + + -- 找到对应 图标 + local Data = GameDataManager.GetWeaponConstructDataByID(InNewId) + if Data == nil then + UE.Log("[WBP_InteractPanel:OnUpdateWeapon] Data is nil") + return + end + local Val = DropItemMap.WeaponTable[Data.WeaponType] + if Val ~= nil then + if Val.Icon == nil then + self.Image_Weapon:SetVisibility(ESlateVisibility.Collapsed) + else + local Icon = UE.LoadObject(Val.Icon) + if Icon == nil then + self.Image_Weapon:SetVisibility(ESlateVisibility.Collapsed) + else + self:SetWeaponIcon(Icon) + self.TextBlock_WeaponName:SetText(Val.ChineseName) + self.TextBlock_WeaponName:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + end + end +end + +function WBP_InteractPanel:OnExpChanged(PlayerAllExp) + for PlayerKey, ExpInfo in pairs(PlayerAllExp) do + if self.PlayerKey == PlayerKey then + self.ProgressBar_Exp:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.ProgressBar_Exp:SetPercent(ExpInfo.CurExp / ExpInfo.TotalExp) + return + end + end + self.ProgressBar_Exp:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_InteractPanel:OnHealthChanged(InPlayerKey, CurHP, MaxHP, PrevHP) + if self.PlayerKey == InPlayerKey then + self.ProgressBar_Health:SetPercent(CurHP / MaxHP) + self.TextBlock_Health:SetText(string.format('%d / %d', math.floor(CurHP), math.floor(MaxHP))) + end +end + +function WBP_InteractPanel:OnEnergyChanged(InPlayerKey, CurEnergy, MaxEnergy) + if self.PlayerKey == InPlayerKey then + self.ProgressBar_Energy:SetPercent(CurEnergy / MaxEnergy) + end +end + +function WBP_InteractPanel:OnPlayerInheritItemsChanged(InheritItems) + if InheritItems['盔'] // 10 % 10 >= 3 or InheritItems['甲'] // 10 % 10 >= 3 then + self.CanClickUnpacking = true + if self.HasTriggeredGuideUnpacking == false and NewPlayerGuideManager:HasGuideMaxTriggered(11) == false then + self.HasTriggeredGuideUnpacking = self:TryTriggerInteractGuide(11, "HasTriggeredGuideUnpacking") + end + else + self.CanClickUnpacking = false + end +end + +function WBP_InteractPanel:OnBaseAttackChanged(InPlayerKey, BaseAttack) + if self.PlayerKey == InPlayerKey then + BaseAttack = math.ceil(BaseAttack) + self.TextBlock_AttackValue:SetText(string.format("威力值:%d", BaseAttack)) + + if BaseAttack > 0 then + if (BaseAttack % 500 < 20 or BaseAttack % 700 < 20) and self.HasTriggeredGuideChallenge == false and NewPlayerGuideManager:HasGuideMaxTriggered(13) == false then + self.HasTriggeredGuideChallenge = self:TryTriggerInteractGuide(13, "HasTriggeredGuideChallenge") + end + if BaseAttack % 2000 < 20 and self.HasTriggeredGuideResourceGrade == false and NewPlayerGuideManager:HasGuideMaxTriggered(12) == false then + self.HasTriggeredGuideResourceGrade = self:TryTriggerInteractGuide(12, "HasTriggeredGuideResourceGrade") + end + end + end +end + +function WBP_InteractPanel:OnPlayerCoinPointChanged(CoinPoint) + CoinPoint = math.ceil(CoinPoint) + if CoinPoint > 0 then + if CoinPoint >= 3500 then + self.CanClickInherit = true + if CoinPoint % 3500 < 20 and self.HasTriggeredGuideIherit == false and NewPlayerGuideManager:HasGuideMaxTriggered(9) == false then + self.HasTriggeredGuideIherit = self:TryTriggerInteractGuide(9, "HasTriggeredGuideIherit") + end + else + self.CanClickInherit = false + end + end +end + +function WBP_InteractPanel:OnPlayerKillPointChanged(KillPoint) + if self.MaxKillPoint == nil then + self.MaxKillPoint = 0 + end + + KillPoint = math.ceil(KillPoint) + if KillPoint >= self.MaxKillPoint then + self.MaxKillPoint = KillPoint + else + return + end + + if self.MaxKillPoint >= 10 then + if self.MaxKillPoint % 10 < 10 and self.HasTriggeredGuideTechnology == false and NewPlayerGuideManager:HasGuideMaxTriggered(10) == false then + self.HasTriggeredGuideTechnology = self:TryTriggerInteractGuide(10, "HasTriggeredGuideTechnology") + end + end +end + +function WBP_InteractPanel:TryTriggerInteractGuide(ConfigID, TriggerName) + if NewPlayerGuideManager:IsGuideExisted(ConfigID) then + return false + end + + local ButtonIndex = -1 + local ButtonToggleName = "" + local GuideHandleName = "" + local ToggleHandleName = "" + + if ConfigID <= 11 then + ButtonIndex = 1 + ButtonToggleName = "bHasShowAttributeUpgrade" + GuideHandleName = "InteractExpandHandle1" + ToggleHandleName = "ToggleHandle1" + else + ButtonIndex = 2 + ButtonToggleName = "bHasShowResourceUpgrade" + GuideHandleName = "InteractExpandHandle2" + ToggleHandleName = "ToggleHandle2" + end + + if self.InteractExpandHandle1 ~= nil then + EventSystem.StopTimer(self.InteractExpandHandle1) + self.InteractExpandHandle1 = nil + end + if self.InteractExpandHandle2 ~= nil then + EventSystem.StopTimer(self.InteractExpandHandle2) + self.InteractExpandHandle2 = nil + end + + if self[ButtonToggleName] == false then + self:OnForceExpandUpgradeRelatedButtonByIndex(ButtonIndex) + end + + self[GuideHandleName] = EventSystem.SetTimer(self, function() + NewPlayerGuideManager:TriggerGuide(ConfigID) + self[GuideHandleName] = nil + end, 0.26) + + local Duration = NewPlayerGuideManager:GetGuideDuration(ConfigID) + if Duration > 0.1 then + self[ToggleHandleName] = EventSystem.SetTimer(self, function() + self[TriggerName] = false + self[ToggleHandleName] = nil + end, Duration) + end + + return true +end + +function WBP_InteractPanel:OnPlayerLevelChange(InAllPlayerLevel) + for PlayerKey, Level in pairs(InAllPlayerLevel) do + if self.PlayerKey == PlayerKey then + self.TextBlock_Level:SetText(string.format("Lv.%d", Level)) + break + end + end +end + +function WBP_InteractPanel:OnTechnologyPanel() + if UIManager:IsVisiblePanel(EUIType.Tech) then + UIManager:ClosePanel(EUIType.Tech) + else + UIManager:ShowPanel(EUIType.Tech) + end + self:OnUpgradeRelatedButtonClicked() +end + +function WBP_InteractPanel:OnBossInfoPanel() + if UIManager:IsVisiblePanel(EUIType.BossInfo) then + UIManager:ClosePanel(EUIType.BossInfo) + else + UIManager:ShowPanel(EUIType.BossInfo) + end +end + +function WBP_InteractPanel:OnUnpackingPanel() + if UIManager:IsVisiblePanel(EUIType.Unpacking) then + UIManager:ClosePanel(EUIType.Unpacking) + self:OnUpgradeRelatedButtonClicked() + else + self.CanClickUnpacking = true + if self.CanClickUnpacking then + UIManager:ShowPanel(EUIType.Unpacking) + self:OnUpgradeRelatedButtonClicked() + else + UIManager:ShowGeneralNotice("需要将购买中的盔或者甲升级到高级才能开启") + end + end +end + +function WBP_InteractPanel:OnChallenge() + if UIManager:IsVisiblePanel(EUIType.Challenge) then + UIManager:ClosePanel(EUIType.Challenge) + else + UIManager:ShowPanel(EUIType.Challenge) + end + self:OnUpgradeRelatedButtonClicked() +end + +function WBP_InteractPanel:OnClickWeaponAttribute() + -- 显示界面 + if UIManager:IsVisiblePanel(EUIType.WeaponAttribute) then + UIManager:ClosePanel(EUIType.WeaponAttribute) + else + UIManager:ShowPanel(EUIType.WeaponAttribute) + end +end + +function WBP_InteractPanel:OnClickSkillInfo() + local Pawn = GameDataManager.GetLocalPlayerPawn() + local WeaponType = GameDataManager.GetWeaponType(Pawn.WeaponActor.CurrentWeaponId) + if WeaponType == nil or WeaponType == EWeaponClassType.WT_Pistol then + return + end + -- UIManager:ShowPanel(EUIType.WeaponDetailsDesc) + if UIManager:IsVisiblePanel(EUIType.WeaponDetailsDesc) then + UIManager:ClosePanel(EUIType.WeaponDetailsDesc) + else + UIManager:ShowPanel(EUIType.WeaponDetailsDesc) + end +end + +function WBP_InteractPanel:OnClickSeal() + -- 召唤一个 + if self.CanClickSeal then + self.CanClickSeal = false + local PlayerController = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PlayerController, PlayerController, "ServerRPC_StartSpawnSealMonster") + self.Panel_Button_Seal:SetVisibility(ESlateVisibility.Collapsed) + NewPlayerGuideManager:RemoveGuide(14) + end +end + +function WBP_InteractPanel:OnInherit() + if UIManager:IsVisiblePanel(EUIType.Inherit) then + UIManager:ClosePanel(EUIType.Inherit) + self:OnUpgradeRelatedButtonClicked() + else + if self.CanClickInherit then + UIManager:ShowPanel(EUIType.Inherit) + self:OnUpgradeRelatedButtonClicked() + else + -- 提示一下当前金钱不够 + UIManager:ShowGeneralNotice(string.format('金币不足3500,请收集足够金币再尝试。')) + end + end +end + +function WBP_InteractPanel:OnResourceGradePanel() + if UIManager:IsVisiblePanel(EUIType.ResourceGrade) then + UIManager:ClosePanel(EUIType.ResourceGrade) + else + UIManager:ShowPanel(EUIType.ResourceGrade) + end + self:OnUpgradeRelatedButtonClicked() +end + +function WBP_InteractPanel:OnClickSaveGame() + if UIManager:IsVisiblePanel(EUIType.SaveGame) then + UIManager:ClosePanel(EUIType.SaveGame) + else + UIManager:ShowPanel(EUIType.SaveGame) + end +end + +function WBP_InteractPanel:OnUpgradeRelatedButtonClicked() --关闭所有打开的提升按钮 + if self.bHasShowAttributeUpgrade then + self:PlayUpgradeButtonAnimationByIndex(1, false) + end + if self.bHasShowResourceUpgrade then + self:PlayUpgradeButtonAnimationByIndex(2, false) + end +end + +function WBP_InteractPanel:OnForceExpandUpgradeRelatedButtonByIndex(Index) --强行展开提升按钮 + if Index == 1 then + self:OnAttributeUpgradeClicked() + else + self:OnResourceUpgradeClicked() + end +end + +function WBP_InteractPanel:OnAttributeUpgradeClicked() + for i = 2, 3 do + --self[string.format("Panel_Button%d", i)]:SetVisibility(ESlateVisibility.HitTestInvisible) + end + --self:SetupUpgradeButtonStateByIndex(1) +end + +function WBP_InteractPanel:OnResourceUpgradeClicked() + for i = 4, 5 do + --self[string.format("Panel_Button%d", i)]:SetVisibility(ESlateVisibility.HitTestInvisible) + end + --self:SetupUpgradeButtonStateByIndex(2) +end + +function WBP_InteractPanel:OnForwardFadeIn1AnimationFinished() + self.bHasShowAttributeUpgrade = true + for i = 2, 3 do + --self[string.format("Panel_Button%d", i)]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +function WBP_InteractPanel:OnReverseFadeIn1AnimationFinished() + self.bHasShowAttributeUpgrade = false + for i = 2, 3 do + --self[string.format("Panel_Button%d", i)]:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_InteractPanel:OnForwardFadeIn2AnimationFinished() + self.bHasShowResourceUpgrade = true + for i = 4, 5 do + --self[string.format("Panel_Button%d", i)]:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +function WBP_InteractPanel:OnReverseFadeIn2AnimationFinished() + self.bHasShowResourceUpgrade = false + for i = 4, 5 do + --self[string.format("Panel_Button%d", i)]:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_InteractPanel:SetupUpgradeButtonStateByIndex(Index) + local CurToggle = Index == 1 and "bHasShowAttributeUpgrade" or "bHasShowResourceUpgrade" + local CurFadeInAnim = Index == 1 and self.Button_FadeIn_1 or self.Button_FadeIn_2 + + if self[CurToggle] == true then + if self:IsAnimationPlaying(CurFadeInAnim) and (not self:IsAnimationPlayingForward(CurFadeInAnim)) then + self:CheckOtherUpgradeButtonStateByIndex(Index) + self:ReversePlayingAnimationByIndex(Index, false) + else + self:PlayUpgradeButtonAnimationByIndex(Index, false) + end + else + if self:IsAnimationPlaying(CurFadeInAnim) and self:IsAnimationPlayingForward(CurFadeInAnim) then + self:ReversePlayingAnimationByIndex(Index, true) + else + self:CheckOtherUpgradeButtonStateByIndex(Index) + self:PlayUpgradeButtonAnimationByIndex(Index, true) + end + end + + if Index == 1 then + --NewPlayerGuideManager:RemoveGuide(9) + NewPlayerGuideManager:RemoveGuide(10) + NewPlayerGuideManager:RemoveGuide(11) + else + NewPlayerGuideManager:RemoveGuide(12) + NewPlayerGuideManager:RemoveGuide(13) + end +end + +function WBP_InteractPanel:CheckOtherUpgradeButtonStateByIndex(Index) + local OtherToggle = Index == 1 and "bHasShowResourceUpgrade" or "bHasShowAttributeUpgrade" + local OtherFadeInAnim = Index == 1 and self.Button_FadeIn_2 or self.Button_FadeIn_1 + + if self[OtherToggle] == true then + if self:IsAnimationPlaying(OtherFadeInAnim) and (not self:IsAnimationPlayingForward(OtherFadeInAnim)) then + else + self:PlayUpgradeButtonAnimationByIndex(Index == 1 and 2 or 1, false) + end + else + if self:IsAnimationPlaying(OtherFadeInAnim) and self:IsAnimationPlayingForward(OtherFadeInAnim) then + self:ReversePlayingAnimationByIndex(Index == 1 and 2 or 1, true) + end + end +end + +function WBP_InteractPanel:PlayUpgradeButtonAnimationByIndex(Index, bIsForward) + local CurFadeInAnim, CurForwardFinishEvent, CurReverseFinishEvent = self:GetAnimationAndEventsByIndex(Index) + + CurFadeInAnim.OnAnimationFinished:Remove(bIsForward and CurReverseFinishEvent or CurForwardFinishEvent, self) + self:PlayAnimation(CurFadeInAnim, 0.0, 1, bIsForward and EUMGSequencePlayMode.Forward or EUMGSequencePlayMode.Reverse, 1) +end + +function WBP_InteractPanel:ReversePlayingAnimationByIndex(Index, bIsForwardPlaying) + local CurFadeInAnim, CurForwardFinishEvent, CurReverseFinishEvent = self:GetAnimationAndEventsByIndex(Index) + + CurFadeInAnim.OnAnimationFinished:Remove(bIsForwardPlaying and CurForwardFinishEvent or CurReverseFinishEvent, self) + self:ReverseAnimation(CurFadeInAnim) +end + +function WBP_InteractPanel:GetAnimationAndEventsByIndex(Index) + local FadeInAnim = Index == 1 and self.Button_FadeIn_1 or self.Button_FadeIn_2 + local ForwardFinishEvent = Index == 1 and self.OnForwardFadeIn1AnimationFinished or self.OnForwardFadeIn2AnimationFinished + local ReverseFinishEvent = Index == 1 and self.OnReverseFadeIn1AnimationFinished or self.OnReverseFadeIn2AnimationFinished + + return FadeInAnim, ForwardFinishEvent, ReverseFinishEvent +end + +function WBP_InteractPanel:OnSelectBossClicked() + local Pawn = GameDataManager.GetLocalPlayerPawn() + if Pawn and UE.IsValid(Pawn) then + local WeaponComp = Pawn:GetWeaponComponent() + if WeaponComp and UE.IsValid(WeaponComp) then + WeaponComp.IsAttackNearestMonster = not WeaponComp.IsAttackNearestMonster + if WeaponComp.IsAttackNearestMonster then + self.Image_SelectBoss:SetColorAndOpacity(ButtonTriggerColor.Normal) + else + self.Image_SelectBoss:SetColorAndOpacity(ButtonTriggerColor.Triggered) + end + end + end + NewPlayerGuideManager:RemoveGuide(29) +end + +return WBP_InteractPanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_MainUI.lua b/GZJ/Script/UI/WBP_MainUI.lua new file mode 100644 index 00000000..fb388786 --- /dev/null +++ b/GZJ/Script/UI/WBP_MainUI.lua @@ -0,0 +1,416 @@ +---@class WBP_MainUI_C:UUserWidget +---@field Button_Attribute UNewButton +---@field Button_Guide UNewButton +---@field Button_Save UNewButton +---@field Button_WeaponAttribute UNewButton +---@field CanvasPanel_16 UCanvasPanel +---@field CanvasPanel_BossInfo UCanvasPanel +---@field CanvasPanel_Breach UCanvasPanel +---@field CanvasPanel_InteractButtons UCanvasPanel +---@field CanvasPanel_RemainTime_ReadyState UCanvasPanel +---@field InteractButton_Backpack UWBP_InteractButton_C +---@field InteractButton_BossInfo UWBP_InteractButton_C +---@field InteractButton_Breach UWBP_InteractButton_C +---@field InteractButton_Challenge UWBP_InteractButton_C +---@field InteractButton_Pickup UWBP_InteractButton_C +---@field InteractButton_SelectBoss UWBP_InteractButton_C +---@field InteractButton_Technology UWBP_InteractButton_C +---@field InteractButton_Unpacking UWBP_InteractButton_C +---@field Panel_Guide UCanvasPanel +---@field Panel_Team UWBP_TeamPanel_C +---@field TextBlock_AttackValue UTextBlock +---@field TextBlock_Difficult UTextBlock +---@field TextBlock_GameTime UTextBlock +---@field TextBlock_Level UTextBlock +---@field TextBlock_ReadyStateRemainTime UTextBlock +---@field WBP_PlayerInfo UWBP_PlayerInfo_C +---@field WBP_WeaponInfo UWBP_WeaponInfo_C +--Edit Below-- +local WBP_MainUI = { + bInitDoOnce = false, +}; + +WBP_MainUI.bStartTiming = false; +WBP_MainUI.Timing = 0. + +function WBP_MainUI:Construct() + WBP_MainUI.SuperClass.Construct(self) + self:InitUI() + self:BindEvents() + self:RegisterEvents() +end + +function WBP_MainUI:Destruct() + self:UnRegisterEvents() + self:UnBindEvents() + WBP_MainUI.SuperClass.Destruct(self) +end + +function WBP_MainUI:InitUI() + local GameState = UGCGameSystem.GameState + if not UE.IsValid(GameState) then + return + end + self:OnGameStageChange(GameState.GameStage) + self:OnWaitPlayerJoinTimeChange(GameState.WaitPlayerJoinTime) + + local LocalPlayerState = GameDataManager.GetLocalPlayerState() + self.PlayerKey = LocalPlayerState.PlayerKey + self:OnToggleBreachButton(LocalPlayerState:GetNeedShowBreachButton(), self.PlayerKey) + + self:OnPlayerLevelChange(UGCGameSystem.GameState:GetAllPlayerLevel()) + self:SetUserFocus(GameDataManager.GetLocalPlayerController()) + if LocalPlayerState.Attributes[AttributeType.Base] and LocalPlayerState.Attributes[AttributeType.Base].Base_Attack then + self:OnBaseAttackChanged(self.PlayerKey, LocalPlayerState.Attributes[AttributeType.Base].Base_Attack) + end + + self.InteractButton_SelectBoss.Button_Trigger.OnClicked:Add(WBP_MainUI.OnClickSelectBoss, self); + self.InteractButton_Backpack.Button_Trigger.OnClicked:Add(WBP_MainUI.OnClickBackpack, self); + self.InteractButton_Pickup.Button_Trigger.OnClicked:Add(WBP_MainUI.OnClickPickup, self); + self.InteractButton_Technology.Button_Trigger.OnClicked:Add(WBP_MainUI.OnClickTechnology, self); + self.InteractButton_Unpacking.Button_Trigger.OnClicked:Add(WBP_MainUI.OnClickUnpacking, self); + self.InteractButton_Challenge.Button_Trigger.OnClicked:Add(WBP_MainUI.OnClickChallenge, self); + self.InteractButton_BossInfo.Button_Trigger.OnClicked:Add(WBP_MainUI.OnClickBossInfo, self); + self.InteractButton_Breach.Button_Trigger.OnClicked:Add(WBP_MainUI.OnClickBreach, self); + self.Button_WeaponAttribute.OnClicked:Add(WBP_MainUI.OnClickWeaponAttribute, self) + self.Button_Save.OnClicked:Add(WBP_MainUI.OnClickSave, self) + self.Button_Attribute.OnClicked:Add(WBP_MainUI.OnAttributeClicked, self) + + self.HasTriggeredGuideChallenge = false + self.HasTriggeredGuideUnpacking = false + self.HasTriggeredGuideTechnology = false +end + +function WBP_MainUI:RegisterEvents() + self.Button_Guide.OnClicked:Add(WBP_MainUI.OnGuideClicked, self) + EventSystem:AddListener(EventType.OnWaitPlayerJoinTimeChanged, WBP_MainUI.OnWaitPlayerJoinTimeChange, self) + EventSystem:AddListener(EventType.OnGameStageChanged, WBP_MainUI.OnGameStageChange, self) + EventSystem:AddListener(EventType.ToggleBreachButton, WBP_MainUI.OnToggleBreachButton, self) + EventSystem:AddListener(EventType.OnPlayerBaseAttackValueChanged, WBP_MainUI.OnBaseAttackChanged, self) + EventSystem:AddListener(EventType.PlayerCoinPointChanged, WBP_MainUI.OnPlayerCoinPointChanged, self) + EventSystem:AddListener(EventType.PlayerKillPointChanged, WBP_MainUI.OnPlayerKillPointChanged, self) + EventSystem:AddListener(EventType.OnPlayerLevelChanged, WBP_MainUI.OnPlayerLevelChange, self) + EventSystem:AddListener(EventType.OnPlayerCombatPointChanged, WBP_MainUI.OnPlayerCombatPointChanged, self) + EventSystem:AddListener(EventType.OnGameDurationChanged, WBP_MainUI.OnGameDurationChanged, self) +end + +function WBP_MainUI:UnRegisterEvents() + self.Button_Guide.OnClicked:Remove(WBP_MainUI.OnGuideClicked, self) + EventSystem:RemoveListener(EventType.OnWaitPlayerJoinTimeChanged, WBP_MainUI.OnWaitPlayerJoinTimeChange, self) + EventSystem:RemoveListener(EventType.OnGameStageChanged, WBP_MainUI.OnGameStageChange, self) + EventSystem:RemoveListener(EventType.ToggleBreachButton, WBP_MainUI.OnToggleBreachButton, self) + EventSystem:RemoveListener(EventType.OnPlayerBaseAttackValueChanged, WBP_MainUI.OnBaseAttackChanged, self) + EventSystem:RemoveListener(EventType.PlayerCoinPointChanged, WBP_MainUI.OnPlayerCoinPointChanged, self) + EventSystem:RemoveListener(EventType.PlayerKillPointChanged, WBP_MainUI.OnPlayerKillPointChanged, self) + EventSystem:RemoveListener(EventType.OnPlayerLevelChanged, WBP_MainUI.OnPlayerLevelChange, self) + EventSystem:RemoveListener(EventType.OnPlayerCombatPointChanged, WBP_MainUI.OnPlayerCombatPointChanged, self) + EventSystem:RemoveListener(EventType.OnGameDurationChanged, WBP_MainUI.OnGameDurationChanged, self) +end + +function WBP_MainUI:BindEvents() +end + +function WBP_MainUI:UnBindEvents() +end + +function WBP_MainUI:OnWaitPlayerJoinTimeChange(RemainTime) + if RemainTime > 0 and UGCGameSystem.GameState.GameStage == EGameStage.WaitForPlayer then + self.CanvasPanel_RemainTime_ReadyState:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.TextBlock_ReadyStateRemainTime:SetText(tostring(RemainTime)) + else + self.CanvasPanel_RemainTime_ReadyState:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_MainUI:OnGameDurationChanged(GameDuration) + if self.bStartTiming then + local Minute = math.floor(GameDuration) // 60 + local Second = math.floor(GameDuration) % 60 + self.TextBlock_GameTime:SetText(string.format('游戏时长:%02d:%02d', Minute, Second)) + end +end + +function WBP_MainUI:OnGameStageChange(InGameStage) + -- 表示启动练功房 + if InGameStage == EGameStage.GameFight then + -- UIManager:ShowPanel(EUIType.GM) + + UIManager:ClosePanel(EUIType.SelectDifficulty) + UIManager:ClosePanel(EUIType.SelectSkill) + local GameDifficulty = UGCGameSystem.GameState.GameDifficulty + self.TextBlock_Difficult:SetText(string.format('难度:难%d', GameDifficulty)) + self.CanvasPanel_InteractButtons:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + + -- 设置强引导时的外观 + self:SetupForceGuideOutfit() + + -- 启动游戏时长 + self.bStartTiming = true; + self:OnGameDurationChanged(UGCGameSystem.GameState.GameDuration) + else + self.CanvasPanel_InteractButtons:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_MainUI:OnAttributeClicked() + if UIManager:IsVisiblePanel(EUIType.Attribute) then + UIManager:ClosePanel(EUIType.Attribute) + else + UIManager:ShowPanel(EUIType.Attribute) + end +end + +function WBP_MainUI:OnGuideClicked() + if UIManager:IsVisiblePanel(EUIType.GeneralGuide) then + UIManager:ClosePanel(EUIType.GeneralGuide) + else + UIManager:ShowPanel(EUIType.GeneralGuide) + end +end + +local ButtonTriggerColor = { + Normal = {R = 1.0, G = 1.0, B = 1.0, A = 1.0}, + Triggered = {R = 1, G = 0.12, B = 0.0, A = 1.0}, +} + +function WBP_MainUI:SetSelectBossIcon(IsAttackNearestMonster) + if IsAttackNearestMonster then + self.InteractButton_SelectBoss.Image_Icon:SetColorAndOpacity(ButtonTriggerColor.Normal) + else + self.InteractButton_SelectBoss.Image_Icon:SetColorAndOpacity(ButtonTriggerColor.Triggered) + end +end + +function WBP_MainUI:OnClickSelectBoss() + local Pawn = GameDataManager.GetLocalPlayerPawn() + if Pawn and UE.IsValid(Pawn) then + local WeaponComp = Pawn:GetWeaponComponent() + if WeaponComp and UE.IsValid(WeaponComp) then + WeaponComp.IsAttackNearestMonster = not WeaponComp.IsAttackNearestMonster + self:SetSelectBossIcon(WeaponComp.IsAttackNearestMonster) + end + end + NewPlayerGuideManager:RemoveGuide(29) +end + +function WBP_MainUI:OnClickBackpack() + if UIManager:IsVisiblePanel(EUIType.Backpack) then + UIManager:HidePanel(EUIType.UseSkill) + UIManager:HidePanel(EUIType.Backpack) + else + EventSystem:SendEvent(EventType.UpdateItemList, true) + UIManager:ShowPanel(EUIType.Backpack) + + NewPlayerGuideManager:RemoveGuide(20) + end +end + +function WBP_MainUI:OnClickPickup() + local PC = GameDataManager.GetLocalPlayerController() + if not UE.IsValid(PC) then + return + end + PC:RequestPickupNearbyItems(true) + NewPlayerGuideManager:RemoveGuide(19) + NewPlayerGuideManager:TriggerGuide(20) +end + +function WBP_MainUI:OnClickTechnology() + self:OpenPanel(EUIType.Tech) +end + +function WBP_MainUI:OnClickUnpacking() + self:OpenPanel(EUIType.Unpacking) +end + +function WBP_MainUI:OnClickChallenge() + self:OpenPanel(EUIType.Challenge) +end + +function WBP_MainUI:OnClickBossInfo() + self:OpenPanel(EUIType.BossInfo) +end + +function WBP_MainUI:OnClickWeaponAttribute() + self:OpenPanel(EUIType.WeaponAttribute) +end + +function WBP_MainUI:OnClickSave() + self:OpenPanel(EUIType.SaveGame) +end + +function WBP_MainUI:OnClickBreach() + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_OnBreach", PC.PlayerKey) +end + +function WBP_MainUI:OnToggleBreachButton(Toggle, InPlayerKey) + if self.PlayerKey ~= InPlayerKey then + return + end + if Toggle then + self.CanvasPanel_Breach:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + NewPlayerGuideManager:TriggerGuide(4) + else + self.CanvasPanel_Breach:SetVisibility(ESlateVisibility.Collapsed) + UIManager:HidePanel(EUIType.SelectWeapon) + NewPlayerGuideManager:RemoveGuide(4) + end +end + +function WBP_MainUI:OnBaseAttackChanged(InPlayerKey, BaseAttack) + if self.PlayerKey == InPlayerKey then + BaseAttack = math.ceil(BaseAttack) + self.TextBlock_AttackValue:SetText(string.format("威力值:%d", BaseAttack)) + end +end + + +function WBP_MainUI:TryTriggerInteractGuide(ConfigID, TriggerName) + if NewPlayerGuideManager:IsGuideExisted(ConfigID) then + return false + end + + local ButtonIndex = -1 + local GuideHandleName = "" + local ToggleHandleName = "" + + if ConfigID <= 11 then + ButtonIndex = 1 + GuideHandleName = "InteractExpandHandle1" + ToggleHandleName = "ToggleHandle1" + else + ButtonIndex = 2 + GuideHandleName = "InteractExpandHandle2" + ToggleHandleName = "ToggleHandle2" + end + + if self.InteractExpandHandle1 ~= nil then + EventSystem.StopTimer(self.InteractExpandHandle1) + self.InteractExpandHandle1 = nil + end + if self.InteractExpandHandle2 ~= nil then + EventSystem.StopTimer(self.InteractExpandHandle2) + self.InteractExpandHandle2 = nil + end + + self[GuideHandleName] = EventSystem.SetTimer(self, function() + NewPlayerGuideManager:TriggerGuide(ConfigID) + self[GuideHandleName] = nil + end, 0.26) + + local Duration = NewPlayerGuideManager:GetGuideDuration(ConfigID) + if Duration > 0.1 then + self[ToggleHandleName] = EventSystem.SetTimer(self, function() + self[TriggerName] = false + self[ToggleHandleName] = nil + end, Duration) + end + + return true +end + +function WBP_MainUI:OnPlayerCoinPointChanged(CoinPoint) + if CoinPoint > 3500 and NewPlayerGuideManager:HasGuideMaxTriggered(11) == false then + NewPlayerGuideManager:TriggerGuide(11) + end +end + +function WBP_MainUI:OnPlayerKillPointChanged(KillPoint) + if self.MaxKillPoint == nil then + self.MaxKillPoint = 0 + end + + KillPoint = math.ceil(KillPoint) + if KillPoint >= self.MaxKillPoint then + self.MaxKillPoint = KillPoint + else + return + end + + if self.MaxKillPoint >= 10 then + if self.MaxKillPoint % 10 < 10 and self.HasTriggeredGuideTechnology == false and NewPlayerGuideManager:HasGuideMaxTriggered(10) == false then + self.HasTriggeredGuideTechnology = self:TryTriggerInteractGuide(10, "HasTriggeredGuideTechnology") + end + end +end + +function WBP_MainUI:OnPlayerLevelChange(InAllPlayerLevel) + for PlayerKey, Level in pairs(InAllPlayerLevel) do + if self.PlayerKey == PlayerKey then + self.TextBlock_Level:SetText(string.format("Lv.%d", Level)) + break + end + end +end + +function WBP_MainUI:OnPlayerCombatPointChanged(InAllCombatPoint) + for PlayerKey, CombatPoint in pairs(InAllCombatPoint) do + if PlayerKey == self.PlayerKey then + local Val = CombatPoint - 7082 + CombatPoint = math.clamp(Val, 0, CombatPoint) + + if CombatPoint > 205 and self.HasTriggeredGuideChallenge == false and NewPlayerGuideManager:HasGuideMaxTriggered(13) == false then + self.HasTriggeredGuideChallenge = self:TryTriggerInteractGuide(13, "HasTriggeredGuideChallenge") + end + return + end + end +end + +function WBP_MainUI:OpenPanel(InUIType) + if UIManager:IsVisiblePanel(InUIType) then + UIManager:ClosePanel(InUIType) + else + UIManager:ShowPanel(InUIType) + end +end + +function WBP_MainUI:SetupForceGuideOutfit() + local PS = GameDataManager.GetLocalPlayerState() + if PS and PS:GetNeedTriggerForceGuide() then + local ValidStepIndex = PS.ForceGuideInfo.ValidStepIndex + if ValidStepIndex == nil then + return + end + + self.InteractButton_Technology:SetVisibility(ESlateVisibility.Collapsed) + self.CanvasPanel_BossInfo:SetVisibility(ESlateVisibility.Collapsed) + self.InteractButton_Unpacking:SetVisibility(ESlateVisibility.Collapsed) + self.CanvasPanel_Breach:SetVisibility(ESlateVisibility.Collapsed) + self.InteractButton_SelectBoss:SetVisibility(ESlateVisibility.Collapsed) + self.InteractButton_Pickup:SetVisibility(ESlateVisibility.Collapsed) + self.InteractButton_Backpack:SetVisibility(ESlateVisibility.Collapsed) + self.InteractButton_Challenge:SetVisibility(ESlateVisibility.Collapsed) + + if ValidStepIndex >= 1 then + self.InteractButton_Technology:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + if ValidStepIndex >= 2 then + self.CanvasPanel_BossInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + if ValidStepIndex >= 3 then + self.InteractButton_Unpacking:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + if ValidStepIndex >= 4 then + local PS = GameDataManager.GetLocalPlayerState() + if PS then + self:OnToggleBreachButton(PS:GetNeedShowBreachButton(), PS.PlayerKey) + end + end + if ValidStepIndex >= 5 then + self.InteractButton_SelectBoss:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + if ValidStepIndex >= 6 then + self.InteractButton_Pickup:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + if ValidStepIndex >= 7 then + self.InteractButton_Backpack:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + if ValidStepIndex >= 8 then + self.InteractButton_Challenge:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + end +end + +return WBP_MainUI; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_NoticeLayer.lua b/GZJ/Script/UI/WBP_NoticeLayer.lua new file mode 100644 index 00000000..b39cadd5 --- /dev/null +++ b/GZJ/Script/UI/WBP_NoticeLayer.lua @@ -0,0 +1,261 @@ +---@class WBP_NoticeLayer_C:UUserWidget +---@field AttackWaveNoticePanel UCanvasPanel +---@field AttackWaveRemainTimeNoticePanel UCanvasPanel +---@field CountDownNoticePanel UCanvasPanel +---@field GeneralNoticePanel UCanvasPanel +---@field InitialNoticePanel UCanvasPanel +---@field Notice_AttackWave UWBP_AttackWaveNotice_C +---@field Notice_AttackWaveRemainTime UWBP_AttackWaveRemainTimeNotice_C +---@field Notice_CountDown UWBP_CountDownNotice_C +---@field Notice_General UWBP_GlobalNotice_C +---@field Notice_Initial UWBP_InitialNotice_C +---@field Notice_Respawn UWBP_RespawnNotice_C +---@field Notice_Rolling UWBP_RollingNoticePanel_C +---@field Notice_Warning UWBP_WarningFrameNotice_C +---@field RespawnNoticePanel UCanvasPanel +---@field RollingNoticePanel UCanvasPanel +---@field WarningNoticePanel UCanvasPanel +--Edit Below-- +local WBP_NoticeLayer = { + bInitDoOnce = false, + NoticeMap = {}, + NoticeWidgets = {}, +}; + +function WBP_NoticeLayer:Construct() + self.NoticeWidgets = { + [ECustomNoticeType.AttackWaveNotice] = self.Notice_AttackWave, + [ECustomNoticeType.AttackWaveRemainTimeNotice] = self.Notice_AttackWaveRemainTime, + [ECustomNoticeType.GeneralNotice] = self.Notice_General, + [ECustomNoticeType.RespawnNotice] = self.Notice_Respawn, + [ECustomNoticeType.InitialNotice] = self.Notice_Initial, + [ECustomNoticeType.CountDownNotice] = self.Notice_CountDown, + [ECustomNoticeType.GlobalWarningNotice] = self.Notice_Warning, + } + self.NoticeMap = { + [ECustomNoticeType.AttackWaveNotice] = {}, + [ECustomNoticeType.AttackWaveRemainTimeNotice] = {}, + [ECustomNoticeType.GeneralNotice] = {}, + [ECustomNoticeType.RespawnNotice] = {}, + [ECustomNoticeType.InitialNotice] = {}, + [ECustomNoticeType.CountDownNotice] = {}, + [ECustomNoticeType.GlobalWarningNotice] = {}, + } + + for _, NoticeWidget in pairs(self.NoticeWidgets) do + NoticeWidget:SetVisibility(ESlateVisibility.Collapsed) + end + + EventSystem:AddListener(EventType.OnGameStageChanged, WBP_NoticeLayer.OnGameStageChange, self) + + self:OnGameStageChange(UGCGameSystem.GameState.GameStage) + + self.bCanEverTick = true +end + +function WBP_NoticeLayer:Destruct() + self.bCanEverTick = false + self.NoticeWidgets = nil + self.NoticeMap = nil + EventSystem:RemoveListener(EventType.OnGameStageChanged, WBP_NoticeLayer.OnGameStageChange, self) +end + +function WBP_NoticeLayer:Tick(MyGeometry, InDeltaTime) + for NoticeType, NoticeDataList in pairs(self.NoticeMap) do + if table.getCount(NoticeDataList) > 0 then + local NoticeData = NoticeDataList[1] + NoticeData.Duration = NoticeData.Duration + InDeltaTime + if NoticeData.Duration >= NoticeData.ShowTime then + self:DefaultCloseNotice(NoticeData) + table.remove(NoticeDataList, 1) + if table.getCount(NoticeDataList) > 0 then + local NextIndex, NextValue = next(NoticeDataList) + if NextIndex ~= nil and NextValue ~= nil then + self:CreateNewNotice(NextValue) + end + end + end + end + end +end + +function WBP_NoticeLayer:OnGameStageChange(GameStage) + if GameStage ~= EGameStage.WaitForPlayer then + self.InitialNoticePanel:SetVisibility(ESlateVisibility.Collapsed) + else + self.InitialNoticePanel:SetVisibility(ESlateVisibility.HitTestInvisible) + end +end + +function WBP_NoticeLayer:InitFromParam(NoticeType, ...) + self:ShowNotice(NoticeType, ...) +end + +function WBP_NoticeLayer:ShowNotice(NoticeType, ...) + if select("#", ...) <= 0 then + return + end + + local NoticeShowTime = 2.0 + + local Params = {} + local InParam = {...} + + if NoticeType == ECustomNoticeType.GeneralNotice then + for _, value in ipairs(InParam) do + local ValueType = type(value) + if ValueType == "string" then + if Params["Txt"] == nil then + Params["Txt"] = {} + end + table.insert(Params["Txt"], value) + elseif ValueType == "boolean" then + Params["ShowAlert"] = value + elseif ValueType == "number" then + NoticeShowTime = value + end + end + elseif NoticeType == ECustomNoticeType.RollingNotice then + self.Notice_Rolling:OnReceiveRollingNoticeData(...) + return + elseif NoticeType == ECustomNoticeType.RespawnNotice then + Params["Time"] = InParam[1] + NoticeShowTime = tonumber(InParam[1]) + 0.5 + elseif NoticeType == ECustomNoticeType.AttackWaveNotice then + Params["CurWave"] = InParam[1] + Params["TotalWave"] = InParam[2] + NoticeShowTime = 500.0 + elseif NoticeType == ECustomNoticeType.AttackWaveRemainTimeNotice then + Params["RemainTime"] = InParam[1] + elseif NoticeType == ECustomNoticeType.InitialNotice then + if UGCGameSystem.GameState.GameStage == EGameStage.WaitForPlayer then + local WaitForPlayerRemainTime = UGCGameSystem.GameState.WaitPlayerJoinTime + if WaitForPlayerRemainTime > 0.5 then + NoticeShowTime = WaitForPlayerRemainTime - 0.5 + else + return + end + else + NoticeShowTime = 0.1 + end + elseif NoticeType == ECustomNoticeType.CountDownNotice then + for _, value in ipairs(InParam) do + local ValueType = type(value) + if ValueType == "string" then + Params["Txt"] = value + elseif ValueType == "number" then + Params["Time"] = value + NoticeShowTime = tonumber(value) + 0.5 + elseif ValueType == "boolean" then + Params["ShowAlert"] = value + end + end + elseif NoticeType == ECustomNoticeType.GlobalWarningNotice then + local InNoticeShowTime = -1.0 + for _, value in ipairs(InParam) do + local ValueType = type(value) + if ValueType == "string" then + Params["Txt"] = value + elseif ValueType == "number" then + InNoticeShowTime = tonumber(value) + 0.5 + elseif ValueType == "boolean" then + Params["NeedFrame"] = value + end + end + NoticeShowTime = InNoticeShowTime > 0 and InNoticeShowTime or 5.0 + end + + local NoticeData = { + Type = NoticeType, + ShowTime = NoticeShowTime, + Duration = 0, + Params = Params, + } + self:ShowGameNotice(NoticeData) +end + +function WBP_NoticeLayer:ShowGameNotice(InNoticeData) + local NoticeList = self.NoticeMap[InNoticeData.Type] + local NoticeWidget = self.NoticeWidgets[InNoticeData.Type] + if table.getCount(NoticeList) > 0 then + local NoticeNow = NoticeList[1] + if UE.IsValid(NoticeWidget) and NoticeNow.Type == InNoticeData.Type then + if NoticeNow.Type == ECustomNoticeType.GeneralNotice then + if self:HasSameGeneralNotice(InNoticeData) then + return + end + local NoticeNowRemainTime = NoticeNow.ShowTime - NoticeNow.Duration + if InNoticeData.ShowTime - NoticeNowRemainTime > 2.0 then + InNoticeData.ShowTime = InNoticeData.ShowTime - NoticeNowRemainTime + end + table.insert(self.NoticeMap[InNoticeData.Type], InNoticeData) + else + NoticeNow.Duration = 0.0 + NoticeNow.ShowTime = InNoticeData.ShowTime + NoticeNow.Params = InNoticeData.Params + NoticeWidget:InitNoticeFromParam(InNoticeData.Params) + end + else + self:DefaultCloseNotice(InNoticeData) + self.NoticeMap[InNoticeData.Type] = {} + end + else + table.insert(self.NoticeMap[InNoticeData.Type], InNoticeData) + self:CreateNewNotice(InNoticeData) + end +end + +function WBP_NoticeLayer:CreateNewNotice(NoticeData) + local NoticeType = NoticeData.Type + local NoticeWidget = self.NoticeWidgets[NoticeType] + NoticeWidget:InitNoticeFromParam(NoticeData.Params) + NoticeWidget:ShowEnterAnimation() + return NoticeWidget +end + +function WBP_NoticeLayer:DefaultCloseNotice(InNoticeData) + local NoticeWidget = self.NoticeWidgets[InNoticeData.Type] + if UE.IsValid(NoticeWidget) then + NoticeWidget:DefaultClose() + end +end + +function WBP_NoticeLayer:HasSameGeneralNotice(InNoticeData) + local CurNoticeTextType = type(InNoticeData.Params.Txt) + local CurNoticeText = InNoticeData.Params.Txt + for _, NoticeData in pairs(self.NoticeMap[InNoticeData.Type]) do + local PreNoticeText = NoticeData.Params.Txt + if type(PreNoticeText) == CurNoticeTextType then + if CurNoticeTextType == 'string' then + if CurNoticeText == PreNoticeText then + return true + end + else + if table.getCount(CurNoticeText) > 0 and table.getCount(CurNoticeText) == table.getCount(PreNoticeText) then + local NoticeTextStr1 = "" + local NoticeTextStr2 = "" + for i = 1 , table.getCount(CurNoticeText) do + NoticeTextStr1 = NoticeTextStr1..CurNoticeText[i] + NoticeTextStr2 = NoticeTextStr2..PreNoticeText[i] + end + if NoticeTextStr1 == NoticeTextStr2 then + return true + end + end + end + end + end + return false +end + +function WBP_NoticeLayer:CloseRemainGeneralNotice() + self.bCanEverTick = false + + for NoticeType, Widget in pairs(self.NoticeWidgets) do + if NoticeType ~= ECustomNoticeType.GeneralNotice then + Widget:SetVisibility(ESlateVisibility.Collapsed) + end + end +end + +return WBP_NoticeLayer; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_PlayerAvatar.lua b/GZJ/Script/UI/WBP_PlayerAvatar.lua new file mode 100644 index 00000000..18497774 --- /dev/null +++ b/GZJ/Script/UI/WBP_PlayerAvatar.lua @@ -0,0 +1,19 @@ +---@class WBP_PlayerAvatar_C:Common_Avatar_BP_C +--Edit Below-- +local WBP_PlayerAvatar = { bInitDoOnce = false; }; + +--[==[ Construct +function WBP_PlayerAvatar:Construct() + +end +-- Construct ]==] + +-- function WBP_PlayerAvatar:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_PlayerAvatar:Destruct() + +-- end + +return WBP_PlayerAvatar; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_ResourceGrade.lua b/GZJ/Script/UI/WBP_ResourceGrade.lua new file mode 100644 index 00000000..09234562 --- /dev/null +++ b/GZJ/Script/UI/WBP_ResourceGrade.lua @@ -0,0 +1,140 @@ +---@class WBP_ResourceGrade_C:UUserWidget +---@field Button_Select_1 UButton +---@field Button_Select_2 UButton +---@field Button_Select_3 UButton +---@field Button_Select_4 UButton +---@field Image_Select_1 UImage +---@field Image_Select_2 UImage +---@field Image_Select_3 UImage +---@field Image_Select_4 UImage +---@field Panel_BG UWBP_WidgetHeader_C +---@field TextBlock_MidAttack UTextBlock +---@field TextBlock_MidHealth UTextBlock +---@field TextBlock_Select_1 UTextBlock +---@field TextBlock_Select_2 UTextBlock +---@field TextBlock_Select_3 UTextBlock +---@field TextBlock_Select_4 UTextBlock +---@field TextBlock_SeniorAttack UTextBlock +---@field TextBlock_SeniorHealth UTextBlock +---@field TextBlock_SuperAttack UTextBlock +---@field TextBlock_SuperHealth UTextBlock +--Edit Below-- +local WBP_ResourceGrade = { + bInitDoOnce = false, + ButtonList = {}, + ImageList = {}, + TextBlockList = {}, + -- AttackTimer = nil; +}; + +function WBP_ResourceGrade:Construct() + self.Panel_BG:Construct() + + for i = 1, 4 do + local IndexStr = tostring(i) + self.ButtonList[i] = self["Button_Select_"..IndexStr] + self.ImageList[i] = self["Image_Select_"..IndexStr] + self.TextBlockList[i] = self["TextBlock_Select_"..IndexStr] + + self.ButtonList[i].OnClicked:Add(function() + self:RequestChangeResourceGrade(i) + end, self) + end + + self:SetRecommend() + EventSystem:AddListener(EventType.OnResourceGradeChanged, WBP_ResourceGrade.OnResourceGradeChanged, self) +end + +function WBP_ResourceGrade:SetRecommend() + local ResourceTable = { + [EQualityType.Primary] = { Health = "0", Attack = "0", Recommend = 0, }, + [EQualityType.Middle] = { Health = '1w', Attack = "2000", Recommend = 0, }, + [EQualityType.Senior] = { Health = "4w", Attack = '8000', Recommend = 0, }, + [EQualityType.Super] = { Health = "10w", Attack = "1.3w", Recommend = 0, }, + } + self.TextBlock_MidHealth:SetText('生命值:'.. ResourceTable[EQualityType.Middle].Health) + self.TextBlock_MidAttack:SetText('威力值:'.. ResourceTable[EQualityType.Middle].Attack) + self.TextBlock_SeniorHealth:SetText('生命值:'.. ResourceTable[EQualityType.Senior].Health) + self.TextBlock_SeniorAttack:SetText('威力值:'.. ResourceTable[EQualityType.Senior].Attack) + self.TextBlock_SuperHealth:SetText('生命值:'.. ResourceTable[EQualityType.Super].Health) + self.TextBlock_SuperAttack:SetText('威力值:'.. ResourceTable[EQualityType.Super].Attack) +end + +function WBP_ResourceGrade:Destruct() + EventSystem:RemoveListener(EventType.OnResourceGradeChanged, WBP_ResourceGrade.OnResourceGradeChanged, self) + self.ButtonList = {} + self.ImageList = {} + self.TextBlockList = {} +end + +function WBP_ResourceGrade:OnShowPanel() + local PC = GameDataManager.GetLocalPlayerController() + local CurResourceGrade = PC.ResourceGrade + self:OnResourceGradeChanged(CurResourceGrade) + + --if self.AttackTimer == nil then + -- self.AttackTimer = EventSystem.SetTimerLoop(self, function() + -- self:SetButtonEnable() + -- end, 0.5) + -- + -- NewPlayerGuideManager:RemoveGuide(12) + --end +end + +function WBP_ResourceGrade:OnClosePanel() + --if self.AttackTimer ~= nil then + -- EventSystem.StopTimer(self.AttackTimer) + --end +end + +function WBP_ResourceGrade:OnResourceGradeChanged(InResourceGrade) + if type(InResourceGrade) ~= 'number' or InResourceGrade < 1 or InResourceGrade > 4 then + return + end + for index, TextBlock in pairs(self.TextBlockList) do + if index == InResourceGrade then + TextBlock:SetText("当前选择") + self.ImageList[index]:SetVisibility(ESlateVisibility.HitTestInvisible) + else + TextBlock:SetText("待选择") + self.ImageList[index]:SetVisibility(ESlateVisibility.Collapsed) + end + end +end + +function WBP_ResourceGrade:RequestChangeResourceGrade(PendingGrade) + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + if PC.ResourceGrade == PendingGrade then + return + end + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_SetResourceGrade", PendingGrade) +end + +ResourceRecommendTable = { + 0, 2000, 6000, 11000 +} + +function WBP_ResourceGrade:SetButtonEnable() + -- 获取威力值 + print(string.format('[WBP_ResourceGrade:SetButtonEnable] 执行')) + local PS = GameDataManager.GetLocalPlayerState(); + local Attack = 0 + for i, v in pairs(PS.Attributes) do + Attack = Attack + v.Base_Attack + end + + print(string.format('[WBP_ResourceGrade:SetButtonEnable] Attack = ' .. tostring(Attack))) + for i = 1, 4 do + local IsTrue = Attack >= ResourceRecommendTable[i] + print(string.format('[WBP_ResourceGrade:SetButtonEnable] IsTrue = ' .. tostring(IsTrue))) + self.ButtonList[i]:SetIsEnabled(IsTrue) + -- 再将颜色设置为不正常的颜色 + if IsTrue then + self.ButtonList[i]:SetColorAndOpacity({ R = 0.5, G = 0.5, B = 0.5, A = 0.8}) + else + self.ButtonList[i]:SetColorAndOpacity({ R = 0, G = 0, B = 0, A = 0}) + end + end +end + +return WBP_ResourceGrade; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SaveGamePanel.lua b/GZJ/Script/UI/WBP_SaveGamePanel.lua new file mode 100644 index 00000000..d5735f77 --- /dev/null +++ b/GZJ/Script/UI/WBP_SaveGamePanel.lua @@ -0,0 +1,502 @@ +---@class WBP_SaveGamePanel_C:UUserWidget +---@field Category_Item_1 UWBP_SaveGame_Category_Item_C +---@field Category_Item_2 UWBP_SaveGame_Category_Item_C +---@field Category_Item_3 UWBP_SaveGame_Category_Item_C +---@field Category_Item_4 UWBP_SaveGame_Category_Item_C +---@field Category_Item_5 UWBP_SaveGame_Category_Item_C +---@field Category_Item_6 UWBP_SaveGame_Category_Item_C +---@field Image_CurAchievement_Icon UImage +---@field Panel_AchievementInfo UCanvasPanel +---@field Panel_BG UWBP_WidgetHeader_C +---@field ScrollBox_Achievements UScrollBox +---@field TextBlock_CurAchievement_Condition UTextBlock +---@field TextBlock_CurAchievement_Desc UTextBlock +---@field TextBlock_CurAchievement_State UTextBlock +---@field WrapBox_Achievements UWrapBox +--Edit Below-- +require("Script.Global.SaveGameConfigs") +local WBP_SaveGamePanel = { + bInitDoOnce = false, + CategoryButtons = {}, + + AchievementInfoList = {}, + AchievementItems = {}, + + CurCategoryIndex = -1, + + ArchiveTable = nil, + OwnerArchiveData = nil, +}; + +function WBP_SaveGamePanel:Construct() + self.Panel_BG:Construct() + + for i = 1, 6 do + self.CategoryButtons[i] = self["Category_Item_"..tostring(i)] + self.CategoryButtons[i].OwnerPanel = self + end + self.ItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_SaveGame_Achievement_Item.WBP_SaveGame_Achievement_Item_C')) + + self.WrapBox_Achievements:ClearChildren() + self.AchievementItems = {} +end + +function WBP_SaveGamePanel:Destruct() + self.CategoryButtons = {} +end + +function WBP_SaveGamePanel:OnShowPanel() + if self.ArchiveTable == nil then + self.ArchiveTable = require('Script.Global.ArchiveTable') + end + self.OwnerArchiveData = GameDataManager.GetLocalPlayerState().ArchiveData + table.print("[WBP_SaveGamePanel][OnShowPanel] OwnerArchiveData", self.OwnerArchiveData) + log_tree("OwnerArchiveData ", self.OwnerArchiveData) + if self.CurCategoryIndex < 0 then + self.CurCategoryIndex = 1 + end + self:OnCurCategoryChanged(self.CurCategoryIndex) + + NewPlayerGuideManager:RemoveGuide(31) +end + +function WBP_SaveGamePanel:OnCurCategoryChanged(InCategory) + if self.OwnerArchiveData == nil then + return + end + + self.CurCategoryIndex = InCategory + for i = 1, 6 do + if i ~= InCategory then + self.CategoryButtons[i]:SetIsSelected(false) + else + self.CategoryButtons[i]:SetIsSelected(true) + end + end + + self:SetCurAchievementItems(InCategory) + + if not table.isEmpty(self.AchievementItems) then + self.Panel_AchievementInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.ScrollBox_Achievements:ScrollToStart() --滚动框滑到顶 + self:OnCurAchievementChanged(self.AchievementItems[1]) --默认选取第一个成就 + else + self.Panel_AchievementInfo:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_SaveGamePanel:OnCurAchievementChanged(InAchievementItem) + for _, Item in pairs(self.AchievementItems) do + if Item == InAchievementItem then + Item:SetAchievementIsSelected(true) + else + Item:SetAchievementIsSelected(false) + end + end + + --Icon + local Info = InAchievementItem.Info + if Info.HasGained then + self.TextBlock_CurAchievement_State:SetColorAndOpacity({SpecifiedColor={R=1,G=0.258763,B=0.029837,A=1},ColorUseRule=0}) + self.TextBlock_CurAchievement_State:SetText("已获得") + else + self.TextBlock_CurAchievement_State:SetColorAndOpacity({SpecifiedColor={R=0.015625,G=0.015625,B=0.015625,A=1},ColorUseRule=0}) + self.TextBlock_CurAchievement_State:SetText("未获得") + end + + self.TextBlock_CurAchievement_Condition:SetText(Info.Condition) + self.TextBlock_CurAchievement_Desc:SetText(Info.Desc) + UIManager.LoadTexture(self.Image_CurAchievement_Icon, Info.Icon) +end + +function WBP_SaveGamePanel:SetCurAchievementItems(Index) + if self.AchievementInfoList[Index] == nil then + if Index == 1 then + self.AchievementInfoList[Index] = self:SetGameClearanceAchievements() + elseif Index == 2 then + self.AchievementInfoList[Index] = self:SetScoreAchievements() + elseif Index == 3 then + self.AchievementInfoList[Index] = self:SetEasterEggAchievements() + elseif Index == 4 then + self.AchievementInfoList[Index] = self:SetDropItemAchievements() + elseif Index == 5 then + self.AchievementInfoList[Index] = self:SetGameAchievements() + elseif Index == 6 then --商店类,暂无 + self.AchievementInfoList[Index] = {} + end + end + self:SetupAchievementItems(self.AchievementInfoList[Index]) +end + +function WBP_SaveGamePanel:SetGameClearanceAchievements() + local PlayedGames = self.OwnerArchiveData.PlayedGames + local AchievementList = {} + + local IconPath = SaveGameConfigs.Icons.GameClearance + + local GameClearanceRewards = self.ArchiveTable.GameClearanceRewards + + for GameDifficulty, RewardInfo in pairs(GameClearanceRewards) do + local DifficultyStr = "难"..tostring(GameDifficulty) + local PlayedTimes = PlayedGames[GameDifficulty] + for ConditionTimes, Info in pairs(RewardInfo) do + local AchievementData = { + HasGained = false, + ConditionTimes = ConditionTimes, + Difficulty = GameDifficulty, + Icon = IconPath, + Num = DifficultyStr, + Condition = string.format("%s难度通关%d次以上", DifficultyStr, ConditionTimes), + Desc = self:ParseRewardDesc(Info), + } + if PlayedTimes and PlayedTimes >= ConditionTimes then + AchievementData.HasGained = true + end + table.insert(AchievementList, AchievementData) + end + end + table.sort(AchievementList, function(a, b) + if a.HasGained == true and b.HasGained == false then + return true + elseif a.HasGained == b.HasGained then + if a.Difficulty < b.Difficulty then + return true + elseif a.Difficulty == b.Difficulty then + return a.ConditionTimes < b.ConditionTimes + end + return false + end + return false + end) + return AchievementList +end + +function WBP_SaveGamePanel:SetScoreAchievements() + local AchievementList = {} + local PlayerScore = self.OwnerArchiveData.Score + --local RewardTable = self.ArchiveTable.CreditRewards + for Index, RewardInfo in pairs(ArchiveTable.CreditRewards) do + local AchievementData = { + HasGained = false, + Icon = SaveGameConfigs.Icons.Score, + Num = RewardInfo.Reach, + Condition = string.format("积分达到%d以上", RewardInfo.Reach), + Desc = self:ParseRewardDesc(RewardInfo.Reward), + } + if PlayerScore >= RewardInfo.Reach then + AchievementData.HasGained = true + end + table.insert(AchievementList, AchievementData) + end + table.sort(AchievementList, function(a, b) + if a.Num < b.Num then + if a.HasGained == true and b.HasGained == false then + return true + elseif a.HasGained == false and b.HasGained == true then + return false + end + return true + end + return false + end) + return AchievementList +end + +function WBP_SaveGamePanel:SetEasterEggAchievements() + local AchievementList = {} + local PlayerEasterEggs = self.OwnerArchiveData.EasterEggs + local RewardTable = self.ArchiveTable.EasterEggs + for k, v in pairs(PlayerEasterEggs) do + local RewardInfo = RewardTable[k] + if RewardInfo == nil then + UE.Log("[WBP_SaveGamePanel][SetEasterEggAchievements] Can't Find RewardInfo") + else + local AchievementData = { + HasGained = false, + Index = k, + Icon = SaveGameConfigs.Icons.EasterEggs[k], + Num = RewardInfo.Name, + Condition = RewardInfo.Condition, + Desc = self:ParseRewardDesc(RewardInfo.Reward), + } + if v.Active == true then + AchievementData.HasGained = true + end + table.insert(AchievementList, AchievementData) + end + end + table.sort(AchievementList, function(a, b) + if a.HasGained == true and b.HasGained == false then + return true + elseif a.HasGained == b.HasGained then + if a.Index < b.Index then + if a.HasGained == true and b.HasGained == false then + return true + elseif a.HasGained == false and b.HasGained == true then + return false + end + return true + end + return false + end + return false + end) + return AchievementList +end + +function WBP_SaveGamePanel:SetDropItemAchievements() + local AchievementList = {} + local PlayerBossDropItems = self.OwnerArchiveData.BossDropItems + local PlayerGameDropItems = self.OwnerArchiveData.GameDropItems + local BossDropItemName = {'武器','盔甲','腿铠','足屐','套装',} + local GameDropItemName = {'握把','枪口','弹夹','枪托','瞄准镜'} + --local RewardTable1 = self.ArchiveTable.BossDropItems + --local RewardTable2 = self.ArchiveTable.DropGameItems + + for BossName, RewardInfo in pairs(self.ArchiveTable.BossDropItems) do + for Type, Data in pairs(RewardInfo) do + local AchievementData = { + HasGained = false, + Icon = SaveGameConfigs.Icons.BossDropItems[BossName][Type], + Num = string.format("%s之%s", BossName, BossDropItemName[Type]), + Condition = "", + Desc = "", + BossName = BossName, + AchievementType = 2, + ItemType = Type, + } + local CurPlayerDropData = PlayerBossDropItems[BossName] + if Type <= 4 then + if CurPlayerDropData and CurPlayerDropData[Type] and CurPlayerDropData[Type] > 0 then + AchievementData.HasGained = true + AchievementData.Desc = self:ParseRewardDescWithTable(Data.Rewards, CurPlayerDropData[Type]) + else + AchievementData.Desc = self:ParseRewardDescWithTable(Data.Rewards, 1) + end + else + AchievementData.Desc = self:ParseRewardDescWithTable(Data.Rewards, 1) + if table.getCount(CurPlayerDropData) >= 4 and CurPlayerDropData[1] ~= nil then + AchievementData.HasGained = true + end + end + table.insert(AchievementList, AchievementData) + end + end + + -- 读取碎片 + local ChipCount = 0 + for GameDifficulty, Data in pairs(PlayerGameDropItems) do + for Type, Count in pairs(Data) do + if Type == 6 then + ChipCount = ChipCount + Count*GameDifficulty + end + end + end + local WeaponPartName = '碎片' + local ChipAchievementData = { + HasGained = false, + Icon = SaveGameConfigs.Icons.GameDropItems[WeaponPartName], + Num = "", + Condition = "", + Desc = "", + AchievementType = 0, + ItemType = 0, + } + if ChipCount > 0 then + ChipAchievementData.HasGained = true + ChipAchievementData.Num = string.format("碎片*%d", ChipCount) + ChipAchievementData.Desc = self:ParseRewardDescWithTable(self.ArchiveTable.DropGameItems[WeaponPartName], ChipCount) + else + ChipAchievementData.Num = string.format("碎片*%d", 0) + ChipAchievementData.Desc = self:ParseRewardDescWithTable(self.ArchiveTable.DropGameItems[WeaponPartName], 1) + end + table.insert(AchievementList, ChipAchievementData) + + for Difficulty = 1, 66 do + for Type = 1, 5 do + local WeaponPartName = GameDropItemName[Type] + local AchievementData = { + HasGained = false, + Icon = SaveGameConfigs.Icons.GameDropItems[WeaponPartName], + Num = string.format("难%d %s", Difficulty, WeaponPartName), + Condition = "", + Desc = self:ParseRewardDesc(self.ArchiveTable.DropGameItems[WeaponPartName]), + Difficulty = Difficulty, + AchievementType = 1, + ItemType = Type, + } + local GameDropData = PlayerGameDropItems[Difficulty] + if GameDropData and GameDropData[Type] then + AchievementData.HasGained = true + end + table.insert(AchievementList, AchievementData) + end + if PlayerGameDropItems[Difficulty] and table.getCount(PlayerGameDropItems[Difficulty]) >= 5 and PlayerGameDropItems[Difficulty][1] ~= nil then + local WeaponPartName = '套装' + local AchievementData = { + HasGained = true, + Icon = SaveGameConfigs.Icons.GameDropItems[WeaponPartName], + Num = string.format("难%d %s", Difficulty, WeaponPartName), + Condition = "", + Desc = self:ParseRewardDescWithTable(self.ArchiveTable.DropGameItems[WeaponPartName], 1), + Difficulty = Difficulty, + AchievementType = 1, + ItemType = 6, + } + table.insert(AchievementList, AchievementData) + end + end + + table.sort(AchievementList, function(a, b) + if a.HasGained == true and b.HasGained == false then + return true + elseif a.HasGained == b.HasGained then + if a.AchievementType == b.AchievementType then + if a.AchievementType == 1 then + if a.Difficulty == b.Difficulty then + return a.ItemType < b.ItemType + end + return a.Difficulty < b.Difficulty + elseif a.AchievementType == 2 then + if a.BossName == b.BossName then + return a.ItemType < b.ItemType + else + local BossNameIndex = {['幻'] = 1, ['慎'] = 2, ['魅'] = 3, ['瞬'] = 4, ['春'] = 5, ['蛮'] = 6} + return BossNameIndex[a.BossName] < BossNameIndex[b.BossName] + end + end + end + return a.AchievementType < b.AchievementType + end + return false + end) + + return AchievementList +end + +function WBP_SaveGamePanel:SetGameAchievements() + local AchievementList = {} + local GameAchievements = { + ['通关'] = {Value = self.OwnerArchiveData.GameClearanceTimes, ConditionStr = "通关%d次"}, + ['击败'] = {Value = self.OwnerArchiveData.TotalBossKilledTimes, ConditionStr = "共击败首领%d次"}, + ['金币'] = {Value = self.OwnerArchiveData.TotalCoinPoint / 10000, ConditionStr = "共获得%dw金币"}, + ['科技点'] = {Value = self.OwnerArchiveData.TotalKillPoint, ConditionStr = "共获得%d科技点"}, + ['技能'] = {Value = self.OwnerArchiveData.TotalSuperSkill, ConditionStr = "共获得超级技能%d个"}, + --['配件'] = {Value = self.OwnerArchiveData.TotalSuperFitting, ConditionStr = "共获得超级配件%d个"}, + ['开箱'] = {Value = self.OwnerArchiveData.TotalUnpackTimes, ConditionStr = "开箱次数达到%d次"}, + } + for AchievementName, Data in pairs(GameAchievements) do + local RewardTable = self.ArchiveTable.AchievementRewards[AchievementName] + for RewardReach, RewardInfo in pairs(RewardTable) do + local AchievementData = { + HasGained = false, + Sort = {Name = AchievementName, Reach = RewardReach}, + Icon = SaveGameConfigs.Icons.Achievements[AchievementName][RewardReach], + Num = RewardInfo.Name, + Condition = string.format(Data.ConditionStr, RewardReach), + Desc = self:ParseRewardDesc(RewardInfo.Reward), + } + if Data.Value >= RewardReach then + AchievementData.HasGained = true + end + table.insert(AchievementList, AchievementData) + end + end + table.sort(AchievementList, function(a, b) + if a.HasGained == true and b.HasGained == false then + return true + elseif a.HasGained == b.HasGained then + local NameSort = {['通关'] = 1, ['击败'] = 2, ['金币'] = 3, ['科技点'] = 4, ['技能'] = 5, ['配件'] = 6, ['开箱'] = 7,} + local NameIndex1 = NameSort[a.Sort.Name] + local NameIndex2 = NameSort[b.Sort.Name] + if NameIndex1 == NameIndex2 then + return a.Sort.Reach < b.Sort.Reach + elseif NameIndex1 > NameIndex2 then + return false + end + return true + end + return false + end) + return AchievementList +end + +function WBP_SaveGamePanel:SetupAchievementItems(AchievementDataList) + if AchievementDataList == nil then + return + end + + self.AchievementItems = {} + local ChildIndex = 0 + for _, AchievementData in pairs(AchievementDataList) do + local AchievementItemWidget = self.WrapBox_Achievements:GetChildAt(ChildIndex) + if AchievementItemWidget == nil then + AchievementItemWidget = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.ItemClass) + AchievementItemWidget.OwnerPanel = self + self.WrapBox_Achievements:AddChildWrapBox(AchievementItemWidget) + else + AchievementItemWidget:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + AchievementItemWidget:InitAchievementInfo(AchievementData) + table.insert(self.AchievementItems, AchievementItemWidget) + + ChildIndex = ChildIndex + 1 + end + + local ChildCount = self.WrapBox_Achievements:GetChildrenCount() + if ChildIndex < ChildCount then + for i = ChildIndex, ChildCount do + local AchievementItemWidget = self.WrapBox_Achievements:GetChildAt(i) + if AchievementItemWidget and UE.IsValid(AchievementItemWidget) then + AchievementItemWidget:SetVisibility(ESlateVisibility.Collapsed) + end + end + end +end + +function WBP_SaveGamePanel:ParseRewardDesc(InfoTable) + local Type = InfoTable.Type + local Value = InfoTable.Value + local Unit = InfoTable.Unit + if Type == nil or Value == nil or Unit == nil then + return "" + end + + local NeedPercentSign = false + local DescStr = string.gsub(Type,"%p+","")..(Value >= 0 and "+" or "-") + if Unit == "%" then + Value = (math.abs(Value)) * 100.0 + NeedPercentSign = true + end + local int, decimal = math.modf(Value) + local ValueStr = decimal > 0.001 and string.format("%.1f", Value) or string.format("%d", math.floor(Value)) + DescStr = DescStr..ValueStr..(NeedPercentSign and "%" or "") + return DescStr +end + +function WBP_SaveGamePanel:ParseRewardDescWithTable(RewardRewardInfo, Count) + Count = Count or 1.0 + local DescStr = "" + for index, Info in pairs(RewardRewardInfo) do + local NeedPercentSign = false + local Type = Info.Type + local Value = Info.Value + local Unit = Info.Unit + if Type == nil or Value == nil or Unit == nil then + break + end + + DescStr = DescStr..string.gsub(Type,"%p+","")..(Value >= 0 and "+" or "-") + if Unit == "%" then + Value = (math.abs(Value)) * 100.0 + NeedPercentSign = true + end + Value = Value * Count + local int, decimal = math.modf(Value) + local ValueStr = decimal > 0.001 and string.format("%.1f", Value) or string.format("%d", math.floor(Value)) + DescStr = DescStr..ValueStr..(NeedPercentSign and "%" or "")..(next(RewardRewardInfo, index) ~= nil and "\n" or "") + end + return DescStr +end + +return WBP_SaveGamePanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SaveGame_Achievement_Item.lua b/GZJ/Script/UI/WBP_SaveGame_Achievement_Item.lua new file mode 100644 index 00000000..05240014 --- /dev/null +++ b/GZJ/Script/UI/WBP_SaveGame_Achievement_Item.lua @@ -0,0 +1,56 @@ +---@class WBP_SaveGame_Achievement_Item_C:UUserWidget +---@field Button_Achievement UButton +---@field Image_Achievement_Icon UImage +---@field Image_Achievement_SelectBG UImage +---@field TextBlock_Achievement_Num UTextBlock +--Edit Below-- +local WBP_SaveGame_Achievement_Item = { + bInitDoOnce = false, + OwnerPanel = nil, + Info = {}, +}; + +local BGPath = { + Gained = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/fileUI/Textures/ZD_UGC_file_23.ZD_UGC_file_23'), + NotGained = UGCGameSystem.GetUGCResourcesFullPath('Asset/UITexture/fileUI/Textures/ZD_UGC_file_22.ZD_UGC_file_22'), +} + +function WBP_SaveGame_Achievement_Item:Construct() + self.Button_Achievement.OnClicked:Add(self.Button_Achievement_OnClicked, self) + self.Button_Achievement:SetTouchMethod(EButtonTouchMethod.PreciseTap) +end + +function WBP_SaveGame_Achievement_Item:Destruct() + self.Button_Achievement.OnClicked:Remove(self.Button_Achievement_OnClicked, self) +end + +function WBP_SaveGame_Achievement_Item:InitAchievementInfo(Info) + self.TextBlock_Achievement_Num:SetText(tostring(Info.Num)) + + self.Info = Info + + if Info.HasGained then + UIManager.LoadTexture(self.Image_Achievement_SelectBG, BGPath.Gained) + self.Image_Achievement_Icon:SetColorAndOpacity({R=1,G=1,B=1,A=1}) + self.TextBlock_Achievement_Num:SetColorAndOpacity({SpecifiedColor={R=1,G=1,B=1,A=1},ColorUseRule=0}) + else + UIManager.LoadTexture(self.Image_Achievement_SelectBG, BGPath.NotGained) + self.Image_Achievement_Icon:SetColorAndOpacity({R=0.151042,G=0.151042,B=0.151042,A=1}) + self.TextBlock_Achievement_Num:SetColorAndOpacity({SpecifiedColor={R=0.151042,G=0.151042,B=0.151042,A=1},ColorUseRule=0}) + end + + UIManager.LoadTexture(self.Image_Achievement_Icon, Info.Icon) +end + +function WBP_SaveGame_Achievement_Item:Button_Achievement_OnClicked() + if self.OwnerPanel == nil then + return + end + self.OwnerPanel:OnCurAchievementChanged(self) +end + +function WBP_SaveGame_Achievement_Item:SetAchievementIsSelected(bIsSelected) + self.Image_Achievement_SelectBG:SetVisibility(bIsSelected and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed) +end + +return WBP_SaveGame_Achievement_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SaveGame_Category_Item.lua b/GZJ/Script/UI/WBP_SaveGame_Category_Item.lua new file mode 100644 index 00000000..aa601bc2 --- /dev/null +++ b/GZJ/Script/UI/WBP_SaveGame_Category_Item.lua @@ -0,0 +1,62 @@ +---@class WBP_SaveGame_Category_Item_C:UUserWidget +---@field Button_Item UButton +---@field Image_Item_BG UImage +---@field TextBlock_Item UTextBlock +---@field WidgetSwitcher_Item UWidgetSwitcher +---@field CategoryIndex int32 +---@field CategoryName FText +---@field Icon_Selected UTexture2D +---@field Icon_Normal UTexture2D +--Edit Below-- +local WBP_SaveGame_Category_Item = { + bInitDoOnce = false, + OwnerPanel = nil, +}; + +local ColorAndOpacity = { + Selected = + { + SpecifiedColor = + { + R = 1, + G = 1, + B = 1, + A = 1 + }, + ColorUseRule = 0, + }, + Normal = + { + SpecifiedColor = + { + R = 0.291771, + G = 0.291771, + B = 0.291771, + A = 1 + }, + ColorUseRule = 0, + } +} + +function WBP_SaveGame_Category_Item:Construct() + self.Button_Item.OnClicked:Add(self.Button_Item_OnClicked, self) +end + +function WBP_SaveGame_Category_Item:Destruct() + self.Button_Item.OnClicked:Remove(self.Button_Item_OnClicked, self) +end + +function WBP_SaveGame_Category_Item:Button_Item_OnClicked() + if self.OwnerPanel == nil or self.CategoryIndex < 1 or self.CategoryIndex > 6 then + return + end + self.OwnerPanel:OnCurCategoryChanged(self.CategoryIndex) +end + +function WBP_SaveGame_Category_Item:SetIsSelected(bIsSelected) + self.Image_Item_BG:SetVisibility(bIsSelected and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed) + self.WidgetSwitcher_Item:SetActiveWidgetIndex(bIsSelected and 1 or 0) + self.TextBlock_Item:SetColorAndOpacity(bIsSelected and ColorAndOpacity.Selected or ColorAndOpacity.Normal) +end + +return WBP_SaveGame_Category_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SealRewards.lua b/GZJ/Script/UI/WBP_SealRewards.lua new file mode 100644 index 00000000..36cc6b51 --- /dev/null +++ b/GZJ/Script/UI/WBP_SealRewards.lua @@ -0,0 +1,28 @@ +---@class WBP_SealRewards_C:UUserWidget +---@field VerticalBox_Rewards UVerticalBox +---@field WBP_RewardItem UWBP_RewardItem_C +---@field WBP_RewardItem_116 UWBP_RewardItem_C +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_SealRewards = { bInitDoOnce = false; }; + +function WBP_SealRewards:Construct() + self.WBP_WidgetHeader:Construct() +end + +-- function WBP_SealRewards:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_SealRewards:Destruct() + +-- end + +function WBP_SealRewards:SetRewards(InRewards) + local Count = self.VerticalBox_Rewards:GetChildrenCount() + for i = 1, Count do + self.VerticalBox_Rewards:GetChildAt(i - 1):SetRewardsData(InRewards[i]) + end +end + +return WBP_SealRewards; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SelectDifficultyPanel.lua b/GZJ/Script/UI/WBP_SelectDifficultyPanel.lua new file mode 100644 index 00000000..0f329e16 --- /dev/null +++ b/GZJ/Script/UI/WBP_SelectDifficultyPanel.lua @@ -0,0 +1,193 @@ +---@class WBP_SelectDifficultyPanel_C:UUserWidget +---@field CanvasPanel_Area UCanvasPanel +---@field CanvasPanel_Main UCanvasPanel +---@field HorizontalBox_RemainTime UHorizontalBox +---@field ScrollBox_Range UScrollBox +---@field TextBlock_RemainTime UTextBlock +---@field TextBlock_SelectDifficultyTip UTextBlock +---@field TextBlock_Total UTextBlock +---@field UniformGridPanel_Items UUniformGridPanel +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_SelectDifficultyPanel = { + bInitDoOnce = false; + GridItemWidgetClass = nil; -- 难度项的类 + RangeItemClass = nil; -- Range 项的类 + MaxDifficulty = 0; -- 最高难度 + SelectDifficulty = 0; -- 是否选择过难度 + TotalRangeNum = 0; -- 当前 Range Item 个数 + RecommendLevel = 0; -- 推荐等级 + CurrentRangeNum = 0; + HadShow = false; -- 是否显示过 +}; + +function WBP_SelectDifficultyPanel:Construct() + WBP_SelectDifficultyPanel.SuperClass.Construct(self) + self.WBP_WidgetHeader.UIType = EUIType.SelectDifficulty + + self.WBP_WidgetHeader.bIsCloseUITypeUI = false; + self.WBP_WidgetHeader.CloseUIFunc = function() + UIManager:GetPanel(EUIType.SelectDifficulty):CloseOtherWidget() + end + self.WBP_WidgetHeader:Construct() + + self.ScrollBox_Range:ClearChildren() + self.GridItemWidgetClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_DifficultyItem.WBP_DifficultyItem_C')) + self.RangeItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_DifficultyRangeItem.WBP_DifficultyRangeItem_C')) + + self:SetMaxDifficulty(66); + self.TextBlock_Total:SetText(string.format("")) + EventSystem:AddListener(EventType.PlayerDifficultySelectionChanged, self.OnPlayerDifficultySelectionChange, self) + EventSystem:AddListener(EventType.OnGameReadyStageRemainTimeChanged, self.OnGameReadyStageRemainTimeChange, self) + + --self.UniformGridPanel_Items:ClearChildren() + --for i = 1, 10 do + -- local Widget = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.GridItemWidgetClass) + -- local Slot = self.UniformGridPanel_Items:AddChildToUniformGrid(Widget) + -- Slot:SetColumn(0) + -- Slot:SetRow(i - 1) + --end +end + +function WBP_SelectDifficultyPanel:OnShowPanel(...) + self.HadShow = true; +end + +-- 关闭除了倒计时的其他页面 +function WBP_SelectDifficultyPanel:CloseOtherWidget() + self.CanvasPanel_Main:SetVisibility(ESlateVisibility.Collapsed); + self.TextBlock_SelectDifficultyTip:SetVisibility(ESlateVisibility.Collapsed) +end + +-- function WBP_SelectDifficultyPanel:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_SelectDifficultyPanel:Destruct() + EventSystem:RemoveListener(EventType.PlayerDifficultySelectionChanged, WBP_SelectDifficultyPanel.OnPlayerDifficultySelectionChange, self) + EventSystem:RemoveListener(EventType.OnGameReadyStageRemainTimeChanged, WBP_SelectDifficultyPanel.OnGameReadyStageRemainTimeChange, self) +end + +function WBP_SelectDifficultyPanel:OnGameReadyStageRemainTimeChange(RemainTime) + if RemainTime <= 0 then + self.HorizontalBox_RemainTime:SetVisibility(ESlateVisibility.Collapsed) + else + self.HorizontalBox_RemainTime:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.TextBlock_RemainTime:SetText(tostring(RemainTime)) + end +end + +function WBP_SelectDifficultyPanel:SetMaxDifficulty(InNum) + self.TotalRangeNum = (InNum + 9) // 10 + self.MaxDifficulty = InNum + for i = 1, self.TotalRangeNum do + if UE.IsValid(self.RangeItemClass) and UE.IsValid(UGCGameSystem.GameState) then + local RangeItem = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.RangeItemClass) + self.ScrollBox_Range:AddChild(RangeItem) + RangeItem:SetRangeNum(i, self.MaxDifficulty) + RangeItem:SetIsClick(false) + end + end + + self:GetRecommendLevel() +end + +function WBP_SelectDifficultyPanel:GetRecommendLevel() + -- 获取存档数据,然后检查之前玩过的局数,可解锁的局数 = 通关过的局数 + 1 + local PS = GameDataManager.GetLocalPlayerState() + if table.getCount(PS.ArchiveData.PlayedGames) > 0 then + -- i: 难度;v: 局数 + local MaxDiff = 0 + for i, v in pairs(PS.ArchiveData.PlayedGames) do + if i > MaxDiff and v > 0 then + MaxDiff = i + end + end + self.RecommendLevel = MaxDiff + 1 + else + self.RecommendLevel = 1 + end + + -- 设置 Range Num过去 + self:SetRangeNum((self.RecommendLevel + 9) // 10) +end + +function WBP_SelectDifficultyPanel:SetRangeNum(InNum) + print(string.format('[WBP_SelectDifficultyPanel:SetRangeNum] Num = %d', InNum)) + if self.CurrentRangeNum == InNum then + return + end + self.CurrentRangeNum = InNum + if InNum == self.TotalRangeNum then + for i = 1, 10 - self.MaxDifficulty % 10 do + self.UniformGridPanel_Items:GetChildAt(10 - i):SetVisibility(ESlateVisibility.Hidden) + end + else + for i = 1, 10 do + self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end + end + + for i = 1, 10 do + if self.UniformGridPanel_Items:GetChildAt(i - 1):GetVisibility() == ESlateVisibility.SelfHitTestInvisible then + local Difficult = (InNum - 1) * 10 + i + self.UniformGridPanel_Items:GetChildAt(i - 1):SetDifficulty(Difficult) + end + end + + -- 显示状态 + -- 判断最小的是否大于值 + if (InNum - 1) * 10 + 1 > self.RecommendLevel then + for i = 1, 10 do + self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(0) + end + elseif InNum * 10 < self.RecommendLevel then -- 判断最大的是否小于值 + for i = 1, 10 do + self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(1) + end + else --就是在中间 + for i = 1, 10 do + local Val = self.UniformGridPanel_Items:GetChildAt(i - 1).Difficulty + if Val <= self.RecommendLevel then + self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(1) + else + self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(0) + end + end + end + + -- 找到自己选择的 难度 + if self.SelectDifficulty ~= 0 then + if (InNum - 1) * 10 + 1 <= self.SelectDifficulty and self.SelectDifficulty <= InNum * 10 then + for i = 1, 10 do + if self.UniformGridPanel_Items:GetChildAt(i - 1).Difficulty == self.SelectDifficulty then + self.UniformGridPanel_Items:GetChildAt(i - 1):SetVisualType(2) + break + end + end + end + end +end + +function WBP_SelectDifficultyPanel:SetCurrentDifficulty(InNum) + print(string.format('[WBP_SelectDifficultyPanel:SetCurrentDifficulty] 选择的难度 = %d', InNum)) + self.SelectDifficulty = InNum + -- 设置当前的选项 + local PC = GameDataManager.GetLocalPlayerController() + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_SelectGameDifficulty", InNum) +end + +function WBP_SelectDifficultyPanel:OnPlayerDifficultySelectionChange(InData) + -- 直接显示在最上面的文本框中 + if table.getCount(InData) == 0 then + return + end + -- i:难度,v:票数 + local ToText = '' + for i, v in pairs(InData) do + ToText = ToText .. '难度'..tostring(i)..': '.. tostring(v) .. '\t' + end + self.TextBlock_Total:SetText(ToText) +end + +return WBP_SelectDifficultyPanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SelectSkill.lua b/GZJ/Script/UI/WBP_SelectSkill.lua new file mode 100644 index 00000000..6437704f --- /dev/null +++ b/GZJ/Script/UI/WBP_SelectSkill.lua @@ -0,0 +1,111 @@ +---@class WBP_SelectSkill_C:UUserWidget +---@field CanvasPanel_Skill UCanvasPanel +---@field CanvasPanel_SkillBox UCanvasPanel +---@field HorizontalBox_RemainTime UHorizontalBox +---@field Panel_BG UWBP_WidgetHeader_C +---@field ScrollBox_Items UScrollBox +---@field Skill_Category_1 UWBP_SelectSkillButton_C +---@field Skill_Category_2 UWBP_SelectSkillButton_C +---@field Skill_Category_3 UWBP_SelectSkillButton_C +---@field TextBlock_RemainTime UTextBlock +---@field TextBlock_SelectSkillTip UTextBlock +--Edit Below-- +local WBP_SelectSkill = { + bInitDoOnce = false, + SkillItemPanelSizeX = 120, + SkillItemClass = nil, + SkillItems = {}, + WidgetPool = {}; --容器池 + HadShow = false; -- 是否显示过 +} + +function WBP_SelectSkill:Construct() + self.Panel_BG:Construct() + WBP_SelectSkill.SuperClass.Construct(self) + + self.SkillCategoryButtons = { + [GlobalConfigs.ETalentType.Damage] = self.Skill_Category_1, + [GlobalConfigs.ETalentType.Function] = self.Skill_Category_2, + [GlobalConfigs.ETalentType.Survival] = self.Skill_Category_3, + } + + -- 初始化容器池 + self:InitPool(5) + self:SelectSkillType('伤害') + + self:OnGameReadyStageRemainTimeChange(UGCGameSystem.GameState.GameReadyStageRemainTime) + EventSystem:AddListener(EventType.OnGameReadyStageRemainTimeChanged, WBP_SelectSkill.OnGameReadyStageRemainTimeChange, self) + + self.ScrollBox_Items:SetScrollBarVisibility(ESlateVisibility.Collapsed) +end + +function WBP_SelectSkill:Destruct() + EventSystem:RemoveListener(EventType.OnGameReadyStageRemainTimeChanged, WBP_SelectSkill.OnGameReadyStageRemainTimeChange, self) + WBP_SelectSkill.SuperClass.Destruct(self) +end + +function WBP_SelectSkill:OnShowPanel(...) + self.HadShow = true; +end + +function WBP_SelectSkill:InitPool(InSize) + local ItemWidgetClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_Skill_Item.WBP_Skill_Item_C')) + self.WidgetPool = {} + for i = 1, InSize do + local Widget = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, ItemWidgetClass) + local ItemData = { + IsUsed = false, + Widget = Widget, + } + table.insert(self.WidgetPool, ItemData) + end +end + +function WBP_SelectSkill:OnGameReadyStageRemainTimeChange(RemainTime) + if RemainTime <= 0 then + self.HorizontalBox_RemainTime:SetVisibility(ESlateVisibility.Collapsed) + else + self.HorizontalBox_RemainTime:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.TextBlock_RemainTime:SetText(tostring(RemainTime)) + end +end + +function WBP_SelectSkill:OnSelectionChanged() + self.TextBlock_SelectSkillTip:SetText("请等待其他玩家选择") + self.CanvasPanel_Skill:SetVisibility(ESlateVisibility.Collapsed) + + NewPlayerGuideManager:RemoveGuide(3) +end + +function WBP_SelectSkill:SelectSkillType(InText) + for Name, Btn in pairs(self.SkillCategoryButtons) do + if Name == InText then + Btn:SetIsSelected(true) + else + Btn:SetIsSelected(false) + end + end + -- 找到 + local ItemNames = {} + self.ScrollBox_Items:ClearChildren() + for k, v in pairs(GlobalConfigs.SkillTalent) do + if v.Talent == InText then + table.insert(ItemNames, k) + end + end + + for i = 1, #ItemNames do + -- 从池中取出一个 + local Item = self.WidgetPool[i] + Item.IsUsed = true + self.ScrollBox_Items:AddChild(Item.Widget) + Item.Widget:Init(ESkillAccessType.Talented, ItemNames[i]) + end +end + +function WBP_SelectSkill:SetSelectItem(InName) + self.CanvasPanel_Skill:SetVisibility(ESlateVisibility.Collapsed) + UIManager:ShowGeneralNotice(string.format('已选择 '.. GlobalConfigs.SkillInfo[InName].Name)) +end + +return WBP_SelectSkill; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SelectWeaponPanel.lua b/GZJ/Script/UI/WBP_SelectWeaponPanel.lua new file mode 100644 index 00000000..6ea634b5 --- /dev/null +++ b/GZJ/Script/UI/WBP_SelectWeaponPanel.lua @@ -0,0 +1,40 @@ +---@class WBP_SelectWeaponPanel_C:UUserWidget +---@field Panel_Main UCanvasPanel +---@field ScrollBox_Weapons UScrollBox +---@field WBP_SelectWeaponItem UWBP_SelectWeaponItem_C +---@field WBP_SelectWeaponItem_0 UWBP_SelectWeaponItem_C +---@field WBP_SelectWeaponItem_1 UWBP_SelectWeaponItem_C +---@field WBP_SelectWeaponItem_2 UWBP_SelectWeaponItem_C +---@field WBP_SelectWeaponItem_3 UWBP_SelectWeaponItem_C +---@field WBP_SelectWeaponItem_4 UWBP_SelectWeaponItem_C +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_SelectWeaponPanel = { + bInitDoOnce = false, +}; + +function WBP_SelectWeaponPanel:Construct() + self.WBP_WidgetHeader:Construct() + WBP_SelectWeaponPanel.SuperClass.Construct(self) + self.ScrollBox_Weapons:SetScrollBarVisibility(ESlateVisibility.Collapsed) + self:InitData() +end + +function WBP_SelectWeaponPanel:InitData() + print(string.format("[WBP_SelectWeaponPanel:InitData] 开始初始化数据")) + local TempVal = 0 + for i, v in pairs(Tables.DefaultWeaponId) do + self.ScrollBox_Weapons:GetChildAt(TempVal):SetDefaultData(i) + TempVal = TempVal + 1 + end +end + +function WBP_SelectWeaponPanel:Destruct() + WBP_SelectWeaponPanel.SuperClass.Destruct(self) +end + +function WBP_SelectWeaponPanel:InitFromParam() + +end + +return WBP_SelectWeaponPanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SettlementPanel.lua b/GZJ/Script/UI/WBP_SettlementPanel.lua new file mode 100644 index 00000000..93ebb6fb --- /dev/null +++ b/GZJ/Script/UI/WBP_SettlementPanel.lua @@ -0,0 +1,629 @@ +---@class WBP_SettlementPanel_C:UUserWidget +---@field Button_Back UNewButton +---@field Panel_Avatar UWBP_AvatarFrame_C +---@field Panel_Settlement UCanvasPanel +---@field Panel_Waiting UCanvasPanel +---@field PlayerInfoList UVerticalBox +---@field ScrollBox_SaveItems UScrollBox +---@field TextBlock_BackToLobby UTextBlock +---@field TextBlock_Difficulty UTextBlock +---@field TextBlock_GameDuration UTextBlock +---@field TextBlock_GameIsWin UTextBlock +---@field TextBlock_Status UTextBlock +---@field WidgetSwitcher_Save UWidgetSwitcher +---@field WidgetSwitcher_TitleBG UWidgetSwitcher +---@field ItemClass UClass +--Edit Below-- +local WBP_SettlementPanel = { + bInitDoOnce = false; + -- 对象池初始化数量 + InitCount = 0, + FirstOpen = true; + + -- 存放数组,如果之后需要改变排序,直接改变即可,不需要在计算一遍 + SaveGames = { + }, +}; + +function WBP_SettlementPanel:Construct() + WBP_SettlementPanel.SuperClass.Construct(self); + self:BindEvents(); + self.ScrollBox_SaveItems:ClearChildren(); +end + +function WBP_SettlementPanel:Destruct() + self:UnBindEvents() + + if self.CountDownHandle ~= nil then + EventSystem.StopTimer(self.CountDownHandle) + self.CountDownHandle = nil + end +end + +function WBP_SettlementPanel:OnShowPanel() + self.Panel_Settlement:SetVisibility(ESlateVisibility.Collapsed) + self.Panel_Waiting:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + + local GameResultData = UGCGameSystem.GameState.GameResultData + if GameResultData ~= nil and table.isEmpty(GameResultData) == false then + self.Panel_Settlement:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.Panel_Waiting:SetVisibility(ESlateVisibility.Collapsed) + self:ShowResult(GameResultData) + self:ShowArchive() + else + if self.WaitTimerHandle ~= nil then + EventSystem.StopTimer(self.WaitTimerHandle) + end + self.WaitTimerHandle = EventSystem.SetTimerLoop(self, function() + local GameResultData = UGCGameSystem.GameState.GameResultData + if GameResultData ~= nil and table.isEmpty(GameResultData) == false then + self.Panel_Settlement:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.Panel_Waiting:SetVisibility(ESlateVisibility.Collapsed) + self:ShowResult(GameResultData) + self:ShowArchive() + EventSystem.StopTimer(self.WaitTimerHandle) + self.WaitTimerHandle = nil + end + end, 0.1) + end + + local CountDownRemain = 20.0 + self.TextBlock_BackToLobby:SetText(string.format("(%d)返回大厅", math.floor(CountDownRemain))) + + self.CountDownHandle = EventSystem.SetTimerLoop(UGCGameSystem.GameState, function() + CountDownRemain = CountDownRemain - 1 + self.TextBlock_BackToLobby:SetText(string.format("(%d)返回大厅", math.floor(CountDownRemain))) + if CountDownRemain <= 0 then + UE.Log("[WBP_SettlementPanel] Auto Back To Lobby") + self:OnButtonBackClicked() + end + end, 1.0) +end + +-- function WBP_SettlementPanel:InitFromParam(GameResultData) +-- self:ShowResult(GameResultData) + +-- self:ShowArchive(); +-- end + +function WBP_SettlementPanel:BindEvents() + self.Button_Back.OnClicked:Add(WBP_SettlementPanel.OnButtonBackClicked, self) +end + +function WBP_SettlementPanel:UnBindEvents() + self.Button_Back.OnClicked:Remove(WBP_SettlementPanel.OnButtonBackClicked, self) +end + +function WBP_SettlementPanel:ShowResult(GameResultData) + --隐藏主UI + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + if PC then + PC:CastUIMsg("MainControlPanel_HideAllUI", "ingame"); + else + UE.Log("[WBP_SettlementPanel:ShowResult] Error: PC is nil!") + end + + --TODO: 游戏成功和失败的显示 + self.WidgetSwitcher_TitleBG:SetActiveWidgetIndex(GameResultData.IsWin and 0 or 1) + self.TextBlock_GameIsWin:SetText(GameResultData.IsWin and "通关" or "失败") + self.TextBlock_Status:SetText(GameResultData.IsWin and "守卫光子鸡" or "淘汰") + self.TextBlock_Difficulty:SetText(string.format("难%d", GameResultData.GameDifficulty)) + self.TextBlock_GameDuration:SetText(string.format("%ds", GameResultData.GameDuration)) + + local LocalPlayerState = GameDataManager.GetLocalPlayerState() + if LocalPlayerState then + self:InitAvatar(LocalPlayerState) + end + + self:InitSettlementPlayerList(GameResultData) +end + +function WBP_SettlementPanel:InitAvatar(InPlayerState) + local UID = InPlayerState.UID + local IconURL = InPlayerState.IconURL + local Gender = InPlayerState.PlatformGender + local FrameLevel = InPlayerState.SegmentLevel + local PlayerLevel = InPlayerState.PlayerLevel + + self.Panel_Avatar:InitView(UID, IconURL, Gender, FrameLevel, PlayerLevel, true, true) + self.Panel_Avatar:SetPlayerName(InPlayerState.PlayerName) +end + +--初始化结算玩家列表 +function WBP_SettlementPanel:InitSettlementPlayerList(GameResultData) + if next(GameResultData) == nil then + return false + end + + if not UE.IsValid(self.ItemClass) then + UE.LogError("[WBP_SettlementPanel:InitSettlementPlayerList] ItemClass is invalid") + return false + end + --根据玩家结算数据,创建对应数量的玩家数据UI条目控件 + for i, PlayerResultData in pairs(GameResultData.PlayerResultDatas) do + local PlayerListItemClass = self.ItemClass + local PlayerListItem = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, PlayerListItemClass) + if PlayerListItem then + self.PlayerInfoList:AddChild(PlayerListItem) + PlayerListItem:Init(PlayerResultData) + else + UE.LogError("[WBP_SettlementPanel:InitSettlementPlayerList] PlayerListItem is nil!") + end + end +end + +function WBP_SettlementPanel:OnButtonBackClicked() + EventSystem.StopTimer(self.CountDownHandle) + self.CountDownHandle = nil + + local PlayerController = STExtraGameplayStatics.GetFirstPlayerController(self) + if PlayerController then + PlayerController:ExitGame() + else + UE.Log("[WBP_SettlementPanel:OnButtonBackClicked] PlayerController is nil") + end + + UGCGameSystem.ReturnToLobby() +end + +function WBP_SettlementPanel:OnClickSave() + if self.WBP_SettleSave:IsVisible() then + self.WBP_SettleSave:SetVisibility(ESlateVisibility.Collapsed); + else + -- 显示结算存档界面 + self.WBP_SettleSave:SetVisibility(ESlateVisibility.SelfHitTestInvisible); + -- 初始化 + self.WBP_SettleSave:ShowArchive(); + end +end + +function WBP_SettlementPanel:ShowArchive() + print(string.format("[WBP_SettlementPanel:ShowArchive] 进入")) + if self.FirstOpen == false then + return + end + self.FirstOpen = false; + -- 这里面就是变化,还是要根据每一个具体显示 + local Results = self:CompareArchive(); + log_tree("[WBP_SettlementPanel:ShowArchive] Results = ", Results); + -- 显示存档,根据顺序进行排列 + self:ShowItem_GameClearance(Results.GameClearanceDiff); + self:ShowItem_Credit(Results.CreditDiff); + self:ShowItem_EasterEggs(Results.EasterEggsDiff); + self:ShowItem_Achievement(Results.AchievementDiff); + self:ShowItem_GameDrop(Results.GameDropDiff); + self:ShowItem_BossDrop(Results.BossDropDiff); + print(string.format("[WBP_SettlementPanel:ShowArchive] 显示完全")); + -- 设置数据 + log_tree("[WBP_SettlementPanel:ShowArchive] self.SaveGames = ", self.SaveGames) + self:SetItemInfos(); + print(string.format("[WBP_SettlementPanel:ShowArchive] 设置完全")); +end + +function WBP_SettlementPanel:SetItemInfos() + if #self.SaveGames == 0 then + self.WidgetSwitcher_Save:SetActiveWidgetIndex(0); + return; + end + self.WidgetSwitcher_Save:SetActiveWidgetIndex(1) + + log_tree("[WBP_SettlementPanel:SetItemInfos] self.SaveGames = ", self.SaveGames) + local ChildrenCount = self.ScrollBox_SaveItems:GetChildrenCount() + local SaveGameCount = #self.SaveGames + if ChildrenCount < SaveGameCount then + self:InitObjectPool(SaveGameCount - ChildrenCount) + end + for i, Info in pairs(self.SaveGames) do + self.ScrollBox_SaveItems:GetChildAt(i - 1):SetSaveInfo(Info) + self.ScrollBox_SaveItems:GetChildAt(i - 1):SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +-- 返回新增的存档,数据结构如下 +-- { +-- [Difficult] = { Time1 } +-- } +--- 例如: +--- { +--- [10] = { 3, 5 } +---} +function WBP_SettlementPanel:GameClearanceDiff(InOld, InLast) + local Results = {} + -- 记录增量变化 + + -- 去检查一下 ArchiveTable 中当前的存档 + local Func = function(InDiff, InTimes) + local ValTable = { + [InDiff] = {} + } + ValTable[InDiff] = {} + for i, v in pairs(ArchiveTable.GameClearanceRewards[InDiff]) do + if InTimes >= i then + table.insert(ValTable[InDiff], i); + end + end + return ValTable; + end + + -- InTable: Results; InAddTable: [Diff] = { Times } + local AddResultFunc = function(InAddTable) + for i, v in pairs(InAddTable) do + Results[i] = v + end + end + + for Diff, Times in pairs(InLast) do + if InOld[Diff] == nil then + -- 说明全部是新的 + local NewAdd = Func(Diff, Times) + AddResultFunc(NewAdd) + else + -- 判断当前已经打到第几个阶段了 + local OldTable = Func(Diff, InOld[Diff]) + local NewTable = Func(Diff, Times) + -- 做插值 + local DiffTable = table.Diff(OldTable, NewTable) + AddResultFunc(DiffTable) + end + end + + if table.getCount(Results) == 0 then + return nil; + end + return Results; +end + +function WBP_SettlementPanel:CreditDiff(InOld, InLast) + local Results = {} + + -- 获取积分的最大值 + local Func = function(Val) + local Max = 0 + for i, v in pairs(ArchiveTable.CreditRewards) do + if v.Reach >= Val then + return i - 1 + end + Max = i; + end + return Max; + end + + local Old = Func(InOld) + local New = Func(InLast) + if Old ~= New then + for i = Old + 1, New do + table.insert(Results, i) + end + end + if table.getCount(Results) == 0 then + return nil; + end + return Results +end + +function WBP_SettlementPanel:EasterEggsDiff(InOld, InLast) + local Results = {} + for i, v in pairs(InLast) do + if v.Active == true and InOld[i].Active == false then + table.insert(Results, i) + end + end + return Results; +end + +-- 成就类型: { Val } +function WBP_SettlementPanel:AchievementDiff(InKey, InOld, InLast) + -- 做成数组 + local MakeArrFunc = function(TheKey) + local Ret = {} + for i, v in pairs(ArchiveTable.AchievementRewards[TheKey]) do + Ret[#Ret + 1] = i; + --table.insert(Ret, i) + end + return Ret; + end + local Arr = MakeArrFunc(InKey) + local Func = function(InArr, Val) + local Ret = {} + for i, v in pairs(InArr) do + if Val >= v then + Ret[#Ret + 1] = i; -- 添加进去 + end + end + return Ret; + end + + local OldMax = Func(Arr, InOld) + local LastMax = Func(Arr, InLast) + local Results = {} + + -- 判断哪些没有 + for Index, AchieveIndex in pairs(LastMax) do + if OldMax[Index] == nil then + Results[#Results + 1] = Arr[AchieveIndex]; + end + end + if table.getCount(Results) == 0 then + return nil; + end + return Results; +end + +-- 游戏掉落物 +-- { [Diff] = { Type: Count } } +function WBP_SettlementPanel:GameDropDiff(InOld, InLast) + local Results = {} + for Diff, Table in pairs(InLast) do + if InOld[Diff] ~= nil then + for Type, Count in pairs(Table) do + local OldVal = InOld[Diff][Type] + if OldVal == nil then + Results[Diff] = { + [Type] = Count + } + else + if Count - OldVal ~= 0 then + Results[Diff] = { + [Type] = Count - OldVal + } + end + end + end + else + Results[Diff] = Table; + end + end + return Results; +end + +function WBP_SettlementPanel:BossDropDiff(InOld, InLast) + -- Table: { Type: Count } + local Results = {} + for BossName, Table in pairs(InLast) do + if InOld[BossName] == nil then + Results[BossName] = Table + else + Results[BossName] = {} + for Type, Count in pairs(Table) do + local OldVal = InOld[BossName][Type] + if OldVal == nil then + Results[BossName][Type] = Count + else + if Count - OldVal ~= 0 then + Results[BossName][Type] = Count - OldVal; + end + end + end + if table.getCount(Results[BossName]) == 0 then + Results[BossName] = nil; + end + end + end + if table.getCount(Results) == 0 then + Results = nil; + end + return Results; +end + +--比较前后变化 +function WBP_SettlementPanel:CompareArchive() + print(string.format("[WBP_SettlementPanel:CompareArchive] 执行")) + local BeforeArchive = GameDataManager.GetLocalPlayerState().SavedArchiveData + print(string.format("[WBP_SettlementPanel:CompareArchive] BeforeArchive")) + print(table.logTree(BeforeArchive)); + local LastArchive = GameDataManager.GetLocalPlayerState().GameEndSavedArchiveData; + print(string.format("[WBP_SettlementPanel:CompareArchive] LastArchive")) + print(table.logTree(LastArchive)); + + log_tree("[WBP_SettlementPanel:CompareArchive] BeforeArchive = ", BeforeArchive); + log_tree("[WBP_SettlementPanel:CompareArchive] LastArchive = ", LastArchive); + + local Results = {} + + Results.GameClearanceDiff = self:GameClearanceDiff(BeforeArchive["PlayedGames"], LastArchive["PlayedGames"]) + --log_tree("[WBP_SettlementPanel:CompareArchive] Results 1111111 = ", Results) + Results.CreditDiff = self:CreditDiff(BeforeArchive["Score"], LastArchive["Score"]) + --log_tree("[WBP_SettlementPanel:CompareArchive] Results 2222222 = ", Results) + Results.EasterEggsDiff = self:EasterEggsDiff(BeforeArchive["EasterEggs"], LastArchive["EasterEggs"]) + --log_tree("[WBP_SettlementPanel:CompareArchive] Results 3333333 = ", Results) + -- 成就类 + Results.AchievementDiff = {} + Results.AchievementDiff["通关"] = self:AchievementDiff("通关", BeforeArchive.GameClearanceTimes, LastArchive.GameClearanceTimes) + Results.AchievementDiff["击败"] = self:AchievementDiff("击败", BeforeArchive.TotalBossKilledTimes, LastArchive.TotalBossKilledTimes) + Results.AchievementDiff["金币"] = self:AchievementDiff("金币", BeforeArchive.TotalCoinPoint / 10000, LastArchive.TotalCoinPoint / 10000) + Results.AchievementDiff["科技点"] = self:AchievementDiff("科技点", BeforeArchive.TotalKillPoint, LastArchive.TotalKillPoint) + Results.AchievementDiff["技能"] = self:AchievementDiff("技能", BeforeArchive.TotalSuperSkill, LastArchive.TotalSuperSkill) + --Results.AchievementDiff["配件"] = self:AchievementDiff("配件", BeforeArchive.TotalSuperFitting, LastArchive.TotalSuperFitting) + Results.AchievementDiff["开箱"] = self:AchievementDiff("开箱", BeforeArchive.TotalUnpackTimes, LastArchive.TotalUnpackTimes) + + --log_tree("[WBP_SettlementPanel:CompareArchive] Results 4444444 = ", Results) + Results.GameDropDiff = self:GameDropDiff(BeforeArchive.GameDropItems, LastArchive.GameDropItems) + --log_tree("[WBP_SettlementPanel:CompareArchive] Results 5555555 = ", Results) + Results.BossDropDiff = self:BossDropDiff(BeforeArchive.BossDropItems, LastArchive.BossDropItems) + --log_tree("[WBP_SettlementPanel:CompareArchive] Results 6666666 = ", Results) + -- 精简一下 + for i, v in pairs(Results) do + if table.isEmpty(v) == true then + Results[i] = nil; + end + end + print(string.format("[WBP_SettlementPanel:CompareArchive] Result")) + print(table.logTree(Results)); + + log_tree("[WBP_SettlementPanel:CompareArchive] Results = ", Results) + + return Results; +end + +function WBP_SettlementPanel:GetTypeValue(InArchive, InNum) + local Archive = InArchive + if InArchive.Type == nil then + local Val = '' + for i, v in pairs(InArchive) do + Val = self:GetTypeValue(v, InNum) .. '\n' .. Val + end + return Val + end + if InNum == nil then + InNum = 1 + end + local Num = Archive.Value * InNum + + local Type = Archive.Type + -- 替换掉 % + if string.find(Type, '%%') ~= nil then + Type = string.gsub(Type, '%%', '') + end + local Unit = "" + + if Archive.Unit == '%' then + Unit = '%' + Num = Num * 100 + end + + if math.type(Archive.Value) == 'float' then + Num = string.format("%.2f", Num) + elseif math.type(Archive.Value) == 'integer' then + Num = string.format("%d", Archive.Value) + end + return string.format('%s + %s', Type, Num .. Unit) +end + +-- 初始化对象池 +function WBP_SettlementPanel:InitObjectPool(InSize) + if InSize == nil then + InSize = self.InitCount + end + -- 先清空 + self.ScrollBox_SaveItems:ClearChildren() + local ClassPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_SettlementSaveItem.WBP_SettlementSaveItem_C') + local ItemClass = UE.LoadClass(ClassPath) + for i = 1, InSize do + local Item = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, ItemClass) + -- 添加进去 + self.ScrollBox_SaveItems:AddChild(Item) + -- 设置隐藏 + Item:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_SettlementPanel:ShowItem_GameClearance(InData) + -- 存放到数组中 + if InData == nil then + return + end + for Diff, TimeTable in pairs(InData) do + for i, Times in pairs(TimeTable) do + -- 处理 Desc + local ItemData = { + Type = ArchiveTable.ArchiveType.GameClearance, + TextVal = string.format("难%d %d次", Diff, Times), + Icon = SaveGameConfigs.Icons.GameClearance, + Desc = self:GetTypeValue(ArchiveTable.GameClearanceRewards[Diff][Times]) + } + table.insert(self.SaveGames, ItemData) + end + end +end + +function WBP_SettlementPanel:ShowItem_Credit(InData) + if InData == nil then + return + end + for i, CreditRewardsIndex in pairs(InData) do + local ItemData = { + Type = ArchiveTable.ArchiveType.Credit, + TextVal = tostring(ArchiveTable.CreditRewards[CreditRewardsIndex].Reach), + Icon = SaveGameConfigs.Icons.Score, + Desc = self:GetTypeValue(ArchiveTable.CreditRewards[CreditRewardsIndex]["Reward"]) + } + table.insert(self.SaveGames, ItemData) + end +end + +function WBP_SettlementPanel:ShowItem_EasterEggs(InData) + if InData == nil then + return + end + log_tree("[WBP_SettlementPanel:ShowItem_EasterEggs] InData = ", InData) + for i, v in pairs(InData) do + local ItemData = { + Type = ArchiveTable.ArchiveType.EasterEggs, + Desc = self:GetTypeValue(ArchiveTable.EasterEggs[v]["Reward"]), + Icon = SaveGameConfigs.Icons.EasterEggs[v], + TextVal = ArchiveTable.EasterEggs[v].Name, + } + table.insert(self.SaveGames, ItemData) + end +end + +function WBP_SettlementPanel:ShowItem_Achievement(InData) + if InData == nil then + return + end + for Name, ValTable in pairs(InData) do + for i, v in pairs(ValTable) do + local ItemData = { + Type = ArchiveTable.ArchiveType.Achievement, + TextVal = ArchiveTable.AchievementRewards[Name][v].Name, + Icon = SaveGameConfigs.Icons.Achievements[Name][v], + Desc = self:GetTypeValue(ArchiveTable.AchievementRewards[Name][v].Reward), + } + table.insert(self.SaveGames, ItemData) + end + end +end + +-- 表示新增的 +function WBP_SettlementPanel:ShowItem_GameDrop(InData) + if InData == nil then + return + end + -- Diff: 难度;TypeCountTable: 物品:数量 + -- 统计所有的 + for Diff, TypeCountTable in pairs(InData) do + for Type, Count in pairs(TypeCountTable) do + local Name = ArchiveTable.DropGameItemIndex[Type] + --if self.SaveGames.GameDrop[Name] == nil then + -- self.SaveGames.GameDrop[Name] = {} + --end + local ItemData = { + Type = ArchiveTable.ArchiveType.DropGameItems, + TextVal = string.format('难%d %s', Diff, Name), + Desc = self:GetTypeValue(ArchiveTable.DropGameItems[Name], Diff * Count), + Icon = SaveGameConfigs.Icons.GameDropItems[Name], + } + table.insert(self.SaveGames, ItemData) + end + end +end + +function WBP_SettlementPanel:ShowItem_BossDrop(InData) + if InData == nil then + return + end + -- 检查新增 + local Func = function(Index) + for c, d in pairs(ArchiveTable.BossDropItemIndexs) do + if Index == d then + return c + end + end + end + for BossName, Table in pairs(InData) do + if table.getCount(Table) == 0 then + else + for i, v in pairs(Table) do + local ItemData = { + Desc = self:GetTypeValue(ArchiveTable.BossDropItems[BossName][i].Rewards, v), + Icon = SaveGameConfigs.Icons.BossDropItems[BossName][i], + Type = ArchiveTable.ArchiveType.DropBossItems, + TextVal = string.format('%s之%s', BossName, Func(i)) + } + table.insert(self.SaveGames, ItemData); + end + end + end +end + +return WBP_SettlementPanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_SettlementPanel_Item.lua b/GZJ/Script/UI/WBP_SettlementPanel_Item.lua new file mode 100644 index 00000000..27f17aaf --- /dev/null +++ b/GZJ/Script/UI/WBP_SettlementPanel_Item.lua @@ -0,0 +1,81 @@ +---@class WBP_SettlementPanel_Item_C:UUserWidget +---@field Img_IsMVP UImage +---@field TextBlock_CombatPoint UTextBlock +---@field TextBlock_DamagePercent UTextBlock +---@field TextBlock_PlayerLevel UTextBlock +---@field TextBlock_PlayerName UTextBlock +---@field TextBlock_Score UTextBlock +---@field TextBlock_TotalDamage UTextBlock +--Edit Below-- +local WBP_SettlementPanel_Item = { + bInitDoOnce = false, + IsMVP = false, + IsSelf = false, + + SelfItemColor = + { + SpecifiedColor = + { + R = 1, + G = 0.298039, + B = 0.015686, + A = 1 + }, + ColorUseRule = 0, + }, + OtherItemColor = + { + SpecifiedColor = + { + R = 1, + G = 1, + B = 1, + A = 1 + }, + ColorUseRule = 0, + } +}; + +function WBP_SettlementPanel_Item:Init(PlayerResultData) + self.PlayerResultData = PlayerResultData + + self.TextBlock_PlayerName:SetText(PlayerResultData.PlayerName) + self.TextBlock_PlayerLevel:SetText(PlayerResultData.Level) + + local CombatStr = string.format("%.2fw", math.ceil(PlayerResultData.CombatPoint / 100.0) / 100.0) + self.TextBlock_CombatPoint:SetText(CombatStr) + + local TotalDamageStr = string.format("%.1fw", math.ceil(PlayerResultData.TotalDamage / 1000.0) / 10.0) + self.TextBlock_TotalDamage:SetText(TotalDamageStr) + + local PercentText = tostring(math.ceil(PlayerResultData.DamagePercent * 100)).."%" + self.TextBlock_DamagePercent:SetText(PercentText) + + if PlayerResultData.IsMVP == true then + local Score = PlayerResultData.Score + local ScoreText = tostring(Score - 2).."+2" + self.TextBlock_Score:SetText(ScoreText) + else + self.TextBlock_Score:SetText(PlayerResultData.Score) + end + + self:SetTextBlockColor(PlayerResultData.PlayerKey) + self:SetMVPImageVisibility(PlayerResultData.IsMVP) +end + +function WBP_SettlementPanel_Item:SetTextBlockColor(InPlayerKey) + local LocalPlayerState = GameDataManager.GetLocalPlayerState() + local Color = (LocalPlayerState and LocalPlayerState.PlayerKey == InPlayerKey) and self.SelfItemColor or self.OtherItemColor + self.TextBlock_PlayerName:SetColorAndOpacity(Color) + self.TextBlock_PlayerLevel:SetColorAndOpacity(Color) + self.TextBlock_CombatPoint:SetColorAndOpacity(Color) + self.TextBlock_TotalDamage:SetColorAndOpacity(Color) + self.TextBlock_DamagePercent:SetColorAndOpacity(Color) + self.TextBlock_Score:SetColorAndOpacity(Color) +end + +function WBP_SettlementPanel_Item:SetMVPImageVisibility(IsMVP) + self.Img_IsMVP:SetVisibility(IsMVP and ESlateVisibility.SelfHitTestInvisible or ESlateVisibility.Collapsed) +end + +return WBP_SettlementPanel_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_Skill_Item.lua b/GZJ/Script/UI/WBP_Skill_Item.lua new file mode 100644 index 00000000..99620a2b --- /dev/null +++ b/GZJ/Script/UI/WBP_Skill_Item.lua @@ -0,0 +1,57 @@ +---@class WBP_Skill_Item_C:UUserWidget +---@field Button_Select UNewButton +---@field Image_Skill_Icon UImage +---@field TextBlock_SkillDesc UTextBlock +---@field TextBlock_SkillName UTextBlock +---@field TextBlock_SkillShortDesc UTextBlock +--Edit Below-- +local WBP_Skill_Item = { + bInitDoOnce = false, + BindedSkillName = nil, + ParentPanel = nil, +}; + +function WBP_Skill_Item:Construct() + self.Button_Select:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.Button_Select.OnClicked:Add(WBP_Skill_Item.OnSelectButtonClicked, self) + self.Button_Select:SetTouchMethod(EButtonTouchMethod.PreciseTap) +end + +function WBP_Skill_Item:Destruct() + self.BindedSkillName = nil + self.Button_Select.OnClicked:Remove(WBP_Skill_Item.OnSelectButtonClicked, self) +end + +function WBP_Skill_Item:Init(SkillAccessType, SkillName) + self.BindedSkillAccessType = SkillAccessType + self.BindedSkillName = SkillName + self.TextBlock_SkillName:SetText(GameDataManager.GetSkillNameStrByName(SkillName)) + self.TextBlock_SkillDesc:SetText(GameDataManager.GetSkillDescByName(SkillName)) + + if self.BindedSkillAccessType == ESkillAccessType.Talented then + self.TextBlock_SkillShortDesc:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.TextBlock_SkillShortDesc:SetText(GameDataManager.GetTalentSkillShortDescByName(SkillName)) + else + self.TextBlock_SkillShortDesc:SetVisibility(ESlateVisibility.Collapsed) + end + + UIManager.LoadTexture(self.Image_Skill_Icon, GameDataManager.GetSkillIconPathByName(SkillName)) + + self.Button_Select:SetVisibility(ESlateVisibility.Visible) +end + +function WBP_Skill_Item:OnSelectButtonClicked() + if self.BindedSkillName == nil then + return + end + if self.ParentPanel then + self.ParentPanel:OnSelectionChanged() + end + UIManager:GetPanel(EUIType.SelectSkill):SetSelectItem(self.BindedSkillName) + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_GiveSkill", self.BindedSkillName, nil, nil) + + NewPlayerGuideManager:RemoveGuide(3) +end + +return WBP_Skill_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_TeamPanel.lua b/GZJ/Script/UI/WBP_TeamPanel.lua new file mode 100644 index 00000000..e11414e7 --- /dev/null +++ b/GZJ/Script/UI/WBP_TeamPanel.lua @@ -0,0 +1,88 @@ +---@class WBP_TeamPanel_C:UUserWidget +---@field Panel_AttackBossInfo UWBP_AttackBossPanel_C +---@field PlayerList UVerticalBox +---@field Team_Item_1 UWBP_TeamPanel_Item_C +---@field Team_Item_2 UWBP_TeamPanel_Item_C +---@field Team_Item_3 UWBP_TeamPanel_Item_C +---@field Team_Item_4 UWBP_TeamPanel_Item_C +---@field TextBlock_CoinPoint UTextBlock +---@field TextBlock_KillPoint UTextBlock +--Edit Below-- +local WBP_TeamPanel = { + bInitDoOnce = false, + + TeamInfoPanels = {}, +}; + +function WBP_TeamPanel:Construct() + WBP_TeamPanel.SuperClass.Construct(self) + self.Panel_AttackBossInfo:Construct() --engine bug fixed: 按理说construct不需要手动调用 + + self.TeamInfoPanels = { + self.Team_Item_1, + self.Team_Item_2, + self.Team_Item_3, + self.Team_Item_4, + } + + for Idx, TeamItem in pairs(self.TeamInfoPanels) do + TeamItem:SetVisibility(ESlateVisibility.Collapsed) + end + + self:Init() + self:RegisterEvents() +end + +function WBP_TeamPanel:Destruct() + self:UnRegisterEvents() + WBP_TeamPanel.SuperClass.Destruct(self) +end + +function WBP_TeamPanel:RegisterEvents() + EventSystem:AddListener(EventType.PlayerDataListChanged, WBP_TeamPanel.OnPlayerDataListChanged, self) + EventSystem:AddListener(EventType.PlayerCoinPointChanged, WBP_TeamPanel.OnPlayerCoinPointChanged, self) + EventSystem:AddListener(EventType.PlayerKillPointChanged, WBP_TeamPanel.OnPlayerKillPointChanged, self) + EventSystem:AddListener(EventType.OnGameStageChanged, WBP_TeamPanel.OnGameStageChange, self) +end + +function WBP_TeamPanel:UnRegisterEvents() + EventSystem:RemoveListener(EventType.PlayerDataListChanged, WBP_TeamPanel.OnPlayerDataListChanged, self) + EventSystem:RemoveListener(EventType.PlayerCoinPointChanged, WBP_TeamPanel.OnPlayerCoinPointChanged, self) + EventSystem:RemoveListener(EventType.PlayerKillPointChanged, WBP_TeamPanel.OnPlayerKillPointChanged, self) + EventSystem:RemoveListener(EventType.OnGameStageChanged, WBP_TeamPanel.OnGameStageChange, self) +end + +function WBP_TeamPanel:Init() + self:OnPlayerDataListChanged(UGCGameSystem.GameState.PlayerDataList) + self:OnPlayerCoinPointChanged(GameDataManager.GetLocalPlayerState().CoinPoint.Current) + self:OnPlayerKillPointChanged(GameDataManager.GetLocalPlayerState().KillPoint.Current) + self:OnGameStageChange(UGCGameSystem.GameState.GameStage) +end + +function WBP_TeamPanel:OnPlayerDataListChanged(InPlayerDataList) + for PlayerKey, PlayerData in pairs(InPlayerDataList) do + UE.Log("[WBP_TeamPanel:OnPlayerDataListChanged] IndexInTeam=%d, PlayerKey=%d, PlayerName=%s", PlayerData.IdxInTeam, PlayerData.PlayerKey, PlayerData.PlayerName) + local TeamInfoItem = self.TeamInfoPanels[PlayerData.IdxInTeam] + if TeamInfoItem then + TeamInfoItem:SetPlayerData(PlayerData) + end + end +end + +function WBP_TeamPanel:OnPlayerCoinPointChanged(InCoinPoint) + self.TextBlock_CoinPoint:SetText(tostring(math.ceil(InCoinPoint).." ")) +end + +function WBP_TeamPanel:OnPlayerKillPointChanged(InKillPoint) + self.TextBlock_KillPoint:SetText(tostring(math.ceil(InKillPoint).." ")) +end + +function WBP_TeamPanel:OnGameStageChange(InGameStage) + if InGameStage >= EGameStage.GameFight then + self.Panel_AttackBossInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + self.Panel_AttackBossInfo:SetVisibility(ESlateVisibility.Collapsed) + end +end + +return WBP_TeamPanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_TeamPanel_Item.lua b/GZJ/Script/UI/WBP_TeamPanel_Item.lua new file mode 100644 index 00000000..2c56e32c --- /dev/null +++ b/GZJ/Script/UI/WBP_TeamPanel_Item.lua @@ -0,0 +1,194 @@ +---@class WBP_TeamPanel_Item_C:UUserWidget +---@field Image_IDBG UImage +---@field Image_ItemBG UImage +---@field Image_PlayerOffOnline UImage +---@field Image_Space1 UImage +---@field Image_UpdateAttack UImage +---@field Panel_Offline UCanvasPanel +---@field ProgressBar_HP UProgressBar +---@field TextBlock_KillPoint UTextBlock +---@field TextBlock_Level UTextBlock +---@field TextBlock_Lv UTextBlock +---@field TextBlock_PlayerName UTextBlock +---@field TextBlock_TeamIndex UTextBlock +---@field WidgetSwitcher_BG UWidgetSwitcher +---@field WidgetSwitcher_Space UWidgetSwitcher +---@field WidgetSwitcher_Update UWidgetSwitcher +--Edit Below-- +local WBP_TeamPanel_Item = { + bInitDoOnce = false, + + IdxInTeam = 0, + PlayerKey = 0, + + CombatPoint = 0; + HideUpdateTimer = nil; + + TeamColorList = { + { R = 0.806952, G = 0.715693, B = 0.052861, A = 1.0 }, + { R = 1, G = 0.191202, B = 0.051269, A = 1.0 }, + { R = 0.43735, G = 0.219526, B = 0.396755, A = 1.0 }, + { R = 0.723055, G = 0.020289, B = 0.011612, A = 1.0 }, + }, +}; + +function WBP_TeamPanel_Item:Destruct() + EventSystem:RemoveListener(EventType.OnPlayerHPChanged, WBP_TeamPanel_Item.OnPlayerHPChanged, self) + EventSystem:RemoveListener(EventType.OnPlayerLevelChanged, WBP_TeamPanel_Item.OnPlayerLevelChange, self) + EventSystem:RemoveListener(EventType.OnPlayerCombatPointChanged, WBP_TeamPanel_Item.OnPlayerCombatPointChanged, self) + + self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.Collapsed); + + WBP_TeamPanel_Item.SuperClass.Destruct(self) +end + +function WBP_TeamPanel_Item:SetPlayerData(InPlayerData) + if self.bInitDoOnce then + return + end + self.bInitDoOnce = true + + if InPlayerData.PlayerKey == nil then + UE.Log("[WBP_TeamPanel_Item:SetPlayerData] [Error] Invalid PlayerData") + return + end + + self:SetVisibility(ESlateVisibility.HitTestInvisible) + self.TextBlock_Lv:SetVisibility(ESlateVisibility.Collapsed) + self.TextBlock_Level:SetVisibility(ESlateVisibility.Collapsed) + self.TextBlock_KillPoint:SetVisibility(ESlateVisibility.Collapsed) + + self.PlayerKey = InPlayerData.PlayerKey + self.IdxInTeam = InPlayerData.IdxInTeam + self.PlayerName = InPlayerData.PlayerName + self.IsOffline = InPlayerData.IsOffline + self.IsDead = InPlayerData.IsDead + UE.Log("[WBP_TeamPanel_Item:SetPlayerData] PlayerKey = %d, IdxInTeam = %d, PlayerName = %s, IsOffline = %s, IsDead = %s", self.PlayerKey, self.IdxInTeam, self.PlayerName, tostring(self.IsOffline), tostring(self.IsDead)) + + self:Init() +end + +function WBP_TeamPanel_Item:Init() + self:SetIndexInTeam() + self:SetPlayerName() + self:SetIsOffline() + self:SetIsDead() + + self:InitData() +end + +function WBP_TeamPanel_Item:InitData() + local RelatedPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) + local CurHP = UGCPawnAttrSystem.GetHealth(RelatedPawn) + local MaxHP = UGCPawnAttrSystem.GetHealthMax(RelatedPawn) + self:OnPlayerHPChanged(self.PlayerKey, CurHP, MaxHP, 0) + self:OnPlayerLevelChange(UGCGameSystem.GameState:GetAllPlayerLevel()) + self:OnPlayerCombatPointChanged(UGCGameSystem.GameState.PlayerCombatPointList) + + EventSystem:AddListener(EventType.OnPlayerHPChanged, WBP_TeamPanel_Item.OnPlayerHPChanged, self) + EventSystem:AddListener(EventType.OnPlayerLevelChanged, WBP_TeamPanel_Item.OnPlayerLevelChange, self) + EventSystem:AddListener(EventType.OnPlayerCombatPointChanged, WBP_TeamPanel_Item.OnPlayerCombatPointChanged, self) +end + +function WBP_TeamPanel_Item:SetPlayerName() + self.TextBlock_PlayerName:SetText(self.PlayerName) +end + +function WBP_TeamPanel_Item:SetIndexInTeam() + self.TextBlock_TeamIndex:SetText(tostring(self.IdxInTeam)) + local TeamColor = self.TeamColorList[self.IdxInTeam] + if TeamColor ~= nil then + self.Image_IDBG:SetColorAndOpacity(TeamColor) + -- 设置中间分割的颜色 + self.Image_Space1:SetColorAndOpacity(TeamColor) + + local TextColor = { + SpecifiedColor = { + R = TeamColor.R, + G = TeamColor.G, + B = TeamColor.B, + A = TeamColor.A + }, + ColorUseRule = 0, + } + -- 设置等级的颜色 + self.TextBlock_Level:SetColorAndOpacity(TextColor) + end +end + +function WBP_TeamPanel_Item:SetIsOffline() + if self.IsOffline == false then + self.Image_PlayerOffOnline:SetVisibility(ESlateVisibility.Collapsed) + else + self.Image_PlayerOffOnline:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +function WBP_TeamPanel_Item:SetIsDead() + if self.IsDead == false then + self.WidgetSwitcher_BG:SetActiveWidgetIndex(0) + self.WidgetSwitcher_Space:SetActiveWidgetIndex(0) + else + self.WidgetSwitcher_BG:SetActiveWidgetIndex(1) + self.WidgetSwitcher_Space:SetActiveWidgetIndex(1) + end +end + +function WBP_TeamPanel_Item:SetPlayerLevel(InLevel) + self.TextBlock_Lv:SetVisibility(ESlateVisibility.HitTestInvisible) + self.TextBlock_Level:SetVisibility(ESlateVisibility.HitTestInvisible) + self.TextBlock_Level:SetText(tostring(InLevel)) +end + +function WBP_TeamPanel_Item:SetPlayerCombatPoint(InCombatPoint) + self.CombatPoint = InCombatPoint + self.TextBlock_KillPoint:SetVisibility(ESlateVisibility.HitTestInvisible) + self.TextBlock_KillPoint:SetText(tostring(InCombatPoint)) +end + +function WBP_TeamPanel_Item:OnPlayerHPChanged(PlayerKey, CurHP, MaxHP, PrevHP) + if self.PlayerKey == PlayerKey then + self.ProgressBar_HP:SetPercent(CurHP / MaxHP) + end +end + +function WBP_TeamPanel_Item:OnPlayerLevelChange(InAllPlayerLevel) + for PlayerKey, Level in pairs(InAllPlayerLevel) do + if PlayerKey == self.PlayerKey then + self:SetPlayerLevel(Level) + return + end + end +end + +function WBP_TeamPanel_Item:OnPlayerCombatPointChanged(InAllCombatPoint) + for PlayerKey, CombatPoint in pairs(InAllCombatPoint) do + if PlayerKey == self.PlayerKey then + local Val = CombatPoint - 7082 + CombatPoint = math.clamp(Val, 0, CombatPoint) + + if CombatPoint > self.CombatPoint then + -- 显示上升 + self.WidgetSwitcher_Update:SetActiveWidgetIndex(0); + self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + elseif CombatPoint < self.CombatPoint then + self.WidgetSwitcher_Update:SetActiveWidgetIndex(1); + self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + else + self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.Collapsed) + end + + if UE.IsValid(self.HideUpdateTimer) then + -- 隐藏 + EventSystem.StopTimer(self.HideUpdateTimer); + end + self.HideUpdateTimer = EventSystem.SetTimer(self, function() + self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.Collapsed); + end, 1) + self:SetPlayerCombatPoint(CombatPoint) + return + end + end +end + +return WBP_TeamPanel_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_TechnologyPanel.lua b/GZJ/Script/UI/WBP_TechnologyPanel.lua new file mode 100644 index 00000000..c546eb9a --- /dev/null +++ b/GZJ/Script/UI/WBP_TechnologyPanel.lua @@ -0,0 +1,46 @@ +---@class WBP_TechnologyPanel_C:UUserWidget +---@field Image_Alert UImage +---@field Panel_BG UWBP_WidgetHeader_C +---@field TextBlock_KillPoint UTextBlock +---@field UniformGridPanel_Technology UUniformGridPanel +--Edit Below-- +local WBP_TechnologyPanel = { bInitDoOnce = false; }; + +-- Construct +function WBP_TechnologyPanel:Construct() + self.Panel_BG.UIType = EUIType.Tech + self.Panel_BG:Construct() + + EventSystem:AddListener(EventType.PlayerKillPointChanged, self.ChangeKillPoint, self) + local TargetPlayerState = GameDataManager.GetLocalPlayerState() + self:ChangeKillPoint(TargetPlayerState.KillPoint.Current) + -- 先隐藏 + self:SetAlert(false) +end + +function WBP_TechnologyPanel:OnShowPanel() + NewPlayerGuideManager:RemoveGuide(10) +end + +function WBP_TechnologyPanel:Destruct() + EventSystem:RemoveListener(EventType.PlayerKillPointChanged, self.ChangeKillPoint, self) +end + +function WBP_TechnologyPanel:SetAlert(IsShow) + if IsShow then + self.Image_Alert:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + -- 关闭警告 + EventSystem.SetTimer(self, function() + self:SetAlert(false) + end, 2.5) + else + self.Image_Alert:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_TechnologyPanel:ChangeKillPoint(NewKillPoint) + self.TextBlock_KillPoint:SetText(string.format('%d', NewKillPoint)) +end + + +return WBP_TechnologyPanel; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_TechnologyPanel_Item.lua b/GZJ/Script/UI/WBP_TechnologyPanel_Item.lua new file mode 100644 index 00000000..cefadc1b --- /dev/null +++ b/GZJ/Script/UI/WBP_TechnologyPanel_Item.lua @@ -0,0 +1,124 @@ +---@class WBP_TechnologyPanel_Item_C:UUserWidget +---@field Button_Buy UButton +---@field Img_Icon_Technology UImage +---@field Overlay_Buy UOverlay +---@field Panel_Limit UHorizontalBox +---@field TextBlock_6 UTextBlock +---@field TextBlock_BuffDesc UTextBlock +---@field TextBlock_BuffValue UTextBlock +---@field TextBlock_Cost UTextBlock +---@field TextBlock_Limit UTextBlock +---@field WidgetSwitcher_Buy UWidgetSwitcher +---@field Index int32 +---@field Icon UTexture2D +---@field Desc FText +---@field BuffValue float +---@field BuyLimit int32 +---@field Limit bool +---@field BuyCost int32 +--Edit Below-- +local WBP_TechnologyPanel_Item = { + bInitDoOnce = false; + NextNum = 0; +}; + +function WBP_TechnologyPanel_Item:Construct() + self:LuaInit() + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + if PC and PC:GetCurPlayerState() then + local Val = PC:GetCurPlayerState().TechBuyNum[self.Index] + if Val ~= nil then + if Tables.Tech[self.Index].bLimit and Tables.Tech[self.Index].LimitNum <= Val then + self:SetCanNotBuy() + self.BuyCost = Tables.Tech[self.Index].KillingPoints(Val) + else + self.BuyCost = Tables.Tech[self.Index].KillingPoints(Val + 1) + end + end + end + self.Img_Icon_Technology:SetBrushFromTexture(UE.LoadObject(Tables.Tech[self.Index].Icon)) + print("WBP_TechnologyPanel_Item_Fun_" .. "Construct " .. "self.Index : " .. self.Index .. " self.BuyCost : " .. self.BuyCost) + EventSystem:AddListener(EventType.PlayerBuyTechSucceed, WBP_TechnologyPanel_Item.BuyTechSucceed, self) + +end + +function WBP_TechnologyPanel_Item:Destruct() + EventSystem:RemoveListener(EventType.PlayerBuyTechSucceed, WBP_TechnologyPanel_Item.BuyTechSucceed, self) +end + +function WBP_TechnologyPanel_Item:LuaInit() + if self.bInitDoOnce then + return + end + self.bInitDoOnce = true + self.TextBlock_BuffValue:BindingProperty("Text", self.TextBlock_BuffValue_Text, self) + self.Panel_Limit:BindingProperty("Visibility", self.Panel_Limit_Visibility, self) + self.TextBlock_Limit:BindingProperty("Text", self.TextBlock_Limit_Text, self) + self.Button_Buy.OnClicked:Add(self.Button_Buy_OnClicked, self) + self.TextBlock_Cost:BindingProperty("Text", self.TextBlock_Cost_Text, self) +end + +function WBP_TechnologyPanel_Item:TextBlock_BuffValue_Text(ReturnValue) + if self.BuffValue >= 1 then + self.TextBlock_6:SetVisibility(ESlateVisibility.Collapsed) + return string.format('%.0f', self.BuffValue) + end + self.TextBlock_6:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + return tostring(math.ceil(self.BuffValue * 100.0)); +end + +function WBP_TechnologyPanel_Item:Panel_Limit_Visibility(ReturnValue) + return self.BuyLimit <= 0 and ESlateVisibility.Collapsed or ESlateVisibility.SelfHitTestInvisible +end + +function WBP_TechnologyPanel_Item:TextBlock_Limit_Text(ReturnValue) + return tostring(self.BuyLimit); +end + +function WBP_TechnologyPanel_Item:TextBlock_Cost_Text(ReturnValue) + return tostring(self.BuyCost); +end + +function WBP_TechnologyPanel_Item:CheckMoney(InMoney) + local PS = GameDataManager.GetLocalPlayerState(); + return PS.KillPoint.Current > InMoney +end + +function WBP_TechnologyPanel_Item:GetMoney() + return Tables.Tech[self.Index].KillingPoints(self.NextNum) +end + +function WBP_TechnologyPanel_Item:Button_Buy_OnClicked() + if self:CheckMoney(self:GetMoney()) then + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + UnrealNetwork.CallUnrealRPC(PC, PC, "ServerRPC_BuyTech", self.Index) + + EventSystem:SendEvent(EventType.ForceGuide_TechBuy) + else + UIManager:GetPanel(EUIType.Tech):SetAlert(true) + end + + NewPlayerGuideManager:RemoveGuide(16) + return nil; +end + +function WBP_TechnologyPanel_Item:BuyTechSucceed(TechID, BuyNum) + if TechID == self.Index then + if Tables.Tech[TechID].Limit == true then + self.BuyLimit = self.BuyLimit - 1 + end + + if Tables.Tech[TechID].bLimit and Tables.Tech[TechID].LimitNum <= BuyNum then + self:SetCanNotBuy() + else + self.NextNum = BuyNum + 1 + self.BuyCost = Tables.Tech[TechID].KillingPoints(BuyNum + 1) + end + end +end + +function WBP_TechnologyPanel_Item:SetCanNotBuy() + self.WidgetSwitcher_Buy:SetActiveWidgetIndex(1) +end + +return WBP_TechnologyPanel_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_Unpacking.lua b/GZJ/Script/UI/WBP_Unpacking.lua new file mode 100644 index 00000000..16e87094 --- /dev/null +++ b/GZJ/Script/UI/WBP_Unpacking.lua @@ -0,0 +1,121 @@ +---@class WBP_Unpacking_C:UUserWidget +---@field ShowUnpacking UWidgetAnimation +---@field CanvasPanel_UnpackingItems UCanvasPanel +---@field Image_Alert UImage +---@field TextBlock_CoinPoint UTextBlock +---@field WBP_Unpacking_Item_C_1 UWBP_Unpacking_Item_C +---@field WBP_Unpacking_Item_C_2 UWBP_Unpacking_Item_C +---@field WBP_Unpacking_Item_C_3 UWBP_Unpacking_Item_C +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_Unpacking = { + bInitDoOnce = false; + UnpackingInsts = nil; + UpdateTipHandle = nil; + + -- 当前拥有的 Money + CurrentCoinPoint = 0; +}; + +-- define a queue class +local Queue = {} + +function Queue:new() + local queue = {first = 0, last = -1} + setmetatable(queue, self) + self.__index = self + return queue +end + +function Queue:push(value) + local last = self.last + 1 + self.last = last + self[last] = value +end + +function Queue:pop() + local first = self.first + if first > self.last then + error("queue is empty") + end + local value = self[first] + self[first] = nil + self.first = first + 1 + return value +end + +function Queue:getCount() + return self.last - self.first +end + +function Queue:isEmpty() + return self.first > self.last +end + +-- test the queue class + +function WBP_Unpacking:Construct() + self.WBP_WidgetHeader.UIType = EUIType.Unpacking + self.WBP_WidgetHeader:Construct() + EventSystem:AddListener(EventType.UnpackingResult, self.UnpackingResult, self) + EventSystem:AddListener(EventType.PlayerCoinPointChanged, self.OnCoinPointChanged, self) + + -- 先隐藏 + self:SetAlert(false) +end + +function WBP_Unpacking:OnShowPanel() + NewPlayerGuideManager:RemoveGuide(11) +end + +-- function WBP_Unpacking:Destruct() + +-- end + +function WBP_Unpacking:SetAlert(IsShow) + if IsShow then + self.Image_Alert:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + -- 关闭警告 + EventSystem.SetTimer(self, function() + self:SetAlert(false) + end, 2.5) + else + self.Image_Alert:SetVisibility(ESlateVisibility.Collapsed) + end +end + +function WBP_Unpacking:UnpackingResult(PlayerKey, Results) + local PCPlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(STExtraGameplayStatics.GetFirstPlayerController(self).Pawn) + if PCPlayerKey == PlayerKey then + if self.UnpackingInsts == nil then + self.UnpackingInsts = Queue:new() + end + for k, v in pairs(Results) do + self.UnpackingInsts:push(v) + print("UnpackingResult_".."UnpackingInsts:push(v):" .. type(v)) + end + end + + if self.UpdateTipHandle == nil then + for i = 1, self.UnpackingInsts:getCount() do + local TargetUnpackingInst = self.UnpackingInsts:pop() + + local NoticeData = { + Text = TargetUnpackingInst.Name, + Color = Tables.ItemRarityColor[TargetUnpackingInst.UnpackingLevel - 1].LinearColor, + } + NoticeTipsTools.ClientNoticeTips(ECustomNoticeType.RollingNotice, NoticeData, ERollingNoticeType.Gain) + end + end +end + +function WBP_Unpacking:OnCoinPointChanged(InNum) + if InNum ~= nil and type(InNum) == "number" then + if InNum > 0.0 and InNum < 1.0 then + InNum = 0 + end + self.TextBlock_CoinPoint:SetText(string.format('%d', InNum)) + end +end + +return WBP_Unpacking; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_UnpackingInfo.lua b/GZJ/Script/UI/WBP_UnpackingInfo.lua new file mode 100644 index 00000000..249d3464 --- /dev/null +++ b/GZJ/Script/UI/WBP_UnpackingInfo.lua @@ -0,0 +1,23 @@ +---@class WBP_UnpackingInfo_C:UUserWidget +---@field TextBlock_Info UTextBlock +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_UnpackingInfo = { bInitDoOnce = false; }; + +function WBP_UnpackingInfo:Construct() + self.WBP_WidgetHeader:Construct() +end + +-- function WBP_UnpackingInfo:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_UnpackingInfo:Destruct() + +-- end + +function WBP_UnpackingInfo:SetInfoText(InText) + self.TextBlock_Info:SetText(InText) +end + +return WBP_UnpackingInfo; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_Unpacking_Item.lua b/GZJ/Script/UI/WBP_Unpacking_Item.lua new file mode 100644 index 00000000..532f49a5 --- /dev/null +++ b/GZJ/Script/UI/WBP_Unpacking_Item.lua @@ -0,0 +1,97 @@ +---@class WBP_Unpacking_Item_C:UUserWidget +---@field Button_UnpackInfo UButton +---@field Button_Unpacking1 UButton +---@field Button_Unpacking10 UButton +---@field Image_Icon UImage +---@field Overlay_UnpackInfo UOverlay +---@field TextBlock_Gold1 UTextBlock +---@field TextBlock_Gold10 UTextBlock +---@field WBP_UnpackingInfo UWBP_UnpackingInfo_C +---@field UnpackingLevel int32 +---@field PressInfoTime float +--Edit Below-- +local WBP_Unpacking_Item = { + bInitDoOnce = false; + bPressInfo = false; + PressTime = 0; +}; + +function WBP_Unpacking_Item:Construct() + self.Button_Unpacking1.OnClicked:Add(WBP_Unpacking_Item.Unpacking1, self) + self.Button_Unpacking10.OnClicked:Add(WBP_Unpacking_Item.Unpacking10, self) + self.TextBlock_Gold1:SetText(tostring(Tables.Unpacking.LevelCoinPoint[self.UnpackingLevel].CoinPoint1)) + self.TextBlock_Gold10:SetText(tostring(Tables.Unpacking.LevelCoinPoint[self.UnpackingLevel].CoinPoint10)) + self.Image_Icon:SetBrushFromTexture(UE.LoadObject(Tables.Unpacking.LevelCoinPoint[self.UnpackingLevel].Icon)); + + self.WBP_UnpackingInfo:SetInfoText(Tables.Unpacking.LevelCoinPoint[self.UnpackingLevel].Info) + self.WBP_UnpackingInfo:SetVisibility(ESlateVisibility.Collapsed) + self.Button_UnpackInfo.OnClicked:Add(WBP_Unpacking_Item.OnClickInfo, self) + self.Button_UnpackInfo.OnPressed:Add(WBP_Unpacking_Item.OnPressInfo, self) + self.Button_UnpackInfo.OnReleased:Add(WBP_Unpacking_Item.OnReleaseInfo, self) + self.bCanEverTick = true +end + +function WBP_Unpacking_Item:Tick(MyGeometry, InDeltaTime) + if self.bPressInfo then + self.PressTime = self.PressTime + InDeltaTime + if self.PressTime > self.PressInfoTime then + -- 执行显示操作 + self:ShowUnpackItemInfo() + end + else + self.PressTime = 0 + end +end + +function WBP_Unpacking_Item:Destruct() + self.Button_Unpacking1.OnClicked:Remove(WBP_Unpacking_Item.Unpacking1, self) + self.Button_Unpacking10.OnClicked:Remove(WBP_Unpacking_Item.Unpacking10, self) +end + +-- 检查钱够不够 +function WBP_Unpacking_Item:CheckMoney(InMoney) + local PS = GameDataManager.GetLocalPlayerState() + return PS.CoinPoint.Current > InMoney; +end + +-- 获取当前需要多少钱 +function WBP_Unpacking_Item:GetMoney(Level, Count) + return Tables.Unpacking.LevelCoinPoint[Level][string.format('CoinPoint') .. tostring(Count)] +end + +function WBP_Unpacking_Item:Unpacking1() + -- 检测当前 Money 够不够 + if self:CheckMoney(self:GetMoney(self.UnpackingLevel, 1)) then + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + UnrealNetwork.CallUnrealRPC(PC, UGCGameSystem.GameState, "Server_RPC_Unpacking", UGCPawnAttrSystem.GetPlayerKeyInt64(PC.Pawn), self.UnpackingLevel, 1) + else + UIManager:GetPanel(EUIType.Unpacking):SetAlert(true) + end +end + +function WBP_Unpacking_Item:Unpacking10() + if self:CheckMoney(self:GetMoney(self.UnpackingLevel, 10)) then + local PC = STExtraGameplayStatics.GetFirstPlayerController(self) + UnrealNetwork.CallUnrealRPC(PC, UGCGameSystem.GameState, "Server_RPC_Unpacking", UGCPawnAttrSystem.GetPlayerKeyInt64(PC.Pawn), self.UnpackingLevel, 10) + else + UIManager:GetPanel(EUIType.Unpacking):SetAlert(true) + end +end + +function WBP_Unpacking_Item:OnClickInfo() +end + +function WBP_Unpacking_Item:OnPressInfo() + self.bPressInfo = true +end + +function WBP_Unpacking_Item:OnReleaseInfo() + self.bPressInfo = false + self.WBP_UnpackingInfo:SetVisibility(ESlateVisibility.Collapsed) +end + +function WBP_Unpacking_Item:ShowUnpackItemInfo() + self.WBP_UnpackingInfo:SetVisibility(ESlateVisibility.SelfHitTestInvisible) +end + +return WBP_Unpacking_Item; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_WeaponAttribute.lua b/GZJ/Script/UI/WBP_WeaponAttribute.lua new file mode 100644 index 00000000..cca1f1ae --- /dev/null +++ b/GZJ/Script/UI/WBP_WeaponAttribute.lua @@ -0,0 +1,169 @@ +---@class WBP_WeaponAttribute_C:UUserWidget +---@field CanvasPanel_Senior UCanvasPanel +---@field CanvasPanel_WeaponDesc UCanvasPanel +---@field Spacer_BaseAttribute USpacer +---@field Spacer_Between USpacer +---@field Spacer_Senior USpacer +---@field TextBlock_Desc UTextBlock +---@field VerticalBox_Base_Left UVerticalBox +---@field VerticalBox_Base_Right UVerticalBox +---@field VerticalBox_Senior_Left UVerticalBox +---@field VerticalBox_Senior_Right UVerticalBox +---@field WBP_WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_WeaponAttribute = { + bInitDoOnce = false; + AttributeItemClass = nil; + AddBaseItemTimer = nil; + WeaponActor = nil; + LoadWeaponActorHandler = nil; +}; + +function WBP_WeaponAttribute:Construct() + self.SuperClass:Construct() + self.WBP_WidgetHeader:Construct() +end + +-- function WBP_WeaponAttribute:Tick(MyGeometry, InDeltaTime) + +-- end + +function WBP_WeaponAttribute:OnShowPanel() + --清空 + self.VerticalBox_Base_Left:ClearChildren() + self.VerticalBox_Base_Right:ClearChildren() + self.VerticalBox_Senior_Left:ClearChildren() + self.VerticalBox_Senior_Right:ClearChildren() + + self.AttributeItemClass = UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/ChildWidgets/WBP_WeaponAttributeItem.WBP_WeaponAttributeItem_C')) + self.WeaponActor = GameDataManager.GetLocalPlayerPawn().WeaponActor + + if not UE.IsValid(self.WeaponActor) then + self.LoadWeaponActorHandler = EventSystem.SetTimerLoop(self, function() + if GameDataManager.GetLocalPlayerPawn().WeaponActor ~= nil then + self.WeaponActor = GameDataManager.GetLocalPlayerPawn().WeaponActor + self:UpdateWeaponAttributes() + EventSystem.StopTimer(self.LoadWeaponActorHandler) + end + end, 0.2) + else + self:UpdateWeaponAttributes() + end + + -- 设置数据 + local Pawn = GameDataManager.GetLocalPlayerPawn() + local WeaponType = GameDataManager.GetWeaponType(Pawn.WeaponActor.CurrentWeaponId) + if WeaponType == nil then + UE.Log("[WBP_WeaponAttribute:OnShowPanel] Data is nil") + return + end + local Table = DropItemMap.WeaponTable[WeaponType] + --self.WBP_WidgetHeader:SetHeaderText(Table.Desc) + self.TextBlock_Desc:SetText('特质:' .. Table.Prop) +end + +function WBP_WeaponAttribute:Destruct() + self.AttributeItemClass = nil + self.AddBaseItemTimer = nil; + self.SuperClass:Destruct() +end + +function WBP_WeaponAttribute:UpdateWeaponAttributes() + local BaseAttributes = self.WeaponActor:GetWeaponBaseAttribute() + local SeniorAttributes = self.WeaponActor:GetWeaponSeniorAttribute() + + local Temp = 0 + for i = 1, table.getCount(BaseAttributes) do + -- TODO 去掉特殊属性 + if true then + Temp = Temp + 1 + end + self:AddBaseItem(Temp, BaseAttributes[i]) + end + + local SeniorCount = table.getCount(SeniorAttributes) + if SeniorCount == 0 then + self.Spacer_Between:SetVisibility(ESlateVisibility.Collapsed) + self.CanvasPanel_Senior:SetVisibility(ESlateVisibility.Collapsed) + else + for i = 1, SeniorCount do + local SeniorAttribute = SeniorAttributes[i] + self:AddSeniorItem(i,SeniorAttribute) + end + + self.Spacer_Between:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + self.CanvasPanel_Senior:SetVisibility(ESlateVisibility.SelfHitTestInvisible) + end +end + +function WBP_WeaponAttribute:CalculateSpacerHeight(InRank) + return (InRank + 1) * 25 +end + +function WBP_WeaponAttribute:SetSpacerHeight(InSpacer, InRank) + InSpacer:SetSize({ X = InSpacer.Size.X, Y = self:CalculateSpacerHeight(InRank) }) +end + +function WBP_WeaponAttribute:AddBaseItem(InCount, InData) + local Rank = (InCount + 1) // 2 + local LeftOrRight = InCount % 2 == 1 + self:SetSpacerHeight(self.Spacer_BaseAttribute, Rank) + -- 创建一个新的 + + if UE.IsValid(self.AttributeItemClass) and UE.IsValid(UGCGameSystem.GameState) then + local AttributeItemWidget = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.AttributeItemClass) + if AttributeItemWidget ~= nil then + if LeftOrRight then + self.VerticalBox_Base_Left:AddChildToVerticalBox(AttributeItemWidget) + else + self.VerticalBox_Base_Right:AddChildToVerticalBox(AttributeItemWidget) + end + else + return + end + local that = self + if not AttributeItemWidget.bHasConstruct then + that.AddBaseItemTimer = EventSystem.SetTimerLoop(self, function() + if AttributeItemWidget.bHasConstruct then + AttributeItemWidget:SetAttributeItem(InData) + EventSystem.StopTimer(that.AddBaseItemTimer) + end + end, 0.2) + else + AttributeItemWidget:SetAttributeItem(InData) + end + end +end + +function WBP_WeaponAttribute:AddSeniorItem(InCount, InData) + local Rank = (InCount + 1) // 2 + local LeftOrRight = InCount % 2 == 1 + self:SetSpacerHeight(self.Spacer_Senior, Rank) + -- 创建一个新的 + + if UE.IsValid(self.AttributeItemClass) and UE.IsValid(UGCGameSystem.GameState) then + local AttributeItemWidget = UserWidget.NewWidgetObjectBP(UGCGameSystem.GameState, self.AttributeItemClass) + if AttributeItemWidget ~= nil then + if LeftOrRight then + self.VerticalBox_Senior_Left:AddChildToVerticalBox(AttributeItemWidget) + else + self.VerticalBox_Senior_Right:AddChildToVerticalBox(AttributeItemWidget) + end + else + return + end + local that = self + if not AttributeItemWidget.bHasConstruct then + self.AddBaseItemTimer = EventSystem.SetTimerLoop(self, function() + if AttributeItemWidget.bHasConstruct then + AttributeItemWidget:SetAttributeItem(InData) + EventSystem.StopTimer(that.AddBaseItemTimer) + end + end, 0.2) + else + AttributeItemWidget:SetAttributeItem(InData) + end + end +end + +return WBP_WeaponAttribute; \ No newline at end of file diff --git a/GZJ/Script/UI/WBP_WeaponDetailsDesc.lua b/GZJ/Script/UI/WBP_WeaponDetailsDesc.lua new file mode 100644 index 00000000..b2004635 --- /dev/null +++ b/GZJ/Script/UI/WBP_WeaponDetailsDesc.lua @@ -0,0 +1,34 @@ +---@class WBP_WeaponDetailsDesc_C:UUserWidget +---@field TextBlock_Desc UTextBlock +---@field WidgetHeader UWBP_WidgetHeader_C +--Edit Below-- +local WBP_WeaponDetailsDesc = { + bInitDoOnce = false; +}; + +function WBP_WeaponDetailsDesc:Construct() + WBP_WeaponDetailsDesc.SuperClass:Construct() + self.WidgetHeader:Construct() +end + +function WBP_WeaponDetailsDesc:OnShowPanel() + local Pawn = GameDataManager.GetLocalPlayerPawn() + local WeaponType = GameDataManager.GetWeaponType(Pawn.WeaponActor.CurrentWeaponId) + if WeaponType == nil then + UE.Log("[WBP_WeaponDetailsDesc:OnShowPanel] Data is nil") + return + end + local Table = DropItemMap.WeaponTable[WeaponType] + self.WidgetHeader:SetHeaderText(Table.Desc) + self.TextBlock_Desc:SetText(Table.Prop) +end + +-- function WBP_WeaponDetailsDesc:Tick(MyGeometry, InDeltaTime) + +-- end + +-- function WBP_WeaponDetailsDesc:Destruct() + +-- end + +return WBP_WeaponDetailsDesc; \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_ActivateHangUpRoom.lua b/GZJ/Script/gamemode/Action_ActivateHangUpRoom.lua new file mode 100644 index 00000000..43165f0a --- /dev/null +++ b/GZJ/Script/gamemode/Action_ActivateHangUpRoom.lua @@ -0,0 +1,29 @@ +local Action_ActivateHangUpRoom = { + +} + +function Action_ActivateHangUpRoom:Execute(...) + local GameState = UGCGameSystem.GameState + if not UE.IsValid(GameState) then + return false + end + + local SpawnerClass = UE.LoadClass(BPClassPath.MonsterSpawner) + if UE.IsValid(SpawnerClass) == false then + UE.LogError("[Action_ActivateHangUpRoom][Execute] SpawnerClass invalid") + return false + end + + local FoundedSpawners = totable(GameplayStatics.GetAllActorsOfClass(self, SpawnerClass, {})) + for _, Spawner in pairs(FoundedSpawners) do + local SpawnerType = Spawner:GetSpawnerType() + if SpawnerType == EMonsterSpawnerType.HangUpRoom and Spawner.TargetPlayerKey > 0 then + Spawner:StartSpawnHangupMonster(10) + UE.Log("[Action_ActivateHangUpRoom][Execute] SetActivated: Spawner[%s]", KismetSystemLibrary.GetObjectName(Spawner)) + end + end + + return true +end + +return Action_ActivateHangUpRoom \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_GameEnd.lua b/GZJ/Script/gamemode/Action_GameEnd.lua new file mode 100644 index 00000000..1e97c09a --- /dev/null +++ b/GZJ/Script/gamemode/Action_GameEnd.lua @@ -0,0 +1,213 @@ +local Action_GameEnd = { + +} + +--Action_GameEnd.IsSetEnd = false; + +function Action_GameEnd:Execute(...) + + -- 只单纯执行一遍 + --if self.IsSetEnd then + -- return true + --end + --self.IsSetEnd = false; + + UE.Log("[Action_GameEnd:Execute]") + + -- local GameState = UGCGameSystem.GameState + -- GameState.GameStage = EGameStage.GameEnd + + -- self:SendGameResultData() + -- self:SendUGCModeBattleResult() + + return true +end + +--发送游戏结算 +function Action_GameEnd:SendGameResultData() + local GameState = UGCGameSystem.GameState + if not GameState then + return false + end + + local GameResultData = {}; + + GameResultData.IsWin = GameState:GetIsGameWin() + GameResultData.GameDifficulty = GameState.GameDifficulty + GameResultData.GameDuration = GameState:GetGameDuration() + GameResultData.PlayerResultDatas = {} + + SoundManager.MulticastPlaySound2D(GameResultData.IsWin and 1 or 2) + + local GameTotalDamage = 0.0 + for PlayerKey, DamageInfoList in pairs(UGCGameSystem.GameState.PlayerDamageList) do + for BossID, DamageValue in pairs(DamageInfoList) do + GameTotalDamage = GameTotalDamage + DamageValue + end + end + + local PlayerStates = UGCGameSystem.GetAllPlayerState(false); + UE.Log("[Action_GameEnd:SendGameResultData] #PlayerStates[%d]", #PlayerStates) + + local Func = function(Id) + return GetItemQualityLevel(Id) + end + + --获取所有玩家信息并汇总 + for i, PlayerState in ipairs(PlayerStates) do + if PlayerState then + print(string.format('[Action_GameEnd:SendGameResultData] 开始执行数据')) + local PlayerResultData = {} + local PlayerGlobalSaveData = {} + + PlayerResultData.UID = PlayerState.UID + PlayerResultData.PlayerKey = PlayerState.PlayerKey + PlayerResultData.PlayerName = PlayerState.PlayerName + PlayerResultData.Level = PlayerState.Level + PlayerResultData.CombatPoint = PlayerState.CombatPoint + PlayerResultData.Gender = PlayerState.PlatformGender + + -- 计算 PlayerState里面的存档数据 + PlayerGlobalSaveData.UID = PlayerState.UID + PlayerState.ArchiveData.GameTimes = PlayerState.ArchiveData.GameTimes + 1 + + -- 判断一下当前有多少个技能 + local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerState.PlayerKey) + local AddCount = 0; + log_tree(string.format("[Action_GameEnd:SendGameResultData] PlayerKey = %d PC.ItemMap[5] = "), PC.ItemMap[5]) + for c, v in pairs(PC.ItemMap[5]) do + if GetItemQualityLevel(c) == EQualityType.Super then + AddCount = AddCount + v; + end + end + + -- 判断当前装备了几个技能 + local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerState.PlayerKey); + -- Slot: SkillInst + log_tree(string.format("[Action_GameEnd:SendGameResultData] PlayerKey = %d Pawn.SkillSystemComponent.SlotToSkillList = "), Pawn.SkillSystemComponent.SlotToSkillList) + for k, v in pairs(Pawn.SkillSystemComponent.SlotToSkillList) do + if v.SkillLevel - 1 == EQualityType.Super then + AddCount = AddCount + 1 + end + end + + PlayerState.ArchiveData.TotalSuperSkill = PlayerState.ArchiveData.TotalSuperSkill + AddCount; + + -- 阉割版 + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 2) + + if GameResultData.IsWin then + print(string.format("[Action_GameEnd:SendGameResultData] 赢游戏了")) + -- 阉割版 + PlayerState.ArchiveData.GameClearanceTimes = PlayerState.ArchiveData.GameClearanceTimes + 1 + PlayerResultData.Score = 10 + GameState.GameDifficulty * 1 + + -- 此处计算游戏通关掉落 + -- 阉割版 + if PlayerState.ArchiveData.GameDropItems == nil then + PlayerState.ArchiveData.GameDropItems = {} + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] = {} + end + + -- 遍历查找对应数据 + local NextDropIndex = 0 + local TotalCount = table.getCount(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty]) + local Temp = {1, 2, 3, 4, 5} + if TotalCount > 0 then + if TotalCount >= 5 then + NextDropIndex = 6 -- 表示掉落碎片 + Temp = {} + else + for d, v in pairs(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty]) do + table.remove(Temp, d) + end + end + end + + if NextDropIndex == 0 then + NextDropIndex = Temp[math.random(1, #Temp)] + if PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] == nil then + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] = {} + end + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1 + else + if PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] == nil then + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1 + else + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1 + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] + end + end + else + print(string.format("[Action_GameEnd:SendGameResultData] 游戏输了")) + -- 失败积分 + PlayerResultData.Score = PlayerState.KillCount.Boss * 2 + end + + print(string.format('[Action_GameEnd:SendGameResultData] 开始记录存档数据')) + + PlayerState.ArchiveData.Score = PlayerResultData.Score + PlayerState.ArchiveData.TotalCoinPoint = PlayerState.ArchiveData.TotalCoinPoint + PlayerState.CoinPoint.Total + PlayerState.ArchiveData.TotalKillPoint = PlayerState.ArchiveData.TotalKillPoint + PlayerState.KillPoint.Total + PlayerState.ArchiveData.GameTimes = PlayerState.ArchiveData.GameTimes + 1 + + if GameResultData.IsWin then + if PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] == nil then + PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] = 0 + end + PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] = PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] + 1 + end + + local TotalDamage = 0.0 + local DamageInfoList = UGCGameSystem.GameState.PlayerDamageList[PlayerState.PlayerKey] + for BossID, DamageValue in pairs(DamageInfoList) do + TotalDamage = TotalDamage + DamageValue + end + -- TODO: 临时数据 + PlayerResultData.IsMVP = false + PlayerResultData.TotalDamage = TotalDamage + PlayerResultData.DamagePercent = GameTotalDamage > 0 and TotalDamage / GameTotalDamage or 0 + + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 5, PlayerResultData.DamagePercent) + ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 8) + log_tree("PlayerState.ArchiveData = ", PlayerState.ArchiveData) + + table.insert(GameResultData.PlayerResultDatas, PlayerResultData); + else + UE.Log("[Action_GameEnd:SendGameResultData] Error: PlayerState is nil!") + end + end + + table.sort(GameResultData.PlayerResultDatas,function(a,b) return a.DamagePercent > b.DamagePercent end) + if GameResultData.IsWin then + GameResultData.PlayerResultDatas[1].IsMVP = true + -- 积分 + GameResultData.PlayerResultDatas[1].Score = GameResultData.PlayerResultDatas[1].Score + 2 + local PS = UGCGameSystem.GetPlayerStateByUID(GameResultData.PlayerResultDatas[1].UID) + PS.ArchiveData.Score = PS.ArchiveData.Score + 2 + end + print(string.format('[Action_GameEnd:SendGameResultData] 接下来执行')) + -- 保存玩家数据到云端 + GameState:SavePlayersData(nil) + + -- 对比玩家数据 + + --EventSystem:SendEvent(EventType.GameEnd, GameResultData); + print(string.format('[Action_GameEnd:SendGameResultData] 结束啦')) + UnrealNetwork.CallUnrealRPC_Multicast(UGCGameSystem.GameState ,"Client_MulticastRPC_SendEvent", EventType.GameEnd, GameResultData); +end + +--UGC模式结算,发送至后台记录 +function Action_GameEnd:SendUGCModeBattleResult() + local PlayerStates = UGCGameSystem.GetAllPlayerState(false) + UE.Log("[Action_GameEnd:SendUGCModeBattleResult] #PlayerStates[%d]", #PlayerStates) + + for i, PlayerState in ipairs(PlayerStates) do + if PlayerState then + UGCGameSystem.SendPlayerSettlement(PlayerState.PlayerKey); + else + UE.Log("[Action_GameEnd:SendUGCModeBattleResult] Error: PlayerState is nil!") + end + end +end + +return Action_GameEnd \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_GameFight.lua b/GZJ/Script/gamemode/Action_GameFight.lua new file mode 100644 index 00000000..8b53dc1d --- /dev/null +++ b/GZJ/Script/gamemode/Action_GameFight.lua @@ -0,0 +1,216 @@ +local Action_GameFight = { + InitialWaitTime = 90.0, +} + +function Action_GameFight:Execute(...) + local GameState = UGCGameSystem.GameState + GameState.GameStage = EGameStage.GameFight + + self.bEnableActionTick = false + + self.CurWaveRemainTime = 0.0 + self.CurWaveElapseTime = 0.0 + self.TimeScale = 1.0 + + self:SetupGameMultiplier() + self:SendAllPlayerToTeleporters() + self:InitAttackWave() + self:InitChallengeMonsterTime() + + self:SetupBGMSoundConfigId(4) + + EventSystem:AddListener(EventType.OnIsInAttackWaveChanged, Action_GameFight.OnIsInAttackWaveChanged, self) + EventSystem:AddListener(EventType.SendPlayersToExercise, Action_GameFight.SendAllPlayerToTeleporters, self) + EventSystem:AddListener(EventType.OnSendGameEnd, Action_GameFight.OnReceiveGameEnd, self) + EventSystem:AddListener(EventType.GM_TimeScale, Action_GameFight.UpdateTimeScale, self) + + UGCGameSystem.SendModeCustomEvent("ActivateHangUpRoom") + return true +end + +function Action_GameFight:SendAllPlayerToTeleporters() + local AllTeleporters ={} + local TeleporterClass = UE.LoadClass(BPClassPath.Teleporter) + if UE.IsValid(TeleporterClass) then + AllTeleporters = totable(GameplayStatics.GetAllActorsOfClass(self, TeleporterClass, {})) + end + if next(AllTeleporters) == nil then + return + end + + local AllPlayers = UGCGameSystem.GetAllPlayerPawn() + for _, PlayerPawn in pairs(AllPlayers) do + if PlayerPawn.IsInArena then + local PlayerKey = UGCPawnAttrSystem.GetPlayerKeyInt64(PlayerPawn) + local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) + if PC and PC.HangUpRoomPlayerStart then + local DestLoc = PC.HangUpRoomPlayerStart:K2_GetActorLocation() + local DestRot = PC.HangUpRoomPlayerStart:K2_GetActorRotation() + PlayerPawn.bShouldDumpCallstackWhenMovingfast = false + PlayerPawn:SetClientLocationOrRotation(DestLoc, DestRot, true, false) + PlayerPawn.bShouldDumpCallstackWhenMovingfast = true + PlayerPawn.IsInArena = false + end + end + end +end + +function Action_GameFight:InitChallengeMonsterTime() + local PlayerStates = UGCGameSystem.GetAllPlayerState(false); + for i, v in pairs(PlayerStates) do + v:InitChallengeMonsterTime(UGCGameSystem.GameState.GameDuration) + end +end + +function Action_GameFight:InitAttackWave() + self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self) + UE.Log("[Action_GameFight:InitAttackWave] EnterStateTime = %.2f", self.EnterStateTime) + + local GameState = UGCGameSystem.GameState + local GameDifficulty = GameState.GameDifficulty + + self.AttackWaveConfig = {} + local Table = Tables.GameFightStageConfig[GameDifficulty] + if Table == nil then + Table = Tables.GameFightStageConfig[4] + end + self.AttackWaveConfig = TableHelper.DeepCopyTable(Table) + self.AttackWaveConfig[0] = { WaitTime = self.InitialWaitTime } + + local TotalWaitTime = self.EnterStateTime + 0.5 + GameState.GameStartTimeStamp = TotalWaitTime + + for Index = 0, table.getCount(self.AttackWaveConfig) - 1 do + local Config = self.AttackWaveConfig[Index] + UE.Log("[Action_GameFight:Execute] Config: Index = %d, WaitTime = %.2f", Index, Config.WaitTime) + end + + self.CurAttackWave = 0 + self.AttackWaveMonsterConfig = nil + self.bIsInLastWave = false + + EventSystem.SetTimer(GameState, function() + self:DispatchEvent() + self.bEnableActionTick = true + end, 0.5) +end + +function Action_GameFight:Update(DeltaSeconds) + if self.bEnableActionTick == false then return end + + local RemainTime = self.CurWaveRemainTime - self.CurWaveElapseTime + if RemainTime > 0.0 then + self.CurWaveElapseTime = self.CurWaveElapseTime + DeltaSeconds * self.TimeScale + else + self:DispatchEvent() + self:AttackWaveCheck() + end + + local GameState = UGCGameSystem.GameState + if GameState then + GameState.GameDuration = math.floor(GameplayStatics.GetRealTimeSeconds(self) - GameState.GameStartTimeStamp) + GameState.GameFightStageRemainTime = math.ceil(math.clamp(RemainTime, 0.0, RemainTime)) + end +end + +function Action_GameFight:DispatchEvent() + if self.bIsInLastWave then + UE.Log("[Action_GameFight:DispatchEvent] GameEnd This Time = %2.2f", GameplayStatics.GetRealTimeSeconds(self)) + self:StopGameFightStage() + return + end + + local WaveConfig = self.AttackWaveConfig[self.CurAttackWave] + + if WaveConfig ~= nil then + self.CurWaveRemainTime = WaveConfig.WaitTime + self.CurWaveElapseTime = 0.0 + self.AttackWaveMonsterConfig = WaveConfig.MonsterNum + + UGCGameSystem.GameState.CurAttackWave = self.CurAttackWave + UE.Log("[Action_GameFight:DispatchEvent] Update GameState.CurAttackWave[%d]", UGCGameSystem.GameState.CurAttackWave) + + self:SpawnAttackMonsters() + end + + self.CurAttackWave = self.CurAttackWave + 1 +end + +function Action_GameFight:SpawnAttackMonsters() + local LogStr = string.format("[Action_GameFight:SpawnAttackMonsters] CurWave = %d, ", self.CurAttackWave) + + local MonsterNum = self.AttackWaveMonsterConfig + if MonsterNum ~= nil then + local NormalMonsterNum = MonsterNum.Normal + local BossMonsterNum = MonsterNum.Boss + LogStr = LogStr..string.format("NormalNum = %d, BossNum = %d",NormalMonsterNum,BossMonsterNum) + + if BossMonsterNum > 0 then + self:SetupBGMSoundConfigId(3) + else + self:SetupBGMSoundConfigId(4) + end + + local AttackWaveSpawner = UGCGameSystem.GameState:GetAttackWaveSpawner() + if UE.IsValid(AttackWaveSpawner) then + AttackWaveSpawner:StartSpawnAttackWave(NormalMonsterNum, BossMonsterNum) + end + else + LogStr = LogStr.."invalid config" + end + UE.Log(LogStr) +end + +function Action_GameFight:AttackWaveCheck() + if self.bIsInLastWave == false and self.CurAttackWave >= table.getCount(self.AttackWaveConfig) then + self.bIsInLastWave = true + + self.AttackWaveConfig[self.CurAttackWave] = self.AttackWaveConfig[self.CurAttackWave - 1].WaitTime + UE.Log("[Action_GameFight:AttackWaveCheck] Final Wave = %d", self.CurAttackWave - 1) + end +end + +function Action_GameFight:StopGameFightStage() + EventSystem:SendEvent(EventType.OnSendGameEnd, "TimeOut") +end + +function Action_GameFight:OnIsInAttackWaveChanged(bIsInAttackWave) + if bIsInAttackWave == false then + local CrystalBP = UGCGameSystem.GameState:GetCrystal() + if UE.IsValid(CrystalBP) then + CrystalBP.CurrentHp = CrystalBP.MaxHp + CrystalBP:OnRep_CurrentHp() + end + end +end + +function Action_GameFight:SetupGameMultiplier() + local GameState = UGCGameSystem.GameState + + local AllPlayers = UGCGameSystem.GetAllPlayerPawn() + local PlayerNum = #AllPlayers + GameState.BossHealthMultiplier = GlobalConfigs.PlayerNumMultiplier[PlayerNum] + + local GameDifficulty = GameState.GameDifficulty + GameState.MonsterHealthAndAttackValueMultiplier.Health = GlobalConfigs.DifficultyMultiplier["Health"][GameDifficulty] + GameState.MonsterHealthAndAttackValueMultiplier.Attack = GlobalConfigs.DifficultyMultiplier["Attack"][GameDifficulty] +end + +function Action_GameFight:SetupBGMSoundConfigId(Id) + if self.CurFightSoundConfigId ~= Id then + self.CurFightSoundConfigId = Id + SoundManager.MulticastPlaySound2D(self.CurFightSoundConfigId) + end +end + +function Action_GameFight:OnReceiveGameEnd(EndReason) + self.bEnableActionTick = false +end + +function Action_GameFight:UpdateTimeScale(Scale) + if Scale ~= self.TimeScale then + self.TimeScale = Scale + end +end + +return Action_GameFight \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_GameReady.lua b/GZJ/Script/gamemode/Action_GameReady.lua new file mode 100644 index 00000000..03f1d01e --- /dev/null +++ b/GZJ/Script/gamemode/Action_GameReady.lua @@ -0,0 +1,99 @@ +local Action_GameReady = { + +} + +function Action_GameReady:Execute(...) + local GameState = UGCGameSystem.GameState + GameState.GameStage = EGameStage.GameReady + + -- 应用默认属性 + GameState:ApplyDefaultAttributes() + + self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self) + UE.Log("[Action_GameReady:Execute] EnterStateTime = %.2f", self.EnterStateTime) + + self.GameStageConfig = TableHelper.DeepCopyTable(Tables.GameReadyStageConfig) + table.sort(self.GameStageConfig, function(a, b) return a.Stage < b.Stage end) + + self.EventTimeLine = {} + local TotalWaitTime = self.EnterStateTime + 0.5 + for Index, Config in pairs(self.GameStageConfig) do + self.EventTimeLine[Index] = TotalWaitTime + TotalWaitTime = TotalWaitTime + tonumber(Config.WaitTime) + UE.Log("[Action_GameReady:Execute] StageConfig1: Index = %d, Stage = %d, WaitTime = %.2f; EventTime = %.2f", Index, Config.Stage, Config.WaitTime, self.EventTimeLine[Index]) + end + + self.EventIndex = 1 + + self.LastConfigCheckFunction = "" + self.LastConfigTriggerUI = -1 + + self.CurWaitTime = -1 + self.LastUpdateRemainTime = -1 + + self.bEnableActionTick = true + UGCGameSystem.GameState:CloseNoticeUI() + + return true +end + +function Action_GameReady:Update(DeltaSeconds) + local CurrentRealTime = GameplayStatics.GetRealTimeSeconds(self) + + if self.CurWaitTime > 0 then + local RemainTime = self.CurWaitTime - (CurrentRealTime - self.EnterStateTime); + RemainTime = RemainTime >= 0 and RemainTime or 0 + + local CurrentUpdateRemainTime = math.ceil(RemainTime) + if self.LastUpdateRemainTime - CurrentUpdateRemainTime >= 1 then + self.LastUpdateRemainTime = CurrentUpdateRemainTime + end + end + + UGCGameSystem.GameState.GameReadyStageRemainTime = math.ceil(self.LastUpdateRemainTime) + + if self.EventTimeLine[self.EventIndex] and math.isNearlyEqual(CurrentRealTime, self.EventTimeLine[self.EventIndex], 0.1) then + self:FinishLastEvent() + self:DispatchEvent(self.EventIndex) + self.EventIndex = self.EventIndex + 1 + end +end + +function Action_GameReady:DispatchEvent(InIndex) + local Config = self.GameStageConfig[InIndex] + UE.Log("[Action_GameReady:DispatchEvent] InIndex = %d, DispatchEvent: Stage = %d, CurTime = %.2f", InIndex, Config.Stage, GameplayStatics.GetRealTimeSeconds(self)) + + UGCGameSystem.GameState.GameReadyStage = Config.Stage; + DOREPONCE(UGCGameSystem.GameState, "GameReadyStage"); + + self.LastConfigCheckFunction = Config.CheckFunction + self.LastConfigTriggerUI = Config.TriggerUI + + self.CurWaitTime = Config.WaitTime + self.LastUpdateRemainTime = self.CurWaitTime + + self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self) + + if next(self.GameStageConfig, InIndex) == nil then + UE.Log("[Action_GameReady:DispatchEvent] Final Index = %d", InIndex) + EventSystem.SetTimer(self, function() + self:FinishLastEvent() + + UGCGameSystem.GameState:CheckAllPlayersDefaultWeaponSelection() + UGCGameSystem.GameState.GameReadyStageRemainTime = -1 + UGCGameSystem.SendModeCustomEvent("EnterGameFightStage") + self.bEnableActionTick = false + end, Config.WaitTime) + end +end + +function Action_GameReady:FinishLastEvent() + if self.LastConfigCheckFunction ~= "" then + UGCGameSystem.GameState[self.LastConfigCheckFunction](UGCGameSystem.GameState) + end + if self.LastConfigTriggerUI ~= -1 then + NoticeTipsTools.MulticastClosePanel(self.LastConfigTriggerUI) + end +end + +return Action_GameReady \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_PlayerExit.lua b/GZJ/Script/gamemode/Action_PlayerExit.lua new file mode 100644 index 00000000..3d989e78 --- /dev/null +++ b/GZJ/Script/gamemode/Action_PlayerExit.lua @@ -0,0 +1,25 @@ +local Action_PlayerExit = { + PlayerKey = 0, +} + +function Action_PlayerExit:Execute(...) + UGCGameSystem.SendPlayerSettlement(self.PlayerKey); + + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + if UGCGameSystem.GameState and PlayerState then + UE.Log("[Action_PlayerExit:Execute] PlayerName = "..PlayerState.PlayerName) + local PlayerData = UGCGameSystem.GameState.PlayerDataList[self.PlayerKey] + if PlayerData ~= nil then + PlayerData.IsOffline = true + end + + local PlayerKeys = UGCTeamSystem.GetPlayerKeysByTeamID(PlayerState.TeamID) + if #PlayerKeys == 0 then + EventSystem:SendEvent(EventType.OnSendGameEnd, "AllPlayerExited") + end + end + + return true +end + +return Action_PlayerExit \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_PlayerKilled.lua b/GZJ/Script/gamemode/Action_PlayerKilled.lua new file mode 100644 index 00000000..cf7d3510 --- /dev/null +++ b/GZJ/Script/gamemode/Action_PlayerKilled.lua @@ -0,0 +1,23 @@ +local Action_PlayerKilled = { + KillerKey = 0, --杀手Key + PlayerKey = 0, --被杀死玩家Key +} + +function Action_PlayerKilled:Execute(...) + + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + if UGCGameSystem.GameState and PlayerState then + UE.Log("[Action_PlayerKilled:Execute] PlayerName = "..PlayerState.PlayerName) + local PlayerData = UGCGameSystem.GameState.PlayerDataList[self.PlayerKey] + if PlayerData ~= nil then + PlayerData.IsDead = true + end + + local RespawnComponent = UGCGameSystem.GetRespawnComponent() + RespawnComponent:AddRespawnPlayerWithTime(self.PlayerKey, 5.0) + end + + return true +end + +return Action_PlayerKilled \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_PlayerLogin.lua b/GZJ/Script/gamemode/Action_PlayerLogin.lua new file mode 100644 index 00000000..1971acb4 --- /dev/null +++ b/GZJ/Script/gamemode/Action_PlayerLogin.lua @@ -0,0 +1,124 @@ +local Action_PlayerLogin = { + PlayerKey = 0, +} + +function Action_PlayerLogin:Execute(...) + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + if UGCGameSystem.GameState and PlayerState then + local LoginPlayerKey = self.PlayerKey + local PlayerAccountInfo = UGCPlayerStateSystem.GetPlayerAccountInfo(LoginPlayerKey):Copy() + UE.Log("[Action_PlayerLogin:Execute] PlayerName = "..PlayerState.PlayerName) + + EventSystem.SetTimer(self, function() + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(LoginPlayerKey) + if PlayerState then + UGCGameSystem.GameState.PlayerDataList[LoginPlayerKey] = + { + IdxInTeam = PlayerState:GetPlayerTeamIndex() + 1, + UID = PlayerState.UID, + PlayerKey = PlayerState.PlayerKey, + PlayerName = PlayerState.PlayerName, + Gender = PlayerAccountInfo.PlatformGender, + TeamID = PlayerState.TeamID, + IsOffline = false, + IsDead = false, + } + end + end, 5.0) + + + PlayerState:SetLevelDirectly(PlayerState.Level) + + local PlayerData = UGCPlayerStateSystem.GetPlayerArchiveData(PlayerState.UID) + PlayerState.ArchiveData = {} + PlayerState.ArchiveData = self:HandleSaveData(PlayerState, PlayerData) + + -- 存一份 + PlayerState.SavedArchiveData = TableHelper.DeepCopyTable(PlayerState.ArchiveData) + + -- 仅同步一次 + DOREPONCE(PlayerState, "SavedArchiveData") + --UGCGameSystem.GameState:TestPlayerSaveData(PlayerState) + -- 加载对应数据 + PlayerState:LoadNewGameInitialData() + + if UGCGameSystem.GameState.GameStage <= EGameStage.WaitForPlayer then + local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(self.PlayerKey) + UnrealNetwork.CallUnrealRPC(PC, PC, "ClientRPC_ShowInitialPanel", true); + end + end + + return true +end + +--- 每局游戏通关之类保存的数据 +---{ +--- Version = "", +--- ArchiveData = { +--- GameTimes = 0, --游玩局数 +--- GameClearanceTimes = 0, --游戏通关数 +--- TotalCoinPoint = 0, --获取总金币数 +--- TotalKillPoint = 0, --获取总杀敌点数 +--- TotalBossKilledTimes = 0, --击杀 Boss 次数 +--- TotalSuperSkill = 0, --获取总超级技能数 +--- TotalSuperFitting = 0, --获取超级配件数 +--- TotalUnpackTimes = 0, --总开箱次数 +--- Score = 0, --总开箱次数 +--- +--- PlayedGames = { --游玩过的游戏 +--- Difficulty = Times +--- } +--- } +---} +function Action_PlayerLogin:HandleSaveData(InPlayerState, InPlayerData) + print(string.format('[Action_PlayerLogin:HandleSaveData] 开始加载数据')) + if InPlayerData == nil or table.isEmpty(InPlayerData) then + print(string.format('[Action_PlayerLogin:HandleSaveData] 此时 InPlayerData == nil')) + else + log_tree('InPlayerData = ', InPlayerData) + end + + if InPlayerData ~= nil and not table.isEmpty(InPlayerData) then + if InPlayerData.Version == Version.GetCurrentVersion() then + print(string.format('[Action_PlayerLogin:HandleSaveData] 获取到当前版本的数据')) + + -- TODO 测试用,正式可以取消也可以不取消 + self:AutoCompare(InPlayerState.ArchiveData, InPlayerData) + return InPlayerData.ArchiveData + else + print(string.format('[Action_PlayerLogin:HandleSaveData] 版本号是 %s,请做相应处理', InPlayerData.Version)) + --- 使用方法:然后添加新增字段,设置该值为默认值即可 + --- 例如:新增了字段 Test,可以不用字段 + --- InPlayerData.ArchiveData.Test = 0 + --- return InPlayerData.ArchiveData + --- + --- 这句话的作用是给新加的数据一个默认初始化 + local Archive = InPlayerState:InitArchiveData() + -- self:AutoCompare(Archive, InPlayerData) + local ArchiveData = InPlayerData.ArchiveData + + -- 测试版本 + ArchiveData = InPlayerState:InitArchiveData() + + return ArchiveData + end + end + + print(string.format('[Action_PlayerLogin:HandleSaveData] 说明是第一次加载数据')) + local ItemData = InPlayerState:InitArchiveData() + return ItemData +end + +function Action_PlayerLogin:AutoCompare(ItemData, InPlayerData) + for i, v in pairs(ItemData) do + if InPlayerData[i] == nil then + if type(v) == 'table' then + self:AutoCompare(ItemData[i], InPlayerData[i]) + else + ItemData[i] = v + end + end + end +end + +return Action_PlayerLogin \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_PlayerRespawn.lua b/GZJ/Script/gamemode/Action_PlayerRespawn.lua new file mode 100644 index 00000000..0445ca7d --- /dev/null +++ b/GZJ/Script/gamemode/Action_PlayerRespawn.lua @@ -0,0 +1,32 @@ +local Action_PlayerRespawn = { + PlayerKey = 0, + bIsAI = false, +} + +function Action_PlayerRespawn:Execute(...) + if self.bIsAI == true then + return false + end + + local PlayerState = UGCGameSystem.GetPlayerStateByPlayerKey(self.PlayerKey) + local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.PlayerKey) + if UGCGameSystem.GameState and PlayerState and PlayerController then + UE.Log("[Action_PlayerRespawn:Execute] PlayerKey = %d, PlayerName = %s", self.PlayerKey, PlayerState.PlayerName) + local PlayerData = UGCGameSystem.GameState.PlayerDataList[self.PlayerKey] + if PlayerData ~= nil then + PlayerData.IsDead = false + end + + -- 玩家死亡次数 + local PlayerDieData = UGCGameSystem.GameState.PlayerDieTimes[self.PlayerKey] + if PlayerDieData == nil then + UGCGameSystem.GameState.PlayerDieTimes[self.PlayerKey] = 1 + else + UGCGameSystem.GameState.PlayerDieTimes[self.PlayerKey] = UGCGameSystem.GameState.PlayerDieTimes[self.PlayerKey] + 1 + end + end + + return true +end + +return Action_PlayerRespawn \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_SendCustomEvent.lua b/GZJ/Script/gamemode/Action_SendCustomEvent.lua new file mode 100644 index 00000000..9de38add --- /dev/null +++ b/GZJ/Script/gamemode/Action_SendCustomEvent.lua @@ -0,0 +1,11 @@ +local Action_SendCustomEvent = { + EventName = "", +} + +function Action_SendCustomEvent:Execute(...) + UGCGameSystem.SendModeCustomEvent(self.EventName) + + return true +end + +return Action_SendCustomEvent; \ No newline at end of file diff --git a/GZJ/Script/gamemode/Action_WaitPlayerJoin.lua b/GZJ/Script/gamemode/Action_WaitPlayerJoin.lua new file mode 100644 index 00000000..594b0621 --- /dev/null +++ b/GZJ/Script/gamemode/Action_WaitPlayerJoin.lua @@ -0,0 +1,50 @@ +local Action_WaitPlayerJoin = { + WaitTime = 0, +} + +function Action_WaitPlayerJoin:Execute(...) + local GameState = UGCGameSystem.GameState + GameState.GameStage = EGameStage.WaitForPlayer + + self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self) + self.LastUpdateRemainTime = self.WaitTime + self.JoinedPlayerNum = 0 + self.bOverBigWorld = false + + self.bEnableActionTick = true + + EventSystem:AddListener(EventType.UpdateInitialWidget, self.OnUpdateInitialWidget, self) + print(string.format("[Action_WaitPlayerJoin:Execute] WaitTime = %d", self.WaitTime)) + + return true +end + +function Action_WaitPlayerJoin:OnUpdateInitialWidget() + print(string.format("[Action_WaitPlayerJoin:OnUpdateInitialWidget] 执行")) + self.EnterStateTime = 0 + self.bOverBigWorld = true +end + +function Action_WaitPlayerJoin:Update(DeltaSeconds) + local CurrentRealTime = GameplayStatics.GetRealTimeSeconds(self); + + -- 表示剩余时间 + local RemainTime = self.WaitTime - (CurrentRealTime - self.EnterStateTime); + RemainTime = RemainTime >= 0 and RemainTime or 0 + + local CurrentUpdateRemainTime = math.ceil(RemainTime) + + if self.LastUpdateRemainTime - CurrentUpdateRemainTime >= 1 then + self.JoinedPlayerNum = #UGCGameSystem.GetAllPlayerState(false) + self.LastUpdateRemainTime = CurrentUpdateRemainTime + end + if self.bOverBigWorld or CurrentUpdateRemainTime <= 0 or self.JoinedPlayerNum >= 4 then + self.LastUpdateRemainTime = 0 + self.bEnableActionTick = false + UGCGameSystem.SendModeCustomEvent("EnterGameReadyStage") + end + --更新GameState.WaitPlayerJoinTime + UGCGameSystem.GameState.WaitPlayerJoinTime = self.LastUpdateRemainTime +end + +return Action_WaitPlayerJoin \ No newline at end of file diff --git a/GZJ/UGCmap.umap b/GZJ/UGCmap.umap new file mode 100644 index 00000000..738f12a8 Binary files /dev/null and b/GZJ/UGCmap.umap differ diff --git a/GZJ/WhiteList.ini b/GZJ/WhiteList.ini new file mode 100644 index 00000000..336eb73c --- /dev/null +++ b/GZJ/WhiteList.ini @@ -0,0 +1,25 @@ +[WhiteList] +WhiteListUsrIdNum=21 +WhiteListUsrId0=410202098 +WhiteListUsrId1=410332045 +WhiteListUsrId2=410331901 +WhiteListUsrId3=410332046 +WhiteListUsrId4=410335894 +WhiteListUsrId5=410338172 +WhiteListUsrId6=410338758 +WhiteListUsrId7=310334516 +WhiteListUsrId8=410350755 +WhiteListUsrId9=410364737 +WhiteListUsrId10=410373679 +WhiteListUsrId11=410362415 +WhiteListUsrId12=410374588 +WhiteListUsrId13=410374591 +WhiteListUsrId14=410383482 +WhiteListUsrId15=410383537 +WhiteListUsrId16=410383539 +WhiteListUsrId17=410383540 +WhiteListUsrId18=410384342 +WhiteListUsrId19=410384222 +WhiteListUsrId20=410386628 + + diff --git a/GZJ/workspace.code-workspace b/GZJ/workspace.code-workspace new file mode 100644 index 00000000..7abf182e --- /dev/null +++ b/GZJ/workspace.code-workspace @@ -0,0 +1,14 @@ +{ + "folders": [ + { + "path": "..\\BreakSiege" + }, + { + "path": "..\\..\\Content\\LuaHelper" + }, + { + "path": "..\\..\\Saved\\Logs\\BreakSiege" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/InfFire/Asset/Blueprint/SceneObj/Machine/BP_MachineBase.uasset b/InfFire/Asset/Blueprint/SceneObj/Machine/BP_MachineBase.uasset index 0a578a65..f84ca00a 100644 Binary files a/InfFire/Asset/Blueprint/SceneObj/Machine/BP_MachineBase.uasset and b/InfFire/Asset/Blueprint/SceneObj/Machine/BP_MachineBase.uasset differ diff --git a/InfFire/Asset/Blueprint/SceneObj/Machine/BP_Machine_BaseItem.uasset b/InfFire/Asset/Blueprint/SceneObj/Machine/BP_Machine_BaseItem.uasset index 9ba2eff5..0c814077 100644 Binary files a/InfFire/Asset/Blueprint/SceneObj/Machine/BP_Machine_BaseItem.uasset and b/InfFire/Asset/Blueprint/SceneObj/Machine/BP_Machine_BaseItem.uasset differ diff --git a/InfFire/Asset/Blueprint/SceneObj/Machine/BP_Machine_Jump.uasset b/InfFire/Asset/Blueprint/SceneObj/Machine/BP_Machine_Jump.uasset index 1b493391..d11b8af9 100644 Binary files a/InfFire/Asset/Blueprint/SceneObj/Machine/BP_Machine_Jump.uasset and b/InfFire/Asset/Blueprint/SceneObj/Machine/BP_Machine_Jump.uasset differ diff --git a/InfFire/Asset/Blueprint/SceneObj/Start/BP_ActorStart.uasset b/InfFire/Asset/Blueprint/SceneObj/Start/BP_ActorStart.uasset index b57e1586..b67a6ef0 100644 Binary files a/InfFire/Asset/Blueprint/SceneObj/Start/BP_ActorStart.uasset and b/InfFire/Asset/Blueprint/SceneObj/Start/BP_ActorStart.uasset differ diff --git a/InfFire/Asset/Blueprint/UGCGameMode.uasset b/InfFire/Asset/Blueprint/UGCGameMode.uasset index 3880a386..b48b072c 100644 Binary files a/InfFire/Asset/Blueprint/UGCGameMode.uasset and b/InfFire/Asset/Blueprint/UGCGameMode.uasset differ diff --git a/InfFire/Asset/Blueprint/UGCGameState.uasset b/InfFire/Asset/Blueprint/UGCGameState.uasset index a3e2b544..b11e13e5 100644 Binary files a/InfFire/Asset/Blueprint/UGCGameState.uasset and b/InfFire/Asset/Blueprint/UGCGameState.uasset differ diff --git a/InfFire/Asset/Blueprint/UGCLevelDirector.uasset b/InfFire/Asset/Blueprint/UGCLevelDirector.uasset index eedde193..0a575b54 100644 Binary files a/InfFire/Asset/Blueprint/UGCLevelDirector.uasset and b/InfFire/Asset/Blueprint/UGCLevelDirector.uasset differ diff --git a/InfFire/Asset/Blueprint/UGCPlayerController.uasset b/InfFire/Asset/Blueprint/UGCPlayerController.uasset index b3c8f775..e414d7fe 100644 Binary files a/InfFire/Asset/Blueprint/UGCPlayerController.uasset and b/InfFire/Asset/Blueprint/UGCPlayerController.uasset differ diff --git a/InfFire/Asset/Blueprint/UGCPlayerPawn.uasset b/InfFire/Asset/Blueprint/UGCPlayerPawn.uasset index ed36f57c..18b8673c 100644 Binary files a/InfFire/Asset/Blueprint/UGCPlayerPawn.uasset and b/InfFire/Asset/Blueprint/UGCPlayerPawn.uasset differ diff --git a/InfFire/Asset/Blueprint/UGCPlayerStartManager.uasset b/InfFire/Asset/Blueprint/UGCPlayerStartManager.uasset index 6c1bb388..92ee4083 100644 Binary files a/InfFire/Asset/Blueprint/UGCPlayerStartManager.uasset and b/InfFire/Asset/Blueprint/UGCPlayerStartManager.uasset differ diff --git a/InfFire/Asset/Blueprint/UGCPlayerState.uasset b/InfFire/Asset/Blueprint/UGCPlayerState.uasset index ff479420..d3993a08 100644 Binary files a/InfFire/Asset/Blueprint/UGCPlayerState.uasset and b/InfFire/Asset/Blueprint/UGCPlayerState.uasset differ diff --git a/InfFire/Asset/Levels/Map_Ruins.umap b/InfFire/Asset/Levels/Map_Ruins.umap index 31b60be9..84417a0d 100644 Binary files a/InfFire/Asset/Levels/Map_Ruins.umap and b/InfFire/Asset/Levels/Map_Ruins.umap differ diff --git a/InfFire/Asset/UGCLayout_BP.uasset b/InfFire/Asset/UGCLayout_BP.uasset index a3037e70..6040dd28 100644 Binary files a/InfFire/Asset/UGCLayout_BP.uasset and b/InfFire/Asset/UGCLayout_BP.uasset differ diff --git a/InfFire/Asset/UI/GameEnd/WB_GameEnd.uasset b/InfFire/Asset/UI/GameEnd/WB_GameEnd.uasset index e11f62ac..be729a2e 100644 Binary files a/InfFire/Asset/UI/GameEnd/WB_GameEnd.uasset and b/InfFire/Asset/UI/GameEnd/WB_GameEnd.uasset differ diff --git a/InfFire/Asset/UI/InTest/Log/WB_TestLog.uasset b/InfFire/Asset/UI/InTest/Log/WB_TestLog.uasset index d734256b..5649eab3 100644 Binary files a/InfFire/Asset/UI/InTest/Log/WB_TestLog.uasset and b/InfFire/Asset/UI/InTest/Log/WB_TestLog.uasset differ diff --git a/InfFire/Asset/UI/InTest/Log/WB_TestLogItem.uasset b/InfFire/Asset/UI/InTest/Log/WB_TestLogItem.uasset index 2bf7f5dd..d659302d 100644 Binary files a/InfFire/Asset/UI/InTest/Log/WB_TestLogItem.uasset and b/InfFire/Asset/UI/InTest/Log/WB_TestLogItem.uasset differ diff --git a/InfFire/Asset/UI/InTest/WB_InTest_Side.uasset b/InfFire/Asset/UI/InTest/WB_InTest_Side.uasset index 066e51c7..05022806 100644 Binary files a/InfFire/Asset/UI/InTest/WB_InTest_Side.uasset and b/InfFire/Asset/UI/InTest/WB_InTest_Side.uasset differ diff --git a/InfFire/Asset/UI/InTest/WB_TestButtonItem.uasset b/InfFire/Asset/UI/InTest/WB_TestButtonItem.uasset index 9aaf8554..9e875d04 100644 Binary files a/InfFire/Asset/UI/InTest/WB_TestButtonItem.uasset and b/InfFire/Asset/UI/InTest/WB_TestButtonItem.uasset differ diff --git a/InfFire/Asset/UI/Round/WB_RoundEnd.uasset b/InfFire/Asset/UI/Round/WB_RoundEnd.uasset index 2fa752ea..524a53a9 100644 Binary files a/InfFire/Asset/UI/Round/WB_RoundEnd.uasset and b/InfFire/Asset/UI/Round/WB_RoundEnd.uasset differ diff --git a/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponItem.uasset b/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponItem.uasset index c54a3038..ee1d6798 100644 Binary files a/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponItem.uasset and b/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponItem.uasset differ diff --git a/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponItems.uasset b/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponItems.uasset index d8bbe36c..33426a5e 100644 Binary files a/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponItems.uasset and b/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponItems.uasset differ diff --git a/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponPartItem.uasset b/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponPartItem.uasset index dd8a13fa..2864f8c7 100644 Binary files a/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponPartItem.uasset and b/InfFire/Asset/UI/SelectWeapons/Child/WB_SelectWeaponPartItem.uasset differ diff --git a/InfFire/Asset/UI/SelectWeapons/Child/WB_WeaponItem.uasset b/InfFire/Asset/UI/SelectWeapons/Child/WB_WeaponItem.uasset index 2ae7e7a1..3cdd2d55 100644 Binary files a/InfFire/Asset/UI/SelectWeapons/Child/WB_WeaponItem.uasset and b/InfFire/Asset/UI/SelectWeapons/Child/WB_WeaponItem.uasset differ diff --git a/InfFire/Asset/UI/SelectWeapons/Child/WB_WeaponList.uasset b/InfFire/Asset/UI/SelectWeapons/Child/WB_WeaponList.uasset index b0c73230..eed43cb6 100644 Binary files a/InfFire/Asset/UI/SelectWeapons/Child/WB_WeaponList.uasset and b/InfFire/Asset/UI/SelectWeapons/Child/WB_WeaponList.uasset differ diff --git a/InfFire/Asset/UI/SelectWeapons/WB_SelectWeapon.uasset b/InfFire/Asset/UI/SelectWeapons/WB_SelectWeapon.uasset index c226cc0f..2e020f7e 100644 Binary files a/InfFire/Asset/UI/SelectWeapons/WB_SelectWeapon.uasset and b/InfFire/Asset/UI/SelectWeapons/WB_SelectWeapon.uasset differ diff --git a/InfFire/Asset/UI/SelectWeapons/WB_SelectWeapons.uasset b/InfFire/Asset/UI/SelectWeapons/WB_SelectWeapons.uasset index 0f414f86..045525e4 100644 Binary files a/InfFire/Asset/UI/SelectWeapons/WB_SelectWeapons.uasset and b/InfFire/Asset/UI/SelectWeapons/WB_SelectWeapons.uasset differ diff --git a/InfFire/Asset/UI/Tool/Child/WB_KDAInfoItem.uasset b/InfFire/Asset/UI/Tool/Child/WB_KDAInfoItem.uasset index 61a03f2a..72204eda 100644 Binary files a/InfFire/Asset/UI/Tool/Child/WB_KDAInfoItem.uasset and b/InfFire/Asset/UI/Tool/Child/WB_KDAInfoItem.uasset differ diff --git a/InfFire/Asset/UI/Tool/WB_BuyButton.uasset b/InfFire/Asset/UI/Tool/WB_BuyButton.uasset index 9ec6db7b..33ae19b0 100644 Binary files a/InfFire/Asset/UI/Tool/WB_BuyButton.uasset and b/InfFire/Asset/UI/Tool/WB_BuyButton.uasset differ diff --git a/InfFire/Asset/UI/Tool/WB_FaceNotice.uasset b/InfFire/Asset/UI/Tool/WB_FaceNotice.uasset index bcce21b5..82455241 100644 Binary files a/InfFire/Asset/UI/Tool/WB_FaceNotice.uasset and b/InfFire/Asset/UI/Tool/WB_FaceNotice.uasset differ diff --git a/InfFire/Asset/UI/Tool/WB_KDALine.uasset b/InfFire/Asset/UI/Tool/WB_KDALine.uasset index f41bb944..0a1118d6 100644 Binary files a/InfFire/Asset/UI/Tool/WB_KDALine.uasset and b/InfFire/Asset/UI/Tool/WB_KDALine.uasset differ diff --git a/InfFire/Asset/UI/Tool/WB_PID.uasset b/InfFire/Asset/UI/Tool/WB_PID.uasset index f83e1fe7..3472e772 100644 Binary files a/InfFire/Asset/UI/Tool/WB_PID.uasset and b/InfFire/Asset/UI/Tool/WB_PID.uasset differ diff --git a/InfFire/Asset/UI/Tool/WB_SelectPartButton.uasset b/InfFire/Asset/UI/Tool/WB_SelectPartButton.uasset index 3c0c493c..70c60c6a 100644 Binary files a/InfFire/Asset/UI/Tool/WB_SelectPartButton.uasset and b/InfFire/Asset/UI/Tool/WB_SelectPartButton.uasset differ diff --git a/InfFire/Asset/UI/Tool/WB_SelectPartItem.uasset b/InfFire/Asset/UI/Tool/WB_SelectPartItem.uasset index 06ddd370..92a32b22 100644 Binary files a/InfFire/Asset/UI/Tool/WB_SelectPartItem.uasset and b/InfFire/Asset/UI/Tool/WB_SelectPartItem.uasset differ diff --git a/InfFire/Asset/UI/Tool/WB_SelectParts.uasset b/InfFire/Asset/UI/Tool/WB_SelectParts.uasset index fd846771..79c7b353 100644 Binary files a/InfFire/Asset/UI/Tool/WB_SelectParts.uasset and b/InfFire/Asset/UI/Tool/WB_SelectParts.uasset differ diff --git a/InfFire/Asset/UI/WB_Main.uasset b/InfFire/Asset/UI/WB_Main.uasset index 794b3f47..32f8134b 100644 Binary files a/InfFire/Asset/UI/WB_Main.uasset and b/InfFire/Asset/UI/WB_Main.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_AvatarFrame_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_AvatarFrame_UIBP.uasset index 2352f08a..77670945 100644 Binary files a/InfFire/Asset/UMGTemplate/General_AvatarFrame_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_AvatarFrame_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_CheckBoxButton.uasset b/InfFire/Asset/UMGTemplate/General_CheckBoxButton.uasset index 65cf5db8..558150ec 100644 Binary files a/InfFire/Asset/UMGTemplate/General_CheckBoxButton.uasset and b/InfFire/Asset/UMGTemplate/General_CheckBoxButton.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_GameFailure_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_GameFailure_UIBP.uasset index 55d7af16..45ca8b95 100644 Binary files a/InfFire/Asset/UMGTemplate/General_GameFailure_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_GameFailure_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_GameTopBlueTips_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_GameTopBlueTips_UIBP.uasset index fa9bbad1..6780325d 100644 Binary files a/InfFire/Asset/UMGTemplate/General_GameTopBlueTips_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_GameTopBlueTips_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_GameTopRedTips_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_GameTopRedTips_UIBP.uasset index 92ed9f8d..b2588bad 100644 Binary files a/InfFire/Asset/UMGTemplate/General_GameTopRedTips_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_GameTopRedTips_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_GameVictory_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_GameVictory_UIBP.uasset index 0c2bfa3d..c43245e0 100644 Binary files a/InfFire/Asset/UMGTemplate/General_GameVictory_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_GameVictory_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Ingame_BloodVolButton.uasset b/InfFire/Asset/UMGTemplate/General_Ingame_BloodVolButton.uasset index f9e92072..5de23a53 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Ingame_BloodVolButton.uasset and b/InfFire/Asset/UMGTemplate/General_Ingame_BloodVolButton.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Ingame_RingButton.uasset b/InfFire/Asset/UMGTemplate/General_Ingame_RingButton.uasset index 4159e016..1dabb0d0 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Ingame_RingButton.uasset and b/InfFire/Asset/UMGTemplate/General_Ingame_RingButton.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Ingame_SquareButton.uasset b/InfFire/Asset/UMGTemplate/General_Ingame_SquareButton.uasset index e9584157..9f8e91fa 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Ingame_SquareButton.uasset and b/InfFire/Asset/UMGTemplate/General_Ingame_SquareButton.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_NoticeLeftKillTips_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_NoticeLeftKillTips_UIBP.uasset index 822cb29e..53e28bbd 100644 Binary files a/InfFire/Asset/UMGTemplate/General_NoticeLeftKillTips_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_NoticeLeftKillTips_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_NoticeTopTips_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_NoticeTopTips_UIBP.uasset index 0fb39707..d7f8fafa 100644 Binary files a/InfFire/Asset/UMGTemplate/General_NoticeTopTips_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_NoticeTopTips_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Player_infoBar_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_Player_infoBar_UIBP.uasset index 710ab7de..861678fe 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Player_infoBar_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_Player_infoBar_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_SecondLevelButton_1.uasset b/InfFire/Asset/UMGTemplate/General_SecondLevelButton_1.uasset index 4aa0d629..a6def399 100644 Binary files a/InfFire/Asset/UMGTemplate/General_SecondLevelButton_1.uasset and b/InfFire/Asset/UMGTemplate/General_SecondLevelButton_1.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_SecondLevelButton_2.uasset b/InfFire/Asset/UMGTemplate/General_SecondLevelButton_2.uasset index 3ddb06e3..8616df07 100644 Binary files a/InfFire/Asset/UMGTemplate/General_SecondLevelButton_2.uasset and b/InfFire/Asset/UMGTemplate/General_SecondLevelButton_2.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_SecondLevelButton_3.uasset b/InfFire/Asset/UMGTemplate/General_SecondLevelButton_3.uasset index 75a37370..d2169f7b 100644 Binary files a/InfFire/Asset/UMGTemplate/General_SecondLevelButton_3.uasset and b/InfFire/Asset/UMGTemplate/General_SecondLevelButton_3.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Shop/General_Currency_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_Shop/General_Currency_UIBP.uasset index 8d70a786..b22adf58 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Shop/General_Currency_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_Shop/General_Currency_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Shop/General_ShopItem_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_Shop/General_ShopItem_UIBP.uasset index 955cd711..0477f189 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Shop/General_ShopItem_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_Shop/General_ShopItem_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Shop/General_ShopMain_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_Shop/General_ShopMain_UIBP.uasset index 22e37904..8f6f5b3b 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Shop/General_ShopMain_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_Shop/General_ShopMain_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Shop/General_ShopPlay_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_Shop/General_ShopPlay_UIBP.uasset index 56c54d53..43f88ec7 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Shop/General_ShopPlay_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_Shop/General_ShopPlay_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Shop/General_ShopPreviewItem_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_Shop/General_ShopPreviewItem_UIBP.uasset index c027eea3..947e59ab 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Shop/General_ShopPreviewItem_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_Shop/General_ShopPreviewItem_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_SlideModeButton.uasset b/InfFire/Asset/UMGTemplate/General_SlideModeButton.uasset index adddf62a..3128b9d4 100644 Binary files a/InfFire/Asset/UMGTemplate/General_SlideModeButton.uasset and b/InfFire/Asset/UMGTemplate/General_SlideModeButton.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_SwitchButton.uasset b/InfFire/Asset/UMGTemplate/General_SwitchButton.uasset index bd7e6ab1..6faeeac8 100644 Binary files a/InfFire/Asset/UMGTemplate/General_SwitchButton.uasset and b/InfFire/Asset/UMGTemplate/General_SwitchButton.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_TMode_Discard_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_TMode_Discard_UIBP.uasset index 34225c7f..40206379 100644 Binary files a/InfFire/Asset/UMGTemplate/General_TMode_Discard_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_TMode_Discard_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/General_Team_ScoreBoard_UIBP.uasset b/InfFire/Asset/UMGTemplate/General_Team_ScoreBoard_UIBP.uasset index 76dd926f..e3e4faf9 100644 Binary files a/InfFire/Asset/UMGTemplate/General_Team_ScoreBoard_UIBP.uasset and b/InfFire/Asset/UMGTemplate/General_Team_ScoreBoard_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_EditLocation.uasset b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_EditLocation.uasset index e14646c5..d8ea34b3 100644 Binary files a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_EditLocation.uasset and b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_EditLocation.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_ItemSelect.uasset b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_ItemSelect.uasset index 08d45ef3..ab51fb6a 100644 Binary files a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_ItemSelect.uasset and b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_ItemSelect.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_ItemSelect_UIBP.uasset b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_ItemSelect_UIBP.uasset index 1c00ebc5..4d15b98e 100644 Binary files a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_ItemSelect_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_ItemSelect_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Main_UIBP.uasset b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Main_UIBP.uasset index fa6e8ccc..e8887112 100644 Binary files a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Main_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Main_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Playerlist_UIBP.uasset b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Playerlist_UIBP.uasset index 43257490..5a004b8a 100644 Binary files a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Playerlist_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Playerlist_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_PropsItem.uasset b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_PropsItem.uasset index a9a31aa0..421fd227 100644 Binary files a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_PropsItem.uasset and b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_PropsItem.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Props_UIBP.uasset b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Props_UIBP.uasset index 566161c0..6b2c965d 100644 Binary files a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Props_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Props_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Settlement_UIBP.uasset b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Settlement_UIBP.uasset index 98ec0700..09b699d0 100644 Binary files a/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Settlement_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Peekaboo/Peekaboo_Settlement_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/ReuseList2.uasset b/InfFire/Asset/UMGTemplate/ReuseList2.uasset index d369bf89..0535b67d 100644 Binary files a/InfFire/Asset/UMGTemplate/ReuseList2.uasset and b/InfFire/Asset/UMGTemplate/ReuseList2.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Settlement/Common_RankTitleInfo_UIBP.uasset b/InfFire/Asset/UMGTemplate/Settlement/Common_RankTitleInfo_UIBP.uasset index 2850bfbf..19136caa 100644 Binary files a/InfFire/Asset/UMGTemplate/Settlement/Common_RankTitleInfo_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Settlement/Common_RankTitleInfo_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Settlement/General_BattleDataList_UIBP.uasset b/InfFire/Asset/UMGTemplate/Settlement/General_BattleDataList_UIBP.uasset index fa4aab54..098712c1 100644 Binary files a/InfFire/Asset/UMGTemplate/Settlement/General_BattleDataList_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Settlement/General_BattleDataList_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Settlement/General_BattleDetail_UIBP.uasset b/InfFire/Asset/UMGTemplate/Settlement/General_BattleDetail_UIBP.uasset index 09c306af..21ffa708 100644 Binary files a/InfFire/Asset/UMGTemplate/Settlement/General_BattleDetail_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Settlement/General_BattleDetail_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Settlement/General_ListDataBG_UIBP.uasset b/InfFire/Asset/UMGTemplate/Settlement/General_ListDataBG_UIBP.uasset index adc2a6c9..c311caf3 100644 Binary files a/InfFire/Asset/UMGTemplate/Settlement/General_ListDataBG_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Settlement/General_ListDataBG_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Settlement/General_Team_ModeList_UIBP.uasset b/InfFire/Asset/UMGTemplate/Settlement/General_Team_ModeList_UIBP.uasset index 023019f3..553c1832 100644 Binary files a/InfFire/Asset/UMGTemplate/Settlement/General_Team_ModeList_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Settlement/General_Team_ModeList_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Settlement/General_Team_ModeMain_UIBP.uasset b/InfFire/Asset/UMGTemplate/Settlement/General_Team_ModeMain_UIBP.uasset index 93dedbb6..afc954f6 100644 Binary files a/InfFire/Asset/UMGTemplate/Settlement/General_Team_ModeMain_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Settlement/General_Team_ModeMain_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Settlement/General_TitleBattleDetail_UIBP.uasset b/InfFire/Asset/UMGTemplate/Settlement/General_TitleBattleDetail_UIBP.uasset index 59d2a335..f5e5907c 100644 Binary files a/InfFire/Asset/UMGTemplate/Settlement/General_TitleBattleDetail_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Settlement/General_TitleBattleDetail_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/Settlement/General_TopBG_UIBP.uasset b/InfFire/Asset/UMGTemplate/Settlement/General_TopBG_UIBP.uasset index 5aef7e91..3dfbb9c5 100644 Binary files a/InfFire/Asset/UMGTemplate/Settlement/General_TopBG_UIBP.uasset and b/InfFire/Asset/UMGTemplate/Settlement/General_TopBG_UIBP.uasset differ diff --git a/InfFire/Asset/UMGTemplate/UGC_DragDropTextBox.uasset b/InfFire/Asset/UMGTemplate/UGC_DragDropTextBox.uasset index d8da0c8b..d5de4c9b 100644 Binary files a/InfFire/Asset/UMGTemplate/UGC_DragDropTextBox.uasset and b/InfFire/Asset/UMGTemplate/UGC_DragDropTextBox.uasset differ diff --git a/InfFire/InfFire.ugcproj b/InfFire/InfFire.ugcproj index ea3853ba..b177b028 100644 --- a/InfFire/InfFire.ugcproj +++ b/InfFire/InfFire.ugcproj @@ -7,7 +7,7 @@ ProjectShortPath=/InfFire/ StartMapName=/InfFire/UGCmap MapMode=0 bIsBigWorld=0 -Version=1.29.13.13026 +Version=1.29.13.13030 UpdateVersion=5 GameModePath=/InfFire/Asset/Blueprint/UGCGameMode.UGCGameMode_C DefaultLevelDirectorPath=/Asset/Blueprint/UGCLevelDirector.UGCLevelDirector_C @@ -51,13 +51,13 @@ SwitchesInMaps=((Key="r.Mobile.EnableIBL",Value=0),(Key="s.StreamableDelegateLim PlayBindingArray=[] [JobOption] -LastJobId=-1 -LastWindowsJobId=-1 -LastAndroidJobId=-1 -LastIOSJobId=-1 -PakOnly=0 -LastSkipBake=False -LastTargetPlatform=LinuxServer +LastJobId=600042509 +LastWindowsJobId=600027738 +LastAndroidJobId=600027735 +LastIOSJobId=600027738 +PakOnly=1 +LastSkipBake=True +LastTargetPlatform=LinuxServer+WindowsNoEditor+Android_ETC2+IOS+OpenHarmony_ETC2 [UGCUploadOption] PlatformIndex=0 diff --git a/InfFire/Script/Blueprint/Mini/Script/Mini_BoltGod1.lua b/InfFire/Script/Blueprint/Mini/Script/Mini_BoltGod1.lua index bdc3b159..7a332b3e 100644 --- a/InfFire/Script/Blueprint/Mini/Script/Mini_BoltGod1.lua +++ b/InfFire/Script/Blueprint/Mini/Script/Mini_BoltGod1.lua @@ -90,6 +90,7 @@ function Mini_BoltGod1:OnTimeCountDown(InTime, InTotal) end function Mini_BoltGod1:OnRoundFormalStart(InTimes, InTime) + LocalKillNum1 = 0; if IsServer then for i, v in pairs(self.PlayerKDAs) do self.PlayerKDAs[i] = { @@ -262,7 +263,7 @@ end function Mini_BoltGod1:OnRep_PlayerKDAs() -- 同步一下 - if table.isEmpty(self.PlayerKDAs) then return; end + if table.isEmpty(self.PlayerKDAs) then return ; end UGCLogSystem.LogTree(string.format("[Mini_BoltGod1:OnRep_PlayerKDAs] self.PlayerKDAs ="), self.PlayerKDAs) --UGCEventSystem.SendEvent(EventTypes.AllPlayerKDAChange, GameState:Handl); end diff --git a/InfFire/Script/Blueprint/UGCGameMode.lua b/InfFire/Script/Blueprint/UGCGameMode.lua index 301a9af0..42ecd18f 100644 --- a/InfFire/Script/Blueprint/UGCGameMode.lua +++ b/InfFire/Script/Blueprint/UGCGameMode.lua @@ -1,5 +1,4 @@ ---@class UGCGameMode_C:BP_UGCGameBase_C ----@field NewVar_0 bool --Edit Below-- ---@type AUGCGameModeBase local UGCGameMode = {}; diff --git a/InfFire/Script/Blueprint/UGCGameState.lua b/InfFire/Script/Blueprint/UGCGameState.lua index 0bb1dd91..68f251a4 100644 --- a/InfFire/Script/Blueprint/UGCGameState.lua +++ b/InfFire/Script/Blueprint/UGCGameState.lua @@ -35,12 +35,6 @@ function UGCGameState:ReceiveBeginPlay() end if GlobalBeginTool then GlobalBeginTool:ReceiveBeginPlay(); end table.func(MiniGameManager, "ReceiveBeginPlay", self); - - if IsServer then - -- 补人 - --UGCGameSystem.OpenPlayerJoin(); - --UGCGameSystem.ApplyPlayerJoin(1, 1); - end end function UGCGameState:ReceiveTick(DeltaTime) @@ -83,9 +77,12 @@ end ---@param InPlayerKey PlayerKey ---@param InArchiveData table ---@param InAccountData table -function UGCGameState:HandlePlayerDatas(InPlayerKey, InArchiveData, InAccountData) - InArchiveData.GameTimes = InArchiveData.GameTimes + 1; -- 又多玩了一局游戏 +function UGCGameState:HandlePlayerDatas(InPlayerKey, InArchiveData, InAccountData, IgnoreList) + InArchiveData.GameTimes = (InArchiveData.GameTimes or 0) + 1; -- 又多玩了一局游戏 self.ArchiveTable[InPlayerKey] = InArchiveData; + for i, v in pairs(IgnoreList) do + self.ArchiveTable[InPlayerKey][v] = nil; + end self.AccountTable[InPlayerKey] = InAccountData; DOREPONCE(self, "ArchiveTable"); @@ -144,6 +141,7 @@ function UGCGameState:OnRep_ArchiveTable() ArchiveTable = self.ArchiveTable; if table.isEmpty(ArchiveTable) then return ; end if LocalPlayerKey == nil then return ; end + if ArchiveTable[LocalPlayerKey] == nil then return; end local GameTimes = ArchiveTable[LocalPlayerKey].GameTimes if GameTimes ~= nil and GameTimes <= DefaultSettings.ShowFaceNoticeGameTimes then if not DefaultSettings.EnableTest then diff --git a/InfFire/Script/Blueprint/UGCPlayerState.lua b/InfFire/Script/Blueprint/UGCPlayerState.lua index 927c8ff8..de0ce60b 100644 --- a/InfFire/Script/Blueprint/UGCPlayerState.lua +++ b/InfFire/Script/Blueprint/UGCPlayerState.lua @@ -9,8 +9,9 @@ function UGCPlayerState:ReceiveBeginPlay() end function UGCPlayerState:OnKillNumChange(KillCount,bIsAI) - if IsServer then - + if IsClient then + -- 同步击杀数 + UGCLogSystem.Log("[UGCPlayerState:OnKillNumChange] 击杀数 %d", KillCount) end end @@ -19,12 +20,17 @@ end function UGCPlayerState:UpdateWeaponAttachment(Pawn, InWeapon) -- 获取玩家的缓存 UGCLogSystem.Log("[UGCPlayerState:UpdateWeaponAttachment] 执行") - local ArchiveData = ArchiveTable[self.PlayerKey]; - if ArchiveData.Weapons == nil then ArchiveData.Weapons = {}; end + UGCLogSystem.LogTree(string.format("[UGCPlayerState:UpdateWeaponAttachment] Player Archive ="), ArchiveTable[self.PlayerKey]) + if table.isEmpty(ArchiveTable[self.PlayerKey]) then ArchiveTable[self.PlayerKey] = {}; end + if table.isEmpty(ArchiveTable[self.PlayerKey].Weapons) then ArchiveTable[self.PlayerKey].Weapons = {}; end + local ItemId = InWeapon:GetWeaponItemID(); local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(Pawn); local Parts = ItemTool.GetWeaponParts(Weapon); - ArchiveData.Weapons[ItemId] = Parts; + ArchiveTable[self.PlayerKey].Weapons[ItemId] = Parts; + UGCLogSystem.Log("[UGCPlayerState:UpdateWeaponAttachment] 更新配件"); + -- 直接保存即可(主要是没几把枪) + UGCPlayerStateSystem.SavePlayerArchiveData(self.UID, ArchiveTable[self.PlayerKey]); end --function UGCPlayerState:GetReplicatedProperties() diff --git a/InfFire/Script/Global/DefaultSettings.lua b/InfFire/Script/Global/DefaultSettings.lua index d612fea0..121e4587 100644 --- a/InfFire/Script/Global/DefaultSettings.lua +++ b/InfFire/Script/Global/DefaultSettings.lua @@ -1,7 +1,7 @@ --- 默认配置类,可以在此处配置各种参数 DefaultSettings = {} -DefaultSettings.EnableTest = false; --- 是否开启测试 +DefaultSettings.EnableTest = true; --- 是否开启测试 DefaultSettings.ReturnToLobbyTime = 18; -------------------------------- 玩家装备 -------------------------------- ---@type table> diff --git a/InfFire/Script/Global/EventTypes.lua b/InfFire/Script/Global/EventTypes.lua index 944cc47f..693d97e0 100644 --- a/InfFire/Script/Global/EventTypes.lua +++ b/InfFire/Script/Global/EventTypes.lua @@ -23,4 +23,5 @@ EventTypes = { MiniStateChange = AddEventTypeNum(), -- Mini小游戏状态改变 UpdateCurrWeapon = AddEventTypeNum(), -- 当前武器改变 UpdateRoundTimes = AddEventTypeNum(), -- 更新回合次数 + SelfKill = AddEventTypeNum(), -- 更新回合次数 } diff --git a/InfFire/Script/Global/Table/GameDataTable.lua b/InfFire/Script/Global/Table/GameDataTable.lua index a4779670..fdae77b6 100644 --- a/InfFire/Script/Global/Table/GameDataTable.lua +++ b/InfFire/Script/Global/Table/GameDataTable.lua @@ -9,4 +9,5 @@ GameDataTable = { -- 当前队伍ID CurrentTeamID = 1; LocalKillNum = 0; +LocalKillNum1 = 0; MaxKillNum = 0; \ No newline at end of file diff --git a/InfFire/Script/Global/Table/LevelTable.lua b/InfFire/Script/Global/Table/LevelTable.lua index bd5bc33f..ff7525d6 100644 --- a/InfFire/Script/Global/Table/LevelTable.lua +++ b/InfFire/Script/Global/Table/LevelTable.lua @@ -33,7 +33,7 @@ LevelTable.LevelInfo = { --- (X=207721.187500,Y=281974.781250,Z=568.751587) MapCentre = { X=-60.,Y=170.,Z=800. }, MapSize = 14000.0, - MapScale = 30., + MapScale = 15., } }, [LevelTable.ELevelType.Level3] = { @@ -47,18 +47,6 @@ LevelTable.LevelInfo = { MapScale = 30., } }, - --[LevelTable.ELevelType.Level3] = { - -- Icon = UGCGameSystem.GetUGCResourcesFullPath('Asset/Texture/MapTex/T_Level3.T_Level3'), - -- IconSelect = UGCGameSystem.GetUGCResourcesFullPath('Asset/Texture/MapTex/T_Level1Select.T_Level1Select'), - -- ShowName = "沙漠兵工厂", - -- MapName = "Level3", - -- MiniMapInfo = { - -- MapPath = UGCGameSystem.GetUGCResourcesFullPath('T_Level3MiniMap.T_Level3MiniMap'), - -- MapCentre = {X=44500.000000,Y=13500.000000,Z=200.000000}, - -- MapSize = 18000.0, - -- MapScale = 30., - -- } - --}, } --- 是否启用地图 diff --git a/InfFire/Script/Global/Table/WeaponTable.lua b/InfFire/Script/Global/Table/WeaponTable.lua index 01f90107..d4502529 100644 --- a/InfFire/Script/Global/Table/WeaponTable.lua +++ b/InfFire/Script/Global/Table/WeaponTable.lua @@ -1046,7 +1046,7 @@ WeaponSuits = { [EWeaponPartType.Muzzle] = { 201009, 201010, 201011 }, [EWeaponPartType.Telescope] = { 203001, 203002, 203003, 203004, 203014, 203015, }, [EWeaponPartType.Magazine] = { 204013, 204011, 204012, }, - [EWeaponPartType.ButtStock] = { 205002 }, + [EWeaponPartType.ButtStock] = { 205002, }, [EWeaponPartType.SubTelescope] = { 203018, }, }, -- SCAR-L突击步枪 diff --git a/InfFire/Script/Global/Tool/ItemTool.lua b/InfFire/Script/Global/Tool/ItemTool.lua index 4951b189..f29facd1 100644 --- a/InfFire/Script/Global/Tool/ItemTool.lua +++ b/InfFire/Script/Global/Tool/ItemTool.lua @@ -221,13 +221,13 @@ function ItemTool.AddWeaponParts(InPawn, Weapon, IsAppend) local TheList = nil; if WeaponSuits[WeaponId] then TheList = WeaponSuits[WeaponId][EWeaponPartType.Best]; - if not table.isEmpty(TheList) then Items = TheList[math.random(#TheList)]; end + if not table.isEmpty(TheList) then Items = TheList[1]; end end local ArchiveData = ArchiveTable[InPawn.PlayerKey] if ArchiveData ~= nil and ArchiveData.Weapons and ArchiveData.Weapons[WeaponId] then Items = ArchiveData.Weapons[WeaponId]; end - if table.isEmpty(Items) then return end + if table.isEmpty(Items) then return; end UGCLogSystem.LogTree(string.format("[ItemTool.AddWeaponParts] Items ="), Items); for i, v in pairs(Items) do local bHadAdd, Times = false, 5; diff --git a/InfFire/Script/UI/SelectWeapons/WB_SelectWeapon.lua b/InfFire/Script/UI/SelectWeapons/WB_SelectWeapon.lua index 5c13618f..d85b9642 100644 --- a/InfFire/Script/UI/SelectWeapons/WB_SelectWeapon.lua +++ b/InfFire/Script/UI/SelectWeapons/WB_SelectWeapon.lua @@ -20,6 +20,7 @@ function WB_SelectWeapon:LuaInit() self.bInitDoOnce = true; UGCEventSystem.AddListener(EventTypes.AllPlayerKDAChange, self.OnAllPlayerKDAChange, self) + UGCEventSystem.AddListener(EventTypes.SelfKill, self.OnSelfKill, self) UGCEventSystem.AddListener(EventTypes.UpdateCurrWeapon, self.OnUpdateCurrWeapon, self) UGCEventSystem.AddListener(EventTypes.UpdateSelectWeapons, self.OnUpdateSelectWeapons, self) self.WB_PID:LuaInit(); @@ -84,7 +85,6 @@ end WB_SelectWeapon.LastKillCount = 0; function WB_SelectWeapon:OnAllPlayerKDAChange(KDAList) - if table.isEmpty(KDAList) then return end if self.LastKillCount == LocalKillNum then return; end UITool.ForeachAllChildren(self.ScrollBox_List, function(index, Widget) Widget:SetCurrKill(LocalKillNum); @@ -92,6 +92,18 @@ function WB_SelectWeapon:OnAllPlayerKDAChange(KDAList) self.LastKillCount = LocalKillNum; end +function WB_SelectWeapon:OnSelfKill(Kills) + UGCLogSystem.Log("[WB_SelectWeapon:OnSelfKill] Kills = %d", Kills); + UGCEventSystem.SetTimer(self, function() + if LocalKillNum1 > LocalKillNum then + LocalKillNum = LocalKillNum1; + self:OnAllPlayerKDAChange(); + else + LocalKillNum1 = LocalKillNum; + end + end, 0.5) +end + function WB_SelectWeapon:OnUpdateSelectWeapons(Weapons) if table.isEmpty(Weapons) then return; end local Weapon = Weapons[LocalPlayerKey] diff --git a/InfFire/Script/gamemode/Action_PlayerDead.lua b/InfFire/Script/gamemode/Action_PlayerDead.lua index 6fbea76c..c710344a 100644 --- a/InfFire/Script/gamemode/Action_PlayerDead.lua +++ b/InfFire/Script/gamemode/Action_PlayerDead.lua @@ -12,6 +12,13 @@ function Action_PlayerDead:Execute(...) UGCLogSystem.Log("[Action_PlayerDead:Execute] 玩家 %s 被 %s 击杀", tostring(self.DeadPlayerKey), tostring(self.KillerPlayerKey)); MiniGameManager:OnPlayerDead(self.DeadPlayerKey, self.KillerPlayerKey); UGCEventSystem.SendEvent(EventTypes.PlayerDead, self.DeadPlayerKey, self.KillerPlayerKey); + if IsClient then + if LocalPlayerKey == self.KillerPlayerKey and self.DeadPlayerKey ~= self.KillerPlayerKey then + LocalKillNum1 = LocalKillNum1 + 1; + -- 同步一下 + UGCEventSystem.SendEvent(EventTypes.SelfKill, LocalKillNum1); + end + end return true; end diff --git a/InfFire/Script/gamemode/Action_PlayerLeave.lua b/InfFire/Script/gamemode/Action_PlayerLeave.lua index 87ddff36..5c1e5a35 100644 --- a/InfFire/Script/gamemode/Action_PlayerLeave.lua +++ b/InfFire/Script/gamemode/Action_PlayerLeave.lua @@ -7,11 +7,10 @@ function Action_PlayerLeave:Execute(...) ugcprint(string.format("[Action_PlayerLeave] Start settlement %d", self.PlayerKey)); local TeamID = UGCPlayerStateSystem.GetTeamID(self.PlayerKey); UGCPlayerStateSystem.SavePlayerArchiveData(AccountTable[self.PlayerKey].UID, ArchiveTable[self.PlayerKey]); - UGCGameSystem.SendPlayerSettlement(self.PlayerKey); UGCEventSystem.SendEvent(EventTypes.AddPlayer, self.PlayerKey, TeamID, false); UGCLogSystem.Log("[Action_PlayerLeave:Execute] 执行结束") MiniGameManager:OnPlayerLeave(self.PlayerKey); - + UGCGameSystem.SendPlayerSettlement(self.PlayerKey); return true end diff --git a/InfFire/Script/gamemode/Action_PlayerLogin.lua b/InfFire/Script/gamemode/Action_PlayerLogin.lua index 947d78d8..dafbabfe 100644 --- a/InfFire/Script/gamemode/Action_PlayerLogin.lua +++ b/InfFire/Script/gamemode/Action_PlayerLogin.lua @@ -23,12 +23,14 @@ function Action_PlayerLogin:Execute(...) UGCTeamSystem.ChangePlayerTeamID(self.PlayerKey, Info.TeamID); MiniGameManager:OnPlayerLogin(Info.TeamID, self.PlayerKey); - GameState:HandlePlayerDatas(self.PlayerKey, ArchiveData, Info); - - GameState.PlayerKDAs[self.PlayerKey] = GameState.PlayerKDAs[self.PlayerKey] or { 0, 0, }; - + GameState:HandlePlayerDatas(self.PlayerKey, ArchiveData, Info, { + "Weapons" + }); -- 改变队伍编号 UGCEventSystem.SendEvent(EventTypes.AddPlayer, self.PlayerKey, Info.TeamID, true); + + GameState.PlayerKDAs[self.PlayerKey] = GameState.PlayerKDAs[self.PlayerKey] or { 0, 0, }; + DOREPONCE(GameState, "PlayerKDAs"); UGCLogSystem.Log("[Action_PlayerLogin:Execute] 结束执行"); return true end diff --git a/ProjectTemp_T/Script/Global/Tool/ItemTool.lua b/ProjectTemp_T/Script/Global/Tool/ItemTool.lua index 8055d49b..73a2aa2b 100644 --- a/ProjectTemp_T/Script/Global/Tool/ItemTool.lua +++ b/ProjectTemp_T/Script/Global/Tool/ItemTool.lua @@ -210,7 +210,7 @@ function ItemTool.AddWeaponParts(InPawn, Weapon, IsAppend) if WeaponSuits[WeaponId] then TheList = WeaponSuits[WeaponId][EWeaponPartType.Best]; if not table.isEmpty(TheList) then - Items = TheList[math.random(#TheList)]; + Items = TheList[1]; end end local AccountInfo = UGCPlayerStateSystem.GetPlayerAccountInfo(InPawn.PlayerKey) diff --git a/SoldierWar/Script/Global/Tool/ItemTool.lua b/SoldierWar/Script/Global/Tool/ItemTool.lua index b6e273f6..c8cae95d 100644 --- a/SoldierWar/Script/Global/Tool/ItemTool.lua +++ b/SoldierWar/Script/Global/Tool/ItemTool.lua @@ -253,7 +253,7 @@ function ItemTool.AddWeaponParts(InPawn, ItemDefineID, Count) if WeaponSuits[WeaponItemId] then local TheList = WeaponSuits[WeaponItemId][EWeaponPartType.Best]; if not table.isEmpty(TheList) then - AddSubitems = TheList[math.random(#TheList)]; + AddSubitems = TheList[1]; end end end diff --git a/SoloKing/Script/Global/Mini/MiniManager.lua b/SoloKing/Script/Global/Mini/MiniManager.lua index 3742bc0d..8cc65e73 100644 --- a/SoloKing/Script/Global/Mini/MiniManager.lua +++ b/SoloKing/Script/Global/Mini/MiniManager.lua @@ -616,7 +616,7 @@ end --- S & C 玩家在加载好之后进行的初始化操作 function MiniManager:OnPawnInit(Pawn) if IsServer then - UGCLogSystem.LogTree(string.format("[MiniManager:OnPawnInit] GameConfig ="), MiniGameConfig); + --UGCLogSystem.LogTree(string.format("[MiniManager:OnPawnInit] GameConfig ="), MiniGameConfig); UGCLogSystem.Log("[MiniManager:OnPawnInit] self.CurrSelectMap = %s", tostring(self.CurrSelectMap)) if self.CurrSelectMap == nil then return ; end local InitArmors = MiniGameConfig[self.CurrSelectMap].InitArmors; diff --git a/SoloKing/Script/Global/Tool/ItemTool.lua b/SoloKing/Script/Global/Tool/ItemTool.lua index 08da3de2..582c4a5f 100644 --- a/SoloKing/Script/Global/Tool/ItemTool.lua +++ b/SoloKing/Script/Global/Tool/ItemTool.lua @@ -759,4 +759,25 @@ function ItemTool.CurrWeaponAddPart(InPawn, InPart) if Weapon and ItemTool.IsShootWeapon(Weapon) then UGCGunSystem.CreateAndAddGunAttachment(Weapon, InPart); end -end \ No newline at end of file +end + +---@param Weapon ASTExtraShootWeapon +---@return int32[] +function ItemTool.GetWeaponPartList(Weapon) + local Parts = {}; + if Weapon and UE.IsValid(Weapon) and ItemTool.IsShootWeapon(Weapon) then + local SocketTypes = UGCGunSystem.GetAvailableWeaponAttachmentSocketTypeList(Weapon); + for i, v in pairs(SocketTypes) do + local ItemDefineID = UGCGunSystem.GetWeaponAttachmentIDBySocketType(Weapon, v); + if ItemDefineID and ItemDefineID.bValidItem and ItemDefineID.bValidInstance then + table.insert(Parts, ItemDefineID.TypeSpecificID); + end + end + end + return Parts; +end + +function ItemTool.GetCurrWeaponPartList(Pawn) + local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(Pawn); + return ItemTool.GetWeaponPartList(Weapon); +end diff --git a/SoloKing/SoloKing.ugcproj b/SoloKing/SoloKing.ugcproj index b50ddca4..573536dc 100644 --- a/SoloKing/SoloKing.ugcproj +++ b/SoloKing/SoloKing.ugcproj @@ -51,13 +51,13 @@ SwitchesInMaps=((Key="r.Mobile.EnableIBL",Value=0),(Key="s.StreamableDelegateLim PlayBindingArray=[] [JobOption] -LastJobId=600042287 -LastWindowsJobId=600026723 -LastAndroidJobId=600026723 -LastIOSJobId=600026723 -PakOnly=1 -LastSkipBake=True -LastTargetPlatform=LinuxServer+WindowsNoEditor+Android_ETC2+IOS+OpenHarmony_ETC2 +LastJobId=-1 +LastWindowsJobId=-1 +LastAndroidJobId=-1 +LastIOSJobId=-1 +PakOnly=0 +LastSkipBake=False +LastTargetPlatform=LinuxServer [UGCUploadOption] PlatformIndex=0 diff --git a/SoloKing/UGCmap.umap b/SoloKing/UGCmap.umap index bb9e12f5..6579c2f3 100644 Binary files a/SoloKing/UGCmap.umap and b/SoloKing/UGCmap.umap differ diff --git a/TrainingCamp/Script/Global/Tool/ItemTool.lua b/TrainingCamp/Script/Global/Tool/ItemTool.lua index 80f1a6ee..1b1c4564 100644 --- a/TrainingCamp/Script/Global/Tool/ItemTool.lua +++ b/TrainingCamp/Script/Global/Tool/ItemTool.lua @@ -209,7 +209,7 @@ function ItemTool.AddWeaponParts(InPawn, Weapon, IsAppend) if table.isEmpty(Suits) then return end local TheList = WeaponSuits[Weapon:GetWeaponItemID()][EWeaponPartType.Best] if Suits ~= nil and TheList ~= nil then - local Items = TheList[math.random(#TheList)]; + local Items = TheList[1]; if Items ~= nil then UGCLogSystem.LogTree(string.format("[ItemTool.AddWeaponParts] Items ="), Items); for i, v in pairs(Items) do