// *********************************************************************** // Assembly : Game // Author : Kimch // Created : 2021-01-09 // Description : // Last Modified By : // Last Modified On : // *********************************************************************** // // // *********************************************************************** using CodeStage.AntiCheat.ObscuredTypes; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace G { public enum WeaponKind { blade = 1, dual, spear, bow, staff, magic, } /// /// 类功能描述 /// partial class EntityPlayer { #region Field /// /// /// private float _attackSpeed; /// /// /// private float _attackSpeedOrigin = 1.5f; /// /// /// private float _moveSpeed; /// /// /// private float _moveSpeedOrigin = 0.5f; private int _weaponKind; private string _weaponMesh; private int _weaponQuality; private float _weaponAttackRange; private int _specialKind; private int _specialKindOrigin; private int _specialAmount; private Vector3 _colliderCenter; private float _colliderRadius; private Vector3 _colliderDodge; #endregion #region Property /// /// 技能值 /// public float sp { get; private set; } /// /// /// public float maxSp { get; private set; } public float attackSpeed { get { return _attackSpeed; } } public int deathCount { get; set; } #endregion #region Method /// /// 设置角色数值 /// public void InitValue() { // SyncValue(true); InvokeRepeating(nameof(HpRecover), 1f, 1f); InvokeRepeating(nameof(SpRecover), 5f, 5f); } /// /// 同步所有数值 /// public void SyncValue(bool reset = false) { SyncPlayer(); SyncWeapon(); if (reset) SyncPet(); SyncBuff(); SyncHp(); SyncMoveSpeed(); SyncAttackSpeed(); SyncSkillValue(); SetWeapon(!reset); } /// /// 同步角色属性 /// private void SyncPlayer() { if (!GameLevel.Instance.infinityMode) { var combatAttributes = PlayerProxy.Instance.combatAttributes; for (int i = combatAttributes.Length - 1; i >= 0; i--) { var attribute = combatAttributes[i]; if (attribute.value > 0) { SetOriginValue(attribute.id, attribute.value); } } } else { var chaLevel = Mathf.Clamp(GameLevel.Instance.curStageIndex, 1, PlayerProxy.Instance.gradeMax); var chaLevelItem = ItemProxy.Instance.GetStaticItem(chaLevel); if (chaLevelItem != null) { var initAttributes = chaLevelItem.endlessAttributes; for (int i = 0; i < initAttributes.Length; i++) { var atValue = initAttributes[i][1] * (1f + chaLevel * 0.01f); SetOriginValue(initAttributes[i][0], (int)atValue); } } else { var cha = PlayerProxy.Instance.GetCurrentCha(); if (cha != null) { var initAttributes = cha.endlessAttributes; for (int i = 0; i < initAttributes.Length; i++) { SetOriginValue(initAttributes[i][0], initAttributes[i][1]); } } } } } private void SyncPet() { var battlePet = PetProxy.Instance.battlePet; if (battlePet != null) { var validSkills = new Dictionary(); var skills = battlePet.CheckSkill(); for (int i = 0; i < skills.Count; i++) { var skill = battlePet.skills[i]; if (skill != null && skill.isUnlock) { var validId = skill.id; if (validId > 100) { validId -= 100; } if (!validSkills.ContainsKey(validId)) { validSkills.Add(validId, skill); } } } foreach (var skillKV in validSkills) { var skillValues = skillKV.Value.item.values; switch (skillKV.Key) { case 2: case 5: case 6: case 7: case 9: case 10: case 12: case 14: case 17: case 21: case 24: if (skillValues != null) { for (int i = 0; i < skillValues.Length; i++) { var skillValue = skillValues[i]; AddExtraValue(skillValue[0], skillValue[1]); } } break; case 22: if (skillValues != null && skillValues.Length > 1) { for (int i = 1; i < skillValues.Length; i++) { var skillValue = skillValues[i]; AddExtraValue(skillValue[0], skillValue[1]); } } break; case 25: if (skillValues != null && skillValues.Length > 0) { var skillValue = skillValues[0]; AddExtraValue(skillValue[0], skillValue[1]); } break; case 8: if (skillValues != null && skillValues.Length > 1) { var skillValue = skillValues[0]; _deathRebornRate = skillValue[1]; skillValue = skillValues[1]; _deathRebornHpRate = skillValue[1]; } _deathReborn = 1; break; case 13: if (skillValues != null && skillValues.Length > 1) { var skillValue = skillValues[0]; _deathInvincRate = skillValue[1]; skillValue = skillValues[1]; _deathInvincSecond = skillValue[1]; } _deathInvinc = 1; break; case 18: if (skillValues != null && skillValues.Length >= 2) { var skillValue = skillValues[0]; _moveSpeedOrigin *= (1f + skillValue[1] * 0.01f); skillValue = skillValues[1]; AddExtraValue(skillValue[0], skillValue[1]); } break; case 20: if (skillValues != null && skillValues.Length > 0) { var skillValue = skillValues[0]; _moveSpeedOrigin *= (1f + skillValue[1] * 0.01f); } break; } } } } private void SyncWeapon() { var weapon = PlayerProxy.Instance.GetCurWeapon(); if (weapon != null) { var weaponItem = weapon.weaponItem; _moveSpeedOrigin = weaponItem.moveSpeed; _attackSpeedOrigin = weaponItem.attackSpeed; _weaponKind = weapon.weaponKind; _weaponMesh = weapon.assets; _weaponQuality = weapon.quality; _specialKind = weapon.elementIndex; _specialAmount = GetCurrentValue(weapon.elementId) / 100; } } /// /// 同步 /// private void SyncBuff() { } public void SyncHp(bool onlyValue = false) { int source = this.sourceTotalHp; var add = source - maxHp; maxHp = Mathf.Max(0, source); curHp = Mathf.Clamp(curHp + add, 0, maxHp); if (!onlyValue) { UpdateHpBar(); } } public void SyncSkillValue() { scriptSkill.SetSkill(sourceTotalAttack, attackOrigin, 0); } public void SyncMoveSpeed() { _moveSpeed = _moveSpeedOrigin; } public void SyncAttackSpeed() { _attackSpeed = _attackSpeedOrigin * (Mathf.Min(60, GetCurrentValue(CombatAttributeId.AttackSpeed)) * 0.01f + 1f); SetFloat(Hash_Speed_Attack, _attackSpeed); } /// /// /// private void SetWeapon(bool change) { switch ((WeaponKind)_weaponKind) { case WeaponKind.blade: { _colliderCenter = new Vector3(0f, 0.05f, 0.17f); _colliderRadius = 0.13f; _weaponAttackRange = 0.3f;//0.13+0.17 //ef_swing1.localScale = new Vector3(1.6f, 2f, 2f); break; } case WeaponKind.dual: { _colliderCenter = new Vector3(0f, 0.05f, 0.16f); _colliderRadius = 0.13f; _weaponAttackRange = 0.28f;//0.13+0.16 //ef_swing1.localScale = new Vector3(1.3f, 1.7f, 1.7f); //_attackSpeed -= 0.02f; break; } case WeaponKind.spear: { _colliderCenter = new Vector3(0f, 0.05f, 0.2f); _colliderRadius = 0.15f; _weaponAttackRange = 0.35f;//0.15+0.2 //if (!isGeneral) //{ // ef_swing1.localScale = new Vector3(2f, 2.6f, 2.6f); //} //else //{ // ef_swing1.localScale = new Vector3(1.6f, 2f, 2f); //} break; } case WeaponKind.bow: { _colliderCenter = new Vector3(0f, 0.05f, 0.25f); _colliderRadius = 0.15f; //_attackSpeed += 0.02f; break; } case WeaponKind.staff: { _colliderCenter = new Vector3(0f, 0.05f, 0.2f); _colliderRadius = 0.15f; //_attackSpeed -= 0.02f; break; } case WeaponKind.magic: { _colliderCenter = new Vector3(0f, 0.05f, 0.25f); _colliderRadius = 0.15f; //ef_swing1.localScale = new Vector3(1.6f, 2f, 2f); //_attackSpeed += 0.04f; break; } } scriptAttack.SetWeapon(_weaponKind, _specialKind, _specialAmount); //collider_center = new Vector3(0f, 0.05f, 0.1f); //collider_radius = 0.735f; scriptWeapon.SetStageWeapon(_weaponMesh, _weaponKind, _weaponQuality, _specialKind); if (change) { PlayAnimation(Hash_Land_Change_Weapon); scriptWeapon.SwitchWepon(-1, 0, 0.2f, 0f); } } /// /// /// private void HpRecover() { var value = this.GetCurrentValue(CombatAttributeId.HpRecover); var percent = this.GetCurrentValue(CombatAttributeId.HpRecoverPercent); if (value > 0 || percent > 0) { Heal(value, percent); Sk_Heal(); } } /// /// /// public void SpRecover() { SpCharge(5f); } /// /// 每关血量恢复 /// private void HpRecoverStage() { var value = this.GetCurrentValue(CombatAttributeId.StageHpRecover); var percent = this.GetCurrentValue(CombatAttributeId.StageHpRecoverPercent); if (value > 0 || percent > 0) { Heal(value, percent); Sk_Heal(); } } #endregion private bool noeagle; private int _autoFindRate; public float dashTimer = 3f; /// /// 移速提升 /// /// public void MoveSpeedUp(float amount) { _moveSpeed = amount; _moveSpeedOrigin = amount; if (_animator) { _animator.SetFloat(Hash_Speed_Move, amount * 1.25f); } } /// /// /// /// /// public void HpUp(int value, int percent) { Heal(value, percent); UI_Ingame.Instance.ShowEffect("UI_fx_BattleBuff03"); //GlobalNotifier.PostNotification(GlobalDefine.EVENT_SHOW_EFFECT, "UI_fx_BattleBuff03", "buff"); } /// /// 攻击提升 /// /// public void AttackUp(int value, int percent) { AttributeUp((int)CombatAttributeId.Attack, value, percent); } /// /// /// public void DefenceUp(int value, int percent) { AttributeUp((int)CombatAttributeId.Defence, value, percent); } /// /// 属性提升 /// /// /// /// public void AttributeUp(int id, int value, int percent) { int add = value + GetOriginValue(id) * percent / 100; AddExtraValue(id, add); switch ((CombatAttributeId)id) { case CombatAttributeId.Hp: SyncHp(); UI_Ingame.Instance.ShowEffect("UI_fx_BattleBuff04"); //GlobalNotifier.PostNotification(GlobalDefine.EVENT_SHOW_EFFECT, "UI_fx_BattleBuff04", "buff"); break; case CombatAttributeId.Attack: UI_Ingame.Instance.ShowEffect("UI_fx_BattleBuff02"); //GlobalNotifier.PostNotification(GlobalDefine.EVENT_SHOW_EFFECT, "UI_fx_BattleBuff02", "buff"); break; case CombatAttributeId.Defence: UI_Ingame.Instance.ShowEffect("UI_fx_BattleBuff01"); //GlobalNotifier.PostNotification(GlobalDefine.EVENT_SHOW_EFFECT, "UI_fx_BattleBuff01", "buff"); break; case CombatAttributeId.EvasionRate: UI_Ingame.Instance.ShowEffect("UI_fx_BattleBuff05"); //GlobalNotifier.PostNotification(GlobalDefine.EVENT_SHOW_EFFECT, "UI_fx_BattleBuff05", "buff"); break; case CombatAttributeId.CritRate: UI_Ingame.Instance.ShowEffect("UI_fx_BattleBuff06"); //GlobalNotifier.PostNotification(GlobalDefine.EVENT_SHOW_EFFECT, "UI_fx_BattleBuff06", "buff"); break; case CombatAttributeId.AttackSpeed: UI_Ingame.Instance.ShowEffect("UI_fx_BattleBuff07"); SyncAttackSpeed(); break; } scriptEffect.pt_skill_up.gameObject.SetActive(true); } /// /// /// public void ResetAtk() { //if (!isGeneral) //{ // attack = attackOrigin; // hitrate = hitrateOrigin; //} //else //{ // attack = g_atk; // hitrate = 100; //} } public void ResetDef() { //defence = defenceOrigin; } public void ResetPower() { if (!isGeneral && _exStart) { script_ui.ResetPower(); _pressDelay = 0f; _prevTouchPosistion = _currTouchPosistion; _exStart = false; _scriptSwingEx2.SwingOff(); SetTrigger(Hash_Cancel_Attack); GlobalNotifier.PostNotification(GlobalDefine.EVENT_HOLD_STATE, 0F); //PlayInAttackLayer(Hash_None); //CrossFade("evade"); } } /// /// /// /// public void SpCharge(float a) { sp = Mathf.Min(sp + a, maxSp); script_ui.StatUpdate_sp(sp); } /// /// /// /// 暴击(>=0) public void RndAtk(int extraCritical, int extraDamage = 0, float extraDamagePercent = 0f) { float tmpDamage = this.sourceTotalAttack; if (extraCritical >= 0 && GlobalUtils.RndHundred < (this.sourceTotalCriticalRate + extraCritical)) { scriptEffect.CriticalText(); tmpDamage = (2f + criticalDamage * 0.01f) * tmpDamage; this.critDamage = 1; } else { this.critDamage = 0; } tmpDamage += tmpDamage * extraDamagePercent * 0.01f; tmpDamage += extraDamage; this.damage = (int)tmpDamage; } public void ChangeCharacter(int _weapon_kind) { } /// /// 增加经验 /// /// public void GainExp(float amount) { scriptEffect.PlayEffect("pt_lvup"); return; } /// /// 获取物品 /// /// /// public void GetItem(int id, int level) { var prop = ItemProxy.Instance.GetStaticItem(id); if (prop == null) { return; } scriptEffect.ShowGetItemEffect(); scriptSound.PlaySoundOneShot(scriptSound.sndGetItem); if (prop.isWeaponOrEquipment) { var equipment = GameLevel.Instance.CollectEquipment(prop.id); if (equipment != null) UI_Ingame.Instance.GainEquipment(equipment); return; } else if (prop.type == Item.Type.Money) { int money = level; if (id == Item.Id.kCoin) { money = level + level * coinBoost / 100; } UI_Ingame.Instance.GainMoney(id, money); GameLevel.Instance.CollecMoney(id, money); } else if (prop.type == Item.Type.Prop)//新加道具类型2的获取 { GameLevel.Instance.CollecMoney(id, level); } else if (prop.type == Item.Type.Gem) { GameLevel.Instance.CollecGem(id, level); } else if (prop.type == 5) { MissionProxy.Instance.OnEvent(MissionProxy.累计获得指定道具, 1, prop.id); #if !UNITY_WEBGL && UNITY_EDITOR if (!KGMOptions.Instance.自动挂机) KUIWindow.OpenWindow(prop); #else KUIWindow.OpenWindow(prop); #endif } else if (prop.type == 11) { MissionProxy.Instance.OnEvent(MissionProxy.累计获得指定道具, 1, prop.id); #if !UNITY_WEBGL && UNITY_EDITOR if (!KGMOptions.Instance.自动挂机) { var book = ItemProxy.Instance.GetStaticItem(level); KUIWindow.OpenWindow(book); } #else var book = ItemProxy.Instance.GetStaticItem(level); KUIWindow.OpenWindow(book); #endif } else if (prop.type == 7) { MissionProxy.Instance.OnEvent(MissionProxy.累计获得指定道具, 1, prop.id); KUIWindow.OpenWindow(prop); } GlobalNotifier.PostNotification(GlobalDefine.EVENT_INGAME_GET_ITEM, prop, "prop"); } public void Heal(int a, int percent) { if (curHp >= maxHp) { curHp = maxHp; return; } int add = a + maxHp * percent / 100; curHp = Mathf.Min(curHp + add, maxHp); _skHealTime = 1f; scriptEffect.pt_heal.gameObject.SetActive(true); //if (isGeneral) //{ // g_hp = curHp; //} //else //{ // _chaHp = curHp; //} UpdateHpBar(); } private float _skHealTime; public void Sk_Heal() { _skHealTime -= 1f; if (_skHealTime < 0f) scriptEffect.pt_heal.gameObject.SetActive(false); } #region Field private readonly ObscuredVector3Int[] _values = new ObscuredVector3Int[(int)CombatAttributeId.kMax]; /// /// 防御破坏 /// private int _guardBreak; #endregion #region Property /// /// /// public int sourceTotalHp { get { int fixedV = GetCurrentValue(CombatAttributeId.Hp); int percentV = GetCurrentValue(CombatAttributeId.HpPercent); return fixedV + Mathf.CeilToInt(fixedV * percentV * 0.01f); } } /// /// /// public int sourceTotalAttack { get { int fixedV = GetCurrentValue(CombatAttributeId.Attack); int percentV = GetCurrentValue(CombatAttributeId.AttackPercent); return fixedV + Mathf.CeilToInt(fixedV * percentV * 0.01f); } } /// /// /// public int sourceTotalDefence { get { int fixedV = GetCurrentValue(CombatAttributeId.Defence); int percentV = GetCurrentValue(CombatAttributeId.DefencePercent); return fixedV + Mathf.CeilToInt(fixedV * percentV * 0.01f); } } /// /// 命中率 /// public int sourceTotalHitRate { get { int fixedV = GetCurrentValue(CombatAttributeId.Hit); int rateV = GetCurrentValue(CombatAttributeId.HitRate); return rateV + Mathf.CeilToInt(fixedV * 0.01f); } } /// /// 闪避率 /// public int sourceTotalEvasionRate { get { int fixedV = GetCurrentValue(CombatAttributeId.Evasion); int rateV = GetCurrentValue(CombatAttributeId.EvasionRate); return rateV + Mathf.CeilToInt(fixedV * 0.01f); } } /// /// /// public int sourceTotalCriticalRate { get { int fixedV = GetCurrentValue(CombatAttributeId.Crit); int rateV = GetCurrentValue(CombatAttributeId.CritRate); return rateV + Mathf.CeilToInt(fixedV * 0.01f); } } /// /// /// public int criticalDamage { get => GetCurrentValue(CombatAttributeId.CritDamageRate); set => SetExtraValue(CombatAttributeId.CritDamageRate, value); } /// /// 格挡 /// public int block { get => GetCurrentValue(CombatAttributeId.BlockRate); set => SetExtraValue(CombatAttributeId.BlockRate, value); } /// /// 抵挡 /// public int resist { get => GetCurrentValue(CombatAttributeId.BlockResistRate); set => SetExtraValue(CombatAttributeId.BlockResistRate, value); } /// /// /// public int reduceCd { get => Mathf.Min(40, GetCurrentValue(CombatAttributeId.Cooldown)); set => SetExtraValue(CombatAttributeId.Cooldown, value); } /// /// /// public int 伤害加深百分比 { get => Mathf.Min(40, GetCurrentValue(CombatAttributeId.伤害加深百分比)); } public int 忽视防御固定值 { get => GetCurrentValue(CombatAttributeId.忽视防御固定值); } public int 忽视防御百分比 { get => Mathf.Min(40, GetCurrentValue(CombatAttributeId.忽视防御百分比)); } /// /// /// public int hpMaxOrigin { get => GetOriginValue(CombatAttributeId.Hp); } /// /// /// public int attackOrigin { get => GetOriginValue(CombatAttributeId.Attack); } /// /// /// public int hitrateOrigin { get => GetOriginValue(CombatAttributeId.HitRate); } /// /// /// public int defenceOrigin { get => GetOriginValue(CombatAttributeId.Defence); } /// /// /// public int coinBoost { get => GetCurrentValue(CombatAttributeId.CoinDropAdd); } /// /// /// public int dropBoost { get => GetCurrentValue(CombatAttributeId.稀有装备掉落); } #endregion #region Method /// /// /// /// /// public int GetCurrentValue(CombatAttributeId id) { return _values[(int)id].xyz; } /// /// /// /// /// public int GetCurrentValue(int id) { return _values[id].xyz; } /// /// /// /// /// public void SetExtraValue(CombatAttributeId id, int value) { _values[(int)id].y = value; } /// /// /// /// /// public void SetExtraValue(int id, int value) { _values[id].y = value; } /// /// /// /// /// public void AddExtraValue(CombatAttributeId id, int value) { _values[(int)id].y += value; } /// /// /// /// /// public void AddExtraValue(int id, int value) { _values[id].y += value; } /// /// 临时 /// /// /// public int GetTemporaryValue(int id) { return _values[id].z; } /// /// /// /// /// public void SetTemporaryValue(CombatAttributeId id, int value) { _values[(int)id].z = value; } /// /// /// /// /// public void SetTemporaryValue(int id, int value) { _values[id].z = value; } /// /// /// /// /// public void AddTemporaryValue(int id, int value) { _values[id].z += value; } /// /// /// /// /// public int GetOriginValue(CombatAttributeId id) { return _values[(int)id].x; } /// /// /// /// /// public int GetOriginValue(int id) { return _values[id].x; } /// /// /// /// /// public void SetOriginValue(CombatAttributeId id, int value) { _values[(int)id].x = value;// } public void SetOriginValue(int id, int value) { _values[id].x = value;// } #endregion } }