forked from metin2/client
1
0
Fork 0
client/UserInterface/PythonPlayerEventHandler.cpp

281 lines
8.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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