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());
|
|||
|
}
|