540 lines
17 KiB
C#
540 lines
17 KiB
C#
// Created : 2020-06-05
|
||
// Description :
|
||
// Last Modified By : Kimch
|
||
// Last Modified On :
|
||
// ***********************************************************************
|
||
// <copyright file= "EntityItemEquipment" company="kunpo"></copyright>
|
||
// <summary></summary>
|
||
// ***********************************************************************
|
||
namespace G
|
||
{
|
||
using CodeStage.AntiCheat.ObscuredTypes;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public sealed class EntityItemEquipment : EntityItem<ItemEquipment>
|
||
{
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
private int _grade = -1;
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
private ItemEquipment _equipmentItem;
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public override int quality => _propItem.quality;
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public override int level => _propItem.level;
|
||
/// <summary>
|
||
/// 道具等级
|
||
/// </summary>
|
||
public int propLevel => _propItem.level;
|
||
/// <summary>
|
||
/// 道具品质
|
||
/// </summary>
|
||
public int propQuality => _propItem.quality;
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public int equipmentType => _equipmentItem.type;
|
||
/// <summary>
|
||
/// 武器类型 1:刀 2:双手武器 3:长兵器 4:弓箭 5:权杖 6:魔法
|
||
/// </summary>
|
||
public int weaponKind => _equipmentItem.subType;
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public string assets
|
||
{
|
||
get
|
||
{
|
||
var weaponSkin = PlayerProxy.Instance.GetWeaponModel(weaponKind);
|
||
return string.IsNullOrEmpty(weaponSkin) ? _equipmentItem.assets : weaponSkin;
|
||
}
|
||
}
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public string propName => _propItem.name;
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public string[] propIcon => _propItem.icon;
|
||
/// <summary>
|
||
/// 排序规则
|
||
/// </summary>
|
||
public override int sortOrder => _sortOrder1;
|
||
|
||
private int _sortOrder1 = -1;
|
||
/// <summary>
|
||
/// 按等级排序
|
||
/// </summary>
|
||
public int sortOrder1 => _sortOrder1;
|
||
|
||
private int _sortOrder2 = -1;
|
||
/// <summary>
|
||
/// 按品质排序
|
||
/// </summary>
|
||
public int sortOrder2 => _sortOrder2;
|
||
|
||
private bool _isNew;
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public bool isNew
|
||
{
|
||
get
|
||
{
|
||
var ret = _isNew;
|
||
_isNew = false;
|
||
return ret;
|
||
}
|
||
set { _isNew = value; }
|
||
}
|
||
|
||
private bool _isLocked;
|
||
/// <summary>
|
||
/// 锁住
|
||
/// </summary>
|
||
public bool isLock
|
||
{
|
||
get { return _isLocked; }
|
||
set
|
||
{
|
||
if (_isLocked != value)
|
||
{
|
||
if (value)
|
||
{
|
||
if (_sortOrder1 > 0 && _sortOrder1 < 1000000)
|
||
{
|
||
_sortOrder1 += 1000000;
|
||
}
|
||
if (_sortOrder2 > 0 && _sortOrder2 < 1000000)
|
||
{
|
||
_sortOrder2 += 1000000;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (_sortOrder1 > 1000000)
|
||
{
|
||
_sortOrder1 -= 1000000;
|
||
}
|
||
if (_sortOrder2 > 1000000)
|
||
{
|
||
_sortOrder2 -= 1000000;
|
||
}
|
||
}
|
||
|
||
_isLocked = value;
|
||
Save();
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 装上
|
||
/// </summary>
|
||
public bool isEquip
|
||
{
|
||
get => PlayerProxy.Instance.IsSetEquipment(this);
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public bool isWeapon
|
||
{
|
||
get => _equipmentItem.type == 0;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public CombatAttributeId elementId
|
||
{
|
||
get => basicAttribute.id;
|
||
}
|
||
/// <summary>
|
||
/// 元素
|
||
/// </summary>
|
||
public int elementIndex
|
||
{
|
||
get => Mathf.Clamp(basicAttribute.id - CombatAttributeId.ElementNone, 0, 5);
|
||
}
|
||
/// <summary>
|
||
/// 元素数值
|
||
/// </summary>
|
||
public int elementValue
|
||
{
|
||
get => Mathf.Max(0, basicAttribute.value);
|
||
}
|
||
|
||
private int _combatValue;
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public int combatValue
|
||
{
|
||
get { return _combatValue; }
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public int combatValueFactor
|
||
{
|
||
get
|
||
{
|
||
var factorItem = ItemProxy.Instance.GetStaticItem<ItemAttributeFactor>(_propItem.level);
|
||
return factorItem != null ? factorItem.value : 0;
|
||
}
|
||
}
|
||
|
||
public int SetGrade(int value, IList<CombatAttribute> attributes)
|
||
{
|
||
attributes.Clear();
|
||
if (value > 0)
|
||
{
|
||
int combatV = 0;
|
||
for (int i = 0; i < extraAttributes.Count; i++)
|
||
{
|
||
var attribute = extraAttributes[i];
|
||
var chaLevel = ItemProxy.Instance.GetStaticItem<ItemChaLevel>(value);
|
||
if (chaLevel != null)
|
||
{
|
||
attribute = chaLevel.GetEquipmentUpgradeAttribute(attribute);
|
||
}
|
||
attributes.Add(attribute);
|
||
combatV += attribute.CalcCombatValue();
|
||
}
|
||
return combatV;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public override ItemEquipment item => _equipmentItem;
|
||
/// <summary>
|
||
/// 武器item
|
||
/// </summary>
|
||
public ItemWeapon weaponItem => _equipmentItem.type == 0 ? ItemProxy.Instance.GetStaticItem<ItemWeapon>(_equipmentItem.subType) : null;
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public override ItemProp propItem => _propItem;
|
||
|
||
/// <summary>
|
||
/// 基础属性
|
||
/// </summary>
|
||
public CombatAttribute basicAttribute;
|
||
/// <summary>
|
||
/// 额外属性
|
||
/// </summary>
|
||
public readonly List<CombatAttribute> extraAttributes = new List<CombatAttribute>();
|
||
/// <summary>
|
||
/// 特殊属性
|
||
/// </summary>
|
||
public readonly List<CombatAttribute> specialAttributes = new List<CombatAttribute>();
|
||
|
||
private ObscuredInt _suitId;
|
||
/// <summary>
|
||
/// 套装Id
|
||
/// </summary>
|
||
public int suitId
|
||
{
|
||
get { return _suitId; }
|
||
}
|
||
|
||
protected override void Init()
|
||
{
|
||
base.Init();
|
||
_equipmentItem = ItemProxy.Instance.GetStaticItem<ItemEquipment>(_itemId);
|
||
|
||
_sortOrder1 = propLevel * 100 + quality * 10 - equipmentType;
|
||
_sortOrder2 = quality * 10000 + propLevel * 10 - equipmentType;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="initLevel"></param>
|
||
/// <param name="initQuality"></param>
|
||
public void GenerateAttributes(int initLevel, int initQuality)
|
||
{
|
||
_isNew = true;
|
||
_grade = initLevel;
|
||
|
||
int combatV = 0;
|
||
int factor = combatValueFactor;
|
||
|
||
//单一词条
|
||
var attributes = _equipmentItem.basicAttributes;
|
||
if (attributes != null && attributes.Length > 0)
|
||
{
|
||
if (attributes.Length == 1)
|
||
{
|
||
var attr = attributes[0];
|
||
basicAttribute.id = (CombatAttributeId)attr[0];
|
||
basicAttribute.value = Random.Range(attr[1], attr[2]);
|
||
}
|
||
else
|
||
{
|
||
int maxWeight = 0;
|
||
for (int i = 0, l = attributes.Length; i < l; i++)
|
||
{
|
||
maxWeight += attributes[i][3];
|
||
}
|
||
int curWeight = Random.Range(0, maxWeight);
|
||
for (int i = 0, l = attributes.Length; i < l; i++)
|
||
{
|
||
var attr = attributes[i];
|
||
curWeight -= attr[3];
|
||
if (curWeight < 0)
|
||
{
|
||
basicAttribute.id = (CombatAttributeId)attr[0];
|
||
basicAttribute.value = Random.Range(attr[1], attr[2]);
|
||
break; //只取一件
|
||
}
|
||
}
|
||
}
|
||
combatV += basicAttribute.CalcCombatValue(factor);
|
||
}
|
||
|
||
//固定词条
|
||
attributes = _equipmentItem.extraAttributes;
|
||
if (attributes != null && attributes.Length > 0)
|
||
{
|
||
for (int i = 0, l = attributes.Length; i < l; i++)
|
||
{
|
||
var attr = attributes[i];
|
||
var attribute = new CombatAttribute
|
||
{
|
||
id = (CombatAttributeId)attr[0],
|
||
value = Random.Range(attr[1], attr[2])
|
||
};
|
||
extraAttributes.Add(attribute);
|
||
combatV += attribute.CalcCombatValue(factor);
|
||
}
|
||
}
|
||
|
||
//特殊词条
|
||
attributes = _equipmentItem.specialAttributes;
|
||
if (attributes != null && attributes.Length > 0)
|
||
{
|
||
int maxWeight = 0;
|
||
for (int i = 0, l = attributes.Length; i < l; i++)
|
||
{
|
||
maxWeight += attributes[i][3];
|
||
}
|
||
|
||
int attrCount = RndAtrributeAmount(this.propLevel, this.quality);
|
||
|
||
for (int j = 0; j < attrCount; j++)
|
||
{
|
||
int curWeight = Random.Range(0, maxWeight);
|
||
for (int i = 0, l = attributes.Length; i < l; i++)
|
||
{
|
||
var attr = attributes[i];
|
||
curWeight -= attr[3];
|
||
if (curWeight < 0)
|
||
{
|
||
var attribute = new CombatAttribute
|
||
{
|
||
id = (CombatAttributeId)attr[0],
|
||
value = Random.Range(attr[1], attr[2])
|
||
};
|
||
specialAttributes.Add(attribute);
|
||
combatV += attribute.CalcCombatValue(factor);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (_equipmentItem.suit != null && _equipmentItem.suit.Length > 0)
|
||
{
|
||
_suitId = GlobalUtils.GetRandom(_equipmentItem.suit);
|
||
if (_suitId > 0)
|
||
{
|
||
var suitItem = ItemProxy.Instance.GetStaticItem<ItemSuit>(_suitId);
|
||
combatV += suitItem.combatValue;
|
||
}
|
||
}
|
||
_combatValue = combatV + item.combatValue;
|
||
}
|
||
|
||
public void Load(List<CodeStage.AntiCheat.ObscuredTypes.ObscuredInt> dataList)
|
||
{
|
||
int index = 0;
|
||
GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out int locked, out int grade);
|
||
_grade = grade;
|
||
_isLocked = locked != 0;
|
||
|
||
int combatV = 0;
|
||
int factor = combatValueFactor;
|
||
int sid, svalue;
|
||
//
|
||
GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out sid, out svalue);
|
||
basicAttribute = new CombatAttribute
|
||
{
|
||
id = (CombatAttributeId)sid,
|
||
value = svalue,
|
||
};
|
||
combatV += basicAttribute.CalcCombatValue(factor);
|
||
//
|
||
var ea_c = dataList.SafeGet(index++);
|
||
for (int i = 0; i < ea_c; i++)
|
||
{
|
||
GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out sid, out svalue);
|
||
|
||
var attribute = new CombatAttribute
|
||
{
|
||
id = (CombatAttributeId)sid,
|
||
value = svalue,
|
||
};
|
||
extraAttributes.Add(attribute);
|
||
combatV += attribute.CalcCombatValue(factor);
|
||
}
|
||
//
|
||
var sa_c = dataList.SafeGet(index++);
|
||
for (int i = 0; i < sa_c; i++)
|
||
{
|
||
GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out sid, out svalue);
|
||
var attribute = new CombatAttribute
|
||
{
|
||
id = (CombatAttributeId)sid,
|
||
value = svalue,
|
||
};
|
||
specialAttributes.Add(attribute);
|
||
combatV += attribute.CalcCombatValue(factor);
|
||
}
|
||
//套装
|
||
_suitId = dataList.SafeGet(index++);
|
||
if (_suitId > 0)
|
||
{
|
||
var suitItem = ItemProxy.Instance.GetStaticItem<ItemSuit>(_suitId);
|
||
if (suitItem != null)
|
||
combatV += suitItem.combatValue;
|
||
else
|
||
{
|
||
var convertItem = ItemProxy.Instance.GetStaticItem<ItemConvert>(id);
|
||
if (convertItem != null)
|
||
{
|
||
_suitId = convertItem.newId;
|
||
suitItem = ItemProxy.Instance.GetStaticItem<ItemSuit>(_suitId);
|
||
combatV += suitItem.combatValue;
|
||
}
|
||
else
|
||
_suitId = 0;
|
||
}
|
||
}
|
||
_combatValue = combatV + item.combatValue;
|
||
}
|
||
|
||
public void Save(List<CodeStage.AntiCheat.ObscuredTypes.ObscuredInt> dataList)
|
||
{
|
||
dataList.Add(GlobalUtils.CombineNumber824(isLock ? 1 : 0, _grade));
|
||
|
||
//基础属性
|
||
dataList.Add(GlobalUtils.CombineNumber824((int)basicAttribute.id, basicAttribute.value));
|
||
//特殊属性
|
||
dataList.Add(extraAttributes.Count);
|
||
for (int i = 0; i < extraAttributes.Count; i++)
|
||
{
|
||
dataList.Add(GlobalUtils.CombineNumber824((int)extraAttributes[i].id, extraAttributes[i].value));
|
||
}
|
||
//特殊属性
|
||
dataList.Add(specialAttributes.Count);
|
||
for (int i = 0; i < specialAttributes.Count; i++)
|
||
{
|
||
dataList.Add(GlobalUtils.CombineNumber824((int)specialAttributes[i].id, specialAttributes[i].value));
|
||
}
|
||
//套装
|
||
dataList.Add(_suitId);
|
||
}
|
||
|
||
public void Load()
|
||
{
|
||
var dataList = ArchiveProxy.Instance.GetIntList(id);
|
||
if (dataList != null && dataList.Count > 0)
|
||
{
|
||
Load(dataList);
|
||
}
|
||
}
|
||
|
||
public void Save()
|
||
{
|
||
var dataList = ArchiveProxy.Instance.GetIntList(id);
|
||
if (dataList != null)
|
||
{
|
||
dataList.Clear();
|
||
Save(dataList);
|
||
ArchiveProxy.Instance.SetIntList(id, dataList);
|
||
}
|
||
}
|
||
|
||
public void Remove()
|
||
{
|
||
ArchiveProxy.Instance.RemoveIntList(id);
|
||
}
|
||
|
||
public static void RemoveEquipment(int id)
|
||
{
|
||
ArchiveProxy.Instance.RemoveIntList(id);
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="quality"></param>
|
||
/// <returns></returns>
|
||
private static int RndAtrributeAmount(int level, int quality)
|
||
{
|
||
int result = 0;
|
||
switch (quality)
|
||
{
|
||
case Item.Quality.kGreen:
|
||
result = 1;
|
||
break;
|
||
case Item.Quality.kBlue:
|
||
result = 2;
|
||
break;
|
||
case Item.Quality.kPurple:
|
||
result = 3;
|
||
break;
|
||
case Item.Quality.kYellow:
|
||
result = 5;
|
||
break;
|
||
case Item.Quality.kRed:
|
||
result = 6;
|
||
break;
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static int SortByGrade(EntityItemEquipment equipment1, EntityItemEquipment equipment2)
|
||
{
|
||
return equipment2.sortOrder1 - equipment1.sortOrder1;
|
||
}
|
||
|
||
public static int SortByQuality(EntityItemEquipment equipment1, EntityItemEquipment equipment2)
|
||
{
|
||
return equipment2.sortOrder2 - equipment1.sortOrder2;
|
||
}
|
||
}
|
||
}
|