装备系统可以与背包相似,而装备与道具类似,区别在于装备系统的道具无法堆叠,且装备栏的格子较少。
装备的数据结构,使用数组来保存各个位置的信息。
下标位置代表了各个部位
EQUIP_DATA
WEAPON,ACCESSORY,HELMET,CHEST,SHOULDER,PANTS,BOOTS
然后用一个枚举
Enum Equip{
WEAPON,
ACCESSORY,
HELMET,
CHEST,
SHOULDER,
PANTS,
BOOTS
}
增加的协议
enum ITEM_TYPE{
EQUIP= 3; //装备类型
}
enum EQUIP_SLOT{
WEAPON = 0;
ACCESSORY = 1;
HELMET = 2 ; //头盔
CHEST = 3;//胸甲
SHOULDER = 4; //护肩
PANTS = 5; //裤子
BOOTS = 6; //靴子
SLOT_MAX = 7;
}
message NCharacterInfo {
bytes Equips = 12;
}
message NetMessageRequest{
ItemEquipRequest itemEquip = 12;
}
message NetMessageResponse{
ItemEquipResponse itemEquip = 12;
}
message ItemBuyRequest
{
int32 shopId = 1;
int32 shopItemId = 2;
}
message ItemBuyResponse
{
RESULT result = 1;
string errormsg = 2;
}
增加装备的实体类。
public enum EquipSlot {
WEAPON,
ACCESSORY,
HELMET,
CHEST,
SHOULDER,
PANTS,
BOOTS
}
public class EquipDefine{
public int ID { get; set; }
public EquipSlot Slot { get; set; }
public string Category { get; set; }
public float STR { get; set; }
public float INT { get; set; }
public float DEX { get; set; }
public float HP { get; set; }
public float MP { get; set; }
public float AD { get; set; }
public float AP { get; set; }
public float DEF { get; set; }
public float MDEF { get; set; }
public float SPD { get; set; }
public float CRI { get; set; }
}
在数据库的Character表里增加Equips字段,设置最大长度为28,存储格式为Binary二进制。(为什么是28字节。)
服务器端:
在Character实体类增加
this.Info.Equips = cha.Equips;
将数据库里的装备信息加载入内存。
在DataManager里面加入装载数据的方法。
在ItemService里添加关于装备动作的监听接受request,并且调用EquipManager的方法。EquipManager是单例类,与ItemManager不同,ItemManager是因为Character实体类里有ItemManager,所以需要绑定进去不能是单例。
根据穿装备来考虑EquipManager要做的事,首先考虑谁要穿装备,装备穿上的槽位,道具ID,道具是穿还是脱。
然后直接从session里取出Character.ItemManager,并且根据ItemManager里的数据检验角色是否拥有这件道具。
之后利用与背包系统类似的二维数组的方式存储装备,注意此处是直接用int类型保存ItemId,所以用int指针即可。
class EquipManager : Singleton<EquipManager>
{
public Result EquipItem(NetConnection<NetSession> sender,int slot,int itemId,bool isEquip) {
Character character = sender.Session.Character;
if (!character.itemManager.Items.ContainsKey(itemId)) //判断角色是否拥有道具
{
return Result.Failed;
}
UpdateEquip(character.Data.Equips, slot, itemId, isEquip);
DBService.Instance.Save();
return Result.Success;
}
unsafe void UpdateEquip(byte[] equipData,int slot,int itemId,bool isEquip) {
fixed (byte* first = equipData) {