Files

274 lines
11 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using Data;
using Managers;
using UnityEngine;
using System.Linq;
using Entity;
using Map; // 用于 LINQ
namespace EventWorkClass
{
/// <summary>
/// Event_GiveHediff 事件的配置数据结构。
/// </summary>
[Serializable]
public class GiveHediffConfig
{
/// <summary>
/// 要添加或移除的 Hediff 的定义名 (defName)。
/// </summary>
public string HediffDefName;
/// <summary>
/// 要添加或移除的 Hediff 定义的具体类型名,例如 "HediffDef" 或其子类名。
/// 用于 DefineManager 的严格类型查找。
/// </summary>
public string HediffDefTypeName;
/// <summary>
/// 要执行的操作类型:添加或移除 Hediff。
/// </summary>
public HediffActionType ActionType;
/// <summary>
/// 目标实体选择类型。
/// </summary>
public TargetEntitySelectionType TargetSelectionType;
// 以下是各种 TargetSelectionType 可能需要的配置参数
/// <summary>
/// 用于 SpecificEntityById 类型目标实体的唯一ID。
/// </summary>
public string TargetEntityId;
/// <summary>
/// 用于 AllEntitiesInFaction 或 TargetSpecificFactionLeader 类型:目标派系的定义名 (factionDefName)。
/// </summary>
public string TargetFactionDefName;
/// <summary>
/// 用于 AroundSpecificCoordinates 类型:生成中心坐标。
/// </summary>
public Vector3 CenterCoordinates;
/// <summary>
/// 用于 AroundSpecificCoordinates 类型:搜索半径。
/// </summary>
public float Radius = 10f; // 默认半径
}
/// <summary>
/// 定义针对 Hediff 的操作类型。
/// </summary>
public enum HediffActionType
{
/// <summary>
/// 添加 Hediff。
/// </summary>
Add,
/// <summary>
/// 移除 Hediff。
/// </summary>
Remove
}
/// <summary>
/// 定义目标实体选择的类型。
/// </summary>
public enum TargetEntitySelectionType
{
/// <summary>
/// 未指定或无效的目标选择类型。
/// </summary>
None = 0,
/// <summary>
/// 目标是当前玩家(如果存在)。
/// </summary>
Player,
/// <summary>
/// 目标是指定派系的所有活动实体。
/// </summary>
AllEntitiesInFaction,
/// <summary>
/// 目标是指定坐标周围半径内的所有生物。
/// </summary>
AroundSpecificCoordinates
}
/// <summary>
/// Event_GiveHediff 事件类:用于给予或移除健康状态 (Hediff)。
/// </summary>
public class Event_GiveHediff : EventWorkClassBase
{
private GiveHediffConfig _config;
private HediffDef _aimHediffDef;
/// <summary>
/// 初始化 Hediff 给予/移除事件。
/// </summary>
/// <param name="value">包含事件配置的JSON字符串。</param>
public override void Init(string value)
{
if (string.IsNullOrEmpty(value))
{
Debug.LogError("Event_GiveHediff: 初始化值为空或null。请提供一个JSON配置字符串。");
return;
}
try
{
_config = JsonUtility.FromJson<GiveHediffConfig>(value);
if (_config == null)
{
Debug.LogError($"Event_GiveHediff: 无法解析配置JSON: {value}");
return;
}
if (string.IsNullOrEmpty(_config.HediffDefTypeName) || string.IsNullOrEmpty(_config.HediffDefName))
{
Debug.LogError($"Event_GiveHediff: Hediff定义类型名或名称为空或null (名称: '{_config.HediffDefName}', 类型: '{_config.HediffDefTypeName}')。无法查找Hediff定义。");
return;
}
_aimHediffDef = (HediffDef)DefineManager.Instance.FindDefine(_config.HediffDefTypeName, _config.HediffDefName);
if (_aimHediffDef == null)
{
Debug.LogError($"Event_GiveHediff: 未找到Hediff定义 (名称: '{_config.HediffDefName}', 类型: '{_config.HediffDefTypeName}')。请检查配置。");
}
}
catch (Exception ex)
{
Debug.LogError($"Event_GiveHediff: 解析配置JSON时出错: {value}。异常信息: {ex.Message}");
}
}
/// <summary>
/// 运行 Hediff 给予/移除事件。
/// </summary>
/// <param name="dimensionID">目标实体所在的维度ID。</param>
public override void Run(string dimensionID)
{
if (_config == null)
{
Debug.LogError("Event_GiveHediff: 事件配置(_config)为空。Init()可能失败了。");
return;
}
if (_aimHediffDef == null)
{
Debug.LogError($"Event_GiveHediff: 目标Hediff定义为空 (名称: {_config.HediffDefName}, 类型: {_config.HediffDefTypeName})。无法执行操作。");
return;
}
var targetEntities = GetTargetEntities(dimensionID);
if (targetEntities == null || targetEntities.Count == 0)
{
Debug.LogWarning($"Event_GiveHediff: 在维度 '{dimensionID}' 中未找到符合条件的目标实体 (选择类型: {_config.TargetSelectionType})。");
return;
}
var successCount = 0;
var failedCount = 0;
var hediffInstance = new Hediff(_aimHediffDef); // 创建 Hediff 实例
foreach (var entity in targetEntities)
{
if (entity is LivingEntity livingEntity)
{
try
{
if (_config.ActionType == HediffActionType.Add)
{
livingEntity.AddHediff(hediffInstance);
Debug.Log($"Event_GiveHediff: 已向实体 '{livingEntity.name}' 添加 Hediff '{_aimHediffDef.defName}'。");
successCount++;
}
else if (_config.ActionType == HediffActionType.Remove)
{
livingEntity.RemoveHediff(hediffInstance);
Debug.Log($"Event_GiveHediff: 已从实体 '{livingEntity.name}' 移除 Hediff '{_aimHediffDef.defName}'。");
successCount++;
}
}
catch (Exception ex)
{
Debug.LogError($"Event_GiveHediff: 对实体 '{entity.name}' 执行 Hediff 操作时出错: {ex.Message}");
failedCount++;
}
}
else
{
Debug.LogWarning($"Event_GiveHediff: 实体 '{entity.name}' (类型: {entity.GetType().Name}) 不是 LivingEntity无法添加/移除 Hediff。");
failedCount++;
}
}
Debug.Log($"Event_GiveHediff: 完成操作。成功: {successCount},失败: {failedCount} (Hediff: {_aimHediffDef.defName}, 操作: {_config.ActionType})。");
}
/// <summary>
/// 根据配置获取目标实体列表。
/// </summary>
/// <param name="dimensionID">维度ID。</param>
/// <returns>符合条件的目标实体列表。</returns>
private List<Entity.Entity> GetTargetEntities(string dimensionID)
{
var entities = new List<Entity.Entity>();
var dimension = Program.Instance.GetDimension(dimensionID);
if (dimension == null)
{
Debug.LogError($"Event_GiveHediff: 未找到维度 '{dimensionID}'。无法获取目标实体。");
return entities;
}
switch (_config.TargetSelectionType)
{
case TargetEntitySelectionType.Player:
// 假设 PlayerManager.Instance.GetPlayerEntity(dimensionID) 返回 LivingEntity
// 或者你的玩家实体本身就是 LivingEntity
var player = dimension.focusEntity as LivingEntity; // 假设玩家是维度的一部分且是LivingEntity
if (player != null)
{
entities.Add(player);
}
else
{
Debug.LogWarning($"Event_GiveHediff: 未能找到维度 '{dimensionID}' 中的玩家实体或玩家不是 LivingEntity。");
}
break;
case TargetEntitySelectionType.AllEntitiesInFaction:
if (string.IsNullOrEmpty(_config.TargetFactionDefName))
{
Debug.LogWarning("Event_GiveHediff: 配置了 'AllEntitiesInFaction',但 'TargetFactionDefName' 为空。");
return entities;
}
entities.AddRange(EntityManage.Instance
.FindEntitiesByFaction(dimensionID, _config.TargetFactionDefName)
.Select(item => item.entity));
break;
case TargetEntitySelectionType.AroundSpecificCoordinates:
// 假设 EntityManage 提供了根据位置和半径查找实体的方法
// 或者可以直接通过场景查询(例如 Physics.OverlapSphere 或者自定义管理系统)
// 为了简化,我将假设 EntityManage 提供 FindEntitiesAroundRadius 方法
var allEntitiesInDimension = EntityManage.Instance.GetAllEntities(dimensionID)
.Select(item => item.entity);
var center = _config.CenterCoordinates;
var radius = _config.Radius;
foreach (var ent in allEntitiesInDimension)
{
// 确保实体有 Transform 且在半径内
if (ent != null && ent.transform != null && Vector3.Distance(ent.transform.position, center) <= radius)
{
entities.Add(ent);
}
}
break;
case TargetEntitySelectionType.None:
default:
Debug.LogWarning($"Event_GiveHediff: 未知或不支持的目标实体选择类型: {_config.TargetSelectionType}。");
break;
}
return entities;
}
}
}