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

1139 lines
27 KiB
C++
Raw Normal View History

#include "StdAfx.h"
#include "InstanceBase.h"
#include "PythonTextTail.h"
#include "AbstractApplication.h"
#include "AbstractPlayer.h"
#include "PythonPlayer.h"
#include "PythonSystem.h"
#include "../EffectLib/EffectManager.h"
#include "../EffectLib/ParticleSystemData.h"
#include "../EterLib/Camera.h"
float CInstanceBase::ms_fDustGap;
float CInstanceBase::ms_fHorseDustGap;
DWORD CInstanceBase::ms_adwCRCAffectEffect[CInstanceBase::EFFECT_NUM];
std::string CInstanceBase::ms_astAffectEffectAttachBone[EFFECT_NUM];
#define BYTE_COLOR_TO_D3DX_COLOR(r, g, b) D3DXCOLOR(float(r)/255.0f, float(g)/255.0f, float(b)/255.0f, 1.0f)
/*
D3DXCOLOR CInstanceBase::ms_kD3DXClrPC(0xFFFFD84D);//1.0f, 0.8470f, 0.3f, 1.0f
D3DXCOLOR CInstanceBase::ms_kD3DXClrNPC(0xFF7BE85E);//0.4823f, 0.9098f, 0.3686f, 1.0f
D3DXCOLOR CInstanceBase::ms_kD3DXClrMOB(0xFFEC170a);//0.9254f, 0.0901f, 0.0392f, 1.0f
D3DXCOLOR CInstanceBase::ms_kD3DXClrPVP(0xFF8532D9);
D3DXCOLOR CInstanceBase::ms_kD3DXClrPVPSelf(0xFFEE36DF);
D3DXCOLOR CInstanceBase::ms_kD3DXClrKiller = BYTE_COLOR_TO_D3DX_COLOR(180, 100, 0);
D3DXCOLOR CInstanceBase::ms_kD3DXClrTitle[CInstanceBase::TITLE_MAX_NUM] =
{
BYTE_COLOR_TO_D3DX_COLOR( 0, 204, 255),
BYTE_COLOR_TO_D3DX_COLOR( 0, 144, 255),
BYTE_COLOR_TO_D3DX_COLOR( 92, 110, 255),
BYTE_COLOR_TO_D3DX_COLOR(155, 155, 255),
0xFFFFFFFF, // None
BYTE_COLOR_TO_D3DX_COLOR(207, 117, 0),
BYTE_COLOR_TO_D3DX_COLOR(235, 83, 0),
BYTE_COLOR_TO_D3DX_COLOR(227, 0, 0),
BYTE_COLOR_TO_D3DX_COLOR(255, 0, 0),
};
*/
D3DXCOLOR g_akD3DXClrTitle[CInstanceBase::TITLE_NUM];
D3DXCOLOR g_akD3DXClrName[CInstanceBase::NAMECOLOR_NUM];
std::map<int, std::string> g_TitleNameMap;
std::set<DWORD> g_kSet_dwPVPReadyKey;
std::set<DWORD> g_kSet_dwPVPKey;
std::set<DWORD> g_kSet_dwGVGKey;
std::set<DWORD> g_kSet_dwDUELKey;
bool g_isEmpireNameMode=false;
void CInstanceBase::SetEmpireNameMode(bool isEnable)
{
g_isEmpireNameMode=isEnable;
if (isEnable)
{
g_akD3DXClrName[NAMECOLOR_MOB]=g_akD3DXClrName[NAMECOLOR_EMPIRE_MOB];
g_akD3DXClrName[NAMECOLOR_NPC]=g_akD3DXClrName[NAMECOLOR_EMPIRE_NPC];
g_akD3DXClrName[NAMECOLOR_PC]=g_akD3DXClrName[NAMECOLOR_NORMAL_PC];
for (UINT uEmpire=1; uEmpire<EMPIRE_NUM; ++uEmpire)
g_akD3DXClrName[NAMECOLOR_PC+uEmpire]=g_akD3DXClrName[NAMECOLOR_EMPIRE_PC+uEmpire];
}
else
{
g_akD3DXClrName[NAMECOLOR_MOB]=g_akD3DXClrName[NAMECOLOR_NORMAL_MOB];
g_akD3DXClrName[NAMECOLOR_NPC]=g_akD3DXClrName[NAMECOLOR_NORMAL_NPC];
for (UINT uEmpire=0; uEmpire<EMPIRE_NUM; ++uEmpire)
g_akD3DXClrName[NAMECOLOR_PC+uEmpire]=g_akD3DXClrName[NAMECOLOR_NORMAL_PC];
}
}
const D3DXCOLOR& CInstanceBase::GetIndexedNameColor(UINT eNameColor)
{
if (eNameColor>=NAMECOLOR_NUM)
{
static D3DXCOLOR s_kD3DXClrNameDefault(0xffffffff);
return s_kD3DXClrNameDefault;
}
return g_akD3DXClrName[eNameColor];
}
void CInstanceBase::AddDamageEffect(DWORD damage,BYTE flag,BOOL bSelf,BOOL bTarget)
{
if(CPythonSystem::Instance().IsShowDamage())
{
SEffectDamage sDamage;
sDamage.bSelf = bSelf;
sDamage.bTarget = bTarget;
sDamage.damage = damage;
sDamage.flag = flag;
m_DamageQueue.push_back(sDamage);
}
}
void CInstanceBase::ProcessDamage()
{
if(m_DamageQueue.empty())
return;
SEffectDamage sDamage = m_DamageQueue.front();
m_DamageQueue.pop_front();
DWORD damage = sDamage.damage;
BYTE flag = sDamage.flag;
BOOL bSelf = sDamage.bSelf;
BOOL bTarget = sDamage.bTarget;
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
float cameraAngle = GetDegreeFromPosition2(pCamera->GetTarget().x,pCamera->GetTarget().y,pCamera->GetEye().x,pCamera->GetEye().y);
DWORD FONT_WIDTH = 30;
CEffectManager& rkEftMgr=CEffectManager::Instance();
D3DXVECTOR3 v3Pos = m_GraphicThingInstance.GetPosition();
v3Pos.z += float(m_GraphicThingInstance.GetHeight());
D3DXVECTOR3 v3Rot = D3DXVECTOR3(0.0f, 0.0f, cameraAngle);
if ( (flag & DAMAGE_DODGE) || (flag & DAMAGE_BLOCK) )
{
if(bSelf)
rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_MISS],v3Pos,v3Rot);
else
rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_TARGETMISS],v3Pos,v3Rot);
//__AttachEffect(EFFECT_DAMAGE_MISS);
return;
}
else if (flag & DAMAGE_CRITICAL)
{
//rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_CRITICAL],v3Pos,v3Rot);
//return; <20><><EFBFBD>ڵ<EFBFBD> ǥ<><C7A5>.
}
std::string strDamageType;
DWORD rdwCRCEft = 0;
/*
if ( (flag & DAMAGE_POISON) )
{
strDamageType = "poison_";
rdwCRCEft = EFFECT_DAMAGE_POISON;
}
else
*/
{
if(bSelf)
{
strDamageType = "damage_";
if(m_bDamageEffectType==0)
rdwCRCEft = EFFECT_DAMAGE_SELFDAMAGE;
else
rdwCRCEft = EFFECT_DAMAGE_SELFDAMAGE2;
m_bDamageEffectType = !m_bDamageEffectType;
}
else if(bTarget == false)
{
strDamageType = "nontarget_";
rdwCRCEft = EFFECT_DAMAGE_NOT_TARGET;
return;//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>.
}
else
{
strDamageType = "target_";
rdwCRCEft = EFFECT_DAMAGE_TARGET;
}
}
DWORD index = 0;
DWORD num = 0;
std::vector<std::string> textures;
while(damage>0)
{
if(index > 7)
{
TraceError("ProcessDamage<EFBFBD><EFBFBD><EFBFBD>ѷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ɼ<EFBFBD>");
break;
}
num = damage%10;
damage /= 10;
char numBuf[MAX_PATH];
sprintf(numBuf,"%d.dds",num);
textures.push_back("d:/ymir work/effect/affect/damagevalue/"+strDamageType+numBuf);
rkEftMgr.SetEffectTextures(ms_adwCRCAffectEffect[rdwCRCEft],textures);
D3DXMATRIX matrix,matTrans;
D3DXMatrixIdentity(&matrix);
matrix._41 = v3Pos.x;
matrix._42 = v3Pos.y;
matrix._43 = v3Pos.z;
D3DXMatrixTranslation(&matrix,v3Pos.x,v3Pos.y,v3Pos.z);
D3DXMatrixMultiply(&matrix,&pCamera->GetInverseViewMatrix(),&matrix);
D3DXMatrixTranslation(&matTrans,FONT_WIDTH*index,0,0);
matTrans._41 = -matTrans._41;
matrix = matTrans*matrix;
D3DXMatrixMultiply(&matrix,&pCamera->GetViewMatrix(),&matrix);
rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[rdwCRCEft],D3DXVECTOR3(matrix._41,matrix._42,matrix._43)
,v3Rot);
textures.clear();
index++;
}
}
void CInstanceBase::AttachSpecialEffect(DWORD effect)
{
__AttachEffect(effect);
}
void CInstanceBase::LevelUp()
{
__AttachEffect(EFFECT_LEVELUP);
}
void CInstanceBase::SkillUp()
{
__AttachEffect(EFFECT_SKILLUP);
}
void CInstanceBase::CreateSpecialEffect(DWORD iEffectIndex)
{
const D3DXMATRIX & c_rmatGlobal = m_GraphicThingInstance.GetTransform();
DWORD dwEffectIndex = CEffectManager::Instance().GetEmptyIndex();
DWORD dwEffectCRC = ms_adwCRCAffectEffect[iEffectIndex];
CEffectManager::Instance().CreateEffectInstance(dwEffectIndex, dwEffectCRC);
CEffectManager::Instance().SelectEffectInstance(dwEffectIndex);
CEffectManager::Instance().SetEffectInstanceGlobalMatrix(c_rmatGlobal);
}
void CInstanceBase::__EffectContainer_Destroy()
{
SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
SEffectContainer::Dict::iterator i;
for (i=rkDctEftID.begin(); i!=rkDctEftID.end(); ++i)
__DetachEffect(i->second);
rkDctEftID.clear();
}
void CInstanceBase::__EffectContainer_Initialize()
{
SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
rkDctEftID.clear();
}
CInstanceBase::SEffectContainer::Dict& CInstanceBase::__EffectContainer_GetDict()
{
return m_kEffectContainer.m_kDct_dwEftID;
}
// Return value <20><> boolean <20><><EFBFBD><EFBFBD> ID <20><> <20>ٲߴϴ<DFB4>
DWORD CInstanceBase::__EffectContainer_AttachEffect(DWORD dwEftKey)
{
SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
SEffectContainer::Dict::iterator f=rkDctEftID.find(dwEftKey);
if (rkDctEftID.end()!=f)
return 0;
DWORD dwEftID=__AttachEffect(dwEftKey);
rkDctEftID.insert(SEffectContainer::Dict::value_type(dwEftKey, dwEftID));
return dwEftID;
}
void CInstanceBase::__EffectContainer_DetachEffect(DWORD dwEftKey)
{
SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
SEffectContainer::Dict::iterator f=rkDctEftID.find(dwEftKey);
if (rkDctEftID.end()==f)
return;
__DetachEffect(f->second);
rkDctEftID.erase(f);
}
void CInstanceBase::__AttachEmpireEffect(DWORD eEmpire)
{
if (!__IsExistMainInstance())
return;
CInstanceBase* pkInstMain=__GetMainInstancePtr();
if (IsWarp())
return;
if (IsObject())
return;
if (IsFlag())
return;
if (IsResource())
return;
if (pkInstMain->IsGameMaster())
{
}
else
{
if (pkInstMain->IsSameEmpire(*this))
return;
// HIDE_OTHER_EMPIRE_EUNHYEONG_ASSASSIN
if (IsAffect(AFFECT_EUNHYEONG))
return;
// END_OF_HIDE_OTHER_EMPIRE_EUNHYEONG_ASSASSIN
}
if (IsGameMaster())
return;
__EffectContainer_AttachEffect(EFFECT_EMPIRE+eEmpire);
}
void CInstanceBase::__AttachSelectEffect()
{
__EffectContainer_AttachEffect(EFFECT_SELECT);
}
void CInstanceBase::__DetachSelectEffect()
{
__EffectContainer_DetachEffect(EFFECT_SELECT);
}
void CInstanceBase::__AttachTargetEffect()
{
__EffectContainer_AttachEffect(EFFECT_TARGET);
}
void CInstanceBase::__DetachTargetEffect()
{
__EffectContainer_DetachEffect(EFFECT_TARGET);
}
void CInstanceBase::__StoneSmoke_Inialize()
{
m_kStoneSmoke.m_dwEftID=0;
}
void CInstanceBase::__StoneSmoke_Destroy()
{
if (!m_kStoneSmoke.m_dwEftID)
return;
__DetachEffect(m_kStoneSmoke.m_dwEftID);
m_kStoneSmoke.m_dwEftID=0;
}
void CInstanceBase::__StoneSmoke_Create(DWORD eSmoke)
{
m_kStoneSmoke.m_dwEftID=m_GraphicThingInstance.AttachSmokeEffect(eSmoke);
}
void CInstanceBase::SetAlpha(float fAlpha)
{
__SetBlendRenderingMode();
__SetAlphaValue(fAlpha);
}
bool CInstanceBase::UpdateDeleting()
{
Update();
Transform();
IAbstractApplication& rApp=IAbstractApplication::GetSingleton();
float fAlpha = __GetAlphaValue() - (rApp.GetGlobalElapsedTime() * 1.5f);
__SetAlphaValue(fAlpha);
if (fAlpha < 0.0f)
return false;
return true;
}
void CInstanceBase::DeleteBlendOut()
{
__SetBlendRenderingMode();
__SetAlphaValue(1.0f);
DetachTextTail();
IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
rkPlayer.NotifyDeletingCharacterInstance(GetVirtualID());
}
void CInstanceBase::ClearPVPKeySystem()
{
g_kSet_dwPVPReadyKey.clear();
g_kSet_dwPVPKey.clear();
g_kSet_dwGVGKey.clear();
g_kSet_dwDUELKey.clear();
}
void CInstanceBase::InsertPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
g_kSet_dwPVPKey.insert(dwPVPKey);
}
void CInstanceBase::InsertPVPReadyKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
DWORD dwPVPReadyKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
g_kSet_dwPVPKey.insert(dwPVPReadyKey);
}
void CInstanceBase::RemovePVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
g_kSet_dwPVPKey.erase(dwPVPKey);
}
void CInstanceBase::InsertGVGKey(DWORD dwSrcGuildVID, DWORD dwDstGuildVID)
{
DWORD dwGVGKey = __GetPVPKey(dwSrcGuildVID, dwDstGuildVID);
g_kSet_dwGVGKey.insert(dwGVGKey);
}
void CInstanceBase::RemoveGVGKey(DWORD dwSrcGuildVID, DWORD dwDstGuildVID)
{
DWORD dwGVGKey = __GetPVPKey(dwSrcGuildVID, dwDstGuildVID);
g_kSet_dwGVGKey.erase(dwGVGKey);
}
void CInstanceBase::InsertDUELKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
g_kSet_dwDUELKey.insert(dwPVPKey);
}
DWORD CInstanceBase::__GetPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
if (dwVIDSrc>dwVIDDst)
std::swap(dwVIDSrc, dwVIDDst);
DWORD awSrc[2];
awSrc[0]=dwVIDSrc;
awSrc[1]=dwVIDDst;
const BYTE * s = (const BYTE *) awSrc;
const BYTE * end = s + sizeof(awSrc);
unsigned long h = 0;
while (s < end)
{
h *= 16777619;
h ^= (BYTE) *(BYTE *) (s++);
}
return h;
}
bool CInstanceBase::__FindPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
if (g_kSet_dwPVPKey.end()==g_kSet_dwPVPKey.find(dwPVPKey))
return false;
return true;
}
bool CInstanceBase::__FindPVPReadyKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
if (g_kSet_dwPVPReadyKey.end()==g_kSet_dwPVPReadyKey.find(dwPVPKey))
return false;
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ҷ<EFBFBD>.
bool CInstanceBase::__FindGVGKey(DWORD dwSrcGuildID, DWORD dwDstGuildID)
{
DWORD dwGVGKey=__GetPVPKey(dwSrcGuildID, dwDstGuildID);
if (g_kSet_dwGVGKey.end()==g_kSet_dwGVGKey.find(dwGVGKey))
return false;
return true;
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BFA1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
bool CInstanceBase::__FindDUELKey(DWORD dwVIDSrc, DWORD dwVIDDst)
{
DWORD dwDUELKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
if (g_kSet_dwDUELKey.end()==g_kSet_dwDUELKey.find(dwDUELKey))
return false;
return true;
}
bool CInstanceBase::IsPVPInstance(CInstanceBase& rkInstSel)
{
DWORD dwVIDSrc=GetVirtualID();
DWORD dwVIDDst=rkInstSel.GetVirtualID();
DWORD dwGuildIDSrc=GetGuildID();
DWORD dwGuildIDDst=rkInstSel.GetGuildID();
if (GetDuelMode()) //<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> ~_~
return true;
return __FindPVPKey(dwVIDSrc, dwVIDDst) || __FindGVGKey(dwGuildIDSrc, dwGuildIDDst);
//__FindDUELKey(dwVIDSrc, dwVIDDst);
}
const D3DXCOLOR& CInstanceBase::GetNameColor()
{
return GetIndexedNameColor(GetNameColorIndex());
}
UINT CInstanceBase::GetNameColorIndex()
{
if (IsPC())
{
if (m_isKiller)
{
return NAMECOLOR_PK;
}
if (__IsExistMainInstance() && !__IsMainInstance())
{
CInstanceBase* pkInstMain=__GetMainInstancePtr();
if (!pkInstMain)
{
TraceError("CInstanceBase::GetNameColorIndex - MainInstance is NULL");
return NAMECOLOR_PC;
}
DWORD dwVIDMain=pkInstMain->GetVirtualID();
DWORD dwVIDSelf=GetVirtualID();
if (pkInstMain->GetDuelMode())
{
switch(pkInstMain->GetDuelMode())
{
case DUEL_CANNOTATTACK:
return NAMECOLOR_PC + GetEmpireID();
case DUEL_START:
if(__FindDUELKey(dwVIDMain, dwVIDSelf))
return NAMECOLOR_PVP;
else
return NAMECOLOR_PC + GetEmpireID();
}
}
if (pkInstMain->IsSameEmpire(*this))
{
if (__FindPVPKey(dwVIDMain, dwVIDSelf))
{
return NAMECOLOR_PVP;
}
DWORD dwGuildIDMain=pkInstMain->GetGuildID();
DWORD dwGuildIDSelf=GetGuildID();
if (__FindGVGKey(dwGuildIDMain, dwGuildIDSelf))
{
return NAMECOLOR_PVP;
}
/*
if (__FindDUELKey(dwVIDMain, dwVIDSelf))
{
return NAMECOLOR_PVP;
}
*/
}
else
{
return NAMECOLOR_PVP;
}
}
IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
if (rPlayer.IsPartyMemberByVID(GetVirtualID()))
return NAMECOLOR_PARTY;
return NAMECOLOR_PC + GetEmpireID();
}
else if (IsNPC())
{
return NAMECOLOR_NPC;
}
else if (IsEnemy())
{
return NAMECOLOR_MOB;
}
else if (IsPoly())
{
return NAMECOLOR_MOB;
}
return D3DXCOLOR(0xffffffff);
}
const D3DXCOLOR& CInstanceBase::GetTitleColor()
{
UINT uGrade = GetAlignmentGrade();
if ( uGrade >= TITLE_NUM)
{
static D3DXCOLOR s_kD3DXClrTitleDefault(0xffffffff);
return s_kD3DXClrTitleDefault;
}
return g_akD3DXClrTitle[uGrade];
}
void CInstanceBase::AttachTextTail()
{
if (m_isTextTail)
{
TraceError("CInstanceBase::AttachTextTail - VID [%d] ALREADY EXIST", GetVirtualID());
return;
}
m_isTextTail=true;
DWORD dwVID=GetVirtualID();
float fTextTailHeight=IsMountingHorse() ? 110.0f : 10.0f;
static D3DXCOLOR s_kD3DXClrTextTail=D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
CPythonTextTail::Instance().RegisterCharacterTextTail(m_dwGuildID, dwVID, s_kD3DXClrTextTail, fTextTailHeight);
// CHARACTER_LEVEL
if (m_dwLevel)
{
UpdateTextTailLevel(m_dwLevel);
}
}
void CInstanceBase::DetachTextTail()
{
if (!m_isTextTail)
return;
m_isTextTail=false;
CPythonTextTail::Instance().DeleteCharacterTextTail(GetVirtualID());
}
void CInstanceBase::UpdateTextTailLevel(DWORD level)
{
//static D3DXCOLOR s_kLevelColor = D3DXCOLOR(119.0f/255.0f, 246.0f/255.0f, 168.0f/255.0f, 1.0f);
static D3DXCOLOR s_kLevelColor = D3DXCOLOR(152.0f/255.0f, 255.0f/255.0f, 51.0f/255.0f, 1.0f);
char szText[256];
sprintf(szText, "Lv %d", level);
CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kLevelColor);
}
void CInstanceBase::RefreshTextTail()
{
CPythonTextTail::Instance().SetCharacterTextTailColor(GetVirtualID(), GetNameColor());
int iAlignmentGrade = GetAlignmentGrade();
if (TITLE_NONE == iAlignmentGrade)
{
CPythonTextTail::Instance().DetachTitle(GetVirtualID());
}
else
{
std::map<int, std::string>::iterator itor = g_TitleNameMap.find(iAlignmentGrade);
if (g_TitleNameMap.end() != itor)
{
const std::string & c_rstrTitleName = itor->second;
CPythonTextTail::Instance().AttachTitle(GetVirtualID(), c_rstrTitleName.c_str(), GetTitleColor());
}
}
}
void CInstanceBase::RefreshTextTailTitle()
{
RefreshTextTail();
}
// 2004.07.25.myevan.<2E><><EFBFBD><EFBFBD>Ʈ <20><> <20>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ذ<EFBFBD>
/////////////////////////////////////////////////
void CInstanceBase::__ClearAffectFlagContainer()
{
m_kAffectFlagContainer.Clear();
}
void CInstanceBase::__ClearAffects()
{
if (IsStone())
{
__StoneSmoke_Destroy();
}
else
{
for (int iAffect=0; iAffect<AFFECT_NUM; ++iAffect)
{
__DetachEffect(m_adwCRCAffectEffect[iAffect]);
m_adwCRCAffectEffect[iAffect]=0;
}
__ClearAffectFlagContainer();
}
m_GraphicThingInstance.__OnClearAffects();
}
/////////////////////////////////////////////////
void CInstanceBase::__SetNormalAffectFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
{
for (int i=0; i<CAffectFlagContainer::BIT_SIZE; ++i)
{
bool isOldSet=m_kAffectFlagContainer.IsSet(i);
bool isNewSet=c_rkAffectFlagContainer.IsSet(i);
if (isOldSet != isNewSet)
{
__SetAffect(i, isNewSet);
if (isNewSet)
m_GraphicThingInstance.__OnSetAffect(i);
else
m_GraphicThingInstance.__OnResetAffect(i);
}
}
m_kAffectFlagContainer.CopyInstance(c_rkAffectFlagContainer);
}
void CInstanceBase::__SetStoneSmokeFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
{
m_kAffectFlagContainer.CopyInstance(c_rkAffectFlagContainer);
DWORD eSmoke;
if (m_kAffectFlagContainer.IsSet(STONE_SMOKE8))
eSmoke=3;
else if (m_kAffectFlagContainer.IsSet(STONE_SMOKE5)|m_kAffectFlagContainer.IsSet(STONE_SMOKE6)|m_kAffectFlagContainer.IsSet(STONE_SMOKE7))
eSmoke=2;
else if (m_kAffectFlagContainer.IsSet(STONE_SMOKE2)|m_kAffectFlagContainer.IsSet(STONE_SMOKE3)|m_kAffectFlagContainer.IsSet(STONE_SMOKE4))
eSmoke=1;
else
eSmoke=0;
__StoneSmoke_Destroy();
__StoneSmoke_Create(eSmoke);
}
void CInstanceBase::SetAffectFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
{
if (IsBuilding())
{
return;
}
else if (IsStone())
{
__SetStoneSmokeFlagContainer(c_rkAffectFlagContainer);
}
else
{
__SetNormalAffectFlagContainer(c_rkAffectFlagContainer);
}
}
void CInstanceBase::SCRIPT_SetAffect(UINT eAffect, bool isVisible)
{
__SetAffect(eAffect, isVisible);
}
void CInstanceBase::__SetReviveInvisibilityAffect(bool isVisible)
{
if (isVisible)
{
// NOTE : Dress <20><> <20>԰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Alpha <20><> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if (IsWearingDress())
return;
m_GraphicThingInstance.BlendAlphaValue(0.5f, 1.0f);
}
else
{
m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
}
}
void CInstanceBase::__Assassin_SetEunhyeongAffect(bool isVisible)
{
if (isVisible)
{
// NOTE : Dress <20><> <20>԰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Alpha <20><> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if (IsWearingDress())
return;
if (__IsMainInstance() || __MainCanSeeHiddenThing())
{
m_GraphicThingInstance.BlendAlphaValue(0.5f, 1.0f);
}
else
{
// 2004.10.16.myevan.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_GraphicThingInstance.BlendAlphaValue(0.0f, 1.0f);
m_GraphicThingInstance.HideAllAttachingEffect();
}
}
else
{
m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
m_GraphicThingInstance.ShowAllAttachingEffect();
}
}
void CInstanceBase::__Shaman_SetParalysis(bool isParalysis)
{
m_GraphicThingInstance.SetParalysis(isParalysis);
}
void CInstanceBase::__Warrior_SetGeomgyeongAffect(bool isVisible)
{
if (isVisible)
{
if (IsWearingDress())
return;
if (m_kWarrior.m_dwGeomgyeongEffect)
__DetachEffect(m_kWarrior.m_dwGeomgyeongEffect);
m_GraphicThingInstance.SetReachScale(1.5f);
if (m_GraphicThingInstance.IsTwoHandMode())
m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+WEAPON_TWOHAND);
else
m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+WEAPON_ONEHAND);
}
else
{
m_GraphicThingInstance.SetReachScale(1.0f);
__DetachEffect(m_kWarrior.m_dwGeomgyeongEffect);
m_kWarrior.m_dwGeomgyeongEffect=0;
}
}
void CInstanceBase::__SetAffect(UINT eAffect, bool isVisible)
{
switch (eAffect)
{
case AFFECT_YMIR:
if (IsAffect(AFFECT_INVISIBILITY))
return;
break;
/*
case AFFECT_GWIGEOM: // <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (isVisible)
{
m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_ELECTRIC_HIT]);
m_GraphicThingInstance.SetBattleAttachEffect(ms_adwCRCAffectEffect[EFFECT_ELECTRIC_ATTACH]);
}
else
{
m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
m_GraphicThingInstance.SetBattleAttachEffect(0);
}
return;
break;
case AFFECT_HWAYEOM: // ȭ<><C8AD> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (isVisible)
{
m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_FLAME_HIT]);
m_GraphicThingInstance.SetBattleAttachEffect(ms_adwCRCAffectEffect[EFFECT_FLAME_ATTACH]);
}
else
{
m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
m_GraphicThingInstance.SetBattleAttachEffect(0);
}
// ȭ<><C8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ͻ<EFBFBD><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Visible <20>մϴ<D5B4>.
return;
break;
*/
case AFFECT_CHEONGEUN:
m_GraphicThingInstance.SetResistFallen(isVisible);
break;
case AFFECT_GEOMGYEONG:
__Warrior_SetGeomgyeongAffect(isVisible);
return;
break;
case AFFECT_REVIVE_INVISIBILITY:
__Assassin_SetEunhyeongAffect(isVisible);
break;
case AFFECT_EUNHYEONG:
__Assassin_SetEunhyeongAffect(isVisible);
break;
case AFFECT_GYEONGGONG:
case AFFECT_KWAESOK:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۶<EFBFBD><DBB6><EFBFBD> Attaching <20><>ŵ<EFBFBD>ϴ<EFBFBD>. - [levites]
if (isVisible)
if (!IsWalking())
return;
break;
case AFFECT_INVISIBILITY:
// 2004.07.17.levites.isShow<6F><77> ViewFrustumCheck<63><6B> <20><><EFBFBD><EFBFBD>
if (isVisible)
{
m_GraphicThingInstance.ClearAttachingEffect();
__EffectContainer_Destroy();
DetachTextTail();
}
else
{
m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
AttachTextTail();
RefreshTextTail();
}
return;
break;
// case AFFECT_FAINT:
// m_GraphicThingInstance.SetFaint(isVisible);
// break;
// case AFFECT_SLEEP:
// m_GraphicThingInstance.SetSleep(isVisible);
// break;
case AFFECT_STUN:
m_GraphicThingInstance.SetSleep(isVisible);
break;
}
if (eAffect>=AFFECT_NUM)
{
TraceError("CInstanceBase[VID:%d]::SetAffect(eAffect:%d<AFFECT_NUM:%d, isVisible=%d)", GetVirtualID(), eAffect, isVisible);
return;
}
if (isVisible)
{
if (!m_adwCRCAffectEffect[eAffect])
{
m_adwCRCAffectEffect[eAffect]=__AttachEffect(EFFECT_AFFECT+eAffect);
}
}
else
{
if (m_adwCRCAffectEffect[eAffect])
{
__DetachEffect(m_adwCRCAffectEffect[eAffect]);
m_adwCRCAffectEffect[eAffect]=0;
}
}
}
bool CInstanceBase::IsPossibleEmoticon()
{
CEffectManager& rkEftMgr=CEffectManager::Instance();
for(DWORD eEmoticon = 0; eEmoticon < EMOTICON_NUM; eEmoticon++)
{
DWORD effectID = ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon];
if( effectID && rkEftMgr.IsAliveEffect(effectID) )
return false;
}
if(ELTimer_GetMSec() - m_dwEmoticonTime < 1000)
{
TraceError("ELTimer_GetMSec() - m_dwEmoticonTime");
return false;
}
return true;
}
void CInstanceBase::SetFishEmoticon()
{
SetEmoticon(EMOTICON_FISH);
}
void CInstanceBase::SetEmoticon(UINT eEmoticon)
{
if (eEmoticon>=EMOTICON_NUM)
{
TraceError("CInstanceBase[VID:%d]::SetEmoticon(eEmoticon:%d<EMOTICON_NUM:%d, isVisible=%d)",
GetVirtualID(), eEmoticon);
return;
}
if (IsPossibleEmoticon())
{
D3DXVECTOR3 v3Pos = m_GraphicThingInstance.GetPosition();
v3Pos.z += float(m_GraphicThingInstance.GetHeight());
//CEffectManager& rkEftMgr=CEffectManager::Instance();
CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
D3DXVECTOR3 v3Dir = (pCamera->GetEye()-v3Pos)*9/10;
v3Pos = pCamera->GetEye()-v3Dir;
v3Pos = D3DXVECTOR3(0,0,0);
v3Pos.z += float(m_GraphicThingInstance.GetHeight());
//rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon],v3Pos,D3DXVECTOR3(0,0,0));
m_GraphicThingInstance.AttachEffectByID(0, NULL, ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon],&v3Pos);
m_dwEmoticonTime = ELTimer_GetMSec();
}
}
void CInstanceBase::SetDustGap(float fDustGap)
{
ms_fDustGap=fDustGap;
}
void CInstanceBase::SetHorseDustGap(float fDustGap)
{
ms_fHorseDustGap=fDustGap;
}
void CInstanceBase::__DetachEffect(DWORD dwEID)
{
m_GraphicThingInstance.DettachEffect(dwEID);
}
DWORD CInstanceBase::__AttachEffect(UINT eEftType)
{
// 2004.07.17.levites.isShow<6F><77> ViewFrustumCheck<63><6B> <20><><EFBFBD><EFBFBD>
if (IsAffect(AFFECT_INVISIBILITY))
return 0;
if (eEftType>=EFFECT_NUM)
return 0;
if (ms_astAffectEffectAttachBone[eEftType].empty())
{
return m_GraphicThingInstance.AttachEffectByID(0, NULL, ms_adwCRCAffectEffect[eEftType]);
}
else
{
std::string & rstrBoneName = ms_astAffectEffectAttachBone[eEftType];
const char * c_szBoneName;
// <20><><EFBFBD>տ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <20>̷<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Equip <20><> Bone Name <20><> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD>.
if (0 == rstrBoneName.compare("PART_WEAPON"))
{
if (m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON, &c_szBoneName))
{
return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType]);
}
}
else if (0 == rstrBoneName.compare("PART_WEAPON_LEFT"))
{
if (m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON_LEFT, &c_szBoneName))
{
return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType]);
}
}
else
{
return m_GraphicThingInstance.AttachEffectByID(0, rstrBoneName.c_str(), ms_adwCRCAffectEffect[eEftType]);
}
}
return 0;
}
void CInstanceBase::__ComboProcess()
{
/*
DWORD dwcurComboIndex = m_GraphicThingInstance.GetComboIndex();
if (0 != dwcurComboIndex)
{
if (m_dwLastComboIndex != m_GraphicThingInstance.GetComboIndex())
{
if (!m_GraphicThingInstance.IsHandMode() & IsAffect(AFFECT_HWAYEOM))
{
__AttachEffect(EFFECT_FLAME_ATTACK);
}
}
}
m_dwLastComboIndex = dwcurComboIndex;
*/
}
bool CInstanceBase::RegisterEffect(UINT eEftType, const char* c_szEftAttachBone, const char* c_szEftName, bool isCache)
{
if (eEftType>=EFFECT_NUM)
return false;
ms_astAffectEffectAttachBone[eEftType]=c_szEftAttachBone;
DWORD& rdwCRCEft=ms_adwCRCAffectEffect[eEftType];
if (!CEffectManager::Instance().RegisterEffect2(c_szEftName, &rdwCRCEft, isCache))
{
TraceError("CInstanceBase::RegisterEffect(eEftType=%d, c_szEftAttachBone=%s, c_szEftName=%s, isCache=%d) - Error", eEftType, c_szEftAttachBone, c_szEftName, isCache);
rdwCRCEft=0;
return false;
}
return true;
}
void CInstanceBase::RegisterTitleName(int iIndex, const char * c_szTitleName)
{
g_TitleNameMap.insert(std::make_pair(iIndex, c_szTitleName));
}
D3DXCOLOR __RGBToD3DXColoru(UINT r, UINT g, UINT b)
{
DWORD dwColor=0xff;dwColor<<=8;
dwColor|=r;dwColor<<=8;
dwColor|=g;dwColor<<=8;
dwColor|=b;
return D3DXCOLOR(dwColor);
}
bool CInstanceBase::RegisterNameColor(UINT uIndex, UINT r, UINT g, UINT b)
{
if (uIndex>=NAMECOLOR_NUM)
return false;
g_akD3DXClrName[uIndex]=__RGBToD3DXColoru(r, g, b);
return true;
}
bool CInstanceBase::RegisterTitleColor(UINT uIndex, UINT r, UINT g, UINT b)
{
if (uIndex>=TITLE_NUM)
return false;
g_akD3DXClrTitle[uIndex]=__RGBToD3DXColoru(r, g, b);
return true;
}