Files
2026-05-26 16:15:54 +08:00

313 lines
12 KiB
C#

using asap.core;
using cfg;
using DG.Tweening;
using game;
using Game;
using GameCore;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
public class SupplyDropCtrl : IDisposable
{
SupplyDropData supplyDropData;
FishingBehaviorConf conf;
SupplyDropModel supplyDropModel;
SupplyDropRewardPanel supplyDropPanel;
GameObject supplyDropGo;
GameObject containerGo;
GameObject fx_supplydrop_containerdisappear;
ItemData itemData;
ResetFishingStatusEvent resetFishing;
Tables tables;
public TargetAddData targetAddData;
public Vector3 targetPos;
public ISupplyDropGameCtrl supplyDropGameCtrl;
public void InitData(int supplyDropId, SupplyDropFbx supplyDropFbx, string supplyDropPrefab, int supplyDropDropId, int fishItemId, int fishSubType, FishingBehaviorConf conf)
{
tables = GContext.container.Resolve<Tables>();
supplyDropData = new SupplyDropData();
supplyDropData.supplyDropId = supplyDropId;
supplyDropData.fishItemID = fishItemId;
supplyDropData.fishSubType = fishSubType;
supplyDropData.supplyDropFbx = supplyDropFbx;
supplyDropData.supplyDropPrefab = supplyDropPrefab;
supplyDropData.supplyDropDropId = supplyDropDropId;
this.conf = conf;
}
public async void ShowSupplyDropModel()
{
string supplyDropName = supplyDropData.supplyDropPrefab;
string airscplane = "prop_supplydrop_airscplane";
float randX = UnityEngine.Random.value;
float startX = UnityEngine.Random.Range(conf.supplyDropPlaneStartX[0], conf.supplyDropPlaneStartX[1]);
float endX = UnityEngine.Random.Range(conf.supplyDropPlaneEndX[0], conf.supplyDropPlaneEndX[1]);
float packFlyStartRandX = UnityEngine.Random.Range(0, conf.supplyDropPackFlyStartRand.x);
float YRand = UnityEngine.Random.Range(conf.supplyDropFlyTargetRotationYRand[0], conf.supplyDropFlyTargetRotationYRand[1]);
if (randX < 0.5f)
{
startX = -startX;
endX = -endX;
packFlyStartRandX = -packFlyStartRandX;
YRand = -YRand;
}
Vector3 target = conf.supplyDropPlaneEndPos;
target.x = endX;
Vector3 planeRelativePos = conf.supplyDropPlaneStartPos;
planeRelativePos.x = startX;
Quaternion quaternion = Quaternion.LookRotation(target - planeRelativePos);
GameObject plane = await Addressables.InstantiateAsync(airscplane, planeRelativePos, quaternion * Quaternion.Euler(-90, 0, 0)).Task;
if (plane != null)
{
GContext.Publish(new EventFishingSound("audio_supplydrop_airplane"));
plane.transform.DOMove(target, conf.supplyDropPlaneFlyTime).OnComplete(() =>
{
Addressables.ReleaseInstance(plane);
}).SetEase(Ease.Linear);
}
//显示横幅
ShowPanel();
await Awaiters.Seconds(conf.supplyDropAppearDelay);
Vector3 flyStart = new Vector3();
flyStart.x = conf.supplyDropFlyTargetPos.x + packFlyStartRandX;
flyStart.y = conf.supplyDropPackFlyStartRand.y;
flyStart.z = conf.supplyDropFlyTargetPos.z + UnityEngine.Random.Range(0, conf.supplyDropPackFlyStartRand.z);
supplyDropGo = await Addressables.InstantiateAsync(supplyDropName, flyStart, Quaternion.identity).Task;
if (supplyDropGo != null)
{
GContext.Publish(new EventFishingSound("audio_supplydrop_fly"));
supplyDropModel = supplyDropGo.GetComponent<SupplyDropModel>();
supplyDropGo.transform.DOMove(conf.supplyDropFlyTargetPos, conf.supplyDropFlyTime).OnComplete(() =>
{
GContext.Publish(new EventFishingSound("audio_supplydrop_drop"));
supplyDropModel.SetTrigger("Drop");
}).SetEase(conf.supplyDropFlyCurve);
supplyDropGo.transform.DORotateQuaternion(Quaternion.Euler(0, YRand, 0), conf.supplyDropFlyTime);
//supplyDropFlyTargetRotationYRand
await Awaiters.Seconds(conf.supplyDropFlyTime);
}
supplyDropModel.FxSmokeDelay(conf.supplyDropFxSmokeDelay, conf.supplyDropPackIdleDelay);
await ClaimDelay();
}
async Task ShowPanel()
{
GameObject go = await UIManager.Instance.ShowUINotLoading(UITypes.SupplyDropRewardPanel);
if (go != null)
{
supplyDropPanel = go.GetComponent<SupplyDropRewardPanel>();
SupplyDrop supplyDrop = tables.TbSupplyDrop[supplyDropData.supplyDropId];
supplyDropPanel.Init(LocalizationMgr.GetText(supplyDrop.Name_l10n_key),conf.supplyDropTitleDelay, OnCloseClaim);
}
else
{
await Awaiters.Seconds(5);
OnCloseClaim();
}
}
async Task ClaimDelay()
{
//按钮出现
if (supplyDropPanel != null)
{
await Awaiters.Seconds(conf.supplyDropClaimDelay);
supplyDropPanel.ShowClaim();
}
}
async Task OpenSupplyDropModel()
{
Item item = null;
List<ItemData> itemdatas = GContext.container.Resolve<PlayerItemData>().AddItemByDrop(supplyDropData.supplyDropDropId, false);
itemData = itemdatas[0];
item = tables.TbItem.Get(itemData.id);
Debug.Log("OpenSupplyDrop :" + itemData.id + " " + itemData.count);
if (item.Type == 11 && item.SubType == 1)
{
GContext.container.Resolve<BuffDataCenter>().SetGlobalBucffNew(item.RedirectID, true);
}
else if (item.Type != 14 || item.SubType == 1)
{
targetAddData = new TargetAddData(itemData.id, (int)itemData.curCount, (int)itemData.count);
}
GContext.Publish(new EventFishingSound("audio_supplydrop_open"));
supplyDropModel.SupplyDropOpen(conf.supplyDropOpenDelay);
resetFishing = new ResetFishingStatusEvent();
resetFishing.isSupplyDrop = true;
if (supplyDropData.fishSubType == 4)
{
resetFishing.fishItemId = supplyDropData.fishItemID;
}
await ContainerDelay();
await Awaiters.NextFrame;
if (item.Type != 14 || item.SubType == 1)
{
GContext.Publish(resetFishing);
}
else
{
NewAirdopGameCtrl();
}
Dispose();
}
void NewAirdopGameCtrl()
{
if (itemData.id == 14011)
{
//小玩法,钞票枪
Debug.Log("OpenSupplyDrop:钞票枪");
supplyDropGameCtrl = new SupplyDropGameplayCashCtrl();
}
else if (itemData.id == 14012)
{
//小玩法,卡牌
Debug.Log("OpenSupplyDrop:卡牌");
supplyDropGameCtrl = new SupplyDropGameplayLureCtrl();
}
supplyDropGameCtrl.containerModel = containerGo;
containerGo = null;
supplyDropGameCtrl.InitData(this, supplyDropData.supplyDropId, resetFishing);
}
async Task ClaimCameraBackDelay()
{
ResetFishingStatusEvent resetFishingStatus = new ResetFishingStatusEvent();
resetFishingStatus.isSupplyDrop = true;
resetFishingStatus.playSupplyDropClaim = true;
await Awaiters.Seconds(conf.supplyDropCameraBackDelay);
GContext.Publish(resetFishingStatus);
}
void SetLurecardsShow()
{
SupplyDropItemLurecards supplyDropItemLurecards = containerGo.GetComponent<SupplyDropItemLurecards>();
var supplyDropGameplayLure = tables.TbSupplyDropGameplayLure.DataMap[supplyDropData.supplyDropId];
PlayerItemData playerItemData = GContext.container.Resolve<PlayerItemData>();
int lurecardCount = supplyDropGameplayLure.DropID.Count;
List<int> indexs = new List<int>() { 0, 1, 2 };
//打乱顺序
for (int i = 0; i < lurecardCount; i++)
{
ItemData itemData = playerItemData.GetItemDataOne(supplyDropGameplayLure.DropID[i]);
int randomIndex = UnityEngine.Random.Range(0, indexs.Count);
int j = indexs[randomIndex];
indexs.RemoveAt(randomIndex);
supplyDropItemLurecards.text_num[j].text = $"x{itemData.count}";
supplyDropItemLurecards.skinned_meshes[j].material = supplyDropItemLurecards.material[i];
}
}
async Task ContainerDelay()
{
await Awaiters.Seconds(conf.supplyDropContainerDelay);
float Delay = conf.supplyDropVanishDelay;
containerGo = await Addressables.InstantiateAsync(supplyDropData.supplyDropFbx.Fbx, supplyDropModel.Content.position, Quaternion.identity).Task;
if (containerGo != null)
{
if (itemData.id == 14012)
{
SetLurecardsShow();
}
SupplyDropContentModel supplyDropContentModel = containerGo.GetComponent<SupplyDropContentModel>();
if (supplyDropContentModel != null)
{
supplyDropContentModel.SetTrigger("Fly");
}
containerGo.transform.DOMove(conf.supplyDropContainerFirstFlyRelativePos,
conf.supplyDropContainerFirstFlyTime)
.SetEase(conf.supplyDropContainerFirstFlyCurve).SetRelative();
await Awaiters.Seconds(conf.supplyDropContainerFirstFlyTime);
Vector3 scale = Vector3.one * containerGo.transform.localScale.x * conf.supplyDropContainerFlyScale;
containerGo.transform.DOScale(scale, conf.supplyDropContainerFlyTime).SetEase(conf.supplyDropContainerFlyCurve);
Vector3 FlyPos = conf.supplyDropContainerFlyPos;
containerGo.transform.DOMove(FlyPos, conf.supplyDropContainerFlyTime).SetEase(conf.supplyDropContainerFlyCurve);
await Awaiters.Seconds(conf.supplyDropContainerFlyTime);
if (supplyDropContentModel != null)
{
supplyDropContentModel.SetTrigger("Show");
}
if (supplyDropData.supplyDropFbx.ItemID == 14011 || supplyDropData.supplyDropFbx.ItemID == 14012)
{
if (!string.IsNullOrEmpty(supplyDropData.supplyDropFbx.AudioShow))
{
GContext.Publish(new EventFishingSound(supplyDropData.supplyDropFbx.AudioShow));
}
await Awaiters.Seconds(conf.supplyDropContainerFxDelay);
}
else
{
await Awaiters.Seconds(conf.supplyDropContainerFxDelay);
if (!string.IsNullOrEmpty(supplyDropData.supplyDropFbx.AudioShow))
{
GContext.Publish(new EventFishingSound(supplyDropData.supplyDropFbx.AudioShow));
}
}
Delay -= conf.supplyDropContainerFxDelay;
if (!string.IsNullOrEmpty(supplyDropData.supplyDropFbx.FxShow))
{
fx_supplydrop_containerdisappear = await Addressables.InstantiateAsync(supplyDropData.supplyDropFbx.FxShow, containerGo.transform.position, Quaternion.identity).Task;
}
targetPos = ConvertTools.WorldToScreenPoint(containerGo.transform.position, false);
}
if (Delay > 0)
{
await Awaiters.Seconds(Delay);
}
}
void OnCloseClaim()
{
try
{
ClaimCameraBackDelay();
OpenSupplyDropModel();
ReleaseSupplyDropGo();
}
catch (Exception e)
{
Debug.LogError($"Error in OnCloseClaim: {e.Message}");
}
UIManager.Instance.DestroyUI(UITypes.SupplyDropRewardPanel);
}
async Task ReleaseSupplyDropGo()
{
if (supplyDropGo != null)
{
await Awaiters.Seconds(conf.supplyDropPackVanishDelay);
supplyDropModel.Hide();
Addressables.ReleaseInstance(supplyDropGo);
supplyDropGo = null;
}
}
public void Dispose()
{
if (containerGo != null)
{
Addressables.ReleaseInstance(containerGo);
containerGo = null;
}
if (fx_supplydrop_containerdisappear != null)
{
Addressables.ReleaseInstance(fx_supplydrop_containerdisappear);
fx_supplydrop_containerdisappear = null;
}
}
}