219 lines
6.3 KiB
C#
219 lines
6.3 KiB
C#
using BrewMonster;
|
|
using System.Collections.Generic;
|
|
using Unity.VisualScripting;
|
|
using UnityEngine;
|
|
using static CECAttacksMan;
|
|
|
|
public class CECAttacksMan : MonoSingleton<CECAttacksMan>
|
|
{
|
|
private readonly List<CECAttackEvent> m_AttackList = new List<CECAttackEvent>();
|
|
|
|
public CECAttackerEvents FindAttackByAttacker(int idHost)
|
|
{
|
|
CECAttackerEvents result = new CECAttackerEvents();
|
|
|
|
foreach (var attack in m_AttackList)
|
|
{
|
|
if (attack.m_idHost == idHost)
|
|
{
|
|
result.Add(attack);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public CECAttackEvent AddMeleeAttack(int idHost, int idTarget, int idWeapon, uint dwModifier, int nDamage, int nTimeFly = 10)
|
|
{
|
|
var newEvent = new CECAttackEvent(
|
|
this,
|
|
idHost,
|
|
0, // idCastTarget
|
|
idTarget,
|
|
idWeapon,
|
|
0, // idSkill
|
|
0, // nSkillLevel
|
|
dwModifier,
|
|
nDamage,
|
|
200, // timeToBeFired
|
|
nTimeFly // timeToDoDamage
|
|
);
|
|
m_AttackList.Add(newEvent);
|
|
|
|
newEvent.UpdateTargetFlag();
|
|
return m_AttackList[m_AttackList.Count - 1];
|
|
}
|
|
|
|
public CECAttackEvent AddSkillAttack(int idHost, int idCastTarget, int idTarget, int idWeapon, int idSkill, int nSkillLevel, uint dwModifier, int nDamage)
|
|
{
|
|
var newEvent = new CECAttackEvent(
|
|
this,
|
|
idHost,
|
|
idCastTarget,
|
|
idTarget,
|
|
idWeapon,
|
|
idSkill,
|
|
nSkillLevel,
|
|
dwModifier,
|
|
nDamage,
|
|
200, // timeToBeFired
|
|
1000 // timeToDoDamage
|
|
);
|
|
m_AttackList.Add(newEvent);
|
|
|
|
newEvent.UpdateTargetFlag();
|
|
return m_AttackList[m_AttackList.Count - 1];
|
|
}
|
|
|
|
// === thêm tạm để code có thể compile ===
|
|
public void AddAttack(CECAttackEvent evt)
|
|
{
|
|
m_AttackList.Add(evt);
|
|
}
|
|
public class TARGET_DATA
|
|
{
|
|
public int idTarget;
|
|
public uint dwModifier;
|
|
public int nDamage;
|
|
}
|
|
|
|
|
|
}
|
|
public class CECAttackEvent
|
|
{
|
|
public CECAttacksMan? m_pManager;
|
|
|
|
public bool m_bSignaled;
|
|
public bool m_bDoFired;
|
|
public bool m_bDoDamaged;
|
|
public bool m_bFinished;
|
|
|
|
public uint m_timeLived;
|
|
public uint m_timeToBeFired;
|
|
public uint m_timeToDoDamage;
|
|
|
|
public int m_idHost;
|
|
public int m_idCastTarget;
|
|
public List<TARGET_DATA> m_targets = new List<TARGET_DATA>();
|
|
|
|
public int m_idWeapon;
|
|
public int m_idSkill;
|
|
public int m_nSkillLevel;
|
|
public int m_nSkillSection;
|
|
|
|
public CECAttackEvent() { }
|
|
|
|
public CECAttackEvent(CECAttacksMan? pManager, int idHost, int idCastTarget, int idTarget,
|
|
int idWeapon, int idSkill, int nSkillLevel, uint dwModifier,
|
|
int nDamage, int nTimeToBeFired, int nTimeToDoDamage)
|
|
{
|
|
m_pManager = pManager;
|
|
m_idHost = idHost;
|
|
m_idCastTarget = idCastTarget;
|
|
m_idWeapon = idWeapon;
|
|
m_idSkill = idSkill;
|
|
m_nSkillLevel = nSkillLevel;
|
|
m_timeToBeFired = (uint)nTimeToBeFired;
|
|
m_timeToDoDamage = (uint)nTimeToDoDamage;
|
|
|
|
AddTarget(idTarget, dwModifier, nDamage);
|
|
}
|
|
|
|
public bool AddTarget(int idTarget, uint dwModifier, int nDamage)
|
|
{
|
|
m_targets.Add(new TARGET_DATA
|
|
{
|
|
idTarget = idTarget,
|
|
dwModifier = dwModifier,
|
|
nDamage = nDamage
|
|
});
|
|
return true;
|
|
}
|
|
public bool UpdateTargetFlag()
|
|
{
|
|
// update all targets' bAboutToDie flag
|
|
|
|
int nNumTargets = m_targets.Count;
|
|
for (int i = 0; i < nNumTargets; i++)
|
|
{
|
|
TARGET_DATA data = m_targets[i];
|
|
/*
|
|
if( data.dwModifier & MOD_DEADLYSTRIKE )
|
|
{
|
|
int idTarget = data.idTarget;
|
|
if (ISNPCID(idTarget))
|
|
{
|
|
CECNPC* pNPC = g_pGame->GetGameRun()->GetWorld()->GetNPCMan()->GetNPC(idTarget);
|
|
if (!pNPC)
|
|
return true;
|
|
|
|
pNPC->SetAboutToDie(true);
|
|
}
|
|
else if (ISPLAYERID(idTarget))
|
|
{
|
|
CECPlayer* pPlayer = g_pGame->GetGameRun()->GetWorld()->GetPlayerMan()->GetPlayer(idTarget);
|
|
if (!pPlayer)
|
|
return true;
|
|
|
|
pPlayer->SetAboutToDie(true);
|
|
}
|
|
}*/
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
public class CECAttackerEvents
|
|
{
|
|
private readonly List<CECAttackEvent> m_list = new List<CECAttackEvent>();
|
|
|
|
public void Add(CECAttackEvent? evt)
|
|
{
|
|
if (evt != null)
|
|
m_list.Add(evt);
|
|
}
|
|
|
|
public bool IsEmpty() => m_list.Count == 0;
|
|
public int Count() => m_list.Count;
|
|
|
|
public CECAttackEvent? Find(int idSkill = 0, int nSkillSection = 0)
|
|
{
|
|
foreach (var evt in m_list)
|
|
{
|
|
if (evt.m_idSkill == idSkill && evt.m_nSkillSection == nSkillSection)
|
|
return evt;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public void Signal()
|
|
{
|
|
foreach (var evt in m_list)
|
|
evt.m_bSignaled = true;
|
|
m_list.Clear();
|
|
}
|
|
|
|
public static implicit operator bool(CECAttackerEvents events)
|
|
{
|
|
return !events.IsEmpty();
|
|
}
|
|
}
|
|
enum MOD
|
|
|
|
{
|
|
MOD_PHYSIC_ATTACK_RUNE = 0x0001, // ÎïÀí¹¥»÷ÓÅ»¯·ûÉúЧ
|
|
MOD_MAGIC_ATTACK_RUNE = 0x0002, // ·¨Êõ¹¥»÷ÓÅ»¯·ûÉúЧ
|
|
MOD_PHYSIC_DEFENCE_RUNE = 0x0004, // ÎïÀí·ÀÓùÓÅ»¯·ûÉúЧ
|
|
MOD_MAGIC_DEFENCE_RUNE = 0x0008, // ·¨Êõ·ÀÓùÓÅ»¯·ûÉúЧ
|
|
MOD_CRITICAL_STRIKE = 0x0010, // ±¬»÷
|
|
MOD_RETORT = 0x0020, // ·´Õð
|
|
MOD_NULLITY = 0x0040, // ÎÞЧ¹¥»÷
|
|
MOD_IMMUNE = 0x0080, // ÃâÒßÁ˴˴ι¥»÷£¬ÓÅÏȼ¶¸ßÓÚÎÞЧ
|
|
MOD_ENCHANT_FAILED = 0x0100, // enchant ʧ°Ü
|
|
MOD_SUCCESS = 0x0200, // ³É¹¦
|
|
MOD_DODGE_DAMAGE = 0x0400, // É˺¦¶ãÉÁ
|
|
MOD_DODGE_DEBUFF = 0x0800, // ״̬¶ãÉÁ
|
|
MOD_ATTACK_AURA = 0x1000, // ¹â»·¹¥»÷
|
|
MOD_REBOUND = 0x2000, // ·´µ¯
|
|
MOD_BEAT_BACK = 0x4000, // ·´»÷
|
|
}; |