308 lines
13 KiB
Lua
Raw Permalink Normal View History

2025-01-18 21:26:02 +08:00
---@class WB_PlacePanel_C:UAEUserWidget
---@field RetractItemInfo UWidgetAnimation
---@field Button_AddYaw UButton
---@field Button_ChangeMode UButton
---@field Button_Debug UButton
---@field Button_Fly UButton
---@field Button_GetPlaceCode UNewButton
---@field Button_ImportCode UNewButton
---@field Button_ItemIncrement UButton
---@field Button_PlaceOrClear UButton
---@field Button_Retract UButton
---@field Button_RunTest UNewButton
---@field Button_SubYaw UButton
---@field Button_ToMenu UNewButton
---@field CustomizeCanvasPanel_BP_Desc UCustomizeCanvasPanel_BP_C
---@field CustomizeCanvasPanel_ChangeMode UCustomizeCanvasPanel_BP_C
---@field CustomizeCanvasPanel_PlaceBtn UCustomizeCanvasPanel_BP_C
---@field CustomizeCanvasPanel_PlaceValue UCustomizeCanvasPanel_BP_C
---@field CustomizeCanvasPanel_SelectPlaceItem UCustomizeCanvasPanel_BP_C
---@field CustomizeCanvasPanel_SetYaw UCustomizeCanvasPanel_BP_C
---@field ScrollBox_Items UScrollBox
---@field Slider_Yaw USlider
---@field TextBlock_Increment UTextBlock
---@field TextBlock_ItemCountRange UTextBlock
---@field TextBlock_ItemDesc UTextBlock
---@field TextBlock_ItemName UTextBlock
---@field TextBlock_PlaceValue UTextBlock
---@field TextBlock_Yaw UTextBlock
---@field WidgetSwitcher_ChangeMode UWidgetSwitcher
---@field WidgetSwitcher_Increment UWidgetSwitcher
---@field WidgetSwitcher_IsPlace UWidgetSwitcher
---@field WidgetSwitcher_Retract UWidgetSwitcher
---@field WidgetSwitcher_UnlockType UWidgetSwitcher
--Edit Below--
local WB_PlacePanel = {
bItemInfoPanelIsRetract = false;
bCanIncrement = false;
};
function WB_PlacePanel:Construct()
self:InitPlaceItem()
WidgetLibrary.BindButtonPressed(self.Button_PlaceOrClear, self.PlaceItem, self)
WidgetLibrary.BindButtonPressed(self.Button_AddYaw, self.AddYaw, self)
WidgetLibrary.BindButtonPressed(self.Button_SubYaw, self.SubYaw, self)
WidgetLibrary.BindButtonPressed(self.Button_Retract, self.RetractItemInfoPanel, self)
WidgetLibrary.SliderOnValueChanged(self.Slider_Yaw, self.YawChange, self)
WidgetLibrary.BindButtonPressed(self.Button_ChangeMode, self.ChangePlaceMode, self)
WidgetLibrary.BindButtonClicked(self.Button_RunTest, self.EnableRunTest, self)
WidgetLibrary.BindButtonClicked(self.Button_ToMenu, self.ClickToMenu, self)
WidgetLibrary.BindButtonClicked(self.Button_ItemIncrement, self.ClickItemIncrement, self)
WidgetLibrary.ButtonOnClickShowPanel(self.Button_GetPlaceCode, WidgetConfig.EUIType.ShowPlaceCode)
WidgetLibrary.ButtonOnClickShowPanel(self.Button_ImportCode, WidgetConfig.EUIType.ImportPlaceCode)
UGCEventSystem.AddListener(EventEnum.PlaceModeChange, self.UpdatePlaceMode, self)
UGCEventSystem.AddListener(EventEnum.UpdatePlaceValue, self.UpdatePlaceValue, self)
UGCEventSystem.AddListener(EventEnum.PlaceItemTypeIsChange, self.PlaceItemTypeIsChange, self)
UGCEventSystem.AddListener(ArchiveDataConfig.GetParamNotifyEvent(ArchiveDataConfig.EArchiveType.ItemIncrement), self.UpdatePlaceItemInfo, self)
UGCEventSystem.AddListener(ArchiveDataConfig.GetParamNotifyEvent(ArchiveDataConfig.EArchiveType.Exp), self.UpdatePlaceValue, self)
if GlobalConfigs.IsDebug then
self.Button_Debug:SetVisibility(ESlateVisibility.Visible)
WidgetLibrary.ButtonOnClickShowPanel(self.Button_Debug, WidgetConfig.EUIType.Debug)
end
end
function WB_PlacePanel:OnShowPanel()
WidgetConfig.SetDefaultUIMode(WidgetConfig.EDefaultUIMode.PlaceMode)
PlacementModeConfig.GetPlaceManager():SetPlaceMode(PlacementModeConfig.EPlaceMode.PlaceMode)
self:UpdatePlaceValue()
for i = 1, self.ScrollBox_Items:GetChildrenCount() do
local Item = self.ScrollBox_Items:GetChildAt(i - 1)
Item:UpdatePlacedItemCount()
end
end
function WB_PlacePanel:OnClosePanel()
WidgetConfig.RemoveDefaultUIMode(WidgetConfig.EDefaultUIMode.PlaceMode)
PlacementModeConfig.GetPlaceManager():SetPlaceMode(PlacementModeConfig.EPlaceMode.None)
end
function WB_PlacePanel:PlaceItem()
SoundSystem.PlaySound(SoundSystem.ESound.Click)
if self.PlaceMode == PlacementModeConfig.EPlaceMode.PlaceMode then
PlacementModeConfig.GetPlaceManager():ClientPlace()
elseif self.PlaceMode == PlacementModeConfig.EPlaceMode.RemoveMode then
PlacementModeConfig.GetPlaceManager():ClientRemoveItem()
end
end
WB_PlacePanel.LastYawValue = 0
---@param Value float
function WB_PlacePanel:YawChange(Value)
local YawValue = (Value - 0.5) * 360
-- if YawValue < 0 then YawValue = YawValue + 360 end
YawValue = KismetMathLibrary.Round(YawValue / PlacementModeConfig.PlacingAttr.RotationSpacing) * PlacementModeConfig.PlacingAttr.RotationSpacing
self:UpdateYawValue(YawValue)
end
function WB_PlacePanel:AddYaw()
SoundSystem.PlaySound(SoundSystem.ESound.Click)
self:UpdateYawValue(self.LastYawValue + PlacementModeConfig.PlacingAttr.RotationSpacing, true)
end
function WB_PlacePanel:SubYaw()
SoundSystem.PlaySound(SoundSystem.ESound.Click)
self:UpdateYawValue(self.LastYawValue - PlacementModeConfig.PlacingAttr.RotationSpacing, true)
end
function WB_PlacePanel:UpdateYawValue(YawValue, UpdateSlider)
YawValue = math.clamp(YawValue, -180, 180)
self.LastYawValue = YawValue
PlacementModeConfig.GetPlaceManager():SetAddPreviewQuat(self.LastYawValue % 360)
self.TextBlock_Yaw:SetText(tostring(YawValue) .. "°")
if UpdateSlider then
self.Slider_Yaw:SetValue(math.clamp(YawValue / 360 + 0.5), 0, 1)
end
end
function WB_PlacePanel:InitPlaceItem()
local PlaceItemWidgetPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/StatusUI/PlacePanel/WB_PlaceItem.WB_PlaceItem_C');
local PlaceItemWidgetClass = UE.LoadClass(PlaceItemWidgetPath)
local LocalPC = UGCSystemLibrary.GetLocalPlayerController()
local PlaceManager = PlacementModeConfig.GetPlaceManager()
local ItemTypes = table.getKeys(PlacementModeConfig.ItemInfo)
table.sort(ItemTypes, function(a, b) return a < b end)
for i, v in pairs(ItemTypes) do
local Item = UserWidget.NewWidgetObjectBP(LocalPC, PlaceItemWidgetClass);
self.ScrollBox_Items:AddChild(Item)
Item:SetItemType(v)
if UE.IsValid(PlaceManager) then
Item:UpdateSelectItem(PlaceManager:GetPlaceItemType())
end
end
end
function WB_PlacePanel:UpdatePlaceMode(InPlaceMode)
if InPlaceMode ~= self.PlaceMode then
self.PlaceMode = InPlaceMode
if self.PlaceMode == PlacementModeConfig.EPlaceMode.PlaceMode then
self.WidgetSwitcher_IsPlace:SetActiveWidgetIndex(0)
self.WidgetSwitcher_ChangeMode:SetActiveWidgetIndex(0)
self.CustomizeCanvasPanel_SetYaw:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
-- self.CustomizeCanvasPanel_SelectPlaceItem:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
elseif self.PlaceMode == PlacementModeConfig.EPlaceMode.RemoveMode then
self.WidgetSwitcher_IsPlace:SetActiveWidgetIndex(1)
self.WidgetSwitcher_ChangeMode:SetActiveWidgetIndex(1)
self.CustomizeCanvasPanel_SetYaw:SetVisibility(ESlateVisibility.Collapsed);
-- self.CustomizeCanvasPanel_SelectPlaceItem:SetVisibility(ESlateVisibility.Collapsed);
end
end
end
function WB_PlacePanel:ChangePlaceMode()
SoundSystem.PlaySound(SoundSystem.ESound.Click)
if self.PlaceMode == PlacementModeConfig.EPlaceMode.PlaceMode then
PlacementModeConfig.GetPlaceManager():SetPlaceMode(PlacementModeConfig.EPlaceMode.RemoveMode)
elseif self.PlaceMode == PlacementModeConfig.EPlaceMode.RemoveMode then
PlacementModeConfig.GetPlaceManager():SetPlaceMode(PlacementModeConfig.EPlaceMode.PlaceMode)
end
end
function WB_PlacePanel:UpdatePlaceValue()
local PlaceValue = PlacementModeConfig.GetPlaceManager():GetPlaceValue()
local PlaceMaxValue = PlacementModeConfig.GetPlaceMaxValue(UGCSystemLibrary.GetLocalPlayerKey())
self.TextBlock_PlaceValue:SetText(tostring(PlaceValue) .. "/" .. tostring(PlaceMaxValue))
-- self.TextBlock_PlaceValue:SetColorAndOpacity({SpecifiedColor = {R = PlaceValue / PlaceMaxValue, G = 1 - PlaceValue / PlaceMaxValue, B = 0, A = 1}, ColorUseRule = 0})
end
function WB_PlacePanel:EnableRunTest()
SoundSystem.PlaySound(SoundSystem.ESound.Click)
UGCLogSystem.Log("[WB_PlacePanel_EnableRunTest]")
UGCSendRPCSystem.RPCEvent(nil, EventEnum.RunMapTest)
end
function WB_PlacePanel:ReturnToMenu()
SoundSystem.PlaySound(SoundSystem.ESound.Click)
UGCLogSystem.Log("[WB_PlacePanel_ReturnToMenu]")
UGCSendRPCSystem.ActorRPCNotify(nil, UGCGameSystem.GameState, "ShowSimplePlaceModeUI", WidgetConfig.EUIType.PlaceModeMainMenu)
end
function WB_PlacePanel:ClickToMenu()
local SecondaryConfirmationWidget = WidgetManager:GetPanel(WidgetConfig.EUIType.SecondaryConfirmation)
SecondaryConfirmationWidget:SetTextInfo("该地图还未保存,是否进行跑图测试后保存?", "不保存", "跑图测试")
SecondaryConfirmationWidget:BindCancellationCallBack(self.ReturnToMenu, self)
SecondaryConfirmationWidget:BindConfirmCallBack(self.EnableRunTest, self)
WidgetManager:ShowPanel(WidgetConfig.EUIType.SecondaryConfirmation, false)
end
function WB_PlacePanel:PlaceItemTypeIsChange(InPlaceItemType)
local ItemInfo = PlacementModeConfig.ItemInfo[InPlaceItemType]
self.PlaceItemType = InPlaceItemType
if ItemInfo then
self:UpdatePlaceItemInfo()
self.TextBlock_ItemName:SetText(ItemInfo.Name)
self.TextBlock_ItemDesc:SetText(ItemInfo.Desc)
end
end
--- 刷新增量信息
function WB_PlacePanel:UpdateItemIncrementInfo()
local ItemInfo = PlacementModeConfig.ItemInfo[self.PlaceItemType]
if ItemInfo then
local ItemIncrement = ArchiveDataConfig.GetPlayerArchiveDataFromType(UGCSystemLibrary.GetLocalPlayerKey(), ArchiveDataConfig.EArchiveType.ItemIncrement)
local Count = ItemInfo.InitialCount
if ItemIncrement and ItemIncrement[self.PlaceItemType] then
Count = ItemIncrement[self.PlaceItemType] + ItemInfo.InitialCount
end
self.bCanIncrement = false
if Count == 0 then
self.WidgetSwitcher_Increment:SetActiveWidgetIndex(1)
elseif Count >= ItemInfo.MaxCount then
self.WidgetSwitcher_Increment:SetActiveWidgetIndex(2)
else
self.bCanIncrement = true
self.WidgetSwitcher_Increment:SetActiveWidgetIndex(0)
end
local UnlockType, Cost = PlacementModeConfig.GetPlaceItemIncrementInfo(self.PlaceItemType)
-- 类型索引是从2开始的
self.WidgetSwitcher_UnlockType:SetActiveWidgetIndex(UnlockType - 2)
self.TextBlock_Increment:SetText(tostring(Cost))
end
end
--- 更新放置上限
function WB_PlacePanel:UpdateItemCountRange()
local ItemInfo = PlacementModeConfig.ItemInfo[self.PlaceItemType]
local CanPlaceNum = PlacementModeConfig.GetPlayerPlaceItemCount(UGCSystemLibrary.GetLocalPlayerKey(), self.PlaceItemType)
local MaxCount = ItemInfo.MaxCount
self.TextBlock_ItemCountRange:SetText(string.format("上限:%d/%d", CanPlaceNum, MaxCount))
end
--- 更新放置物信息栏
function WB_PlacePanel:UpdatePlaceItemInfo()
self:UpdateItemCountRange()
self:UpdateItemIncrementInfo()
end
--- 增量
function WB_PlacePanel:ClickItemIncrement()
if self.PlaceItemType and self.bCanIncrement then
SoundSystem.PlaySound(SoundSystem.ESound.Click)
local UnlockType, Cost = PlacementModeConfig.GetPlaceItemIncrementInfo(self.PlaceItemType)
-- 二次确定消耗解锁
local SecondaryConfirmationWidget = WidgetManager:GetPanel(WidgetConfig.EUIType.SecondaryConfirmation)
if PlacementModeConfig.EUnlockType.None == UnlockType then
elseif PlacementModeConfig.EUnlockType.Level == UnlockType then
SecondaryConfirmationWidget:SetTextInfo("是否增加放置上限?")
else
SecondaryConfirmationWidget:SetTextInfo(string.format("是否消耗%s%s增加放置上限", tostring(Cost), PlacementModeConfig.UnlockName[UnlockType]))
end
SecondaryConfirmationWidget:BindConfirmCallBack(self.ConfirmIncrement, self)
WidgetManager:ShowPanel(WidgetConfig.EUIType.SecondaryConfirmation, false)
end
end
function WB_PlacePanel:ConfirmIncrement()
if self.PlaceItemType then
UGCSendRPCSystem.ActorRPCNotify(nil, UGCGameSystem.GameState, "AddItemIncrement", UGCSystemLibrary.GetLocalPlayerKey(), self.PlaceItemType)
end
end
--- 收起或展开Item信息面板
function WB_PlacePanel:RetractItemInfoPanel()
SoundSystem.PlaySound(SoundSystem.ESound.Click)
if self.bItemInfoPanelIsRetract then
self:PlayAnimation(self.RetractItemInfo, 0, 1, EUMGSequencePlayMode.Reverse, 1)
else
self:PlayAnimation(self.RetractItemInfo, 0, 1, EUMGSequencePlayMode.Forward, 1)
end
self.bItemInfoPanelIsRetract = not self.bItemInfoPanelIsRetract
end
--[[
function WB_PlacePanel:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
end
--]]
--[[
function WB_PlacePanel:ReceiveEndPlay()
self.SuperClass.ReceiveEndPlay(self);
end
--]]
--[[
function WB_PlacePanel:GetReplicatedProperties()
return
end
--]]
--[[
function WB_PlacePanel:GetAvailableServerRPCs()
return
end
--]]
return WB_PlacePanel;