forked from metin2/client
281 lines
8.4 KiB
C++
281 lines
8.4 KiB
C++
#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());
|
||
}
|