using Core.Health;
using TowerDefense.Agents;
using TowerDefense.Level;
using UnityEngine;
using KTGMGemClient;
using System.Collections.Generic;
using Core.Utilities;
using DG.Tweening;
namespace TowerDefense.Economy
{
///
/// A class that adds money to the currency when the attached DamagableBehaviour dies
/// 每一个Agent都会有一个LootDrop类,对应的DamageableBehaviour分别派生自:
/// Agent--Targetable--DamageableBehaviour
///
[RequireComponent(typeof(DamageableBehaviour))]
public class LootDrop : MonoBehaviour
{
///
/// The amount of loot/currency dropped when object "dies"
///
public int lootDropped;
///
/// The attached DamagableBehaviour
///
protected DamageableBehaviour m_DamageableBehaviour;
///
/// Caches attached DamageableBehaviour
///
protected virtual void OnEnable()
{
if (m_DamageableBehaviour == null)
{
m_DamageableBehaviour = GetComponent();
}
m_DamageableBehaviour.configuration.died += OnDeath;
}
///
/// Unsubscribed from the died event
///
protected virtual void OnDisable()
{
m_DamageableBehaviour.configuration.died -= OnDeath;
}
///
/// The callback for when the attached object "dies".
/// Add to current currency
///
protected virtual void OnDeath(HealthChangeInfo info)
{
m_DamageableBehaviour.configuration.died -= OnDeath;
if (LevelManager.instanceExists)
{
// 当前LootDrop所在的Agent死亡后,给全局的CurrencyManager增加金币.
// 当前Agent死亡之后,需要在对手盘加入新的Agent
LevelManager levelManager = LevelManager.instance;
OpponentMgr opmgr = OpponentMgr.instance;
if (levelManager == null)
return;
Agent agent = gameObject.GetComponent();
if ((agent != null) && agent.opponentAgent)
{
if (opmgr == null)
{
return;
}
opmgr.currency.AddCurrency(lootDropped);
/* 修改为不再死亡后发布怪物到对方视野.
if( agent.bRespawn)
{
AgentSetData sd = agent.mAgentData;
int attid = OpponentMgr.instance.GetTowerAttID(agent.waveLineID);
levelManager.waveManager.SpawnAgent(agent.waveLineID,sd.hp,sd.speed, attid );
}*/
}
else
{
levelManager.currency.AddCurrency(lootDropped);
/*
if (agent.bRespawn)
{
AgentSetData sd = agent.mAgentData;
int attid = levelManager.GetTowerAttID(agent.waveLineID);
opmgr.m_WaveManager.SpawnAgent(agent.waveLineID, sd.hp,sd.speed, attid );
}*/
}
}
else if (EndlessLevelManager.instanceExists)
{
Agent agent = gameObject.GetComponent();
if (agent != null)
{
if (EndlessLevelManager.instance.DropRate > 0)
{
//查询
float rate = Random.Range(0, 100) * 0.01f;
//Debug.Log($"需要处理掉落特效 rate:{rate} EndlessLevelManager.instance.DropRate:{EndlessLevelManager.instance.DropRate}");
if (rate <= EndlessLevelManager.instance.DropRate)
{
}
}
PlayDropCoinPS(agent.position);
EndlessLevelManager.instance.Currency.AddCurrency(lootDropped);
PlayDropGold(lootDropped, agent.position);
// 处理掉落
// int tunel = agent.waveLineID + 1;
// List rewardList = EndlessPortData.GetDropRewardList(EndlessLevelManager.instance.CurrentLevel,
// EndlessLevelManager.instance.WaveManager.CurrentWaveIndex + 1, tunel);
// if (rewardList.Count > 0)
// EndlessDropManager.instance.AddDrop(rewardList, gameObject.transform.position);
}
}
}
GameObject dropGoldPrefab;
GameObject mainUI;
Camera camera3D;
///
/// Awake is called when the script instance is being loaded.
///
void Awake()
{
mainUI = GameObject.Find("MainUI");
dropGoldPrefab = Resources.Load("Prefabs/DropGold");
camera3D = GameObject.Find("SceneCamera3D").GetComponent();
}
private void PlayDropGold(int lootDropped, Vector3 worldPos)
{
if (lootDropped == 0) return;
GameObject obj = Poolable.TryGetPoolable(dropGoldPrefab);
DropGold dropGold = obj.GetComponent();
dropGold.SetDrop(lootDropped);
obj.GetComponent().SetParent(mainUI.GetComponent(), false);
Vector3 screenPos = camera3D.WorldToScreenPoint(worldPos);
screenPos.z = 0;
obj.transform.position = screenPos;
obj.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f);
float preY = obj.transform.position.y;
CanvasGroup canvasGroup = obj.GetComponent();
Sequence sequence = DOTween.Sequence();
sequence.Append(DOTween.To(
() => obj.transform.position.y,
(float v) =>
{
Vector3 pos = obj.transform.position;
pos.y = v;
obj.transform.position = pos;
}, preY + 45, 0.2f)
.SetEase(Ease.OutCubic));
sequence.Append(DOTween.To(
() => canvasGroup.alpha,
(float v) =>
{
canvasGroup.alpha = v;
}, 0, 0.8f).SetDelay(0.5f));
sequence.AppendCallback(() =>
{
canvasGroup.alpha = 1;
Poolable.TryPool(obj);
});
}
private void PlayDropCoinPS(Vector3 worldPos)
{
GameObject prefab = Resources.Load("Prefabs/DropCoin");
GameObject obj = Poolable.TryGetPoolable(prefab);
obj.transform.position = worldPos;
GameObject prefabIcon = Resources.Load("Prefabs/DropCoinImage");
GameObject obj1 = Poolable.TryGetPoolable(prefabIcon);
obj1.GetComponent().SetParent(mainUI.GetComponent(), false);
Vector3 screenPos = camera3D.WorldToScreenPoint(worldPos);
screenPos.z = 0;
obj1.transform.position = screenPos;
obj1.GetComponent().Init();
}
}
}