forked from Tr0n/client
Solution refactoring and restructuring, removed Boost dependency, removed unused tools
This commit is contained in:
280
src/UserInterface/PythonPlayerEventHandler.cpp
Normal file
280
src/UserInterface/PythonPlayerEventHandler.cpp
Normal file
@ -0,0 +1,280 @@
|
||||
#include "StdAfx.h"
|
||||
#include "PythonPlayerEventHandler.h"
|
||||
#include "PythonPlayer.h"
|
||||
#include "PythonCharacterManager.h"
|
||||
#include "PythonNetworkStream.h"
|
||||
|
||||
CPythonPlayerEventHandler& CPythonPlayerEventHandler::GetSingleton()
|
||||
{
|
||||
static CPythonPlayerEventHandler s_kPlayerEventHandler;
|
||||
return s_kPlayerEventHandler;
|
||||
}
|
||||
|
||||
CPythonPlayerEventHandler::~CPythonPlayerEventHandler()
|
||||
{
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnClearAffects()
|
||||
{
|
||||
CPythonPlayer::Instance().ClearAffects();
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnSetAffect(UINT uAffect)
|
||||
{
|
||||
CPythonPlayer::Instance().SetAffect(uAffect);
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnResetAffect(UINT uAffect)
|
||||
{
|
||||
CPythonPlayer::Instance().ResetAffect(uAffect);
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnSyncing(const SState& c_rkState)
|
||||
{
|
||||
const TPixelPosition& c_rkPPosCurSyncing=c_rkState.kPPosSelf;
|
||||
m_kPPosPrevWaiting=c_rkPPosCurSyncing;
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnWaiting(const SState& c_rkState)
|
||||
{
|
||||
DWORD dwCurTime=ELTimer_GetMSec();
|
||||
if (m_dwNextWaitingNotifyTime>dwCurTime)
|
||||
return;
|
||||
|
||||
m_dwNextWaitingNotifyTime=dwCurTime+100;
|
||||
|
||||
const TPixelPosition& c_rkPPosCurWaiting=c_rkState.kPPosSelf;
|
||||
float dx=m_kPPosPrevWaiting.x-c_rkPPosCurWaiting.x;
|
||||
float dy=m_kPPosPrevWaiting.y-c_rkPPosCurWaiting.y;
|
||||
float len=sqrt(dx*dx+dy*dy);
|
||||
|
||||
if (len<1.0f)
|
||||
return;
|
||||
|
||||
m_kPPosPrevWaiting=c_rkPPosCurWaiting;
|
||||
|
||||
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
|
||||
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_WAIT, 0);
|
||||
|
||||
//Trace("waiting\n");
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnMoving(const SState& c_rkState)
|
||||
{
|
||||
DWORD dwCurTime=ELTimer_GetMSec();
|
||||
if (m_dwNextMovingNotifyTime>dwCurTime)
|
||||
return;
|
||||
|
||||
m_dwNextMovingNotifyTime=dwCurTime+300;
|
||||
|
||||
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
|
||||
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_MOVE, 0);
|
||||
|
||||
// Trace("moving\n");
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnMove(const SState& c_rkState)
|
||||
{
|
||||
DWORD dwCurTime=ELTimer_GetMSec();
|
||||
m_dwNextWaitingNotifyTime=dwCurTime+100;
|
||||
m_dwNextMovingNotifyTime=dwCurTime+300;
|
||||
|
||||
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
|
||||
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_MOVE, 0);
|
||||
|
||||
// Trace("move\n");
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnStop(const SState& c_rkState)
|
||||
{
|
||||
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
|
||||
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_WAIT, 0);
|
||||
|
||||
// Trace("stop\n");
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnWarp(const SState& c_rkState)
|
||||
{
|
||||
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
|
||||
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_WAIT, 0);
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnAttack(const SState& c_rkState, WORD wMotionIndex)
|
||||
{
|
||||
// Tracef("CPythonPlayerEventHandler::OnAttack [%d]\n", wMotionIndex);
|
||||
assert(wMotionIndex < 255);
|
||||
|
||||
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
|
||||
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_COMBO, wMotionIndex);
|
||||
|
||||
#ifdef __ATTACK_SPEED_CHECK__
|
||||
static DWORD s_dwLastTime=timeGetTime();
|
||||
|
||||
DWORD dwCurTime=timeGetTime();
|
||||
Tracef("%d\n", dwCurTime-s_dwLastTime);
|
||||
s_dwLastTime=dwCurTime;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnUseSkill(const SState& c_rkState, UINT uMotSkill, UINT uArg)
|
||||
{
|
||||
CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
|
||||
rkNetStream.SendCharacterStatePacket(c_rkState.kPPosSelf, c_rkState.fAdvRotSelf, CInstanceBase::FUNC_SKILL|uMotSkill, uArg);
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnUpdate()
|
||||
{
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnChangeShape()
|
||||
{
|
||||
CPythonPlayer::Instance().NEW_Stop();
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::OnHit(UINT uSkill, CActorInstance& rkActorVictim, BOOL isSendPacket)
|
||||
{
|
||||
DWORD dwVIDVictim=rkActorVictim.GetVirtualID();
|
||||
|
||||
// Update Target
|
||||
CPythonPlayer::Instance().SetTarget(dwVIDVictim, FALSE);
|
||||
// Update Target
|
||||
|
||||
if (isSendPacket)
|
||||
{
|
||||
//#define ATTACK_TIME_LOG
|
||||
#ifdef ATTACK_TIME_LOG
|
||||
static std::map<DWORD, float> s_prevTimed;
|
||||
float curTime = timeGetTime() / 1000.0f;
|
||||
bool isFirst = false;
|
||||
if (s_prevTimed.end() == s_prevTimed.find(dwVIDVictim))
|
||||
{
|
||||
s_prevTimed[dwVIDVictim] = curTime;
|
||||
isFirst = true;
|
||||
}
|
||||
float diffTime = curTime-s_prevTimed[dwVIDVictim];
|
||||
if (diffTime < 0.1f && !isFirst)
|
||||
{
|
||||
TraceError("ATTACK(SPEED_HACK): %.4f(%.4f) %d", curTime, diffTime, dwVIDVictim);
|
||||
}
|
||||
else
|
||||
{
|
||||
TraceError("ATTACK: %.4f(%.4f) %d", curTime, diffTime, dwVIDVictim);
|
||||
}
|
||||
|
||||
s_prevTimed[dwVIDVictim] = curTime;
|
||||
#endif
|
||||
CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance();
|
||||
rkStream.SendAttackPacket(uSkill, dwVIDVictim);
|
||||
}
|
||||
|
||||
if (!rkActorVictim.IsPushing())
|
||||
return;
|
||||
|
||||
// <20>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>и<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
extern bool IS_HUGE_RACE(unsigned int vnum);
|
||||
if (IS_HUGE_RACE(rkActorVictim.GetRace()))
|
||||
return;
|
||||
|
||||
|
||||
CPythonCharacterManager::Instance().AdjustCollisionWithOtherObjects(&rkActorVictim);
|
||||
|
||||
const TPixelPosition& kPPosLast=rkActorVictim.NEW_GetLastPixelPositionRef();
|
||||
|
||||
SVictim kVictim;
|
||||
kVictim.m_dwVID=dwVIDVictim;
|
||||
kVictim.m_lPixelX=long(kPPosLast.x);
|
||||
kVictim.m_lPixelY=long(kPPosLast.y);
|
||||
|
||||
rkActorVictim.TEMP_Push(kVictim.m_lPixelX, kVictim.m_lPixelY);
|
||||
|
||||
m_kVctkVictim.push_back(kVictim);
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::FlushVictimList()
|
||||
{
|
||||
if (m_kVctkVictim.empty())
|
||||
return;
|
||||
|
||||
// #0000682: [M2EU] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8>
|
||||
unsigned int SYNC_POSITION_COUNT_LIMIT = 16;
|
||||
unsigned int uiVictimCount = m_kVctkVictim.size();
|
||||
|
||||
CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance();
|
||||
|
||||
TPacketCGSyncPosition kPacketSyncPos;
|
||||
kPacketSyncPos.bHeader=HEADER_CG_SYNC_POSITION;
|
||||
kPacketSyncPos.wSize=sizeof(kPacketSyncPos)+sizeof(TPacketCGSyncPositionElement) * uiVictimCount;
|
||||
|
||||
rkStream.Send(sizeof(kPacketSyncPos), &kPacketSyncPos);
|
||||
|
||||
for (unsigned int i = 0; i < uiVictimCount; ++i)
|
||||
{
|
||||
const SVictim& rkVictim = m_kVctkVictim[i];
|
||||
rkStream.SendSyncPositionElementPacket(rkVictim.m_dwVID, rkVictim.m_lPixelX, rkVictim.m_lPixelY);
|
||||
}
|
||||
|
||||
rkStream.SendSequence();
|
||||
m_kVctkVictim.clear();
|
||||
}
|
||||
|
||||
CPythonPlayerEventHandler::CPythonPlayerEventHandler()
|
||||
{
|
||||
m_dwPrevComboIndex=0;
|
||||
m_dwNextMovingNotifyTime=0;
|
||||
m_dwNextWaitingNotifyTime=0;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnSetFlyTarget()
|
||||
{
|
||||
SState s;
|
||||
m_pInstMain->NEW_GetPixelPosition(&s.kPPosSelf);
|
||||
s.fAdvRotSelf=m_pInstMain->GetGraphicThingInstancePtr()->GetTargetRotation();
|
||||
|
||||
CPythonNetworkStream& rpns=CPythonNetworkStream::Instance();
|
||||
rpns.SendFlyTargetingPacket(m_pInstTarget->GetVirtualID(), m_pInstTarget->GetGraphicThingInstancePtr()->OnGetFlyTargetPosition());
|
||||
}
|
||||
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnShoot(DWORD dwSkillIndex)
|
||||
{
|
||||
CPythonNetworkStream& rpns=CPythonNetworkStream::Instance();
|
||||
rpns.SendShootPacket(dwSkillIndex);
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::Set(CPythonPlayerEventHandler * pParent, CInstanceBase * pInstMain, CInstanceBase * pInstTarget)
|
||||
{
|
||||
m_pParent=(pParent);
|
||||
m_pInstMain=(pInstMain);
|
||||
m_pInstTarget=(pInstTarget);
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::SetTarget(CInstanceBase* pInstTarget)
|
||||
{
|
||||
m_pInstTarget = pInstTarget;
|
||||
}
|
||||
|
||||
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtAnotherTarget(DWORD dwSkillIndex, DWORD dwVID)
|
||||
{
|
||||
return;
|
||||
|
||||
Tracef("Shoot : <20>ٸ<EFBFBD> target<65><74> <20>¾ҽ<C2BE><D2BD>ϴ<EFBFBD> : %d, %d\n", dwSkillIndex, dwVID);
|
||||
|
||||
CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance();
|
||||
rkStream.SendAttackPacket(dwSkillIndex, dwVID);
|
||||
|
||||
CPythonCharacterManager& rkChrMgr = CPythonCharacterManager::Instance();
|
||||
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(dwVID);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->GetGraphicThingInstanceRef().OnShootDamage();
|
||||
}
|
||||
}
|
||||
void CPythonPlayerEventHandler::CNormalBowAttack_FlyEventHandler_AutoClear::OnExplodingAtTarget(DWORD dwSkillIndex)
|
||||
{
|
||||
// Tracef("Shoot : <20><><EFBFBD>ϴ<EFBFBD> target<65><74> <20>¾ҽ<C2BE><D2BD>ϴ<EFBFBD> : %d, %d\n", dwSkillIndex, m_pInstTarget->GetVirtualID());
|
||||
// CPythonNetworkStream& rkStream=CPythonNetworkStream::Instance();
|
||||
// rkStream.SendAttackPacket(dwSkillIndex, m_pInstTarget->GetVirtualID());
|
||||
}
|
Reference in New Issue
Block a user