Files
2026-05-05 16:09:25 +07:00

936 lines
30 KiB
C#

using CSNetwork.GPDataType;
using System;
using System.Collections.Generic;
using BrewMonster.Network;
using BrewMonster.Utils;
using Random = UnityEngine.Random;
using UnityEngine;
namespace BrewMonster.Scripts
{
using WorkList = System.Collections.Generic.List<CECEPWork>;
public abstract class CECEPWorkMatcher
{
public abstract bool Match(CECEPWork work, int workType);
}
// class CECEPWorkMelee
public class CECEPWorkMelee : CECEPWork
{
int m_iAttackTarget;
public CECEPWorkMelee(CECEPWorkMan pWorkMan, int attackTarget) : base(EP_work_ID.WORK_HACKOBJECT, pWorkMan)
{
m_iAttackTarget = attackTarget;
}
public override void Start()
{
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_ATTACK_1 + UnityEngine.Random.Range(0, 3));
GetPlayer().EnterFightState();
}
public override void Tick(float dwDeltaTime)
{
GetPlayer().TurnFaceTo(m_iAttackTarget);
// Slide to server position
A3DVECTOR3 vDir = GetPlayer().m_vServerPos - GetPlayer().GetPos();
float fDist = vDir.Normalize();
if (fDist > 0.0001f)
{
float fMoveDist = 10.0f * dwDeltaTime * 0.001f;
if (fMoveDist > fDist)
fMoveDist = fDist;
GetPlayer().SetPos(GetPlayer().GetPos() + vDir * fMoveDist);
}
if (GetPlayer().m_FightCnt.IncCounter(dwDeltaTime * 1000))
{
Finish();
}
}
public override void Cancel()
{
GetPlayer().TurnFaceTo(0);
}
};
public class CECEPWorkIDMatcher : CECEPWorkMatcher
{
int m_workID;
public CECEPWorkIDMatcher(int workID)
{
m_workID = workID;
}
public override bool Match(CECEPWork work, int workType)
{
return work != null && work.GetWorkID() == m_workID;
}
}
// class CECEPWorkCongregate
public class CECEPWorkCongregate : CECEPWork
{
int m_iType;
public CECEPWorkCongregate(CECEPWorkMan pWorkMan, int iType) : base(EP_work_ID.WORK_CONGREGATE, pWorkMan)
{
m_iType = iType;
}
public override void Start()
{
}
public int GetType()
{
return m_iType;
}
}
public class CECEPCongregateWorkMatcher : CECEPWorkMatcher
{
int m_iType;
public CECEPCongregateWorkMatcher(int iType)
{
m_iType = iType;
}
public override bool Match(CECEPWork work, int workType)
{
if (work != null && work.GetWorkID() == CECEPWork.EP_work_ID.WORK_CONGREGATE)
{
CECEPWorkCongregate pCongregateWork = work as CECEPWorkCongregate;
return pCongregateWork.GetType() == m_iType;
}
return false;
}
}
// class CECEPWorkIdle
public class CECEPWorkIdle : CECEPWork
{
int m_iType;
bool m_bOTCheck;
CECCounter m_OTCnt;
uint m_dwParam;
public CECEPWorkIdle(CECEPWorkMan pWorkMan, int iType, int iOTTime, uint dwParam) : base(EP_work_ID.WORK_IDLE, pWorkMan)
{
m_dwParam = dwParam;
m_iType = iType;
m_bOTCheck = iOTTime > 0 ? true : false;
if (m_bOTCheck)
{
m_OTCnt.SetPeriod(iOTTime);
m_OTCnt.Reset();
}
switch (iType)
{
case Idle_work_type.IDLE_SITDOWN:
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
if (m_dwParam != 0)
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_SITDOWN_LOOP);
else
{
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_SITDOWN);
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_SITDOWN_LOOP, true, 200, true);
}
break;
case Idle_work_type.IDLE_REVIVE:
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_REVIVE);
break;
case Idle_work_type.IDLE_BOOTH:
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
break;
}
}
public override void Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
}
public int GetType()
{
return m_iType;
}
}
public class CECEPIdleWorkMatcher : CECEPWorkMatcher
{
int m_iType;
public CECEPIdleWorkMatcher(int iType)
{
m_iType = iType;
}
public override bool Match(CECEPWork work, int workType)
{
if (work != null && work.GetWorkID() == CECEPWork.EP_work_ID.WORK_IDLE)
{
CECEPWorkIdle pIdleWork = work as CECEPWorkIdle;
return pIdleWork.GetType() == m_iType;
}
return false;
}
}
public class CECEPWork
{
public static class EP_work_ID
{
public const int WORK_INVALID = -1,
WORK_STAND = 0, // Stand and do nothing
WORK_MOVE = 1, // Move
WORK_HACKOBJECT = 2, // Hack specified object (NPC, player etc.)
WORK_SPELL = 3, // Spell magic
WORK_PICKUP = 4, // Pickup matter
WORK_DEAD = 5, // Dead
WORK_USEITEM = 6, // Use item
WORK_IDLE = 7, // Idle works
WORK_FLASHMOVE = 8, // Flash move
WORK_PASSIVEMOVE = 9, // Move controlled by server
WORK_CONGREGATE = 10, // Congregate reply
WORK_SKILLSTATEACT = 11, // skill buff action
NUM_WORK = 12;
}
// Idle work type
public static class Idle_work_type
{
public const int IDLE_SITDOWN = 0,
IDLE_REVIVE = 1,
IDLE_BOOTH = 2;
}
static string[] l_WorkName = new string[EP_work_ID.NUM_WORK]
{
"WORK_STAND",
"WORK_MOVE",
"WORK_HACKOBJECT",
"WORK_SPELL",
"WORK_PICKUP",
"WORK_DEAD",
"WORK_USEITEM",
"WORK_IDLE",
"WORK_FLASHMOVE",
"WORK_PASSIVEMOVE",
"WORK_CONGREGATE",
"WORK_SKILLSTATEACT",
};
protected int m_iWorkID;
protected CECEPWorkMan m_pWorkMan;
protected bool m_bFinished;
protected EC_ElsePlayer GetPlayer()
{
return m_pWorkMan.GetPlayer();
}
public CECEPWork(int iWorkID, CECEPWorkMan pWorkMan)
{
m_iWorkID = iWorkID;
m_pWorkMan = pWorkMan;
m_bFinished = false;
}
public static string GetWorkName(int iWork)
{
if (iWork >= EP_work_ID.WORK_STAND && iWork < l_WorkName.Length)
{
return l_WorkName[iWork];
}
else
{
return "Invalid Work";
}
}
public string GetWorkName()
{
return GetWorkName(GetWorkID());
}
public int GetWorkID()
{
return m_iWorkID;
}
public bool IsFinished()
{
return m_bFinished;
}
public virtual void Start() { }
public virtual void Tick(float dwDeltaTime) { }
public virtual void Cancel() { }
public virtual void Finish()
{
m_bFinished = true;
}
static bool Validate(int iWork)
{
return iWork >= EP_work_ID.WORK_STAND && iWork < EP_work_ID.NUM_WORK;
}
}
// class CECEPWorkSpell
public class CECEPWorkSpell : CECEPWork
{
CECCounter m_SkillCnt;
CECSkill m_pCurSkill;
int m_idCurSkillTarget;
public CECEPWorkSpell(CECEPWorkMan pWorkMan, uint dwPeriod, CECSkill pSkill, int target) : base(EP_work_ID.WORK_SPELL, pWorkMan)
{
m_pCurSkill = pSkill;
m_idCurSkillTarget = target;
if (m_SkillCnt == null){
m_SkillCnt = new CECCounter();
}
m_SkillCnt.SetPeriod(dwPeriod);
m_SkillCnt.Reset();
}
// public CECEWorkSpell(){
// if (m_pCurSkill != null){
// m_pCurSkill = null;
// }
// }
public override void Start()
{
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
}
public override void Tick(float dwDeltaTime){
GetPlayer().m_FightCnt.IncCounter(dwDeltaTime *1000);
float iRealTime = EC_Game.GetRealTickTime();
if (m_SkillCnt.IncCounter(Time.unscaledDeltaTime * 1000f, out float fCounter, out float fPeriod)){
Finish();
}else{
if (m_idCurSkillTarget != 0){
GetPlayer().TurnFaceTo(m_idCurSkillTarget);
}
if (GetPlayer().IsPlayingMoveAction() && !GetPlayer().IsWorkMoveRunning()){ // ´ÓÒÆ¶¯Ê©·¨µ½Í£Ö¹Òƶ¯¡¢»áÒ»Ö±ÔÚ³ÖÐø²¥·ÅÒÆ¶¯¶¯×÷£¬´Ë´¦ÔÝÍ£
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_FIGHTSTAND);
}
if (!GetPlayer().IsPlayingAction()){
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_FIGHTSTAND); // ¼¼Äܶ¯×÷²¥·ÅÍê³Éºó¡¢²¥·ÅÕ½¶·Õ¾Á¢¶¯×÷
}
}
}
public override void Cancel(){
if (m_pCurSkill != null){
m_pCurSkill = null;
}
m_idCurSkillTarget = 0;
GetPlayer().StopSkillAttackAction();
GetPlayer().TurnFaceTo(0);
}
public CECSkill GetSkill(){
return m_pCurSkill;
}
}
public class CECEPWorkMan
{
public static class Work_type
{
public const int WT_NOTHING = 0, // Do thing
WT_NORMAL = 1, // Normal type work
WT_INTERRUPT = 2, // Interrupt type work
NUM_WORKTYPE = 3;
}
private EC_ElsePlayer m_pElsePlayer;
private WorkList[] m_WorkStack = new WorkList[Work_type.NUM_WORKTYPE]
{
new List<CECEPWork>(),
new List<CECEPWork>(),
new List<CECEPWork>()
};
private int m_iCurWorkType;
public CECEPWorkMan(EC_ElsePlayer pElsePlayer)
{
m_pElsePlayer = pElsePlayer;
m_iCurWorkType = -1;
}
public EC_ElsePlayer GetPlayer()
{
return m_pElsePlayer;
}
public bool ValidateWorkType(int iWorkType)
{
return iWorkType >= 0 && iWorkType < Work_type.NUM_WORKTYPE;
}
public bool FindWork(int iWorkType, int iWorkID)
{
if (!ValidateWorkType(iWorkType))
{
return false;
}
WorkList workList = m_WorkStack[iWorkType];
if (workList != null)
{
for (int i = 0; i < workList.Count; ++i)
{
if (iWorkID == workList[i].GetWorkID())
{
return true;
}
}
}
return false;
}
public void StartNormalWork(CECEPWork pWork)
{
StartWork(Work_type.WT_NORMAL, ref pWork);
}
private bool CanRunSimultaneously(CECEPWork pWork1, CECEPWork pWork2)
{
if (pWork1.GetWorkID() == CECEPWork.EP_work_ID.WORK_MOVE &&
pWork2.GetWorkID() == CECEPWork.EP_work_ID.WORK_SPELL)
{
return CanSpellWhileMoving(pWork2 as CECEPWorkSpell);
}
if (pWork2.GetWorkID() == CECEPWork.EP_work_ID.WORK_MOVE &&
pWork1.GetWorkID() == CECEPWork.EP_work_ID.WORK_SPELL)
{
return CanSpellWhileMoving(pWork1 as CECEPWorkSpell);
}
return false;
}
private bool CanReplace(CECEPWork pNewWork, CECEPWork pExistWork)
{
if (pNewWork.GetWorkID() == CECEPWork.EP_work_ID.WORK_SPELL &&
pExistWork.GetWorkID() == CECEPWork.EP_work_ID.WORK_SPELL)
{
return CanSpellWhileMoving(pNewWork as CECEPWorkSpell)
&& CanSpellWhileMoving(pExistWork as CECEPWorkSpell);
}
return false;
}
private bool CanSpellWhileMoving(CECEPWorkSpell pWorkSpell)
{
return false;
// TO DO: fix later
// return pWorkSpell.GetSkill()
// && CECCastSkillWhenMove.Instance().IsSkillSupported(pWorkSpell.GetSkill().GetSkillID(), GetPlayer());
}
private bool CanMergeWithCurrentWork(int iWorkType, CECEPWork pWork)
{
if (!ValidateWorkType(iWorkType) || iWorkType != m_iCurWorkType)
{
return false;
}
WorkList workList = m_WorkStack[iWorkType];
if (workList == null || workList.Count == 0)
{
return false;
}
for (int i = 0; i < workList.Count; ++i)
{
if (!CanRunSimultaneously(pWork, workList[i]) && // Ҫôͬʱ
!CanReplace(pWork, workList[i]))
{ // Ҫô
return false;
}
}
return true;
}
private void KillWork(int iWorkType, int index)
{
if (!ValidateWorkType(iWorkType))
{
//ASSERT(false);
return;
}
WorkList workList = m_WorkStack[iWorkType];
if (index < 0 || index >= (int)workList.Count)
{
//ASSERT(false);
return;
}
CECEPWork pWork = workList[index];
pWork.Cancel();
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::%s(%s) killed", pWork.GetWorkName(), GetWorkTypeName(iWorkType)));
//delete pWork;
pWork = null;
workList.RemoveAt(index);
}
private void MergeWork(int iWorkType, CECEPWork pWork)
{
if (!CanMergeWithCurrentWork(iWorkType, pWork))
{
//ASSERT(false);
return;
}
WorkList workList = m_WorkStack[iWorkType];
for (int i = 0; i < workList.Count; ++i)
{
if (CanReplace(pWork, workList[i]))
{
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::MergeWork %s replacing %s at %s", pWork.GetWorkName(), workList[i].GetWorkName(), GetWorkTypeName(iWorkType)));
KillWork(iWorkType, i);
workList.Insert(i, pWork);
return;
}
}
workList.Add(pWork);
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::MergeWork %s appended to %s", pWork.GetWorkName(), GetWorkTypeName(iWorkType)));
}
private void FinishWorkAtWorkType(int iWorkType)
{
if (!ValidateWorkType(iWorkType))
{
//ASSERT(false);
return;
}
WorkList workList = m_WorkStack[iWorkType];
while (workList != null && workList.Count != 0)
{
KillWork(iWorkType, 0);
}
if (m_iCurWorkType == iWorkType)
{
m_iCurWorkType = -1;
}
}
private void AppendWork(int iWorkType, CECEPWork pWork)
{
if (!ValidateWorkType(iWorkType) || pWork == null)
{
//ASSERT(false);
return;
}
m_WorkStack[iWorkType].Add(pWork);
}
private void CancelWorkAtWorkType(int iWorkType)
{
if (!ValidateWorkType(iWorkType))
{
return;
}
WorkList workList = m_WorkStack[iWorkType];
for (int i = 0; i < workList.Count; ++i)
{
CancelWork(workList[i]);
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::%s(%s) cancelled", workList[i].GetWorkName(), GetWorkTypeName(iWorkType)));
}
}
private void CancelWork(CECEPWork pWork)
{
if (pWork == null)
{
//ASSERT(false);
return;
}
pWork.Cancel();
}
public void StartWork(int iWorkType, ref CECEPWork pWork)
{
if (!ValidateWorkType(iWorkType))
{
pWork = null;
return;
}
if (CanMergeWithCurrentWork(iWorkType, pWork))
{
MergeWork(iWorkType, pWork);
}
else
{
if (pWork.GetWorkID() == CECEPWork.EP_work_ID.WORK_DEAD)
{
for (int i = iWorkType; i < Work_type.NUM_WORKTYPE; i++)
{
FinishWorkAtWorkType(i);
}
AppendWork(iWorkType, pWork);
m_iCurWorkType = iWorkType;
}
else
{
bool shouldStart = (iWorkType >= m_iCurWorkType);
FinishWorkAtWorkType(iWorkType);
AppendWork(iWorkType, pWork);
if (!shouldStart)
{
//LOG_DEBUG_INFO(AString().Format("CECEPWork::StartWork %s flushed %s", pWork.GetWorkName(), GetWorkTypeName(iWorkType)));
return;
}
if (iWorkType > m_iCurWorkType)
{
CancelWorkAtWorkType(m_iCurWorkType);
}
m_iCurWorkType = iWorkType;
}
}
pWork.Start();
}
private bool IsAnyWorkRunning()
{
return ValidateWorkType(m_iCurWorkType) && m_WorkStack != null && m_WorkStack[m_iCurWorkType] != null;
}
private void StartAwaitingWorks()
{
if (ValidateWorkType(m_iCurWorkType))
{
for (--m_iCurWorkType; m_iCurWorkType >= 0; --m_iCurWorkType)
{
WorkList workList = m_WorkStack[m_iCurWorkType];
if (workList == null || workList.Count == 0)
{
continue;
}
for (int j = 0; j < workList.Count; ++j)
{
workList[j].Start();
//LOG_DEBUG_INFO(AString().Format("CECElsePlayer::StartAwaitingWorks %s(%s) started by decrease priority", workList[j].GetWorkName(), GetWorkTypeName(m_iCurWorkType)));
}
break;
}
}
}
public void Tick(float dwDeltaTime)
{
if (!IsAnyWorkRunning())
{
return;
}
WorkList workList = m_WorkStack[m_iCurWorkType];
if (workList != null)
{
for (int i = 0; i < workList.Count;)
{
CECEPWork pWork = workList[i];
pWork.Tick(dwDeltaTime);
if (!pWork.IsFinished())
{
++i;
continue;
}
KillWork(m_iCurWorkType, i);
}
if (workList == null || workList.Count == 0)
{
StartAwaitingWorks();
}
}
}
public void FinishWork(CECEPWorkMatcher matcher)
{
bool bCurrentWorkFinished = false;
for (int i = Work_type.NUM_WORKTYPE - 1; i >= 0; --i)
{
WorkList workList = m_WorkStack[i];
if (workList == null || workList.Count == 0)
{
continue;
}
for (int j = 0; j < workList.Count;)
{
if (!matcher.Match(workList[j], i))
{
++j;
continue;
}
KillWork(i, j);
if (i == m_iCurWorkType && (workList == null || workList.Count == 0))
{
bCurrentWorkFinished = true;
}
}
}
if (bCurrentWorkFinished)
{
StartAwaitingWorks();
}
}
public void FinishWork(int idWork)
{
FinishWork(new CECEPWorkIDMatcher(idWork));
}
public bool IsWorkRunning(int iWork)
{
return FindWork(m_iCurWorkType, iWork);
}
public void FinishRunningWork(int idWork)
{
if (!IsWorkRunning(idWork))
{
return;
}
WorkList workList = m_WorkStack[m_iCurWorkType];
if (workList != null)
{
for (int i = 0; i < workList.Count;)
{
if (workList[i].GetWorkID() != idWork)
{
++i;
continue;
}
//LOG_DEBUG_INFO(AString().Format("CECEPWorkMan::FinishRunningWork %s(%s)", workList[i].GetWorkName(), GetWorkTypeName(m_iCurWorkType)));
KillWork(m_iCurWorkType, i);
}
if (workList == null)
{
StartAwaitingWorks();
}
}
}
public bool FinishIdleWork(int iType)
{
FinishWork(new CECEPIdleWorkMatcher(iType));
return true;
}
public bool FinishCongregateWork(int iType)
{
FinishWork(new CECEPCongregateWorkMatcher(iType));
return true;
}
public int GetCurrentWorkType()
{
return m_iCurWorkType;
}
}
public class CECEPWorkDead : CECEPWork
{
private uint m_dwParam;
public CECEPWorkDead(CECEPWorkMan pWorkMan, uint dwParam)
: base(CECEPWork.EP_work_ID.WORK_DEAD, pWorkMan)
{
m_dwParam = dwParam;
}
public void Start()
{
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
A3DVECTOR3 vCurPos = GetPlayer().GetPos();
int iFlag = 0;
// if (vCurPos.y < fWaterHei - m_MoveConst.fShoreDepth ||
// (vCurPos.y < fWaterHei && fWaterHei - vGndPos.y > m_MoveConst.fShoreDepth))
//TODO: Check in water
// if (GetPlayer().CheckWaterMoveEnv(vCurPos, fWaterHei, vGndPos.y))
// iFlag = 1;
// else if (vCurPos.y > vGndPos.y + 0.5f)
// iFlag = 2;
if (m_dwParam != null)
{
if (iFlag == 1)
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_WATERDIE_LOOP);
else if (iFlag == 2)
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_AIRDIE);
else
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_GROUNDDIE_LOOP);
}
else
{
if (iFlag == 1)
{
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_WATERDIE);
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_WATERDIE_LOOP, true, 200, true);
}
else if (iFlag == 2)
{
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_AIRDIE_ST);
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_AIRDIE, true, 200, true);
}
else
{
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_GROUNDDIE);
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_GROUNDDIE_LOOP, true, 200, true);
}
}
}
}
public class CECEPWorkStand : CECEPWork
{
private uint m_dwParam;
public CECEPWorkStand(CECEPWorkMan pWorkMan)
: base(CECEPWork.EP_work_ID.WORK_STAND, pWorkMan)
{
}
public override void Start(){
base.Start();
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
GetPlayer().PlayAction(GetStandAction());
}
public override void Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
if (!GetPlayer().m_FightCnt.IsFull()){
GetPlayer().m_FightCnt.IncCounter(dwDeltaTime);
}
if (GetPlayer().GetPlayerModel() != null){
if (CECPlayer.IsMoveStandAction(GetPlayer().GetLowerBodyAction())){
GetPlayer().PlayAction(GetStandAction(), false);
}
}
}
int GetStandAction()
{
return GetPlayer().GetMoveStandAction(false, GetPlayer().IsFighting());
}
}
public class CECEPWorkPickUp : CECEPWork
{
private CECCounter m_PickupCnt = new CECCounter();
private PickUpType m_type;
private int m_gatherItemID;
public enum PickUpType{
PICKUP_ITEM,
GATHER_ITEM,
GATHER_MONSTER_SPIRIT,
}
public CECEPWorkPickUp(CECEPWorkMan pWorkMan, float dwPeriod, PickUpType type, int gatherItemID)
: base(EP_work_ID.WORK_PICKUP, pWorkMan)
{
m_type = type;
m_gatherItemID = gatherItemID;
m_PickupCnt.SetPeriod(dwPeriod);
m_PickupCnt.Reset();
}
public override void Start(){
base.Start();
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_STAND;
m_PickupCnt.Reset();
switch (m_type){
case PickUpType.PICKUP_ITEM:
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_PICKUP_MATTER);
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_STAND, false, 200, true);
break;
case PickUpType.GATHER_ITEM:
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_PICKUP, EC_ElementDataHelper.GetGatherStartActionConfig(m_gatherItemID));
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_PICKUP_LOOP, EC_ElementDataHelper.GetGatherLoopActionConfig(m_gatherItemID), false, 200, true);
break;
case PickUpType.GATHER_MONSTER_SPIRIT:
//todo:
// GetPlayer().PlayGatherMonsterSpiritAction();
break;
}
}
public override void Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
var dwRealTime = EC_Game.GetRealTickTime();
switch (m_type){
case PickUpType.PICKUP_ITEM:
case PickUpType.GATHER_MONSTER_SPIRIT:
if (m_PickupCnt.IncCounter(dwRealTime)){
Finish();
}
break;
}
}
}
// class CECEPWorkMove
class CECEPWorkMove : CECEPWork
{
public CECEPWorkMove(CECEPWorkMan pWorkMan): base(CECEPWork.EP_work_ID.WORK_MOVE, pWorkMan)
{
}
public override void Start()
{
GetPlayer().m_iMoveMode = Move_Mode.MOVE_STAND;
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_ATTACK_1 + Random.Range(0, 3));
GetPlayer().EnterFightState();
}
public override void Tick(float dwDeltaTime)
{
if (GetPlayer().MovingTo(dwDeltaTime))
{
GetPlayer().m_fLastSpeed = 0.0f;
//GetPlayer().StartModelMove(GetPlayer().m_vStopDir, g_vAxisY, 150);
//GetPlayer().ChangeModelTargetDirAndUp(GetPlayer().m_vStopDir, g_vAxisY);
Finish();
}
}
public override void Cancel()
{
GetPlayer().SetPos(GetPlayer().m_vServerPos);
//GetPlayer().StopModelMove(GetPlayer().m_vStopDir, g_vAxisY, 150);
}
};
public class CECEPWorkFlashMove : CECEPWork
{
private A3DVECTOR3 m_vServerPos;
private float m_fMoveSpeed;
public CECEPWorkFlashMove(CECEPWorkMan pWorkMan, A3DVECTOR3 vServerPos, float fMoveSpeed)
: base(CECEPWork.EP_work_ID.WORK_FLASHMOVE, pWorkMan)
{
m_vServerPos = vServerPos;
m_fMoveSpeed = fMoveSpeed;
}
public override void Start()
{
GetPlayer().m_iMoveMode = (int)MoveMode.MOVE_MOVE;
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_JUMP_START, true, 0);
GetPlayer().PlayAction((int)PLAYER_ACTION_TYPE.ACT_JUMP_LOOP, false, 0, true);
}
public override void Tick(float dwDeltaTime)
{
base.Tick(dwDeltaTime);
A3DVECTOR3 vCurPos = GetPlayer().GetPos();
A3DVECTOR3 vDir = m_vServerPos - vCurPos;
float fDist = vDir.Normalize();
float fMoveDelta = m_fMoveSpeed * dwDeltaTime * 0.001f;
if (fMoveDelta >= fDist)
{
GetPlayer().SetPos(m_vServerPos);
Finish();
}
else
{
vCurPos = vCurPos + vDir * fMoveDelta;
GetPlayer().SetPos(vCurPos);
}
}
public override void Cancel()
{
GetPlayer().SetPos(m_vServerPos);
}
}
}