port 2V2-b: GamePhase dispatch consumes the Entergame burst

PythonNetworkStreamPhaseGame/PhaseGameActor/PhaseGameItem/Command,
NetworkActorManager and PythonChat/PythonChatModule are ported verbatim and
dispatched at runtime; the 2V0 chat stub module is removed and initChat()
runs before initnet() as in 40250. InstanceBase, PythonCharacterManager and
GameLib ActorInstance/RaceData/RaceManager compile but stay TODO until
2V2-c/d wire them.

Units not ported yet get their singletons from PythonBoot's GameSingletons
(CPythonApplication member order) and platform/pending stand-ins generated
by platform_stub.py pending; const char* stand-ins return "".

port.login_flow's fake server now sends the CInputLogin::Entergame order
(actor insert, NPC positions, PHASE_GAME, land list, time, channel, greet
notice, ping) and a TraceError observer asserts no unknown packet header.
port.login_live passes against the real server for 10 s of game phase.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-23 18:20:57 +09:00
co-authored by Claude Opus 5.5
parent d16fabf61c
commit 62b6e23bfc
76 changed files with 21087 additions and 753 deletions
File diff suppressed because it is too large Load Diff
@@ -658,7 +658,7 @@ class CInstanceBase
bool NEW_GetInstanceVectorInCircleRange(float fSkillDistance, std::vector<CInstanceBase*>* pkVct_pkInst);
void NEW_SetOwner(DWORD dwOwnerVID);
void NEW_SyncPixelPosition(long & nPPosX, long & nPPosY);
void NEW_SyncPixelPosition(LONG & nPPosX, LONG & nPPosY); // PORT: 40250 Win32 long is 32-bit.
void NEW_SyncCurrentPixelPosition();
void NEW_SetPixelPosition(const TPixelPosition& c_rkPPosDst);
@@ -1129,4 +1129,4 @@ inline int RaceToSex(int race)
}
return 0;
}
}
@@ -0,0 +1,356 @@
#include "StdAfx.h"
#include "InstanceBase.h"
#include "PythonBackground.h"
#include "../EterLib/GrpMath.h"
void CInstanceBase::SetAttackSpeed(UINT uAtkSpd)
{
if (uAtkSpd > 1100)
uAtkSpd = 0;
m_GraphicThingInstance.SetAttackSpeed(uAtkSpd/100.0f);
m_kHorse.SetAttackSpeed(uAtkSpd);
}
void CInstanceBase::SetMoveSpeed(UINT uMovSpd)
{
if (uMovSpd > 1100)
uMovSpd = 0;
m_GraphicThingInstance.SetMoveSpeed(uMovSpd/100.0f);
m_kHorse.SetMoveSpeed(uMovSpd);
}
void CInstanceBase::SetRotationSpeed(float fRotSpd)
{
m_fMaxRotSpd = fRotSpd;
}
void CInstanceBase::NEW_Stop()
{
if (__IsSyncing())
return;
if (isLock())
return;
if (IsUsingSkill())
return;
if (!IsWaiting())
EndWalking();
m_GraphicThingInstance.__OnStop();
}
void CInstanceBase::NEW_SyncPixelPosition(LONG & nPPosX, LONG & nPPosY) // PORT: 40250 Win32 long is 32-bit.
{
m_GraphicThingInstance.TEMP_Push(nPPosX, nPPosY);
}
bool CInstanceBase::NEW_CanMoveToDestPixelPosition(const TPixelPosition& c_rkPPosDst)
{
TPixelPosition kPPosCur;
NEW_GetPixelPosition(&kPPosCur);
if (kPPosCur.x==c_rkPPosDst.x && kPPosCur.y==c_rkPPosDst.y)
return false;
return true;
}
float CInstanceBase_GetDegreeFromPosition(float x, float y)
{
D3DXVECTOR3 vtDir(floor(x), floor(y), 0.0f);
D3DXVec3Normalize(&vtDir, &vtDir);
D3DXVECTOR3 vtStan(0, -1, 0);
float ret = D3DXToDegree(acosf(D3DXVec3Dot(&vtDir, &vtStan)));
if (vtDir.x < 0.0f)
ret = 360.0f - ret;
return ret;
}
float CInstanceBase::NEW_GetAdvancingRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir)
{
float fDirRot=CInstanceBase_GetDegreeFromPosition(c_rkPPosDir.x, -c_rkPPosDir.y);
float fClampDirRot=ClampDegree(fDirRot);
return fClampDirRot;
}
float CInstanceBase::NEW_GetAdvancingRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst)
{
TPixelPosition kPPosCur;
NEW_GetPixelPosition(&kPPosCur);
return NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, c_rkPPosDst);
}
float CInstanceBase::NEW_GetAdvancingRotationFromPixelPosition(const TPixelPosition& c_rkPPosSrc, const TPixelPosition& c_rkPPosDst)
{
TPixelPosition kPPosDelta;
kPPosDelta=c_rkPPosDst-c_rkPPosSrc;
return NEW_GetAdvancingRotationFromDirPixelPosition(kPPosDelta);
}
void CInstanceBase::NEW_SetAdvancingRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir)
{
float fClampDirRot=NEW_GetAdvancingRotationFromDirPixelPosition(c_rkPPosDir);
m_GraphicThingInstance.SetAdvancingRotation(fClampDirRot);
float fCurRot=m_GraphicThingInstance.GetRotation();
float fAdvRot=m_GraphicThingInstance.GetAdvancingRotation();
m_iRotatingDirection = GetRotatingDirection(fCurRot, fAdvRot);
}
void CInstanceBase::NEW_SetAdvancingRotationFromPixelPosition(const TPixelPosition& c_rkPPosSrc, const TPixelPosition& c_rkPPosDst)
{
TPixelPosition kPPosDelta;
kPPosDelta=c_rkPPosDst-c_rkPPosSrc;
NEW_SetAdvancingRotationFromDirPixelPosition(kPPosDelta);
}
bool CInstanceBase::NEW_SetAdvancingRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst)
{
if (!NEW_CanMoveToDestPixelPosition(c_rkPPosDst))
{
Tracenf("Failed to move next position (%f,%f, %f)", c_rkPPosDst.x, c_rkPPosDst.y, c_rkPPosDst.z);
return false;
}
TPixelPosition kPPosSrc;
NEW_GetPixelPosition(&kPPosSrc);
NEW_SetAdvancingRotationFromPixelPosition(kPPosSrc, c_rkPPosDst);
return true;
}
void CInstanceBase::SetAdvancingRotation(float fRotation)
{
float frotDifference = GetDegreeDifference(GetRotation(), fRotation);
if (frotDifference > 45.0f)
m_fRotSpd = m_fMaxRotSpd;
else
m_fRotSpd = m_fMaxRotSpd * 5 / 12;
m_GraphicThingInstance.SetAdvancingRotation(ClampDegree(fRotation));
m_iRotatingDirection = GetRotatingDirection(m_GraphicThingInstance.GetRotation(),
m_GraphicThingInstance.GetAdvancingRotation());
}
void CInstanceBase::StartWalking()
{
m_GraphicThingInstance.Move();
if (IsAffect(AFFECT_GYEONGGONG))
{
m_adwCRCAffectEffect[AFFECT_GYEONGGONG] = __EffectContainer_AttachEffect(EFFECT_AFFECT_GYEONGGONG);
}
else if (IsAffect(AFFECT_KWAESOK))
{
m_adwCRCAffectEffect[AFFECT_KWAESOK] = __EffectContainer_AttachEffect(EFFECT_AFFECT_KWAESOK);
}
}
void CInstanceBase::EndWalking(float fBlendingTime)
{
assert (!IsWaiting() && "CInstanceBase::EndWalking");
m_isGoing = FALSE;
// 걷고 있을때는 무조건 멈추게 해야 한다
if (IsWalking()||!IsAttacked())
{
m_GraphicThingInstance.Stop(fBlendingTime);
if (IsAffect(AFFECT_GYEONGGONG))
{
__EffectContainer_DetachEffect(EFFECT_AFFECT_GYEONGGONG);
}
else if (IsAffect(AFFECT_KWAESOK))
{
__EffectContainer_DetachEffect(EFFECT_AFFECT_KWAESOK);
}
}
}
void CInstanceBase::EndWalkingWithoutBlending()
{
EndWalking(0.0f);
}
BOOL CInstanceBase::IsWaiting()
{
return m_GraphicThingInstance.IsWaiting();
}
BOOL CInstanceBase::IsWalking()
{
return m_GraphicThingInstance.IsMoving();
}
BOOL CInstanceBase::IsPushing()
{
return m_GraphicThingInstance.IsPushing();
}
BOOL CInstanceBase::IsAttacked()
{
return m_GraphicThingInstance.IsAttacked();
}
BOOL CInstanceBase::IsKnockDown()
{
if (!m_GraphicThingInstance.IsKnockDown())
return FALSE;
return TRUE;
}
BOOL CInstanceBase::IsAttacking()
{
return m_GraphicThingInstance.isAttacking();
}
BOOL CInstanceBase::IsActingEmotion()
{
return m_GraphicThingInstance.IsActEmotion();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CInstanceBase::IsGoing()
{
return m_isGoing;
}
void CInstanceBase::NEW_MoveToDestInstanceDirection(CInstanceBase & rkInstDst)
{
TPixelPosition kPPosDst;
rkInstDst.NEW_GetPixelPosition(&kPPosDst);
NEW_MoveToDestPixelPositionDirection(kPPosDst);
}
bool CInstanceBase::NEW_MoveToDestPixelPositionDirection(const TPixelPosition & c_rkPPosDst)
{
TPixelPosition kPPosCur;
NEW_GetPixelPosition(&kPPosCur);
float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, c_rkPPosDst);
return NEW_Goto(c_rkPPosDst, fDstRot);
}
bool CInstanceBase::NEW_Goto(const TPixelPosition& c_rkPPosDst, float fDstRot)
{
if (__IsSyncing())
{
return false;
}
if (m_GraphicThingInstance.IsUsingMovingSkill())
{
SetAdvancingRotation(fDstRot);
return true;
}
if (isLock())
{
return false;
}
if (!NEW_CanMoveToDestPixelPosition(c_rkPPosDst))
{
if (!IsWaiting())
EndWalking();
return true;
}
NEW_SetSrcPixelPosition(NEW_GetCurPixelPositionRef());
NEW_SetDstPixelPosition(c_rkPPosDst);
NEW_SetDstPixelPositionZ(NEW_GetSrcPixelPositionRef().z);
m_fDstRot=fDstRot;
m_isGoing = TRUE;
if (!IsWalking())
{
StartWalking();
}
NEW_SetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
return true;
}
void CInstanceBase::NEW_MoveToDirection(float fDirRot)
{
if (__IsSyncing())
return;
if (m_GraphicThingInstance.IsUsingMovingSkill())
{
SetAdvancingRotation(fDirRot);
return;
}
if (isLock())
return;
m_isGoing = FALSE;
SetAdvancingRotation(fDirRot);
if (!IsWalking())
{
StartWalking();
}
TPixelPosition kPPosCur;
NEW_GetPixelPosition(&kPPosCur);
D3DXVECTOR3 kD3DVt3Cur(kPPosCur.x, -kPPosCur.y, kPPosCur.z);
D3DXVECTOR3 kD3DVt3Dst;
D3DXVECTOR3 kD3DVt3AdvDir(0.0f, -1.0f, 0.0f);
D3DXMATRIX kD3DMatAdv;
D3DXMatrixRotationZ(&kD3DMatAdv, D3DXToRadian(fDirRot));
D3DXVec3TransformCoord(&kD3DVt3AdvDir, &kD3DVt3AdvDir, &kD3DMatAdv);
D3DXVec3Scale(&kD3DVt3AdvDir, &kD3DVt3AdvDir, 300.0f);
D3DXVec3Add(&kD3DVt3Dst, &kD3DVt3AdvDir, &kD3DVt3Cur);
TPixelPosition kPPosDst;
kPPosDst.x = +kD3DVt3Dst.x;
kPPosDst.y = -kD3DVt3Dst.y;
kPPosDst.z = +kD3DVt3Dst.z;
NEW_SetSrcPixelPosition(kPPosCur);
NEW_SetDstPixelPosition(kPPosDst);
}
void CInstanceBase::EndGoing()
{
if (!IsWaiting())
EndWalking();
//Tracen("EndGoing");
m_isGoing = FALSE;
}
void CInstanceBase::SetRunMode()
{
m_GraphicThingInstance.SetRunMode();
}
void CInstanceBase::SetWalkMode()
{
m_GraphicThingInstance.SetWalkMode();
}
@@ -0,0 +1,582 @@
#include "StdAfx.h"
#include "NetworkActorManager.h"
#include "PythonCharacterManager.h"
#include "PythonItem.h"
#include "AbstractPlayer.h"
void SNetworkActorData::UpdatePosition()
{
DWORD dwClientCurTime=ELTimer_GetMSec();
DWORD dwElapsedTime=dwClientCurTime-m_dwClientSrcTime;
if (dwElapsedTime<m_dwDuration)
{
float fRate=float(dwElapsedTime)/float(m_dwDuration);
m_lCurX=LONG((m_lDstX-m_lSrcX)*fRate+m_lSrcX);
m_lCurY=LONG((m_lDstY-m_lSrcY)*fRate+m_lSrcY);
}
else
{
m_lCurX=m_lDstX;
m_lCurY=m_lDstY;
}
}
void SNetworkActorData::SetDstPosition(DWORD dwServerTime, LONG lDstX, LONG lDstY, DWORD dwDuration)
{
m_lSrcX=m_lCurX;
m_lSrcY=m_lCurY;
m_lDstX=lDstX;
m_lDstY=lDstY;
m_dwDuration=dwDuration;
m_dwServerSrcTime=dwServerTime;
m_dwClientSrcTime=ELTimer_GetMSec();
}
void SNetworkActorData::SetPosition(LONG lPosX, LONG lPosY)
{
m_lDstX=m_lSrcX=m_lCurX=lPosX;
m_lDstY=m_lSrcY=m_lCurY=lPosY;
}
// NETWORK_ACTOR_DATA_COPY
SNetworkActorData::SNetworkActorData(const SNetworkActorData& src)
{
__copy__(src);
}
void SNetworkActorData::operator=(const SNetworkActorData& src)
{
__copy__(src);
}
void SNetworkActorData::__copy__(const SNetworkActorData& src)
{
m_bType = src.m_bType;
m_dwVID = src.m_dwVID;
m_dwStateFlags = src.m_dwStateFlags;
m_dwEmpireID = src.m_dwEmpireID;
m_dwRace = src.m_dwRace;
m_dwMovSpd = src.m_dwMovSpd;
m_dwAtkSpd = src.m_dwAtkSpd;
m_fRot = src.m_fRot;
m_lCurX = src.m_lCurX;
m_lCurY = src.m_lCurY;
m_lSrcX = src.m_lSrcX;
m_lSrcY = src.m_lSrcY;
m_lDstX = src.m_lDstX;
m_lDstY = src.m_lDstY;
m_kAffectFlags.CopyInstance(src.m_kAffectFlags);
m_dwServerSrcTime = src.m_dwServerSrcTime;
m_dwClientSrcTime = src.m_dwClientSrcTime;
m_dwDuration = src.m_dwDuration;
m_dwArmor = src.m_dwArmor;
m_dwWeapon = src.m_dwWeapon;
m_dwHair = src.m_dwHair;
m_dwOwnerVID = src.m_dwOwnerVID;
m_sAlignment = src.m_sAlignment;
m_byPKMode = src.m_byPKMode;
m_dwMountVnum = src.m_dwMountVnum;
m_dwGuildID = src.m_dwGuildID;
m_dwLevel = src.m_dwLevel;
m_stName = src.m_stName;
}
// END_OF_NETWORK_ACTOR_DATA_COPY
SNetworkActorData::SNetworkActorData()
{
SetPosition(0, 0);
m_bType=0;
m_dwVID=0;
m_dwStateFlags=0;
m_dwRace=0;
m_dwMovSpd=0;
m_dwAtkSpd=0;
m_fRot=0.0f;
m_dwArmor=0;
m_dwWeapon=0;
m_dwHair=0;
m_dwEmpireID=0;
m_dwOwnerVID=0;
m_dwDuration=0;
m_dwClientSrcTime=0;
m_dwServerSrcTime=0;
m_sAlignment=0;
m_byPKMode=0;
m_dwMountVnum=0;
m_stName="";
m_kAffectFlags.Clear();
}
////////////////////////////////////////////////////////////////////////////////
CNetworkActorManager::CNetworkActorManager()
{
m_dwMainVID=0;
}
CNetworkActorManager::~CNetworkActorManager()
{
}
void CNetworkActorManager::Destroy()
{
m_kNetActorDict.clear();
m_dwMainVID=0;
m_lMainPosX=0;
m_lMainPosY=0;
}
void CNetworkActorManager::SetMainActorVID(DWORD dwVID)
{
m_dwMainVID=dwVID;
m_lMainPosX=0;
m_lMainPosY=0;
m_kNetActorDict.clear();
}
void CNetworkActorManager::Update()
{
__OLD_Update();
}
void CNetworkActorManager::__OLD_Update()
{
__UpdateMainActor();
CPythonCharacterManager& rkChrMgr=__GetCharacterManager();
std::map<DWORD, SNetworkActorData>::iterator i;
for (i=m_kNetActorDict.begin(); i!=m_kNetActorDict.end(); ++i)
{
SNetworkActorData& rkNetActorData=i->second;
rkNetActorData.UpdatePosition();
CInstanceBase * pkInstFind = rkChrMgr.GetInstancePtr(rkNetActorData.m_dwVID);
if (!pkInstFind)
{
if (__IsVisibleActor(rkNetActorData))
__AppendCharacterManagerActor(rkNetActorData);
}
}
}
CInstanceBase* CNetworkActorManager::__FindActor(SNetworkActorData& rkNetActorData, LONG lDstX, LONG lDstY)
{
CPythonCharacterManager& rkChrMgr=__GetCharacterManager();
CInstanceBase * pkInstFind = rkChrMgr.GetInstancePtr(rkNetActorData.m_dwVID);
if (!pkInstFind)
{
if (__IsVisiblePos(lDstX, lDstY))
return __AppendCharacterManagerActor(rkNetActorData);
return NULL;
}
return pkInstFind;
}
CInstanceBase* CNetworkActorManager::__FindActor(SNetworkActorData& rkNetActorData)
{
CPythonCharacterManager& rkChrMgr=__GetCharacterManager();
CInstanceBase * pkInstFind = rkChrMgr.GetInstancePtr(rkNetActorData.m_dwVID);
if (!pkInstFind)
{
if (__IsVisibleActor(rkNetActorData))
return __AppendCharacterManagerActor(rkNetActorData);
return NULL;
}
return pkInstFind;
}
void CNetworkActorManager::__RemoveAllGroundItems()
{
CPythonItem& rkItemMgr=CPythonItem::Instance();
rkItemMgr.DeleteAllItems();
}
void CNetworkActorManager::__RemoveAllActors()
{
m_kNetActorDict.clear();
CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance();
rkChrMgr.DeleteAllInstances();
}
void CNetworkActorManager::__RemoveDynamicActors()
{
//copy it
std::vector<DWORD> dwCharacterVIDList;
CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
for(CPythonCharacterManager::CharacterIterator i = rkChrMgr.CharacterInstanceBegin(); i!=rkChrMgr.CharacterInstanceEnd(); ++i)
{
dwCharacterVIDList.push_back( (*i)->GetVirtualID() );
}
for( int i = 0; i < dwCharacterVIDList.size(); ++i )
{
CInstanceBase* pkInstEach = rkChrMgr.GetInstancePtr( dwCharacterVIDList[i] );
if( !pkInstEach )
continue;
CActorInstance* rkActorEach=pkInstEach->GetGraphicThingInstancePtr();
if( rkActorEach->IsPC() || rkActorEach->IsNPC() || rkActorEach->IsEnemy() )
{
rkChrMgr.DeleteInstance(dwCharacterVIDList[i]);
std::map<DWORD, SNetworkActorData>::iterator it =m_kNetActorDict.find(dwCharacterVIDList[i]);
if (it != m_kNetActorDict.end())
{
m_kNetActorDict.erase(it);
}
}
}
rkChrMgr.DestroyDeadInstanceList();
}
void CNetworkActorManager::__UpdateMainActor()
{
CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance();
CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
if (!pkInstMain)
return;
TPixelPosition kPPosMain;
pkInstMain->NEW_GetPixelPosition(&kPPosMain);
m_lMainPosX=LONG(kPPosMain.x);
m_lMainPosY=LONG(kPPosMain.y);
}
extern bool IsWall(unsigned race);
bool CNetworkActorManager::__IsVisibleActor(const SNetworkActorData& c_rkNetActorData)
{
if (__IsMainActorVID(c_rkNetActorData.m_dwVID))
return true;
// 2004.08.02.myevan.항상 보이기 플래그
if (c_rkNetActorData.m_kAffectFlags.IsSet(CInstanceBase::AFFECT_SHOW_ALWAYS))
return true;
if (__IsVisiblePos(c_rkNetActorData.m_lCurX, c_rkNetActorData.m_lCurY))
return true;
if (IsWall(c_rkNetActorData.m_dwRace))
return true;
return false;
}
bool CNetworkActorManager::__IsVisiblePos(LONG lPosX, LONG lPosY)
{
LONG dx = lPosX-m_lMainPosX;
LONG dy = lPosY-m_lMainPosY;
LONG len = (LONG)sqrt(double(dx * dx + dy * dy));
extern int CHAR_STAGE_VIEW_BOUND;
if (len < CHAR_STAGE_VIEW_BOUND) // 거리제한 cm
return true;
return false;
}
bool CNetworkActorManager::__IsMainActorVID(DWORD dwVID)
{
if (dwVID == m_dwMainVID)
return true;
return false;
}
CPythonCharacterManager& CNetworkActorManager::__GetCharacterManager()
{
return CPythonCharacterManager::Instance();
}
void CNetworkActorManager::__RemoveCharacterManagerActor(SNetworkActorData& rkNetActorData)
{
CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance();
if (__IsMainActorVID(rkNetActorData.m_dwVID))
{
rkChrMgr.DeleteInstance(rkNetActorData.m_dwVID);
}
else
{
rkChrMgr.DeleteInstanceByFade(rkNetActorData.m_dwVID);
}
}
CInstanceBase* CNetworkActorManager::__AppendCharacterManagerActor(SNetworkActorData& rkNetActorData)
{
Lognf(0, "CNetworkActorManager::__AppendCharacterManagerActor(%d, %s)", rkNetActorData.m_dwVID, rkNetActorData.m_stName.c_str());
DWORD dwVID=rkNetActorData.m_dwVID;
CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance();
CInstanceBase::SCreateData kCreateData;
kCreateData.m_bType=rkNetActorData.m_bType;
kCreateData.m_dwLevel=rkNetActorData.m_dwLevel;
kCreateData.m_dwGuildID=rkNetActorData.m_dwGuildID;
kCreateData.m_dwEmpireID=rkNetActorData.m_dwEmpireID;
kCreateData.m_dwVID=rkNetActorData.m_dwVID;
kCreateData.m_dwMountVnum=rkNetActorData.m_dwMountVnum;
kCreateData.m_dwRace=rkNetActorData.m_dwRace;
kCreateData.m_fRot=rkNetActorData.m_fRot;
kCreateData.m_lPosX=rkNetActorData.m_lCurX;
kCreateData.m_lPosY=rkNetActorData.m_lCurY;
kCreateData.m_stName=rkNetActorData.m_stName;
kCreateData.m_dwStateFlags=rkNetActorData.m_dwStateFlags;
kCreateData.m_dwMovSpd=rkNetActorData.m_dwMovSpd;
kCreateData.m_dwAtkSpd=rkNetActorData.m_dwAtkSpd;
kCreateData.m_sAlignment=rkNetActorData.m_sAlignment;
kCreateData.m_byPKMode=rkNetActorData.m_byPKMode;
kCreateData.m_kAffectFlags=rkNetActorData.m_kAffectFlags;
kCreateData.m_dwArmor=rkNetActorData.m_dwArmor;
kCreateData.m_dwWeapon=rkNetActorData.m_dwWeapon;
kCreateData.m_dwHair=rkNetActorData.m_dwHair;
kCreateData.m_isMain=__IsMainActorVID(dwVID);
CInstanceBase* pOldInstance = rkChrMgr.GetInstancePtr(dwVID);
if (pOldInstance)
{
TPixelPosition oldPos;
pOldInstance->GetGraphicThingInstancePtr()->GetPixelPosition( &oldPos );
bool bIsMountingHorse = pOldInstance->IsMountingHorse();
if( (bIsMountingHorse && kCreateData.m_dwMountVnum == 0) ||
(!bIsMountingHorse && kCreateData.m_dwMountVnum != 0) )
{
//Override Pos
kCreateData.m_lPosX = oldPos.x;
kCreateData.m_lPosY = -oldPos.y;
}
rkChrMgr.DeleteInstance(dwVID);
}
CInstanceBase* pNewInstance = rkChrMgr.CreateInstance(kCreateData);
if (!pNewInstance)
return NULL;
if (kCreateData.m_isMain)
{
IAbstractPlayer & rkPlayer = IAbstractPlayer::GetSingleton();
rkPlayer.SetMainCharacterIndex(dwVID);
m_lMainPosX=rkNetActorData.m_lCurX;
m_lMainPosY=rkNetActorData.m_lCurY;
}
DWORD dwClientCurTime=ELTimer_GetMSec();
DWORD dwElapsedTime=dwClientCurTime-rkNetActorData.m_dwClientSrcTime;
if (dwElapsedTime<rkNetActorData.m_dwDuration)
{
TPixelPosition kPPosDst;
kPPosDst.x=float(rkNetActorData.m_lDstX);
kPPosDst.y=float(rkNetActorData.m_lDstY);
kPPosDst.z=0;
pNewInstance->PushTCPState(rkNetActorData.m_dwServerSrcTime+dwElapsedTime, kPPosDst, rkNetActorData.m_fRot, CInstanceBase::FUNC_MOVE, 0);
}
return pNewInstance;
}
void CNetworkActorManager::AppendActor(const SNetworkActorData& c_rkNetActorData)
{
if (__IsMainActorVID(c_rkNetActorData.m_dwVID))
{
bool bChangeMountStatus = false;
CInstanceBase* pMainInstance = CPythonCharacterManager::Instance().GetInstancePtr(c_rkNetActorData.m_dwVID);
if( pMainInstance )
{
bool bIsMountingHorse = pMainInstance->IsMountingHorse();
bChangeMountStatus = (bIsMountingHorse && c_rkNetActorData.m_dwMountVnum == 0) || (!bIsMountingHorse && c_rkNetActorData.m_dwMountVnum != 0);
}
if( !bChangeMountStatus )
{
//__RemoveAllActors();
__RemoveDynamicActors();
__RemoveAllGroundItems();
}
}
SNetworkActorData& rkNetActorData=m_kNetActorDict[c_rkNetActorData.m_dwVID];
rkNetActorData=c_rkNetActorData;
if (__IsVisibleActor(rkNetActorData))
{
if (!__AppendCharacterManagerActor(rkNetActorData))
m_kNetActorDict.erase(c_rkNetActorData.m_dwVID);
}
}
void CNetworkActorManager::RemoveActor(DWORD dwVID)
{
std::map<DWORD, SNetworkActorData>::iterator f=m_kNetActorDict.find(dwVID);
if (m_kNetActorDict.end()==f)
{
#ifdef _DEBUG
TraceError("CNetworkActorManager::RemoveActor(dwVID=%d) - NOT EXIST VID", dwVID);
#endif
return;
}
SNetworkActorData& rkNetActorData=f->second;
__RemoveCharacterManagerActor(rkNetActorData);
m_kNetActorDict.erase(f);
}
void CNetworkActorManager::UpdateActor(const SNetworkUpdateActorData& c_rkNetUpdateActorData)
{
std::map<DWORD, SNetworkActorData>::iterator f=m_kNetActorDict.find(c_rkNetUpdateActorData.m_dwVID);
if (m_kNetActorDict.end()==f)
{
#ifdef _DEBUG
TraceError("CNetworkActorManager::UpdateActor(dwVID=%d) - NOT EXIST VID", c_rkNetUpdateActorData.m_dwVID);
#endif
return;
}
SNetworkActorData& rkNetActorData=f->second;
CInstanceBase* pkInstFind=__FindActor(rkNetActorData);
if (pkInstFind)
{
pkInstFind->ChangeArmor(c_rkNetUpdateActorData.m_dwArmor);
pkInstFind->ChangeWeapon(c_rkNetUpdateActorData.m_dwWeapon);
pkInstFind->ChangeHair(c_rkNetUpdateActorData.m_dwHair);
pkInstFind->ChangeGuild(c_rkNetUpdateActorData.m_dwGuildID);
pkInstFind->SetAffectFlagContainer(c_rkNetUpdateActorData.m_kAffectFlags);
pkInstFind->SetMoveSpeed(c_rkNetUpdateActorData.m_dwMovSpd);
pkInstFind->SetAttackSpeed(c_rkNetUpdateActorData.m_dwAtkSpd);
pkInstFind->SetAlignment(c_rkNetUpdateActorData.m_sAlignment);
pkInstFind->SetPKMode(c_rkNetUpdateActorData.m_byPKMode);
pkInstFind->SetStateFlags(c_rkNetUpdateActorData.m_dwStateFlags);
//if( c_rkNetUpdateActorData.m_dwMountVnum != 0 )
//{
// pkInstFind->MountHorse(c_rkNetUpdateActorData.m_dwMountVnum);
//}
//else
//{
// if( pkInstFind->IsMountingHorse() )
// {
// pkInstFind->DismountHorse();
// }
//}
}
rkNetActorData.m_kAffectFlags=c_rkNetUpdateActorData.m_kAffectFlags;
rkNetActorData.m_dwGuildID=c_rkNetUpdateActorData.m_dwGuildID;
//rkNetActorData.m_dwLevel=c_rkNetUpdateActorData.m_dwLevel;
rkNetActorData.m_dwMovSpd=c_rkNetUpdateActorData.m_dwMovSpd;
rkNetActorData.m_dwAtkSpd=c_rkNetUpdateActorData.m_dwAtkSpd;
rkNetActorData.m_dwArmor=c_rkNetUpdateActorData.m_dwArmor;
rkNetActorData.m_dwWeapon=c_rkNetUpdateActorData.m_dwWeapon;
rkNetActorData.m_dwHair=c_rkNetUpdateActorData.m_dwHair;
rkNetActorData.m_sAlignment=c_rkNetUpdateActorData.m_sAlignment;
rkNetActorData.m_byPKMode=c_rkNetUpdateActorData.m_byPKMode;
}
void CNetworkActorManager::MoveActor(const SNetworkMoveActorData& c_rkNetMoveActorData)
{
std::map<DWORD, SNetworkActorData>::iterator f=m_kNetActorDict.find(c_rkNetMoveActorData.m_dwVID);
if (m_kNetActorDict.end()==f)
{
#ifdef _DEBUG
TraceError("CNetworkActorManager::MoveActor(dwVID=%d) - NOT EXIST VID", c_rkNetMoveActorData.m_dwVID);
#endif
return;
}
SNetworkActorData& rkNetActorData=f->second;
CInstanceBase* pkInstFind=__FindActor(rkNetActorData, c_rkNetMoveActorData.m_lPosX, c_rkNetMoveActorData.m_lPosY);
if (pkInstFind)
{
TPixelPosition kPPosDst;
kPPosDst.x=float(c_rkNetMoveActorData.m_lPosX);
kPPosDst.y=float(c_rkNetMoveActorData.m_lPosY);
kPPosDst.z=0.0f;
pkInstFind->PushTCPState(c_rkNetMoveActorData.m_dwTime, kPPosDst,
c_rkNetMoveActorData.m_fRot, c_rkNetMoveActorData.m_dwFunc, c_rkNetMoveActorData.m_dwArg);
}
rkNetActorData.SetDstPosition(c_rkNetMoveActorData.m_dwTime,
c_rkNetMoveActorData.m_lPosX, c_rkNetMoveActorData.m_lPosY, c_rkNetMoveActorData.m_dwDuration);
rkNetActorData.m_fRot=c_rkNetMoveActorData.m_fRot;
}
void CNetworkActorManager::SyncActor(DWORD dwVID, LONG lPosX, LONG lPosY)
{
std::map<DWORD, SNetworkActorData>::iterator f=m_kNetActorDict.find(dwVID);
if (m_kNetActorDict.end()==f)
{
#ifdef _DEBUG
TraceError("CNetworkActorManager::SyncActor(dwVID=%d) - NOT EXIST VID", dwVID);
#endif
return;
}
SNetworkActorData& rkNetActorData=f->second;
CInstanceBase* pkInstFind=__FindActor(rkNetActorData);
if (pkInstFind)
{
pkInstFind->NEW_SyncPixelPosition(lPosX, lPosY);
}
rkNetActorData.SetPosition(lPosX, lPosY);
}
void CNetworkActorManager::SetActorOwner(DWORD dwOwnerVID, DWORD dwVictimVID)
{
std::map<DWORD, SNetworkActorData>::iterator f=m_kNetActorDict.find(dwVictimVID);
if (m_kNetActorDict.end()==f)
{
#ifdef _DEBUG
TraceError("CNetworkActorManager::SetActorOwner(dwOwnerVID=%d, dwVictimVID=%d) - NOT EXIST VID", dwOwnerVID, dwVictimVID);
#endif
return;
}
SNetworkActorData& rkNetActorData=f->second;
rkNetActorData.m_dwOwnerVID=dwOwnerVID;
CInstanceBase* pkInstFind=__FindActor(rkNetActorData);
if (pkInstFind)
{
pkInstFind->NEW_SetOwner(rkNetActorData.m_dwOwnerVID);
}
}
+2 -1
View File
@@ -2319,8 +2319,9 @@ typedef struct SPacketGCShopSign
typedef struct SPacketGCTime
{
BYTE bHeader;
time_t time;
LONG time; // PORT: _USE_32BIT_TIME_T in 40250 Win32; wire time is 32 bits on LP64.
} TPacketGCTime;
static_assert(sizeof(TPacketGCTime) == 5);
enum
{
@@ -0,0 +1,965 @@
#include "StdAfx.h"
#include "PythonCharacterManager.h"
#include "PythonBackground.h"
#include "PythonNonPlayer.h"
#include "AbstractPlayer.h"
#include "Packet.h"
#include "../EterLib/Camera.h"
///////////////////////////////////////////////////////////////////////////////////////////////////
// Frame Process
int CHAR_STAGE_VIEW_BOUND = 200*100;
struct FCharacterManagerCharacterInstanceUpdate
{
inline void operator () (const std::pair<DWORD,CInstanceBase *>& cr_Pair)
{
cr_Pair.second->Update();
}
};
void CPythonCharacterManager::AdjustCollisionWithOtherObjects(CActorInstance* pInst )
{
if( !pInst->IsPC() )
return;
CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
for(CPythonCharacterManager::CharacterIterator i = rkChrMgr.CharacterInstanceBegin(); i!=rkChrMgr.CharacterInstanceEnd();++i)
{
CInstanceBase* pkInstEach=*i;
CActorInstance* rkActorEach=pkInstEach->GetGraphicThingInstancePtr();
if (rkActorEach==pInst)
continue;
if( rkActorEach->IsPC() || rkActorEach->IsNPC() || rkActorEach->IsEnemy() )
continue;
if(pInst->TestPhysicsBlendingCollision(*rkActorEach) )
{
// NOTE : 일단 기존위치로 원복
// TODO : 향후 조금더 잘 처리한다면 physic movement거리를 steping해서 iteration처리해야 함.
TPixelPosition curPos;
pInst->GetPixelPosition(&curPos);
pInst->SetBlendingPosition(curPos);
//Tracef("!!!!!! Collision Adjusted\n");
break;
}
}
}
void CPythonCharacterManager::EnableSortRendering(bool isEnable)
{
}
void CPythonCharacterManager::InsertPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
CInstanceBase::InsertPVPKey(dwVIDSrc, dwVIDDst);
CInstanceBase* pkInstSrc=GetInstancePtr(dwVIDSrc);
if (pkInstSrc)
pkInstSrc->RefreshTextTail();
CInstanceBase* pkInstDst=GetInstancePtr(dwVIDDst);
if (pkInstDst)
pkInstDst->RefreshTextTail();
}
void CPythonCharacterManager::RemovePVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
CInstanceBase::RemovePVPKey(dwVIDSrc, dwVIDDst);
CInstanceBase* pkInstSrc=GetInstancePtr(dwVIDSrc);
if (pkInstSrc)
pkInstSrc->RefreshTextTail();
CInstanceBase* pkInstDst=GetInstancePtr(dwVIDDst);
if (pkInstDst)
pkInstDst->RefreshTextTail();
}
void CPythonCharacterManager::ChangeGVG(DWORD dwSrcGuildID, DWORD dwDstGuildID)
{
TCharacterInstanceMap::iterator itor;
for (itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); itor++)
{
CInstanceBase * pInstance = itor->second;
DWORD dwInstanceGuildID = pInstance->GetGuildID();
if (dwSrcGuildID == dwInstanceGuildID || dwDstGuildID == dwInstanceGuildID)
{
pInstance->RefreshTextTail();
}
}
}
void CPythonCharacterManager::ClearMainInstance()
{
m_pkInstMain=NULL;
}
bool CPythonCharacterManager::SetMainInstance(DWORD dwVID)
{
m_pkInstMain=GetInstancePtr(dwVID);
if (!m_pkInstMain)
return false;
return true;
}
CInstanceBase* CPythonCharacterManager::GetMainInstancePtr()
{
return m_pkInstMain;
}
void CPythonCharacterManager::GetInfo(std::string* pstInfo)
{
pstInfo->append("Actor: ");
CInstanceBase::GetInfo(pstInfo);
char szInfo[256];
sprintf(szInfo, "Container - Live %d, Dead %d", m_kAliveInstMap.size(), m_kDeadInstList.size());
pstInfo->append(szInfo);
}
bool CPythonCharacterManager::IsCacheMode()
{
static bool s_isOldCacheMode=false;
bool isCacheMode=s_isOldCacheMode;
if (s_isOldCacheMode)
{
if (m_kAliveInstMap.size()<30)
isCacheMode=false;
}
else
{
if (m_kAliveInstMap.size()>40)
isCacheMode=true;
}
s_isOldCacheMode=isCacheMode;
return isCacheMode;
}
void CPythonCharacterManager::Update()
{
#ifdef __PERFORMANCE_CHECKER__
DWORD t1=timeGetTime();
#endif
CInstanceBase::ResetPerformanceCounter();
CInstanceBase* pkInstMain=GetMainInstancePtr();
#ifdef __PERFORMANCE_CHECKER__
DWORD t2=timeGetTime();
#endif
DWORD dwDeadInstCount=0;
DWORD dwForceVisibleInstCount=0;
TCharacterInstanceMap::iterator i=m_kAliveInstMap.begin();
while (m_kAliveInstMap.end()!=i)
{
TCharacterInstanceMap::iterator c=i++;
CInstanceBase* pkInstEach=c->second;
pkInstEach->Update();
if (pkInstMain)
{
if (pkInstEach->IsForceVisible())
{
dwForceVisibleInstCount++;
continue;
}
int nDistance = int(pkInstEach->NEW_GetDistanceFromDestInstance(*pkInstMain));
if (nDistance > CHAR_STAGE_VIEW_BOUND + 10)
{
__DeleteBlendOutInstance(pkInstEach);
m_kAliveInstMap.erase(c);
dwDeadInstCount++;
}
}
}
#ifdef __PERFORMANCE_CHECKER__
DWORD t3=timeGetTime();
#endif
UpdateTransform();
#ifdef __PERFORMANCE_CHECKER__
DWORD t4=timeGetTime();
#endif
UpdateDeleting();
#ifdef __PERFORMANCE_CHECKER__
DWORD t5=timeGetTime();
#endif
__NEW_Pick();
#ifdef __PERFORMANCE_CHECKER__
DWORD t6=timeGetTime();
#endif
#ifdef __PERFORMANCE_CHECKER__
{
static FILE* fp=fopen("perf_chrmgr_update.txt", "w");
if (t6-t1>1)
{
fprintf(fp, "CU.Total %d (Time %d, Alive %d, Dead %d)\n",
t6-t1, ELTimer_GetMSec(),
m_kAliveInstMap.size(),
m_kDeadInstList.size());
fprintf(fp, "CU.Counter %d\n", t2-t1);
fprintf(fp, "CU.ForEach %d\n", t3-t2);
fprintf(fp, "CU.Trans %d\n", t4-t3);
fprintf(fp, "CU.Del %d\n", t5-t4);
fprintf(fp, "CU.Pick %d\n", t6-t5);
fprintf(fp, "CU.AI %d\n", m_kAliveInstMap.size());
fprintf(fp, "CU.DI %d\n", dwDeadInstCount);
fprintf(fp, "CU.FVI %d\n", dwForceVisibleInstCount);
fprintf(fp, "-------------------------------- \n");
fflush(fp);
}
}
#endif
}
void CPythonCharacterManager::ShowPointEffect(DWORD ePoint, DWORD dwVID)
{
CInstanceBase * pkInstSel = (dwVID == 0xffffffff) ? GetMainInstancePtr() : GetInstancePtr(dwVID);
if (!pkInstSel)
return;
switch (ePoint)
{
case POINT_LEVEL:
pkInstSel->LevelUp();
break;
case POINT_LEVEL_STEP:
pkInstSel->SkillUp();
break;
}
}
bool CPythonCharacterManager::RegisterPointEffect(DWORD ePoint, const char* c_szFileName)
{
if (ePoint>=POINT_MAX_NUM)
return false;
CEffectManager& rkEftMgr=CEffectManager::Instance();
rkEftMgr.RegisterEffect2(c_szFileName, &m_adwPointEffect[ePoint]);
return true;
}
void CPythonCharacterManager::UpdateTransform()
{
#ifdef __PERFORMANCE_CHECKER__
DWORD t1=timeGetTime();
DWORD t2=timeGetTime();
#endif
CInstanceBase * pMainInstance = GetMainInstancePtr();
if (pMainInstance)
{
CPythonBackground& rkBG=CPythonBackground::Instance();
for (TCharacterInstanceMap::iterator i = m_kAliveInstMap.begin(); i != m_kAliveInstMap.end(); ++i)
{
CInstanceBase * pSrcInstance = i->second;
pSrcInstance->CheckAdvancing();
// 2004.08.02.myevan.IsAttacked 일 경우 죽었을때도 체크하므로,
// 실질적으로 거리가 변경되는 IsPushing일때만 체크하도록 한다
if (pSrcInstance->IsPushing())
rkBG.CheckAdvancing(pSrcInstance);
}
#ifdef __PERFORMANCE_CHECKER__
t2=timeGetTime();
#endif
#ifdef __MOVIE_MODE__
if (!m_pkInstMain->IsMovieMode())
{
rkBG.CheckAdvancing(m_pkInstMain);
}
#else
rkBG.CheckAdvancing(m_pkInstMain);
#endif
}
#ifdef __PERFORMANCE_CHECKER__
DWORD t3=timeGetTime();
#endif
{
for (TCharacterInstanceMap::iterator itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); ++itor)
{
CInstanceBase * pInstance = itor->second;
pInstance->Transform();
}
}
#ifdef __PERFORMANCE_CHECKER__
DWORD t4=timeGetTime();
#endif
#ifdef __PERFORMANCE_CHECKER__
{
static FILE* fp=fopen("perf_chrmgr_updatetransform.txt", "w");
if (t4-t1>5)
{
fprintf(fp, "CUT.Total %d (Time %f, Alive %d, Dead %d)\n",
t4-t1, ELTimer_GetMSec()/1000.0f,
m_kAliveInstMap.size(),
m_kDeadInstList.size());
fprintf(fp, "CUT.ChkAdvInst %d\n", t2-t1);
fprintf(fp, "CUT.ChkAdvBG %d\n", t3-t2);
fprintf(fp, "CUT.Trans %d\n", t4-t3);
fprintf(fp, "-------------------------------- \n");
fflush(fp);
}
fflush(fp);
}
#endif
}
void CPythonCharacterManager::UpdateDeleting()
{
TCharacterInstanceList::iterator itor = m_kDeadInstList.begin();
for (; itor != m_kDeadInstList.end();)
{
CInstanceBase * pInstance = *itor;
if (pInstance->UpdateDeleting())
{
++itor;
}
else
{
CInstanceBase::Delete(pInstance);
itor = m_kDeadInstList.erase(itor);
}
}
}
struct FCharacterManagerCharacterInstanceDeform
{
inline void operator () (const std::pair<DWORD,CInstanceBase *>& cr_Pair)
{
cr_Pair.second->Deform();
//pInstance->Update();
}
};
struct FCharacterManagerCharacterInstanceListDeform
{
inline void operator () (CInstanceBase * pInstance)
{
pInstance->Deform();
}
};
void CPythonCharacterManager::Deform()
{
std::for_each(m_kAliveInstMap.begin(), m_kAliveInstMap.end(), FCharacterManagerCharacterInstanceDeform());
std::for_each(m_kDeadInstList.begin(), m_kDeadInstList.end(), FCharacterManagerCharacterInstanceListDeform());
}
bool CPythonCharacterManager::OLD_GetPickedInstanceVID(DWORD* pdwPickedActorID)
{
if (!m_pkInstPick)
return false;
*pdwPickedActorID=m_pkInstPick->GetVirtualID();
return true;
}
CInstanceBase * CPythonCharacterManager::OLD_GetPickedInstancePtr()
{
return m_pkInstPick;
}
D3DXVECTOR2 & CPythonCharacterManager::OLD_GetPickedInstPosReference()
{
return m_v2PickedInstProjPos;
}
bool CPythonCharacterManager::IsRegisteredVID(DWORD dwVID)
{
if (m_kAliveInstMap.end()==m_kAliveInstMap.find(dwVID))
return false;
return true;
}
bool CPythonCharacterManager::IsAliveVID(DWORD dwVID)
{
return m_kAliveInstMap.find(dwVID)!=m_kAliveInstMap.end();
}
bool CPythonCharacterManager::IsDeadVID(DWORD dwVID)
{
for (TCharacterInstanceList::iterator f=m_kDeadInstList.begin(); f!=m_kDeadInstList.end(); ++f)
{
if ((*f)->GetVirtualID()==dwVID)
return true;
}
return false;
}
struct LessCharacterInstancePtrRenderOrder
{
bool operator() (CInstanceBase* pkLeft, CInstanceBase* pkRight)
{
return pkLeft->LessRenderOrder(pkRight);
}
};
struct FCharacterManagerCharacterInstanceRender
{
inline void operator () (const std::pair<DWORD,CInstanceBase *>& cr_Pair)
{
cr_Pair.second->Render();
cr_Pair.second->RenderTrace();
}
};
struct FCharacterInstanceRender
{
inline void operator () (CInstanceBase * pInstance)
{
pInstance->Render();
}
};
struct FCharacterInstanceRenderTrace
{
inline void operator () (CInstanceBase * pInstance)
{
pInstance->RenderTrace();
}
};
void CPythonCharacterManager::__RenderSortedAliveActorList()
{
static std::vector<CInstanceBase*> s_kVct_pkInstAliveSort;
s_kVct_pkInstAliveSort.clear();
TCharacterInstanceMap& rkMap_pkInstAlive=m_kAliveInstMap;
TCharacterInstanceMap::iterator i;
for (i=rkMap_pkInstAlive.begin(); i!=rkMap_pkInstAlive.end(); ++i)
s_kVct_pkInstAliveSort.push_back(i->second);
std::sort(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), LessCharacterInstancePtrRenderOrder());
std::for_each(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), FCharacterInstanceRender());
std::for_each(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), FCharacterInstanceRenderTrace());
}
void CPythonCharacterManager::__RenderSortedDeadActorList()
{
static std::vector<CInstanceBase*> s_kVct_pkInstDeadSort;
s_kVct_pkInstDeadSort.clear();
TCharacterInstanceList& rkLst_pkInstDead=m_kDeadInstList;
TCharacterInstanceList::iterator i;
for (i=rkLst_pkInstDead.begin(); i!=rkLst_pkInstDead.end(); ++i)
s_kVct_pkInstDeadSort.push_back(*i);
std::sort(s_kVct_pkInstDeadSort.begin(), s_kVct_pkInstDeadSort.end(), LessCharacterInstancePtrRenderOrder());
std::for_each(s_kVct_pkInstDeadSort.begin(), s_kVct_pkInstDeadSort.end(), FCharacterInstanceRender());
}
void CPythonCharacterManager::Render()
{
STATEMANAGER.SetTexture(0, NULL);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
STATEMANAGER.SetTexture(1, NULL);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
__RenderSortedAliveActorList();
__RenderSortedDeadActorList();
CInstanceBase * pkPickedInst = OLD_GetPickedInstancePtr();
if (pkPickedInst)
{
const D3DXVECTOR3 & c_rv3Position = pkPickedInst->GetGraphicThingInstanceRef().GetPosition();
CPythonGraphic::Instance().ProjectPosition(c_rv3Position.x, c_rv3Position.y, c_rv3Position.z, &m_v2PickedInstProjPos.x, &m_v2PickedInstProjPos.y);
}
}
void CPythonCharacterManager::RenderShadowMainInstance()
{
CInstanceBase* pkInstMain=GetMainInstancePtr();
if (pkInstMain)
pkInstMain->RenderToShadowMap();
}
struct FCharacterManagerCharacterInstanceRenderToShadowMap
{
inline void operator () (const std::pair<DWORD,CInstanceBase *>& cr_Pair)
{
cr_Pair.second->RenderToShadowMap();
}
};
void CPythonCharacterManager::RenderShadowAllInstances()
{
std::for_each(m_kAliveInstMap.begin(), m_kAliveInstMap.end(), FCharacterManagerCharacterInstanceRenderToShadowMap());
}
struct FCharacterManagerCharacterInstanceRenderCollision
{
inline void operator () (const std::pair<DWORD,CInstanceBase *>& cr_Pair)
{
cr_Pair.second->RenderCollision();
}
};
void CPythonCharacterManager::RenderCollision()
{
std::for_each(m_kAliveInstMap.begin(), m_kAliveInstMap.end(), FCharacterManagerCharacterInstanceRenderCollision());
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// Managing Process
CInstanceBase * CPythonCharacterManager::CreateInstance(const CInstanceBase::SCreateData& c_rkCreateData)
{
CInstanceBase * pCharacterInstance = RegisterInstance(c_rkCreateData.m_dwVID);
if (!pCharacterInstance)
{
TraceError("CPythonCharacterManager::CreateInstance: VID[%d] - ALREADY EXIST\n", c_rkCreateData.m_dwVID); // PORT: MSVC accepted a struct through varargs; pass the intended VID.
return NULL;
}
if (!pCharacterInstance->Create(c_rkCreateData))
{
TraceError("CPythonCharacterManager::CreateInstance VID[%d] Race[%d]", c_rkCreateData.m_dwVID, c_rkCreateData.m_dwRace);
DeleteInstance(c_rkCreateData.m_dwVID);
return NULL;
}
if (c_rkCreateData.m_isMain)
SelectInstance(c_rkCreateData.m_dwVID);
return (pCharacterInstance);
}
CInstanceBase * CPythonCharacterManager::RegisterInstance(DWORD VirtualID)
{
TCharacterInstanceMap::iterator itor = m_kAliveInstMap.find(VirtualID);
if (m_kAliveInstMap.end() != itor)
{
return NULL;
}
CInstanceBase * pCharacterInstance = CInstanceBase::New();
m_kAliveInstMap.insert(TCharacterInstanceMap::value_type(VirtualID, pCharacterInstance));
return (pCharacterInstance);
}
void CPythonCharacterManager::DeleteInstance(DWORD dwDelVID)
{
TCharacterInstanceMap::iterator itor = m_kAliveInstMap.find(dwDelVID);
if (m_kAliveInstMap.end() == itor)
{
Tracef("DeleteCharacterInstance: no vid by %d\n", dwDelVID);
return;
}
CInstanceBase * pkInstDel = itor->second;
if (pkInstDel == m_pkInstBind)
m_pkInstBind = NULL;
if (pkInstDel == m_pkInstMain)
m_pkInstMain = NULL;
if (pkInstDel == m_pkInstPick)
m_pkInstPick = NULL;
CInstanceBase::Delete(pkInstDel);
m_kAliveInstMap.erase(itor);
}
void CPythonCharacterManager::__DeleteBlendOutInstance(CInstanceBase* pkInstDel)
{
pkInstDel->DeleteBlendOut();
m_kDeadInstList.push_back(pkInstDel);
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.NotifyCharacterDead(pkInstDel->GetVirtualID());
}
void CPythonCharacterManager::DeleteInstanceByFade(DWORD dwVID)
{
TCharacterInstanceMap::iterator f = m_kAliveInstMap.find(dwVID);
if (m_kAliveInstMap.end() == f)
{
return;
}
__DeleteBlendOutInstance(f->second);
m_kAliveInstMap.erase(f);
}
void CPythonCharacterManager::SelectInstance(DWORD VirtualID)
{
TCharacterInstanceMap::iterator itor = m_kAliveInstMap.find(VirtualID);
if (m_kAliveInstMap.end() == itor)
{
Tracef("SelectCharacterInstance: no vid by %d\n", VirtualID);
return;
}
m_pkInstBind = itor->second;
}
CInstanceBase * CPythonCharacterManager::GetInstancePtr(DWORD VirtualID)
{
TCharacterInstanceMap::iterator itor = m_kAliveInstMap.find(VirtualID);
if (m_kAliveInstMap.end() == itor)
return NULL;
return itor->second;
}
CInstanceBase * CPythonCharacterManager::GetInstancePtrByName(const char *name)
{
TCharacterInstanceMap::iterator itor;
for (itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); itor++)
{
CInstanceBase * pInstance = itor->second;
if (!strcmp(pInstance->GetNameString(), name))
return pInstance;
}
return NULL;
}
CInstanceBase * CPythonCharacterManager::GetSelectedInstancePtr()
{
return m_pkInstBind;
}
CInstanceBase* CPythonCharacterManager::FindClickableInstancePtr()
{
return NULL;
}
void CPythonCharacterManager::__UpdateSortPickedActorList()
{
__UpdatePickedActorList();
__SortPickedActorList();
}
void CPythonCharacterManager::__UpdatePickedActorList()
{
m_kVct_pkInstPicked.clear();
TCharacterInstanceMap::iterator i;
for (i=m_kAliveInstMap.begin(); i!=m_kAliveInstMap.end(); ++i)
{
CInstanceBase* pkInstEach=i->second;
// 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경
if (pkInstEach->CanPickInstance())
{
if (pkInstEach->IsDead())
{
if (pkInstEach->IntersectBoundingBox())
m_kVct_pkInstPicked.push_back(pkInstEach);
}
else
{
if (pkInstEach->IntersectDefendingSphere())
m_kVct_pkInstPicked.push_back(pkInstEach);
}
}
}
}
struct CInstanceBase_SLessCameraDistance
{
TPixelPosition m_kPPosEye;
bool operator() (CInstanceBase* pkInstLeft, CInstanceBase* pkInstRight)
{
int nLeftDeadPoint=pkInstLeft->IsDead();
int nRightDeadPoint=pkInstRight->IsDead();
if (nLeftDeadPoint<nRightDeadPoint)
return true;
if (pkInstLeft->CalculateDistanceSq3d(m_kPPosEye)<pkInstRight->CalculateDistanceSq3d(m_kPPosEye))
return true;
return false;
}
};
void CPythonCharacterManager::__SortPickedActorList()
{
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
const D3DXVECTOR3& c_rv3EyePos=pCamera->GetEye();
CInstanceBase_SLessCameraDistance kLess;
kLess.m_kPPosEye=TPixelPosition(+c_rv3EyePos.x, -c_rv3EyePos.y, +c_rv3EyePos.z);
std::sort(m_kVct_pkInstPicked.begin(), m_kVct_pkInstPicked.end(), kLess);
}
void CPythonCharacterManager::__NEW_Pick()
{
__UpdateSortPickedActorList();
CInstanceBase* pkInstMain=GetMainInstancePtr();
#ifdef __MOVIE_MODE
if (pkInstMain)
if (pkInstMain->IsMovieMode())
{
if (m_pkInstPick)
m_pkInstPick->OnUnselected();
return;
}
#endif
// 정밀한 체크
{
std::vector<CInstanceBase*>::iterator f;
for (f=m_kVct_pkInstPicked.begin(); f!=m_kVct_pkInstPicked.end(); ++f)
{
CInstanceBase* pkInstEach=*f;
if (pkInstEach!=pkInstMain && pkInstEach->IntersectBoundingBox())
{
if (m_pkInstPick)
if (m_pkInstPick!=pkInstEach)
m_pkInstPick->OnUnselected();
if (pkInstEach->CanPickInstance())
{
m_pkInstPick = pkInstEach;
m_pkInstPick->OnSelected();
return;
}
}
}
}
// 못찾겠으면 걍 순서대로
{
std::vector<CInstanceBase*>::iterator f;
for (f=m_kVct_pkInstPicked.begin(); f!=m_kVct_pkInstPicked.end(); ++f)
{
CInstanceBase* pkInstEach=*f;
if (pkInstEach!=pkInstMain)
{
if (m_pkInstPick)
if (m_pkInstPick!=pkInstEach)
m_pkInstPick->OnUnselected();
if (pkInstEach->CanPickInstance())
{
m_pkInstPick = pkInstEach;
m_pkInstPick->OnSelected();
return;
}
}
}
}
if (pkInstMain)
if (pkInstMain->CanPickInstance())
if (m_kVct_pkInstPicked.end() != std::find(m_kVct_pkInstPicked.begin(), m_kVct_pkInstPicked.end(), pkInstMain))
{
if (m_pkInstPick)
if (m_pkInstPick!=pkInstMain)
m_pkInstPick->OnUnselected();
m_pkInstPick = pkInstMain;
m_pkInstPick->OnSelected();
return;
}
if (m_pkInstPick)
{
m_pkInstPick->OnUnselected();
m_pkInstPick=NULL;
}
}
void CPythonCharacterManager::__OLD_Pick()
{
for (TCharacterInstanceMap::iterator itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); ++itor)
{
CInstanceBase * pkInstEach = itor->second;
if (pkInstEach == m_pkInstMain)
continue;
if (pkInstEach->IntersectDefendingSphere())
{
if (m_pkInstPick)
if (m_pkInstPick!=pkInstEach)
m_pkInstPick->OnUnselected();
m_pkInstPick = pkInstEach;
m_pkInstPick->OnSelected();
return;
}
}
if (m_pkInstPick)
{
m_pkInstPick->OnUnselected();
m_pkInstPick=NULL;
}
}
int CPythonCharacterManager::PickAll()
{
for (TCharacterInstanceMap::iterator itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); ++itor)
{
CInstanceBase * pInstance = itor->second;
if (pInstance->IntersectDefendingSphere())
return pInstance->GetVirtualID();
}
return -1;
}
CInstanceBase * CPythonCharacterManager::GetCloseInstance(CInstanceBase * pInstance)
{
float fMinDistance = 10000.0f;
CInstanceBase * pCloseInstance = NULL;
TCharacterInstanceMap::iterator itor = m_kAliveInstMap.begin();
for (; itor != m_kAliveInstMap.end(); ++itor)
{
CInstanceBase * pTargetInstance = itor->second;
if (pTargetInstance == pInstance)
continue;
DWORD dwVirtualNumber = pTargetInstance->GetVirtualNumber();
if (CPythonNonPlayer::ON_CLICK_EVENT_BATTLE != CPythonNonPlayer::Instance().GetEventType(dwVirtualNumber))
continue;
float fDistance = pInstance->GetDistance(pTargetInstance);
if (fDistance < fMinDistance)
{
fMinDistance = fDistance;
pCloseInstance = pTargetInstance;
}
}
return pCloseInstance;
}
void CPythonCharacterManager::RefreshAllPCTextTail()
{
CPythonCharacterManager::CharacterIterator itor = CharacterInstanceBegin();
CPythonCharacterManager::CharacterIterator itorEnd = CharacterInstanceEnd();
for (; itor != itorEnd; ++itor)
{
CInstanceBase * pInstance = *itor;
if (!pInstance->IsPC())
continue;
pInstance->RefreshTextTail();
}
}
void CPythonCharacterManager::RefreshAllGuildMark()
{
CPythonCharacterManager::CharacterIterator itor = CharacterInstanceBegin();
CPythonCharacterManager::CharacterIterator itorEnd = CharacterInstanceEnd();
for (; itor != itorEnd; ++itor)
{
CInstanceBase * pInstance = *itor;
if (!pInstance->IsPC())
continue;
pInstance->ChangeGuild(pInstance->GetGuildID());
pInstance->RefreshTextTail();
}
}
void CPythonCharacterManager::DeleteAllInstances()
{
DestroyAliveInstanceMap();
DestroyDeadInstanceList();
}
void CPythonCharacterManager::DestroyAliveInstanceMap()
{
for (TCharacterInstanceMap::iterator i = m_kAliveInstMap.begin(); i != m_kAliveInstMap.end(); ++i)
CInstanceBase::Delete(i->second);
m_kAliveInstMap.clear();
}
void CPythonCharacterManager::DestroyDeadInstanceList()
{
std::for_each(m_kDeadInstList.begin(), m_kDeadInstList.end(), CInstanceBase::Delete);
m_kDeadInstList.clear();
}
void CPythonCharacterManager::Destroy()
{
DeleteAllInstances();
CInstanceBase::DestroySystem();
__Initialize();
}
void CPythonCharacterManager::__Initialize()
{
memset(m_adwPointEffect, 0, sizeof(m_adwPointEffect));
m_pkInstMain = NULL;
m_pkInstBind = NULL;
m_pkInstPick = NULL;
m_v2PickedInstProjPos = D3DXVECTOR2(0.0f, 0.0f);
}
CPythonCharacterManager::CPythonCharacterManager()
{
__Initialize();
}
CPythonCharacterManager::~CPythonCharacterManager()
{
Destroy();
}
@@ -0,0 +1,834 @@
#include "StdAfx.h"
#include "PythonChat.h"
#include "AbstractApplication.h"
#include "PythonCharacterManager.h"
#include "../EterBase/Timer.h"
int CPythonChat::TChatSet::ms_iChatModeSize = CHAT_TYPE_MAX_NUM;
const float c_fStartDisappearingTime = 5.0f;
const int c_iMaxLineCount = 5;
///////////////////////////////////////////////////////////////////////////////////////////////////
CDynamicPool<CPythonChat::SChatLine> CPythonChat::SChatLine::ms_kPool;
void CPythonChat::SetChatColor(UINT eType, UINT r, UINT g, UINT b)
{
if (eType>=CHAT_TYPE_MAX_NUM)
return;
DWORD dwColor=(0xff000000)|(r<<16)|(g<<8)|(b);
m_akD3DXClrChat[eType]=D3DXCOLOR(dwColor);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CPythonChat::SChatLine* CPythonChat::SChatLine::New()
{
return ms_kPool.Alloc();
}
void CPythonChat::SChatLine::Delete(CPythonChat::SChatLine* pkChatLine)
{
pkChatLine->Instance.Destroy();
ms_kPool.Free(pkChatLine);
}
void CPythonChat::SChatLine::DestroySystem()
{
ms_kPool.Destroy();
}
void CPythonChat::SChatLine::SetColor(DWORD dwID, DWORD dwColor)
{
assert(dwID < CHAT_LINE_COLOR_ARRAY_MAX_NUM);
if (dwID >= CHAT_LINE_COLOR_ARRAY_MAX_NUM)
return;
aColor[dwID] = dwColor;
}
void CPythonChat::SChatLine::SetColorAll(DWORD dwColor)
{
for (int i = 0; i < CHAT_LINE_COLOR_ARRAY_MAX_NUM; ++i)
aColor[i] = dwColor;
}
D3DXCOLOR & CPythonChat::SChatLine::GetColorRef(DWORD dwID)
{
assert(dwID < CHAT_LINE_COLOR_ARRAY_MAX_NUM);
if (dwID >= CHAT_LINE_COLOR_ARRAY_MAX_NUM)
{
static D3DXCOLOR color(1.0f, 0.0f, 0.0f, 1.0f);
return color;
}
return aColor[dwID];
}
CPythonChat::SChatLine::SChatLine()
{
for (int i = 0; i < CHAT_LINE_COLOR_ARRAY_MAX_NUM; ++i)
aColor[i] = 0xff0000ff;
}
CPythonChat::SChatLine::~SChatLine()
{
Instance.Destroy();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
int CPythonChat::CreateChatSet(DWORD dwID)
{
m_ChatSetMap.insert(std::make_pair(dwID, TChatSet()));
return dwID;
}
void CPythonChat::UpdateViewMode(DWORD dwID)
{
IAbstractApplication& rApp=IAbstractApplication::GetSingleton();
float fcurTime = rApp.GetGlobalTime();
//float felapsedTime = rApp.GetGlobalElapsedTime();
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList);
int iLineIndex = pLineList->size();
int iHeight = -(int(pLineList->size()+1) * pChatSet->m_iStep);
TChatLineList::iterator itor;
for (itor = pLineList->begin(); itor != pLineList->end();)
{
TChatLine * pChatLine = (*itor);
D3DXCOLOR & rColor = pChatLine->GetColorRef(dwID);
float fElapsedTime = (fcurTime - pChatLine->fAppendedTime);
if (fElapsedTime >= c_fStartDisappearingTime || iLineIndex >= c_iMaxLineCount)
{
rColor.a -= rColor.a / 10.0f;
if (rColor.a <= 0.1f)
{
itor = pLineList->erase(itor);
}
else
{
++itor;
}
}
else
{
++itor;
}
/////
iHeight += pChatSet->m_iStep;
--iLineIndex;
pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight);
pChatLine->Instance.SetColor(rColor);
pChatLine->Instance.Update();
}
}
void CPythonChat::UpdateEditMode(DWORD dwID)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
const int c_iAlphaLine = max(0, GetVisibleLineCount(dwID) - GetEditableLineCount(dwID) + 2);
int iLineIndex = 0;
float fAlpha = 0.0f;
float fAlphaStep = 0.0f;
if (c_iAlphaLine > 0)
fAlphaStep = 1.0f / float(c_iAlphaLine);
TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList);
int iHeight = -(int(pLineList->size()+1) * pChatSet->m_iStep);
for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor)
{
TChatLine * pChatLine = (*itor);
D3DXCOLOR & rColor = pChatLine->GetColorRef(dwID);
if (iLineIndex < c_iAlphaLine)
{
rColor.a += (fAlpha - rColor.a) / 10.0f;
fAlpha = fMIN(fAlpha+fAlphaStep, 1.0f);
}
else
{
rColor.a = fMIN(rColor.a+0.05f, 1.0f);
}
iHeight += pChatSet->m_iStep;
pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight);
pChatLine->Instance.SetColor(rColor);
pChatLine->Instance.Update();
}
}
void CPythonChat::UpdateLogMode(DWORD dwID)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList);
int iHeight = 0;
for (TChatLineList::reverse_iterator itor = pLineList->rbegin(); itor != pLineList->rend(); ++itor)
{
TChatLine * pChatLine = (*itor);
iHeight -= pChatSet->m_iStep;
pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight);
pChatLine->Instance.SetColor(pChatLine->GetColorRef(dwID));
pChatLine->Instance.Update();
}
}
void CPythonChat::Update(DWORD dwID)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
switch (pChatSet->m_iBoardState)
{
case BOARD_STATE_VIEW:
UpdateViewMode(dwID);
break;
case BOARD_STATE_EDIT:
UpdateEditMode(dwID);
break;
case BOARD_STATE_LOG:
UpdateLogMode(dwID);
break;
}
DWORD dwcurTime = CTimer::Instance().GetCurrentMillisecond();
for (TWaitChatList::iterator itor = m_WaitChatList.begin(); itor != m_WaitChatList.end();)
{
TWaitChat & rWaitChat = *itor;
if (rWaitChat.dwAppendingTime < dwcurTime)
{
AppendChat(rWaitChat.iType, rWaitChat.strChat.c_str());
itor = m_WaitChatList.erase(itor);
}
else
{
++itor;
}
}
}
void CPythonChat::Render(DWORD dwID)
{
TChatLineList * pLineList = GetChatLineListPtr(dwID);
if (!pLineList)
return;
for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor)
{
CGraphicTextInstance & rInstance = (*itor)->Instance;
rInstance.Render();
}
}
void CPythonChat::SetBoardState(DWORD dwID, int iState)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
pChatSet->m_iBoardState = iState;
ArrangeShowingChat(dwID);
}
void CPythonChat::SetPosition(DWORD dwID, int ix, int iy)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
pChatSet->m_ix = ix;
pChatSet->m_iy = iy;
}
void CPythonChat::SetHeight(DWORD dwID, int iHeight)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
pChatSet->m_iHeight = iHeight;
}
void CPythonChat::SetStep(DWORD dwID, int iStep)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
pChatSet->m_iStep = iStep;
}
void CPythonChat::ToggleChatMode(DWORD dwID, int iMode)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
pChatSet->m_iMode[iMode] = 1 - pChatSet->m_iMode[iMode];
// Tracef("ToggleChatMode : %d\n", iMode);
ArrangeShowingChat(dwID);
}
void CPythonChat::EnableChatMode(DWORD dwID, int iMode)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
pChatSet->m_iMode[iMode] = TRUE;
// Tracef("EnableChatMode : %d\n", iMode);
ArrangeShowingChat(dwID);
}
void CPythonChat::DisableChatMode(DWORD dwID, int iMode)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
pChatSet->m_iMode[iMode] = FALSE;
// Tracef("DisableChatMode : %d\n", iMode);
ArrangeShowingChat(dwID);
}
void CPythonChat::SetEndPos(DWORD dwID, float fPos)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
fPos = max(0.0f, fPos);
fPos = min(1.0f, fPos);
if (pChatSet->m_fEndPos != fPos)
{
pChatSet->m_fEndPos = fPos;
ArrangeShowingChat(dwID);
}
}
int CPythonChat::GetVisibleLineCount(DWORD dwID)
{
TChatLineList * pLineList = GetChatLineListPtr(dwID);
if (!pLineList)
return 0;
return pLineList->size();
}
int CPythonChat::GetEditableLineCount(DWORD dwID)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return 0;
return pChatSet->m_iHeight / pChatSet->m_iStep + 1;
}
int CPythonChat::GetLineCount(DWORD dwID)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return 0;
int iCount = 0;
for (DWORD i = 0; i < m_ChatLineDeque.size(); ++i)
{
if (!pChatSet->CheckMode(m_ChatLineDeque[i]->iType))
continue;
++iCount;
}
return iCount;
}
int CPythonChat::GetLineStep(DWORD dwID)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return 0;
return pChatSet->m_iStep;
}
CPythonChat::TChatLineList * CPythonChat::GetChatLineListPtr(DWORD dwID)
{
TChatSetMap::iterator itor = m_ChatSetMap.find(dwID);
if (m_ChatSetMap.end() == itor)
return NULL;
TChatSet & rChatSet = itor->second;
return &(rChatSet.m_ShowingChatLineList);
}
CPythonChat::TChatSet * CPythonChat::GetChatSetPtr(DWORD dwID)
{
TChatSetMap::iterator itor = m_ChatSetMap.find(dwID);
if (m_ChatSetMap.end() == itor)
return NULL;
TChatSet & rChatSet = itor->second;
return &rChatSet;
}
void CPythonChat::ArrangeShowingChat(DWORD dwID)
{
TChatSet * pChatSet = GetChatSetPtr(dwID);
if (!pChatSet)
return;
pChatSet->m_ShowingChatLineList.clear();
TChatLineDeque TempChatLineDeque;
for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor)
{
TChatLine * pChatLine = *itor;
if (pChatSet->CheckMode(pChatLine->iType))
TempChatLineDeque.push_back(pChatLine);
}
int icurLineCount = TempChatLineDeque.size();
int iVisibleLineCount = min(icurLineCount, (pChatSet->m_iHeight + pChatSet->m_iStep) / pChatSet->m_iStep);
int iEndLine = iVisibleLineCount + int(float(icurLineCount - iVisibleLineCount - 1) * pChatSet->m_fEndPos);
/////
int iHeight = 12;
for (int i = min(icurLineCount-1, iEndLine); i >= 0; --i)
{
if (!pChatSet->CheckMode(TempChatLineDeque[i]->iType))
continue;
if (pChatSet->m_iHeight + pChatSet->m_iStep <= iHeight)
{
break;
}
pChatSet->m_ShowingChatLineList.push_front(TempChatLineDeque[i]);
iHeight += pChatSet->m_iStep;
}
}
void CPythonChat::AppendChat(int iType, const char * c_szChat)
{
// DEFAULT_FONT
//static CResource * s_pResource = CResourceManager::Instance().GetResourcePointer(g_strDefaultFontName.c_str());
CGraphicText* pkDefaultFont = static_cast<CGraphicText*>(DefaultFont_GetResource());
if (!pkDefaultFont)
{
TraceError("CPythonChat::AppendChat - CANNOT_FIND_DEFAULT_FONT");
return;
}
// END_OF_DEFAULT_FONT
IAbstractApplication& rApp=IAbstractApplication::GetSingleton();
SChatLine * pChatLine = SChatLine::New();
pChatLine->iType = iType;
pChatLine->Instance.SetValue(c_szChat);
// DEFAULT_FONT
pChatLine->Instance.SetTextPointer(pkDefaultFont);
// END_OF_DEFAULT_FONT
pChatLine->fAppendedTime = rApp.GetGlobalTime();
pChatLine->SetColorAll(GetChatColor(iType));
m_ChatLineDeque.push_back(pChatLine);
if (m_ChatLineDeque.size() > CHAT_LINE_MAX_NUM)
{
SChatLine * pChatLine = m_ChatLineDeque.front();
SChatLine::Delete(pChatLine);
m_ChatLineDeque.pop_front();
}
for (TChatSetMap::iterator itor = m_ChatSetMap.begin(); itor != m_ChatSetMap.end(); ++itor)
{
TChatSet * pChatSet = &(itor->second);
//pChatLine->SetColor(itor->first, GetChatColor(iType));
// Edit Mode 를 억지로 끼워 맞추기 위해 추가
if (BOARD_STATE_EDIT == pChatSet->m_iBoardState)
{
ArrangeShowingChat(itor->first);
}
else// if (BOARD_STATE_VIEW == pChatSet->m_iBoardState)
{
pChatSet->m_ShowingChatLineList.push_back(pChatLine);
if (pChatSet->m_ShowingChatLineList.size() > CHAT_LINE_MAX_NUM)
{
pChatSet->m_ShowingChatLineList.pop_front();
}
}
}
}
void CPythonChat::AppendChatWithDelay(int iType, const char * c_szChat, int iDelay)
{
TWaitChat WaitChat;
WaitChat.iType = iType;
WaitChat.strChat = c_szChat;
WaitChat.dwAppendingTime = CTimer::Instance().GetCurrentMillisecond() + iDelay;
m_WaitChatList.push_back(WaitChat);
}
DWORD CPythonChat::GetChatColor(int iType)
{
if (iType<CHAT_TYPE_MAX_NUM)
{
return m_akD3DXClrChat[iType];
}
return D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f);
}
void CPythonChat::IgnoreCharacter(const char * c_szName)
{
TIgnoreCharacterSet::iterator itor = m_IgnoreCharacterSet.find(c_szName);
// NOTE : 이미 차단 중이라면..
if (m_IgnoreCharacterSet.end() != itor)
{
m_IgnoreCharacterSet.erase(itor);
}
// NOTE : 차단이 되지 않은 캐릭터라면..
else
{
m_IgnoreCharacterSet.insert(c_szName);
}
}
BOOL CPythonChat::IsIgnoreCharacter(const char * c_szName)
{
TIgnoreCharacterSet::iterator itor = m_IgnoreCharacterSet.find(c_szName);
if (m_IgnoreCharacterSet.end() == itor)
return FALSE;
return TRUE;
}
CWhisper * CPythonChat::CreateWhisper(const char * c_szName)
{
CWhisper * pWhisper = CWhisper::New();
m_WhisperMap.insert(TWhisperMap::value_type(c_szName, pWhisper));
return pWhisper;
}
void CPythonChat::AppendWhisper(int iType, const char * c_szName, const char * c_szChat)
{
TWhisperMap::iterator itor = m_WhisperMap.find(c_szName);
CWhisper * pWhisper;
if (itor == m_WhisperMap.end())
{
pWhisper = CreateWhisper(c_szName);
}
else
{
pWhisper = itor->second;
}
pWhisper->AppendChat(iType, c_szChat);
}
void CPythonChat::ClearWhisper(const char * c_szName)
{
TWhisperMap::iterator itor = m_WhisperMap.find(c_szName);
if (itor != m_WhisperMap.end())
{
CWhisper * pWhisper = itor->second;
CWhisper::Delete(pWhisper);
m_WhisperMap.erase(itor);
}
}
BOOL CPythonChat::GetWhisper(const char * c_szName, CWhisper ** ppWhisper)
{
TWhisperMap::iterator itor = m_WhisperMap.find(c_szName);
if (itor == m_WhisperMap.end())
return FALSE;
*ppWhisper = itor->second;
return TRUE;
}
void CPythonChat::InitWhisper(PyObject * ppyObject)
{
TWhisperMap::iterator itor = m_WhisperMap.begin();
for (; itor != m_WhisperMap.end(); ++itor)
{
std::string strName = itor->first;
PyCallClassMemberFunc(ppyObject, "MakeWhisperButton", Py_BuildValue("(s)", strName.c_str()));
}
}
void CPythonChat::__DestroyWhisperMap()
{
TWhisperMap::iterator itor = m_WhisperMap.begin();
for (; itor != m_WhisperMap.end(); ++itor)
{
CWhisper::Delete(itor->second);
}
m_WhisperMap.clear();
}
void CPythonChat::Close()
{
TChatSetMap::iterator itor = m_ChatSetMap.begin();
for (; itor != m_ChatSetMap.end(); ++itor)
{
TChatSet & rChatSet = itor->second;
TChatLineList * pLineList = &(rChatSet.m_ShowingChatLineList);
for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor)
{
TChatLine * pChatLine = (*itor);
pChatLine->fAppendedTime = 0.0f;
}
}
}
void CPythonChat::Destroy()
{
__DestroyWhisperMap();
m_ShowingChatLineList.clear();
m_ChatSetMap.clear();
m_ChatLineDeque.clear();
SChatLine::DestroySystem();
CWhisper::DestroySystem();
__Initialize();
}
void CPythonChat::__Initialize()
{
m_akD3DXClrChat[CHAT_TYPE_TALKING] = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
m_akD3DXClrChat[CHAT_TYPE_INFO] = D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f);
m_akD3DXClrChat[CHAT_TYPE_NOTICE] = D3DXCOLOR(1.0f, 0.902f, 0.730f, 1.0f);
m_akD3DXClrChat[CHAT_TYPE_PARTY] = D3DXCOLOR(0.542f, 1.0f, 0.949f, 1.0f);
m_akD3DXClrChat[CHAT_TYPE_GUILD] = D3DXCOLOR(0.906f, 0.847f, 1.0f, 1.0f);
m_akD3DXClrChat[CHAT_TYPE_COMMAND] = D3DXCOLOR(0.658f, 1.0f, 0.835f, 1.0f);
m_akD3DXClrChat[CHAT_TYPE_SHOUT] = D3DXCOLOR(0.658f, 1.0f, 0.835f, 1.0f);
m_akD3DXClrChat[CHAT_TYPE_WHISPER] = D3DXCOLOR(0xff4AE14A);
m_akD3DXClrChat[CHAT_TYPE_BIG_NOTICE] = D3DXCOLOR(1.0f, 0.902f, 0.730f, 1.0f);
}
CPythonChat::CPythonChat()
{
__Initialize();
}
CPythonChat::~CPythonChat()
{
assert(m_ChatLineDeque.empty());
assert(m_ShowingChatLineList.empty());
assert(m_ChatSetMap.empty());
assert(m_WhisperMap.empty());
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CDynamicPool<CWhisper> CWhisper::ms_kPool;
CWhisper* CWhisper::New()
{
return ms_kPool.Alloc();
}
void CWhisper::Delete(CWhisper* pkWhisper)
{
pkWhisper->Destroy();
ms_kPool.Free(pkWhisper);
}
void CWhisper::DestroySystem()
{
ms_kPool.Destroy();
SChatLine::DestroySystem();
}
void CWhisper::SetPosition(float fPosition)
{
m_fcurPosition = fPosition;
__ArrangeChat();
}
void CWhisper::SetBoxSize(float fWidth, float fHeight)
{
m_fWidth = fWidth;
m_fHeight = fHeight;
for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor)
{
TChatLine * pChatLine = *itor;
pChatLine->Instance.SetLimitWidth(fWidth);
}
}
void CWhisper::AppendChat(int iType, const char * c_szChat)
{
// DEFAULT_FONT
//static CResource * s_pResource = CResourceManager::Instance().GetResourcePointer(g_strDefaultFontName.c_str());
#if defined(LOCALE_SERVICE_YMIR) || defined(LOCALE_SERVICE_JAPAN) || defined(LOCALE_SERVICE_HONGKONG) || defined(LOCALE_SERVICE_TAIWAN) || defined(LOCALE_SERVICE_NEWCIBN)
CGraphicText* pkDefaultFont = static_cast<CGraphicText*>(DefaultFont_GetResource());
#else
CGraphicText* pkDefaultFont = (iType == CPythonChat::WHISPER_TYPE_GM) ? static_cast<CGraphicText*>(DefaultItalicFont_GetResource()) : static_cast<CGraphicText*>(DefaultFont_GetResource());
#endif
if (!pkDefaultFont)
{
TraceError("CWhisper::AppendChat - CANNOT_FIND_DEFAULT_FONT");
return;
}
// END_OF_DEFAULT_FONT
SChatLine * pChatLine = SChatLine::New();
pChatLine->Instance.SetValue(c_szChat);
// DEFAULT_FONT
pChatLine->Instance.SetTextPointer(pkDefaultFont);
// END_OF_DEFAULT_FONT
pChatLine->Instance.SetLimitWidth(m_fWidth);
pChatLine->Instance.SetMultiLine(TRUE);
switch(iType)
{
case CPythonChat::WHISPER_TYPE_SYSTEM:
pChatLine->Instance.SetColor(D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f));
break;
case CPythonChat::WHISPER_TYPE_GM:
pChatLine->Instance.SetColor(D3DXCOLOR(1.0f, 0.632f, 0.0f, 1.0f));
break;
case CPythonChat::WHISPER_TYPE_CHAT:
default:
pChatLine->Instance.SetColor(0xffffffff);
break;
}
m_ChatLineDeque.push_back(pChatLine);
__ArrangeChat();
}
void CWhisper::__ArrangeChat()
{
for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor)
{
TChatLine * pChatLine = *itor;
pChatLine->Instance.Update();
}
}
void CWhisper::Render(float fx, float fy)
{
float fHeight = fy + m_fHeight;
int iViewCount = int(m_fHeight / m_fLineStep) - 1;
int iLineCount = int(m_ChatLineDeque.size());
int iStartLine = -1;
if (iLineCount > iViewCount)
{
iStartLine = int(float(iLineCount-iViewCount) * m_fcurPosition) + iViewCount - 1;
}
else if (!m_ChatLineDeque.empty())
{
iStartLine = iLineCount - 1;
}
// PORT: RECT holds the 32-bit Win32 LONG, so static_cast<long> would narrow here.
RECT Rect = { static_cast<LONG>(fx), static_cast<LONG>(fy), static_cast<LONG>(fx+m_fWidth), static_cast<LONG>(fy+m_fHeight) };
for (int i = iStartLine; i >= 0; --i)
{
assert(i >= 0 && i < int(m_ChatLineDeque.size()));
TChatLine * pChatLine = m_ChatLineDeque[i];
WORD wLineCount = pChatLine->Instance.GetTextLineCount();
fHeight -= wLineCount * m_fLineStep;
pChatLine->Instance.SetPosition(fx, fHeight);
pChatLine->Instance.Render(&Rect);
if (fHeight < fy)
break;
}
}
void CWhisper::__Initialize()
{
m_fLineStep = 15.0f;
m_fWidth = 300.0f;
m_fHeight = 120.0f;
m_fcurPosition = 1.0f;
}
void CWhisper::Destroy()
{
std::for_each(m_ChatLineDeque.begin(), m_ChatLineDeque.end(), SChatLine::Delete);
m_ChatLineDeque.clear();
m_ShowingChatLineList.clear();
}
CWhisper::CWhisper()
{
__Initialize();
}
CWhisper::~CWhisper()
{
Destroy();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CDynamicPool<CWhisper::SChatLine> CWhisper::SChatLine::ms_kPool;
CWhisper::SChatLine* CWhisper::SChatLine::New()
{
return ms_kPool.Alloc();
}
void CWhisper::SChatLine::Delete(CWhisper::SChatLine* pkChatLine)
{
pkChatLine->Instance.Destroy();
ms_kPool.Free(pkChatLine);
}
void CWhisper::SChatLine::DestroySystem()
{
ms_kPool.Destroy();
}
@@ -0,0 +1,520 @@
#include "StdAfx.h"
#include "PythonChat.h"
#include "PythonItem.h"
#include "../GameLib/ItemManager.h"
PyObject * chatSetChatColor(PyObject* poSelf, PyObject* poArgs)
{
int iType;
if (!PyTuple_GetInteger(poArgs, 0, &iType))
return Py_BuildException();
int r;
if (!PyTuple_GetInteger(poArgs, 1, &r))
return Py_BuildException();
int g;
if (!PyTuple_GetInteger(poArgs, 2, &g))
return Py_BuildException();
int b;
if (!PyTuple_GetInteger(poArgs, 3, &b))
return Py_BuildException();
CPythonChat::Instance().SetChatColor(iType, r, g, b);
return Py_BuildNone();
}
PyObject * chatClear(PyObject* poSelf, PyObject* poArgs)
{
CPythonChat::Instance().Destroy();
return Py_BuildNone();
}
PyObject * chatClose(PyObject* poSelf, PyObject* poArgs)
{
CPythonChat::Instance().Close();
return Py_BuildNone();
}
PyObject * chatCreateChatSet(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
return Py_BuildValue("i", CPythonChat::Instance().CreateChatSet(iID));
}
PyObject * chatUpdate(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
CPythonChat::Instance().Update(iID);
return Py_BuildNone();
}
PyObject * chatRender(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
CPythonChat::Instance().Render(iID);
return Py_BuildNone();
}
PyObject * chatSetBoardState(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
int iState;
if (!PyTuple_GetInteger(poArgs, 1, &iState))
return Py_BuildException();
CPythonChat::Instance().SetBoardState(iID, iState);
return Py_BuildNone();
}
PyObject * chatSetPosition(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
int ix;
if (!PyTuple_GetInteger(poArgs, 1, &ix))
return Py_BuildException();
int iy;
if (!PyTuple_GetInteger(poArgs, 2, &iy))
return Py_BuildException();
CPythonChat::Instance().SetPosition(iID, ix, iy);
return Py_BuildNone();
}
PyObject * chatSetHeight(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
int iHeight;
if (!PyTuple_GetInteger(poArgs, 1, &iHeight))
return Py_BuildException();
CPythonChat::Instance().SetHeight(iID, iHeight);
return Py_BuildNone();
}
PyObject * chatSetStep(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
int iStep;
if (!PyTuple_GetInteger(poArgs, 1, &iStep))
return Py_BuildException();
CPythonChat::Instance().SetStep(iID, iStep);
return Py_BuildNone();
}
PyObject * chatToggleChatMode(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
int iType;
if (!PyTuple_GetInteger(poArgs, 1, &iType))
return Py_BuildException();
CPythonChat::Instance().ToggleChatMode(iID, iType);
return Py_BuildNone();
}
PyObject * chatEnableChatMode(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
int iType;
if (!PyTuple_GetInteger(poArgs, 1, &iType))
return Py_BuildException();
CPythonChat::Instance().EnableChatMode(iID, iType);
return Py_BuildNone();
}
PyObject * chatDisableChatMode(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
int iType;
if (!PyTuple_GetInteger(poArgs, 1, &iType))
return Py_BuildException();
CPythonChat::Instance().DisableChatMode(iID, iType);
return Py_BuildNone();
}
PyObject * chatSetEndPos(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
float fPos;
if (!PyTuple_GetFloat(poArgs, 1, &fPos))
return Py_BuildException();
CPythonChat::Instance().SetEndPos(iID, fPos);
return Py_BuildNone();
}
PyObject * chatGetLineCount(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
return Py_BuildValue("i", CPythonChat::Instance().GetLineCount(iID));
}
PyObject * chatGetVisibleLineCount(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
return Py_BuildValue("i", CPythonChat::Instance().GetVisibleLineCount(iID));
}
PyObject * chatGetLineStep(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
return Py_BuildValue("i", CPythonChat::Instance().GetLineStep(iID));
}
PyObject * chatAppendChat(PyObject* poSelf, PyObject* poArgs)
{
int iType;
if (!PyTuple_GetInteger(poArgs, 0, &iType))
return Py_BuildException();
char * szChat;
if (!PyTuple_GetString(poArgs, 1, &szChat))
return Py_BuildException();
CPythonChat::Instance().AppendChat(iType, szChat);
return Py_BuildNone();
}
PyObject * chatAppendChatWithDelay(PyObject* poSelf, PyObject* poArgs)
{
int iType;
if (!PyTuple_GetInteger(poArgs, 0, &iType))
return Py_BuildException();
char * szChat;
if (!PyTuple_GetString(poArgs, 1, &szChat))
return Py_BuildException();
int iDelay;
if (!PyTuple_GetInteger(poArgs, 2, &iDelay))
return Py_BuildException();
CPythonChat::Instance().AppendChatWithDelay(iType, szChat, iDelay);
return Py_BuildNone();
}
PyObject * chatArrangeShowingChat(PyObject* poSelf, PyObject* poArgs)
{
int iID;
if (!PyTuple_GetInteger(poArgs, 0, &iID))
return Py_BuildException();
CPythonChat::Instance().ArrangeShowingChat(iID);
return Py_BuildNone();
}
PyObject * chatIgnoreCharacter(PyObject* poSelf, PyObject* poArgs)
{
char * szName;
if (!PyTuple_GetString(poArgs, 0, &szName))
return Py_BuildException();
CPythonChat::Instance().IgnoreCharacter(szName);
return Py_BuildNone();
}
PyObject * chatIsIgnoreCharacter(PyObject* poSelf, PyObject* poArgs)
{
char * szName;
if (!PyTuple_GetString(poArgs, 0, &szName))
return Py_BuildException();
CPythonChat::Instance().IsIgnoreCharacter(szName);
return Py_BuildNone();
}
PyObject * chatCreateWhisper(PyObject* poSelf, PyObject* poArgs)
{
char * szName;
if (!PyTuple_GetString(poArgs, 0, &szName))
return Py_BuildException();
CPythonChat::Instance().CreateWhisper(szName);
return Py_BuildNone();
}
PyObject * chatAppendWhisper(PyObject* poSelf, PyObject* poArgs)
{
int iType;
if (!PyTuple_GetInteger(poArgs, 0, &iType))
return Py_BuildException();
char * szName;
if (!PyTuple_GetString(poArgs, 1, &szName))
return Py_BuildException();
char * szChat;
if (!PyTuple_GetString(poArgs, 2, &szChat))
return Py_BuildException();
CPythonChat::Instance().AppendWhisper(iType, szName, szChat);
return Py_BuildNone();
}
PyObject * chatRenderWhisper(PyObject* poSelf, PyObject* poArgs)
{
char * szName;
if (!PyTuple_GetString(poArgs, 0, &szName))
return Py_BuildException();
float fx;
if (!PyTuple_GetFloat(poArgs, 1, &fx))
return Py_BuildException();
float fy;
if (!PyTuple_GetFloat(poArgs, 2, &fy))
return Py_BuildException();
CWhisper * pWhisper;
if (CPythonChat::Instance().GetWhisper(szName, &pWhisper))
{
pWhisper->Render(fx, fy);
}
return Py_BuildNone();
}
PyObject * chatSetWhisperBoxSize(PyObject* poSelf, PyObject* poArgs)
{
char * szName;
if (!PyTuple_GetString(poArgs, 0, &szName))
return Py_BuildException();
float fWidth;
if (!PyTuple_GetFloat(poArgs, 1, &fWidth))
return Py_BuildException();
float fHeight;
if (!PyTuple_GetFloat(poArgs, 2, &fHeight))
return Py_BuildException();
CWhisper * pWhisper;
if (CPythonChat::Instance().GetWhisper(szName, &pWhisper))
{
pWhisper->SetBoxSize(fWidth, fHeight);
}
return Py_BuildNone();
}
PyObject * chatSetWhisperPosition(PyObject* poSelf, PyObject* poArgs)
{
char * szName;
if (!PyTuple_GetString(poArgs, 0, &szName))
return Py_BuildException();
float fPosition;
if (!PyTuple_GetFloat(poArgs, 1, &fPosition))
return Py_BuildException();
CWhisper * pWhisper;
if (CPythonChat::Instance().GetWhisper(szName, &pWhisper))
{
pWhisper->SetPosition(fPosition);
}
return Py_BuildNone();
}
PyObject * chatClearWhisper(PyObject* poSelf, PyObject* poArgs)
{
char * szName;
if (!PyTuple_GetString(poArgs, 0, &szName))
return Py_BuildException();
CPythonChat::Instance().ClearWhisper(szName);
return Py_BuildNone();
}
PyObject * chatInitWhisper(PyObject* poSelf, PyObject* poArgs)
{
PyObject * poInterface;
if (!PyTuple_GetObject(poArgs, 0, &poInterface))
return Py_BuildException();
CPythonChat::Instance().InitWhisper(poInterface);
return Py_BuildNone();
}
PyObject * chatGetLinkFromHyperlink(PyObject * poSelf, PyObject * poArgs)
{
char * szHyperlink;
if (!PyTuple_GetString(poArgs, 0, &szHyperlink))
return Py_BuildException();
std::string stHyperlink(szHyperlink);
std::vector<std::string> results;
split_string(stHyperlink, ":", results, false);
// item:vnum:flag:socket0:socket1:socket2
if (0 == results[0].compare("item"))
{
if (results.size() < 6)
return Py_BuildValue("s", "");
CItemData * pItemData = NULL;
if (CItemManager::Instance().GetItemDataPointer(htoi(results[1].c_str()), &pItemData))
{
char buf[1024] = { 0 };
char itemlink[256];
int len;
bool isAttr = false;
len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x",
htoi(results[1].c_str()),
htoi(results[2].c_str()),
htoi(results[3].c_str()),
htoi(results[4].c_str()),
htoi(results[5].c_str()));
if (results.size() >= 8)
{
for (int i = 6; i < results.size(); i += 2)
{
len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%I64d",
htoi(results[i].c_str()),
atoi(results[i+1].c_str()));
isAttr = true;
}
}
if (isAttr)
//"item:번호:플래그:소켓0:소켓1:소켓2"
snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pItemData->GetName());
else
snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData->GetName());
return Py_BuildValue("s", buf);
}
}
return Py_BuildValue("s", "");
}
void initChat()
{
static PyMethodDef s_methods[] =
{
{ "SetChatColor", chatSetChatColor, METH_VARARGS },
{ "Clear", chatClear, METH_VARARGS },
{ "Close", chatClose, METH_VARARGS },
{ "CreateChatSet", chatCreateChatSet, METH_VARARGS },
{ "Update", chatUpdate, METH_VARARGS },
{ "Render", chatRender, METH_VARARGS },
{ "SetBoardState", chatSetBoardState, METH_VARARGS },
{ "SetPosition", chatSetPosition, METH_VARARGS },
{ "SetHeight", chatSetHeight, METH_VARARGS },
{ "SetStep", chatSetStep, METH_VARARGS },
{ "ToggleChatMode", chatToggleChatMode, METH_VARARGS },
{ "EnableChatMode", chatEnableChatMode, METH_VARARGS },
{ "DisableChatMode", chatDisableChatMode, METH_VARARGS },
{ "SetEndPos", chatSetEndPos, METH_VARARGS },
{ "GetLineCount", chatGetLineCount, METH_VARARGS },
{ "GetVisibleLineCount", chatGetVisibleLineCount, METH_VARARGS },
{ "GetLineStep", chatGetLineStep, METH_VARARGS },
// Chat
{ "AppendChat", chatAppendChat, METH_VARARGS },
{ "AppendChatWithDelay", chatAppendChatWithDelay, METH_VARARGS },
{ "ArrangeShowingChat", chatArrangeShowingChat, METH_VARARGS },
// Ignore
{ "IgnoreCharacter", chatIgnoreCharacter, METH_VARARGS },
{ "IsIgnoreCharacter", chatIsIgnoreCharacter, METH_VARARGS },
// Whisper
{ "CreateWhisper", chatCreateWhisper, METH_VARARGS },
{ "AppendWhisper", chatAppendWhisper, METH_VARARGS },
{ "RenderWhisper", chatRenderWhisper, METH_VARARGS },
{ "SetWhisperBoxSize", chatSetWhisperBoxSize, METH_VARARGS },
{ "SetWhisperPosition", chatSetWhisperPosition, METH_VARARGS },
{ "ClearWhisper", chatClearWhisper, METH_VARARGS },
{ "InitWhisper", chatInitWhisper, METH_VARARGS },
// Link
{ "GetLinkFromHyperlink", chatGetLinkFromHyperlink, METH_VARARGS },
{ NULL, NULL, NULL },
};
PyObject * poModule = Py_InitModule("chat", s_methods);
PyModule_AddIntConstant(poModule, "CHAT_TYPE_TALKING", CHAT_TYPE_TALKING);
PyModule_AddIntConstant(poModule, "CHAT_TYPE_INFO", CHAT_TYPE_INFO);
PyModule_AddIntConstant(poModule, "CHAT_TYPE_NOTICE", CHAT_TYPE_NOTICE);
PyModule_AddIntConstant(poModule, "CHAT_TYPE_PARTY", CHAT_TYPE_PARTY);
PyModule_AddIntConstant(poModule, "CHAT_TYPE_GUILD", CHAT_TYPE_GUILD);
PyModule_AddIntConstant(poModule, "CHAT_TYPE_COMMAND", CHAT_TYPE_COMMAND);
PyModule_AddIntConstant(poModule, "CHAT_TYPE_SHOUT", CHAT_TYPE_SHOUT);
PyModule_AddIntConstant(poModule, "CHAT_TYPE_WHISPER", CHAT_TYPE_WHISPER);
PyModule_AddIntConstant(poModule, "WHISPER_TYPE_CHAT", CPythonChat::WHISPER_TYPE_CHAT);
PyModule_AddIntConstant(poModule, "WHISPER_TYPE_SYSTEM", CPythonChat::WHISPER_TYPE_SYSTEM);
PyModule_AddIntConstant(poModule, "WHISPER_TYPE_GM", CPythonChat::WHISPER_TYPE_GM);
PyModule_AddIntConstant(poModule, "BOARD_STATE_VIEW", CPythonChat::BOARD_STATE_VIEW);
PyModule_AddIntConstant(poModule, "BOARD_STATE_EDIT", CPythonChat::BOARD_STATE_EDIT);
PyModule_AddIntConstant(poModule, "BOARD_STATE_LOG", CPythonChat::BOARD_STATE_LOG);
PyModule_AddIntConstant(poModule, "CHAT_SET_CHAT_WINDOW", 0);
PyModule_AddIntConstant(poModule, "CHAT_SET_LOG_WINDOW", 1);
}
@@ -0,0 +1,557 @@
#include "StdAfx.h"
#include "PythonNetworkStream.h"
#include "PythonNonPlayer.h"
#include "AbstractApplication.h"
#include "AbstractPlayer.h"
#include "AbstractCharacterManager.h"
#include "AbstractChat.h"
#include "InstanceBase.h"
#define ishan(ch) (((ch) & 0xE0) > 0x90)
#define ishanasc(ch) (isascii(ch) || ishan(ch))
#define ishanalp(ch) (isalpha(ch) || ishan(ch))
#define isnhdigit(ch) (!ishan(ch) && isdigit(ch))
#define isnhspace(ch) (!ishan(ch) && isspace(ch))
#define LOWER(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) + ('a' - 'A')) : (c))
#define UPPER(c) (((c) >= 'a' && (c) <= 'z') ? ((c) + ('A' - 'a')) : (c))
void SkipSpaces(char **string)
{
for (; **string != '\0' && isnhspace((unsigned char) **string); ++(*string));
}
char *OneArgument(char *argument, char *first_arg)
{
char mark = FALSE;
if (!argument)
{
*first_arg = '\0';
return NULL;
}
SkipSpaces(&argument);
while (*argument)
{
if (*argument == '\"')
{
mark = !mark;
++argument;
continue;
}
if (!mark && isnhspace((unsigned char) *argument))
break;
*(first_arg++) = LOWER(*argument);
++argument;
}
*first_arg = '\0';
SkipSpaces(&argument);
return (argument);
}
void AppendMonsterList(const CPythonNonPlayer::TMobTableList & c_rMobTableList, const char * c_szHeader, int iType)
{
DWORD dwMonsterCount = 0;
std::string strMonsterList = c_szHeader;
CPythonNonPlayer::TMobTableList::const_iterator itor = c_rMobTableList.begin();
for (; itor!=c_rMobTableList.end(); ++itor)
{
const CPythonNonPlayer::TMobTable * c_pMobTable = *itor;
if (iType == c_pMobTable->bRank)
{
if (dwMonsterCount != 0)
strMonsterList += ", ";
strMonsterList += c_pMobTable->szLocaleName;
if (++dwMonsterCount > 5)
break;
}
}
if (dwMonsterCount > 0)
{
IAbstractChat& rkChat=IAbstractChat::GetSingleton();
rkChat.AppendChat(CHAT_TYPE_INFO, strMonsterList.c_str());
}
}
bool CPythonNetworkStream::ClientCommand(const char * c_szCommand)
{
return false;
}
bool SplitToken(const char * c_szLine, CTokenVector * pstTokenVector, const char * c_szDelimeter = " ")
{
pstTokenVector->reserve(10);
pstTokenVector->clear();
std::string stToken;
std::string strLine = c_szLine;
DWORD basePos = 0;
do
{
int beginPos = strLine.find_first_not_of(c_szDelimeter, basePos);
if (beginPos < 0)
return false;
int endPos;
if (strLine[beginPos] == '"')
{
++beginPos;
endPos = strLine.find_first_of("\"", beginPos);
if (endPos < 0)
return false;
basePos = endPos + 1;
}
else
{
endPos = strLine.find_first_of(c_szDelimeter, beginPos);
basePos = endPos;
}
pstTokenVector->push_back(strLine.substr(beginPos, endPos - beginPos));
// 추가 코드. 맨뒤에 탭이 있는 경우를 체크한다. - [levites]
if (int(strLine.find_first_not_of(c_szDelimeter, basePos)) < 0)
break;
} while (basePos < strLine.length());
return true;
}
void CPythonNetworkStream::ServerCommand(char * c_szCommand)
{
// #0000811: [M2EU] 콘솔창 기능 차단
if (strcmpi(c_szCommand, "ConsoleEnable") == 0)
return;
if (m_apoPhaseWnd[PHASE_WINDOW_GAME])
{
bool isTrue;
if (PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
"BINARY_ServerCommand_Run",
Py_BuildValue("(s)", c_szCommand),
&isTrue
))
{
if (isTrue)
return;
}
}
else if (m_poSerCommandParserWnd)
{
bool isTrue;
if (PyCallClassMemberFunc(m_poSerCommandParserWnd,
"BINARY_ServerCommand_Run",
Py_BuildValue("(s)", c_szCommand),
&isTrue
))
{
if (isTrue)
return;
}
}
CTokenVector TokenVector;
if (!SplitToken(c_szCommand, &TokenVector))
return;
if (TokenVector.empty())
return;
const char * szCmd = TokenVector[0].c_str();
if (!strcmpi(szCmd, "quit"))
{
PostQuitMessage(0);
}
else if (!strcmpi(szCmd, "BettingMoney"))
{
if (2 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
//UINT uMoney= atoi(TokenVector[1].c_str());
}
// GIFT NOTIFY
else if (!strcmpi(szCmd, "gift"))
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "Gift_Show", Py_BuildValue("()"));
}
// CUBE
else if (!strcmpi(szCmd, "cube"))
{
if (TokenVector.size() < 2)
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
if ("open" == TokenVector[1])
{
if (3 > TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
DWORD npcVNUM = (DWORD)atoi(TokenVector[2].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Open", Py_BuildValue("(i)", npcVNUM));
}
else if ("close" == TokenVector[1])
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Close", Py_BuildValue("()"));
}
else if ("info" == TokenVector[1])
{
if (5 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
UINT gold = atoi(TokenVector[2].c_str());
UINT itemVnum = atoi(TokenVector[3].c_str());
UINT count = atoi(TokenVector[4].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_UpdateInfo", Py_BuildValue("(iii)", gold, itemVnum, count));
}
else if ("success" == TokenVector[1])
{
if (4 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
UINT itemVnum = atoi(TokenVector[2].c_str());
UINT count = atoi(TokenVector[3].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Succeed", Py_BuildValue("(ii)", itemVnum, count));
}
else if ("fail" == TokenVector[1])
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Failed", Py_BuildValue("()"));
}
else if ("r_list" == TokenVector[1])
{
// result list (/cube r_list npcVNUM resultCount resultText)
// 20383 4 72723,1/72725,1/72730.1/50001,5 <- 이런식으로 "/" 문자로 구분된 리스트를 줌
if (5 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, 5);
return;
}
DWORD npcVNUM = (DWORD)atoi(TokenVector[2].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_ResultList", Py_BuildValue("(is)", npcVNUM, TokenVector[4].c_str()));
}
else if ("m_info" == TokenVector[1])
{
// material list (/cube m_info requestStartIndex resultCount MaterialText)
// ex) requestStartIndex: 0, resultCount : 5 - 해당 NPC가 만들수 있는 아이템 중 0~4번째에 해당하는 아이템을 만드는 데 필요한 모든 재료들이 MaterialText에 들어있음
// 위 예시처럼 아이템이 다수인 경우 구분자 "@" 문자를 사용
// 0 5 125,1|126,2|127,2|123,5&555,5&555,4/120000 <- 이런식으로 서버에서 클라로 리스트를 줌
if (5 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, 5);
return;
}
UINT requestStartIndex = (UINT)atoi(TokenVector[2].c_str());
UINT resultCount = (UINT)atoi(TokenVector[3].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_MaterialInfo", Py_BuildValue("(iis)", requestStartIndex, resultCount, TokenVector[4].c_str()));
}
}
// CUEBE_END
else if (!strcmpi(szCmd, "ObserverCount"))
{
if (2 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
UINT uObserverCount= atoi(TokenVector[1].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
"BINARY_BettingGuildWar_UpdateObserverCount",
Py_BuildValue("(i)", uObserverCount)
);
}
else if (!strcmpi(szCmd, "ObserverMode"))
{
if (2 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
UINT uMode= atoi(TokenVector[1].c_str());
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.SetObserverMode(uMode ? true : false);
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
"BINARY_BettingGuildWar_SetObserverMode",
Py_BuildValue("(i)", uMode)
);
}
else if (!strcmpi(szCmd, "ObserverTeamInfo"))
{
}
else if (!strcmpi(szCmd, "StoneDetect"))
{
if (4 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
// vid distance(1-3) angle(0-360)
DWORD dwVID = atoi(TokenVector[1].c_str());
BYTE byDistance = atoi(TokenVector[2].c_str());
float fAngle = atof(TokenVector[3].c_str());
fAngle = fmod(540.0f - fAngle, 360.0f);
Tracef("StoneDetect [VID:%d] [Distance:%d] [Angle:%d->%f]\n", dwVID, byDistance, atoi(TokenVector[3].c_str()), fAngle);
IAbstractCharacterManager& rkChrMgr=IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(dwVID);
if (!pInstance)
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Not Exist Instance", c_szCommand);
return;
}
TPixelPosition PixelPosition;
D3DXVECTOR3 v3Rotation(0.0f, 0.0f, fAngle);
pInstance->NEW_GetPixelPosition(&PixelPosition);
PixelPosition.y *= -1.0f;
switch (byDistance)
{
case 0:
CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/firecracker/find_out.mse");
CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/firecracker/find_out.mse", PixelPosition, v3Rotation);
break;
case 1:
CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_small.mse");
CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_small.mse", PixelPosition, v3Rotation);
break;
case 2:
CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_middle.mse");
CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_middle.mse", PixelPosition, v3Rotation);
break;
case 3:
CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_large.mse");
CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_large.mse", PixelPosition, v3Rotation);
break;
default:
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Distance", c_szCommand);
break;
}
#ifdef _DEBUG
IAbstractChat& rkChat=IAbstractChat::GetSingleton();
rkChat.AppendChat(CHAT_TYPE_INFO, c_szCommand);
#endif
}
else if (!strcmpi(szCmd, "StartStaminaConsume"))
{
if (3 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand);
return;
}
DWORD dwConsumePerSec = atoi(TokenVector[1].c_str());
DWORD dwCurrentStamina = atoi(TokenVector[2].c_str());
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.StartStaminaConsume(dwConsumePerSec, dwCurrentStamina);
}
else if (!strcmpi(szCmd, "StopStaminaConsume"))
{
if (2 != TokenVector.size())
{
TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, TokenVector.size());
return;
}
DWORD dwCurrentStamina = atoi(TokenVector[1].c_str());
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.StopStaminaConsume(dwCurrentStamina);
}
else if (!strcmpi(szCmd, "sms"))
{
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.SetMobileFlag(TRUE);
}
else if (!strcmpi(szCmd, "nosms"))
{
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.SetMobileFlag(FALSE);
}
else if (!strcmpi(szCmd, "mobile_auth"))
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnMobileAuthority", Py_BuildValue("()"));
}
else if (!strcmpi(szCmd, "messenger_auth"))
{
const std::string & c_rstrName = TokenVector[1].c_str();
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnMessengerAddFriendQuestion", Py_BuildValue("(s)", c_rstrName.c_str()));
}
else if (!strcmpi(szCmd, "combo"))
{
int iFlag = atoi(TokenVector[1].c_str());
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
rPlayer.SetComboSkillFlag(iFlag);
m_bComboSkillFlag = iFlag ? true : false;
}
else if (!strcmpi(szCmd, "setblockmode"))
{
int iFlag = atoi(TokenVector[1].c_str());
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnBlockMode", Py_BuildValue("(i)", iFlag));
}
// Emotion Start
else if (!strcmpi(szCmd, "french_kiss"))
{
int iVID1 = atoi(TokenVector[1].c_str());
int iVID2 = atoi(TokenVector[2].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1);
CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2);
if (pInstance1 && pInstance2)
pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_FRENCH_KISS_START, CRaceMotionData::NAME_FRENCH_KISS_START);
}
else if (!strcmpi(szCmd, "kiss"))
{
int iVID1 = atoi(TokenVector[1].c_str());
int iVID2 = atoi(TokenVector[2].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1);
CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2);
if (pInstance1 && pInstance2)
pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_KISS_START, CRaceMotionData::NAME_KISS_START);
}
else if (!strcmpi(szCmd, "slap"))
{
int iVID1 = atoi(TokenVector[1].c_str());
int iVID2 = atoi(TokenVector[2].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1);
CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2);
if (pInstance1 && pInstance2)
pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_SLAP_HURT_START, CRaceMotionData::NAME_SLAP_HIT_START);
}
else if (!strcmpi(szCmd, "clap"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_CLAP);
}
else if (!strcmpi(szCmd, "cheer1"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_CHEERS_1);
}
else if (!strcmpi(szCmd, "cheer2"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_CHEERS_2);
}
else if (!strcmpi(szCmd, "dance1"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_DANCE_1);
}
else if (!strcmpi(szCmd, "dance2"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_DANCE_2);
}
else if (!strcmpi(szCmd, "dig_motion"))
{
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(CRaceMotionData::NAME_DIG);
}
// Emotion End
else
{
static std::map<std::string, int> s_emotionDict;
static bool s_isFirst = true;
if (s_isFirst)
{
s_isFirst = false;
s_emotionDict["dance3"] = CRaceMotionData::NAME_DANCE_3;
s_emotionDict["dance4"] = CRaceMotionData::NAME_DANCE_4;
s_emotionDict["dance5"] = CRaceMotionData::NAME_DANCE_5;
s_emotionDict["dance6"] = CRaceMotionData::NAME_DANCE_6;
s_emotionDict["congratulation"] = CRaceMotionData::NAME_CONGRATULATION;
s_emotionDict["forgive"] = CRaceMotionData::NAME_FORGIVE;
s_emotionDict["angry"] = CRaceMotionData::NAME_ANGRY;
s_emotionDict["attractive"] = CRaceMotionData::NAME_ATTRACTIVE;
s_emotionDict["sad"] = CRaceMotionData::NAME_SAD;
s_emotionDict["shy"] = CRaceMotionData::NAME_SHY;
s_emotionDict["cheerup"] = CRaceMotionData::NAME_CHEERUP;
s_emotionDict["banter"] = CRaceMotionData::NAME_BANTER;
s_emotionDict["joy"] = CRaceMotionData::NAME_JOY;
}
std::map<std::string, int>::iterator f = s_emotionDict.find(szCmd);
if (f == s_emotionDict.end())
{
TraceError("Unknown Server Command %s | %s", c_szCommand, szCmd);
}
else
{
int emotionIndex = f->second;
int iVID = atoi(TokenVector[1].c_str());
IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton();
CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID);
if (pInstance)
pInstance->ActEmotion(emotionIndex);
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,454 @@
#include "StdAfx.h"
#include "PythonNetworkStream.h"
#include "NetworkActorManager.h"
#include "PythonBackground.h"
#include "PythonApplication.h"
#include "AbstractPlayer.h"
#include "../GameLib/ActorInstance.h"
void CPythonNetworkStream::__GlobalPositionToLocalPosition(LONG& rGlobalX, LONG& rGlobalY)
{
CPythonBackground&rkBgMgr=CPythonBackground::Instance();
rkBgMgr.GlobalPositionToLocalPosition(rGlobalX, rGlobalY);
}
void CPythonNetworkStream::__LocalPositionToGlobalPosition(LONG& rLocalX, LONG& rLocalY)
{
CPythonBackground&rkBgMgr=CPythonBackground::Instance();
rkBgMgr.LocalPositionToGlobalPosition(rLocalX, rLocalY);
}
bool CPythonNetworkStream::__CanActMainInstance()
{
CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr();
if (!pkInstMain)
return false;
return pkInstMain->CanAct();
}
void CPythonNetworkStream::__ClearNetworkActorManager()
{
m_rokNetActorMgr->Destroy();
}
void __SetWeaponPower(IAbstractPlayer& rkPlayer, DWORD dwWeaponID)
{
DWORD minPower=0;
DWORD maxPower=0;
DWORD minMagicPower=0;
DWORD maxMagicPower=0;
DWORD addPower=0;
CItemData* pkWeapon;
if (CItemManager::Instance().GetItemDataPointer(dwWeaponID, &pkWeapon))
{
if (pkWeapon->GetType()==CItemData::ITEM_TYPE_WEAPON)
{
minPower=pkWeapon->GetValue(3);
maxPower=pkWeapon->GetValue(4);
minMagicPower=pkWeapon->GetValue(1);
maxMagicPower=pkWeapon->GetValue(2);
addPower=pkWeapon->GetValue(5);
}
}
rkPlayer.SetWeaponPower(minPower, maxPower, minMagicPower, maxMagicPower, addPower);
}
//테이블에서 이름이 "." 인 것들
//차후에 서버에서 보내주지 않게 되면 없어질 함수..(서버님께 꼭!!협박; )
bool IsInvisibleRace(WORD raceNum)
{
switch(raceNum)
{
case 20025:
case 20038:
case 20039:
return true;
default:
return false;
}
}
static SNetworkActorData s_kNetActorData;
bool CPythonNetworkStream::RecvCharacterAppendPacket()
{
TPacketGCCharacterAdd chrAddPacket;
if (!Recv(sizeof(chrAddPacket), &chrAddPacket))
return false;
__GlobalPositionToLocalPosition(chrAddPacket.x, chrAddPacket.y);
SNetworkActorData kNetActorData;
kNetActorData.m_bType=chrAddPacket.bType;
kNetActorData.m_dwMovSpd=chrAddPacket.bMovingSpeed;
kNetActorData.m_dwAtkSpd=chrAddPacket.bAttackSpeed;
kNetActorData.m_dwRace=chrAddPacket.wRaceNum;
kNetActorData.m_dwStateFlags=chrAddPacket.bStateFlag;
kNetActorData.m_dwVID=chrAddPacket.dwVID;
kNetActorData.m_fRot=chrAddPacket.angle;
kNetActorData.m_stName="";
kNetActorData.m_stName="";
kNetActorData.m_kAffectFlags.CopyData(0, sizeof(chrAddPacket.dwAffectFlag[0]), &chrAddPacket.dwAffectFlag[0]);
kNetActorData.m_kAffectFlags.CopyData(32, sizeof(chrAddPacket.dwAffectFlag[1]), &chrAddPacket.dwAffectFlag[1]);
kNetActorData.SetPosition(chrAddPacket.x, chrAddPacket.y);
kNetActorData.m_sAlignment=0;/*chrAddPacket.sAlignment*/;
kNetActorData.m_byPKMode=0;/*chrAddPacket.bPKMode*/;
kNetActorData.m_dwGuildID=0;/*chrAddPacket.dwGuild*/;
kNetActorData.m_dwEmpireID=0;/*chrAddPacket.bEmpire*/;
kNetActorData.m_dwArmor=0;/*chrAddPacket.awPart[CHR_EQUIPPART_ARMOR]*/;
kNetActorData.m_dwWeapon=0;/*chrAddPacket.awPart[CHR_EQUIPPART_WEAPON]*/;
kNetActorData.m_dwHair=0;/*chrAddPacket.awPart[CHR_EQUIPPART_HAIR]*/;
kNetActorData.m_dwMountVnum=0;/*chrAddPacket.dwMountVnum*/;
kNetActorData.m_dwLevel = 0; // 몬스터 레벨 표시 안함
if(kNetActorData.m_bType != CActorInstance::TYPE_PC &&
kNetActorData.m_bType != CActorInstance::TYPE_NPC)
{
const char * c_szName;
CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance();
if (rkNonPlayer.GetName(kNetActorData.m_dwRace, &c_szName))
kNetActorData.m_stName = c_szName;
//else
// kNetActorData.m_stName=chrAddPacket.name;
__RecvCharacterAppendPacket(&kNetActorData);
}
else
{
s_kNetActorData = kNetActorData;
}
return true;
}
bool CPythonNetworkStream::RecvCharacterAdditionalInfo()
{
TPacketGCCharacterAdditionalInfo chrInfoPacket;
if (!Recv(sizeof(chrInfoPacket), &chrInfoPacket))
return false;
SNetworkActorData kNetActorData = s_kNetActorData;
if (IsInvisibleRace(kNetActorData.m_dwRace))
return true;
if(kNetActorData.m_dwVID == chrInfoPacket.dwVID)
{
kNetActorData.m_stName = chrInfoPacket.name;
kNetActorData.m_dwGuildID = chrInfoPacket.dwGuildID;
kNetActorData.m_dwLevel = chrInfoPacket.dwLevel;
kNetActorData.m_sAlignment=chrInfoPacket.sAlignment;
kNetActorData.m_byPKMode=chrInfoPacket.bPKMode;
kNetActorData.m_dwGuildID=chrInfoPacket.dwGuildID;
kNetActorData.m_dwEmpireID=chrInfoPacket.bEmpire;
kNetActorData.m_dwArmor=chrInfoPacket.awPart[CHR_EQUIPPART_ARMOR];
kNetActorData.m_dwWeapon=chrInfoPacket.awPart[CHR_EQUIPPART_WEAPON];
kNetActorData.m_dwHair=chrInfoPacket.awPart[CHR_EQUIPPART_HAIR];
kNetActorData.m_dwMountVnum=chrInfoPacket.dwMountVnum;
__RecvCharacterAppendPacket(&kNetActorData);
}
else
{
TraceError("TPacketGCCharacterAdditionalInfo name=%s vid=%d race=%d Error",chrInfoPacket.name,chrInfoPacket.dwVID,kNetActorData.m_dwRace);
}
return true;
}
bool CPythonNetworkStream::RecvCharacterAppendPacketNew()
{
TraceError("TPacketGCCharacterAdd2\264\302 \276\262\301\366 \276\312\264\302 \306\320\305\266\300\324\264\317\264\331.");
TPacketGCCharacterAdd2 chrAddPacket;
if (!Recv(sizeof(chrAddPacket), &chrAddPacket))
return false;
if(IsInvisibleRace(chrAddPacket.wRaceNum))
return true;
__GlobalPositionToLocalPosition(chrAddPacket.x, chrAddPacket.y);
SNetworkActorData kNetActorData;
kNetActorData.m_dwLevel = 0;
kNetActorData.m_bType=chrAddPacket.bType;
kNetActorData.m_dwGuildID=chrAddPacket.dwGuild;
kNetActorData.m_dwEmpireID=chrAddPacket.bEmpire;
kNetActorData.m_dwMovSpd=chrAddPacket.bMovingSpeed;
kNetActorData.m_dwAtkSpd=chrAddPacket.bAttackSpeed;
kNetActorData.m_dwRace=chrAddPacket.wRaceNum;
kNetActorData.m_dwArmor=chrAddPacket.awPart[CHR_EQUIPPART_ARMOR];
kNetActorData.m_dwWeapon=chrAddPacket.awPart[CHR_EQUIPPART_WEAPON];
kNetActorData.m_dwHair=chrAddPacket.awPart[CHR_EQUIPPART_HAIR];
kNetActorData.m_dwStateFlags=chrAddPacket.bStateFlag;
kNetActorData.m_dwVID=chrAddPacket.dwVID;
kNetActorData.m_dwMountVnum=chrAddPacket.dwMountVnum;
kNetActorData.m_fRot=chrAddPacket.angle;
kNetActorData.m_kAffectFlags.CopyData(0, sizeof(chrAddPacket.dwAffectFlag[0]), &chrAddPacket.dwAffectFlag[0]);
kNetActorData.m_kAffectFlags.CopyData(32, sizeof(chrAddPacket.dwAffectFlag[1]), &chrAddPacket.dwAffectFlag[1]);
kNetActorData.SetPosition(chrAddPacket.x, chrAddPacket.y);
kNetActorData.m_sAlignment=chrAddPacket.sAlignment;
kNetActorData.m_byPKMode=chrAddPacket.bPKMode;
kNetActorData.m_stName=chrAddPacket.name;
__RecvCharacterAppendPacket(&kNetActorData);
return true;
}
bool CPythonNetworkStream::RecvCharacterUpdatePacket()
{
TPacketGCCharacterUpdate chrUpdatePacket;
if (!Recv(sizeof(chrUpdatePacket), &chrUpdatePacket))
return false;
SNetworkUpdateActorData kNetUpdateActorData;
kNetUpdateActorData.m_dwGuildID=chrUpdatePacket.dwGuildID;
kNetUpdateActorData.m_dwMovSpd=chrUpdatePacket.bMovingSpeed;
kNetUpdateActorData.m_dwAtkSpd=chrUpdatePacket.bAttackSpeed;
kNetUpdateActorData.m_dwArmor=chrUpdatePacket.awPart[CHR_EQUIPPART_ARMOR];
kNetUpdateActorData.m_dwWeapon=chrUpdatePacket.awPart[CHR_EQUIPPART_WEAPON];
kNetUpdateActorData.m_dwHair=chrUpdatePacket.awPart[CHR_EQUIPPART_HAIR];
kNetUpdateActorData.m_dwVID=chrUpdatePacket.dwVID;
kNetUpdateActorData.m_kAffectFlags.CopyData(0, sizeof(chrUpdatePacket.dwAffectFlag[0]), &chrUpdatePacket.dwAffectFlag[0]);
kNetUpdateActorData.m_kAffectFlags.CopyData(32, sizeof(chrUpdatePacket.dwAffectFlag[1]), &chrUpdatePacket.dwAffectFlag[1]);
kNetUpdateActorData.m_sAlignment=chrUpdatePacket.sAlignment;
kNetUpdateActorData.m_byPKMode=chrUpdatePacket.bPKMode;
kNetUpdateActorData.m_dwStateFlags=chrUpdatePacket.bStateFlag;
kNetUpdateActorData.m_dwMountVnum=chrUpdatePacket.dwMountVnum;
__RecvCharacterUpdatePacket(&kNetUpdateActorData);
return true;
}
bool CPythonNetworkStream::RecvCharacterUpdatePacketNew()
{
TPacketGCCharacterUpdate2 chrUpdatePacket;
if (!Recv(sizeof(chrUpdatePacket), &chrUpdatePacket))
return false;
SNetworkUpdateActorData kNetUpdateActorData;
kNetUpdateActorData.m_dwGuildID=chrUpdatePacket.dwGuildID;
kNetUpdateActorData.m_dwMovSpd=chrUpdatePacket.bMovingSpeed;
kNetUpdateActorData.m_dwAtkSpd=chrUpdatePacket.bAttackSpeed;
kNetUpdateActorData.m_dwArmor=chrUpdatePacket.awPart[CHR_EQUIPPART_ARMOR];
kNetUpdateActorData.m_dwWeapon=chrUpdatePacket.awPart[CHR_EQUIPPART_WEAPON];
kNetUpdateActorData.m_dwHair=chrUpdatePacket.awPart[CHR_EQUIPPART_HAIR];
kNetUpdateActorData.m_dwVID=chrUpdatePacket.dwVID;
kNetUpdateActorData.m_kAffectFlags.CopyData(0, sizeof(chrUpdatePacket.dwAffectFlag[0]), &chrUpdatePacket.dwAffectFlag[0]);
kNetUpdateActorData.m_kAffectFlags.CopyData(32, sizeof(chrUpdatePacket.dwAffectFlag[1]), &chrUpdatePacket.dwAffectFlag[1]);
kNetUpdateActorData.m_sAlignment=chrUpdatePacket.sAlignment;
kNetUpdateActorData.m_byPKMode=chrUpdatePacket.bPKMode;
kNetUpdateActorData.m_dwStateFlags=chrUpdatePacket.bStateFlag;
kNetUpdateActorData.m_dwMountVnum=chrUpdatePacket.dwMountVnum;
__RecvCharacterUpdatePacket(&kNetUpdateActorData);
return true;
}
void CPythonNetworkStream::__RecvCharacterAppendPacket(SNetworkActorData * pkNetActorData)
{
// NOTE : 카메라가 땅에 묻히는 문제의 해결을 위해 메인 캐릭터가 지형에 올려지기
// 전에 맵을 업데이트 해 높이를 구할 수 있도록 해놓아야 합니다.
// 단, 게임이 들어갈때가 아닌 이미 캐릭터가 추가 된 이후에만 합니다.
// 헌데 이동인데 왜 Move로 안하고 Append로 하는지..? - [levites]
IAbstractPlayer& rkPlayer = IAbstractPlayer::GetSingleton();
if (rkPlayer.IsMainCharacterIndex(pkNetActorData->m_dwVID))
{
rkPlayer.SetRace(pkNetActorData->m_dwRace);
__SetWeaponPower(rkPlayer, pkNetActorData->m_dwWeapon);
if (rkPlayer.NEW_GetMainActorPtr())
{
CPythonBackground::Instance().Update(pkNetActorData->m_lCurX, pkNetActorData->m_lCurY, 0.0f);
CPythonCharacterManager::Instance().Update();
// NOTE : 사귀 타워일 경우 GOTO 로 이동시에도 맵 이름을 출력하도록 처리
{
std::string strMapName = CPythonBackground::Instance().GetWarpMapName();
if (strMapName == "metin2_map_deviltower1")
__ShowMapName(pkNetActorData->m_lCurX, pkNetActorData->m_lCurY);
}
}
else
{
__ShowMapName(pkNetActorData->m_lCurX, pkNetActorData->m_lCurY);
}
}
m_rokNetActorMgr->AppendActor(*pkNetActorData);
if (GetMainActorVID()==pkNetActorData->m_dwVID)
{
rkPlayer.SetTarget(0);
if (m_bComboSkillFlag)
rkPlayer.SetComboSkillFlag(m_bComboSkillFlag);
__SetGuildID(pkNetActorData->m_dwGuildID);
//CPythonApplication::Instance().SkipRenderBuffering(10000);
}
}
void CPythonNetworkStream::__RecvCharacterUpdatePacket(SNetworkUpdateActorData * pkNetUpdateActorData)
{
m_rokNetActorMgr->UpdateActor(*pkNetUpdateActorData);
IAbstractPlayer& rkPlayer = IAbstractPlayer::GetSingleton();
if (rkPlayer.IsMainCharacterIndex(pkNetUpdateActorData->m_dwVID))
{
__SetGuildID(pkNetUpdateActorData->m_dwGuildID);
__SetWeaponPower(rkPlayer, pkNetUpdateActorData->m_dwWeapon);
__RefreshStatus();
__RefreshAlignmentWindow();
__RefreshEquipmentWindow();
__RefreshInventoryWindow();
}
else
{
rkPlayer.NotifyCharacterUpdate(pkNetUpdateActorData->m_dwVID);
}
}
bool CPythonNetworkStream::RecvCharacterDeletePacket()
{
TPacketGCCharacterDelete chrDelPacket;
if (!Recv(sizeof(chrDelPacket), &chrDelPacket))
{
TraceError("CPythonNetworkStream::RecvCharacterDeletePacket - Recv Error");
return false;
}
m_rokNetActorMgr->RemoveActor(chrDelPacket.dwVID);
// 캐릭터가 사라질때 개인 상점도 없애줍니다.
// Key Check 를 하기때문에 없어도 상관은 없습니다.
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME],
"BINARY_PrivateShop_Disappear",
Py_BuildValue("(i)", chrDelPacket.dwVID)
);
return true;
}
bool CPythonNetworkStream::RecvCharacterMovePacket()
{
TPacketGCMove kMovePacket;
if (!Recv(sizeof(TPacketGCMove), &kMovePacket))
{
Tracen("CPythonNetworkStream::RecvCharacterMovePacket - PACKET READ ERROR");
return false;
}
__GlobalPositionToLocalPosition(kMovePacket.lX, kMovePacket.lY);
SNetworkMoveActorData kNetMoveActorData;
kNetMoveActorData.m_dwArg=kMovePacket.bArg;
kNetMoveActorData.m_dwFunc=kMovePacket.bFunc;
kNetMoveActorData.m_dwTime=kMovePacket.dwTime;
kNetMoveActorData.m_dwVID=kMovePacket.dwVID;
kNetMoveActorData.m_fRot=kMovePacket.bRot*5.0f;
kNetMoveActorData.m_lPosX=kMovePacket.lX;
kNetMoveActorData.m_lPosY=kMovePacket.lY;
kNetMoveActorData.m_dwDuration=kMovePacket.dwDuration;
m_rokNetActorMgr->MoveActor(kNetMoveActorData);
return true;
}
bool CPythonNetworkStream::RecvOwnerShipPacket()
{
TPacketGCOwnership kPacketOwnership;
if (!Recv(sizeof(kPacketOwnership), &kPacketOwnership))
return false;
m_rokNetActorMgr->SetActorOwner(kPacketOwnership.dwOwnerVID, kPacketOwnership.dwVictimVID);
return true;
}
bool CPythonNetworkStream::RecvSyncPositionPacket()
{
TPacketGCSyncPosition kPacketSyncPos;
if (!Recv(sizeof(kPacketSyncPos), &kPacketSyncPos))
return false;
TPacketGCSyncPositionElement kSyncPos;
UINT uSyncPosCount=(kPacketSyncPos.wSize-sizeof(kPacketSyncPos))/sizeof(kSyncPos);
for (UINT iSyncPos=0; iSyncPos<uSyncPosCount; ++iSyncPos)
{
if (!Recv(sizeof(TPacketGCSyncPositionElement), &kSyncPos))
return false;
#ifdef __MOVIE_MODE__
return true;
#endif __MOVIE_MODE__
//Tracenf("CPythonNetworkStream::RecvSyncPositionPacket %d (%d, %d)", kSyncPos.dwVID, kSyncPos.lX, kSyncPos.lY);
__GlobalPositionToLocalPosition(kSyncPos.lX, kSyncPos.lY);
m_rokNetActorMgr->SyncActor(kSyncPos.dwVID, kSyncPos.lX, kSyncPos.lY);
/*
CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance();
CInstanceBase * pkChrInst = rkChrMgr.GetInstancePtr(kSyncPos.dwVID);
if (pkChrInst)
{
pkChrInst->NEW_SyncPixelPosition(kSyncPos.lX, kSyncPos.lY);
}
*/
}
return true;
}
/*
bool CPythonNetworkStream::RecvCharacterAppendPacket()
{
TPacketGCCharacterAdd chrAddPacket;
if (!Recv(sizeof(chrAddPacket), &chrAddPacket))
return false;
__GlobalPositionToLocalPosition(chrAddPacket.lX, chrAddPacket.lY);
SNetworkActorData kNetActorData;
kNetActorData.m_dwGuildID=chrAddPacket.dwGuild;
kNetActorData.m_dwEmpireID=chrAddPacket.bEmpire;
kNetActorData.m_dwMovSpd=chrAddPacket.bMovingSpeed;
kNetActorData.m_dwAtkSpd=chrAddPacket.bAttackSpeed;
kNetActorData.m_dwRace=chrAddPacket.wRaceNum;
kNetActorData.m_dwShape=chrAddPacket.parts[CRaceData::PART_MAIN];
kNetActorData.m_dwStateFlags=chrAddPacket.bStateFlag;
kNetActorData.m_dwVID=chrAddPacket.dwVID;
kNetActorData.m_dwWeapon=chrAddPacket.parts[CRaceData::PART_WEAPON];
kNetActorData.m_fRot=chrAddPacket.angle;
kNetActorData.m_kAffectFlags.CopyData(0, sizeof(chrAddPacket.dwAffectFlag[0]), &chrAddPacket.dwAffectFlag[0]);
kNetActorData.m_kAffectFlags.CopyData(32, sizeof(chrAddPacket.dwAffectFlag[1]), &chrAddPacket.dwAffectFlag[1]);
kNetActorData.SetPosition(chrAddPacket.lX, chrAddPacket.lY);
kNetActorData.m_stName=chrAddPacket.name;
__RecvCharacterAppendPacket(&kNetActorData);
return true;
}
*/
@@ -0,0 +1,940 @@
#include "StdAfx.h"
#include "PythonNetworkStream.h"
#include "PythonItem.h"
#include "PythonShop.h"
#include "PythonExchange.h"
#include "PythonSafeBox.h"
#include "PythonCharacterManager.h"
#include "AbstractPlayer.h"
//////////////////////////////////////////////////////////////////////////
// SafeBox
bool CPythonNetworkStream::SendSafeBoxMoneyPacket(BYTE byState, DWORD dwMoney)
{
assert(!"CPythonNetworkStream::SendSafeBoxMoneyPacket - \273\347\277\353\307\317\301\366 \276\312\264\302 \307\324\274\366");
return false;
// TPacketCGSafeboxMoney kSafeboxMoney;
// kSafeboxMoney.bHeader = HEADER_CG_SAFEBOX_MONEY;
// kSafeboxMoney.bState = byState;
// kSafeboxMoney.dwMoney = dwMoney;
// if (!Send(sizeof(kSafeboxMoney), &kSafeboxMoney))
// return false;
//
// return SendSequence();
}
bool CPythonNetworkStream::SendSafeBoxCheckinPacket(TItemPos InventoryPos, BYTE bySafeBoxPos)
{
__PlayInventoryItemDropSound(InventoryPos);
TPacketCGSafeboxCheckin kSafeboxCheckin;
kSafeboxCheckin.bHeader = HEADER_CG_SAFEBOX_CHECKIN;
kSafeboxCheckin.ItemPos = InventoryPos;
kSafeboxCheckin.bSafePos = bySafeBoxPos;
if (!Send(sizeof(kSafeboxCheckin), &kSafeboxCheckin))
return false;
return SendSequence();
}
bool CPythonNetworkStream::SendSafeBoxCheckoutPacket(BYTE bySafeBoxPos, TItemPos InventoryPos)
{
__PlaySafeBoxItemDropSound(bySafeBoxPos);
TPacketCGSafeboxCheckout kSafeboxCheckout;
kSafeboxCheckout.bHeader = HEADER_CG_SAFEBOX_CHECKOUT;
kSafeboxCheckout.bSafePos = bySafeBoxPos;
kSafeboxCheckout.ItemPos = InventoryPos;
if (!Send(sizeof(kSafeboxCheckout), &kSafeboxCheckout))
return false;
return SendSequence();
}
bool CPythonNetworkStream::SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, BYTE byCount)
{
__PlaySafeBoxItemDropSound(bySourcePos);
TPacketCGItemMove kItemMove;
kItemMove.header = HEADER_CG_SAFEBOX_ITEM_MOVE;
kItemMove.pos = TItemPos(INVENTORY, bySourcePos);
kItemMove.num = byCount;
kItemMove.change_pos = TItemPos(INVENTORY, byTargetPos);
if (!Send(sizeof(kItemMove), &kItemMove))
return false;
return SendSequence();
}
bool CPythonNetworkStream::RecvSafeBoxSetPacket()
{
TPacketGCItemSet2 kItemSet;
if (!Recv(sizeof(kItemSet), &kItemSet))
return false;
TItemData kItemData;
kItemData.vnum = kItemSet.vnum;
kItemData.count = kItemSet.count;
kItemData.flags = kItemSet.flags;
kItemData.anti_flags = kItemSet.anti_flags;
for (int isocket=0; isocket<ITEM_SOCKET_SLOT_MAX_NUM; ++isocket)
kItemData.alSockets[isocket] = kItemSet.alSockets[isocket];
for (int iattr=0; iattr<ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++iattr)
kItemData.aAttr[iattr] = kItemSet.aAttr[iattr];
CPythonSafeBox::Instance().SetItemData(kItemSet.Cell.cell, kItemData);
__RefreshSafeboxWindow();
return true;
}
bool CPythonNetworkStream::RecvSafeBoxDelPacket()
{
TPacketGCItemDel kItemDel;
if (!Recv(sizeof(kItemDel), &kItemDel))
return false;
CPythonSafeBox::Instance().DelItemData(kItemDel.pos);
__RefreshSafeboxWindow();
return true;
}
bool CPythonNetworkStream::RecvSafeBoxWrongPasswordPacket()
{
TPacketGCSafeboxWrongPassword kSafeboxWrongPassword;
if (!Recv(sizeof(kSafeboxWrongPassword), &kSafeboxWrongPassword))
return false;
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnSafeBoxError", Py_BuildValue("()"));
return true;
}
bool CPythonNetworkStream::RecvSafeBoxSizePacket()
{
TPacketGCSafeboxSize kSafeBoxSize;
if (!Recv(sizeof(kSafeBoxSize), &kSafeBoxSize))
return false;
CPythonSafeBox::Instance().OpenSafeBox(kSafeBoxSize.bSize);
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenSafeboxWindow", Py_BuildValue("(i)", kSafeBoxSize.bSize));
return true;
}
bool CPythonNetworkStream::RecvSafeBoxMoneyChangePacket()
{
TPacketGCSafeboxMoneyChange kMoneyChange;
if (!Recv(sizeof(kMoneyChange), &kMoneyChange))
return false;
CPythonSafeBox::Instance().SetMoney(kMoneyChange.dwMoney);
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshSafeboxMoney", Py_BuildValue("()"));
return true;
}
// SafeBox
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Mall
bool CPythonNetworkStream::SendMallCheckoutPacket(BYTE byMallPos, TItemPos InventoryPos)
{
__PlayMallItemDropSound(byMallPos);
TPacketCGMallCheckout kMallCheckoutPacket;
kMallCheckoutPacket.bHeader = HEADER_CG_MALL_CHECKOUT;
kMallCheckoutPacket.bMallPos = byMallPos;
kMallCheckoutPacket.ItemPos = InventoryPos;
if (!Send(sizeof(kMallCheckoutPacket), &kMallCheckoutPacket))
return false;
return SendSequence();
}
bool CPythonNetworkStream::RecvMallOpenPacket()
{
TPacketGCMallOpen kMallOpen;
if (!Recv(sizeof(kMallOpen), &kMallOpen))
return false;
CPythonSafeBox::Instance().OpenMall(kMallOpen.bSize);
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenMallWindow", Py_BuildValue("(i)", kMallOpen.bSize));
return true;
}
bool CPythonNetworkStream::RecvMallItemSetPacket()
{
TPacketGCItemSet2 kItemSet;
if (!Recv(sizeof(kItemSet), &kItemSet))
return false;
TItemData kItemData;
kItemData.vnum = kItemSet.vnum;
kItemData.count = kItemSet.count;
kItemData.flags = kItemSet.flags;
kItemData.anti_flags = kItemSet.anti_flags;
for (int isocket=0; isocket<ITEM_SOCKET_SLOT_MAX_NUM; ++isocket)
kItemData.alSockets[isocket] = kItemSet.alSockets[isocket];
for (int iattr=0; iattr<ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++iattr)
kItemData.aAttr[iattr] = kItemSet.aAttr[iattr];
CPythonSafeBox::Instance().SetMallItemData(kItemSet.Cell.cell, kItemData);
__RefreshMallWindow();
return true;
}
bool CPythonNetworkStream::RecvMallItemDelPacket()
{
TPacketGCItemDel kItemDel;
if (!Recv(sizeof(kItemDel), &kItemDel))
return false;
CPythonSafeBox::Instance().DelMallItemData(kItemDel.pos);
__RefreshMallWindow();
Tracef(" >> CPythonNetworkStream::RecvMallItemDelPacket\n");
return true;
}
// Mall
//////////////////////////////////////////////////////////////////////////
// Item
// Recieve
bool CPythonNetworkStream::RecvItemSetPacket()
{
TPacketGCItemSet packet_item_set;
if (!Recv(sizeof(TPacketGCItemSet), &packet_item_set))
return false;
TItemData kItemData;
kItemData.vnum = packet_item_set.vnum;
kItemData.count = packet_item_set.count;
kItemData.flags = 0;
for (int i=0; i<ITEM_SOCKET_SLOT_MAX_NUM; ++i)
kItemData.alSockets[i]=packet_item_set.alSockets[i];
for (int j=0; j<ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j)
kItemData.aAttr[j]=packet_item_set.aAttr[j];
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.SetItemData(packet_item_set.Cell, kItemData);
__RefreshInventoryWindow();
return true;
}
bool CPythonNetworkStream::RecvItemSetPacket2()
{
TPacketGCItemSet2 packet_item_set;
if (!Recv(sizeof(TPacketGCItemSet2), &packet_item_set))
return false;
TItemData kItemData;
kItemData.vnum = packet_item_set.vnum;
kItemData.count = packet_item_set.count;
kItemData.flags = packet_item_set.flags;
kItemData.anti_flags = packet_item_set.anti_flags;
for (int i=0; i<ITEM_SOCKET_SLOT_MAX_NUM; ++i)
kItemData.alSockets[i]=packet_item_set.alSockets[i];
for (int j=0; j<ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j)
kItemData.aAttr[j]=packet_item_set.aAttr[j];
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.SetItemData(packet_item_set.Cell, kItemData);
if (packet_item_set.highlight)
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Highlight_Item", Py_BuildValue("(ii)", packet_item_set.Cell.window_type, packet_item_set.Cell.cell));
__RefreshInventoryWindow();
return true;
}
bool CPythonNetworkStream::RecvItemUsePacket()
{
TPacketGCItemUse packet_item_use;
if (!Recv(sizeof(TPacketGCItemUse), &packet_item_use))
return false;
__RefreshInventoryWindow();
return true;
}
bool CPythonNetworkStream::RecvItemUpdatePacket()
{
TPacketGCItemUpdate packet_item_update;
if (!Recv(sizeof(TPacketGCItemUpdate), &packet_item_update))
return false;
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.SetItemCount(packet_item_update.Cell, packet_item_update.count);
for (int i = 0; i < ITEM_SOCKET_SLOT_MAX_NUM; ++i)
rkPlayer.SetItemMetinSocket(packet_item_update.Cell, i, packet_item_update.alSockets[i]);
for (int j = 0; j < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j)
rkPlayer.SetItemAttribute(packet_item_update.Cell, j, packet_item_update.aAttr[j].bType, packet_item_update.aAttr[j].sValue);
__RefreshInventoryWindow();
return true;
}
bool CPythonNetworkStream::RecvItemGroundAddPacket()
{
TPacketGCItemGroundAdd packet_item_ground_add;
if (!Recv(sizeof(TPacketGCItemGroundAdd), &packet_item_ground_add))
return false;
__GlobalPositionToLocalPosition(packet_item_ground_add.lX, packet_item_ground_add.lY);
CPythonItem::Instance().CreateItem(packet_item_ground_add.dwVID,
packet_item_ground_add.dwVnum,
packet_item_ground_add.lX,
packet_item_ground_add.lY,
packet_item_ground_add.lZ);
return true;
}
bool CPythonNetworkStream::RecvItemOwnership()
{
TPacketGCItemOwnership p;
if (!Recv(sizeof(TPacketGCItemOwnership), &p))
return false;
CPythonItem::Instance().SetOwnership(p.dwVID, p.szName);
return true;
}
bool CPythonNetworkStream::RecvItemGroundDelPacket()
{
TPacketGCItemGroundDel packet_item_ground_del;
if (!Recv(sizeof(TPacketGCItemGroundDel), &packet_item_ground_del))
return false;
CPythonItem::Instance().DeleteItem(packet_item_ground_del.vid);
return true;
}
bool CPythonNetworkStream::RecvQuickSlotAddPacket()
{
TPacketGCQuickSlotAdd packet_quick_slot_add;
if (!Recv(sizeof(TPacketGCQuickSlotAdd), &packet_quick_slot_add))
return false;
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.AddQuickSlot(packet_quick_slot_add.pos, packet_quick_slot_add.slot.Type, packet_quick_slot_add.slot.Position);
__RefreshInventoryWindow();
return true;
}
bool CPythonNetworkStream::RecvQuickSlotDelPacket()
{
TPacketGCQuickSlotDel packet_quick_slot_del;
if (!Recv(sizeof(TPacketGCQuickSlotDel), &packet_quick_slot_del))
return false;
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.DeleteQuickSlot(packet_quick_slot_del.pos);
__RefreshInventoryWindow();
return true;
}
bool CPythonNetworkStream::RecvQuickSlotMovePacket()
{
TPacketGCQuickSlotSwap packet_quick_slot_swap;
if (!Recv(sizeof(TPacketGCQuickSlotSwap), &packet_quick_slot_swap))
return false;
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.MoveQuickSlot(packet_quick_slot_swap.pos, packet_quick_slot_swap.change_pos);
__RefreshInventoryWindow();
return true;
}
bool CPythonNetworkStream::SendShopEndPacket()
{
if (!__CanActMainInstance())
return true;
TPacketCGShop packet_shop;
packet_shop.header = HEADER_CG_SHOP;
packet_shop.subheader = SHOP_SUBHEADER_CG_END;
if (!Send(sizeof(packet_shop), &packet_shop))
{
Tracef("SendShopEndPacket Error\n");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendShopBuyPacket(BYTE bPos)
{
if (!__CanActMainInstance())
return true;
TPacketCGShop PacketShop;
PacketShop.header = HEADER_CG_SHOP;
PacketShop.subheader = SHOP_SUBHEADER_CG_BUY;
if (!Send(sizeof(TPacketCGShop), &PacketShop))
{
Tracef("SendShopBuyPacket Error\n");
return false;
}
BYTE bCount=1;
if (!Send(sizeof(BYTE), &bCount))
{
Tracef("SendShopBuyPacket Error\n");
return false;
}
if (!Send(sizeof(BYTE), &bPos))
{
Tracef("SendShopBuyPacket Error\n");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendShopSellPacket(BYTE bySlot)
{
if (!__CanActMainInstance())
return true;
TPacketCGShop PacketShop;
PacketShop.header = HEADER_CG_SHOP;
PacketShop.subheader = SHOP_SUBHEADER_CG_SELL;
if (!Send(sizeof(TPacketCGShop), &PacketShop))
{
Tracef("SendShopSellPacket Error\n");
return false;
}
if (!Send(sizeof(BYTE), &bySlot))
{
Tracef("SendShopAddSellPacket Error\n");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendShopSellPacketNew(BYTE bySlot, BYTE byCount)
{
if (!__CanActMainInstance())
return true;
TPacketCGShop PacketShop;
PacketShop.header = HEADER_CG_SHOP;
PacketShop.subheader = SHOP_SUBHEADER_CG_SELL2;
if (!Send(sizeof(TPacketCGShop), &PacketShop))
{
Tracef("SendShopSellPacket Error\n");
return false;
}
if (!Send(sizeof(BYTE), &bySlot))
{
Tracef("SendShopAddSellPacket Error\n");
return false;
}
if (!Send(sizeof(BYTE), &byCount))
{
Tracef("SendShopAddSellPacket Error\n");
return false;
}
Tracef(" SendShopSellPacketNew(bySlot=%d, byCount=%d)\n", bySlot, byCount);
return SendSequence();
}
// Send
bool CPythonNetworkStream::SendItemUsePacket(TItemPos pos)
{
if (!__CanActMainInstance())
return true;
if (__IsEquipItemInSlot(pos))
{
if (CPythonExchange::Instance().isTrading())
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_EXCHANGE"));
return true;
}
if (CPythonShop::Instance().IsOpen())
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_SHOP"));
return true;
}
if (__IsPlayerAttacking())
return true;
}
__PlayInventoryItemUseSound(pos);
TPacketCGItemUse itemUsePacket;
itemUsePacket.header = HEADER_CG_ITEM_USE;
itemUsePacket.pos = pos;
if (!Send(sizeof(TPacketCGItemUse), &itemUsePacket))
{
Tracen("SendItemUsePacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendItemUseToItemPacket(TItemPos source_pos, TItemPos target_pos)
{
if (!__CanActMainInstance())
return true;
TPacketCGItemUseToItem itemUseToItemPacket;
itemUseToItemPacket.header = HEADER_CG_ITEM_USE_TO_ITEM;
itemUseToItemPacket.source_pos = source_pos;
itemUseToItemPacket.target_pos = target_pos;
if (!Send(sizeof(TPacketCGItemUseToItem), &itemUseToItemPacket))
{
Tracen("SendItemUseToItemPacket Error");
return false;
}
#ifdef _DEBUG
Tracef(" << SendItemUseToItemPacket(src=%d, dst=%d)\n", source_pos, target_pos);
#endif
return SendSequence();
}
bool CPythonNetworkStream::SendItemDropPacket(TItemPos pos, DWORD elk)
{
if (!__CanActMainInstance())
return true;
TPacketCGItemDrop itemDropPacket;
itemDropPacket.header = HEADER_CG_ITEM_DROP;
itemDropPacket.pos = pos;
itemDropPacket.elk = elk;
if (!Send(sizeof(TPacketCGItemDrop), &itemDropPacket))
{
Tracen("SendItemDropPacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos pos, DWORD elk, DWORD count)
{
if (!__CanActMainInstance())
return true;
TPacketCGItemDrop2 itemDropPacket;
itemDropPacket.header = HEADER_CG_ITEM_DROP2;
itemDropPacket.pos = pos;
itemDropPacket.gold = elk;
itemDropPacket.count = count;
if (!Send(sizeof(itemDropPacket), &itemDropPacket))
{
Tracen("SendItemDropPacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::__IsEquipItemInSlot(TItemPos uSlotPos)
{
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
return rkPlayer.IsEquipItemInSlot(uSlotPos);
}
void CPythonNetworkStream::__PlayInventoryItemUseSound(TItemPos uSlotPos)
{
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
DWORD dwItemID=rkPlayer.GetItemIndex(uSlotPos);
CPythonItem& rkItem=CPythonItem::Instance();
rkItem.PlayUseSound(dwItemID);
}
void CPythonNetworkStream::__PlayInventoryItemDropSound(TItemPos uSlotPos)
{
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
DWORD dwItemID=rkPlayer.GetItemIndex(uSlotPos);
CPythonItem& rkItem=CPythonItem::Instance();
rkItem.PlayDropSound(dwItemID);
}
//void CPythonNetworkStream::__PlayShopItemDropSound(UINT uSlotPos)
//{
// DWORD dwItemID;
// CPythonShop& rkShop=CPythonShop::Instance();
// if (!rkShop.GetSlotItemID(uSlotPos, &dwItemID))
// return;
//
// CPythonItem& rkItem=CPythonItem::Instance();
// rkItem.PlayDropSound(dwItemID);
//}
void CPythonNetworkStream::__PlaySafeBoxItemDropSound(UINT uSlotPos)
{
DWORD dwItemID;
CPythonSafeBox& rkSafeBox=CPythonSafeBox::Instance();
if (!rkSafeBox.GetSlotItemID(uSlotPos, &dwItemID))
return;
CPythonItem& rkItem=CPythonItem::Instance();
rkItem.PlayDropSound(dwItemID);
}
void CPythonNetworkStream::__PlayMallItemDropSound(UINT uSlotPos)
{
DWORD dwItemID;
CPythonSafeBox& rkSafeBox=CPythonSafeBox::Instance();
if (!rkSafeBox.GetSlotMallItemID(uSlotPos, &dwItemID))
return;
CPythonItem& rkItem=CPythonItem::Instance();
rkItem.PlayDropSound(dwItemID);
}
bool CPythonNetworkStream::SendItemMovePacket(TItemPos pos, TItemPos change_pos, BYTE num)
{
if (!__CanActMainInstance())
return true;
if (__IsEquipItemInSlot(pos))
{
if (CPythonExchange::Instance().isTrading())
{
if (pos.IsEquipCell() || change_pos.IsEquipCell())
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_EXCHANGE"));
return true;
}
}
if (CPythonShop::Instance().IsOpen())
{
if (pos.IsEquipCell() || change_pos.IsEquipCell())
{
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_AppendNotifyMessage", Py_BuildValue("(s)", "CANNOT_EQUIP_SHOP"));
return true;
}
}
if (__IsPlayerAttacking())
return true;
}
__PlayInventoryItemDropSound(pos);
TPacketCGItemMove itemMovePacket;
itemMovePacket.header = HEADER_CG_ITEM_MOVE;
itemMovePacket.pos = pos;
itemMovePacket.change_pos = change_pos;
itemMovePacket.num = num;
if (!Send(sizeof(TPacketCGItemMove), &itemMovePacket))
{
Tracen("SendItemMovePacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendItemPickUpPacket(DWORD vid)
{
if (!__CanActMainInstance())
return true;
TPacketCGItemPickUp itemPickUpPacket;
itemPickUpPacket.header = HEADER_CG_ITEM_PICKUP;
itemPickUpPacket.vid = vid;
if (!Send(sizeof(TPacketCGItemPickUp), &itemPickUpPacket))
{
Tracen("SendItemPickUpPacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendQuickSlotAddPacket(BYTE wpos, BYTE type, BYTE pos)
{
if (!__CanActMainInstance())
return true;
TPacketCGQuickSlotAdd quickSlotAddPacket;
quickSlotAddPacket.header = HEADER_CG_QUICKSLOT_ADD;
quickSlotAddPacket.pos = wpos;
quickSlotAddPacket.slot.Type = type;
quickSlotAddPacket.slot.Position = pos;
if (!Send(sizeof(TPacketCGQuickSlotAdd), &quickSlotAddPacket))
{
Tracen("SendQuickSlotAddPacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendQuickSlotDelPacket(BYTE pos)
{
if (!__CanActMainInstance())
return true;
TPacketCGQuickSlotDel quickSlotDelPacket;
quickSlotDelPacket.header = HEADER_CG_QUICKSLOT_DEL;
quickSlotDelPacket.pos = pos;
if (!Send(sizeof(TPacketCGQuickSlotDel), &quickSlotDelPacket))
{
Tracen("SendQuickSlotDelPacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::SendQuickSlotMovePacket(BYTE pos, BYTE change_pos)
{
if (!__CanActMainInstance())
return true;
TPacketCGQuickSlotSwap quickSlotSwapPacket;
quickSlotSwapPacket.header = HEADER_CG_QUICKSLOT_SWAP;
quickSlotSwapPacket.pos = pos;
quickSlotSwapPacket.change_pos = change_pos;
if (!Send(sizeof(TPacketCGQuickSlotSwap), &quickSlotSwapPacket))
{
Tracen("SendQuickSlotSwapPacket Error");
return false;
}
return SendSequence();
}
bool CPythonNetworkStream::RecvSpecialEffect()
{
TPacketGCSpecialEffect kSpecialEffect;
if (!Recv(sizeof(kSpecialEffect), &kSpecialEffect))
return false;
DWORD effect = -1;
bool bPlayPotionSound = false; //포션을 먹을 경우는 포션 사운드를 출력하자.!!
bool bAttachEffect = true; //캐리터에 붙는 어태치 이펙트와 일반 이펙트 구분.!!
switch (kSpecialEffect.type)
{
case SE_HPUP_RED:
effect = CInstanceBase::EFFECT_HPUP_RED;
bPlayPotionSound = true;
break;
case SE_SPUP_BLUE:
effect = CInstanceBase::EFFECT_SPUP_BLUE;
bPlayPotionSound = true;
break;
case SE_SPEEDUP_GREEN:
effect = CInstanceBase::EFFECT_SPEEDUP_GREEN;
bPlayPotionSound = true;
break;
case SE_DXUP_PURPLE:
effect = CInstanceBase::EFFECT_DXUP_PURPLE;
bPlayPotionSound = true;
break;
case SE_CRITICAL:
effect = CInstanceBase::EFFECT_CRITICAL;
break;
case SE_PENETRATE:
effect = CInstanceBase::EFFECT_PENETRATE;
break;
case SE_BLOCK:
effect = CInstanceBase::EFFECT_BLOCK;
break;
case SE_DODGE:
effect = CInstanceBase::EFFECT_DODGE;
break;
case SE_CHINA_FIREWORK:
effect = CInstanceBase::EFFECT_FIRECRACKER;
bAttachEffect = false;
break;
case SE_SPIN_TOP:
effect = CInstanceBase::EFFECT_SPIN_TOP;
bAttachEffect = false;
break;
case SE_SUCCESS :
effect = CInstanceBase::EFFECT_SUCCESS ;
bAttachEffect = false ;
break ;
case SE_FAIL :
effect = CInstanceBase::EFFECT_FAIL ;
break ;
case SE_FR_SUCCESS:
effect = CInstanceBase::EFFECT_FR_SUCCESS;
bAttachEffect = false ;
break;
case SE_LEVELUP_ON_14_FOR_GERMANY: //레벨업 14일때 ( 독일전용 )
effect = CInstanceBase::EFFECT_LEVELUP_ON_14_FOR_GERMANY;
bAttachEffect = false ;
break;
case SE_LEVELUP_UNDER_15_FOR_GERMANY: //레벨업 15일때 ( 독일전용 )
effect = CInstanceBase::EFFECT_LEVELUP_UNDER_15_FOR_GERMANY;
bAttachEffect = false ;
break;
case SE_PERCENT_DAMAGE1:
effect = CInstanceBase::EFFECT_PERCENT_DAMAGE1;
break;
case SE_PERCENT_DAMAGE2:
effect = CInstanceBase::EFFECT_PERCENT_DAMAGE2;
break;
case SE_PERCENT_DAMAGE3:
effect = CInstanceBase::EFFECT_PERCENT_DAMAGE3;
break;
case SE_AUTO_HPUP:
effect = CInstanceBase::EFFECT_AUTO_HPUP;
break;
case SE_AUTO_SPUP:
effect = CInstanceBase::EFFECT_AUTO_SPUP;
break;
case SE_EQUIP_RAMADAN_RING:
effect = CInstanceBase::EFFECT_RAMADAN_RING_EQUIP;
break;
case SE_EQUIP_HALLOWEEN_CANDY:
effect = CInstanceBase::EFFECT_HALLOWEEN_CANDY_EQUIP;
break;
case SE_EQUIP_HAPPINESS_RING:
effect = CInstanceBase::EFFECT_HAPPINESS_RING_EQUIP;
break;
case SE_EQUIP_LOVE_PENDANT:
effect = CInstanceBase::EFFECT_LOVE_PENDANT_EQUIP;
break;
default:
TraceError("%d \264\302 \276\370\264\302 \275\272\306\344\274\310 \300\314\306\345\306\256 \271\370\310\243\300\324\264\317\264\331.TPacketGCSpecialEffect",kSpecialEffect.type);
break;
}
if (bPlayPotionSound)
{
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
if(rkPlayer.IsMainCharacterIndex(kSpecialEffect.vid))
{
CPythonItem& rkItem=CPythonItem::Instance();
rkItem.PlayUsePotionSound();
}
}
if (-1 != effect)
{
CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(kSpecialEffect.vid);
if (pInstance)
{
if(bAttachEffect)
pInstance->AttachSpecialEffect(effect);
else
pInstance->CreateSpecialEffect(effect);
}
}
return true;
}
bool CPythonNetworkStream::RecvSpecificEffect()
{
TPacketGCSpecificEffect kSpecificEffect;
if (!Recv(sizeof(kSpecificEffect), &kSpecificEffect))
return false;
CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(kSpecificEffect.vid);
//EFFECT_TEMP
if (pInstance)
{
CInstanceBase::RegisterEffect(CInstanceBase::EFFECT_TEMP, "", kSpecificEffect.effect_file, false);
pInstance->AttachSpecialEffect(CInstanceBase::EFFECT_TEMP);
}
return true;
}
bool CPythonNetworkStream::RecvDragonSoulRefine()
{
TPacketGCDragonSoulRefine kDragonSoul;
if (!Recv(sizeof(kDragonSoul), &kDragonSoul))
return false;
switch (kDragonSoul.bSubType)
{
case DS_SUB_HEADER_OPEN:
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_Open", Py_BuildValue("()"));
break;
case DS_SUB_HEADER_REFINE_FAIL:
case DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE:
case DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL:
case DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY:
case DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL:
case DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL:
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_RefineFail", Py_BuildValue("(iii)",
kDragonSoul.bSubType, kDragonSoul.Pos.window_type, kDragonSoul.Pos.cell));
break;
case DS_SUB_HEADER_REFINE_SUCCEED:
PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_RefineSucceed",
Py_BuildValue("(ii)", kDragonSoul.Pos.window_type, kDragonSoul.Pos.cell));
break;
}
return true;
}
@@ -44,4 +44,5 @@ enum
// Listed here as 40250 lists them; only the ported ones are defined.
void initpack();
void initapp();
void initChat();
void initnet();