提交示例代码
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
137
物品和背包的完整代码/Server/Hotfix/Gate/Container/Equip/EquipHelper.cs
Normal file
137
物品和背包的完整代码/Server/Hotfix/Gate/Container/Equip/EquipHelper.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user