Compare commits
No commits in common. "36b75f9b0817a4f59690c3cdabdbe98fede49e12" and "b009296e20a7b756146795d195c20a29b303b718" have entirely different histories.
36b75f9b08
...
b009296e20
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -194,7 +194,6 @@ 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,15 +9,32 @@ 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", "ReplacePartId"
|
||||
return "UpdateWeaponParts"
|
||||
end
|
||||
|
||||
function UGCPlayerPawn:ReceivePossessed(NewController)
|
||||
@ -210,31 +227,14 @@ 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, "RecvParts", WeaponID, WeaponParts);
|
||||
UnrealNetwork.CallUnrealRPC(self:GetPlayerControllerSafety(), self, "RecvWeaponParts", WeaponID, WeaponParts);
|
||||
end
|
||||
|
||||
function UGCPlayerPawn:RecvParts(WeaponID, Parts)
|
||||
function UGCPlayerPawn:RecvWeaponParts(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:RecvParts] Parts ="), Parts)
|
||||
UGCLogSystem.LogTree(string.format("[UGCPlayerPawn:RecvWeaponParts] Parts ="), Parts)
|
||||
UGCEventSystem.SendEvent(EventTypes.UpdateWeapons, WeaponID)
|
||||
end
|
||||
|
||||
|
@ -40,6 +40,4 @@ EventTypes = EventTypes or {
|
||||
AllSelectWeaponsAlready = CountTable(); -- 所有存档数据准备就绪
|
||||
UpdateEnterWeapons = CountTable(); -- 所有存档数据准备就绪
|
||||
UpdateWeapons = CountTable(); -- 所有存档数据准备就绪
|
||||
|
||||
OpenOldWeaponParts = CountTable(); -- 所有存档数据准备就绪
|
||||
}
|
||||
|
@ -546,10 +546,8 @@ 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
|
||||
if self.CurrMiniMode.bGameEnd == false and self.CurrMiniMode.bRoundEnd == false then
|
||||
table.func(self.CurrMiniMode, "OnTimeExhausted", self.State)
|
||||
end
|
||||
-- 通知结束了
|
||||
UGCLogSystem.Log("[MiniManager:OnMiniRoundEnd] 结束")
|
||||
@ -629,6 +627,36 @@ 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,6 +110,10 @@ 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
|
||||
@ -539,7 +543,6 @@ 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;
|
||||
@ -1637,41 +1640,6 @@ 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()
|
||||
@ -1682,6 +1650,16 @@ 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,9 +15,11 @@ require(Prefix .. 'RankInformation' .. Post)
|
||||
|
||||
function UnableTable()
|
||||
ObjectPath = nil;
|
||||
WeaponTable = nil;
|
||||
EWeaponTypes = nil;
|
||||
EWeaponIdType = nil;
|
||||
WeaponTypeInfo = nil;
|
||||
WeaponTable = nil;
|
||||
EnglishNamedWeapon = nil;
|
||||
ShootWeaponEnums = nil;
|
||||
EFillBulletType = nil;
|
||||
@ -26,6 +28,7 @@ function UnableTable()
|
||||
WeaponTypeParts = nil;
|
||||
WeaponParts = nil;
|
||||
NamedWeaponParts = nil;
|
||||
WeaponSuits = nil;
|
||||
WeaponNameTable = nil;
|
||||
WeaponAmmoIdMap = nil;
|
||||
AmmoTable = nil;
|
||||
|
@ -20,6 +20,9 @@ require(Prefix .. 'SoundSystem')
|
||||
require(Prefix .. 'GlobalInit')
|
||||
require(Prefix .. 'UGCEventSystem')
|
||||
require(Prefix .. 'GlobalTickTool')
|
||||
require(Prefix .. 'GlobalBeginTool')
|
||||
require(Prefix .. 'json')
|
||||
|
||||
|
||||
require(Prefix .. 'UGCSystemLibrary')
|
||||
require(Prefix .. 'MyWeaponSystem')
|
||||
@ -30,11 +33,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
|
||||
|
||||
|
||||
|
37
SoloKing/Script/Global/Tool/GlobalBeginTool.lua
Normal file
37
SoloKing/Script/Global/Tool/GlobalBeginTool.lua
Normal file
@ -0,0 +1,37 @@
|
||||
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,19 +571,6 @@ 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);
|
||||
@ -746,27 +733,3 @@ 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,18 +117,21 @@ 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 = {}; -- 历史赛季 同步
|
||||
@ -141,8 +144,6 @@ function UE.InitArchiveData()
|
||||
NoSelectMaps = {}; -- 没有选择的地图
|
||||
EnterWeaponIndex = nil; -- 娱乐模式的之前选择的 Index
|
||||
EnterWeapons = {}; -- 娱乐模式保存的武器
|
||||
|
||||
bOldParts = nil, -- 是否默认开启之前的武器配件配置
|
||||
};
|
||||
end
|
||||
|
||||
|
388
SoloKing/Script/Global/Tool/json.lua
Normal file
388
SoloKing/Script/Global/Tool/json.lua
Normal file
@ -0,0 +1,388 @@
|
||||
--
|
||||
-- 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,7 +14,6 @@
|
||||
---@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;
|
||||
@ -67,8 +66,6 @@ function WB_WeaponConfiguration:LuaInit()
|
||||
Item:SetSelectStyle(1)
|
||||
Item:BindSelectCallBack(self.ClickSelectPart, self)
|
||||
end
|
||||
|
||||
self.WB_OpenOldWeaponParts:LuaInit();
|
||||
end
|
||||
|
||||
function WB_WeaponConfiguration:CloseSelf()
|
||||
|
@ -1,37 +0,0 @@
|
||||
---@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,7 +5,6 @@
|
||||
---@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
|
||||
@ -39,8 +38,6 @@ 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)
|
||||
@ -82,11 +79,9 @@ 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:LuaInit();
|
||||
self.WB_SelectParts:SetType({ EWeaponPartType.Telescope, EWeaponPartType.Grip, EWeaponPartType.Muzzle, });
|
||||
--self.WB_SelectParts:SetType({ EWeaponPartType.Telescope, EWeaponPartType.Grip, EWeaponPartType.Muzzle, });
|
||||
|
||||
self:ShowCustomSelectWeaponBtn(false);
|
||||
|
||||
@ -117,21 +112,6 @@ 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=600044806
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user