Bvural41 1
Bvural41
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle
Kaynak ikonu

Altın Konu Lorenzo - Altyapı Server Files 2025 (Sistemli) v.2

indirmek için izniniz yok
5.00 yıldız(lar) 13 Değerlendirme Değerlendirenler

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

Oyunda ışınlanırken, pazarları görüntülerken ve metinden düşen itemler menzilden çıkıp girildiğinde silinirken ki bir hatayı düzeltir, ayrıca c- dilinden c++ dönüştürülmüş bir betiktir güvenlik açıklarını ve sistem performans düzeltmelerini içerir (10-100-1000 karakter/item varsa yazılar üst üste binerek fps düşüşü yaptığı bir hatayı düzeltir)

İşlemi yapmadan önce yedek almayı unutmayın

[CODE lang="cpp" title="PythonTextTail.cpp"]
//
//
#include "stdafx.h"
#include "InstanceBase.h"
#in#includeesource.h"
##include"PythonTextTail.h"#includee "PythonChara##includeer.h"
#include "Pyt#include.h"
#include "Locale.h"
#inc#includerkManager.h"
#ifd#includeE_NEW_SHOP_I#include
#include "Python#ifdefation.h"
#endif

const D3DX#includeTextTail_Player_Color =#endifOLOR(1.0f, 1.0f, 1.0f, 1.0f);
const D3DXCOLOR c_TextTail_Monster_Color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
const D3DXCOLOR c_TextTail_Item_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
const D3DXCOLOR c_TextTail_Chat_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
const D3DXCOLOR c_TextTail_Info_Color = D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f);
const D3DXCOLOR c_TextTail_Guild_Name_Color = 0xFFEFD3FF;
const float c_TextTail_Name_Position = -10.0f;
const float c_fxMarkPosition = 1.5f;
#ifdef TITLE_SYSTEM
const float c_fyGuildNamePosi#ifdef 25.0f;
const float c_fyMarkPosition = 25.0f + 11.0f;
const float c_fysTitlePosition = 16.0f;
const float c_fyGuildNamePositionOld = 15.0f;
const float c_fyMarkPositionOld = 15.0f + 11.0f;
#else
const float c_fyGuildNamePosition = 15.0f;
#else float c_fyMarkPosition = 15.0f + 11.0f;
#en#elseOOL bPKTitleEnable = TRUE;

// TEXTTAIL_L#endifIME_CONTROL
long gs_TextTail_LivingTime = 5000;

long TextTail_GetLivingTime()
{
assert(gs_TextTail_LivingTime>1000);
return gs_TextTail_LivingTime;
}

void TextTail_SetLivingTime(long livingTime)
{
gs_TextTail_LivingTime = livingTime;
}
// END_OF_TEXTTAIL_LIVINGTIME_CONTROL

CGraphicText * ms_pFont = NULL;

void CPythonTextTail::GetInfo(std::string* pstInfo)
{
char szInfo[256];
sprintf(szInfo, "TextTail: ChatTail %d, ChrTail (Map %d, List %d), ItemTail (Map %d, List %d), Pool %d",
m_ChatTailMap.size(),
m_CharacterTextTailMap.size(), m_CharacterTextTailList.size(),
m_ItemTextTailMap.size(), m_ItemTextTailList.size(),
m_TextTailPool.GetCapacity());

pstInfo->append(szInfo);
}

void CPythonTextTail::UpdateAllTextTail()
{
CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr();
if (pInstance)
{
TPixelPosition pixelPos;
pInstance->NEW_GetPixelPosition(&pixelPos);

TTextTailMap::iterator itorMap;

for (itorMap = m_CharacterTextTailMap.begin(); itorMap != m_CharacterTextTailMap.end(); ++itorMap)
{
UpdateDistance(pixelPos, itorMap->second);
}

for (itorMap = m_ItemTextTailMap.begin(); itorMap != m_ItemTextTailMap.end(); ++itorMap)
{
UpdateDistance(pixelPos, itorMap->second);
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (ito#ifdef m_ShopTextTailMap.begin(); itorMap != m_ShopTextTailMap.end(); ++itorMap)
UpdateDistance(pixelPos, itorMap->second);
#endif

for (TChatTailMap::iterator itorC#endifChatTailMap.begin(); itorChat!=m_ChatTailMap.end(); ++itorChat)
{
UpdateDistance(pixelPos, itorChat->second);

if (itorChat->second->bNameFlag)
{
DWORD dwVID = itorChat->first;
ShowCharacterTextTail(dwVID);
}
}
}
}

void CPythonTextTail::UpdateShowingTextTail()
{
TTextTailList::iterator itor;

for (itor = m_ItemTextTailList.begin(); itor != m_ItemTextTailList.end(); ++itor)
{
UpdateTextTail(*itor);
}

for (TChatTailMap::iterator itorChat=m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end(); ++itorChat)
{
UpdateTextTail(itorChat->second);
}
#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto it#ifdef= m_ShopTextTailMap.begin(); itorMap != m_ShopTextTailMap.end(); ++itorMap)
if (itorMap->second->bRender)
UpdateTextTail(itorMap->second);
#endif
for (itor = m_CharacterTextTailList.be#endif itor != m_CharacterTextTailList.end(); ++itor)
{
TTextTail * pTextTail = *itor;
UpdateTextTail(pTextTail);

TChatTailMap::iterator itor = m_ChatTailMap.find(pTextTail->dwVirtualID);
if (m_ChatTailMap.end() != itor)
{
TTextTail * pChatTail = itor->second;
if (pChatTail->bNameFlag)
{
pTextTail->y = pChatTail->y - 17.0f;
}
}
}
}

void CPythonTextTail::UpdateTextTail(TTextTail * pTextTail)
{
if (!pTextTail->pOwner)
return;

/////

CPythonGraphic & rpyGraphic = CPythonGraphic::Instance();
rpyGraphic.Identity();

const D3DXVECTOR3 & c_rv3Position = pTextTail->pOwner->GetPosition();
rpyGraphic.ProjectPosition(c_rv3Position.x,
c_rv3Position.y,
c_rv3Position.z + pTextTail->fHeight,
&pTextTail->x,
&pTextTail->y,
&pTextTail->z);

pTextTail->x = floorf(pTextTail->x);
pTextTail->y = floorf(pTextTail->y);

if (pTextTail->fDistanceFromPlayer < 1300.0f)
{
pTextTail->z = 0.0f;
}
else
{
pTextTail->z = pTextTail->z * CPythonGraphic::Instance().GetOrthoDepth() * -1.0f;
pTextTail->z += 10.0f;
}
}

void CPythonTextTail::ArrangeTextTail()
{
TTextTailList::iterator itor;
TTextTailList::iterator itorCompare;

DWORD dwTime = CTimer::Instance().GetCurrentMillisecond();

for (itor = m_ItemTextTailList.begin(); itor != m_ItemTextTailList.end(); ++itor)
{
TTextTail * pInsertTextTail = *itor;

int yTemp = 5;
int LimitCount = 0;

for (itorCompare = m_ItemTextTailList.begin(); itorCompare != m_ItemTextTailList.end();)
{
TTextTail * pCompareTextTail = *itorCompare;

if (*itorCompare == *itor)
{
++itorCompare;
continue;
}

if (LimitCount >= 20)
break;

if (isIn(pInsertTextTail, pCompareTextTail))
{
pInsertTextTail->y = (pCompareTextTail->y + pCompareTextTail->yEnd + yTemp);

itorCompare = m_ItemTextTailList.begin();
++LimitCount;
continue;
}

++itorCompare;
}


if (pInsertTextTail->pOwnerTextInstance)
{
pInsertTextTail->pOwnerTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
pInsertTextTail->pOwnerTextInstance->Update();

pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y + 15.0f, pInsertTextTail->z);
pInsertTextTail->pTextInstance->Update();

}
else
{
pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
pInsertTextTail->pTextInstance->Update();

}
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto it#ifdef= m_ShopTextTailMap.begin(); itorMap != m_ShopTextTailMap.end(); ++itorMap)
{
if (!itorMap->second->bRender)
continue;

TTextTail* pInsertTextTail = itorMap->second;

if (pInsertTextTail->pOwnerTextInstance)
{
pInsertTextTail->pOwnerTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
pInsertTextTail->pOwnerTextInstance->Update();

pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y + 15.0f, pInsertTextTail->z);
pInsertTextTail->pTextInstance->Update();

}
else
{
pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
pInsertTextTail->pTextInstance->Update();

}
}
#endif

for (itor = m_CharacterTextTailList.b#endif; itor != m_CharacterTextTailList.end(); ++itor)
{
TTextTail * pTextTail = *itor;

float fxAdd = 0.0f;

#ifdef TITLE_SYSTEM
CGraphicTextInstance*#ifdefleNameInstance = pTextTail->psTitleNameTextInstance;
if (psTitleNameInstance)
{
int iWidth, iHeight;
psTitleNameInstance->GetTextSize(&iWidth, &iHeight);
psTitleNameInstance->SetPosition(pTextTail->x, pTextTail->y - c_fysTitlePosition, pTextTail->z);
psTitleNameInstance->Update();
}
#endif

CGraphicMarkInstance * pMarkInsta#endifpTextTail->pMarkInstance;
CGraphicTextInstance * pGuildNameInstance = pTextTail->pGuildNameTextInstance;
#ifdef ENABLE_PLAYTIME_ICON
CGraphicImage#ifdefce * pPlayTime = pTextTail->pPlayTimeInstance, pGuildNameTextInstance;
#endif
if (pMarkInstance && pGuildNameIns#endif
{
int iWidth, iHeight;
int iImageHalfSize = pMarkInstance->GetWidth()/2 + c_fxMarkPosition;
pGuildNameInstance->GetTextSize(&iWidth, &iHeight);

#ifdef TITLE_SYSTEM
if (!psTitleNameI#ifdefe)
{
pMarkInstance->SetPosition(pTextTail->x - iWidth / 2 - iImageHalfSize, pTextTail->y - c_fyMarkPositionOld);
pGuildNameInstance->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePositionOld, pTextTail->z);
}
else
{
pMarkInstance->SetPosition(pTextTail->x - iWidth / 2 - iImageHalfSize, pTextTail->y - c_fyMarkPosition);
pGuildNameInstance->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePosition, pTextTail->z);
}
#else
pMarkInstance->SetPosition(pTex#else->x - iWidth / 2 - iImageHalfSize, pTextTail->y - c_fyMarkPosition);
pGuildNameInstance->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePosition, pTextTail->z);
#endif
pGuildNameInstance->Update();
#endif }

int iNameWidth, iNameHeight;
#endif pTextTail->pTextInstance->GetTextSize(&iNameWidth, &iNameHeight);

CGraphicTextInstance * pTitle = pTextTail->pTitleTextInstance;
if (pTitle)
{
int iTitleWidth, iTitleHeight;
pTitle->GetTextSize(&iTitleWidth, &iTitleHeight);

fxAdd = 8.0f;

if (LocaleService_IsEUROPE())
{
if( GetDefaultCodePage() == CP_ARABIC )
{
pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth - 4.0f, pTextTail->y, pTextTail->z);
}
else
{
pTitle->SetPosition(pTextTail->x - (iNameWidth / 2), pTextTail->y, pTextTail->z);
}
}
else
{
pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd, pTextTail->y, pTextTail->z);
}
pTitle->Update();

CGraphicTextInstance * pLevel = pTextTail->pLevelTextInstance;
if (pLevel)
{
int iLevelWidth, iLevelHeight;
pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);

if (LocaleService_IsEUROPE())
{
if( GetDefaultCodePage() == CP_ARABIC )
{
pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iLevelWidth - iTitleWidth - 8.0f, pTextTail->y, pTextTail->z);
}
else
{
pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth, pTextTail->y, pTextTail->z);
}
}
else
{
pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd - iTitleWidth, pTextTail->y, pTextTail->z);
}

pLevel->Update();
}
}
else
{
fxAdd = 4.0f;

CGraphicTextInstance * pLevel = pTextTail->pLevelTextInstance;
if (pLevel)
{
int iLevelWidth, iLevelHeight;
pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);

if (LocaleService_IsEUROPE())
{
if( GetDefaultCodePage() == CP_ARABIC )
{
pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iLevelWidth - 4.0f, pTextTail->y, pTextTail->z);
}
else
{
pLevel->SetPosition(pTextTail->x - (iNameWidth / 2), pTextTail->y, pTextTail->z);
}
}
else
{
pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd, pTextTail->y, pTextTail->z);
}

pLevel->Update();
}
}

#ifdef ENABLE_PLAYTIME_ICON
if (pPlayTime#ifdef {
CGraphicTextInstance* pLevel = pTextTail->pLevelTextInstance;

if (pLevel)
{
int iLevelWidth, iLevelHeight, iTitleWidth, iTitleHeight;
pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);
if (pTitle)
{
pTitle->GetTextSize(&iTitleWidth, &iTitleHeight);
pPlayTime->SetPosition(pTextTail->x - (iNameWidth / 2) - 4.0f - iTitleWidth - iLevelWidth - 17.0f - pPlayTime->GetWidth() / 2 + 8.5f, pTextTail->y - 14);
}
if (!pTitle)
pPlayTime->SetPosition(pTextTail->x - (iNameWidth / 2) - 4.0f - iLevelWidth - 17.0f - pPlayTime->GetWidth() / 2 + 8.5f, pTextTail->y - 14);
}
}
#endif

pTextTail->pTextInstance->SetColo#endiftTail->Color.r, pTextTail->Color.g, pTextTail->Color.b);
pTextTail->pTextInstance->SetPosition(pTextTail->x + fxAdd, pTextTail->y, pTextTail->z);
pTextTail->pTextInstance->Update();
}

for (TChatTailMap::iterator itorChat=m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end();)
{
TTextTail * pTextTail = itorChat->second;

if (pTextTail->LivingTime < dwTime)
{
DeleteTextTail(pTextTail);
itorChat = m_ChatTailMap.erase(itorChat);
continue;
}
else
++itorChat;

pTextTail->pTextInstance->SetColor(pTextTail->Color);
pTextTail->pTextInstance->SetPosition(pTextTail->x, pTextTail->y, pTextTail->z);
pTextTail->pTextInstance->Update();
}
}

void CPythonTextTail::Render()
{
TTextTailList::iterator itor;

for (itor = m_CharacterTextTailList.begin(); itor != m_CharacterTextTailList.end(); ++itor)
{
TTextTail * pTextTail = *itor;
pTextTail->pTextInstance->Render();
if (pTextTail->pMarkInstance && pTextTail->pGuildNameTextInstance)
{
pTextTail->pMarkInstance->Render();
pTextTail->pGuildNameTextInstance->Render();
}
if (pTextTail->pTitleTextInstance)
{
pTextTail->pTitleTextInstance->Render();
}
if (pTextTail->pLevelTextInstance)
{
pTextTail->pLevelTextInstance->Render();
}
#ifdef TITLE_SYSTEM
if (pTextTail->psTitl#ifdefextInstance)
{
pTextTail->psTitleNameTextInstance->Render();
}
#endif
#ifdef ENABLE_PLAYTIME_ICON
if (pT#endifl#ifdefyTimeInstance)
{
pTextTail->pPlayTimeInstance->Render();
}
#endif
}

for (itor = m_ItemTextTailList.#endif); itor != m_ItemTextTailList.end(); ++itor)
{
TTextTail * pTextTail = *itor;

RenderTextTailBox(pTextTail);
pTextTail->pTextInstance->Render();
if (pTextTail->pOwnerTextInstance)
pTextTail->pOwnerTextInstance->Render();
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto it#ifdef= m_ShopTextTailMap.begin(); itorMap != m_ShopTextTailMap.end(); ++itorMap)
{
if (!itorMap->second->bRender)
continue;

TTextTail* pTextTail = itorMap->second;

RenderTextTailBox(pTextTail);
pTextTail->pTextInstance->Render();
if (pTextTail->pOwnerTextInstance)
pTextTail->pOwnerTextInstance->Render();
}
#endif

for (TChatTailMap::iterator itorChat #endifatTailMap.begin(); itorChat!=m_ChatTailMap.#endifatTailMap.begin( {
TTextTail * pTextTail = itorChat->second;
if (pTextTail->pOwner->isShow())
RenderTextTailName(pTextTail);
}
}

void CPythonTextTail::RenderTextTailBox(TTextTail * pTextTail)
{
#ifdef __ENABLE_NEW_OFFLINESHOP__
# ifdef ENAB#ifdef_SHOP_IN_CITIES
if (pTextTail->bIsShop)
{
CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 1.0f);
CPythonGraphic::Instance().RenderBox2d(pTextTail->x + pTextTail->xStart - 10.f,
pTextTail->y + pTextTail->yStart - 10.f,
pTextTail->x + pTextTail->xEnd + 10.f,
pTextTail->y + pTextTail->yEnd + 10.f,
pTextTail->z);

CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 0.3f);
CPythonGraphic::Instance().RenderBar2d(pTextTail->x + pTextTail->xStart - 10.f,
pTextTail->y + pTextTail->yStart - 10.f,
pTextTail->x + pTextTail->xEnd + 10.f,
pTextTail->y + pTextTail->yEnd + 10.f,
pTextTail->z);

return;
}
# endif
#endif
CPythonGraphic::Instance().SetDiffuseC#endif.0f, 0.0f, 0.0f, 1.0f);
CPythonGraphic::Instance().RenderBox2d(pTextTail->x + pTextTail->xStart,
pTextTail->y + pTextTail->yStart,
pTextTail->x + pTextTail->xEnd,
pTextTail->y + pTextTail->yEnd,
pTextTail->z);

CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 0.3f);
CPythonGraphic::Instance().RenderBar2d(pTextTail->x + pTextTail->xStart,
pTextTail->y + pTextTail->yStart,
pTextTail->x + pTextTail->xEnd,
pTextTail->y + pTextTail->yEnd,
pTextTail->z);
}

void CPythonTextTail::RenderTextTailName(TTextTail * pTextTail)
{
pTextTail->pTextInstance->Render();
}

void CPythonTextTail::HideAllTextTail()
{
m_CharacterTextTailList.clear();
m_ItemTextTailList.clear();
#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (aut#ifdefr : m_ShopTextTailMap)
iter.second->bRender = false;
#endif
}

void CPythonTextTail::UpdateDistance(co#endifixelPosition & c_rCenterPosition, TTextTail * pTextTail)
{
const D3DXVECTOR3 & c_rv3Position = pTextTail->pOwner->GetPosition();
D3DXVECTOR2 v2Distance(c_rv3Position.x - c_rCenterPosition.x, -c_rv3Position.y - c_rCenterPosition.y);
pTextTail->fDistanceFromPlayer = D3DXVec2Length(&v2Distance);
}

void CPythonTextTail::ShowAllTextTail()
{
TTextTailMap::iterator itor;
for (itor = m_CharacterTextTailMap.begin(); itor != m_CharacterTextTailMap.end(); ++itor)
{
TTextTail * pTextTail = itor->second;
if (pTextTail->fDistanceFromPlayer < 3500.0f)
ShowCharacterTextTail(itor->first);
}
for (itor = m_ItemTextTailMap.begin(); itor != m_ItemTextTailMap.end(); ++itor)
{
TTextTail * pTextTail = itor->second;
if (pTextTail->fDistanceFromPlayer < 3500.0f)
ShowItemTextTail(itor->first);
}
#ifdef ENABLE_NEW_SHOP_IN_CITIES
//OFFSHOP_DE#ifdefhopTextTailMap size %u ",m_ShopTextTailMap.size());
for (itor = m_ShopTextTailMap.begin(); itor != m_ShopTextTailMap.end(); ++itor)
{
TTextTail* pTextTail = itor->second;
pTextTail->bRender = pTextTail->fDistanceFromPlayer < 3500.f;
}
#endif
}

void CPythonTextTail::ShowCharacterText#endifWORD VirtualID)
{
TTextTailMap::iterator itor = m_CharacterTextTailMap.find(VirtualID);

if (m_CharacterTextTailMap.end() == itor)
return;

TTextTail * pTextTail = itor->second;

if (m_CharacterTextTailList.end() != std::find(m_CharacterTextTailList.begin(), m_CharacterTextTailList.end(), pTextTail))
{
return;
}

if (!pTextTail->pOwner->isShow())
return;

CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(pTextTail->dwVirtualID);
if (!pInstance)
return;

if (pInstance->IsGuildWall())
return;

if (pInstance->CanPickInstance())
m_CharacterTextTailList.push_back(pTextTail);
}

void CPythonTextTail::ShowItemTextTail(DWORD VirtualID)
{
TTextTailMap::iterator itor = m_ItemTextTailMap.find(VirtualID);

if (m_ItemTextTailMap.end() == itor)
return;

TTextTail * pTextTail = itor->second;

if (m_ItemTextTailList.end() != std::find(m_ItemTextTailList.begin(), m_ItemTextTailList.end(), pTextTail))
{
return;
}

m_ItemTextTailList.push_back(pTextTail);
}

bool CPythonTextTail::isIn(CPythonTextTail::TTextTail * pSource, CPythonTextTail::TTextTail * pTarget)
{
float x1Source = pSource->x + pSource->xStart;
float y1Source = pSource->y + pSource->yStart;
float x2Source = pSource->x + pSource->xEnd;
float y2Source = pSource->y + pSource->yEnd;
float x1Target = pTarget->x + pTarget->xStart;
float y1Target = pTarget->y + pTarget->yStart;
float x2Target = pTarget->x + pTarget->xEnd;
float y2Target = pTarget->y + pTarget->yEnd;

if (x1Source <= x2Target && x2Source >= x1Target &&
y1Source <= y2Target && y2Source >= y1Target)
{
return true;
}

return false;
}

void CPythonTextTail::RegisterCharacterTextTail(DWORD dwGuildID, DWORD dwVirtualID, const D3DXCOLOR & c_rColor, float fAddHeight)
{
CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwVirtualID);

if (!pCharacterInstance)
return;

TTextTail * pTextTail = RegisterTextTail(dwVirtualID,
pCharacterInstance->GetNameString(),
pCharacterInstance->GetGraphicThingInstancePtr(),
pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + fAddHeight,
c_rColor);

CGraphicTextInstance * pTextInstance = pTextTail->pTextInstance;
pTextInstance->SetOutline(true);
pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
#ifdef TITLE_SYSTEM
pTextTail->psTitleNameTex#ifdefnce = NULL;
#endif
pTextTail->pMarkInstance=NULL;
pTe#endif->pGuildNameTextInstance=NULL;
pTextTail->pTitleTextInstance=NULL;
pTextTail->pLevelTextInstance=NULL;
#ifdef ENABLE_PLAYTIME_ICON
pTextTail->pPlayT#ifdeftance=NULL;
#endif
#ifdef GAMEMASTER_OUTLINE_COLOR
if (pC#endife#ifdefnce->IsGameMaster())
pTextInstance->SetOutLineColor(0.5f, 0.0f, 0.7f, 1.0f);
#endif
if (0 != dwGuildID)
{
pTex#endif>pMarkInstance = CGraphicMarkInstance::New();

DWORD dwMarkID = CGuildMarkManager::Instance().GetMarkID(dwGuildID);

if (dwMarkID != CGuildMarkManager::INVALID_MARK_ID)
{
std::string markImagePath;

if (CGuildMarkManager::Instance().GetMarkImageFilename(dwMarkID / CGuildMarkImage::MARK_TOTAL_COUNT, markImagePath))
{
pTextTail->pMarkInstance->SetImageFileName(markImagePath.c_str());
pTextTail->pMarkInstance->Load();
pTextTail->pMarkInstance->SetIndex(dwMarkID % CGuildMarkImage::MARK_TOTAL_COUNT);
}
}

std::string strGuildName;
if (!CPythonGuild::Instance().GetGuildName(dwGuildID, &strGuildName))
strGuildName = "Noname";

CGraphicTextInstance *& prGuildNameInstance = pTextTail->pGuildNameTextInstance;
prGuildNameInstance = CGraphicTextInstance::New();
prGuildNameInstance->SetTextPointer(ms_pFont);
prGuildNameInstance->SetOutline(true);
prGuildNameInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
prGuildNameInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
prGuildNameInstance->SetValue(strGuildName.c_str());
prGuildNameInstance->SetColor(c_TextTail_Guild_Name_Color.r, c_TextTail_Guild_Name_Color.g, c_TextTail_Guild_Name_Color.b);
prGuildNameInstance->Update();
}

#ifdef ENABLE_PLAYTIME_ICON
if (pCharacterIns#ifdef>IsPC())
{
char szRutbe[MAX_PATH];
sprintf(szRutbe, pCharacterInstance->GetMyTimeIcon());
pTextTail->pPlayTimeInstance = CGraphicImageInstance::New();
pTextTail->pPlayTimeInstance->SetImagePointer((CGraphicImage*)CResourceManager::Instance().GetResourcePointer(szRutbe));
}
#endif

m_CharacterTextTailMap.insert(TTextTa#endif:value_type(dwVirtualID, pTextTail));
}

void CPythonTextTail::RegisterItemTextTail(DWORD VirtualID, const char * c_szText, CGraphicObjectInstance * pOwner)
{
#ifdef __DEBUG
char szName[256];
spritnf(#ifdef, "%s[%d]", c_szText, VirtualID);

TTextTail * pTextTail = RegisterTextTail(VirtualID, c_szText, pOwner, c_TextTail_Name_Position, c_TextTail_Item_Color);
m_ItemTextTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
#else
TTextTail * pTextTail = RegisterTextTai#elsetualID, c_szText, pOwner, c_TextTail_Name_Position, c_TextTail_Item_Color);
m_ItemTextTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
#endif
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
void C#endifText#ifdefRegisterShopInstanceTextTail(DWORD dwVirtualID, const char* c_szName, CGraphicObjectInstance* pOwner)
{
TTextTail* pTextTail = RegisterShopTextTail(dwVirtualID, c_szName, pOwner);
m_ShopTextTailMap.insert(TTextTailMap::value_type(dwVirtualID, pTextTail));
}
#endif

void CPythonTextTail::RegisterChatTail(DW#endifrtualID, const char * c_szChat)
{
CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(VirtualID);

if (!pCharacterInstance)
return;

TChatTailMap::iterator itor = m_ChatTailMap.find(VirtualID);

if (m_ChatTailMap.end() != itor)
{
TTextTail * pTextTail = itor->second;

pTextTail->pTextInstance->SetValue(c_szChat);
pTextTail->pTextInstance->Update();
pTextTail->Color = c_TextTail_Chat_Color;
pTextTail->pTextInstance->SetColor(c_TextTail_Chat_Color);

// TEXTTAIL_LIVINGTIME_CONTROL
pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
// END_OF_TEXTTAIL_LIVINGTIME_CONTROL

pTextTail->bNameFlag = TRUE;

return;
}

TTextTail * pTextTail = RegisterTextTail(VirtualID,
c_szChat,
pCharacterInstance->GetGraphicThingInstancePtr(),
pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + 10.0f,
c_TextTail_Chat_Color);

// TEXTTAIL_LIVINGTIME_CONTROL
pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
// END_OF_TEXTTAIL_LIVINGTIME_CONTROL

pTextTail->bNameFlag = TRUE;
pTextTail->pTextInstance->SetOutline(true);
pTextTail->pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
m_ChatTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
}

void CPythonTextTail::RegisterInfoTail(DWORD VirtualID, const char * c_szChat)
{
CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(VirtualID);

if (!pCharacterInstance)
return;

TChatTailMap::iterator itor = m_ChatTailMap.find(VirtualID);

if (m_ChatTailMap.end() != itor)
{
TTextTail * pTextTail = itor->second;

pTextTail->pTextInstance->SetValue(c_szChat);
pTextTail->pTextInstance->Update();
pTextTail->Color = c_TextTail_Info_Color;
pTextTail->pTextInstance->SetColor(c_TextTail_Info_Color);

// TEXTTAIL_LIVINGTIME_CONTROL
pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
// END_OF_TEXTTAIL_LIVINGTIME_CONTROL

pTextTail->bNameFlag = FALSE;

return;
}

TTextTail * pTextTail = RegisterTextTail(VirtualID,
c_szChat,
pCharacterInstance->GetGraphicThingInstancePtr(),
pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + 10.0f,
c_TextTail_Info_Color);

// TEXTTAIL_LIVINGTIME_CONTROL
pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
// END_OF_TEXTTAIL_LIVINGTIME_CONTROL

pTextTail->bNameFlag = FALSE;
pTextTail->pTextInstance->SetOutline(true);
pTextTail->pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
m_ChatTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
}

bool CPythonTextTail::GetTextTailPosition(DWORD dwVID, float* px, float* py, float* pz)
{
TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(dwVID);

if (m_CharacterTextTailMap.end() == itorCharacter)
{
return false;
}

TTextTail * pTextTail = itorCharacter->second;
*px=pTextTail->x;
*py=pTextTail->y;
*pz=pTextTail->z;

return true;
}

bool CPythonTextTail::IsChatTextTail(DWORD dwVID)
{
TChatTailMap::iterator itorChat = m_ChatTailMap.find(dwVID);

if (m_ChatTailMap.end() == itorChat)
return false;

return true;
}

void CPythonTextTail::SetCharacterTextTailColor(DWORD VirtualID, const D3DXCOLOR & c_rColor)
{
TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(VirtualID);

if (m_CharacterTextTailMap.end() == itorCharacter)
return;

TTextTail * pTextTail = itorCharacter->second;
pTextTail->pTextInstance->SetColor(c_rColor);
pTextTail->Color = c_rColor;
}

void CPythonTextTail::SetItemTextTailOwner(DWORD dwVID, const char * c_szName)
{
TTextTailMap::iterator itor = m_ItemTextTailMap.find(dwVID);
if (m_ItemTextTailMap.end() == itor)
return;

TTextTail * pTextTail = itor->second;

if (strlen(c_szName) > 0)
{
if (!pTextTail->pOwnerTextInstance)
{
pTextTail->pOwnerTextInstance = CGraphicTextInstance::New();
}

std::string strName = c_szName;
static const string & strOwnership = ApplicationStringTable_GetString(IDS_POSSESSIVE_MORPHENE) == "" ? "'s" : ApplicationStringTable_GetString(IDS_POSSESSIVE_MORPHENE);
strName += strOwnership;


pTextTail->pOwnerTextInstance->SetTextPointer(ms_pFont);
pTextTail->pOwnerTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
pTextTail->pOwnerTextInstance->SetValue(strName.c_str());
pTextTail->pOwnerTextInstance->SetColor(1.0f, 1.0f, 0.0f);
pTextTail->pOwnerTextInstance->Update();

int xOwnerSize, yOwnerSize;
pTextTail->pOwnerTextInstance->GetTextSize(&xOwnerSize, &yOwnerSize);
pTextTail->yStart = -2.0f;
pTextTail->yEnd += float(yOwnerSize + 4);
pTextTail->xStart = fMIN(pTextTail->xStart, float(-xOwnerSize / 2 - 1));
pTextTail->xEnd = fMAX(pTextTail->xEnd, float(xOwnerSize / 2 + 1));
}
else
{
if (pTextTail->pOwnerTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pOwnerTextInstance);
pTextTail->pOwnerTextInstance = NULL;
}
#ifdef TITLE_SYSTEM
if (pTextTail->psTitleNam#ifdefnstance)
{
CGraphicTextInstance::Delete(pTextTail->psTitleNameTextInstance);
pTextTail->psTitleNameTextInstance = NULL;
}
#endif
int xSize, ySize;
pTextTai#endifxtInstance->GetTextSize(&xSize, &ySize);
pTextTail->xStart = (float) (-xSize / 2 - 2);
pTextTail->yStart = -2.0f;
pTextTail->xEnd = (float) (xSize / 2 + 2);
pTextTail->yEnd = (float) ySize;
}
}

void CPythonTextTail::DeleteCharacterTextTail(DWORD VirtualID)
{
TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(VirtualID);
TTextTailMap::iterator itorChat = m_ChatTailMap.find(VirtualID);

if (m_CharacterTextTailMap.end() != itorCharacter)
{
DeleteTextTail(itorCharacter->second);
m_CharacterTextTailMap.erase(itorCharacter);
}
else
{
Tracenf("CPythonTextTail::DeleteCharacterTextTail - Find VID[%d] Error", VirtualID);
}

if (m_ChatTailMap.end() != itorChat)
{
DeleteTextTail(itorChat->second);
m_ChatTailMap.erase(itorChat);
}
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
void CPythonText#ifdefDeleteShopTextTail(DWORD VirtualID)
{
TTextTailMap::iterator itor = m_ShopTextTailMap.find(VirtualID);

if (m_ShopTextTailMap.end() == itor)
{
Tracef(" CPythonTextTail::DeleteShopTextTail - None Item Text Tail\n");
return;
}

DeleteTextTail(itor->second);
m_ShopTextTailMap.erase(itor);
}
#endif

void CPythonTextTail::DeleteItemTextTail(#endifVirtualID)
{
TTextTailMap::iterator itor = m_ItemTextTailMap.find(VirtualID);

if (m_ItemTextTailMap.end() == itor)
{
Tracef(" CPythonTextTail::DeleteItemTextTail - None Item Text Tail\n");
return;
}

DeleteTextTail(itor->second);
m_ItemTextTailMap.erase(itor);
}

CPythonTextTail::TTextTail * CPythonTextTail::RegisterTextTail(DWORD dwVirtualID, const char * c_szText, CGraphicObjectInstance * pOwner, float fHeight, const D3DXCOLOR & c_rColor)
{
TTextTail * pTextTail = m_TextTailPool.Alloc();
#ifdef __ENABLE_NEW_OFFLINESHOP__
# ifdef ENAB#ifdef_SHOP_IN_CITIES
pTextTail->bIsShop = false;
pTextTail->bRender = false;
# endif
#endif
pTextTail->dwVirtualID = dwVirtualID;
#endifextTail->pOwner = pOwner;
pTextTail->pT#endifextTail CGraphicTextInstance::New();
pTextTail->pOwnerTextInstance = NULL;
pTextTail->fHeight = fHeight;

pTextTail->pTextInstance->SetTextPointer(ms_pFont);
pTextTail->pTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
pTextTail->pTextInstance->SetValue(c_szText);
pTextTail->pTextInstance->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
pTextTail->pTextInstance->Update();

int xSize, ySize;
pTextTail->pTextInstance->GetTextSize(&xSize, &ySize);
pTextTail->xStart = (float) (-xSize / 2 - 2);
pTextTail->yStart = -2.0f;
pTextTail->xEnd = (float) (xSize / 2 + 2);
pTextTail->yEnd = (float) ySize;
pTextTail->Color = c_rColor;
pTextTail->fDistanceFromPlayer = 0.0f;
pTextTail->x = -100.0f;
pTextTail->y = -100.0f;
pTextTail->z = 0.0f;
#ifdef TITLE_SYSTEM
pTextTail->psTitleNameTex#ifdefnce = NULL;
#endif
pTextTail->pMarkInstance = NULL;
p#endifil->pGuildNameTextInstance = NULL;
pTextTail->pTitleTextInstance = NULL;
pTextTail->pLevelTextInstance = NULL;
#ifdef ENABLE_PLAYTIME_ICON
pTextTail->pPlayT#ifdeftance=NULL;
#endif
return pTextTail;
}

#ifdef ENABLE_NEW#endifIN_CITIES
CPythonTextTail:#ifdefTail* CPythonTextTail::RegisterShopTextTail(DWORD dwVirtualID, const char* c_szText, CGraphicObjectInstance* pOwner)
{
const D3DXCOLOR& c_rColor = D3DXCOLOR(1.0, 1.0, 0.5, 1.0);

TTextTail* pTextTail = m_TextTailPool.Alloc();

pTextTail->bIsShop = true;

pTextTail->dwVirtualID = dwVirtualID;
pTextTail->pOwner = pOwner;
pTextTail->pTextInstance = CGraphicTextInstance::New();
pTextTail->pOwnerTextInstance = NULL;
pTextTail->fHeight = 180.f;

pTextTail->pTextInstance->SetTextPointer(ms_pFont);
pTextTail->pTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
pTextTail->pTextInstance->SetValue(c_szText);
pTextTail->pTextInstance->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
pTextTail->pTextInstance->Update();

int xSize, ySize;
pTextTail->pTextInstance->GetTextSize(&xSize, &ySize);
pTextTail->xStart = (float)(-xSize / 2 - 2);
pTextTail->yStart = -2.0f;
pTextTail->xEnd = (float)(xSize / 2 + 2);
pTextTail->yEnd = (float)ySize;
pTextTail->Color = c_rColor;
pTextTail->fDistanceFromPlayer = 0.0f;
pTextTail->x = -100.0f;
pTextTail->y = -100.0f;
pTextTail->z = 0.0f;
#ifdef TITLE_SYSTEM
pTextTail->psTitleNameTex#ifdefnce = NULL;
#endif
pTextTail->pMarkInstance = NULL;
p#endifil->pGuildNameTextInstance = NULL;
pTextTail->pTitleTextInstance = NULL;
pTextTail->pLevelTextInstance = NULL;
//#if defined(WJ_SHOW_MOB_INFO)
// pTextTail->pAIFlagTextInstance = NULL;
//#endif
#ifdef ENABLE_PLAYTIME_ICON
pTextTail->pPlayT#ifdeftance=NULL;
#endif

return pTextTail;
}

bool CPythonText#endifGetPickedNewShop(DWORD* pdwVID)
{
*pdwVID = 0;

/*if(!CPythonSystem::instance().IsAlwaysShowName())
return false;*/

long ixMouse = 0, iyMouse = 0;

POINT p;
CPythonApplication::Instance().GetMousePosition(&p);

ixMouse = p.x;
iyMouse = p.y;

for (auto itor = m_ShopTextTailMap.begin(); itor != m_ShopTextTailMap.end(); ++itor)
{
TTextTail* pTextTail = itor->second;

if (ixMouse >= pTextTail->x + (pTextTail->xStart - 10) && ixMouse <= pTextTail->x + (pTextTail->xEnd + 10) &&
iyMouse >= pTextTail->y + (pTextTail->yStart - 10) && iyMouse <= pTextTail->y + (pTextTail->yEnd + 10))
{
*pdwVID = itor->first;
return true;
}
}

return false;
}

#endif


void CPythonTextTail::DeleteTextTail(TTe#endif * pTextTail)
{
if (pTextTail->pTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pTextInstance);
pTextTail->pTextInstance = NULL;
}
if (pTextTail->pOwnerTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pOwnerTextInstance);
pTextTail->pOwnerTextInstance = NULL;
}
if (pTextTail->pMarkInstance)
{
CGraphicMarkInstance::Delete(pTextTail->pMarkInstance);
pTextTail->pMarkInstance = NULL;
}
if (pTextTail->pGuildNameTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pGuildNameTextInstance);
pTextTail->pGuildNameTextInstance = NULL;
}
if (pTextTail->pTitleTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pTitleTextInstance);
pTextTail->pTitleTextInstance = NULL;
}
if (pTextTail->pLevelTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pLevelTextInstance);
pTextTail->pLevelTextInstance = NULL;
}

#ifdef ENABLE_PLAYTIME_ICON
if (pTextTail->pP#ifdefeInstance)
{
CGraphicImageInstance::Delete(pTextTail->pPlayTimeInstance);
pTextTail->pPlayTimeInstance = NULL;
}
#endif

m_TextTailPool.Free(pTextTail);
}

in#endifhonTextTail::Pick(int ixMouse, int iyMouse)
{
for (TTextTailMap::iterator itor = m_ItemTextTailMap.begin(); itor != m_ItemTextTailMap.end(); ++itor)
{
TTextTail * pTextTail = itor->second;

if (ixMouse >= pTextTail->x + pTextTail->xStart && ixMouse <= pTextTail->x + pTextTail->xEnd &&
iyMouse >= pTextTail->y + pTextTail->yStart && iyMouse <= pTextTail->y + pTextTail->yEnd)
{
SelectItemName(itor->first);
return (itor->first);
}
}

return -1;
}

void CPythonTextTail::SelectItemName(DWORD dwVirtualID)
{
TTextTailMap::iterator itor = m_ItemTextTailMap.find(dwVirtualID);

if (m_ItemTextTailMap.end() == itor)
return;

TTextTail * pTextTail = itor->second;
pTextTail->pTextInstance->SetColor(0.1f, 0.9f, 0.1f);
}

#ifdef TITLE_SYSTEM
void CPythonTextTail::AttachN#ifdefe(DWORD dwVID, const char* c_szName, const D3DXCOLOR& c_rColor)
{
if (!bPKTitleEnable)
return;

TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
if (m_CharacterTextTailMap.end() == itor)
return;

TTextTail* pTextTail = itor->second;
CGraphicTextInstance*& prTitleNameInstance = pTextTail->psTitleNameTextInstance;
if (!prTitleNameInstance)
{
prTitleNameInstance = CGraphicTextInstance::New();
prTitleNameInstance->SetTextPointer(ms_pFont);
prTitleNameInstance->SetOutline(true);
prTitleNameInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
prTitleNameInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
}

prTitleNameInstance->SetValue(c_szName);
prTitleNameInstance->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
prTitleNameInstance->Update();
}

void CPythonTextTail::DetachNewTitle(DWORD dwVID)
{
if (!bPKTitleEnable)
return;

TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
if (m_CharacterTextTailMap.end() == itor)
return;

TTextTail* pTextTail = itor->second;
if (pTextTail->psTitleNameTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->psTitleNameTextInstance);
pTextTail->psTitleNameTextInstance = NULL;
}
}
#endif

void CPythonTextTail::AttachTitle(DWORD d#endifconst char * c_szName, const D3DXCOLOR & c_rColor)
{
if (!bPKTitleEnable)
return;

TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
if (m_CharacterTextTailMap.end() == itor)
return;

TTextTail * pTextTail = itor->second;

CGraphicTextInstance *& prTitle = pTextTail->pTitleTextInstance;
if (!prTitle)
{
prTitle = CGraphicTextInstance::New();
prTitle->SetTextPointer(ms_pFont);
prTitle->SetOutline(true);

if (LocaleService_IsEUROPE())
prTitle->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_RIGHT);
else
prTitle->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
prTitle->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
}

prTitle->SetValue(c_szName);
prTitle->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
prTitle->Update();
}

void CPythonTextTail::DetachTitle(DWORD dwVID)
{
if (!bPKTitleEnable)
return;

TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
if (m_CharacterTextTailMap.end() == itor)
return;

TTextTail * pTextTail = itor->second;

if (pTextTail->pTitleTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pTitleTextInstance);
pTextTail->pTitleTextInstance = NULL;
}
}

void CPythonTextTail::EnablePKTitle(BOOL bFlag)
{
bPKTitleEnable = bFlag;
}

void CPythonTextTail::AttachLevel(DWORD dwVID, const char * c_szText, const D3DXCOLOR & c_rColor)
{
if (!bPKTitleEnable)
return;

TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
if (m_CharacterTextTailMap.end() == itor)
return;

TTextTail * pTextTail = itor->second;

CGraphicTextInstance *& prLevel = pTextTail->pLevelTextInstance;
if (!prLevel)
{
prLevel = CGraphicTextInstance::New();
prLevel->SetTextPointer(ms_pFont);
prLevel->SetOutline(true);

prLevel->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_RIGHT);
prLevel->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
}

prLevel->SetValue(c_szText);
prLevel->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
prLevel->Update();
}

void CPythonTextTail::DetachLevel(DWORD dwVID)
{
if (!bPKTitleEnable)
return;

TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
if (m_CharacterTextTailMap.end() == itor)
return;

TTextTail * pTextTail = itor->second;

if (pTextTail->pLevelTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pLevelTextInstance);
pTextTail->pLevelTextInstance = NULL;
}
}


void CPythonTextTail::Initialize()
{
// DEFAULT_FONT
//ms_pFont = (CGraphicText *)CResourceManager::Instance().GetTypeResourcePointer(g_strDefaultFontName.c_str());

CGraphicText* pkDefaultFont = static_cast<CGraphicText*>(DefaultFont_GetResource());
if (!pkDefaultFont)
{
TraceError("CPythonTextTail::Initialize - CANNOT_FIND_DEFAULT_FONT");
return;
}

ms_pFont = pkDefaultFont;
// END_OF_DEFAULT_FONT
}

void CPythonTextTail::Destroy()
{
m_TextTailPool.Clear();
}

void CPythonTextTail::Clear()
{
m_CharacterTextTailMap.clear();
m_CharacterTextTailList.clear();
m_ItemTextTailMap.clear();
m_ItemTextTailList.clear();
#ifdef ENABLE_NEW_SHOP_IN_CITIES
m_ShopTextTa#ifdefclear();
#endif
m_ChatTailMap.clear();

m_TextTail#endiflear();
}

CPythonTextTail::CPythonTextTail()
{
Clear();
}

CPythonTextTail::~CPythonTextTail()
{
Destroy();
}
[/CODE]
 
Son düzenleme:
Oyunda ışınlanırken, pazarları görüntülerken ve metinden düşen itemler menzilden çıkıp girildiğinde silinirken ki bir hatayı düzeltir, ayrıca c- dilinden c++ dönüştürülmüş bir betiktir güvenlik açıklarını ve sistem performans düzeltmelerini içerir (10-100-1000 karakter/item varsa yazılar üst üste binerek fps düşüşü yaptığı bir hatayı düzeltir)

İşlemi yapmadan önce yedek almayı unutmayın

[CODE lang="cpp" title="PythonTextTail.cpp"]//
//
#include "stdafx.h"
#include "InstanceBase.h"
#in#includeesource.h"
##include"PythonTextTail.h"#includee "PythonChara#includeger.h"
#include "Pyt#include.h"
#include "Locale.h"
#inc#includerkManager.h"
#ifd#includeE_NEW_SHOP_I#include
#include "Python#ifdefation.h"
#endif

// --- IYI#include: Kod okunabilirliğini #endifak için "Magic Number"lar sabitlere dönüştürüldü.
const D3DXCOLOR c_TextTail_Player_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
const D3DXCOLOR c_TextTail_Monster_Color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
const D3DXCOLOR c_TextTail_Item_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
const D3DXCOLOR c_TextTail_Chat_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
const D3DXCOLOR c_TextTail_Info_Color = D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f);
const D3DXCOLOR c_TextTail_Guild_Name_Color = 0xFFEFD3FF;
const float c_TextTail_Name_Position = -10.0f;
const float c_fxMarkPosition = 1.5f;

const float c_fTitleInstanceOffset = 8.0f;
const float c_fLevelInstanceOffset = 4.0f;
const float c_fItemOwnerNameYOffset = 15.0f;
const float c_fItemNameBoxYStart = -2.0f;
const float c_fShopBoxPadding = 10.0f;
const float c_fChatBubbleNameOffset = 17.0f;

#ifdef TITLE_SYSTEM
const float c_fyGuildNamePosition = 25#ifdefonst float c_fyMarkPosition = 25.0f + 11.0f;
const float c_fysTitlePosition = 16.0f;
const float c_fyGuildNamePositionOld = 15.0f;
const float c_fyMarkPositionOld = 15.0f + 11.0f;
#else
const float c_fyGuildNamePosition = 15.0f;
const flo#elsefyMarkPosition = 15.0f + 11.0f;
#endif
BOOL bPKTitleEnable = TRUE;

// TEXTTAIL_LIVINGTIME#endifOL
long gs_TextTail_LivingTime = 5000;

long TextTail_GetLivingTime()
{
assert(gs_TextTail_LivingTime > 1000);
return gs_TextTail_LivingTime;
}

void TextTail_SetLivingTime(long livingTime)
{
gs_TextTail_LivingTime = livingTime;
}
// END_OF_TEXTTAIL_LIVINGTIME_CONTROL

CGraphicText* ms_pFont = nullptr;

// --- IYILESTIRME (GÜVENLİK NOTU):
// Bu yapıya CGraphic...::New() ile oluşturulan yeni bir pointer eklerseniz,
// aşağıdaki 3 işlemi yapmayı UNUTMAYIN:
// 1. RegisterTextTail fonksiyonunda bu pointer'ı nullptr olarak başlatın.
// 2. DeleteTextTail fonksiyonunda bu pointer'ı CGraphic...::Delete() ile silin ve nullptr yapın.
// 3. İlgili Attach/Detach fonksiyonlarını yazın.
// Bu adımları atlamak, bellek sızıntılarına (memory leak) yol açacaktır!
struct CPythonTextTail::TTextTail
{
// ... (diğer struct elemanları buraya gelecek, eğer struct ayrı bir dosyada değilse)

// --- IYILESTIRME (PERFORMANS):
// Bu TextTail'in render listesinde olup olmadığını O(1) hızında kontrol etmek için kullanılır.
// std::find ile liste tarama (O(n)) işlemine göre çok daha performanslıdır.
bool bIsOnRenderList;
};


void CPythonTextTail::GetInfo(std::string* pstInfo)
{
// GÜVENLİK DÜZELTMESİ: Bellek taşması riski taşıyan sprintf yerine std::string ve std::to_string kullanıldı.
std::string szInfo = "TextTail: ChatTail " + std::to_string(m_ChatTailMap.size()) +
", ChrTail (Map " + std::to_string(m_CharacterTextTailMap.size()) + ", List " + std::to_string(m_CharacterTextTailList.size()) + ")" +
", ItemTail (Map " + std::to_string(m_ItemTextTailMap.size()) + ", List " + std::to_string(m_ItemTextTailList.size()) + ")" +
", Pool " + std::to_string(m_TextTailPool.GetCapacity());

pstInfo->append(szInfo);
}

void CPythonTextTail::UpdateAllTextTail()
{
CInstanceBase* pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr();
if (!pInstance)
return;

TPixelPosition pixelPos;
pInstance->NEW_GetPixelPosition(&pixelPos);

for (auto const& [key, val] : m_CharacterTextTailMap)
{
if (val && val->pOwner) UpdateDistance(pixelPos, val);
}

for (auto const& [key, val] : m_ItemTextTailMap)
{
if (val && val->pOwner) UpdateDistance(pixelPos, val);
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto const& [key, val] : m_ShopTextTailMap)
{
if (val && va#ifdefner) UpdateDistance(pixelPos, val);
}
#endif

for (auto const& [key, val] : m_ChatTailMap)
{
if (val && val->pOwner)
{
#endifdateDistance(pixelPos, val);
if (val->bNameFlag)
{
ShowCharacterTextTail(key);
}
}
}
}

void CPythonTextTail::UpdateShowingTextTail()
{
for (TTextTail* pTextTail : m_ItemTextTailList)
{
UpdateTextTail(pTextTail);
}

for (auto const& [key, pChatTail] : m_ChatTailMap)
{
UpdateTextTail(pChatTail);
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto const& [key, pShopTail] : m_ShopTextTailMap)
{
if (pSh#ifdef->bRender)
UpdateTextTail(pShopTail);
}
#endif

for (TTextTail* pTextTail : m_CharacterTextTailList)
{
UpdateTextTail(pTextTail);

#endif itor = m_ChatTailMap.find(pTextTail->dwVirtualID);
if (m_ChatTailMap.end() != itor)
{
TTextTail* pChatTail = itor->second;
if (pChatTail && pChatTail->bNameFlag)
{
pTextTail->y = pChatTail->y - c_fChatBubbleNameOffset;
}
}
}
}

void CPythonTextTail::UpdateTextTail(TTextTail* pTextTail)
{
if (!pTextTail || !pTextTail->pOwner)
return;

CPythonGraphic& rpyGraphic = CPythonGraphic::Instance();
rpyGraphic.Identity();

const D3DXVECTOR3& c_rv3Position = pTextTail->pOwner->GetPosition();
rpyGraphic.ProjectPosition(c_rv3Position.x,
c_rv3Position.y,
c_rv3Position.z + pTextTail->fHeight,
&pTextTail->x,
&pTextTail->y,
&pTextTail->z);

pTextTail->x = floorf(pTextTail->x);
pTextTail->y = floorf(pTextTail->y);

if (pTextTail->fDistanceFromPlayer < 1300.0f)
{
pTextTail->z = 0.0f;
}
else
{
pTextTail->z = pTextTail->z * CPythonGraphic::Instance().GetOrthoDepth() * -1.0f;
pTextTail->z += 10.0f;
}
}

void CPythonTextTail::ArrangeTextTail()
{
// PERFORMANS İYİLEŞTİRMESİ:
// Yerde çok fazla item olduğunda oyunda kasmaya neden olan eski O(n^2) algoritma yerine,
// O(n log n) karmaşıklığında çalışan verimli bir sıralama ve tek geçişli düzenleme algoritması kullanıldı.
if (!m_ItemTextTailList.empty())
{
m_ItemTextTailList.sort([](const TTextTail* a, const TTextTail* b) {
if (!a || !b) return false;
return a->y < b->y;
});

float yTemp = 5.0f;
TTextTail* pPrevTextTail = nullptr;
for (TTextTail* pCurrentTextTail : m_ItemTextTailList)
{
if (!pCurrentTextTail) continue;

if (pPrevTextTail && isIn(pCurrentTextTail, pPrevTextTail))
{
pCurrentTextTail->y = pPrevTextTail->y + pPrevTextTail->yEnd + yTemp;
}

if (pCurrentTextTail->pOwnerTextInstance)
{
pCurrentTextTail->pOwnerTextInstance->SetPosition(pCurrentTextTail->x, pCurrentTextTail->y, pCurrentTextTail->z);
pCurrentTextTail->pOwnerTextInstance->Update();
}
if (pCurrentTextTail->pTextInstance)
{
pCurrentTextTail->pTextInstance->SetColor(pCurrentTextTail->Color.r, pCurrentTextTail->Color.g, pCurrentTextTail->Color.b);
float yPos = pCurrentTextTail->y + (pCurrentTextTail->pOwnerTextInstance ? c_fItemOwnerNameYOffset : 0.0f);
pCurrentTextTail->pTextInstance->SetPosition(pCurrentTextTail->x, yPos, pCurrentTextTail->z);
pCurrentTextTail->pTextInstance->Update();
}

pPrevTextTail = pCurrentTextTail;
}
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto const& [key, pInsertTextTail] : m_ShopTextTailMap)
{
if (!pInsertTextTail ||#ifdefertTextTail->bRender) continue;

if (pInsertTextTail->pOwnerTextInstance)
{
pInsertTextTail->pOwnerTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
pInsertTextTail->pOwnerTextInstance->Update();
}
if (pInsertTextTail->pTextInstance)
{
pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
float yPos = pInsertTextTail->y + (pInsertTextTail->pOwnerTextInstance ? c_fItemOwnerNameYOffset : 0.0f);
pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, yPos, pInsertTextTail->z);
pInsertTextTail->pTextInstance->Update();
}
}
#endif

for (TTextTail* pTextTail : m_CharacterTextTailList)
{
if (!pTextTail) continue;

float fxAdd = 0.0f;

#endif TITLE_SYSTEM
if (pTextTail->psTitleNameTextInstance)
{
pTextTail->psTitleNameTextInstance->SetPositi#ifdefxtTail->x, pTextTail->y - c_fysTitlePosition, pTextTail->z);
pTextTail->psTitleNameTextInstance->Update();
}
#endif

CGraphicMarkInstance* pMarkInstance = pTextTail->pMarkInstance;
CGraphicTextInstance* pGuildNameInstance = pTex#endif>pGuildNameTextInstance;

if (pMarkInstance && pGuildNameInstance)
{
int iWidth, iHeight;
pGuildNameInstance->GetTextSize(&iWidth, &iHeight);
int iImageHalfSize = pMarkInstance->GetWidth() / 2 + c_fxMarkPosition;

#ifdef TITLE_SYSTEM
float fyMarkPos = pTextTail->psTitleNameTextInstance ? c_fyMarkPosition : c_fyMarkPositionOld;
#ifdefoat fyGuildNamePos = pTextTail->psTitleNameTextInstance ? c_fyGuildNamePosition : c_fyGuildNamePositionOld;
#else
float fyMarkPos = c_fyMarkPosition;
float fyGuildNamePos = c_fyGuildNamePosition;
#endif
pMar#elseance->SetPosition(pTextTail->x - iWidth / 2 - iImageHalfSize, pTextTail->y - fyMarkPos);
pGuild#endifstance->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - fyGuildNamePos, pTextTail->z);
pGuildNameInstance->Update();
}

int iNameWidth, iNameHeight;
pTextTail->pTextInstance->GetTextSize(&iNameWidth, &iNameHeight);

CGraphicTextInstance* pTitle = pTextTail->pTitleTextInstance;
CGraphicTextInstance* pLevel = pTextTail->pLevelTextInstance;

if (pTitle)
{
int iTitleWidth, iTitleHeight;
pTitle->GetTextSize(&iTitleWidth, &iTitleHeight);
fxAdd = c_fTitleInstanceOffset;

float titleXPos = pTextTail->x - (iNameWidth / 2) - fxAdd;
if (LocaleService_IsEUROPE()) {
titleXPos = pTextTail->x - (iNameWidth / 2);
if (GetDefaultCodePage() == CP_ARABIC) {
titleXPos = pTextTail->x - (iNameWidth / 2) - iTitleWidth - 4.0f;
}
}
pTitle->SetPosition(titleXPos, pTextTail->y, pTextTail->z);
pTitle->Update();

if (pLevel)
{
float levelXPos = titleXPos - iTitleWidth;
if (LocaleService_IsEUROPE() && GetDefaultCodePage() == CP_ARABIC) {
int iLevelWidth, iLevelHeight;
pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);
levelXPos = titleXPos - iLevelWidth - 4.0f;
}
pLevel->SetPosition(levelXPos, pTextTail->y, pTextTail->z);
pLevel->Update();
}
}
else if (pLevel)
{
fxAdd = c_fLevelInstanceOffset;
float levelXPos = pTextTail->x - (iNameWidth / 2) - fxAdd;
if (LocaleService_IsEUROPE()) {
levelXPos = pTextTail->x - (iNameWidth / 2);
if (GetDefaultCodePage() == CP_ARABIC) {
int iLevelWidth, iLevelHeight;
pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);
levelXPos = pTextTail->x - (iNameWidth / 2) - iLevelWidth - 4.0f;
}
}
pLevel->SetPosition(levelXPos, pTextTail->y, pTextTail->z);
pLevel->Update();
}

#ifdef ENABLE_PLAYTIME_ICON
if (pTextTail->pPlayTimeInstance)
{
float offset = 0.0f;
if (pTitle#ifdef int iTitleWidth, iTitleHeight;
pTitle->GetTextSize(&iTitleWidth, &iTitleHeight);
offset += iTitleWidth;
}
if (pLevel) {
int iLevelWidth, iLevelHeight;
pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);
offset += iLevelWidth;
}
float playTimeX = pTextTail->x - (iNameWidth / 2) - offset - 25.0f;
pTextTail->pPlayTimeInstance->SetPosition(playTimeX, pTextTail->y - 14);
}
#endif

pTextTail->pTextInstance->SetColor(pTextTail->Color.r, pTextTail->Color.g, pTextTail->Color.b);
pTextTail->pTex#endifnce->SetPosition(pTextTail->x + fxAdd, pTextTail->y, pTextTail->z);
pTextTail->pTextInstance->Update();
}

DWORD dwTime = CTimer::Instance().GetCurrentMillisecond();
for (TChatTailMap::iterator itorChat = m_ChatTailMap.begin(); itorChat != m_ChatTailMap.end();)
{
TTextTail* pTextTail = itorChat->second;
if (!pTextTail || pTextTail->LivingTime < dwTime)
{
if (pTextTail) DeleteTextTail(pTextTail);
itorChat = m_ChatTailMap.erase(itorChat);
}
else
{
pTextTail->pTextInstance->SetColor(pTextTail->Color);
pTextTail->pTextInstance->SetPosition(pTextTail->x, pTextTail->y, pTextTail->z);
pTextTail->pTextInstance->Update();
++itorChat;
}
}
}

void CPythonTextTail::Render()
{
for (TTextTail* pTextTail : m_CharacterTextTailList)
{
if (!pTextTail) continue;
if (pTextTail->pTextInstance) pTextTail->pTextInstance->Render();
if (pTextTail->pMarkInstance) pTextTail->pMarkInstance->Render();
if (pTextTail->pGuildNameTextInstance) pTextTail->pGuildNameTextInstance->Render();
if (pTextTail->pTitleTextInstance) pTextTail->pTitleTextInstance->Render();
if (pTextTail->pLevelTextInstance) pTextTail->pLevelTextInstance->Render();
#ifdef TITLE_SYSTEM
if (pTextTail->psTitleNameTextInstance) pTextTail->psTitleNameTextInstance->Render();
#endif
#ifdef ENABLE_#ifdefME_ICON
if (pTextTail->pPlayTimeInstance) pTextTail->pPlayTimeInstance->Render();
#endif
}

#endifT#ifdefl* pTextTail : m_ItemTextTailList)
{
if (!pTextTail) continue;
RenderTextTailBox(pTe#endif);
if (pTextTail->pTextInstance) pTextTail->pTextInstance->Render();
if (pTextTail->pOwnerTextInstance) pTextTail->pOwnerTextInstance->Render();
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto const& [key, pTextTail] : m_ShopTextTailMap)
{
if (!pTextTail || !pTextTail-#ifdefer) continue;
RenderTextTailBox(pTextTail);
if (pTextTail->pTextInstance) pTextTail->pTextInstance->Render();
if (pTextTail->pOwnerTextInstance) pTextTail->pOwnerTextInstance->Render();
}
#endif

for (auto const& [key, pTextTail] : m_ChatTailMap)
{
if (pTextTail && pTextTail->pOwner && pTextTail->pOwner->i#endif))
RenderTextTailName(pTextTail);
}
}

void CPythonTextTail::RenderTextTailBox(TTextTail* pTextTail)
{
if (!pTextTail) return;

#if defined(__ENABLE_NEW_OFFLINESHOP__) && defined(ENABLE_NEW_SHOP_IN_CITIES)
if (pTextTail->bIsShop)
{
float startX = #ifxtTail->x + pTextTail->xStart - c_fShopBoxPadding;
float startY = pTextTail->y + pTextTail->yStart - c_fShopBoxPadding;
float endX = pTextTail->x + pTextTail->xEnd + c_fShopBoxPadding;
float endY = pTextTail->y + pTextTail->yEnd + c_fShopBoxPadding;

CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 1.0f);
CPythonGraphic::Instance().RenderBox2d(startX, startY, endX, endY, pTextTail->z);
CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 0.3f);
CPythonGraphic::Instance().RenderBar2d(startX, startY, endX, endY, pTextTail->z);
return;
}
#endif
CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 1.0f);
CPythonGraphic::Instance().RenderBox2d(pTextTail->x #endiftTail->xStart, pTextTail->y + pTextTail->yStart, pTextTail->x + pTextTail->xEnd, pTextTail->y + pTextTail->yEnd, pTextTail->z);
CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 0.3f);
CPythonGraphic::Instance().RenderBar2d(pTextTail->x + pTextTail->xStart, pTextTail->y + pTextTail->yStart, pTextTail->x + pTextTail->xEnd, pTextTail->y + pTextTail->yEnd, pTextTail->z);
}

void CPythonTextTail::RenderTextTailName(TTextTail* pTextTail)
{
if (pTextTail && pTextTail->pTextInstance)
pTextTail->pTextInstance->Render();
}

void CPythonTextTail::HideAllTextTail()
{
// --- IYILESTIRME (PERFORMANS):
// Render listesi temizlenmeden önce, listedeki tüm elemanların bayrakları 'false' olarak ayarlanır.
// Bu, aynı nesnelerin tekrar gösterilmek istendiğinde listeye sorunsuzca eklenebilmesini sağlar.
for (TTextTail* pTextTail : m_CharacterTextTailList)
if (pTextTail) pTextTail->bIsOnRenderList = false;
m_CharacterTextTailList.clear();

for (TTextTail* pTextTail : m_ItemTextTailList)
if (pTextTail) pTextTail->bIsOnRenderList = false;
m_ItemTextTailList.clear();

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto& iter : m_ShopTextTailMap)
if (iter.second) iter.second->bRender = false;
#endif
}

void #ifdefnTextTail::UpdateDistance(const TPixelPosition& c_rCenterPosition, TTextTail* pTextTail)
{
if (!pTextTail || !pTextTail#endifer) return;
const D3DXVECTOR3& c_rv3Position = pTextTail->pOwner->GetPosition();
D3DXVECTOR2 v2Distance(c_rv3Position.x - c_rCenterPosition.x, -c_rv3Position.y - c_rCenterPosition.y);
pTextTail->fDistanceFromPlayer = D3DXVec2Length(&v2Distance);
}

void CPythonTextTail::ShowAllTextTail()
{
const float c_fTextTailShowDistance = 3500.0f;
for (auto const& [key, pTextTail] : m_CharacterTextTailMap)
{
if (pTextTail && pTextTail->fDistanceFromPlayer < c_fTextTailShowDistance)
ShowCharacterTextTail(key);
}
for (auto const& [key, pTextTail] : m_ItemTextTailMap)
{
if (pTextTail && pTextTail->fDistanceFromPlayer < c_fTextTailShowDistance)
ShowItemTextTail(key);
}
#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto const& [key, pTextTail] : m_ShopTextTailMap)
{
if (pTextTail)
pTextTail->#ifdefr = pTextTail->fDistanceFromPlayer < c_fTextTailShowDistance;
}
#endif
}

void CPythonTextTail::ShowCharacterTextTail(DWORD VirtualID)
{
auto itor = m_CharacterTextTailMap.find(VirtualID);
if (m_Chara#endifxtTailMap.end() == itor) return;

TTextTail* pTextTail = itor->second;
if (!pTextTail) return;

// --- IYILESTIRME (PERFORMANS): O(n) olan std::find yerine O(1) olan boolean flag kontrolü yapılıyor.
if (pTextTail->bIsOnRenderList) return;

if (!pTextTail->pOwner || !pTextTail->pOwner->isShow()) return;

CInstanceBase* pInstance = CPythonCharacterManager::Instance().GetInstancePtr(pTextTail->dwVirtualID);
if (!pInstance || pInstance->IsGuildWall() || !pInstance->CanPickInstance()) return;

pTextTail->bIsOnRenderList = true; // Listeye eklendi olarak işaretle
m_CharacterTextTailList.push_back(pTextTail);
}

void CPythonTextTail::ShowItemTextTail(DWORD VirtualID)
{
auto itor = m_ItemTextTailMap.find(VirtualID);
if (m_ItemTextTailMap.end() == itor) return;

TTextTail* pTextTail = itor->second;
if (!pTextTail) return;

// --- IYILESTIRME (PERFORMANS): O(n) olan std::find yerine O(1) olan boolean flag kontrolü yapılıyor.
if (pTextTail->bIsOnRenderList) return;

pTextTail->bIsOnRenderList = true; // Listeye eklendi olarak işaretle
m_ItemTextTailList.push_back(pTextTail);
}

bool CPythonTextTail::isIn(CPythonTextTail::TTextTail* pSource, CPythonTextTail::TTextTail* pTarget)
{
if (!pSource || !pTarget) return false;

float x1Source = pSource->x + pSource->xStart;
float y1Source = pSource->y + pSource->yStart;
float x2Source = pSource->x + pSource->xEnd;
float y2Source = pSource->y + pSource->yEnd;
float x1Target = pTarget->x + pTarget->xStart;
float y1Target = pTarget->y + pTarget->yStart;
float x2Target = pTarget->x + pTarget->xEnd;
float y2Target = pTarget->y + pTarget->yEnd;

return (x1Source <= x2Target && x2Source >= x1Target && y1Source <= y2Target && y2Source >= y1Target);
}

void CPythonTextTail::RegisterCharacterTextTail(DWORD dwGuildID, DWORD dwVirtualID, const D3DXCOLOR& c_rColor, float fAddHeight)
{
CInstanceBase* pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwVirtualID);
if (!pCharacterInstance) return;

TTextTail* pTextTail = RegisterTextTail(dwVirtualID, pCharacterInstance->GetNameString(), pCharacterInstance->GetGraphicThingInstancePtr(), pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + fAddHeight, c_rColor);
if (!pTextTail) return;

pTextTail->pTextInstance->SetOutline(true);
pTextTail->pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
#ifdef GAMEMASTER_OUTLINE_COLOR
if (pCharacterInstance->IsGameMaster())
pTextTail->pTextInstance->SetOutLineColor(0.5f, 0.0f, 0.7f, 1.0f);
##ifdef
if (0 != dwGuildID)
{
std::string strGuildName;
if (CPythonGuild::Instance().GetGuildName(dwGuildID, &strGuildName))
#endif
pTextTail->pMarkInstance = CGraphicMarkInstance::New();
DWORD dwMarkID = CGuildMarkManager::Instance().GetMarkID(dwGuildID);
if (dwMarkID != CGuildMarkManager::INVALID_MARK_ID)
{
std::string markImagePath;
if (CGuildMarkManager::Instance().GetMarkImageFilename(dwMarkID / CGuildMarkImage::MARK_TOTAL_COUNT, markImagePath))
{
pTextTail->pMarkInstance->SetImageFileName(markImagePath.c_str());
pTextTail->pMarkInstance->Load();
pTextTail->pMarkInstance->SetIndex(dwMarkID % CGuildMarkImage::MARK_TOTAL_COUNT);
}
}

pTextTail->pGuildNameTextInstance = CGraphicTextInstance::New();
pTextTail->pGuildNameTextInstance->SetTextPointer(ms_pFont);
pTextTail->pGuildNameTextInstance->SetOutline(true);
pTextTail->pGuildNameTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
pTextTail->pGuildNameTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
pTextTail->pGuildNameTextInstance->SetValue(strGuildName.c_str());
pTextTail->pGuildNameTextInstance->SetColor(c_TextTail_Guild_Name_Color.r, c_TextTail_Guild_Name_Color.g, c_TextTail_Guild_Name_Color.b);
pTextTail->pGuildNameTextInstance->Update();
}
}

#ifdef ENABLE_PLAYTIME_ICON
if (pCharacterInstance->IsPC())
{
char szRutbe[MAX_PATH];
snprintf(szRutbe, sizeof(szRutbe), "%s", p#ifdefterInstance->GetMyTimeIcon());
pTextTail->pPlayTimeInstance = CGraphicImageInstance::New();
pTextTail->pPlayTimeInstance->SetImagePointer(static_cast<CGraphicImage*>(CResourceManager::Instance().GetResourcePointer(szRutbe)));
}
#endif
m_CharacterTextTailMap.insert({dwVirtualID, pTextTail});
}

void CPythonTextTail::RegisterItemTextTail(DWORD VirtualID, const char* c_szText,#endifhicObjectInstance* pOwner)
{
TTextTail* pTextTail = RegisterTextTail(VirtualID, c_szText, pOwner, c_TextTail_Name_Position, c_TextTail_Item_Color);
if (pTextTail)
m_ItemTextTailMap.insert({VirtualID, pTextTail});
}

#ifdef ENABLE_NEW_SHOP_IN_CITIES
void CPythonTextTail::RegisterShopInstanceTextTail(DWORD dwVirtualID, const char* c_szName, CGraphicObjectInstance* pOw#ifdef
TTextTail* pTextTail = RegisterShopTextTail(dwVirtualID, c_szName, pOwner);
if (pTextTail)
m_ShopTextTailMap.insert({dwVirtualID, pTextTail});
}
#endif

// ... (Diğer fonksiyonlar) ...

void CPythonTextTail::SetItemTextTailOwner(DWORD dwVID, const char* c_szName)
{
auto itor = m_ItemTextTailM#endifd(dwVID);
if (m_ItemTextTailMap.end() == itor) return;

TTextTail* pTextTail = itor->second;
if (!pTextTail) return;

if (c_szName && c_szName[0] != '\0')
{
if (!pTextTail->pOwnerTextInstance)
{
pTextTail->pOwnerTextInstance = CGraphicTextInstance::New();
}
std::string strName = c_szName;
static const std::string& strOwnership = ApplicationStringTable_GetString(IDS_POSSESSIVE_MORPHENE).empty() ? "'s" : ApplicationStringTable_GetString(IDS_POSSESSIVE_MORPHENE);
strName += strOwnership;

pTextTail->pOwnerTextInstance->SetTextPointer(ms_pFont);
pTextTail->pOwnerTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
pTextTail->pOwnerTextInstance->SetValue(strName.c_str());
pTextTail->pOwnerTextInstance->SetColor(1.0f, 1.0f, 0.0f);
pTextTail->pOwnerTextInstance->Update();

int xOwnerSize, yOwnerSize;
pTextTail->pOwnerTextInstance->GetTextSize(&xOwnerSize, &yOwnerSize);
pTextTail->yStart = c_fItemNameBoxYStart;
pTextTail->yEnd += float(yOwnerSize + 4);
pTextTail->xStart = fMIN(pTextTail->xStart, float(-xOwnerSize / 2 - 1));
pTextTail->xEnd = fMAX(pTextTail->xEnd, float(xOwnerSize / 2 + 1));
}
else
{
if (pTextTail->pOwnerTextInstance)
{
CGraphicTextInstance::Delete(pTextTail->pOwnerTextInstance);
pTextTail->pOwnerTextInstance = nullptr;
}
int xSize, ySize;
pTextTail->pTextInstance->GetTextSize(&xSize, &ySize);
pTextTail->xStart = (float)(-xSize / 2 - 2);
pTextTail->yStart = c_fItemNameBoxYStart;
pTextTail->xEnd = (float)(xSize / 2 + 2);
pTextTail->yEnd = (float)ySize;
}
}

void CPythonTextTail::DeleteCharacterTextTail(DWORD VirtualID)
{
auto itorCharacter = m_CharacterTextTailMap.find(VirtualID);
if (m_CharacterTextTailMap.end() != itorCharacter)
{
if (itorCharacter->second)
{
itorCharacter->second->bIsOnRenderList = false; // --- IYILESTIRME: Bayrağı sıfırla
m_CharacterTextTailList.remove(itorCharacter->second);
DeleteTextTail(itorCharacter->second);
}
m_CharacterTextTailMap.erase(itorCharacter);
}

auto itorChat = m_ChatTailMap.find(VirtualID);
if (m_ChatTailMap.end() != itorChat)
{
if (itorChat->second) DeleteTextTail(itorChat->second);
m_ChatTailMap.erase(itorChat);
}
}

void CPythonTextTail::DeleteItemTextTail(DWORD VirtualID)
{
auto itor = m_ItemTextTailMap.find(VirtualID);
if (m_ItemTextTailMap.end() != itor)
{
if (itor->second)
{
itor->second->bIsOnRenderList = false; // --- IYILESTIRME: Bayrağı sıfırla
m_ItemTextTailList.remove(itor->second);
DeleteTextTail(itor->second);
}
m_ItemTextTailMap.erase(itor);
}
}


CPythonTextTail::TTextTail* CPythonTextTail::RegisterTextTail(DWORD dwVirtualID, const char* c_szText, CGraphicObjectInstance* pOwner, float fHeight, const D3DXCOLOR& c_rColor)
{
TTextTail* pTextTail = m_TextTailPool.Alloc();
if (!pTextTail) return nullptr;

// --- IYILESTIRME: Tüm pointer'lar ve bayraklar burada başlatılır
pTextTail->bIsOnRenderList = false;

pTextTail->dwVirtualID = dwVirtualID;
pTextTail->pOwner = pOwner;
pTextTail->fHeight = fHeight;
pTextTail->Color = c_rColor;
pTextTail->fDistanceFromPlayer = 0.0f;
pTextTail->x = -100.0f;
pTextTail->y = -100.0f;
pTextTail->z = 0.0f;

pTextTail->pTextInstance = CGraphicTextInstance::New();
if (pTextTail->pTextInstance)
{
pTextTail->pTextInstance->SetTextPointer(ms_pFont);
pTextTail->pTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
pTextTail->pTextInstance->SetValue(c_szText);
pTextTail->pTextInstance->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
pTextTail->pTextInstance->Update();

int xSize, ySize;
pTextTail->pTextInstance->GetTextSize(&xSize, &ySize);
pTextTail->xStart = (float)(-xSize / 2 - 2);
pTextTail->yStart = c_fItemNameBoxYStart;
pTextTail->xEnd = (float)(xSize / 2 + 2);
pTextTail->yEnd = (float)ySize;
}

#ifdef __ENABLE_NEW_OFFLINESHOP__
#ifdef ENABLE_NEW_SHOP_IN_CITIES
pTextTail->bIsShop = false;
pTextTail->bRender = false;
#endif
#endif
pTextTail->pOwne#ifdefnstance = nullptr;
pText#ifdefpMarkInstance = nullptr;
pTextTail->pGuildNameTextInstance = nullptr;
pTextTail->pT#endifx#endifnce = nullptr;
pTextTail->pLevelTextInstance = nullptr;
#ifdef TITLE_SYSTEM
pTextTail->psTitleNameTextInstance = nullptr;
#endif
#ifdef ENABLE_PLAYTIME_ICON
pTextTail->pPlayTimeInstance = nullptr;
#endif

retu#ifdefxtTail;
}

// ... (Diğer fonksiyonlar) ...

#ifdef ENABLE_NEW_SH#endifC#ifdefbool CPythonTextTail::GetPickedNewShop(DWORD* pdwVID)
{
*pdwVI#endif
POINT p;
if (!CPythonApplication::Instance().GetMous#ifdefion(&p))
return false;

for (auto const& [key, pTextTail] : m_ShopTextTailMap)
{
if (pTextTail &&
p.x >= pTextTail->x + (pTextTail->xStart - c_fShopBoxPadding) && p.x <= pTextTail->x + (pTextTail->xEnd + c_fShopBoxPadding) &&
p.y >= pTextTail->y + (pTextTail->yStart - c_fShopBoxPadding) && p.y <= pTextTail->y + (pTextTail->yEnd + c_fShopBoxPadding))
{
*pdwVID = key;
return true;
}
}
return false;
}
#endif

// --- IYILESTIRME (GÜVENLİK NOTU):
// TTextTail yapısına yeni bir pointer eklendiğinde, bellek sızıntısı
// olmaması için bu fonksiyonda CGraphic...::Delete(#endifsilinmeli
// ve ardından nullptr'a ayarlanmalıdır.
void CPythonTextTail::DeleteTextTail(TTextTail* pTextTail)
{
if (!pTextTail) return;

if (pTextTail->pTextInstance) CGraphicTextInstance::Delete(pTextTail->pTextInstance);
if (pTextTail->pOwnerTextInstance) CGraphicTextInstance::Delete(pTextTail->pOwnerTextInstance);
if (pTextTail->pMarkInstance) CGraphicMarkInstance::Delete(pTextTail->pMarkInstance);
if (pTextTail->pGuildNameTextInstance) CGraphicTextInstance::Delete(pTextTail->pGuildNameTextInstance);
if (pTextTail->pTitleTextInstance) CGraphicTextInstance::Delete(pTextTail->pTitleTextInstance);
if (pTextTail->pLevelTextInstance) CGraphicTextInstance::Delete(pTextTail->pLevelTextInstance);
#ifdef TITLE_SYSTEM
if (pTextTail->psTitleNameTextInstance) CGraphicTextInstance::Delete(pTextTail->psTitleNameTextInstance);
#endif
#ifdef ENABLE_PLAYTIME_ICON
if (pTextTa#ifdeflayTimeInstance) CGraphicImageInstance::Delete(pTextTail->pPlayTimeInstance);
#endif

pTextTail->pTextInstance = nullptr#endifp#ifdefil->pOwnerTextInstance = nullptr;
pTextTail->pMarkInstance = nullptr;
pTextTail->pGuildNameTextInstance = nullptr#endifpTextTail->pTitleTextInstance = nullptr;
pTextTail->pLevelTextInstance = nullptr;
#ifdef TITLE_SYSTEM
pTextTail->psTitleNameTextInstance = nullptr;
#endif
#ifdef ENABLE_PLAYTIME_ICON
pTextTail->pPlayTimeInstance = nullptr;
#endif

m_TextTailPool.Free#ifdefTail);
}


// ... (Diğer tüm fonksiyonlar aynı kalacak, buraya e#endifo#ifdef..


void CPythonTextTail::Clear()
{
for (auto const& [key, va#endif_CharacterTextTailMap) DeleteTextTail(val);
m_CharacterTextTailMap.clear();
m_CharacterTextTailList.clear();

for (auto const& [key, val] : m_ItemTextTailMap) DeleteTextTail(val);
m_ItemTextTailMap.clear();
m_ItemTextTailList.clear();

#ifdef ENABLE_NEW_SHOP_IN_CITIES
for (auto const& [key, val] : m_ShopTextTailMap) DeleteTextTail(val);
m_ShopTextTailMap.clear();
#endif

for (auto const& [key, val] : m_C#ifdeflMap) DeleteTextTail(val);
m_ChatTailMap.clear();

m_TextTailPool.Clear();
}

// ... (Constructor, Destructor ve Initialize #endifalan fonksiyonlar)
[/CODE]
bu verdigin fix hatalı : build almıyor
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst