shaoxiadiablo/Assets/AGame/Scripts/Item/Entity/EntityItemEquipment.cs
2025-05-18 01:04:31 +08:00

540 lines
17 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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;
}
}
}