using System; using Data; using Managers; using Newtonsoft.Json; using UnityEngine; namespace EventWorkClass { /// /// 表示物品生成事件的配置数据结构,从 JSON 反序列化而来。 /// public class ItemSpawnData { /// /// 要生成的物品的定义名称 (例如:"IRON_SWORD")。这是必填字段。 /// [JsonProperty("itemDefName", Required = Required.Always)] public string ItemDefName { get; set; } [JsonProperty("itemCount")] public int ItemCount { get; set; } = 1; /// /// 物品生成的绝对坐标。如果提供了此字段,将优先使用。 /// [JsonProperty("position")] public Vector3? Position { get; set; } /// /// 物品相对于事件触发者 (initiator) 的偏移坐标。 /// 只有当 initiator 存在且未指定 Position 时才使用。 /// [JsonProperty("relativeOffset")] public Vector3? RelativeOffset { get; set; } } /// /// 一个继承自 EventWorkClassBase 的类,用于处理游戏世界中物品的生成。 /// 通过 JSON 配置来指定要生成的物品及其生成位置。 /// public class Event_ItemGenerater : EventWorkClassBase { private ItemSpawnData _spawnData; /// /// 初始化物品生成工作类。通过解析 JSON 字符串来配置物品生成参数。 /// JSON 必须包含 "itemDefName" 字段,可以可选地包含 "position" 或 "relativeOffset"。 /// /// 包含物品生成配置的 JSON 字符串。 /// 当 JSON 字符串为空或null时抛出。 /// 当 JSON 字符串格式不正确时抛出。 /// 当 JSON 中缺少必要的 "itemDefName" 字段时抛出。 public override void Init(string value) { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException(nameof(value), "物品生成工作类的初始化JSON不能为空。"); try { _spawnData = JsonConvert.DeserializeObject(value); } catch (JsonException ex) { throw new JsonSerializationException( "解析物品生成工作类配置JSON失败,请检查JSON格式。", ex ); } if (_spawnData == null) throw new InvalidOperationException("物品生成数据无法反序列化。结果对象为null。"); if (string.IsNullOrWhiteSpace(_spawnData.ItemDefName)) throw new InvalidOperationException("物品生成配置缺少必填字段 'itemDefName'。"); } /// /// 执行物品生成操作。根据配置和initiator确定生成位置。 /// /// 物品生成的维度ID。 /// 触发此事件的实体,可用于相对定位。 /// /// 当类未初始化、物品定义未找到或无法确定生成位置时抛出。 /// public override void Run(string dimensionID, Entity.Entity initiator = null) { if (_spawnData == null) throw new InvalidOperationException("ItemSpawnWorkClass尚未初始化。请先调用Init()方法。"); // 查找物品定义 var itemDef = DefineManager.Instance.FindDefine(_spawnData.ItemDefName); if (itemDef == null) throw new InvalidOperationException( $"生成物品失败:在DefineManager中未找到物品定义 '{_spawnData.ItemDefName}'。" ); // 确定物品生成位置 Vector3 spawnPos; if (_spawnData.Position.HasValue) spawnPos = _spawnData.Position.Value; else if (_spawnData.RelativeOffset.HasValue && initiator) spawnPos = initiator.Position + _spawnData.RelativeOffset.Value; else if (initiator) spawnPos = initiator.Position; else throw new InvalidOperationException( "无法确定物品生成位置。配置中未指定'position'或'relativeOffset',也未提供'initiator'实体作为默认位置。" ); for (var i = 0; i < _spawnData.ItemCount; i++) EntityManager.Instance.GeneratePickupEntity(dimensionID, itemDef, spawnPos); } } }