提交示例代码

This commit is contained in:
Bob.Song
2026-03-05 11:39:06 +08:00
commit 25958f58c3
2534 changed files with 209593 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
using Fantasy.Entitas;
using Fantasy.Entitas.Interface;
using Fantasy.Helper;
namespace Fantasy.Equip;
public class EquipComponentAwakeSystem : AwakeSystem<EquipComponent>
{
protected override void Awake(EquipComponent self)
{
self.Awake();
}
}
public sealed class EquipComponentDestroySystem : DestroySystem<EquipComponent>
{
protected override void Destroy(EquipComponent self)
{
foreach (var (_, value) in self.MainAttrs)
{
value.Dispose();
}
foreach (var (_, value) in self.EntryAttrs)
{
value.Dispose();
}
self.Affixs.Clear();
self.MainAttrs.Clear();
self.EntryAttrs.Clear();
self.Durable = 0;
self.DurableMax = 0;
}
}
public sealed class EquipAttrDestroySystem : DestroySystem<EquipAttr>
{
protected override void Destroy(EquipAttr self)
{
self.Key = 0;
self.Value = 0;
self.SValue = 0;
}
}
public static class EquipComponentSystem
{
public static void Awake(this EquipComponent self)
{
var item = self.GetParent<Item>();
var itemConfig = item.Config;
// 设置装备的耐久
self.Durable = itemConfig.Durable;
self.DurableMax = self.Durable;
// 获取装备品质主属性方案
if (!EquipValueConfigData.Instance.TryGetValue(itemConfig.Id, itemConfig.Quality, out var equipValueConfig))
{
// 没有找到主属性方案,需要检查代码或配置表是否正确。
// 到这里的话就不需要继续执行了。
return;
}
// 设置主属性
self.InitMainAttrs(itemConfig, equipValueConfig);
// 设置附加(副)属性
self.InitEntryAttrs(itemConfig, equipValueConfig);
// 设置词缀
self.InitAffix(itemConfig, equipValueConfig);
}
private static void InitMainAttrs(this EquipComponent self, ItemConfig itemConfig, EquipValueConfig equipValueConfig)
{
self.MainAttrs.Clear();
// 循环遍历主属性。
foreach (var (key, value) in equipValueConfig.MainAttrs.Dic)
{
var equipAttr = Entity.Create<EquipAttr>(self.Scene, true, true);
equipAttr.Key = key;
equipAttr.Value = value;
self.MainAttrs.Add(key, equipAttr);
}
// 这里还可以加一些其他的需求。
}
private static void InitEntryAttrs(this EquipComponent self, ItemConfig itemConfig, EquipValueConfig equipValueConfig)
{
var equipEntryConfigId = equipValueConfig.EquipEntryConfigId;
// 很有可能当前的装备没有附加(副)属性,所以如果为默认值的情况下就不进行下面的逻辑。
if (equipEntryConfigId == 0)
{
return;
}
// 还有一种可能是设置的副(附加)属性不存在,一般这样的情况下都是策划配置的错误,这里的话也不进行下面的逻辑了。
if (!EquipEntryConfigData.Instance.TryGet(equipEntryConfigId, out var equipEntryConfig))
{
// 也可以在这里打印出一个错误,方便排查,找到这个错误告诉策划,让策划修改下。
// 推荐做法也可以一个单独的Scene在这里Scene里把这些所有配置加载出来按个的排查如果有错误就打印出来。
return;
}
self.EntryAttrs.Clear();
// 这里可以用权重来控制随机的数量和属性,但是这里就不演示的。
// 这里就是用直接的随机来做来了。
var entryCount = RandomHelper.RandomNumber(equipEntryConfig.Min, equipEntryConfig.Max);
// 获得当前随机附加属性的列表
var configAttrs = equipEntryConfig.Attrs;
var entryIndex = 0;
for (var i = 0; i < entryCount; i++)
{
var equipAttr = Entity.Create<EquipAttr>(self.Scene, true, true);
equipAttr.Key = configAttrs[entryIndex];
equipAttr.Value = RandomHelper.RandomNumber(configAttrs[entryIndex + 1], configAttrs[entryIndex + 2]);
self.EntryAttrs.Add(equipAttr.Key, equipAttr);
}
}
private static void InitAffix(this EquipComponent self, ItemConfig itemConfig, EquipValueConfig equipValueConfig)
{
var equipEntryConfigId = equipValueConfig.EquipEntryConfigId;
if (equipEntryConfigId == 0)
{
return;
}
if (!EquipEntryConfigData.Instance.TryGet(equipEntryConfigId, out var equipEntryConfig))
{
// 也可以在这里打印出一个错误,方便排查,找到这个错误告诉策划,让策划修改下。
// 推荐做法也可以一个单独的Scene在这里Scene里把这些所有配置加载出来按个的排查如果有错误就打印出来。
return;
}
if (equipEntryConfig.Affix.Length == 0)
{
// 有可能没有词缀,所以这里就不进行下面的逻辑了。
return;
}
// 随机词缀的数量
// 这里还是只做最简单的随机,如果想加权重的随机,可以自己实现下。
var configAffix = equipEntryConfig.Affix;
var affixCount = RandomHelper.RandomNumber(equipEntryConfig.AffixMin, equipEntryConfig.AffixMax);
for (var i = 0; i < affixCount; i++)
{
self.Affixs.Add(configAffix[i]);
}
}
public static EquipInfo ToEquipInfo(this EquipComponent self)
{
var equipInfo = new EquipInfo();
equipInfo.Durable = self.Durable;
equipInfo.DurableMax = self.DurableMax;
foreach (var (key,equipAttr) in self.MainAttrs)
{
equipInfo.MainKeys.Add(key);
equipInfo.EquipAttrKeys.Add(key);
equipInfo.EquipAttrValues.Add(equipAttr.Value);
equipInfo.EquipAttrSValues.Add(equipAttr.SValue);
}
return equipInfo;
}
}

View File

@@ -0,0 +1,137 @@
namespace Fantasy;
public static class EquipHelper
{
/// <summary>
/// 装载一个装备
/// </summary>
/// <param name="account"></param>
/// <param name="mountEquipItem"></param>
/// <returns></returns>
public static uint MountEquip(Account account, Item mountEquipItem)
{
var itemConfig = mountEquipItem.Config;
if (!itemConfig.IsEquip())
{
// 这里返回的是不是装备的错误码。
return 1;
}
if (mountEquipItem.Container.Config.Type != (int)ContainerType.Bag)
{
// 只有在背包里的物品才可以装备到装备栏里的错误码。
return 2;
}
var mountEquipPosition = itemConfig.Position;
// 如果在目标装备栏上有装备,那就先卸载装备。
UnMountEquip(account, (EquipPosition)mountEquipPosition, true);
// 下面要执行把装备添加到装备栏上。
// 先在背包中移除该装备,因为已经得到了装备了,所以可以直接通过物品拿到背包的容器。
var removeItem = mountEquipItem.Container.RemoveItem(mountEquipItem, ItemReason.MountEquipRemove, true, false);
if (removeItem != 0)
{
// 移除装备的时候,发生了错误,直接返回错误码。
return removeItem;
}
// 把装备添加到对应的装备栏上。
var addItem = ContainerHelper.AddItem(account, ContainerType.Equip, mountEquipItem, mountEquipPosition,
ItemReason.MountEquipAdd, true);
if (addItem != 0)
{
// 添加装备的时候,发生了错误,直接返回错误码。
return addItem;
}
// 这里要执行添加装备后因为装备有增加属性或词缀Buff所以需要在添加的时候把这些也要给添加下。
// 因为本课程胡总没有数值系统和Buff系统所以这里就不处理了。
Log.Debug($"执行了装备装备的效果逻辑。");
Log.Debug($"装载装备完成。mountEquipItem:{mountEquipItem.Id}");
// 可以合包优化下这个协议的数量,优化成一个,能节省流量。
return 0;
}
/// <summary>
/// 卸载一个装备
/// </summary>
/// <param name="account"></param>
/// <param name="equipPosition"></param>
/// <param name="isSendClient"></param>
/// <returns></returns>
public static uint UnMountEquip(Account account, EquipPosition equipPosition, bool isSendClient)
{
if (!ContainerHelper.GetItemByCell(account, ContainerType.Equip, (long)equipPosition, out var unMountEquipItem))
{
// 没有找到该位置的装备的错误码。
return 1;
}
return UnMountEquip(account, unMountEquipItem, isSendClient);
}
/// <summary>
/// 卸载一个装备
/// </summary>
/// <param name="account"></param>
/// <param name="unMountEquipItem"></param>
/// <param name="isSendClient"></param>
/// <returns></returns>
public static uint UnMountEquip(Account account, Item unMountEquipItem, bool isSendClient)
{
// 首先在装备栏容器中移除装备。
var removeItem = unMountEquipItem.Container.RemoveItem(unMountEquipItem, ItemReason.UnMountEquipRemove, isSendClient, false);
if (removeItem != 0)
{
// 移除失败了,要返回错误码,就不要执行后面的程序了。
return removeItem;
}
// 这里要执行移除装备后因为装备有增加属性或词缀Buff所以需要在移除的时候把这些也要给移除下。
// 因为本课程胡总没有数值系统和Buff系统所以这里就不处理了。
// 把移除成功的装备再次添加到背包容器中。
Log.Debug("执行了装备卸载的效果逻辑。");
return ContainerHelper.AddItem(account, ContainerType.Bag, unMountEquipItem, ItemReason.UnMountEquipAdd, isSendClient);
}
/// <summary>
/// 根据装备的位置获取装备
/// </summary>
/// <param name="account"></param>
/// <param name="equipPosition"></param>
/// <param name="item"></param>
/// <returns></returns>
public static bool GetEquipItem(Account account, EquipPosition equipPosition, out Item item)
{
return ContainerHelper.GetItemByCell(account, ContainerType.Equip, (long)equipPosition, out item);
}
/// <summary>
/// 是否是装备
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public static bool IsEquip(this Item item)
{
return item.Config.IsEquip();
}
/// <summary>
/// 获得装备所在的装备栏位置
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public static EquipPosition GetEquipPosition(this Item item)
{
return (EquipPosition)item.GetEquipPositionInt();
}
private static int GetEquipPositionInt(this Item item)
{
return item.Config.Position;
}
private static bool IsEquip(this ItemConfig itemConfig)
{
var configType = (ItemType)itemConfig.Type;
return configType == ItemType.Equip;
}
}