618 lines
18 KiB
C#
618 lines
18 KiB
C#
|
//**********************************************//
|
|||
|
//作者:#何健#
|
|||
|
//日期:#2016.10.14#
|
|||
|
//简述:#装备数据结构#
|
|||
|
//*********************************************//
|
|||
|
using UnityEngine;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
|
|||
|
using Thousandto.Cfg.Data;
|
|||
|
using Thousandto.Code.Global;
|
|||
|
using Thousandto.Code.Center;
|
|||
|
using Thousandto.Plugins.Common;
|
|||
|
|
|||
|
namespace Thousandto.Code.Logic
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 类Equipment说明
|
|||
|
/// </summary>
|
|||
|
public class Equipment: ItemBase
|
|||
|
{
|
|||
|
#region//静态变量
|
|||
|
public static Dictionary<int, Dictionary<int, ulong>> EquipBaseAttDic = null;
|
|||
|
public static Dictionary<int, Dictionary<int, ulong>> EquipSpecialAttDic = null;
|
|||
|
public static Dictionary<int, Dictionary<int, ulong>> EquipGodAttDic = null;
|
|||
|
#endregion
|
|||
|
|
|||
|
#region //私有变量
|
|||
|
private DeclareEquip _equip; //装备表数据
|
|||
|
private int _suitID; //当前套装ID
|
|||
|
private DeclareEquipSuit _suitCfg; //当前套装配置
|
|||
|
private int _curSuitEquipCount;//当前装备的套装数量
|
|||
|
private int _curLevelSuitEquipCount; //当前套装等级的套装数量
|
|||
|
private List<int> _activeSuitNums; //激活的套装数量列表
|
|||
|
private List<int> _activeSuitIds; //激活的套装的id列表
|
|||
|
private uint _power;
|
|||
|
|
|||
|
//基础属性
|
|||
|
private Dictionary<int, ulong> _baseAttrs;
|
|||
|
private Dictionary<int, ulong> _specialAttrs;
|
|||
|
private Dictionary<int, ulong> _godAttrs;
|
|||
|
|
|||
|
private MSG_backpack.ItemInfo _itemInfoFromServer;
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region //属性
|
|||
|
public DeclareEquip ItemInfo
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _equip;
|
|||
|
}
|
|||
|
}
|
|||
|
public int SuitID
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _suitID;
|
|||
|
}
|
|||
|
}
|
|||
|
public DeclareEquipSuit SuitCfg
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _suitCfg;
|
|||
|
}
|
|||
|
}
|
|||
|
public int CurSuitEquipCount
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _curSuitEquipCount;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_curSuitEquipCount = value;
|
|||
|
}
|
|||
|
}
|
|||
|
public int CurLevelSuitEquipCount
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _curLevelSuitEquipCount;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_curLevelSuitEquipCount = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public List<int> ActiveSuitNums
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_activeSuitNums == null)
|
|||
|
{
|
|||
|
_activeSuitNums = new List<int>();
|
|||
|
}
|
|||
|
return _activeSuitNums;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public List<int> ActiveSuitIds
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_activeSuitIds == null)
|
|||
|
{
|
|||
|
_activeSuitIds = new List<int>();
|
|||
|
}
|
|||
|
return _activeSuitIds;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//继承父类
|
|||
|
public override bool Initialization()
|
|||
|
{
|
|||
|
base.Initialization();
|
|||
|
_equip = DeclareEquip.Get( CfgID );
|
|||
|
if (_equip == null)
|
|||
|
{
|
|||
|
Debug.LogError("equip info initialization declareequip is null id = " + CfgID);
|
|||
|
}
|
|||
|
_suitID = 0;
|
|||
|
_suitCfg = null;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public override void UnInitialization()
|
|||
|
{
|
|||
|
_baseAttrs.Clear();
|
|||
|
}
|
|||
|
|
|||
|
public override int GetItemType()
|
|||
|
{
|
|||
|
return ItemType.Equip;
|
|||
|
}
|
|||
|
public override string GetName()
|
|||
|
{
|
|||
|
string ret = "";
|
|||
|
if (null != ItemInfo)
|
|||
|
{
|
|||
|
if (SuitCfg != null)
|
|||
|
{
|
|||
|
ret = SuitCfg.Prefix + ItemInfo.Name;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ret = ItemInfo.Name;
|
|||
|
}
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
public override int GetIcon()
|
|||
|
{
|
|||
|
int ret = -1;
|
|||
|
if (ItemInfo != null)
|
|||
|
ret = ItemInfo.Icon;
|
|||
|
return ret;
|
|||
|
}
|
|||
|
public override int GetEffect()
|
|||
|
{
|
|||
|
int ret = -1;
|
|||
|
if (ItemInfo != null)
|
|||
|
ret = ItemInfo.Effect;
|
|||
|
return ret;
|
|||
|
}
|
|||
|
public override int GetQuality()
|
|||
|
{
|
|||
|
int ret = -1;
|
|||
|
if (ItemInfo != null)
|
|||
|
ret = ItemInfo.Quality;
|
|||
|
return ret;
|
|||
|
}
|
|||
|
public override int GetStarNum()
|
|||
|
{
|
|||
|
var ret = 0;
|
|||
|
if (ItemInfo != null)
|
|||
|
ret = ItemInfo.DiamondNumber;
|
|||
|
return ret;
|
|||
|
}
|
|||
|
public override string GetOcc()
|
|||
|
{
|
|||
|
if (ItemInfo != null)
|
|||
|
{
|
|||
|
return ItemInfo.Gender;
|
|||
|
}
|
|||
|
return "";
|
|||
|
}
|
|||
|
public override int GetPart()
|
|||
|
{
|
|||
|
var ret = -1;
|
|||
|
if (ItemInfo != null)
|
|||
|
ret = ItemInfo.Part;
|
|||
|
return ret;
|
|||
|
}
|
|||
|
public override int GetGrade()
|
|||
|
{
|
|||
|
var ret = 0;
|
|||
|
if (ItemInfo != null)
|
|||
|
ret = ItemInfo.Grade;
|
|||
|
return ret;
|
|||
|
}
|
|||
|
public override uint GetPower()
|
|||
|
{
|
|||
|
return _power;
|
|||
|
}
|
|||
|
|
|||
|
public override bool IsCanUse( int useType = ItemOpertion.Use )
|
|||
|
{
|
|||
|
return base.IsCanUse( useType );
|
|||
|
}
|
|||
|
|
|||
|
public override bool CheckLevel( int level )
|
|||
|
{
|
|||
|
return ItemInfo.Level <= level;
|
|||
|
}
|
|||
|
|
|||
|
public override bool CheackOcc( int sex )
|
|||
|
{
|
|||
|
if (Occ.IndexOf("9") >= 0)
|
|||
|
return true;
|
|||
|
bool ret = false;
|
|||
|
if ( ItemInfo.Gender.IndexOf(sex.ToString()) >= 0 )
|
|||
|
{
|
|||
|
ret = true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ret = false;
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
public override bool CheckBetterThanDress()
|
|||
|
{
|
|||
|
var dressEquip = GameCenter.EquipmentSystem.GetPlayerDressEquip(Part);
|
|||
|
if(dressEquip != null)
|
|||
|
{
|
|||
|
return Power > dressEquip.Power;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public override bool CheckCanEquip()
|
|||
|
{
|
|||
|
return GameCenter.EquipmentSystem.OnCheckCanEquip(this);
|
|||
|
}
|
|||
|
|
|||
|
public override bool CheckClass()
|
|||
|
{
|
|||
|
if (ItemInfo.Classlevel <= 0)
|
|||
|
return true;
|
|||
|
else
|
|||
|
{
|
|||
|
LocalPlayer p = GameCenter.GameSceneSystem.GetLocalPlayer();
|
|||
|
if (p != null)
|
|||
|
{
|
|||
|
if (p.ChangeJobLevel >= ItemInfo.Classlevel)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
public override bool isTimeOut()
|
|||
|
{
|
|||
|
return base.isTimeOut();
|
|||
|
}
|
|||
|
|
|||
|
public override bool IsNeedSecond( int useType = ItemOpertion.Use )
|
|||
|
{
|
|||
|
bool ret= false;
|
|||
|
if (ItemInfo == null)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
switch ( useType )
|
|||
|
{
|
|||
|
case ItemOpertion.Use:
|
|||
|
ret = ItemInfo.Quality >= 4; //紫色以上装备就需要提示
|
|||
|
break;
|
|||
|
case ItemOpertion.Split:
|
|||
|
ret = false;
|
|||
|
break;
|
|||
|
case ItemOpertion.Sell:
|
|||
|
case ItemOpertion.Stall:
|
|||
|
case ItemOpertion.Resolve:
|
|||
|
ret = ItemInfo.Quality >= 4; //紫色以上装备就需要提示
|
|||
|
break;
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
public override bool IsUsedInBatches()
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
//检测是否可以上架
|
|||
|
public override bool CanAuction()
|
|||
|
{
|
|||
|
if (!GameCenter.MainFunctionSystem.FunctionIsVisible(FunctionStartIdCode.Auchtion))
|
|||
|
return false;
|
|||
|
if (IsBind)
|
|||
|
return false;
|
|||
|
if (ItemInfo.AuctionMaxPrice == 0)
|
|||
|
return false;
|
|||
|
return true;
|
|||
|
}
|
|||
|
//使用物品
|
|||
|
public override void UseItem()
|
|||
|
{
|
|||
|
GameCenter.EquipmentSystem.RequestEquipWear(this);
|
|||
|
}
|
|||
|
|
|||
|
//获取和已穿戴装备的战斗力差
|
|||
|
public override int GetDressPowerDiff()
|
|||
|
{
|
|||
|
var dressEquip = GameCenter.EquipmentSystem.GetPlayerDressEquip(Part);
|
|||
|
if (dressEquip != null)
|
|||
|
{
|
|||
|
return (int)Power - (int)dressEquip.Power;
|
|||
|
}
|
|||
|
return (int)Power;
|
|||
|
}
|
|||
|
|
|||
|
//判断是否是首饰
|
|||
|
public bool IsJewelry()
|
|||
|
{
|
|||
|
if (Part == EquipmentType.FingerRing || Part == EquipmentType.Necklace)
|
|||
|
return true;
|
|||
|
return false;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//公共接口
|
|||
|
public Equipment( MSG_backpack.ItemInfo info ):
|
|||
|
base(info)
|
|||
|
{
|
|||
|
Initialization();
|
|||
|
_suitID = info.suitId;
|
|||
|
_suitCfg = DeclareEquipSuit.Get(_suitID);
|
|||
|
SetAttribute();
|
|||
|
|
|||
|
_itemInfoFromServer = info;
|
|||
|
}
|
|||
|
|
|||
|
public Equipment( Equipment info ):
|
|||
|
base(info)
|
|||
|
{
|
|||
|
Initialization();
|
|||
|
_suitID = info._suitID;
|
|||
|
_suitCfg = info._suitCfg;
|
|||
|
SetAttribute();
|
|||
|
_itemInfoFromServer = info._itemInfoFromServer;
|
|||
|
}
|
|||
|
|
|||
|
public string ToProtoBufferBytes()
|
|||
|
{
|
|||
|
byte[] bytes = Plugins.Common.ProtoBufUtils.Serialize(_itemInfoFromServer);
|
|||
|
return Convert.ToBase64String(bytes);
|
|||
|
}
|
|||
|
|
|||
|
public static Equipment ToEquipment(string str)
|
|||
|
{
|
|||
|
Equipment result;
|
|||
|
byte[] message = Convert.FromBase64String(str);
|
|||
|
MSG_backpack.ItemInfo itemInfo = new MSG_backpack.ItemInfo();
|
|||
|
ProtoBufUtils.Deserialize(itemInfo, message);
|
|||
|
result = new Equipment(itemInfo);
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
public Equipment(int id) :
|
|||
|
base(id)
|
|||
|
{
|
|||
|
Initialization();
|
|||
|
_suitID = 0;
|
|||
|
_suitCfg = null;
|
|||
|
SetAttribute();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获取装备的最基本的属性值
|
|||
|
/// </summary>
|
|||
|
/// <returns>属性类型,属性值</returns>
|
|||
|
public Dictionary<int , ulong> GetBaseAttribute()
|
|||
|
{
|
|||
|
if (_baseAttrs != null)
|
|||
|
return _baseAttrs;
|
|||
|
return new Dictionary<int, ulong>();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获取装备的最基本的属性值
|
|||
|
/// </summary>
|
|||
|
/// <returns>属性类型,属性值</returns>
|
|||
|
public Dictionary<int, ulong> GetSpecialAttribute()
|
|||
|
{
|
|||
|
if (_specialAttrs != null)
|
|||
|
return _specialAttrs;
|
|||
|
return new Dictionary<int, ulong>();
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 获取装备的最基本的属性值
|
|||
|
/// </summary>
|
|||
|
/// <returns>属性类型,属性值</returns>
|
|||
|
public Dictionary<int, ulong> GetGodAttribute()
|
|||
|
{
|
|||
|
if (_godAttrs != null)
|
|||
|
return _godAttrs;
|
|||
|
return new Dictionary<int, ulong>();
|
|||
|
}
|
|||
|
|
|||
|
//是否有效
|
|||
|
public override bool IsValid()
|
|||
|
{
|
|||
|
return _equip != null;
|
|||
|
}
|
|||
|
|
|||
|
//增加套装激活数
|
|||
|
public void AddSuitActiveNum(int num, int id)
|
|||
|
{
|
|||
|
if(!ActiveSuitNums.Contains(num))
|
|||
|
{
|
|||
|
ActiveSuitNums.Add(num);
|
|||
|
ActiveSuitIds.Add(id);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//清除套装激活数
|
|||
|
public void ClearSuitActiveNum()
|
|||
|
{
|
|||
|
ActiveSuitNums.Clear();
|
|||
|
ActiveSuitIds.Clear();
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region//私有方法
|
|||
|
/// <summary>
|
|||
|
/// 计算当前装备的属性值
|
|||
|
/// </summary>
|
|||
|
/// <param name="level"></param>
|
|||
|
/// <returns>属性类型,增加的属性值</returns>
|
|||
|
private void SetAttribute()
|
|||
|
{
|
|||
|
if (EquipBaseAttDic == null)
|
|||
|
{
|
|||
|
EquipBaseAttDic = new Dictionary<int, Dictionary<int, ulong>>(512);
|
|||
|
}
|
|||
|
if(EquipBaseAttDic.ContainsKey(_equip.Id))
|
|||
|
{
|
|||
|
_baseAttrs = EquipBaseAttDic[_equip.Id];
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_baseAttrs == null)
|
|||
|
_baseAttrs = new Dictionary<int, ulong>();
|
|||
|
_baseAttrs.Clear();
|
|||
|
|
|||
|
if (_equip == null) return;
|
|||
|
var attrsArr = _equip.Attribute1.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
for (int i = 0; i < attrsArr.Length; i++)
|
|||
|
{
|
|||
|
string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
if (attrs.Length == 2)
|
|||
|
{
|
|||
|
int iType = int.Parse(attrs[0]);
|
|||
|
int baseAttr = int.Parse(attrs[1]);
|
|||
|
if (_baseAttrs.ContainsKey(iType))
|
|||
|
continue;
|
|||
|
_baseAttrs.Add(iType, (ulong)baseAttr);
|
|||
|
}
|
|||
|
}
|
|||
|
//将属性缓存起来,下次使用的时候不会再次GC
|
|||
|
EquipBaseAttDic[_equip.Id] = _baseAttrs;
|
|||
|
}
|
|||
|
|
|||
|
if (EquipSpecialAttDic == null)
|
|||
|
{
|
|||
|
EquipSpecialAttDic = new Dictionary<int, Dictionary<int, ulong>>(512);
|
|||
|
}
|
|||
|
if (EquipSpecialAttDic.ContainsKey(_equip.Id))
|
|||
|
{
|
|||
|
_specialAttrs = EquipSpecialAttDic[_equip.Id];
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_specialAttrs == null)
|
|||
|
_specialAttrs = new Dictionary<int, ulong>();
|
|||
|
_specialAttrs.Clear();
|
|||
|
var attrsArr = _equip.Attribute2.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
for (int i = 0; i < attrsArr.Length; i++)
|
|||
|
{
|
|||
|
string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
if (attrs.Length == 2)
|
|||
|
{
|
|||
|
int iType = int.Parse(attrs[0]);
|
|||
|
int baseAttr = int.Parse(attrs[1]);
|
|||
|
if (_specialAttrs.ContainsKey(iType))
|
|||
|
continue;
|
|||
|
_specialAttrs.Add(iType, (ulong)baseAttr);
|
|||
|
}
|
|||
|
}
|
|||
|
//将属性缓存起来,下次使用的时候不会再次GC
|
|||
|
EquipSpecialAttDic[_equip.Id] = _specialAttrs;
|
|||
|
}
|
|||
|
|
|||
|
if (EquipGodAttDic == null)
|
|||
|
{
|
|||
|
EquipGodAttDic = new Dictionary<int, Dictionary<int, ulong>>(512);
|
|||
|
}
|
|||
|
if (EquipGodAttDic.ContainsKey(_equip.Id))
|
|||
|
{
|
|||
|
_godAttrs = EquipGodAttDic[_equip.Id];
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_godAttrs == null)
|
|||
|
_godAttrs = new Dictionary<int, ulong>();
|
|||
|
_godAttrs.Clear();
|
|||
|
var attrsArr = _equip.Attribute3.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
for (int i = 0; i < attrsArr.Length; i++)
|
|||
|
{
|
|||
|
string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
if (attrs.Length == 2)
|
|||
|
{
|
|||
|
int iType = int.Parse(attrs[0]);
|
|||
|
int baseAttr = int.Parse(attrs[1]);
|
|||
|
if (_godAttrs.ContainsKey(iType))
|
|||
|
continue;
|
|||
|
_godAttrs.Add(iType, (ulong)baseAttr);
|
|||
|
}
|
|||
|
}
|
|||
|
//将属性缓存起来,下次使用的时候不会再次GC
|
|||
|
EquipGodAttDic[_equip.Id] = _godAttrs;
|
|||
|
}
|
|||
|
_power = FightPowerHelper.GetPropetryPower(_baseAttrs) + FightPowerHelper.GetPropetryPower(_specialAttrs) + FightPowerHelper.GetPropetryPower(_godAttrs);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region //辅助方法 此为静态方法
|
|||
|
|
|||
|
//装备职业名字
|
|||
|
public static string GetOccNameWithOcc( string gender)
|
|||
|
{
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(gender))
|
|||
|
{
|
|||
|
string rest = null;
|
|||
|
var arr = gender.Split('_');
|
|||
|
for(int i = 0; i < arr.Length; i++)
|
|||
|
{
|
|||
|
//如果在配置文件中找到,那么就返回名字,如果找不到,返回通用
|
|||
|
var cfg = DeclarePlayerOccupation.Get(int.Parse(arr[i]));
|
|||
|
if (cfg != null)
|
|||
|
{
|
|||
|
if (string.IsNullOrEmpty(rest))
|
|||
|
rest = cfg.JobName;
|
|||
|
else
|
|||
|
rest = string.Format("{0},{1}", rest, cfg.JobName);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return DeclareMessageString.Get(DeclareMessageString.C_ITEM_OCC_NAME_COMMON);
|
|||
|
}
|
|||
|
}
|
|||
|
return rest;
|
|||
|
}
|
|||
|
return DeclareMessageString.Get(DeclareMessageString.C_ITEM_OCC_NAME_COMMON);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 阶数转换,输入等阶
|
|||
|
/// </summary>
|
|||
|
/// <param name="level"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public static string LevelConvert(int level)
|
|||
|
{
|
|||
|
string str = "";
|
|||
|
switch(level)
|
|||
|
{
|
|||
|
case 1:
|
|||
|
case 2:
|
|||
|
case 3:
|
|||
|
case 4:
|
|||
|
str = DeclareMessageString.Get(DeclareMessageString.C_GUILD_SORT_LEVEL_1 + level - 1);
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
case 6:
|
|||
|
case 7:
|
|||
|
case 8:
|
|||
|
case 9:
|
|||
|
case 10:
|
|||
|
case 11:
|
|||
|
case 12:
|
|||
|
case 13:
|
|||
|
case 14:
|
|||
|
case 15:
|
|||
|
str = DeclareMessageString.Get(DeclareMessageString.C_GUILD_SORT_LEVEL_5 + level - 5);
|
|||
|
break;
|
|||
|
}
|
|||
|
return str;
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|