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

1139 lines
27 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

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

#include "StdAfx.h"
#include "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;
}