Compare commits
3 Commits
b009296e20
...
36b75f9b08
Author | SHA1 | Date | |
---|---|---|---|
36b75f9b08 | |||
150f1d59e4 | |||
e3ab04dff9 |
Binary file not shown.
Binary file not shown.
BIN
SoloKing/Asset/UI/Tool/WB_OpenOldWeaponParts.uasset
Normal file
BIN
SoloKing/Asset/UI/Tool/WB_OpenOldWeaponParts.uasset
Normal file
Binary file not shown.
Binary file not shown.
@ -194,6 +194,7 @@ function UGCPlayerController:GetEnableDamageText()
|
||||
if not table.isEmpty(Archive) and not table.isEmpty(Archive.Disables) and Archive.Disables.DamageText ~= nil then
|
||||
self.EnableDamageText = Archive.Disables.DamageText
|
||||
end
|
||||
return self.EnableDamageText;
|
||||
end
|
||||
|
||||
--- 处理切换观战对象
|
||||
|
@ -9,32 +9,15 @@ function UGCPlayerPawn:ReceiveBeginPlay()
|
||||
self.bVaultIsOpen = DefaultSettings.OpenVault;
|
||||
|
||||
self.DamageNotifyDelegate:Add(self.PlayerInjury, self)
|
||||
|
||||
--- 仅客户端
|
||||
--self.OnCharacterShootDelegate:Add(function(Pawn, Weapon)
|
||||
-- UGCLogSystem.Log("[UGCPlayerPawn:ReceiveBeginPlay] %s 开始射击", UE.GetName(Weapon));
|
||||
--end, self);
|
||||
|
||||
--self.OnCharacterStartFireDelegate:Add(function(Pawn, Weapon)
|
||||
-- UGCLogSystem.Log("[UGCPlayerPawn:ReceiveBeginPlay] Weapon = %s 开火", UE.GetName(Weapon))
|
||||
--end, self)
|
||||
end
|
||||
|
||||
--function UGCPlayerPawn:ReceiveTick(DeltaTime)
|
||||
-- self.SuperClass.ReceiveTick(self, DeltaTime);
|
||||
--end
|
||||
|
||||
function UGCPlayerPawn:ReceiveEndPlay()
|
||||
if GlobalTickTool then GlobalTickTool:RemoveTickByOwner(self) end
|
||||
self.SuperClass.ReceiveEndPlay(self);
|
||||
end
|
||||
|
||||
--function UGCPlayerPawn:GetReplicatedProperties()
|
||||
-- return;
|
||||
--end
|
||||
|
||||
function UGCPlayerPawn:GetAvailableServerRPCs()
|
||||
return "UpdateWeaponParts"
|
||||
return "UpdateWeaponParts", "ReplacePartId"
|
||||
end
|
||||
|
||||
function UGCPlayerPawn:ReceivePossessed(NewController)
|
||||
@ -227,14 +210,31 @@ UGCPlayerPawn.SlotWeapons = {};
|
||||
|
||||
---@param Weapons table<ESurviveWeaponPropSlot, int[]> 插槽武器
|
||||
function UGCPlayerPawn:UpdateSlotWeapons(Weapons)
|
||||
|
||||
self.SlotWeapons = TableHelper.DeepCopyTable(Weapons);
|
||||
for i = 0, ESurviveWeaponPropSlot.SWPS_Max do
|
||||
if self.SlotWeapons[i] then
|
||||
self:CheckHasSlotWeapon(i, self.SlotWeapons[i]);
|
||||
end
|
||||
end
|
||||
self:AddAllTelescopes();
|
||||
self:CheckSlotWeapons();
|
||||
end
|
||||
|
||||
function UGCPlayerPawn:AddAllTelescopes()
|
||||
local AllDatas = UGCBackPackSystem.GetAllItemData(self)
|
||||
local HadTeles = {};
|
||||
for i, v in pairs(AllDatas) do
|
||||
if GetItemIdType(v.ItemID) == 203 then
|
||||
HadTeles[v.ItemID] = v.Count;
|
||||
end
|
||||
end
|
||||
-- 直接给他所有的配件
|
||||
for i, v in pairs(WeaponTypeParts[EWeaponPartType.Telescope]) do
|
||||
if HadTeles[v] == nil then
|
||||
ItemTool.AddItem(self, v, 1, false);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- 通过插槽检查武器,需要先配置好之后再启动,该方法仅限两把武器,如果只有一把武器,SlotWeapons的第一个值必须为 SWPS_MainShootWeapon1
|
||||
@ -346,14 +346,14 @@ function UGCPlayerPawn:UpdateWeaponParts(WeaponID, WeaponParts)
|
||||
end
|
||||
end
|
||||
|
||||
UnrealNetwork.CallUnrealRPC(self:GetPlayerControllerSafety(), self, "RecvWeaponParts", WeaponID, WeaponParts);
|
||||
UnrealNetwork.CallUnrealRPC(self:GetPlayerControllerSafety(), self, "RecvParts", WeaponID, WeaponParts);
|
||||
end
|
||||
|
||||
function UGCPlayerPawn:RecvWeaponParts(WeaponID, Parts)
|
||||
function UGCPlayerPawn:RecvParts(WeaponID, Parts)
|
||||
if table.isEmpty(ArchiveTable[LocalPlayerKey]) then ArchiveTable[LocalPlayerKey] = {}; end
|
||||
if table.isEmpty(ArchiveTable[LocalPlayerKey].Weapons) then ArchiveTable[LocalPlayerKey].Weapons = {}; end
|
||||
ArchiveTable[LocalPlayerKey].Weapons[WeaponID] = Parts;
|
||||
UGCLogSystem.LogTree(string.format("[UGCPlayerPawn:RecvWeaponParts] Parts ="), Parts)
|
||||
UGCLogSystem.LogTree(string.format("[UGCPlayerPawn:RecvParts] Parts ="), Parts)
|
||||
UGCEventSystem.SendEvent(EventTypes.UpdateWeapons, WeaponID)
|
||||
end
|
||||
|
||||
|
@ -40,4 +40,6 @@ EventTypes = EventTypes or {
|
||||
AllSelectWeaponsAlready = CountTable(); -- 所有存档数据准备就绪
|
||||
UpdateEnterWeapons = CountTable(); -- 所有存档数据准备就绪
|
||||
UpdateWeapons = CountTable(); -- 所有存档数据准备就绪
|
||||
|
||||
OpenOldWeaponParts = CountTable(); -- 所有存档数据准备就绪
|
||||
}
|
||||
|
@ -546,9 +546,11 @@ function MiniManager:OnMiniRoundFormalStart()
|
||||
end
|
||||
|
||||
function MiniManager:OnMiniRoundEnd()
|
||||
if self.State == MiniGameState.ROUND_GAMING then
|
||||
if self.CurrMiniMode.bGameEnd == false and self.CurrMiniMode.bRoundEnd == false then
|
||||
table.func(self.CurrMiniMode, "OnTimeExhausted", self.State)
|
||||
end
|
||||
end
|
||||
-- 通知结束了
|
||||
UGCLogSystem.Log("[MiniManager:OnMiniRoundEnd] 结束")
|
||||
self.CurrMiniMode.RoundEndTime = UE.GetServerTime();
|
||||
@ -627,36 +629,6 @@ function MiniManager:OnPawnInit(Pawn)
|
||||
end
|
||||
end
|
||||
|
||||
--- 修改伤害函数
|
||||
---@param DamagedActor UGCPlayerPawn_C
|
||||
---@param Damage float
|
||||
---@param DamageType EDamageType
|
||||
---@param EventInstigator UGCPlayerController_C
|
||||
--function MiniManager:OnPlayerDamage(DamagedActor, Damage, DamageType, EventInstigator)
|
||||
-- UGCLogSystem.Log("[MiniManager:OnPlayerDamage] DamagedActor = %s, Damage = %f", UE.GetName(DamagedActor), Damage);
|
||||
-- local CalDamage = table.func(self.CurrMiniMode, 'OnPlayerTakeDamage', DamagedActor, Damage, DamageType, EventInstigator)
|
||||
-- if CalDamage == nil then return Damage; end
|
||||
-- return CalDamage;
|
||||
--end
|
||||
|
||||
--- S & C 接受到伤害函数
|
||||
--function MiniManager:BPReceiveDamage(DamagedActor, Damage, DamageType, InstigatedBy, DamageCauser)
|
||||
-- if IsServer then
|
||||
-- table.func(self.CurrMiniMode, 'BPReceiveDamage', DamagedActor, Damage, DamageType, InstigatedBy, DamageCauser)
|
||||
-- end
|
||||
--end
|
||||
|
||||
--- 服务器/客户端收到伤害数据
|
||||
---@param DamagedPawn UGCPlayerPawn_C
|
||||
---@param Damage float
|
||||
---@param DamageType UDamageType
|
||||
---@param InstigatedBy UGCPlayerController_C
|
||||
---@param DamageCauser AActor
|
||||
--function MiniManager:ReceiveDamage(DamagedPawn, Damage, DamageType, InstigatedBy, DamageCauser)
|
||||
-- UGCLogSystem.Log("[MiniManager:ReceiveDamage] 收到伤害")
|
||||
-- table.func(self.CurrMiniMode, "ReceiveDamage", DamagedPawn, Damage, DamageType, InstigatedBy, DamageCauser);
|
||||
--end
|
||||
|
||||
--- 当玩家死亡
|
||||
---@param DeadPlayerKey PlayerKey
|
||||
---@param KillerPlayerKey PlayerKey
|
||||
|
@ -110,10 +110,6 @@ function Mini_Solo:ShowSelectWeaponUI()
|
||||
end
|
||||
end
|
||||
|
||||
function Mini_Solo:AddPlayer(PlayerKey)
|
||||
self:LoadArchive();
|
||||
end
|
||||
|
||||
function Mini_Solo:OnClientAlready()
|
||||
if IsServer then
|
||||
for _, PS in pairs(UGCGameSystem.GetAllPlayerController(false)) do
|
||||
@ -543,6 +539,7 @@ function Mini_Solo:CheckTimeExhausted_Health()
|
||||
end
|
||||
end
|
||||
local Count = table.getCount(Table);
|
||||
if Count == 0 then return nil; end
|
||||
if Count == 1 then return Table[1].PlayerKey; end
|
||||
table.sort(Table, function(a, b)
|
||||
return a.Health > b.Health;
|
||||
@ -1640,6 +1637,41 @@ function Mini_Solo:PlayerAddWeapon(PlayerKey, Weapon)
|
||||
if Weapon then
|
||||
UGCLogSystem.Log("[Mini_Solo:PlayerAddWeapon] 开始添加")
|
||||
Pawn:AddItem(Weapon, 1, true, EFillBulletType.ClipInfinite);
|
||||
|
||||
-- 添加其他倍镜
|
||||
local NeedAddTelescope = ItemTool.GetOtherTelescopes(Pawn);
|
||||
-- 检查当前武器上是否有倍镜
|
||||
|
||||
for i, v in pairs(NeedAddTelescope) do
|
||||
Pawn:AddItem(i, 1, false);
|
||||
end
|
||||
|
||||
-- 判断武器上原本是否有该配件
|
||||
if ArchiveTable[PlayerKey] and ArchiveTable[PlayerKey].Weapons[Weapon] then
|
||||
if WeaponSuits[Weapon] then
|
||||
if WeaponSuits[Weapon][EWeaponPartType.Telescope] then
|
||||
local HaveParts = {};
|
||||
for i, PartID in pairs(WeaponSuits[Weapon][EWeaponPartType.Telescope]) do
|
||||
HaveParts[PartID] = 1;
|
||||
end
|
||||
local Parts = ArchiveTable[PlayerKey].Weapons[Weapon];
|
||||
-- 判断是否有倍镜
|
||||
local HavePart = false;
|
||||
for i, PartID in pairs(Parts) do
|
||||
if HaveParts[PartID] then HavePart = true; end
|
||||
end
|
||||
|
||||
-- 移除
|
||||
if not HavePart then
|
||||
local Weapons = ItemTool.GetWeaponsById(Pawn, Weapon)
|
||||
for i, v in pairs(Weapons) do
|
||||
UGCGunSystem.RemoveGunAttachmentBySocketType(v, ItemTool.GetWeaponAttachmentSocketType(EWeaponPartType.Telescope));
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- 启动检测
|
||||
self:CloseCheckWeaponTimer();
|
||||
self.CheckWeaponTimer = UGCEventSystem.SetTimerLoop(GameState, function()
|
||||
@ -1650,16 +1682,6 @@ function Mini_Solo:PlayerAddWeapon(PlayerKey, Weapon)
|
||||
end
|
||||
end
|
||||
|
||||
--- 服务器/客户端收到伤害数据
|
||||
---@param DamagedPawn UGCPlayerPawn_C
|
||||
---@param Damage float
|
||||
---@param DamageType UDamageType
|
||||
---@param InstigatedBy UGCPlayerController_C
|
||||
---@param DamageCauser AActor
|
||||
function Mini_Solo:ReceiveDamage(DamagedPawn, Damage, DamageType, InstigatedBy, DamageCauser)
|
||||
return Damage;
|
||||
end
|
||||
|
||||
---@param PlayerStartList table<TeamId, table<int32, APlayerStart>>
|
||||
---@param Controller UGCPlayerController_C
|
||||
function Mini_Solo:SelectPlayerStart(PlayerStartList, Controller)
|
||||
|
@ -15,11 +15,9 @@ require(Prefix .. 'RankInformation' .. Post)
|
||||
|
||||
function UnableTable()
|
||||
ObjectPath = nil;
|
||||
WeaponTable = nil;
|
||||
EWeaponTypes = nil;
|
||||
EWeaponIdType = nil;
|
||||
WeaponTypeInfo = nil;
|
||||
WeaponTable = nil;
|
||||
EnglishNamedWeapon = nil;
|
||||
ShootWeaponEnums = nil;
|
||||
EFillBulletType = nil;
|
||||
@ -28,7 +26,6 @@ function UnableTable()
|
||||
WeaponTypeParts = nil;
|
||||
WeaponParts = nil;
|
||||
NamedWeaponParts = nil;
|
||||
WeaponSuits = nil;
|
||||
WeaponNameTable = nil;
|
||||
WeaponAmmoIdMap = nil;
|
||||
AmmoTable = nil;
|
||||
|
@ -20,9 +20,6 @@ require(Prefix .. 'SoundSystem')
|
||||
require(Prefix .. 'GlobalInit')
|
||||
require(Prefix .. 'UGCEventSystem')
|
||||
require(Prefix .. 'GlobalTickTool')
|
||||
require(Prefix .. 'GlobalBeginTool')
|
||||
require(Prefix .. 'json')
|
||||
|
||||
|
||||
require(Prefix .. 'UGCSystemLibrary')
|
||||
require(Prefix .. 'MyWeaponSystem')
|
||||
@ -33,11 +30,11 @@ require(Prefix .. 'WidgetLibrary')
|
||||
if DefaultSettings.EnableTest then
|
||||
require(Prefix .. 'TestTool')
|
||||
|
||||
for i, v in pairs(TestTool) do
|
||||
if type(v) == 'function' then
|
||||
v(TestTool);
|
||||
end
|
||||
end
|
||||
--for i, v in pairs(TestTool) do
|
||||
-- if type(v) == 'function' then
|
||||
-- v(TestTool);
|
||||
-- end
|
||||
--end
|
||||
end
|
||||
|
||||
|
||||
|
@ -1,37 +0,0 @@
|
||||
GlobalBeginTool = {};
|
||||
---@type table<table, fun(o: table)> 回调函数
|
||||
GlobalBeginTool.BeginPlayFunctions = {};
|
||||
|
||||
GlobalBeginTool.ClientAlreadyFunctions = {};
|
||||
|
||||
---@generic T
|
||||
---@param o T
|
||||
---@param f fun(o:T) 初始化函数
|
||||
function GlobalBeginTool:AddBeginPlay(o, f)
|
||||
if o == nil then return end
|
||||
if GlobalBeginTool.BeginPlayFunctions[o] ~= nil then return end
|
||||
if type(f) ~= "function" then return end
|
||||
GlobalBeginTool.BeginPlayFunctions[o] = f;
|
||||
end
|
||||
|
||||
---@generic T
|
||||
---@param o T
|
||||
---@param f fun(o:T) 初始化函数
|
||||
function GlobalBeginTool:AddClientAlready(o, f)
|
||||
if o == nil then return end
|
||||
if GlobalBeginTool.ClientAlreadyFunctions[o] ~= nil then return end
|
||||
if type(f) ~= "function" then return end
|
||||
GlobalBeginTool.ClientAlreadyFunctions[o] = f;
|
||||
end
|
||||
|
||||
function GlobalBeginTool:ReceiveBeginPlay()
|
||||
for o, f in pairs(self.BeginPlayFunctions) do f(o); end
|
||||
self.BeginPlayFunctions = {};
|
||||
end
|
||||
|
||||
function GlobalBeginTool:ReceiveClientAlready()
|
||||
for o, f in pairs(self.ClientAlreadyFunctions) do f(o); end
|
||||
self.ClientAlreadyFunctions = {};
|
||||
end
|
||||
|
||||
return GlobalBeginTool;
|
@ -571,6 +571,19 @@ function ItemTool.GetWeaponPartList(Weapon)
|
||||
return Parts;
|
||||
end
|
||||
|
||||
function ItemTool.GetWeaponPartMap(Weapon)
|
||||
local Parts = {};
|
||||
if Weapon and UE.IsValid(Weapon) and ItemTool.IsShootWeapon(Weapon) then
|
||||
local ItemDefineIDs = UGCGunSystem.GetWeaponAllAttachmentIDList(Weapon);
|
||||
for i, ItemDefineID in pairs(ItemDefineIDs) do
|
||||
if ItemDefineID.bValidItem and ItemDefineID.bValidInstance then
|
||||
Parts[ItemDefineID.TypeSpecificID] = 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
return Parts;
|
||||
end
|
||||
|
||||
function ItemTool.GetCurrWeaponPartList(Pawn)
|
||||
local Weapon = UGCWeaponManagerSystem.GetCurrentWeapon(Pawn);
|
||||
return ItemTool.GetWeaponPartList(Weapon);
|
||||
@ -733,3 +746,27 @@ function ItemTool.GetFirstWeaponID(PlayerKey)
|
||||
return nil;
|
||||
end
|
||||
|
||||
--- 给玩家添加其他倍镜
|
||||
function ItemTool.GetOtherTelescopes(Pawn)
|
||||
local NeedAdd = {};
|
||||
for i, Enum in pairs(ShootWeaponEnums) do
|
||||
local Weapon = UGCWeaponManagerSystem.GetWeaponBySlot(Pawn, Enum);
|
||||
if ItemTool.IsShootWeapon(Weapon) then
|
||||
local WeaponID = Weapon:GetWeaponItemID();
|
||||
if WeaponSuits[WeaponID] then
|
||||
if WeaponSuits[WeaponID][EWeaponPartType.Telescope] then
|
||||
for _, PartID in pairs(WeaponSuits[WeaponID][EWeaponPartType.Telescope]) do
|
||||
NeedAdd[PartID] = 1;
|
||||
end
|
||||
local PartList = ItemTool.GetWeaponPartMap(Weapon)
|
||||
for PartID, C in pairs(PartList) do
|
||||
if NeedAdd[PartID] then
|
||||
NeedAdd[PartID] = nil;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return NeedAdd;
|
||||
end
|
||||
|
@ -117,21 +117,18 @@ function UE.InitArchiveData()
|
||||
return {
|
||||
TotalGameTimes = 0; -- 经典模式游玩次数,同步
|
||||
GameTimes = 0, -- 游玩次数(包含所有模式)不同步
|
||||
Weapons = {}, -- 武器配件 不同步
|
||||
Weapons = {}, -- 武器配件
|
||||
Score = DefaultSettings.RankScore, -- 默认 2000分 同步
|
||||
WinTimes = 0, -- 一共获胜次数 不同步
|
||||
GameWinTimes = 0, -- 经典模式获胜次数 同步
|
||||
|
||||
Kill = 0, -- 总击杀数 同步
|
||||
Dead = 0, -- 总死亡数 同步
|
||||
|
||||
HideScore = 0, -- 隐藏分 同步
|
||||
|
||||
Disables = {};
|
||||
|
||||
-- 最后十局战绩
|
||||
Last10Games = {}, -- 历史十局 同步
|
||||
|
||||
CurSeason = 0; -- 默认赛季 不同步
|
||||
--- 赛季信息
|
||||
Seasons = {}; -- 历史赛季 同步
|
||||
@ -144,6 +141,8 @@ function UE.InitArchiveData()
|
||||
NoSelectMaps = {}; -- 没有选择的地图
|
||||
EnterWeaponIndex = nil; -- 娱乐模式的之前选择的 Index
|
||||
EnterWeapons = {}; -- 娱乐模式保存的武器
|
||||
|
||||
bOldParts = nil, -- 是否默认开启之前的武器配件配置
|
||||
};
|
||||
end
|
||||
|
||||
|
@ -1,388 +0,0 @@
|
||||
--
|
||||
-- json.lua
|
||||
--
|
||||
-- Copyright (c) 2020 rxi
|
||||
--
|
||||
-- Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
-- this software and associated documentation files (the "Software"), to deal in
|
||||
-- the Software without restriction, including without limitation the rights to
|
||||
-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
-- of the Software, and to permit persons to whom the Software is furnished to do
|
||||
-- so, subject to the following conditions:
|
||||
--
|
||||
-- The above copyright notice and this permission notice shall be included in all
|
||||
-- copies or substantial portions of the Software.
|
||||
--
|
||||
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
-- SOFTWARE.
|
||||
--
|
||||
|
||||
local json = { _version = "0.1.2" }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Encode
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
local encode
|
||||
|
||||
local escape_char_map = {
|
||||
[ "\\" ] = "\\",
|
||||
[ "\"" ] = "\"",
|
||||
[ "\b" ] = "b",
|
||||
[ "\f" ] = "f",
|
||||
[ "\n" ] = "n",
|
||||
[ "\r" ] = "r",
|
||||
[ "\t" ] = "t",
|
||||
}
|
||||
|
||||
local escape_char_map_inv = { [ "/" ] = "/" }
|
||||
for k, v in pairs(escape_char_map) do
|
||||
escape_char_map_inv[v] = k
|
||||
end
|
||||
|
||||
|
||||
local function escape_char(c)
|
||||
return "\\" .. (escape_char_map[c] or string.format("u%04x", c:byte()))
|
||||
end
|
||||
|
||||
|
||||
local function encode_nil(val)
|
||||
return "null"
|
||||
end
|
||||
|
||||
|
||||
local function encode_table(val, stack)
|
||||
local res = {}
|
||||
stack = stack or {}
|
||||
|
||||
-- Circular reference?
|
||||
if stack[val] then error("circular reference") end
|
||||
|
||||
stack[val] = true
|
||||
|
||||
if rawget(val, 1) ~= nil or next(val) == nil then
|
||||
-- Treat as array -- check keys are valid and it is not sparse
|
||||
local n = 0
|
||||
for k in pairs(val) do
|
||||
if type(k) ~= "number" then
|
||||
error("invalid table: mixed or invalid key types")
|
||||
end
|
||||
n = n + 1
|
||||
end
|
||||
if n ~= #val then
|
||||
error("invalid table: sparse array")
|
||||
end
|
||||
-- Encode
|
||||
for i, v in ipairs(val) do
|
||||
table.insert(res, encode(v, stack))
|
||||
end
|
||||
stack[val] = nil
|
||||
return "[" .. table.concat(res, ",") .. "]"
|
||||
|
||||
else
|
||||
-- Treat as an object
|
||||
for k, v in pairs(val) do
|
||||
if type(k) ~= "string" then
|
||||
error("invalid table: mixed or invalid key types")
|
||||
end
|
||||
table.insert(res, encode(k, stack) .. ":" .. encode(v, stack))
|
||||
end
|
||||
stack[val] = nil
|
||||
return "{" .. table.concat(res, ",") .. "}"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function encode_string(val)
|
||||
return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'
|
||||
end
|
||||
|
||||
|
||||
local function encode_number(val)
|
||||
-- Check for NaN, -inf and inf
|
||||
if val ~= val or val <= -math.huge or val >= math.huge then
|
||||
error("unexpected number value '" .. tostring(val) .. "'")
|
||||
end
|
||||
return string.format("%.14g", val)
|
||||
end
|
||||
|
||||
|
||||
local type_func_map = {
|
||||
[ "nil" ] = encode_nil,
|
||||
[ "table" ] = encode_table,
|
||||
[ "string" ] = encode_string,
|
||||
[ "number" ] = encode_number,
|
||||
[ "boolean" ] = tostring,
|
||||
}
|
||||
|
||||
|
||||
encode = function(val, stack)
|
||||
local t = type(val)
|
||||
local f = type_func_map[t]
|
||||
if f then
|
||||
return f(val, stack)
|
||||
end
|
||||
error("unexpected type '" .. t .. "'")
|
||||
end
|
||||
|
||||
|
||||
function json.encode(val)
|
||||
return ( encode(val) )
|
||||
end
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Decode
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
local parse
|
||||
|
||||
local function create_set(...)
|
||||
local res = {}
|
||||
for i = 1, select("#", ...) do
|
||||
res[ select(i, ...) ] = true
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
local space_chars = create_set(" ", "\t", "\r", "\n")
|
||||
local delim_chars = create_set(" ", "\t", "\r", "\n", "]", "}", ",")
|
||||
local escape_chars = create_set("\\", "/", '"', "b", "f", "n", "r", "t", "u")
|
||||
local literals = create_set("true", "false", "null")
|
||||
|
||||
local literal_map = {
|
||||
[ "true" ] = true,
|
||||
[ "false" ] = false,
|
||||
[ "null" ] = nil,
|
||||
}
|
||||
|
||||
|
||||
local function next_char(str, idx, set, negate)
|
||||
for i = idx, #str do
|
||||
if set[str:sub(i, i)] ~= negate then
|
||||
return i
|
||||
end
|
||||
end
|
||||
return #str + 1
|
||||
end
|
||||
|
||||
|
||||
local function decode_error(str, idx, msg)
|
||||
local line_count = 1
|
||||
local col_count = 1
|
||||
for i = 1, idx - 1 do
|
||||
col_count = col_count + 1
|
||||
if str:sub(i, i) == "\n" then
|
||||
line_count = line_count + 1
|
||||
col_count = 1
|
||||
end
|
||||
end
|
||||
error( string.format("%s at line %d col %d", msg, line_count, col_count) )
|
||||
end
|
||||
|
||||
|
||||
local function codepoint_to_utf8(n)
|
||||
-- http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-appendixa
|
||||
local f = math.floor
|
||||
if n <= 0x7f then
|
||||
return string.char(n)
|
||||
elseif n <= 0x7ff then
|
||||
return string.char(f(n / 64) + 192, n % 64 + 128)
|
||||
elseif n <= 0xffff then
|
||||
return string.char(f(n / 4096) + 224, f(n % 4096 / 64) + 128, n % 64 + 128)
|
||||
elseif n <= 0x10ffff then
|
||||
return string.char(f(n / 262144) + 240, f(n % 262144 / 4096) + 128,
|
||||
f(n % 4096 / 64) + 128, n % 64 + 128)
|
||||
end
|
||||
error( string.format("invalid unicode codepoint '%x'", n) )
|
||||
end
|
||||
|
||||
|
||||
local function parse_unicode_escape(s)
|
||||
local n1 = tonumber( s:sub(1, 4), 16 )
|
||||
local n2 = tonumber( s:sub(7, 10), 16 )
|
||||
-- Surrogate pair?
|
||||
if n2 then
|
||||
return codepoint_to_utf8((n1 - 0xd800) * 0x400 + (n2 - 0xdc00) + 0x10000)
|
||||
else
|
||||
return codepoint_to_utf8(n1)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function parse_string(str, i)
|
||||
local res = ""
|
||||
local j = i + 1
|
||||
local k = j
|
||||
|
||||
while j <= #str do
|
||||
local x = str:byte(j)
|
||||
|
||||
if x < 32 then
|
||||
decode_error(str, j, "control character in string")
|
||||
|
||||
elseif x == 92 then -- `\`: Escape
|
||||
res = res .. str:sub(k, j - 1)
|
||||
j = j + 1
|
||||
local c = str:sub(j, j)
|
||||
if c == "u" then
|
||||
local hex = str:match("^[dD][89aAbB]%x%x\\u%x%x%x%x", j + 1)
|
||||
or str:match("^%x%x%x%x", j + 1)
|
||||
or decode_error(str, j - 1, "invalid unicode escape in string")
|
||||
res = res .. parse_unicode_escape(hex)
|
||||
j = j + #hex
|
||||
else
|
||||
if not escape_chars[c] then
|
||||
decode_error(str, j - 1, "invalid escape char '" .. c .. "' in string")
|
||||
end
|
||||
res = res .. escape_char_map_inv[c]
|
||||
end
|
||||
k = j + 1
|
||||
|
||||
elseif x == 34 then -- `"`: End of string
|
||||
res = res .. str:sub(k, j - 1)
|
||||
return res, j + 1
|
||||
end
|
||||
|
||||
j = j + 1
|
||||
end
|
||||
|
||||
decode_error(str, i, "expected closing quote for string")
|
||||
end
|
||||
|
||||
|
||||
local function parse_number(str, i)
|
||||
local x = next_char(str, i, delim_chars)
|
||||
local s = str:sub(i, x - 1)
|
||||
local n = tonumber(s)
|
||||
if not n then
|
||||
decode_error(str, i, "invalid number '" .. s .. "'")
|
||||
end
|
||||
return n, x
|
||||
end
|
||||
|
||||
|
||||
local function parse_literal(str, i)
|
||||
local x = next_char(str, i, delim_chars)
|
||||
local word = str:sub(i, x - 1)
|
||||
if not literals[word] then
|
||||
decode_error(str, i, "invalid literal '" .. word .. "'")
|
||||
end
|
||||
return literal_map[word], x
|
||||
end
|
||||
|
||||
|
||||
local function parse_array(str, i)
|
||||
local res = {}
|
||||
local n = 1
|
||||
i = i + 1
|
||||
while 1 do
|
||||
local x
|
||||
i = next_char(str, i, space_chars, true)
|
||||
-- Empty / end of array?
|
||||
if str:sub(i, i) == "]" then
|
||||
i = i + 1
|
||||
break
|
||||
end
|
||||
-- Read token
|
||||
x, i = parse(str, i)
|
||||
res[n] = x
|
||||
n = n + 1
|
||||
-- Next token
|
||||
i = next_char(str, i, space_chars, true)
|
||||
local chr = str:sub(i, i)
|
||||
i = i + 1
|
||||
if chr == "]" then break end
|
||||
if chr ~= "," then decode_error(str, i, "expected ']' or ','") end
|
||||
end
|
||||
return res, i
|
||||
end
|
||||
|
||||
|
||||
local function parse_object(str, i)
|
||||
local res = {}
|
||||
i = i + 1
|
||||
while 1 do
|
||||
local key, val
|
||||
i = next_char(str, i, space_chars, true)
|
||||
-- Empty / end of object?
|
||||
if str:sub(i, i) == "}" then
|
||||
i = i + 1
|
||||
break
|
||||
end
|
||||
-- Read key
|
||||
if str:sub(i, i) ~= '"' then
|
||||
decode_error(str, i, "expected string for key")
|
||||
end
|
||||
key, i = parse(str, i)
|
||||
-- Read ':' delimiter
|
||||
i = next_char(str, i, space_chars, true)
|
||||
if str:sub(i, i) ~= ":" then
|
||||
decode_error(str, i, "expected ':' after key")
|
||||
end
|
||||
i = next_char(str, i + 1, space_chars, true)
|
||||
-- Read value
|
||||
val, i = parse(str, i)
|
||||
-- Set
|
||||
res[key] = val
|
||||
-- Next token
|
||||
i = next_char(str, i, space_chars, true)
|
||||
local chr = str:sub(i, i)
|
||||
i = i + 1
|
||||
if chr == "}" then break end
|
||||
if chr ~= "," then decode_error(str, i, "expected '}' or ','") end
|
||||
end
|
||||
return res, i
|
||||
end
|
||||
|
||||
|
||||
local char_func_map = {
|
||||
[ '"' ] = parse_string,
|
||||
[ "0" ] = parse_number,
|
||||
[ "1" ] = parse_number,
|
||||
[ "2" ] = parse_number,
|
||||
[ "3" ] = parse_number,
|
||||
[ "4" ] = parse_number,
|
||||
[ "5" ] = parse_number,
|
||||
[ "6" ] = parse_number,
|
||||
[ "7" ] = parse_number,
|
||||
[ "8" ] = parse_number,
|
||||
[ "9" ] = parse_number,
|
||||
[ "-" ] = parse_number,
|
||||
[ "t" ] = parse_literal,
|
||||
[ "f" ] = parse_literal,
|
||||
[ "n" ] = parse_literal,
|
||||
[ "[" ] = parse_array,
|
||||
[ "{" ] = parse_object,
|
||||
}
|
||||
|
||||
|
||||
parse = function(str, idx)
|
||||
local chr = str:sub(idx, idx)
|
||||
local f = char_func_map[chr]
|
||||
if f then
|
||||
return f(str, idx)
|
||||
end
|
||||
decode_error(str, idx, "unexpected character '" .. chr .. "'")
|
||||
end
|
||||
|
||||
|
||||
function json.decode(str)
|
||||
if type(str) ~= "string" then
|
||||
error("expected argument of type string, got " .. type(str))
|
||||
end
|
||||
local res, idx = parse(str, next_char(str, 1, space_chars, true))
|
||||
idx = next_char(str, idx, space_chars, true)
|
||||
if idx <= #str then
|
||||
decode_error(str, idx, "trailing garbage")
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
|
||||
return json
|
@ -14,6 +14,7 @@
|
||||
---@field TextBlock_Parts UTextBlock
|
||||
---@field TextBlock_WeaponName UTextBlock
|
||||
---@field WB_DamageTextButton UWB_DamageTextButton_C
|
||||
---@field WB_OpenOldWeaponParts UWB_OpenOldWeaponParts_C
|
||||
--Edit Below--
|
||||
local WB_WeaponConfiguration = {
|
||||
bInitDoOnce = false;
|
||||
@ -66,6 +67,8 @@ function WB_WeaponConfiguration:LuaInit()
|
||||
Item:SetSelectStyle(1)
|
||||
Item:BindSelectCallBack(self.ClickSelectPart, self)
|
||||
end
|
||||
|
||||
self.WB_OpenOldWeaponParts:LuaInit();
|
||||
end
|
||||
|
||||
function WB_WeaponConfiguration:CloseSelf()
|
||||
|
37
SoloKing/Script/UI/Tool/WB_OpenOldWeaponParts.lua
Normal file
37
SoloKing/Script/UI/Tool/WB_OpenOldWeaponParts.lua
Normal file
@ -0,0 +1,37 @@
|
||||
---@class WB_OpenOldWeaponParts_C:UUserWidget
|
||||
---@field NewButton_Shovel UNewButton
|
||||
---@field WidgetSwitcher_ChangeShovel UWidgetSwitcher
|
||||
--Edit Below--
|
||||
---@type WB_OpenOldWeaponParts_C
|
||||
local WB_OpenOldWeaponParts = { bInitDoOnce = false }
|
||||
|
||||
function WB_OpenOldWeaponParts:Construct()
|
||||
self:LuaInit();
|
||||
end
|
||||
|
||||
function WB_OpenOldWeaponParts:LuaInit()
|
||||
if self.bInitDoOnce then return ; end
|
||||
self.bInitDoOnce = true;
|
||||
|
||||
UITool.BindButtonClicked(self.NewButton_Shovel, self.OnClickButton, self)
|
||||
|
||||
UGCEventSystem.AddListener(EventTypes.OpenOldWeaponParts, self.OnOpenOldWeaponParts, self)
|
||||
if ArchiveTable[LocalPlayerKey] and ArchiveTable[LocalPlayerKey].bOldParts then
|
||||
self:OnOpenOldWeaponParts(ArchiveTable[LocalPlayerKey].bOldParts);
|
||||
end
|
||||
end
|
||||
|
||||
function WB_OpenOldWeaponParts:OnOpenOldWeaponParts(IsEnable)
|
||||
self.bOldParts = IsEnable;
|
||||
self.WidgetSwitcher_ChangeShovel:SetActiveWidgetIndex(IsEnable and 1 or 0);
|
||||
end
|
||||
|
||||
WB_OpenOldWeaponParts.bOldParts = false;
|
||||
|
||||
function WB_OpenOldWeaponParts:OnClickButton()
|
||||
UGCLogSystem.Log("[WB_DamageTextButton:OnClickButton] 点击")
|
||||
self:OnOpenOldWeaponParts(not self.bOldParts);
|
||||
UGCEventSystem.SendEvent(EventTypes.OpenOldWeaponParts, self.bOldParts);
|
||||
end
|
||||
|
||||
return WB_OpenOldWeaponParts
|
@ -5,6 +5,7 @@
|
||||
---@field Button_Test_Custom UButton
|
||||
---@field Button_TestSide UButton
|
||||
---@field CanvasPanel_Test UCanvasPanel
|
||||
---@field CustomizeCanvasPanel_BP_C_4 UCustomizeCanvasPanel_BP_C
|
||||
---@field Overlay_EnemyHP UOverlay
|
||||
---@field TextBlock_1 UTextBlock
|
||||
---@field TextBlock_EnemyHP UTextBlock
|
||||
@ -38,6 +39,8 @@ function WB_Main:LuaInit()
|
||||
UGCEventSystem.AddListener(EventTypes.MiniStateChange, self.OnMiniStateChange, self)
|
||||
UGCEventSystem.AddListener(EventTypes.ChangeSpector, self.OnChangeSpector, self)
|
||||
UGCEventSystem.AddListener(EventTypes.ShowRoundWin, self.ShowRoundWin, self)
|
||||
UGCEventSystem.AddListener(EventTypes.OpenOldWeaponParts, self.OpenOldWeaponParts, self)
|
||||
UGCEventSystem.AddListener(EventTypes.UpdateArchiveData, self.UpdateArchiveData, self)
|
||||
|
||||
--- 死亡的时候显示 ID Panel
|
||||
UGCEventSystem.AddListener(EventTypes.PlayerRespawn, function(MainUI, PlayerKey)
|
||||
@ -79,9 +82,11 @@ function WB_Main:LuaInit()
|
||||
self.WB_PID:LuaInit();
|
||||
self.WB_Title1_2:LuaInit();
|
||||
self.WB_Title2_2:LuaInit();
|
||||
--self.WB_SelectParts:LuaInit();
|
||||
self.WB_ReselectWeaponBtn:LuaInit();
|
||||
--self.WB_SelectParts:SetType({ EWeaponPartType.Telescope, EWeaponPartType.Grip, EWeaponPartType.Muzzle, });
|
||||
|
||||
--- 有显示的操作
|
||||
self.WB_SelectParts:LuaInit();
|
||||
self.WB_SelectParts:SetType({ EWeaponPartType.Telescope, EWeaponPartType.Grip, EWeaponPartType.Muzzle, });
|
||||
|
||||
self:ShowCustomSelectWeaponBtn(false);
|
||||
|
||||
@ -112,6 +117,21 @@ function WB_Main:LuaInit()
|
||||
GameState:UIAlready();
|
||||
end
|
||||
|
||||
function WB_Main:OpenOldWeaponParts(IsShow)
|
||||
UGCLogSystem.Log("[WB_Main:OpenOldWeaponParts] 执行")
|
||||
if IsShow then
|
||||
self.CustomizeCanvasPanel_BP_C_4:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
|
||||
else
|
||||
self.CustomizeCanvasPanel_BP_C_4:SetVisibility(ESlateVisibility.Collapsed);
|
||||
end
|
||||
end
|
||||
|
||||
function WB_Main:UpdateArchiveData()
|
||||
if ArchiveTable[LocalPlayerKey] then return; end
|
||||
--- 默认选项
|
||||
self:OpenOldWeaponParts(ArchiveTable[LocalPlayerKey].bOldParts or false);
|
||||
end
|
||||
|
||||
function WB_Main:OnShowPanel(...)
|
||||
self.WB_PID:SetIDs()
|
||||
end
|
||||
|
@ -53,13 +53,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=600044806
|
||||
LastWindowsJobId=600026723
|
||||
LastAndroidJobId=600026723
|
||||
LastIOSJobId=600026723
|
||||
PakOnly=1
|
||||
LastSkipBake=True
|
||||
LastTargetPlatform=LinuxServer+WindowsNoEditor+Android_ETC2+IOS+OpenHarmony_ETC2
|
||||
|
||||
[UGCUploadOption]
|
||||
PlatformIndex=0
|
||||
|
Loading…
x
Reference in New Issue
Block a user